X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flibmp3lame.c;h=e55aa8537a7cd999f8bf7f04a8451d022b36ec3c;hb=45f5c5573203a48acb2dd6fbf18f4b0c25b7aff0;hp=5642264a4a36a4726ca2de754cfaf85184a7eec5;hpb=1cfa350429a5c3296357895efbc0a63bdf04af90;p=ffmpeg diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c index 5642264a4a3..e55aa8537a7 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; }