[FFmpeg-devel] [PATCH] ffmpeg: copy the extradata from encoder to muxer

Andreas Cadhalpun andreas.cadhalpun at googlemail.com
Fri Oct 28 01:43:05 EEST 2016


On 27.10.2016 23:39, James Almer wrote:
> On 10/27/2016 5:38 PM, Andreas Cadhalpun wrote:
>>  libavcodec/pngenc.c   |  4 ++++
>>  libavformat/apngenc.c | 27 ++++++++++++++++++++++++---
>>  2 files changed, 28 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c
>> index 00c830e..1a308f2 100644
>> --- a/libavcodec/pngenc.c
>> +++ b/libavcodec/pngenc.c
>> @@ -917,6 +917,10 @@ static int encode_apng(AVCodecContext *avctx, AVPacket *pkt,
>>      if (s->last_frame) {
>>          uint8_t* last_fctl_chunk_start = pkt->data;
>>          uint8_t buf[26];
>> +        uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, avctx->extradata_size);
> 
> You could add a variable called extradata_updated or so to PNGEncContext and set it to
> 1 here so the encoder doesn't add side data to every packet when it's only needed for
> the first.

OK.

>> +        if (!side_data)
>> +            return AVERROR(ENOMEM);
>> +        memcpy(side_data, avctx->extradata, avctx->extradata_size);
>>  
>>          AV_WB32(buf + 0, s->last_frame_fctl.sequence_number);
>>          AV_WB32(buf + 4, s->last_frame_fctl.width);
>> diff --git a/libavformat/apngenc.c b/libavformat/apngenc.c
>> index e25df2e..f702667 100644
>> --- a/libavformat/apngenc.c
>> +++ b/libavformat/apngenc.c
>> @@ -101,15 +101,29 @@ static int apng_write_header(AVFormatContext *format_context)
>>      return 0;
>>  }
>>  
>> -static void flush_packet(AVFormatContext *format_context, AVPacket *packet)
>> +static int flush_packet(AVFormatContext *format_context, AVPacket *packet)
>>  {
>>      APNGMuxContext *apng = format_context->priv_data;
>>      AVIOContext *io_context = format_context->pb;
>>      AVStream *codec_stream = format_context->streams[0];
>>      AVCodecParameters *codec_par = codec_stream->codecpar;
>> +    uint8_t *side_data = NULL;
>> +    int side_data_size = 0;
>>  
>>      av_assert0(apng->prev_packet);
>>  
>> +    if (packet)
>> +        side_data = av_packet_get_side_data(packet, AV_PKT_DATA_NEW_EXTRADATA, &side_data_size);
> 
> If the muxer gets only one frame, the code below (standard png mode fallback) will not
> work. You can test this with "./ffmpeg -f lavfi -i testsrc=s=32x32 -vframes 1 apng.apng".
> 
> Don't check for packet and use apng->prev_packet unconditionally instead. That should
> do it.

Indeed, fixed.

> Ideally, you'd not use avctx->extradata* in the apng encoder or codecpar->extradata*
> in the muxer. The former should only be written by the init() function, and the latter
> should afaik not be modified by the muxer at all.
> If you can store the pointers and sizes for the extradata in the encoder/muxer contexts
> and use them instead of avctx and codecpar extradata then that'd be great.

Fine for me, updated patch attached.
To avoid confusion and for lack of a better name I called the variables in the encoder/muxer
contexts extra_side_data*.

Best regards,
Andreas

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-apng-use-side-data-to-pass-extradata-to-muxer.patch
Type: text/x-diff
Size: 8035 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20161028/7f290299/attachment.patch>


More information about the ffmpeg-devel mailing list