On 18.12.2014 01:09, Michael Niedermayer wrote:
On Wed, Dec 17, 2014 at 10:59:37PM +0100, Lukasz Marek wrote:
On 15.12.2014 14:18, Michael Niedermayer wrote:
  cmdutils.c |    8 ++++++--
  1 file changed, 6 insertions(+), 2 deletions(-)
8d012a5193b0440717f89d920661913ef160e674  
0001-cmdutils-dont-call-read_header-before-listing-device.patch
 From 332bb7456c498518ea72dfdaa0e8c3e76d383f21 Mon Sep 17 00:00:00 2001
From: Lukasz Marek <lukasz.m.lu...@gmail.com>
Date: Mon, 15 Dec 2014 00:31:42 +0100
Subject: [PATCH] cmdutils: dont call read_header before listing devices

List device callback must be able to return valid list without opening device.
This callback should return input values for open function, not vice-versa.
Read header funtion is very likey to fail without proper configuration provided.

should be ok

I changed a patch. I wanted to avoid situation where .read_close is
called without .read_header being called before.


  cmdutils.c |   41 +++++++++++++++++++++++++++++++++++------
  1 file changed, 35 insertions(+), 6 deletions(-)
9a93c401d795bae3545a6c6112e71abd98ac22ca  
0001-cmdutils-dont-call-read_header-before-listing-device.patch
 From 58fe020b8f1c0e809362e152febe3ad715b1c8fc Mon Sep 17 00:00:00 2001
From: Lukasz Marek <lukasz.m.lu...@gmail.com>
Date: Mon, 15 Dec 2014 00:31:42 +0100
Subject: [PATCH] cmdutils: dont call read_header before listing devices

List device callback must be able to return valid list without opening device.
This callback should return input values for open function, not vice-versa.
Read header funtion is very likey to fail without proper configuration provided.

Signed-off-by: Lukasz Marek <lukasz.m.lu...@gmail.com>
---
  cmdutils.c | 41 +++++++++++++++++++++++++++++++++++------
  1 file changed, 35 insertions(+), 6 deletions(-)

diff --git a/cmdutils.c b/cmdutils.c
index 4e0a406..23a5f77 100644
--- a/cmdutils.c
+++ b/cmdutils.c
@@ -2052,7 +2052,37 @@ void *grow_array(void *array, int elem_size, int *size, 
int new_size)
  }

  #if CONFIG_AVDEVICE
-static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
+static int alloc_input_context(AVFormatContext **avctx, AVInputFormat *iformat)
+{
+    AVFormatContext *s = avformat_alloc_context();
+    int ret = 0;
+
+    *avctx = NULL;
+    if (!s)
+        return AVERROR(ENOMEM);
+
+    s->iformat = iformat;
+    if (s->iformat->priv_data_size > 0) {
+        s->priv_data = av_mallocz(s->iformat->priv_data_size);
+        if (!s->priv_data) {
+            ret = AVERROR(ENOMEM);
+            goto error;
+        }
+        if (s->iformat->priv_class) {
+            *(const AVClass**)s->priv_data= s->iformat->priv_class;
+            av_opt_set_defaults(s->priv_data);
+        }
+    } else
+        s->priv_data = NULL;
+
+    *avctx = s;
+    return 0;
+  error:
+    avformat_free_context(s);
+    return ret;
+}
+

+static int print_device_sources(void *pfmt, AVDictionary *opts)
  {
      int ret, i;
      AVFormatContext *dev = NULL;
@@ -2069,13 +2099,12 @@ static int print_device_sources(AVInputFormat *fmt, 
AVDictionary *opts)
          goto fail;
      }

-    /* TODO: avformat_open_input calls read_header callback which is not 
necessary.
-             Function like avformat_alloc_output_context2 for input could be 
helpful here. */
-    av_dict_copy(&tmp_opts, opts, 0);
-    if ((ret = avformat_open_input(&dev, NULL, fmt, &tmp_opts)) < 0) {
+    if ((ret = alloc_input_context(&dev, fmt)) < 0) {

this fails building due to lack of a fmt variable

I failed at cherry-pick conflict, thanks.
Updated patch is attached.

>From 2b9a20f97687f11eb5d1fd72db3b25e3f2703b73 Mon Sep 17 00:00:00 2001
From: Lukasz Marek <lukasz.m.lu...@gmail.com>
Date: Mon, 15 Dec 2014 00:31:42 +0100
Subject: [PATCH] cmdutils: dont call read_header before listing devices

List device callback must be able to return valid list without opening device.
This callback should return input values for open function, not vice-versa.
Read header funtion is very likey to fail without proper configuration provided.

Signed-off-by: Lukasz Marek <lukasz.m.lu...@gmail.com>
---
 cmdutils.c | 39 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 5 deletions(-)

diff --git a/cmdutils.c b/cmdutils.c
index 4e0a406..eb504a6 100644
--- a/cmdutils.c
+++ b/cmdutils.c
@@ -2052,6 +2052,36 @@ void *grow_array(void *array, int elem_size, int *size, int new_size)
 }
 
 #if CONFIG_AVDEVICE
+static int alloc_input_context(AVFormatContext **avctx, AVInputFormat *iformat)
+{
+    AVFormatContext *s = avformat_alloc_context();
+    int ret = 0;
+
+    *avctx = NULL;
+    if (!s)
+        return AVERROR(ENOMEM);
+
+    s->iformat = iformat;
+    if (s->iformat->priv_data_size > 0) {
+        s->priv_data = av_mallocz(s->iformat->priv_data_size);
+        if (!s->priv_data) {
+            ret = AVERROR(ENOMEM);
+            goto error;
+        }
+        if (s->iformat->priv_class) {
+            *(const AVClass**)s->priv_data= s->iformat->priv_class;
+            av_opt_set_defaults(s->priv_data);
+        }
+    } else
+        s->priv_data = NULL;
+
+    *avctx = s;
+    return 0;
+  error:
+    avformat_free_context(s);
+    return ret;
+}
+
 static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
 {
     int ret, i;
@@ -2069,13 +2099,12 @@ static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
         goto fail;
     }
 
-    /* TODO: avformat_open_input calls read_header callback which is not necessary.
-             Function like avformat_alloc_output_context2 for input could be helpful here. */
-    av_dict_copy(&tmp_opts, opts, 0);
-    if ((ret = avformat_open_input(&dev, NULL, fmt, &tmp_opts)) < 0) {
+    if ((ret = alloc_input_context(&dev, fmt)) < 0) {
         printf("Cannot open device: %s.\n", fmt->name);
         goto fail;
     }
+    av_dict_copy(&tmp_opts, opts, 0);
+    av_opt_set_dict2(dev, &tmp_opts, AV_OPT_SEARCH_CHILDREN);
 
     if ((ret = avdevice_list_devices(dev, &device_list)) < 0) {
         printf("Cannot list sources.\n");
@@ -2090,7 +2119,7 @@ static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
   fail:
     av_dict_free(&tmp_opts);
     avdevice_free_list_devices(&device_list);
-    avformat_close_input(&dev);
+    avformat_free_context(dev);
     return ret;
 }
 
-- 
1.9.1

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

Reply via email to