On 11/03/2021 08:53, Xu, Guangxin wrote:
-----Original Message-----
From: ffmpeg-devel <ffmpeg-devel-boun...@ffmpeg.org> On Behalf Of
Guangxin Xu
Sent: Friday, March 5, 2021 9:46 AM
To: FFmpeg development discussions and patches <ffmpeg-
de...@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 <oddst...@gmail.com> wrote:
On Mon, Feb 22, 2021 at 5:17 PM Soft Works <softwo...@hotmail.com>
wrote:
-----Original Message-----
From: ffmpeg-devel <ffmpeg-devel-boun...@ffmpeg.org> On Behalf
Of
Xu Guangxin
Sent: Monday, February 22, 2021 9:45 AM
To: ffmpeg-devel@ffmpeg.org
Cc: Xu Guangxin <guangxin...@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
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".