[FFmpeg-devel] [PATCH 3/3] lavcodec: Adding support for End Trimming in Opus encoder
Vignesh Venkatasubramanian
vigneshv at google.com
Tue Sep 10 23:41:41 CEST 2013
On Fri, Aug 30, 2013 at 11:26 AM, Vignesh Venkatasubramanian
<vigneshv at google.com> wrote:
> 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 at google.com>
> ---
> libavcodec/libopusenc.c | 20 ++++++++++++++++++++
> 1 file changed, 20 insertions(+)
>
> diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c
> index 59caac7..6b22b75 100644
> --- a/libavcodec/libopusenc.c
> +++ b/libavcodec/libopusenc.c
> @@ -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;
> --
> 1.8.4
>
Michael, could you please look into this too? This is the only patch
left out for Opus Matroska functionality. Thanks!
More information about the ffmpeg-devel
mailing list