Unified · Split
| @@ -50,6 +50,7 @@ typedef struct LAMEContext { · 49 unmodified lines | ||
| 50 | 50 | int reservoir; |
| 51 | 51 | int joint_stereo; |
| 52 | 52 | int abr; |
| 53 | + int delay_sent; | |
| 53 | 54 | float *samples_flt[2]; |
| 54 | 55 | AudioFrameQueue afq; |
| 55 | 56 | AVFloatDSPContext *fdsp; |
| @@ -185,7 +186,7 @@ static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, · 129 unmodified lines | ||
| 185 | 186 | { |
| 186 | 187 | LAMEContext *s = avctx->priv_data; |
| 187 | 188 | MPADecodeHeader hdr; |
| 188 | − int len, ret, ch; | |
| 189 | + int len, ret, ch, discard_padding; | |
| 189 | 190 | int lame_result; |
| 190 | 191 | uint32_t h; |
| 191 | 192 | |
| @@ -269,6 +270,30 @@ static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, · 77 unmodified lines | ||
| 269 | 270 | ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts, |
| 270 | 271 | &avpkt->duration); |
| 271 | 272 | |
| 273 | + discard_padding = avctx->frame_size - avpkt->duration; | |
| 274 | + // Check if subtraction resulted in an overflow | |
| 275 | + if ((discard_padding < avctx->frame_size) != (avpkt->duration > 0)) { | |
| 276 | + av_log(avctx, AV_LOG_ERROR, "discard padding overflow\n"); | |
| 277 | + av_packet_unref(avpkt); | |
| 278 | + av_free(avpkt); | |
| 279 | + return AVERROR(EINVAL); | |
| 280 | + } | |
| 281 | + if ((!s->delay_sent && avctx->initial_padding > 0) || discard_padding > 0) { | |
| 282 | + uint8_t* side_data = av_packet_new_side_data(avpkt, | |
| 283 | + AV_PKT_DATA_SKIP_SAMPLES, | |
| 284 | + 10); | |
| 285 | + if(!side_data) { | |
| 286 | + av_packet_unref(avpkt); | |
| 287 | + av_free(avpkt); | |
| 288 | + return AVERROR(ENOMEM); | |
| 289 | + } | |
| 290 | + if (!s->delay_sent) { | |
| 291 | + AV_WL32(side_data, avctx->initial_padding); | |
| 292 | + s->delay_sent = 1; | |
| 293 | + } | |
| 294 | + AV_WL32(side_data + 4, discard_padding); | |
| 295 | + } | |
| 296 | + | |
| 272 | 297 | avpkt->size = len; |
| 273 | 298 | *got_packet_ptr = 1; |
| 274 | 299 | } |