From 0178cc188b356d3df5982045975407c7e67e1dd8 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Tue, 21 Nov 2023 20:56:36 +0900 Subject: [PATCH] qsv: Add util methods for video format mapping Remove duplicated format mapping code Part-of: --- .../sys/qsv/gstqsvallocator.cpp | 61 +++----- .../gst-plugins-bad/sys/qsv/gstqsvallocator.h | 1 + .../sys/qsv/gstqsvallocator_d3d11.cpp | 36 +---- .../gst-plugins-bad/sys/qsv/gstqsvav1enc.cpp | 38 ++--- .../gst-plugins-bad/sys/qsv/gstqsvdecoder.cpp | 19 +-- .../gst-plugins-bad/sys/qsv/gstqsvh264dec.cpp | 5 +- .../gst-plugins-bad/sys/qsv/gstqsvh264enc.cpp | 16 +-- .../gst-plugins-bad/sys/qsv/gstqsvh265dec.cpp | 12 +- .../gst-plugins-bad/sys/qsv/gstqsvh265enc.cpp | 20 +-- .../gst-plugins-bad/sys/qsv/gstqsvjpegdec.cpp | 11 +- .../gst-plugins-bad/sys/qsv/gstqsvjpegenc.cpp | 17 +-- .../gst-plugins-bad/sys/qsv/gstqsvutils.cpp | 132 ++++++++++++++++++ .../gst-plugins-bad/sys/qsv/gstqsvutils.h | 6 + .../gst-plugins-bad/sys/qsv/gstqsvvp9dec.cpp | 19 +-- .../gst-plugins-bad/sys/qsv/gstqsvvp9enc.cpp | 62 ++------ 15 files changed, 214 insertions(+), 241 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator.cpp index a022719507..697b292962 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator.cpp @@ -199,33 +199,7 @@ gst_qsv_allocator_alloc_default (GstQsvAllocator * self, gboolean dummy_alloc, return MFX_ERR_UNSUPPORTED; } - switch (request->Info.FourCC) { - case MFX_FOURCC_NV12: - format = GST_VIDEO_FORMAT_NV12; - break; - case MFX_FOURCC_P010: - format = GST_VIDEO_FORMAT_P010_10LE; - break; - case MFX_FOURCC_P016: - format = GST_VIDEO_FORMAT_P016_LE; - break; - case MFX_FOURCC_AYUV: - format = GST_VIDEO_FORMAT_VUYA; - break; - case MFX_FOURCC_Y410: - format = GST_VIDEO_FORMAT_Y410; - break; - case MFX_FOURCC_YUY2: - format = GST_VIDEO_FORMAT_YUY2; - break; - case MFX_FOURCC_RGB4: - format = GST_VIDEO_FORMAT_BGRA; - break; - default: - /* TODO: add more formats */ - break; - } - + format = gst_qsv_frame_info_format_to_gst (&request->Info); if (format == GST_VIDEO_FORMAT_UNKNOWN) { GST_ERROR_OBJECT (self, "Unknown MFX format fourcc %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (request->Info.FourCC)); @@ -408,49 +382,56 @@ gst_qsv_allocator_lock (mfxHDL pthis, mfxMemId mid, mfxFrameData * ptr) frame->map_count++; stride = GST_VIDEO_FRAME_PLANE_STRIDE (&frame->frame, 0); + ptr->PitchHigh = (mfxU16) (stride / (1 << 16)); + ptr->PitchLow = (mfxU16) (stride % (1 << 16)); /* FIXME: check and handle other formats */ switch (GST_VIDEO_INFO_FORMAT (&frame->info)) { case GST_VIDEO_FORMAT_NV12: case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P012_LE: case GST_VIDEO_FORMAT_P016_LE: - ptr->Pitch = (mfxU16) stride; ptr->Y = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); ptr->UV = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 1); break; + case GST_VIDEO_FORMAT_YUY2: + ptr->Y = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); + ptr->U = ptr->Y + 1; + ptr->V = ptr->Y + 3; + break; + case GST_VIDEO_FORMAT_Y210: + case GST_VIDEO_FORMAT_Y212_LE: + ptr->Y16 = (mfxU16 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); + ptr->U16 = ptr->Y16 + 1; + ptr->V16 = ptr->Y16 + 3; + break; case GST_VIDEO_FORMAT_VUYA: - ptr->PitchHigh = (mfxU16) (stride / (1 << 16)); - ptr->PitchLow = (mfxU16) (stride % (1 << 16)); ptr->V = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); ptr->U = ptr->V + 1; ptr->Y = ptr->V + 2; ptr->A = ptr->V + 3; break; case GST_VIDEO_FORMAT_Y410: - ptr->PitchHigh = (mfxU16) (stride / (1 << 16)); - ptr->PitchLow = (mfxU16) (stride % (1 << 16)); ptr->Y410 = (mfxY410 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); break; + case GST_VIDEO_FORMAT_Y412_LE: + ptr->U = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); + ptr->Y = ptr->Y + 2; + ptr->V = ptr->Y + 4; + ptr->A = ptr->Y + 6; + break; case GST_VIDEO_FORMAT_BGRA: - ptr->Pitch = (mfxU16) stride; ptr->B = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); ptr->G = ptr->B + 1; ptr->R = ptr->B + 2; ptr->A = ptr->B + 3; break; case GST_VIDEO_FORMAT_RGBA: - ptr->Pitch = (mfxU16) stride; ptr->R = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); ptr->G = ptr->R + 1; ptr->B = ptr->R + 2; ptr->A = ptr->R + 3; break; - case GST_VIDEO_FORMAT_YUY2: - ptr->Pitch = (mfxU16) stride; - ptr->Y = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); - ptr->U = ptr->Y + 1; - ptr->V = ptr->Y + 3; - break; default: break; } diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator.h b/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator.h index 10227fa3af..d28340f9e9 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator.h +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator.h @@ -22,6 +22,7 @@ #include #include #include +#include "gstqsvutils.h" G_BEGIN_DECLS diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator_d3d11.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator_d3d11.cpp index d70077dd22..767b226a75 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator_d3d11.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator_d3d11.cpp @@ -89,7 +89,7 @@ gst_qsv_d3d11_allocator_alloc (GstQsvAllocator * allocator, mfxFrameAllocResponse * response) { GstQsvD3D11Allocator *self = GST_QSV_D3D11_ALLOCATOR (allocator); - DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN; + GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; GstQsvFrame **mids = nullptr; /* Something unexpected and went wrong */ @@ -99,37 +99,9 @@ gst_qsv_d3d11_allocator_alloc (GstQsvAllocator * allocator, return MFX_ERR_UNSUPPORTED; } - switch (request->Info.FourCC) { - case MFX_FOURCC_NV12: - dxgi_format = DXGI_FORMAT_NV12; - break; - case MFX_FOURCC_P010: - dxgi_format = DXGI_FORMAT_P010; - break; - case MFX_FOURCC_P016: - dxgi_format = DXGI_FORMAT_P016; - break; - case MFX_FOURCC_AYUV: - dxgi_format = DXGI_FORMAT_AYUV; - break; - case MFX_FOURCC_Y410: - dxgi_format = DXGI_FORMAT_Y410; - break; - case MFX_FOURCC_RGB4: - dxgi_format = DXGI_FORMAT_B8G8R8A8_UNORM; - break; - case MFX_FOURCC_BGR4: - dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM; - break; - case MFX_FOURCC_YUY2: - dxgi_format = DXGI_FORMAT_YUY2; - break; - default: - /* TODO: add more formats */ - break; - } + format = gst_qsv_frame_info_format_to_gst (&request->Info); - if (dxgi_format == DXGI_FORMAT_UNKNOWN && + if (format == GST_VIDEO_FORMAT_UNKNOWN && request->Info.FourCC != MFX_FOURCC_P8) { GST_ERROR_OBJECT (self, "Failed to convert %d to DXGI format", request->Info.FourCC); @@ -175,7 +147,6 @@ gst_qsv_d3d11_allocator_alloc (GstQsvAllocator * allocator, nullptr); } else { GstBufferPool *pool; - GstVideoFormat format; GstVideoInfo info; GstCaps *caps; GstStructure *config; @@ -207,7 +178,6 @@ gst_qsv_d3d11_allocator_alloc (GstQsvAllocator * allocator, mids = g_new0 (GstQsvFrame *, request->NumFrameSuggested); response->NumFrameActual = request->NumFrameSuggested; - format = gst_d3d11_dxgi_format_to_gst (dxgi_format); gst_video_info_set_format (&info, format, request->Info.CropW, request->Info.CropH); diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvav1enc.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvav1enc.cpp index f9b2f2ce51..833e2694e4 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvav1enc.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvav1enc.cpp @@ -459,6 +459,7 @@ gst_qsv_av1_enc_set_format (GstQsvEncoder * encoder, mfxFrameInfo *frame_info; mfxExtAV1BitstreamParam *bs_param; mfxExtAV1ResolutionParam *res_param; + GstVideoFormat format; frame_info = ¶m->mfx.FrameInfo; @@ -481,24 +482,15 @@ gst_qsv_av1_enc_set_format (GstQsvEncoder * encoder, frame_info->AspectRatioW = GST_VIDEO_INFO_PAR_N (info); frame_info->AspectRatioH = GST_VIDEO_INFO_PAR_D (info); - switch (GST_VIDEO_INFO_FORMAT (info)) { + format = GST_VIDEO_INFO_FORMAT (info); + switch (format) { case GST_VIDEO_FORMAT_NV12: - frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; - frame_info->FourCC = MFX_FOURCC_NV12; - frame_info->BitDepthLuma = 8; - frame_info->BitDepthChroma = 8; - frame_info->Shift = 0; - break; case GST_VIDEO_FORMAT_P010_10LE: - frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; - frame_info->FourCC = MFX_FOURCC_P010; - frame_info->BitDepthLuma = 10; - frame_info->BitDepthChroma = 10; - frame_info->Shift = 1; + gst_qsv_frame_info_set_format (frame_info, format); break; default: GST_ERROR_OBJECT (self, "Unexpected format %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); + gst_video_format_to_string (format)); return FALSE; } @@ -677,21 +669,11 @@ gst_qsv_av1_enc_register (GstPlugin * plugin, guint rank, guint impl_index, resolution_param.FrameHeight = 240; /* MAIN profile covers NV12 and P010 */ - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; - mfx->FrameInfo.Shift = 0; - + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_NV12); if (MFXVideoENCODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) supported_formats.push_back ("NV12"); - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_P010; - mfx->FrameInfo.BitDepthLuma = 10; - mfx->FrameInfo.BitDepthChroma = 10; - mfx->FrameInfo.Shift = 1; - + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_P010_10LE); if (MFXVideoENCODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) supported_formats.push_back ("P010_10LE"); @@ -700,11 +682,7 @@ gst_qsv_av1_enc_register (GstPlugin * plugin, guint rank, guint impl_index, return; } - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; - mfx->FrameInfo.Shift = 0; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_NV12); /* Check max-resolution */ for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) { diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvdecoder.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvdecoder.cpp index dde904ca9f..0c05e0cb05 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvdecoder.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvdecoder.cpp @@ -1208,23 +1208,6 @@ gst_qsv_decoder_negotiate (GstVideoDecoder * decoder) height = frame_info->CropH; } - switch (frame_info->FourCC) { - case MFX_FOURCC_NV12: - format = GST_VIDEO_FORMAT_NV12; - break; - case MFX_FOURCC_P010: - format = GST_VIDEO_FORMAT_P010_10LE; - break; - case MFX_FOURCC_P016: - format = GST_VIDEO_FORMAT_P016_LE; - break; - case MFX_FOURCC_RGB4: - format = GST_VIDEO_FORMAT_BGRA; - break; - default: - break; - } - if (klass->codec_id == MFX_CODEC_JPEG) { if (param->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV422) { format = GST_VIDEO_FORMAT_YUY2; @@ -1235,6 +1218,8 @@ gst_qsv_decoder_negotiate (GstVideoDecoder * decoder) frame_info->FourCC = MFX_FOURCC_RGB4; frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; } + } else { + format = gst_qsv_frame_info_format_to_gst (frame_info); } if (format == GST_VIDEO_FORMAT_UNKNOWN) { diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvh264dec.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvh264dec.cpp index b8b25ad9a1..b2cc8a0549 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvh264dec.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvh264dec.cpp @@ -460,12 +460,9 @@ gst_qsv_h264_dec_register (GstPlugin * plugin, guint rank, guint impl_index, mfx->FrameInfo.FrameRateExtD = 1; mfx->FrameInfo.AspectRatioW = 1; mfx->FrameInfo.AspectRatioH = 1; - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; mfx->CodecProfile = MFX_PROFILE_AVC_MAIN; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_NV12); /* Check max-resolution */ for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) { diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvh264enc.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvh264enc.cpp index 38f6b30a23..97fbb43541 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvh264enc.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvh264enc.cpp @@ -1425,6 +1425,7 @@ gst_qsv_h264_enc_set_format (GstQsvEncoder * encoder, GstStructure *s; const gchar *stream_format; mfxFrameInfo *frame_info; + GstVideoFormat format; frame_info = ¶m->mfx.FrameInfo; @@ -1472,16 +1473,14 @@ gst_qsv_h264_enc_set_format (GstQsvEncoder * encoder, frame_info->AspectRatioH = GST_VIDEO_INFO_PAR_D (info); /* TODO: update for non 4:2:0 formats. Currently NV12 only */ - frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; - switch (GST_VIDEO_INFO_FORMAT (info)) { + format = GST_VIDEO_INFO_FORMAT (info); + switch (format) { case GST_VIDEO_FORMAT_NV12: - frame_info->FourCC = MFX_FOURCC_NV12; - frame_info->BitDepthLuma = 8; - frame_info->BitDepthChroma = 8; + gst_qsv_frame_info_set_format (frame_info, format); break; default: GST_ERROR_OBJECT (self, "Unexpected format %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); + gst_video_format_to_string (format)); return FALSE; } @@ -2146,11 +2145,8 @@ gst_qsv_h264_enc_register (GstPlugin * plugin, guint rank, guint impl_index, mfx->FrameInfo.FrameRateExtD = 1; mfx->FrameInfo.AspectRatioW = 1; mfx->FrameInfo.AspectRatioH = 1; - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_NV12); /* Check supported profiles */ for (guint i = 0; i < G_N_ELEMENTS (profile_map); i++) { diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265dec.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265dec.cpp index bdb2b54039..d11980e707 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265dec.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265dec.cpp @@ -487,11 +487,8 @@ gst_qsv_h265_dec_register (GstPlugin * plugin, guint rank, guint impl_index, mfx->FrameInfo.FrameRateExtD = 1; mfx->FrameInfo.AspectRatioW = 1; mfx->FrameInfo.AspectRatioH = 1; - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_NV12); mfx->CodecProfile = MFX_PROFILE_HEVC_MAIN; /* Check max-resolution */ @@ -519,12 +516,7 @@ gst_qsv_h265_dec_register (GstPlugin * plugin, guint rank, guint impl_index, /* Check other profile/formats */ /* TODO: check other profiles too */ - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_P010; - mfx->FrameInfo.BitDepthLuma = 10; - mfx->FrameInfo.BitDepthChroma = 10; - mfx->FrameInfo.Shift = 1; - mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_P010_10LE); mfx->CodecProfile = MFX_PROFILE_HEVC_MAIN10; mfx->FrameInfo.Width = GST_ROUND_UP_16 (gst_qsv_resolutions[0].width); mfx->FrameInfo.Height = GST_ROUND_UP_16 (gst_qsv_resolutions[0].height); diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265enc.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265enc.cpp index 121b452bb9..ea4c734668 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265enc.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265enc.cpp @@ -1460,29 +1460,23 @@ gst_qsv_h265_enc_register (GstPlugin * plugin, guint rank, guint impl_index, /* Check supported profiles */ for (guint i = 0; i < G_N_ELEMENTS (profile_map); i++) { + GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; mfx->CodecProfile = profile_map[i].profile; mfx->CodecLevel = MFX_LEVEL_UNKNOWN; switch (mfx->CodecProfile) { case MFX_PROFILE_HEVC_MAIN: - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; - mfx->FrameInfo.Shift = 0; + format = GST_VIDEO_FORMAT_NV12; break; case MFX_PROFILE_HEVC_MAIN10: - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_P010; - mfx->FrameInfo.BitDepthLuma = 10; - mfx->FrameInfo.BitDepthChroma = 10; - mfx->FrameInfo.Shift = 1; + format = GST_VIDEO_FORMAT_P010_10LE; break; default: g_assert_not_reached (); return; } + gst_qsv_frame_info_set_format (&mfx->FrameInfo, format); if (MFXVideoENCODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) continue; @@ -1495,11 +1489,7 @@ gst_qsv_h265_enc_register (GstPlugin * plugin, guint rank, guint impl_index, return; } - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; - mfx->FrameInfo.Shift = 0; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_NV12); mfx->CodecProfile = MFX_PROFILE_HEVC_MAIN; /* check hdr10 metadata SEI support */ diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvjpegdec.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvjpegdec.cpp index 7017c8730f..1405299e7e 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvjpegdec.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvjpegdec.cpp @@ -157,11 +157,8 @@ gst_qsv_jpeg_dec_register (GstPlugin * plugin, guint rank, guint impl_index, mfx->FrameInfo.FrameRateExtD = 1; mfx->FrameInfo.AspectRatioW = 1; mfx->FrameInfo.AspectRatioH = 1; - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_NV12); mfx->CodecProfile = MFX_PROFILE_JPEG_BASELINE; mfx->JPEGChromaFormat = MFX_CHROMAFORMAT_YUV420; mfx->JPEGColorFormat = MFX_JPEG_COLORFORMAT_YCbCr; @@ -188,14 +185,12 @@ gst_qsv_jpeg_dec_register (GstPlugin * plugin, guint rank, guint impl_index, supported_formats.push_back ("NV12"); - mfx->FrameInfo.FourCC = MFX_FOURCC_YUY2; - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV422; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_YUY2); mfx->JPEGChromaFormat = MFX_CHROMAFORMAT_YUV422; if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) supported_formats.push_back ("YUY2"); - mfx->FrameInfo.FourCC = MFX_FOURCC_RGB4; - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV444; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_BGRA); mfx->JPEGChromaFormat = MFX_CHROMAFORMAT_YUV444; mfx->JPEGColorFormat = MFX_JPEG_COLORFORMAT_RGB; if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvjpegenc.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvjpegenc.cpp index 01e0c238a6..4cf4c36453 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvjpegenc.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvjpegenc.cpp @@ -265,6 +265,7 @@ gst_qsv_jpeg_enc_set_format (GstQsvEncoder * encoder, GstQsvJpegEncClass *klass = GST_QSV_JPEG_ENC_GET_CLASS (self); GstVideoInfo *info = &state->info; mfxFrameInfo *frame_info; + GstVideoFormat format; frame_info = ¶m->mfx.FrameInfo; @@ -285,22 +286,12 @@ gst_qsv_jpeg_enc_set_format (GstQsvEncoder * encoder, frame_info->AspectRatioW = GST_VIDEO_INFO_PAR_N (info); frame_info->AspectRatioH = GST_VIDEO_INFO_PAR_D (info); - switch (GST_VIDEO_INFO_FORMAT (info)) { + format = GST_VIDEO_INFO_FORMAT (info); + switch (format) { case GST_VIDEO_FORMAT_NV12: - frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; - frame_info->FourCC = MFX_FOURCC_NV12; - frame_info->BitDepthLuma = 8; - frame_info->BitDepthChroma = 8; - break; case GST_VIDEO_FORMAT_YUY2: - frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV422; - frame_info->FourCC = MFX_FOURCC_YUY2; - frame_info->BitDepthLuma = 8; - frame_info->BitDepthChroma = 8; - break; case GST_VIDEO_FORMAT_BGRA: - frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; - frame_info->FourCC = MFX_FOURCC_RGB4; + gst_qsv_frame_info_set_format (frame_info, format); break; default: GST_ERROR_OBJECT (self, "Unexpected format %s", diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvutils.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvutils.cpp index 75a9848f41..4747069823 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvutils.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvutils.cpp @@ -198,3 +198,135 @@ gst_qsv_status_to_string (mfxStatus status) return "Unknown"; } + +GstVideoFormat +gst_qsv_frame_info_format_to_gst (const mfxFrameInfo * info) +{ + GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; + + switch (info->FourCC) { + case MFX_FOURCC_NV12: + format = GST_VIDEO_FORMAT_NV12; + break; + case MFX_FOURCC_P010: + format = GST_VIDEO_FORMAT_P010_10LE; + break; + case MFX_FOURCC_P016: + if (info->BitDepthLuma == 12) + format = GST_VIDEO_FORMAT_P012_LE; + else + format = GST_VIDEO_FORMAT_P016_LE; + break; + case MFX_FOURCC_YUY2: + format = GST_VIDEO_FORMAT_YUY2; + break; + case MFX_FOURCC_Y210: + format = GST_VIDEO_FORMAT_Y210; + break; + case MFX_FOURCC_Y216: + format = GST_VIDEO_FORMAT_Y212_LE; + break; + break; + case MFX_FOURCC_AYUV: + format = GST_VIDEO_FORMAT_VUYA; + break; + case MFX_FOURCC_Y410: + format = GST_VIDEO_FORMAT_Y410; + break; + case MFX_FOURCC_Y416: + format = GST_VIDEO_FORMAT_Y412_LE; + break; + case MFX_FOURCC_RGB4: + format = GST_VIDEO_FORMAT_BGRA; + break; + default: + break; + } + + return format; +} + +gboolean +gst_qsv_frame_info_set_format (mfxFrameInfo * info, GstVideoFormat format) +{ + switch (format) { + case GST_VIDEO_FORMAT_NV12: + info->FourCC = MFX_FOURCC_NV12; + info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + info->BitDepthLuma = 8; + info->BitDepthChroma = 8; + info->Shift = 0; + break; + case GST_VIDEO_FORMAT_P010_10LE: + info->FourCC = MFX_FOURCC_P010; + info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + info->BitDepthLuma = 10; + info->BitDepthChroma = 10; + info->Shift = 1; + break; + case GST_VIDEO_FORMAT_P012_LE: + info->FourCC = MFX_FOURCC_P016; + info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + info->BitDepthLuma = 12; + info->BitDepthChroma = 12; + info->Shift = 1; + break; + case GST_VIDEO_FORMAT_P016_LE: + info->FourCC = MFX_FOURCC_P016; + info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + info->BitDepthLuma = 16; + info->BitDepthChroma = 16; + info->Shift = 0; + break; + case GST_VIDEO_FORMAT_YUY2: + info->FourCC = MFX_FOURCC_YUY2; + info->ChromaFormat = MFX_CHROMAFORMAT_YUV422; + info->BitDepthLuma = 8; + info->BitDepthChroma = 8; + info->Shift = 0; + break; + case GST_VIDEO_FORMAT_Y210: + info->FourCC = MFX_FOURCC_Y210; + info->ChromaFormat = MFX_CHROMAFORMAT_YUV422; + info->BitDepthLuma = 10; + info->BitDepthChroma = 10; + info->Shift = 1; + break; + case GST_VIDEO_FORMAT_Y212_LE: + info->FourCC = MFX_FOURCC_Y216; + info->ChromaFormat = MFX_CHROMAFORMAT_YUV422; + info->BitDepthLuma = 12; + info->BitDepthChroma = 12; + info->Shift = 1; + break; + case GST_VIDEO_FORMAT_VUYA: + info->FourCC = MFX_FOURCC_AYUV; + info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; + info->BitDepthLuma = 8; + info->BitDepthChroma = 8; + info->Shift = 0; + break; + case GST_VIDEO_FORMAT_Y410: + info->FourCC = MFX_FOURCC_Y410; + info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; + info->BitDepthLuma = 10; + info->BitDepthChroma = 10; + info->Shift = 0; + break; + case GST_VIDEO_FORMAT_Y412_LE: + info->FourCC = MFX_FOURCC_Y416; + info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; + info->BitDepthLuma = 12; + info->BitDepthChroma = 12; + info->Shift = 1; + break; + case GST_VIDEO_FORMAT_BGRA: + info->FourCC = MFX_FOURCC_RGB4; + info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; + break; + default: + return FALSE; + } + + return TRUE; +} diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvutils.h b/subprojects/gst-plugins-bad/sys/qsv/gstqsvutils.h index 2c8ceaeddb..b8d4aa0cdc 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvutils.h +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvutils.h @@ -20,6 +20,7 @@ #pragma once #include +#include #include G_BEGIN_DECLS @@ -75,6 +76,11 @@ static const GstQsvResolution gst_qsv_resolutions[] = { {7680, 4320}, {8192, 4320}, {15360, 8640}, {16384, 8640} }; +GstVideoFormat gst_qsv_frame_info_format_to_gst (const mfxFrameInfo * info); + +gboolean gst_qsv_frame_info_set_format (mfxFrameInfo * info, + GstVideoFormat format); + G_END_DECLS #ifdef __cplusplus diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvvp9dec.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvvp9dec.cpp index eb010ef84a..c4cf67c855 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvvp9dec.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvvp9dec.cpp @@ -54,7 +54,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_qsv_vp9_dec_debug); "alignment = (string) frame, profile = (string) { 0, 2 }" #define DOC_SRC_CAPS_COMM \ - "format = (string) { NV12, P010_10LE, P016_LE}, " \ + "format = (string) { NV12, P010_10LE, P012_LE}, " \ "width = (int) [ 1, 16384 ], height = (int) [ 1, 16384 ]" #define DOC_SRC_CAPS \ @@ -159,11 +159,8 @@ gst_qsv_vp9_dec_register (GstPlugin * plugin, guint rank, guint impl_index, mfx->FrameInfo.FrameRateExtD = 1; mfx->FrameInfo.AspectRatioW = 1; mfx->FrameInfo.AspectRatioH = 1; - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_NV12); mfx->CodecProfile = MFX_PROFILE_VP9_0; /* Check max-resolution */ @@ -189,22 +186,16 @@ gst_qsv_vp9_dec_register (GstPlugin * plugin, guint rank, guint impl_index, supported_formats.push_back ("NV12"); /* Check other profile/formats */ - mfx->FrameInfo.FourCC = MFX_FOURCC_P010; - mfx->FrameInfo.BitDepthLuma = 10; - mfx->FrameInfo.BitDepthChroma = 10; - mfx->FrameInfo.Shift = 1; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_P010_10LE); mfx->CodecProfile = MFX_PROFILE_VP9_2; if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { have_profile_2 = TRUE; supported_formats.push_back ("P010_10LE"); - mfx->FrameInfo.FourCC = MFX_FOURCC_P016; - mfx->FrameInfo.BitDepthLuma = 12; - mfx->FrameInfo.BitDepthChroma = 12; - + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_P012_LE); if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { have_profile_2_12bits = TRUE; - supported_formats.push_back ("P016_LE"); + supported_formats.push_back ("P012_LE"); } } diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvvp9enc.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvvp9enc.cpp index aaae359934..7e2d3d07a9 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvvp9enc.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvvp9enc.cpp @@ -647,6 +647,7 @@ gst_qsv_vp9_enc_set_format (GstQsvEncoder * encoder, GstVideoInfo *info = &state->info; mfxExtVP9Param *vp9_param; mfxFrameInfo *frame_info; + GstVideoFormat format; frame_info = ¶m->mfx.FrameInfo; @@ -669,45 +670,28 @@ gst_qsv_vp9_enc_set_format (GstQsvEncoder * encoder, frame_info->AspectRatioW = GST_VIDEO_INFO_PAR_N (info); frame_info->AspectRatioH = GST_VIDEO_INFO_PAR_D (info); - switch (GST_VIDEO_INFO_FORMAT (info)) { + format = GST_VIDEO_INFO_FORMAT (info); + switch (format) { case GST_VIDEO_FORMAT_NV12: mfx_profile = MFX_PROFILE_VP9_0; - frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; - frame_info->FourCC = MFX_FOURCC_NV12; - frame_info->BitDepthLuma = 8; - frame_info->BitDepthChroma = 8; - frame_info->Shift = 0; break; case GST_VIDEO_FORMAT_VUYA: mfx_profile = MFX_PROFILE_VP9_1; - frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; - frame_info->FourCC = MFX_FOURCC_AYUV; - frame_info->BitDepthLuma = 8; - frame_info->BitDepthChroma = 8; - frame_info->Shift = 0; break; case GST_VIDEO_FORMAT_P010_10LE: mfx_profile = MFX_PROFILE_VP9_2; - frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; - frame_info->FourCC = MFX_FOURCC_P010; - frame_info->BitDepthLuma = 10; - frame_info->BitDepthChroma = 10; - frame_info->Shift = 1; break; case GST_VIDEO_FORMAT_Y410: mfx_profile = MFX_PROFILE_VP9_3; - frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; - frame_info->FourCC = MFX_FOURCC_Y410; - frame_info->BitDepthLuma = 10; - frame_info->BitDepthChroma = 10; - frame_info->Shift = 0; break; default: GST_ERROR_OBJECT (self, "Unexpected format %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); + gst_video_format_to_string (format)); return FALSE; } + gst_qsv_frame_info_set_format (frame_info, format); + gst_qsv_vp9_enc_init_vp9_param (&self->vp9_param); vp9_param = &self->vp9_param; @@ -872,6 +856,8 @@ gst_qsv_vp9_enc_register (GstPlugin * plugin, guint rank, guint impl_index, param.ExtParam = ext_bufs; for (guint i = 0; i < G_N_ELEMENTS (profile_map); i++) { + GstVideoFormat format; + mfx->CodecProfile = profile_map[i].profile; gst_qsv_vp9_enc_init_vp9_param (&vp9_param); @@ -882,38 +868,24 @@ gst_qsv_vp9_enc_register (GstPlugin * plugin, guint rank, guint impl_index, switch (mfx->CodecProfile) { case MFX_PROFILE_VP9_0: - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; - mfx->FrameInfo.Shift = 0; + format = GST_VIDEO_FORMAT_NV12; break; case MFX_PROFILE_VP9_1: - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV444; - mfx->FrameInfo.FourCC = MFX_FOURCC_AYUV; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; - mfx->FrameInfo.Shift = 0; + format = GST_VIDEO_FORMAT_VUYA; break; case MFX_PROFILE_VP9_2: - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_P010; - mfx->FrameInfo.BitDepthLuma = 10; - mfx->FrameInfo.BitDepthChroma = 10; - mfx->FrameInfo.Shift = 1; + format = GST_VIDEO_FORMAT_P010_10LE; break; case MFX_PROFILE_VP9_3: - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV444; - mfx->FrameInfo.FourCC = MFX_FOURCC_Y410; - mfx->FrameInfo.BitDepthLuma = 10; - mfx->FrameInfo.BitDepthChroma = 10; - mfx->FrameInfo.Shift = 0; + format = GST_VIDEO_FORMAT_Y410; break; default: g_assert_not_reached (); return; } + gst_qsv_frame_info_set_format (&mfx->FrameInfo, format); + if (MFXVideoENCODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) continue; @@ -927,11 +899,7 @@ gst_qsv_vp9_enc_register (GstPlugin * plugin, guint rank, guint impl_index, } mfx->CodecProfile = MFX_PROFILE_VP9_0; - mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; - mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; - mfx->FrameInfo.BitDepthLuma = 8; - mfx->FrameInfo.BitDepthChroma = 8; - mfx->FrameInfo.Shift = 0; + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_NV12); /* Check max-resolution */ for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) {