[FFmpeg-devel] [PATCH v2] avformat/tee.c: steal bsf option before passing to fifo muxer

Liu Steven lq at chinaffmpeg.org
Fri Oct 25 07:26:36 EEST 2019



> 在 2019年10月17日,下午4:09,Jun Li <junli1026 at gmail.com> 写道:
> 
> On Sun, Oct 13, 2019 at 2:14 PM Jun Li <junli1026 at gmail.com> wrote:
> 
>> Fix #7620
>> In the case tee muxer with both "bsf" and "use_fifo" parameters
>> will trigger this bug. Tee muxer will first steal parameters (like "f",
>> "select"...) and then "use_fifo" will try reading out remaining options
>> and pass them to fifo as option "format_options".
>> Current code miss the part of stealing "bsf" options.
>> ---
>> libavformat/tee.c | 15 +++++++++++----
>> 1 file changed, 11 insertions(+), 4 deletions(-)
>> 
>> diff --git a/libavformat/tee.c b/libavformat/tee.c
>> index 89a4ceb280..d91993354b 100644
>> --- a/libavformat/tee.c
>> +++ b/libavformat/tee.c
>> @@ -159,7 +159,7 @@ static void close_slaves(AVFormatContext *avf)
>> static int open_slave(AVFormatContext *avf, char *slave, TeeSlave
>> *tee_slave)
>> {
>>     int i, ret;
>> -    AVDictionary *options = NULL;
>> +    AVDictionary *options = NULL, *bsf_options = NULL;
>>     AVDictionaryEntry *entry;
>>     char *filename;
>>     char *format = NULL, *select = NULL, *on_fail = NULL;
>> @@ -186,6 +186,12 @@ static int open_slave(AVFormatContext *avf, char
>> *slave, TeeSlave *tee_slave)
>>     STEAL_OPTION("onfail", on_fail);
>>     STEAL_OPTION("use_fifo", use_fifo);
>>     STEAL_OPTION("fifo_options", fifo_options_str);
>> +    entry = NULL;
>> +    while ((entry = av_dict_get(options, "bsfs", entry,
>> AV_DICT_IGNORE_SUFFIX))) {
>> +        /* trim out strlen("bsfs") characters from key */
>> +        av_dict_set(&bsf_options, entry->key + 4, entry->value, 0);
>> +        av_dict_set(&options, entry->key, NULL, 0);
>> +    }
>> 
>>     ret = parse_slave_failure_policy_option(on_fail, tee_slave);
>>     if (ret < 0) {
>> @@ -311,8 +317,8 @@ static int open_slave(AVFormatContext *avf, char
>> *slave, TeeSlave *tee_slave)
>>     }
>> 
>>     entry = NULL;
>> -    while (entry = av_dict_get(options, "bsfs", NULL,
>> AV_DICT_IGNORE_SUFFIX)) {
>> -        const char *spec = entry->key + strlen("bsfs");
>> +    while (entry = av_dict_get(bsf_options, "", NULL,
>> AV_DICT_IGNORE_SUFFIX)) {
>> +        const char *spec = entry->key;
>>         if (*spec) {
>>             if (strspn(spec, slave_bsfs_spec_sep) != 1) {
>>                 av_log(avf, AV_LOG_ERROR,
>> @@ -352,7 +358,7 @@ static int open_slave(AVFormatContext *avf, char
>> *slave, TeeSlave *tee_slave)
>>             }
>>         }
>> 
>> -        av_dict_set(&options, entry->key, NULL, 0);
>> +        av_dict_set(&bsf_options, entry->key, NULL, 0);
>>     }
>> 
>>     for (i = 0; i < avf->nb_streams; i++){
>> @@ -399,6 +405,7 @@ end:
>>     av_free(select);
>>     av_free(on_fail);
>>     av_dict_free(&options);
>> +    av_dict_free(&bsf_options);
>>     av_freep(&tmp_select);
>>     return ret;
>> }
>> --
>> 2.17.1
>> 
>> 
> Ping

will apply
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".





More information about the ffmpeg-devel mailing list