diff options
author | Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com> | 2016-10-27 22:34:48 +0200 |
---|---|---|
committer | Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com> | 2016-10-28 01:53:52 +0200 |
commit | 940b8908b94404a65f9f55e33efb4ccc6c81383c (patch) | |
tree | 39e89955e0ed0a80463589d217c9f9cab14186df /libavcodec/pngenc.c | |
parent | bf14393635559640f10001fa6af46130cb35fa31 (diff) | |
download | ffmpeg-940b8908b94404a65f9f55e33efb4ccc6c81383c.tar.gz |
apng: use side data to pass extradata to muxer
This fixes creating apng files, which is broken since commit
5ef19590802f000299e418143fc2301e3f43affe.
Reviewed-by: James Almer <jamrial@gmail.com>
Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
Diffstat (limited to 'libavcodec/pngenc.c')
-rw-r--r-- | libavcodec/pngenc.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c index 00c830e6eb..51ae094770 100644 --- a/libavcodec/pngenc.c +++ b/libavcodec/pngenc.c @@ -68,6 +68,9 @@ typedef struct PNGEncContext { // APNG uint32_t palette_checksum; // Used to ensure a single unique palette uint32_t sequence_number; + int extra_data_updated; + uint8_t *extra_data; + int extra_data_size; AVFrame *prev_frame; AVFrame *last_frame; @@ -870,15 +873,15 @@ static int encode_apng(AVCodecContext *avctx, AVPacket *pkt, if (!pict) return AVERROR(EINVAL); - s->bytestream = avctx->extradata = av_malloc(FF_MIN_BUFFER_SIZE); - if (!avctx->extradata) + s->bytestream = s->extra_data = av_malloc(FF_MIN_BUFFER_SIZE); + if (!s->extra_data) return AVERROR(ENOMEM); ret = encode_headers(avctx, pict); if (ret < 0) return ret; - avctx->extradata_size = s->bytestream - avctx->extradata; + s->extra_data_size = s->bytestream - s->extra_data; s->last_frame_packet = av_malloc(max_packet_size); if (!s->last_frame_packet) @@ -917,6 +920,13 @@ static int encode_apng(AVCodecContext *avctx, AVPacket *pkt, if (s->last_frame) { uint8_t* last_fctl_chunk_start = pkt->data; uint8_t buf[26]; + if (!s->extra_data_updated) { + uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, s->extra_data_size); + if (!side_data) + return AVERROR(ENOMEM); + memcpy(side_data, s->extra_data, s->extra_data_size); + s->extra_data_updated = 1; + } AV_WB32(buf + 0, s->last_frame_fctl.sequence_number); AV_WB32(buf + 4, s->last_frame_fctl.width); @@ -1093,6 +1103,8 @@ static av_cold int png_enc_close(AVCodecContext *avctx) av_frame_free(&s->last_frame); av_frame_free(&s->prev_frame); av_freep(&s->last_frame_packet); + av_freep(&s->extra_data); + s->extra_data_size = 0; return 0; } |