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

James Almer jamrial at gmail.com
Fri Oct 28 02:33:20 EEST 2016


On 10/27/2016 7:43 PM, Andreas Cadhalpun wrote:
> 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*.

extra_data* (with an underscore so it's different) is IMO better. It contains new codec
extradata, as the AVPacketSideDataType enum states, and is simply transmitted from a
library to the other as packet side data.

> 
> Best regards,
> Andreas
> 
> 
> 0001-apng-use-side-data-to-pass-extradata-to-muxer.patch
> 
> 
> From 20ad7d6905ce2123fd8100b6fe6e092dbbdf3c06 Mon Sep 17 00:00:00 2001
> From: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
> Date: Thu, 27 Oct 2016 22:34:48 +0200
> Subject: [PATCH] apng: use side data to pass extradata to muxer
> 
> This fixes creating apng files, which is broken since commit
> 5ef19590802f000299e418143fc2301e3f43affe.
> 
> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
> ---
>  libavcodec/pngenc.c   | 18 +++++++++++++++---
>  libavformat/apngenc.c | 45 +++++++++++++++++++++++++++++++++++----------
>  2 files changed, 50 insertions(+), 13 deletions(-)

Seems to work, so LGTM with or without the above suggestion.

Thanks.



More information about the ffmpeg-devel mailing list