qsv: Add util methods for video format mapping

Remove duplicated format mapping code

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5706>
This commit is contained in:
Seungha Yang 2023-11-21 20:56:36 +09:00
parent 801492b334
commit 0178cc188b
15 changed files with 214 additions and 241 deletions

View file

@ -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;
}

View file

@ -22,6 +22,7 @@
#include <gst/gst.h>
#include <gst/video/video.h>
#include <mfx.h>
#include "gstqsvutils.h"
G_BEGIN_DECLS

View file

@ -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);

View file

@ -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 = &param->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, &param, &param) == 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, &param, &param) == 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++) {

View file

@ -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) {

View file

@ -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++) {

View file

@ -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 = &param->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++) {

View file

@ -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);

View file

@ -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, &param, &param) != 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 */

View file

@ -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, &param, &param) == 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, &param, &param) == MFX_ERR_NONE)

View file

@ -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 = &param->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",

View file

@ -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;
}

View file

@ -20,6 +20,7 @@
#pragma once
#include <gst/gst.h>
#include <gst/video/video.h>
#include <mfx.h>
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

View file

@ -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, &param, &param) == 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, &param, &param) == MFX_ERR_NONE) {
have_profile_2_12bits = TRUE;
supported_formats.push_back ("P016_LE");
supported_formats.push_back ("P012_LE");
}
}

View file

@ -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 = &param->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, &param, &param) != 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++) {