diff mbox series

[FFmpeg-devel] avutils/hwcontext_qsv: set the source device in qsv_device_create

Message ID 20210222084504.339978-1-guangxin.xu@intel.com
State New
Headers show
Series [FFmpeg-devel] avutils/hwcontext_qsv: set the source device in qsv_device_create | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Xu, Guangxin Feb. 22, 2021, 8:45 a.m. UTC
opencl_device_derive only handles AV_HWDEVICE_TYPE_VAAPI.
We need a source device for qsv.

this will fix following pipeline:
ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -init_hw_device opencl=ocl@intel -hwaccel qsv -c:v h264_qsv -hwaccel_output_format qsv -i $input -filter_hw_device ocl -vf 'hwmap=derive_device=opencl,format=opencl,unsharp_opencl,hwmap=derive_device=qsv:reverse=1:extra_hw_frames=32'  -c:v hevc_qsv  -y test.h265
---
 libavutil/hwcontext_qsv.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Soft Works Feb. 22, 2021, 9:16 a.m. UTC | #1
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Xu
> Guangxin
> Sent: Monday, February 22, 2021 9:45 AM
> To: ffmpeg-devel@ffmpeg.org
> Cc: Xu Guangxin <guangxin.xu@intel.com>
> Subject: [FFmpeg-devel] [PATCH] avutils/hwcontext_qsv: set the source
> device in qsv_device_create
> 
> opencl_device_derive only handles AV_HWDEVICE_TYPE_VAAPI.
> We need a source device for qsv.
> 
> this will fix following pipeline:
> ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -init_hw_device
> opencl=ocl@intel -hwaccel qsv -c:v h264_qsv -hwaccel_output_format qsv -i
> $input -filter_hw_device ocl -vf
> 'hwmap=derive_device=opencl,format=opencl,unsharp_opencl,hwmap=der
> ive_device=qsv:reverse=1:extra_hw_frames=32'  -c:v hevc_qsv  -y test.h265
> ---
>  libavutil/hwcontext_qsv.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index
> 35a944f8f8..af3ee32cac 100644
> --- a/libavutil/hwcontext_qsv.c
> +++ b/libavutil/hwcontext_qsv.c
> @@ -1269,7 +1269,13 @@ static int qsv_device_create(AVHWDeviceContext
> *ctx, const char *device,
> 
>      impl = choose_implementation(device);
> 
> -    return qsv_device_derive_from_child(ctx, impl, child_device, 0);
> +    ret = qsv_device_derive_from_child(ctx, impl, child_device, 0);
> +    if (ret == 0) {
> +        ctx->internal->source_device = av_buffer_ref(priv->child_device_ctx);
> +        if (!ctx->internal->source_device)
> +            ret = AVERROR(ENOMEM);
> +    }
> +    return ret;
>  }

That's funny, I made almost the same change only two days ago:

    impl = choose_implementation(device);
    ret = qsv_device_derive_from_child(ctx, impl, child_device, 0);
    if (ret >= 0)
        ctx->internal->source_device = av_buffer_ref(priv->child_device_ctx);

    return ret;


From my POV, this change is correct and required.

softworkz
Guangxin Xu Feb. 23, 2021, 1:34 a.m. UTC | #2
On Mon, Feb 22, 2021 at 5:17 PM Soft Works <softworkz@hotmail.com> wrote:

>
>
> > -----Original Message-----
> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Xu
> > Guangxin
> > Sent: Monday, February 22, 2021 9:45 AM
> > To: ffmpeg-devel@ffmpeg.org
> > Cc: Xu Guangxin <guangxin.xu@intel.com>
> > Subject: [FFmpeg-devel] [PATCH] avutils/hwcontext_qsv: set the source
> > device in qsv_device_create
> >
> > opencl_device_derive only handles AV_HWDEVICE_TYPE_VAAPI.
> > We need a source device for qsv.
> >
> > this will fix following pipeline:
> > ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -init_hw_device
> > opencl=ocl@intel -hwaccel qsv -c:v h264_qsv -hwaccel_output_format qsv
> -i
> > $input -filter_hw_device ocl -vf
> > 'hwmap=derive_device=opencl,format=opencl,unsharp_opencl,hwmap=der
> > ive_device=qsv:reverse=1:extra_hw_frames=32'  -c:v hevc_qsv  -y test.h265
> > ---
> >  libavutil/hwcontext_qsv.c | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> >
> > diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index
> > 35a944f8f8..af3ee32cac 100644
> > --- a/libavutil/hwcontext_qsv.c
> > +++ b/libavutil/hwcontext_qsv.c
> > @@ -1269,7 +1269,13 @@ static int qsv_device_create(AVHWDeviceContext
> > *ctx, const char *device,
> >
> >      impl = choose_implementation(device);
> >
> > -    return qsv_device_derive_from_child(ctx, impl, child_device, 0);
> > +    ret = qsv_device_derive_from_child(ctx, impl, child_device, 0);
> > +    if (ret == 0) {
> > +        ctx->internal->source_device =
> av_buffer_ref(priv->child_device_ctx);
> > +        if (!ctx->internal->source_device)
> > +            ret = AVERROR(ENOMEM);
> > +    }
> > +    return ret;
> >  }
>
> That's funny, I made almost the same change only two days ago:
>
>     impl = choose_implementation(device);
>     ret = qsv_device_derive_from_child(ctx, impl, child_device, 0);
>     if (ret >= 0)
>         ctx->internal->source_device =
> av_buffer_ref(priv->child_device_ctx);
>
>     return ret;
>
>
> From my POV, this change is correct and required.
>
Glad to hear this. Thanks for the endorsement  :)

>
> softworkz
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Guangxin Xu March 5, 2021, 1:46 a.m. UTC | #3
On Tue, Feb 23, 2021 at 9:34 AM Guangxin Xu <oddstone@gmail.com> wrote:

>
>
> On Mon, Feb 22, 2021 at 5:17 PM Soft Works <softworkz@hotmail.com> wrote:
>
>>
>>
>> > -----Original Message-----
>> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Xu
>> > Guangxin
>> > Sent: Monday, February 22, 2021 9:45 AM
>> > To: ffmpeg-devel@ffmpeg.org
>> > Cc: Xu Guangxin <guangxin.xu@intel.com>
>> > Subject: [FFmpeg-devel] [PATCH] avutils/hwcontext_qsv: set the source
>> > device in qsv_device_create
>> >
>> > opencl_device_derive only handles AV_HWDEVICE_TYPE_VAAPI.
>> > We need a source device for qsv.
>> >
>> > this will fix following pipeline:
>> > ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -init_hw_device
>> > opencl=ocl@intel -hwaccel qsv -c:v h264_qsv -hwaccel_output_format qsv
>> -i
>> > $input -filter_hw_device ocl -vf
>> > 'hwmap=derive_device=opencl,format=opencl,unsharp_opencl,hwmap=der
>> > ive_device=qsv:reverse=1:extra_hw_frames=32'  -c:v hevc_qsv  -y
>> test.h265
>> > ---
>> >  libavutil/hwcontext_qsv.c | 8 +++++++-
>> >  1 file changed, 7 insertions(+), 1 deletion(-)
>> >
>> > diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index
>> > 35a944f8f8..af3ee32cac 100644
>> > --- a/libavutil/hwcontext_qsv.c
>> > +++ b/libavutil/hwcontext_qsv.c
>> > @@ -1269,7 +1269,13 @@ static int qsv_device_create(AVHWDeviceContext
>> > *ctx, const char *device,
>> >
>> >      impl = choose_implementation(device);
>> >
>> > -    return qsv_device_derive_from_child(ctx, impl, child_device, 0);
>> > +    ret = qsv_device_derive_from_child(ctx, impl, child_device, 0);
>> > +    if (ret == 0) {
>> > +        ctx->internal->source_device =
>> av_buffer_ref(priv->child_device_ctx);
>> > +        if (!ctx->internal->source_device)
>> > +            ret = AVERROR(ENOMEM);
>> > +    }
>> > +    return ret;
>> >  }
>>
>> That's funny, I made almost the same change only two days ago:
>>
>>     impl = choose_implementation(device);
>>     ret = qsv_device_derive_from_child(ctx, impl, child_device, 0);
>>     if (ret >= 0)
>>         ctx->internal->source_device =
>> av_buffer_ref(priv->child_device_ctx);
>>
>>     return ret;
>>
>>
>> From my POV, this change is correct and required.
>>
> Glad to hear this. Thanks for the endorsement  :)
>
Hi softworkz,
Could you help merge this?
thanks


>> softworkz
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel@ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
>
Xu, Guangxin March 11, 2021, 8:53 a.m. UTC | #4
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> Guangxin Xu
> Sent: Friday, March 5, 2021 9:46 AM
> To: FFmpeg development discussions and patches <ffmpeg-
> devel@ffmpeg.org>
> Subject: Re: [FFmpeg-devel] [PATCH] avutils/hwcontext_qsv: set the source
> device in qsv_device_create
> 
> On Tue, Feb 23, 2021 at 9:34 AM Guangxin Xu <oddstone@gmail.com> wrote:
> 
> >
> >
> > On Mon, Feb 22, 2021 at 5:17 PM Soft Works <softworkz@hotmail.com>
> wrote:
> >
> >>
> >>
> >> > -----Original Message-----
> >> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf
> Of
> >> > Xu Guangxin
> >> > Sent: Monday, February 22, 2021 9:45 AM
> >> > To: ffmpeg-devel@ffmpeg.org
> >> > Cc: Xu Guangxin <guangxin.xu@intel.com>
> >> > Subject: [FFmpeg-devel] [PATCH] avutils/hwcontext_qsv: set the
> >> > source device in qsv_device_create
> >> >
> >> > opencl_device_derive only handles AV_HWDEVICE_TYPE_VAAPI.
> >> > We need a source device for qsv.
> >> >
> >> > this will fix following pipeline:
> >> > ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128
> >> > -init_hw_device opencl=ocl@intel -hwaccel qsv -c:v h264_qsv
> >> > -hwaccel_output_format qsv
> >> -i
> >> > $input -filter_hw_device ocl -vf
> >> >
> 'hwmap=derive_device=opencl,format=opencl,unsharp_opencl,hwmap=der
> >> > ive_device=qsv:reverse=1:extra_hw_frames=32'  -c:v hevc_qsv  -y
> >> test.h265
> >> > ---
> >> >  libavutil/hwcontext_qsv.c | 8 +++++++-
> >> >  1 file changed, 7 insertions(+), 1 deletion(-)
> >> >
> >> > diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
> >> > index 35a944f8f8..af3ee32cac 100644
> >> > --- a/libavutil/hwcontext_qsv.c
> >> > +++ b/libavutil/hwcontext_qsv.c
> >> > @@ -1269,7 +1269,13 @@ static int
> >> > qsv_device_create(AVHWDeviceContext
> >> > *ctx, const char *device,
> >> >
> >> >      impl = choose_implementation(device);
> >> >
> >> > -    return qsv_device_derive_from_child(ctx, impl, child_device, 0);
> >> > +    ret = qsv_device_derive_from_child(ctx, impl, child_device, 0);
> >> > +    if (ret == 0) {
> >> > +        ctx->internal->source_device =
> >> av_buffer_ref(priv->child_device_ctx);
> >> > +        if (!ctx->internal->source_device)
> >> > +            ret = AVERROR(ENOMEM);
> >> > +    }
> >> > +    return ret;
> >> >  }
> >>
> >> That's funny, I made almost the same change only two days ago:
> >>
> >>     impl = choose_implementation(device);
> >>     ret = qsv_device_derive_from_child(ctx, impl, child_device, 0);
> >>     if (ret >= 0)
> >>         ctx->internal->source_device =
> >> av_buffer_ref(priv->child_device_ctx);
> >>
> >>     return ret;
> >>
> >>
> >> From my POV, this change is correct and required.
> >>
> > Glad to hear this. Thanks for the endorsement  :)
> >
> Hi softworkz,
> Could you help merge this?
> thanks
> 
Hmm, this patch will failed for "make fate-hwdevice V=2"
It because Qsv's internal->source_device is vaapi.  
When we derivation qsv to vaapi, and derivation back again, it will create a new qsv device.

Hi Mark,
Can we remove this test for qsv and vaapi? Or could you suggest a better way for me?
https://github.com/FFmpeg/FFmpeg/blob/069d2b4a50a6eb2f925f36884e6b9bd9a1e54670/libavutil/tests/hwdevice.c#L75

thanks

...
Successfully tested derivation vaapi -> qsv.
Test passed for vaapi with device :0.
Device type qsv successfully created.
Derivation qsv to vaapi succeeded, but derivation back again did not return the original device.
Test failed for qsv with default options.
Attempted to test 2 device types: 1 passed, 1 failed, 0 skipped.
make: *** [tests/Makefile:256: fate-hwdevice] Error 1
> 
> >> softworkz
> >> _______________________________________________
> >> ffmpeg-devel mailing list
> >> ffmpeg-devel@ffmpeg.org
> >> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >>
> >> To unsubscribe, visit link above, or email
> >> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
> >
> >
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org
> with subject "unsubscribe".
Mark Thompson March 13, 2021, 3:05 p.m. UTC | #5
On 11/03/2021 08:53, Xu, Guangxin wrote:
>> -----Original Message-----
>> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
>> Guangxin Xu
>> Sent: Friday, March 5, 2021 9:46 AM
>> To: FFmpeg development discussions and patches <ffmpeg-
>> devel@ffmpeg.org>
>> Subject: Re: [FFmpeg-devel] [PATCH] avutils/hwcontext_qsv: set the source
>> device in qsv_device_create
>>
>> On Tue, Feb 23, 2021 at 9:34 AM Guangxin Xu <oddstone@gmail.com> wrote:
>>
>>>
>>>
>>> On Mon, Feb 22, 2021 at 5:17 PM Soft Works <softworkz@hotmail.com>
>> wrote:
>>>
>>>>
>>>>
>>>>> -----Original Message-----
>>>>> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf
>> Of
>>>>> Xu Guangxin
>>>>> Sent: Monday, February 22, 2021 9:45 AM
>>>>> To: ffmpeg-devel@ffmpeg.org
>>>>> Cc: Xu Guangxin <guangxin.xu@intel.com>
>>>>> Subject: [FFmpeg-devel] [PATCH] avutils/hwcontext_qsv: set the
>>>>> source device in qsv_device_create
>>>>>
>>>>> opencl_device_derive only handles AV_HWDEVICE_TYPE_VAAPI.
>>>>> We need a source device for qsv.
>>>>>
>>>>> this will fix following pipeline:
>>>>> ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128
>>>>> -init_hw_device opencl=ocl@intel -hwaccel qsv -c:v h264_qsv
>>>>> -hwaccel_output_format qsv
>>>> -i
>>>>> $input -filter_hw_device ocl -vf
>>>>>
>> 'hwmap=derive_device=opencl,format=opencl,unsharp_opencl,hwmap=der
>>>>> ive_device=qsv:reverse=1:extra_hw_frames=32'  -c:v hevc_qsv  -y
>>>> test.h265
>>>>> ---
>>>>>   libavutil/hwcontext_qsv.c | 8 +++++++-
>>>>>   1 file changed, 7 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
>>>>> index 35a944f8f8..af3ee32cac 100644
>>>>> --- a/libavutil/hwcontext_qsv.c
>>>>> +++ b/libavutil/hwcontext_qsv.c
>>>>> @@ -1269,7 +1269,13 @@ static int
>>>>> qsv_device_create(AVHWDeviceContext
>>>>> *ctx, const char *device,
>>>>>
>>>>>       impl = choose_implementation(device);
>>>>>
>>>>> -    return qsv_device_derive_from_child(ctx, impl, child_device, 0);
>>>>> +    ret = qsv_device_derive_from_child(ctx, impl, child_device, 0);
>>>>> +    if (ret == 0) {
>>>>> +        ctx->internal->source_device =
>>>> av_buffer_ref(priv->child_device_ctx);
>>>>> +        if (!ctx->internal->source_device)
>>>>> +            ret = AVERROR(ENOMEM);
>>>>> +    }
>>>>> +    return ret;
>>>>>   }
>>>>
>>>> That's funny, I made almost the same change only two days ago:
>>>>
>>>>      impl = choose_implementation(device);
>>>>      ret = qsv_device_derive_from_child(ctx, impl, child_device, 0);
>>>>      if (ret >= 0)
>>>>          ctx->internal->source_device =
>>>> av_buffer_ref(priv->child_device_ctx);
>>>>
>>>>      return ret;
>>>>
>>>>
>>>>  From my POV, this change is correct and required.
>>>>
>>> Glad to hear this. Thanks for the endorsement  :)
>>>
>> Hi softworkz,
>> Could you help merge this?
>> thanks
>>
> Hmm, this patch will failed for "make fate-hwdevice V=2"
> It because Qsv's internal->source_device is vaapi.
> When we derivation qsv to vaapi, and derivation back again, it will create a new qsv device.
> 
> Hi Mark,
> Can we remove this test for qsv and vaapi? Or could you suggest a better way for me?
> https://github.com/FFmpeg/FFmpeg/blob/069d2b4a50a6eb2f925f36884e6b9bd9a1e54670/libavutil/tests/hwdevice.c#L75
> 
> thanks
> 
> ...
> Successfully tested derivation vaapi -> qsv.
> Test passed for vaapi with device :0.
> Device type qsv successfully created.
> Derivation qsv to vaapi succeeded, but derivation back again did not return the original device.
> Test failed for qsv with default options.
> Attempted to test 2 device types: 1 passed, 1 failed, 0 skipped.
> make: *** [tests/Makefile:256: fate-hwdevice] Error 1

You are hacking it to lie to the hwcontext implementation around how the device was derived, so the test fails because it finds a different derivation structure to what it created?  That seems correct?

Your command-line was:

$ ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -init_hw_device opencl=ocl@intel -hwaccel qsv -c:v h264_qsv -hwaccel_output_format qsv -i $input -filter_hw_device ocl -vf 'hwmap=derive_device=opencl,format=opencl,unsharp_opencl,hwmap=derive_device=qsv:reverse=1:extra_hw_frames=32'  -c:v hevc_qsv  -y test.h265

So that's trying to make five device references in turn:

1. Make a VAAPI device explicitly.
2. Derive an OpenCL device from the VAAPI device 1.
3. Make a libmfx device implicitly (because a libmfx decoder was requested).
4. Derive a new OpenCL device from the libmfx device 3 (you told the filter graph about device 2, but then didn't use it anywhere).
5. Derive a libmfx device from the OpenCL device 4, which should return libmfx device 3.

What's going wrong?  Step 4 fails to create an OpenCL device because devices 1/2 and device 3 aren't actually connected together at all.

How to solve that?  Either we can fix the connection, or we could just use the device we already have in step 4 rather than trying to create a new one.

To fix the connection, derive device 3 from device 1.  This doesn't work in the ffmpeg utility because the hacky support in ffmpeg_qsv.c doesn't support the normal device stuff.  It would work in your own program.

Using the existing device (by using device 2 rather than deriving a new on at step 4) looks like it should work:

$ ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -init_hw_device opencl=ocl@intel -hwaccel qsv -c:v h264_qsv -hwaccel_output_format qsv -i $input -filter_hw_device ocl -vf 'hwmap,format=opencl,unsharp_opencl,hwmap=derive_device=qsv:reverse=1:extra_hw_frames=32'  -c:v hevc_qsv  -y test.h265

Unfortunately it doesn't, and for the same reason that the first approach didn't - devices 1 and 3 aren't connected, so the OpenCL mapping is being given frames in the wrong device context and therefore fails (in fact the Intel ICD crashes with an abort, which is about the best you can hope for with this sort of undefined behaviour).


So, how can we make this work?  Well, the weird libmfx hacks are causing the problem, so let's just duck that by dumping the pointless wrapper decoder and using the normal decoder directly:

$ ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i $input -vf 'hwmap=derive_device=opencl,format=opencl,unsharp_opencl,hwmap=derive_device=qsv:reverse=1:extra_hw_frames=32'  -c:v hevc_qsv  -y test.h265

If you want to make it work with the libmfx wrapper decoder, then I think the most sensible way is to implement AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX in that decoder so it works like the others and the ffmpeg_qsv.c hacks can be removed entirely.

- Mark
Xu, Guangxin March 14, 2021, 2:28 a.m. UTC | #6
> You are hacking it to lie to the hwcontext implementation around how the
> device was derived, so the test fails because it finds a different derivation
> structure to what it created?  That seems correct?
> 
> Your command-line was:
> 
> $ ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -init_hw_device
> opencl=ocl@intel -hwaccel qsv -c:v h264_qsv -hwaccel_output_format qsv -i
> $input -filter_hw_device ocl -vf
> 'hwmap=derive_device=opencl,format=opencl,unsharp_opencl,hwmap=der
> ive_device=qsv:reverse=1:extra_hw_frames=32'  -c:v hevc_qsv  -y test.h265
> 
> So that's trying to make five device references in turn:
> 
> 1. Make a VAAPI device explicitly.
> 2. Derive an OpenCL device from the VAAPI device 1.
> 3. Make a libmfx device implicitly (because a libmfx decoder was requested).
> 4. Derive a new OpenCL device from the libmfx device 3 (you told the filter
> graph about device 2, but then didn't use it anywhere).
> 5. Derive a libmfx device from the OpenCL device 4, which should return
> libmfx device 3.
> 
> What's going wrong?  Step 4 fails to create an OpenCL device because
> devices 1/2 and device 3 aren't actually connected together at all.
> 
> How to solve that?  Either we can fix the connection, or we could just use the
> device we already have in step 4 rather than trying to create a new one.
> 
> To fix the connection, derive device 3 from device 1.  This doesn't work in the
> ffmpeg utility because the hacky support in ffmpeg_qsv.c doesn't support
> the normal device stuff.  It would work in your own program.
> 
> Using the existing device (by using device 2 rather than deriving a new on at
> step 4) looks like it should work:
> 
> $ ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -init_hw_device
> opencl=ocl@intel -hwaccel qsv -c:v h264_qsv -hwaccel_output_format qsv -i
> $input -filter_hw_device ocl -vf
> 'hwmap,format=opencl,unsharp_opencl,hwmap=derive_device=qsv:revers
> e=1:extra_hw_frames=32'  -c:v hevc_qsv  -y test.h265
> 
> Unfortunately it doesn't, and for the same reason that the first approach
> didn't - devices 1 and 3 aren't connected, so the OpenCL mapping is being
> given frames in the wrong device context and therefore fails (in fact the Intel
> ICD crashes with an abort, which is about the best you can hope for with this
> sort of undefined behaviour).
> 
> 
> So, how can we make this work?  Well, the weird libmfx hacks are causing the
> problem, so let's just duck that by dumping the pointless wrapper decoder
> and using the normal decoder directly:
Hi Mark,
Thanks for the detailed explaining. I will try the vaapi path.

thanks
> 
> $ ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -hwaccel vaapi -
> hwaccel_output_format vaapi -i $input -vf
> 'hwmap=derive_device=opencl,format=opencl,unsharp_opencl,hwmap=der
> ive_device=qsv:reverse=1:extra_hw_frames=32'  -c:v hevc_qsv  -y test.h265
> 
> If you want to make it work with the libmfx wrapper decoder, then I think
> the most sensible way is to implement
> AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX in that decoder so it
> works like the others and the ffmpeg_qsv.c hacks can be removed entirely.
> 
> - Mark
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org
> with subject "unsubscribe".
diff mbox series

Patch

diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
index 35a944f8f8..af3ee32cac 100644
--- a/libavutil/hwcontext_qsv.c
+++ b/libavutil/hwcontext_qsv.c
@@ -1269,7 +1269,13 @@  static int qsv_device_create(AVHWDeviceContext *ctx, const char *device,
 
     impl = choose_implementation(device);
 
-    return qsv_device_derive_from_child(ctx, impl, child_device, 0);
+    ret = qsv_device_derive_from_child(ctx, impl, child_device, 0);
+    if (ret == 0) {
+        ctx->internal->source_device = av_buffer_ref(priv->child_device_ctx);
+        if (!ctx->internal->source_device)
+            ret = AVERROR(ENOMEM);
+    }
+    return ret;
 }
 
 const HWContextType ff_hwcontext_type_qsv = {