mirror of https://git.ffmpeg.org/ffmpeg.git
lavc/libmp3lame: send encoder delay/padding in packet side data
Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
This commit is contained in:
parent
d3be186ed1
commit
81f4f789de
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue