summaryrefslogtreecommitdiff
path: root/libavcodec/pngenc.c
diff options
context:
space:
mode:
authorAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2016-10-27 22:34:48 +0200
committerAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2016-10-28 01:53:52 +0200
commit940b8908b94404a65f9f55e33efb4ccc6c81383c (patch)
tree39e89955e0ed0a80463589d217c9f9cab14186df /libavcodec/pngenc.c
parentbf14393635559640f10001fa6af46130cb35fa31 (diff)
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.c18
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;
}