[FFmpeg-devel] [PATCH] avcodec/cbs_mpeg2: use existing buffer reference if available when splitting fragments

James Almer jamrial at gmail.com
Wed Apr 25 01:22:56 EEST 2018


On 4/23/2018 11:17 PM, James Almer wrote:
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
>  libavcodec/cbs_mpeg2.c | 15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
> 
> diff --git a/libavcodec/cbs_mpeg2.c b/libavcodec/cbs_mpeg2.c
> index bfb64a0851..086d08ed64 100644
> --- a/libavcodec/cbs_mpeg2.c
> +++ b/libavcodec/cbs_mpeg2.c
> @@ -146,14 +146,17 @@ static int cbs_mpeg2_split_fragment(CodedBitstreamContext *ctx,
>              unit_size = (end - 4) - (start - 1);
>          }
>  
> -        unit_data = av_malloc(unit_size + AV_INPUT_BUFFER_PADDING_SIZE);
> -        if (!unit_data)
> -            return AVERROR(ENOMEM);
> -        memcpy(unit_data, start - 1, unit_size);
> -        memset(unit_data + unit_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
> +        if (header) {
> +            unit_data = av_malloc(unit_size + AV_INPUT_BUFFER_PADDING_SIZE);
> +            if (!unit_data)
> +                return AVERROR(ENOMEM);
> +            memcpy(unit_data, start - 1, unit_size);
> +            memset(unit_data + unit_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
> +        } else
> +            unit_data = (uint8_t *)start - 1;
>  
>          err = ff_cbs_insert_unit_data(ctx, frag, i, unit_type,
> -                                      unit_data, unit_size, NULL);
> +                                      unit_data, unit_size, frag->data_ref);
>          if (err < 0) {
>              av_freep(&unit_data);
>              return err;

The alternative is to make ff_cbs_read_extradata() create an AVBufferRef
with the contents of par->extradata, so every
CodedBitstreamType->split_fragment() function can safely assume the
fragment will always be reference counted.

I think that would be cleaner overall.


More information about the ffmpeg-devel mailing list