summaryrefslogtreecommitdiff
path: root/libavcodec/libmp3lame.c
diff options
context:
space:
mode:
authorJon Toohill <jtoohill@google.com>2016-10-17 14:55:03 -0700
committerAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2016-10-18 20:19:29 +0200
commit81f4f789de7ce855e2f1a2d7e5dde2b723627a71 (patch)
tree82993ed40ae46811c81f30395e7792d9ca5d3907 /libavcodec/libmp3lame.c
parentd3be186ed1bcdcf2c093d6b13a0e66dc5132be2a (diff)
lavc/libmp3lame: send encoder delay/padding in packet side data
Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
Diffstat (limited to 'libavcodec/libmp3lame.c')
-rw-r--r--libavcodec/libmp3lame.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c
index 5642264a4a..e55aa8537a 100644
--- a/libavcodec/libmp3lame.c
+++ b/libavcodec/libmp3lame.c
@@ -50,6 +50,7 @@ typedef struct LAMEContext {
int reservoir;
int joint_stereo;
int abr;
+ int delay_sent;
float *samples_flt[2];
AudioFrameQueue afq;
AVFloatDSPContext *fdsp;
@@ -185,7 +186,7 @@ static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
{
LAMEContext *s = avctx->priv_data;
MPADecodeHeader hdr;
- int len, ret, ch;
+ int len, ret, ch, discard_padding;
int lame_result;
uint32_t h;
@@ -269,6 +270,30 @@ static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts,
&avpkt->duration);
+ discard_padding = avctx->frame_size - avpkt->duration;
+ // Check if subtraction resulted in an overflow
+ if ((discard_padding < avctx->frame_size) != (avpkt->duration > 0)) {
+ av_log(avctx, AV_LOG_ERROR, "discard padding overflow\n");
+ av_packet_unref(avpkt);
+ av_free(avpkt);
+ return AVERROR(EINVAL);
+ }
+ if ((!s->delay_sent && avctx->initial_padding > 0) || discard_padding > 0) {
+ uint8_t* side_data = av_packet_new_side_data(avpkt,
+ AV_PKT_DATA_SKIP_SAMPLES,
+ 10);
+ if(!side_data) {
+ av_packet_unref(avpkt);
+ av_free(avpkt);
+ return AVERROR(ENOMEM);
+ }
+ if (!s->delay_sent) {
+ AV_WL32(side_data, avctx->initial_padding);
+ s->delay_sent = 1;
+ }
+ AV_WL32(side_data + 4, discard_padding);
+ }
+
avpkt->size = len;
*got_packet_ptr = 1;
}