[FFmpeg-devel] [PATCH 1/2] lavfi/opencl: Use filter device if no input device is available

Jun Zhao mypopydev at gmail.com
Wed Jan 3 08:57:48 EET 2018



On 2018/1/3 7:12, Mark Thompson wrote:
> This allows implementing sources as well as filters.
> ---
>  libavfilter/opencl.c | 39 +++++++++++++++++++++++++++++++++------
>  1 file changed, 33 insertions(+), 6 deletions(-)
>
> diff --git a/libavfilter/opencl.c b/libavfilter/opencl.c
> index 005ad089e2..37afc41f8b 100644
> --- a/libavfilter/opencl.c
> +++ b/libavfilter/opencl.c
> @@ -42,11 +42,29 @@ int ff_opencl_filter_query_formats(AVFilterContext *avctx)
>      return ff_set_common_formats(avctx, formats);
>  }
>  
> +static int opencl_filter_set_device(AVFilterContext *avctx,
> +                                    AVBufferRef *device)
> +{
> +    OpenCLFilterContext *ctx = avctx->priv;
> +
> +    av_buffer_unref(&ctx->device_ref);
> +
> +    ctx->device_ref = av_buffer_ref(device);
> +    if (!ctx->device_ref)
> +        return AVERROR(ENOMEM);
> +
> +    ctx->device = (AVHWDeviceContext*)ctx->device_ref->data;
> +    ctx->hwctx  = ctx->device->hwctx;
> +
> +    return 0;
> +}
> +
>  int ff_opencl_filter_config_input(AVFilterLink *inlink)
>  {
>      AVFilterContext   *avctx = inlink->dst;
>      OpenCLFilterContext *ctx = avctx->priv;
>      AVHWFramesContext *input_frames;
> +    int err;
>  
>      if (!inlink->hw_frames_ctx) {
>          av_log(avctx, AV_LOG_ERROR, "OpenCL filtering requires a "
> @@ -59,15 +77,12 @@ int ff_opencl_filter_config_input(AVFilterLink *inlink)
>          return 0;
>  
>      input_frames = (AVHWFramesContext*)inlink->hw_frames_ctx->data;
> -
>      if (input_frames->format != AV_PIX_FMT_OPENCL)
>          return AVERROR(EINVAL);
>  
> -    ctx->device_ref = av_buffer_ref(input_frames->device_ref);
> -    if (!ctx->device_ref)
> -        return AVERROR(ENOMEM);
> -    ctx->device = input_frames->device_ctx;
> -    ctx->hwctx  = ctx->device->hwctx;
> +    err = opencl_filter_set_device(avctx, input_frames->device_ref);
> +    if (err < 0)
> +        return err;
>  
>      // Default output parameters match input parameters.
>      if (ctx->output_format == AV_PIX_FMT_NONE)
> @@ -90,6 +105,18 @@ int ff_opencl_filter_config_output(AVFilterLink *outlink)
>  
>      av_buffer_unref(&outlink->hw_frames_ctx);
>  
> +    if (!ctx->device_ref) {
I  think AVFilter framework call ff_opencl_filter_config_input first, is
it need to check !ctx->device_ref?
> +        if (!avctx->hw_device_ctx) {
> +            av_log(avctx, AV_LOG_ERROR, "OpenCL filtering requires an "
> +                   "OpenCL device.\n");
> +            return AVERROR(EINVAL);
> +        }
> +
> +        err = opencl_filter_set_device(avctx, avctx->hw_device_ctx);
> +        if (err < 0)
> +            return err;
> +    }
> +
>      output_frames_ref = av_hwframe_ctx_alloc(ctx->device_ref);
>      if (!output_frames_ref) {
>          err = AVERROR(ENOMEM);



More information about the ffmpeg-devel mailing list