mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-29 18:48:44 +00:00
x265enc: Add support mastering display info and content light level encoding
... if (x265 version >= 1.9) requirement is satisfied. The SEI messages were supported since x265 version 1.8 but there was API change from version 1.9 (contentLightLevelInfo was renamed to maxCLL and maxFALL)
This commit is contained in:
parent
dd7839ca43
commit
538ae98ed2
1 changed files with 74 additions and 0 deletions
|
@ -689,6 +689,80 @@ gst_x265_enc_init_encoder (GstX265Enc * encoder)
|
|||
if (encoder->keyintmax > 0) {
|
||||
encoder->x265param.keyframeMax = encoder->keyintmax;
|
||||
}
|
||||
#if (X265_BUILD >= 79)
|
||||
{
|
||||
GstVideoMasteringDisplayInfo minfo;
|
||||
GstVideoContentLightLevel cll;
|
||||
|
||||
if (gst_video_mastering_display_info_from_caps (&minfo,
|
||||
encoder->input_state->caps)) {
|
||||
guint16 displayPrimaryX[3];
|
||||
guint16 displayPrimaryY[3];
|
||||
guint16 whitePointX, whitePointY;
|
||||
guint32 maxDisplayMasteringLuminance;
|
||||
guint32 minDisplayMasteringLuminance;
|
||||
const guint chroma_scale = 50000;
|
||||
const guint luma_scale = 10000;
|
||||
|
||||
GST_DEBUG_OBJECT (encoder, "Apply mastering display info");
|
||||
|
||||
displayPrimaryX[0] =
|
||||
(guint16) gst_util_uint64_scale_round (minfo.Gx_n, chroma_scale,
|
||||
minfo.Gx_d);
|
||||
displayPrimaryX[1] =
|
||||
(guint16) gst_util_uint64_scale_round (minfo.Bx_n, chroma_scale,
|
||||
minfo.Bx_d);
|
||||
displayPrimaryX[2] =
|
||||
(guint16) gst_util_uint64_scale_round (minfo.Rx_n, chroma_scale,
|
||||
minfo.Rx_d);
|
||||
|
||||
displayPrimaryY[0] =
|
||||
(guint16) gst_util_uint64_scale_round (minfo.Gy_n, chroma_scale,
|
||||
minfo.Gy_d);
|
||||
displayPrimaryY[1] =
|
||||
(guint16) gst_util_uint64_scale_round (minfo.By_n, chroma_scale,
|
||||
minfo.By_d);
|
||||
displayPrimaryY[2] =
|
||||
(guint16) gst_util_uint64_scale_round (minfo.Ry_n, chroma_scale,
|
||||
minfo.Ry_d);
|
||||
|
||||
whitePointX =
|
||||
(guint16) gst_util_uint64_scale_round (minfo.Wx_n, chroma_scale,
|
||||
minfo.Wx_d);
|
||||
whitePointY =
|
||||
(guint16) gst_util_uint64_scale_round (minfo.Wy_n, chroma_scale,
|
||||
minfo.Wy_d);
|
||||
|
||||
maxDisplayMasteringLuminance =
|
||||
(guint32) gst_util_uint64_scale_round (minfo.max_luma_n, luma_scale,
|
||||
minfo.max_luma_d);
|
||||
minDisplayMasteringLuminance =
|
||||
(guint32) gst_util_uint64_scale_round (minfo.min_luma_n, luma_scale,
|
||||
minfo.min_luma_d);
|
||||
|
||||
encoder->x265param.masteringDisplayColorVolume =
|
||||
g_strdup_printf ("G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u)",
|
||||
displayPrimaryX[0], displayPrimaryY[0],
|
||||
displayPrimaryX[1], displayPrimaryY[1],
|
||||
displayPrimaryX[2], displayPrimaryY[2],
|
||||
whitePointX, whitePointY,
|
||||
maxDisplayMasteringLuminance, minDisplayMasteringLuminance);
|
||||
}
|
||||
|
||||
if (gst_video_content_light_level_from_caps (&cll,
|
||||
encoder->input_state->caps)) {
|
||||
gdouble val;
|
||||
|
||||
GST_DEBUG_OBJECT (encoder, "Apply content light level");
|
||||
|
||||
gst_util_fraction_to_double (cll.maxCLL_n, cll.maxCLL_d, &val);
|
||||
encoder->x265param.maxCLL = (guint16) val;
|
||||
|
||||
gst_util_fraction_to_double (cll.maxFALL_n, cll.maxFALL_d, &val);
|
||||
encoder->x265param.maxFALL = (guint16) val;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* apply option-string property */
|
||||
if (encoder->option_string_prop && encoder->option_string_prop->len) {
|
||||
|
|
Loading…
Reference in a new issue