[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