[FFmpeg-devel] [PATCH] avformat/apngenc: use the stream parameters extradata if no updated one is made available

Andreas Cadhalpun andreas.cadhalpun at googlemail.com
Tue Nov 1 17:54:14 EET 2016


On 01.11.2016 05:09, James Almer wrote:
> On 10/31/2016 11:32 PM, James Almer wrote:
>> Fixes remuxing apng streams coming from the apng demuxer.
>> This is a regression since 97792e85c338d129342f5812e2a52048373e57d6.
>>
>> Signed-off-by: James Almer <jamrial at gmail.com>
>> ---
>>  libavformat/apngenc.c | 7 +++++++
>>  1 file changed, 7 insertions(+)
>>
>> diff --git a/libavformat/apngenc.c b/libavformat/apngenc.c
>> index e5e8aa9..2b88dcc 100644
>> --- a/libavformat/apngenc.c
>> +++ b/libavformat/apngenc.c
>> @@ -101,6 +101,13 @@ static int apng_write_header(AVFormatContext *format_context)
>>      avio_wb64(format_context->pb, PNGSIG);
>>      // Remaining headers are written when they are copied from the encoder
>>  
>> +    apng->extra_data = av_mallocz(format_context->streams[0]->codecpar->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
>> +    if (!apng->extra_data)
>> +        return AVERROR(ENOMEM);
>> +    apng->extra_data_size =  format_context->streams[0]->codecpar->extradata_size;
>> +    memcpy(apng->extra_data, format_context->streams[0]->codecpar->extradata,
>> +           format_context->streams[0]->codecpar->extradata_size);
>> +
> 
> Alternatively we could just go back to the first version of Andreas' patch,
> where the codecpar extradata was overwritten by the updated one from the
> packet side data, and get rid of the private context buffer.
> 
> I assumed keeping the codecpar extradata intact was the correct behavior,
> based on the avcodec.h documentation and since AVCodecParameters is an
> intermediary struct meant to pass parameters between de/muxers and
> de/encoders, but it seems the mov and flv muxers just overwrite it. I'm not
> sure if it makes a difference at all.
> 
> Any opinions?

What I like about the approach of using the private extra_data context buffer is
that is is quite obvious where it is set. On the other hand the codecpar
extradata can be set anywhere, which makes it difficult to understand/debug.
The very bug this patch would fix is an excellent example of that.

So I'd rather convert the apngdec demuxer to pass the extradata as side data.
I'll send a patch doing that.

Best regards,
Andreas



More information about the ffmpeg-devel mailing list