guint impl_index;
gint64 adapter_luid;
gchar *display_path;
+ gboolean hdr10_aware;
} GstQsvH265EncClassData;
typedef struct _GstQsvH265Enc
mfxExtCodingOption option;
mfxExtCodingOption2 option2;
mfxExtCodingOption3 option3;
+ mfxExtContentLightLevelInfo cll;
+ mfxExtMasteringDisplayColourVolume mdcv;
mfxU16 profile;
typedef struct _GstQsvH265EncClass
{
GstQsvEncoderClass parent_class;
+
+ gboolean hdr10_aware;
} GstQsvH265EncClass;
static GstElementClass *parent_class = nullptr;
qsvenc_class->check_reconfigure =
GST_DEBUG_FUNCPTR (gst_qsv_h265_enc_check_reconfigure);
+ klass->hdr10_aware = cdata->hdr10_aware;
+
gst_caps_unref (cdata->sink_caps);
gst_caps_unref (cdata->src_caps);
g_free (cdata);
memset (&self->option, 0, sizeof (mfxExtCodingOption));
memset (&self->option2, 0, sizeof (mfxExtCodingOption2));
memset (&self->option3, 0, sizeof (mfxExtCodingOption3));
+ memset (&self->cll, 0, sizeof (mfxExtContentLightLevelInfo));
+ memset (&self->mdcv, 0, sizeof (mfxExtMasteringDisplayColourVolume));
self->signal_info.Header.BufferId = MFX_EXTBUFF_VIDEO_SIGNAL_INFO;
self->signal_info.Header.BufferSz = sizeof (mfxExtVideoSignalInfo);
self->option3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3;
self->option3.Header.BufferSz = sizeof (mfxExtCodingOption3);
+
+ self->cll.Header.BufferId = MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO;
+ self->cll.Header.BufferSz = sizeof (mfxExtContentLightLevelInfo);
+ self->cll.InsertPayloadToggle = MFX_PAYLOAD_IDR;
+
+ self->mdcv.Header.BufferId = MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME;
+ self->mdcv.Header.BufferSz = sizeof (mfxExtMasteringDisplayColourVolume);
+ self->mdcv.InsertPayloadToggle = MFX_PAYLOAD_IDR;
}
static void
GstVideoCodecState * state, mfxVideoParam * param, GPtrArray * extra_params)
{
GstQsvH265Enc *self = GST_QSV_H265_ENC (encoder);
+ GstQsvH265EncClass *klass = GST_QSV_H265_ENC_GET_CLASS (self);
mfxU16 mfx_profile = MFX_PROFILE_UNKNOWN;
GstVideoInfo *info = &state->info;
mfxExtVideoSignalInfo *signal_info = nullptr;
mfxExtCodingOption *option;
mfxExtCodingOption2 *option2;
mfxExtCodingOption3 *option3;
+ mfxExtContentLightLevelInfo *cll;
+ mfxExtMasteringDisplayColourVolume *mdcv;
+ gboolean have_cll = FALSE;
+ gboolean have_mdcv = FALSE;
+
mfxFrameInfo *frame_info;
frame_info = ¶m->mfx.FrameInfo;
option = &self->option;
option2 = &self->option2;
option3 = &self->option3;
+ cll = &self->cll;
+ mdcv = &self->mdcv;
+
+ if (klass->hdr10_aware) {
+ GstVideoMasteringDisplayInfo mdcv_info;
+ GstVideoContentLightLevel cll_info;
+
+ if (gst_video_content_light_level_from_caps (&cll_info, state->caps)) {
+ cll->MaxContentLightLevel = cll_info.max_content_light_level;
+ cll->MaxPicAverageLightLevel = cll_info.max_frame_average_light_level;
+ have_cll = TRUE;
+ }
+
+ if (gst_video_mastering_display_info_from_caps (&mdcv_info, state->caps)) {
+ /* GBR order is used in HEVC */
+ mdcv->DisplayPrimariesX[0] = mdcv_info.display_primaries[1].x;
+ mdcv->DisplayPrimariesY[0] = mdcv_info.display_primaries[1].y;
+ mdcv->DisplayPrimariesX[1] = mdcv_info.display_primaries[2].x;
+ mdcv->DisplayPrimariesY[1] = mdcv_info.display_primaries[2].y;
+ mdcv->DisplayPrimariesX[2] = mdcv_info.display_primaries[0].x;
+ mdcv->DisplayPrimariesY[2] = mdcv_info.display_primaries[0].y;
+
+ mdcv->WhitePointX = mdcv_info.white_point.x;
+ mdcv->WhitePointY = mdcv_info.white_point.y;
+ mdcv->MaxDisplayMasteringLuminance =
+ mdcv_info.max_display_mastering_luminance;
+ mdcv->MinDisplayMasteringLuminance =
+ mdcv_info.min_display_mastering_luminance;
+ have_mdcv = TRUE;
+ }
+ }
g_mutex_lock (&self->prop_lock);
param->mfx.CodecId = MFX_CODEC_HEVC;
g_ptr_array_add (extra_params, option);
g_ptr_array_add (extra_params, option2);
g_ptr_array_add (extra_params, option3);
+ if (have_cll)
+ g_ptr_array_add (extra_params, cll);
+ if (have_mdcv)
+ g_ptr_array_add (extra_params, mdcv);
param->ExtParam = (mfxExtBuffer **) extra_params->pdata;
param->NumExtParam = extra_params->len;
std::vector < mfxU16 > supported_profiles;
std::vector < std::string > supported_formats;
Resolution max_resolution;
+ mfxExtContentLightLevelInfo cll;
+ mfxExtMasteringDisplayColourVolume mdcv;
+ mfxExtBuffer *ext_buffers[2];
+ gboolean hdr10_aware = FALSE;
memset (¶m, 0, sizeof (mfxVideoParam));
memset (&max_resolution, 0, sizeof (Resolution));
+ memset (&cll, 0, sizeof (mfxExtContentLightLevelInfo));
+ memset (&mdcv, 0, sizeof (mfxExtMasteringDisplayColourVolume));
param.AsyncDepth = 4;
param.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY;
mfx->FrameInfo.Shift = 0;
mfx->CodecProfile = MFX_PROFILE_HEVC_MAIN;
+ /* check hdr10 metadata SEI support */
+ cll.Header.BufferId = MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO;
+ cll.Header.BufferSz = sizeof (mfxExtContentLightLevelInfo);
+ cll.InsertPayloadToggle = MFX_PAYLOAD_IDR;
+ cll.MaxContentLightLevel = 1;
+ cll.MaxPicAverageLightLevel = 1;
+
+ mdcv.Header.BufferId = MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME;
+ mdcv.Header.BufferSz = sizeof (mfxExtMasteringDisplayColourVolume);
+ mdcv.InsertPayloadToggle = MFX_PAYLOAD_IDR;
+ mdcv.MaxDisplayMasteringLuminance = 1;
+ mdcv.MinDisplayMasteringLuminance = 1;
+
+ ext_buffers[0] = (mfxExtBuffer *) & cll;
+ ext_buffers[1] = (mfxExtBuffer *) & mdcv;
+
+ param.NumExtParam = 2;
+ param.ExtParam = ext_buffers;
+ if (MFXVideoENCODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) {
+ GST_INFO ("HDR10 metadata SEI is supported");
+ hdr10_aware = TRUE;
+ }
+
+ param.NumExtParam = 0;
+ param.ExtParam = nullptr;
+
/* Check max-resolution */
for (guint i = 0; i < G_N_ELEMENTS (resolutions_to_check); i++) {
mfx->FrameInfo.Width = GST_ROUND_UP_16 (resolutions_to_check[i].width);
cdata->sink_caps = sink_caps;
cdata->src_caps = src_caps;
cdata->impl_index = impl_index;
+ cdata->hdr10_aware = hdr10_aware;
#ifdef G_OS_WIN32
gint64 device_luid;