mirror of https://git.ffmpeg.org/ffmpeg.git
lavcodec: Adding support for End Trimming in Opus encoder
Adds the end trimming value (duration to be trimmed from the end of the file due to padding) to the packet's side data. This is then made use by the muxer to put the value in the container. Signed-off-by: Vignesh Venkatasubramanian <vigneshv@google.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
7b0a839b0b
commit
ae12d65538
|
@ -313,6 +313,7 @@ static int libopus_encode(AVCodecContext *avctx, AVPacket *avpkt,
|
|||
av_get_bytes_per_sample(avctx->sample_fmt);
|
||||
uint8_t *audio;
|
||||
int ret;
|
||||
int discard_padding;
|
||||
|
||||
if (frame) {
|
||||
ff_af_queue_add(&opus->afq, frame);
|
||||
|
@ -354,6 +355,25 @@ static int libopus_encode(AVCodecContext *avctx, AVPacket *avpkt,
|
|||
ff_af_queue_remove(&opus->afq, opus->opts.packet_size,
|
||||
&avpkt->pts, &avpkt->duration);
|
||||
|
||||
discard_padding = opus->opts.packet_size - avpkt->duration;
|
||||
// Check if subtraction resulted in an overflow
|
||||
if ((discard_padding < opus->opts.packet_size) != (avpkt->duration > 0)) {
|
||||
av_free_packet(avpkt);
|
||||
av_free(avpkt);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
if (discard_padding > 0) {
|
||||
uint8_t* side_data = av_packet_new_side_data(avpkt,
|
||||
AV_PKT_DATA_SKIP_SAMPLES,
|
||||
10);
|
||||
if(side_data == NULL) {
|
||||
av_free_packet(avpkt);
|
||||
av_free(avpkt);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
AV_WL32(side_data + 4, discard_padding);
|
||||
}
|
||||
|
||||
*got_packet_ptr = 1;
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue