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