lavc/libmp3lame: send encoder delay/padding in packet side data

Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
This commit is contained in:
Jon Toohill 2016-10-17 14:55:03 -07:00 committed by Andreas Cadhalpun
parent d3be186ed1
commit 81f4f789de
1 changed files with 26 additions and 1 deletions

View File

@ -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;
}