[FFmpeg-devel] [PATCH] frame: add an av_frame_new_side_data_from_buf function

wm4 nfxjfg at googlemail.com
Thu Mar 1 14:46:15 EET 2018


On Thu,  1 Mar 2018 12:32:14 +0000
Rostislav Pehlivanov <atomnuker at gmail.com> wrote:

> Signed-off-by: Rostislav Pehlivanov <atomnuker at gmail.com>
> ---
>  libavutil/frame.c | 39 ++++++++++++++++++++++++---------------
>  libavutil/frame.h | 13 +++++++++++++
>  2 files changed, 37 insertions(+), 15 deletions(-)
> 
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index 662a7e5ab5..601906fcc2 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -356,8 +356,10 @@ FF_ENABLE_DEPRECATION_WARNINGS
>              }
>              memcpy(sd_dst->data, sd_src->data, sd_src->size);
>          } else {
> -            sd_dst = frame_new_side_data(dst, sd_src->type, av_buffer_ref(sd_src->buf));
> +            AVBufferRef *buf = av_buffer_ref(sd_src->buf);
> +            sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, buf);
>              if (!sd_dst) {
> +                av_buffer_unref(&buf);
>                  wipe_side_data(dst);
>                  return AVERROR(ENOMEM);
>              }
> @@ -642,9 +644,9 @@ AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane)
>      return NULL;
>  }
>  
> -static AVFrameSideData *frame_new_side_data(AVFrame *frame,
> -                                            enum AVFrameSideDataType type,
> -                                            AVBufferRef *buf)
> +AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,
> +                                                 enum AVFrameSideDataType type,
> +                                                 AVBufferRef *buf)
>  {
>      AVFrameSideData *ret, **tmp;
>  
> @@ -652,18 +654,20 @@ static AVFrameSideData *frame_new_side_data(AVFrame *frame,
>          return NULL;
>  
>      if (frame->nb_side_data > INT_MAX / sizeof(*frame->side_data) - 1)
> -        goto fail;
> +        return NULL;
> +
> +    ret = av_mallocz(sizeof(*ret));
> +    if (!ret)
> +        return NULL;
>  
>      tmp = av_realloc(frame->side_data,
>                       (frame->nb_side_data + 1) * sizeof(*frame->side_data));
> -    if (!tmp)
> -        goto fail;
> +    if (!tmp) {
> +        av_free(ret);
> +        return NULL;
> +    }
>      frame->side_data = tmp;
>  
> -    ret = av_mallocz(sizeof(*ret));
> -    if (!ret)
> -        goto fail;
> -
>      ret->buf = buf;
>      ret->data = ret->buf->data;
>      ret->size = buf->size;
> @@ -672,17 +676,22 @@ static AVFrameSideData *frame_new_side_data(AVFrame *frame,
>      frame->side_data[frame->nb_side_data++] = ret;
>  
>      return ret;
> -fail:
> -    av_buffer_unref(&buf);
> -    return NULL;
>  }
>  
>  AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
>                                          enum AVFrameSideDataType type,
>                                          int size)
>  {
> +    AVBufferRef *buf = av_buffer_alloc(size);
> +    if (!buf)
> +        return NULL;
>  
> -    return frame_new_side_data(frame, type, av_buffer_alloc(size));
> +    AVFrameSideData *ret = av_frame_new_side_data_from_buf(frame, type, buf);
> +    if (!ref) {
> +        av_buffer_unref(&buf);
> +        return NULL;
> +    }
> +    return ret;
>  }
>  
>  AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index d54bd9a354..1e3c40a30e 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -800,6 +800,19 @@ AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
>                                          enum AVFrameSideDataType type,
>                                          int size);
>  
> +/**
> + * Add a new side data to a frame from an existing AVBufferRef
> + *
> + * @param frame a frame to which the side data should be added
> + * @param type type of the added side data
> + * @param buf the AVBufferRef to add as side data
> + *
> + * @return newly added side data on success, NULL on error
> + */

Doesn't describe what happens to buf at all. Does the function create a
new reference? Does it take over ownership? If so, what happens on
error?

> +AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,
> +                                                 enum AVFrameSideDataType type,
> +                                                 AVBufferRef *buf);
> +
>  /**
>   * @return a pointer to the side data of a given type on success, NULL if there
>   * is no side data with such type in this frame.



More information about the ffmpeg-devel mailing list