Re: [FFmpeg-devel] [PATCH 1/2] lavd/v4l2: implement list device callback

2015-01-11 Thread Lukasz Marek

On 03.01.2015 14:51, Giorgio Vazzana wrote:

2015-01-03 4:45 GMT+01:00 Lukasz Marek lukasz.m.lu...@gmail.com:

On 21 December 2014 at 23:39, Lukasz Marek lukasz.m.lu...@gmail.com wrote:


On 21.12.2014 22:43, Lukasz Marek wrote:


Signed-off-by: Lukasz Marek lukasz.m.lu...@gmail.com
---
   libavdevice/v4l2.c | 58 ++

   1 file changed, 58 insertions(+)

diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
index 2969980..9d4d7ae 100644
--- a/libavdevice/v4l2.c
+++ b/libavdevice/v4l2.c
@@ -1006,6 +1006,63 @@ static int v4l2_read_close(AVFormatContext *ctx)
   return 0;
   }

+static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList
*device_list)
+{
+struct video_data *s = ctx-priv_data;
+AVDeviceInfo *device = NULL;
+struct v4l2_capability cap;
+int i, ret = 0;
+
+if (!device_list)
+return AVERROR(EINVAL);
+
+for (i = 0; i = 31; i++) {
+snprintf(ctx-filename, sizeof(ctx-filename), /dev/video%d,
i);



I wasn't sure this is correct. I changed this loop to opendir/readdir -
similar way v4l-utils does.

ping on patchset


LGTM, thanks.


pushed both patches

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH 1/2] lavd/v4l2: implement list device callback

2015-01-03 Thread Giorgio Vazzana
2015-01-03 4:45 GMT+01:00 Lukasz Marek lukasz.m.lu...@gmail.com:
 On 21 December 2014 at 23:39, Lukasz Marek lukasz.m.lu...@gmail.com wrote:

 On 21.12.2014 22:43, Lukasz Marek wrote:

 Signed-off-by: Lukasz Marek lukasz.m.lu...@gmail.com
 ---
   libavdevice/v4l2.c | 58 ++
 
   1 file changed, 58 insertions(+)

 diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
 index 2969980..9d4d7ae 100644
 --- a/libavdevice/v4l2.c
 +++ b/libavdevice/v4l2.c
 @@ -1006,6 +1006,63 @@ static int v4l2_read_close(AVFormatContext *ctx)
   return 0;
   }

 +static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList
 *device_list)
 +{
 +struct video_data *s = ctx-priv_data;
 +AVDeviceInfo *device = NULL;
 +struct v4l2_capability cap;
 +int i, ret = 0;
 +
 +if (!device_list)
 +return AVERROR(EINVAL);
 +
 +for (i = 0; i = 31; i++) {
 +snprintf(ctx-filename, sizeof(ctx-filename), /dev/video%d,
 i);


 I wasn't sure this is correct. I changed this loop to opendir/readdir -
 similar way v4l-utils does.

 ping on patchset

LGTM, thanks.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH 1/2] lavd/v4l2: implement list device callback

2015-01-02 Thread Lukasz Marek
On 21 December 2014 at 23:39, Lukasz Marek lukasz.m.lu...@gmail.com wrote:

 On 21.12.2014 22:43, Lukasz Marek wrote:

 Signed-off-by: Lukasz Marek lukasz.m.lu...@gmail.com
 ---
   libavdevice/v4l2.c | 58 ++
 
   1 file changed, 58 insertions(+)

 diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
 index 2969980..9d4d7ae 100644
 --- a/libavdevice/v4l2.c
 +++ b/libavdevice/v4l2.c
 @@ -1006,6 +1006,63 @@ static int v4l2_read_close(AVFormatContext *ctx)
   return 0;
   }

 +static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList
 *device_list)
 +{
 +struct video_data *s = ctx-priv_data;
 +AVDeviceInfo *device = NULL;
 +struct v4l2_capability cap;
 +int i, ret = 0;
 +
 +if (!device_list)
 +return AVERROR(EINVAL);
 +
 +for (i = 0; i = 31; i++) {
 +snprintf(ctx-filename, sizeof(ctx-filename), /dev/video%d,
 i);


 I wasn't sure this is correct. I changed this loop to opendir/readdir -
 similar way v4l-utils does.

 ping on patchset
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 1/2] lavd/v4l2: implement list device callback

2014-12-21 Thread Lukasz Marek
Signed-off-by: Lukasz Marek lukasz.m.lu...@gmail.com
---
 libavdevice/v4l2.c | 58 ++
 1 file changed, 58 insertions(+)

diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
index 2969980..9d4d7ae 100644
--- a/libavdevice/v4l2.c
+++ b/libavdevice/v4l2.c
@@ -1006,6 +1006,63 @@ static int v4l2_read_close(AVFormatContext *ctx)
 return 0;
 }
 
+static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList 
*device_list)
+{
+struct video_data *s = ctx-priv_data;
+AVDeviceInfo *device = NULL;
+struct v4l2_capability cap;
+int i, ret = 0;
+
+if (!device_list)
+return AVERROR(EINVAL);
+
+for (i = 0; i = 31; i++) {
+snprintf(ctx-filename, sizeof(ctx-filename), /dev/video%d, i);
+
+if (avio_check(ctx-filename, AVIO_FLAG_READ) != AVIO_FLAG_READ ||
+(s-fd = device_open(ctx))  0)
+continue;
+
+if (v4l2_ioctl(s-fd, VIDIOC_QUERYCAP, cap)  0) {
+ret = AVERROR(errno);
+av_log(ctx, AV_LOG_ERROR, ioctl(VIDIOC_QUERYCAP): %s\n, 
av_err2str(ret));
+goto fail_device;
+}
+
+device = av_mallocz(sizeof(AVDeviceInfo));
+if (!device) {
+ret = AVERROR(ENOMEM);
+goto fail_device;
+}
+device-device_name = av_strdup(ctx-filename);
+device-device_description = av_strdup(cap.card);
+if (!device-device_name || !device-device_description) {
+ret = AVERROR(ENOMEM);
+goto fail_device;
+}
+
+if ((ret = av_dynarray_add_nofree(device_list-devices,
+  device_list-nb_devices, device))  
0)
+goto fail_device;
+
+v4l2_close(s-fd);
+s-fd = -1;
+continue;
+
+  fail_device:
+if (device) {
+av_freep(device-device_name);
+av_freep(device-device_description);
+av_freep(device);
+}
+if (s-fd = 0)
+v4l2_close(s-fd);
+s-fd = -1;
+return ret;
+}
+return 0;
+}
+
 #define OFFSET(x) offsetof(struct video_data, x)
 #define DEC AV_OPT_FLAG_DECODING_PARAM
 
@@ -1050,6 +1107,7 @@ AVInputFormat ff_v4l2_demuxer = {
 .read_header= v4l2_read_header,
 .read_packet= v4l2_read_packet,
 .read_close = v4l2_read_close,
+.get_device_list = v4l2_get_device_list,
 .flags  = AVFMT_NOFILE,
 .priv_class = v4l2_class,
 };
-- 
1.9.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH 1/2] lavd/v4l2: implement list device callback

2014-12-21 Thread Lukasz Marek

On 21.12.2014 22:43, Lukasz Marek wrote:

Signed-off-by: Lukasz Marek lukasz.m.lu...@gmail.com
---
  libavdevice/v4l2.c | 58 ++
  1 file changed, 58 insertions(+)

diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
index 2969980..9d4d7ae 100644
--- a/libavdevice/v4l2.c
+++ b/libavdevice/v4l2.c
@@ -1006,6 +1006,63 @@ static int v4l2_read_close(AVFormatContext *ctx)
  return 0;
  }

+static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList 
*device_list)
+{
+struct video_data *s = ctx-priv_data;
+AVDeviceInfo *device = NULL;
+struct v4l2_capability cap;
+int i, ret = 0;
+
+if (!device_list)
+return AVERROR(EINVAL);
+
+for (i = 0; i = 31; i++) {
+snprintf(ctx-filename, sizeof(ctx-filename), /dev/video%d, i);


I wasn't sure this is correct. I changed this loop to opendir/readdir - 
similar way v4l-utils does.


From e2efb8e8b803b461d5c27b22435318e38639a2c8 Mon Sep 17 00:00:00 2001
From: Lukasz Marek lukasz.m.lu...@gmail.com
Date: Sun, 21 Dec 2014 22:37:18 +0100
Subject: [PATCH] lavd/v4l2: implement list device callback

Signed-off-by: Lukasz Marek lukasz.m.lu...@gmail.com
---
 libavdevice/v4l2.c | 77 ++
 1 file changed, 77 insertions(+)

diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
index 2969980..8337cf5 100644
--- a/libavdevice/v4l2.c
+++ b/libavdevice/v4l2.c
@@ -31,6 +31,7 @@
  */
 
 #include v4l2-common.h
+#include dirent.h
 
 #if CONFIG_LIBV4L2
 #include libv4l2.h
@@ -1006,6 +1007,81 @@ static int v4l2_read_close(AVFormatContext *ctx)
 return 0;
 }
 
+static int v4l2_is_v4l_dev(const char *name)
+{
+return !strncmp(name, video, 5) ||
+   !strncmp(name, radio, 5) ||
+   !strncmp(name, vbi, 3) ||
+   !strncmp(name, v4l-subdev, 10);
+}
+
+static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList *device_list)
+{
+struct video_data *s = ctx-priv_data;
+DIR *dir;
+struct dirent *entry;
+AVDeviceInfo *device = NULL;
+struct v4l2_capability cap;
+int ret = 0;
+
+if (!device_list)
+return AVERROR(EINVAL);
+
+dir = opendir(/dev);
+if (!dir) {
+ret = AVERROR(errno);
+av_log(ctx, AV_LOG_ERROR, Couldn't open the directory: %s\n, av_err2str(ret));
+return ret;
+}
+while ((entry = readdir(dir))) {
+if (!v4l2_is_v4l_dev(entry-d_name))
+continue;
+
+snprintf(ctx-filename, sizeof(ctx-filename), /dev/%s, entry-d_name);
+if ((s-fd = device_open(ctx))  0)
+continue;
+
+if (v4l2_ioctl(s-fd, VIDIOC_QUERYCAP, cap)  0) {
+ret = AVERROR(errno);
+av_log(ctx, AV_LOG_ERROR, ioctl(VIDIOC_QUERYCAP): %s\n, av_err2str(ret));
+goto fail;
+}
+
+device = av_mallocz(sizeof(AVDeviceInfo));
+if (!device) {
+ret = AVERROR(ENOMEM);
+goto fail;
+}
+device-device_name = av_strdup(ctx-filename);
+device-device_description = av_strdup(cap.card);
+if (!device-device_name || !device-device_description) {
+ret = AVERROR(ENOMEM);
+goto fail;
+}
+
+if ((ret = av_dynarray_add_nofree(device_list-devices,
+  device_list-nb_devices, device))  0)
+goto fail;
+
+v4l2_close(s-fd);
+s-fd = -1;
+continue;
+
+  fail:
+if (device) {
+av_freep(device-device_name);
+av_freep(device-device_description);
+av_freep(device);
+}
+if (s-fd = 0)
+v4l2_close(s-fd);
+s-fd = -1;
+break;
+}
+closedir(dir);
+return ret;
+}
+
 #define OFFSET(x) offsetof(struct video_data, x)
 #define DEC AV_OPT_FLAG_DECODING_PARAM
 
@@ -1050,6 +1126,7 @@ AVInputFormat ff_v4l2_demuxer = {
 .read_header= v4l2_read_header,
 .read_packet= v4l2_read_packet,
 .read_close = v4l2_read_close,
+.get_device_list = v4l2_get_device_list,
 .flags  = AVFMT_NOFILE,
 .priv_class = v4l2_class,
 };
-- 
1.9.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel