[FFmpeg-devel] [PATCH 1/2] avfilter: change ff_inlink_make_frame_writable() to take AVFrame* argument

wm4 nfxjfg at googlemail.com
Sun Jan 29 13:44:17 EET 2017


On Sat, 28 Jan 2017 22:23:53 +0700
Muhammad Faiz <mfcc64 at gmail.com> wrote:

> so the behavior will be similar to
> av_frame_make_writable().
> 
> Also use av_frame_copy() replacing
> av_image_copy()/av_samples_copy().
> 
> Needed for the next patch.
> 
> Suggested-by: wm4 <nfxjfg at googlemail.com>
> Signed-off-by: Muhammad Faiz <mfcc64 at gmail.com>
> ---
>  libavfilter/avfilter.c | 26 ++++++--------------------
>  libavfilter/filters.h  |  2 +-
>  2 files changed, 7 insertions(+), 21 deletions(-)
> 
> diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
> index c12d491..c8dafd2 100644
> --- a/libavfilter/avfilter.c
> +++ b/libavfilter/avfilter.c
> @@ -1104,7 +1104,7 @@ static int ff_filter_frame_framed(AVFilterLink *link, AVFrame *frame)
>          filter_frame = default_filter_frame;
>  
>      if (dst->needs_writable) {
> -        ret = ff_inlink_make_frame_writable(link, &frame);
> +        ret = ff_inlink_make_frame_writable(link, frame);
>          if (ret < 0)
>              goto fail;
>      }
> @@ -1556,9 +1556,8 @@ int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
>      return 1;
>  }
>  
> -int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
> +int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame *frame)
>  {
> -    AVFrame *frame = *rframe;
>      AVFrame *out;
>      int ret;
>  
> @@ -1585,23 +1584,10 @@ int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
>          return ret;
>      }
>  
> -    switch (link->type) {
> -    case AVMEDIA_TYPE_VIDEO:
> -        av_image_copy(out->data, out->linesize, (const uint8_t **)frame->data, frame->linesize,
> -                      frame->format, frame->width, frame->height);
> -        break;
> -    case AVMEDIA_TYPE_AUDIO:
> -        av_samples_copy(out->extended_data, frame->extended_data,
> -                        0, 0, frame->nb_samples,
> -                        av_frame_get_channels(frame),
> -                        frame->format);
> -        break;
> -    default:
> -        av_assert0(!"reached");
> -    }
> -
> -    av_frame_free(&frame);
> -    *rframe = out;
> +    av_frame_copy(out, frame);
> +    av_frame_unref(frame);
> +    av_frame_move_ref(frame, out);
> +    av_frame_free(&out);
>      return 0;
>  }
>  
> diff --git a/libavfilter/filters.h b/libavfilter/filters.h
> index 2c78d60..5d32403 100644
> --- a/libavfilter/filters.h
> +++ b/libavfilter/filters.h
> @@ -101,7 +101,7 @@ int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
>   * This is similar to av_frame_make_writable() except it uses the link's
>   * buffer allocation callback, and therefore allows direct rendering.
>   */
> -int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe);
> +int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame *frame);
>  
>  /**
>   * Test and acknowledge the change of status on the link.

Please push this patch. It's a nice simplification.


More information about the ffmpeg-devel mailing list