mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-05 22:12:34 +00:00
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:
parent
801492b334
commit
0178cc188b
15 changed files with 214 additions and 241 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <gst/gst.h>
|
||||
#include <gst/video/video.h>
|
||||
#include <mfx.h>
|
||||
#include "gstqsvutils.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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++) {
|
||||
|
|
Loading…
Reference in a new issue