[FFmpeg-devel] [PATCH 1/2] lavfi/opencl: Use filter device if no input device is available
Mark Thompson
sw at jkqxz.net
Wed Jan 3 12:25:17 EET 2018
On 03/01/18 06:57, Jun Zhao wrote:
> 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 you have a filter then config_input is indeed called first and the device from the first input is used, but if you have a source rather than a filter (no inputs) then you need this test to get the device from the filter setup. See how openclsrc works in patch 1/2.
>> + 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);
>
Thanks,
- Mark
More information about the ffmpeg-devel
mailing list