summaryrefslogtreecommitdiff
path: root/libavcodec/flacenc.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2014-04-29 15:11:30 +0200
committerAnton Khirnov <anton@khirnov.net>2014-06-01 08:27:01 +0200
commited39cda02923316b6710c1bcc34d3445370be5b4 (patch)
treeabe16b8fde477361cae758dc86f82c430ef75663 /libavcodec/flacenc.c
parent0957b274e312e985d69cb490bee2a7ff820acaa6 (diff)
downloadffmpeg-ed39cda02923316b6710c1bcc34d3445370be5b4.tar.gz
flacenc: send final extradata in packet side data
Diffstat (limited to 'libavcodec/flacenc.c')
-rw-r--r--libavcodec/flacenc.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c
index 58e86be2d6..9138b9953f 100644
--- a/libavcodec/flacenc.c
+++ b/libavcodec/flacenc.c
@@ -114,6 +114,9 @@ typedef struct FlacEncodeContext {
unsigned int md5_buffer_size;
DSPContext dsp;
FLACDSPContext flac_dsp;
+
+ int flushed;
+ int64_t next_pts;
} FlacEncodeContext;
@@ -1212,6 +1215,20 @@ static int flac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
s->max_framesize = s->max_encoded_framesize;
av_md5_final(s->md5ctx, s->md5sum);
write_streaminfo(s, avctx->extradata);
+
+ if (avctx->side_data_only_packets && !s->flushed) {
+ uint8_t *side_data = av_packet_new_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA,
+ avctx->extradata_size);
+ if (!side_data)
+ return AVERROR(ENOMEM);
+ memcpy(side_data, avctx->extradata, avctx->extradata_size);
+
+ avpkt->pts = s->next_pts;
+
+ *got_packet_ptr = 1;
+ s->flushed = 1;
+ }
+
return 0;
}
@@ -1264,6 +1281,9 @@ static int flac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
avpkt->pts = frame->pts;
avpkt->duration = ff_samples_to_time_base(avctx, frame->nb_samples);
avpkt->size = out_bytes;
+
+ s->next_pts = avpkt->pts + avpkt->duration;
+
*got_packet_ptr = 1;
return 0;
}