[FFmpeg-cvslog] lavu/hwcontext_qsv: add support for 12bit content on Linux
Fei Wang
git at videolan.org
Mon Oct 10 06:15:28 EEST 2022
ffmpeg | branch: master | Fei Wang <fei.w.wang at intel.com> | Thu Oct 6 15:35:37 2022 +0800| [201cb35061f2ad34d0effb7f10084cc5148e880c] | committer: Haihao Xiang
lavu/hwcontext_qsv: add support for 12bit content on Linux
P012, Y212 and XV36 are used for 12bit content in FFmpeg VAAPI, so
these formats should be used in FFmpeg QSV too, however the SDK only
declares support for P016, Y216 and Y416. So this commit fudged mappings
between AV_PIX_FMT_P012 and MFX_FOURCC_P016, AV_PIX_FMT_Y212 and
MFX_FOURCC_Y216, AV_PIX_FMT_XV36 and MFX_FOURCC_Y416.
Signed-off-by: Fei Wang <fei.w.wang at intel.com>
Signed-off-by: Wenbin Chen <wenbin.chen at intel.com>
Signed-off-by: Haihao Xiang <haihao.xiang at intel.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=201cb35061f2ad34d0effb7f10084cc5148e880c
---
libavutil/hwcontext_qsv.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
index 93ecd2f1a3..ec0f72b329 100644
--- a/libavutil/hwcontext_qsv.c
+++ b/libavutil/hwcontext_qsv.c
@@ -128,6 +128,20 @@ static const struct {
// the SDK only delares support for Y410
{ AV_PIX_FMT_XV30,
MFX_FOURCC_Y410, 0 },
+#if QSV_VERSION_ATLEAST(1, 31)
+ // P012 is used for VAAPI child device,
+ // the SDK only delares support for P016
+ { AV_PIX_FMT_P012,
+ MFX_FOURCC_P016, 1 },
+ // Y212 is used for VAAPI child device,
+ // the SDK only delares support for Y216
+ { AV_PIX_FMT_Y212,
+ MFX_FOURCC_Y216, 1 },
+ // XV36 is used for VAAPI child device,
+ // the SDK only delares support for Y416
+ { AV_PIX_FMT_XV36,
+ MFX_FOURCC_Y416, 1 },
+#endif
#endif
};
@@ -1493,6 +1507,7 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface)
switch (frame->format) {
case AV_PIX_FMT_NV12:
case AV_PIX_FMT_P010:
+ case AV_PIX_FMT_P012:
surface->Data.Y = frame->data[0];
surface->Data.UV = frame->data[1];
break;
@@ -1517,6 +1532,7 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface)
break;
case AV_PIX_FMT_Y210:
+ case AV_PIX_FMT_Y212:
surface->Data.Y16 = (mfxU16 *)frame->data[0];
surface->Data.U16 = (mfxU16 *)frame->data[0] + 1;
surface->Data.V16 = (mfxU16 *)frame->data[0] + 3;
@@ -1532,6 +1548,14 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface)
case AV_PIX_FMT_XV30:
surface->Data.U = frame->data[0];
break;
+ case AV_PIX_FMT_XV36:
+ surface->Data.U = frame->data[0];
+ surface->Data.Y = frame->data[0] + 2;
+ surface->Data.V = frame->data[0] + 4;
+ // Only set Data.A to a valid address, the SDK doesn't
+ // use the value from the frame.
+ surface->Data.A = frame->data[0] + 6;
+ break;
#endif
default:
return MFX_ERR_UNSUPPORTED;
More information about the ffmpeg-cvslog
mailing list