From f05effe0246794f313c3ce01c3506ad48e882a68 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Fri, 13 Mar 2020 16:17:07 +0900 Subject: [PATCH] h264parse,h265parse: Update for video-hdr struct change See the change of -base https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/594 --- gst/videoparsers/gsth264parse.c | 96 +++++++++++++++++++--------------------- gst/videoparsers/gsth265parse.c | 86 +++++++++++++++++------------------ tests/check/elements/h264parse.c | 4 +- tests/check/elements/h265parse.c | 4 +- 4 files changed, 91 insertions(+), 99 deletions(-) diff --git a/gst/videoparsers/gsth264parse.c b/gst/videoparsers/gsth264parse.c index 242af15..885301a 100644 --- a/gst/videoparsers/gsth264parse.c +++ b/gst/videoparsers/gsth264parse.c @@ -784,48 +784,47 @@ gst_h264_parse_process_sei (GstH264Parse * h264parse, GstH264NalUnit * nalu) case GST_H264_SEI_MASTERING_DISPLAY_COLOUR_VOLUME: { /* Precision defined by spec. - * See D.3.28 Mastering display colour volume SEI message semantics */ - const guint chroma_den = 50000; - const guint luma_den = 10000; + * See D.2.29 Mastering display colour volume SEI message semantics */ GstVideoMasteringDisplayInfo minfo; + gint j, k; + + /* GstVideoMasteringDisplayInfo::display_primaries is rgb order but + * AVC uses gbr order. + * See spec D.2.29 display_primaries_x and display_primaries_y + */ + for (j = 0, k = 2; j < G_N_ELEMENTS (minfo.display_primaries); j++, k++) { + minfo.display_primaries[j].x = + sei.payload. + mastering_display_colour_volume.display_primaries_x[k % 3]; + minfo.display_primaries[j].y = + sei.payload. + mastering_display_colour_volume.display_primaries_y[k % 3]; + } - minfo.Gx_n = - sei.payload.mastering_display_colour_volume.display_primaries_x[0]; - minfo.Gy_n = - sei.payload.mastering_display_colour_volume.display_primaries_y[0]; - minfo.Bx_n = - sei.payload.mastering_display_colour_volume.display_primaries_x[1]; - minfo.By_n = - sei.payload.mastering_display_colour_volume.display_primaries_y[1]; - minfo.Rx_n = - sei.payload.mastering_display_colour_volume.display_primaries_x[2]; - minfo.Ry_n = - sei.payload.mastering_display_colour_volume.display_primaries_y[2]; - minfo.Wx_n = sei.payload.mastering_display_colour_volume.white_point_x; - minfo.Wy_n = sei.payload.mastering_display_colour_volume.white_point_y; - minfo.max_luma_n = - sei.payload. - mastering_display_colour_volume.max_display_mastering_luminance; - minfo.min_luma_n = - sei.payload. - mastering_display_colour_volume.min_display_mastering_luminance; - - minfo.Gx_d = minfo.Gy_d = minfo.Bx_d = minfo.By_d = - minfo.Rx_d = minfo.Ry_d = minfo.Wx_d = minfo.Wy_d = chroma_den; - - minfo.max_luma_d = minfo.min_luma_d = luma_den; + minfo.white_point.x = + sei.payload.mastering_display_colour_volume.white_point_x; + minfo.white_point.y = + sei.payload.mastering_display_colour_volume.white_point_y; + minfo.max_display_mastering_luminance = + sei.payload.mastering_display_colour_volume. + max_display_mastering_luminance; + minfo.min_display_mastering_luminance = + sei.payload.mastering_display_colour_volume. + min_display_mastering_luminance; GST_LOG_OBJECT (h264parse, "mastering display info found: " - "Red(%u/%u, %u/%u) " - "Green(%u/%u, %u/%u) " - "Blue(%u/%u, %u/%u) " - "White(%u/%u, %u/%u) " - "max_luminance(%u/%u) " - "min_luminance(%u/%u) ", minfo.Rx_n, minfo.Rx_d, minfo.Ry_n, - minfo.Ry_d, minfo.Gx_n, minfo.Gx_d, minfo.Gy_n, minfo.Gy_d, - minfo.Bx_n, minfo.Bx_d, minfo.By_n, minfo.By_d, minfo.Wx_n, - minfo.Wx_d, minfo.Wy_n, minfo.Wy_d, minfo.max_luma_n, - minfo.max_luma_d, minfo.min_luma_n, minfo.min_luma_d); + "Red(%u, %u) " + "Green(%u, %u) " + "Blue(%u, %u) " + "White(%u, %u) " + "max_luminance(%u) " + "min_luminance(%u) ", + minfo.display_primaries[0].x, minfo.display_primaries[0].y, + minfo.display_primaries[1].x, minfo.display_primaries[1].y, + minfo.display_primaries[2].x, minfo.display_primaries[2].y, + minfo.white_point.x, minfo.white_point.y, + minfo.max_display_mastering_luminance, + minfo.min_display_mastering_luminance); if (h264parse->mastering_display_info_state == GST_H264_PARSE_SEI_EXPIRED) { @@ -844,24 +843,21 @@ gst_h264_parse_process_sei (GstH264Parse * h264parse, GstH264NalUnit * nalu) { GstVideoContentLightLevel cll; - cll.maxCLL_n = sei.payload.content_light_level.max_content_light_level; - cll.maxFALL_n = + cll.max_content_light_level = + sei.payload.content_light_level.max_content_light_level; + cll.max_frame_average_light_level = sei.payload.content_light_level.max_pic_average_light_level; - cll.maxCLL_d = cll.maxFALL_d = 1; - GST_LOG_OBJECT (h264parse, "content light level found: " - "maxCLL:(%u/%u), maxFALL:(%u/%u)", cll.maxCLL_n, cll.maxCLL_d, - cll.maxFALL_n, cll.maxFALL_d); + "maxCLL:(%u), maxFALL:(%u)", cll.max_content_light_level, + cll.max_frame_average_light_level); if (h264parse->content_light_level_state == GST_H264_PARSE_SEI_EXPIRED) { h264parse->update_caps = TRUE; - } else if (gst_util_fraction_compare (cll.maxCLL_n, cll.maxCLL_d, - h264parse->content_light_level.maxCLL_n, - h264parse->content_light_level.maxCLL_d) - || gst_util_fraction_compare (cll.maxFALL_n, cll.maxFALL_d, - h264parse->content_light_level.maxFALL_n, - h264parse->content_light_level.maxFALL_d)) { + } else if (cll.max_content_light_level != + h264parse->content_light_level.max_frame_average_light_level || + cll.max_content_light_level != + h264parse->content_light_level.max_frame_average_light_level) { h264parse->update_caps = TRUE; } diff --git a/gst/videoparsers/gsth265parse.c b/gst/videoparsers/gsth265parse.c index 54549a5..3aa7364 100644 --- a/gst/videoparsers/gsth265parse.c +++ b/gst/videoparsers/gsth265parse.c @@ -584,47 +584,46 @@ gst_h265_parse_process_sei (GstH265Parse * h265parse, GstH265NalUnit * nalu) { /* Precision defined by spec. * See D.3.28 Mastering display colour volume SEI message semantics */ - const guint chroma_den = 50000; - const guint luma_den = 10000; GstVideoMasteringDisplayInfo minfo; + gint j, k; + + /* GstVideoMasteringDisplayInfo::display_primaries is rgb order but + * HEVC uses gbr order + * See spec D.3.28 display_primaries_x and display_primaries_y + */ + for (j = 0, k = 2; j < G_N_ELEMENTS (minfo.display_primaries); j++, k++) { + minfo.display_primaries[j].x = + sei.payload. + mastering_display_colour_volume.display_primaries_x[k % 3]; + minfo.display_primaries[j].y = + sei.payload. + mastering_display_colour_volume.display_primaries_y[k % 3]; + } - minfo.Gx_n = - sei.payload.mastering_display_colour_volume.display_primaries_x[0]; - minfo.Gy_n = - sei.payload.mastering_display_colour_volume.display_primaries_y[0]; - minfo.Bx_n = - sei.payload.mastering_display_colour_volume.display_primaries_x[1]; - minfo.By_n = - sei.payload.mastering_display_colour_volume.display_primaries_y[1]; - minfo.Rx_n = - sei.payload.mastering_display_colour_volume.display_primaries_x[2]; - minfo.Ry_n = - sei.payload.mastering_display_colour_volume.display_primaries_y[2]; - minfo.Wx_n = sei.payload.mastering_display_colour_volume.white_point_x; - minfo.Wy_n = sei.payload.mastering_display_colour_volume.white_point_y; - minfo.max_luma_n = + minfo.white_point.x = + sei.payload.mastering_display_colour_volume.white_point_x; + minfo.white_point.y = + sei.payload.mastering_display_colour_volume.white_point_y; + minfo.max_display_mastering_luminance = sei.payload.mastering_display_colour_volume. max_display_mastering_luminance; - minfo.min_luma_n = + minfo.min_display_mastering_luminance = sei.payload.mastering_display_colour_volume. min_display_mastering_luminance; - minfo.Gx_d = minfo.Gy_d = minfo.Bx_d = minfo.By_d = - minfo.Rx_d = minfo.Ry_d = minfo.Wx_d = minfo.Wy_d = chroma_den; - - minfo.max_luma_d = minfo.min_luma_d = luma_den; - GST_LOG_OBJECT (h265parse, "mastering display info found: " - "Red(%u/%u, %u/%u) " - "Green(%u/%u, %u/%u) " - "Blue(%u/%u, %u/%u) " - "White(%u/%u, %u/%u) " - "max_luminance(%u/%u) " - "min_luminance(%u/%u) ", minfo.Rx_n, minfo.Rx_d, minfo.Ry_n, - minfo.Ry_d, minfo.Gx_n, minfo.Gx_d, minfo.Gy_n, minfo.Gy_d, - minfo.Bx_n, minfo.Bx_d, minfo.By_n, minfo.By_d, minfo.Wx_n, - minfo.Wx_d, minfo.Wy_n, minfo.Wy_d, minfo.max_luma_n, - minfo.max_luma_d, minfo.min_luma_n, minfo.min_luma_d); + "Red(%u, %u) " + "Green(%u, %u) " + "Blue(%u, %u) " + "White(%u, %u) " + "max_luminance(%u) " + "min_luminance(%u) ", + minfo.display_primaries[0].x, minfo.display_primaries[0].y, + minfo.display_primaries[1].x, minfo.display_primaries[1].y, + minfo.display_primaries[2].x, minfo.display_primaries[2].y, + minfo.white_point.x, minfo.white_point.y, + minfo.max_display_mastering_luminance, + minfo.min_display_mastering_luminance); if (h265parse->mastering_display_info_state == GST_H265_PARSE_SEI_EXPIRED) { @@ -643,24 +642,21 @@ gst_h265_parse_process_sei (GstH265Parse * h265parse, GstH265NalUnit * nalu) { GstVideoContentLightLevel cll; - cll.maxCLL_n = sei.payload.content_light_level.max_content_light_level; - cll.maxFALL_n = + cll.max_content_light_level = + sei.payload.content_light_level.max_content_light_level; + cll.max_frame_average_light_level = sei.payload.content_light_level.max_pic_average_light_level; - cll.maxCLL_d = cll.maxFALL_d = 1; - GST_LOG_OBJECT (h265parse, "content light level found: " - "maxCLL:(%u/%u), maxFALL:(%u/%u)", cll.maxCLL_n, cll.maxCLL_d, - cll.maxFALL_n, cll.maxFALL_d); + "maxCLL:(%u), maxFALL:(%u)", cll.max_content_light_level, + cll.max_frame_average_light_level); if (h265parse->content_light_level_state == GST_H265_PARSE_SEI_EXPIRED) { h265parse->update_caps = TRUE; - } else if (gst_util_fraction_compare (cll.maxCLL_n, cll.maxCLL_d, - h265parse->content_light_level.maxCLL_n, - h265parse->content_light_level.maxCLL_d) - || gst_util_fraction_compare (cll.maxFALL_n, cll.maxFALL_d, - h265parse->content_light_level.maxFALL_n, - h265parse->content_light_level.maxFALL_d)) { + } else if (cll.max_content_light_level != + h265parse->content_light_level.max_frame_average_light_level || + cll.max_content_light_level != + h265parse->content_light_level.max_frame_average_light_level) { h265parse->update_caps = TRUE; } diff --git a/tests/check/elements/h264parse.c b/tests/check/elements/h264parse.c index 90d8b4e..ac41d9a 100644 --- a/tests/check/elements/h264parse.c +++ b/tests/check/elements/h264parse.c @@ -484,9 +484,9 @@ GST_START_TEST (test_parse_detect_stream_with_hdr_sei) fail_unless_structure_field_string_equals (s, "level", "2.1"); fail_unless_structure_field_string_equals (s, "mastering-display-info", - "3:20:3:50:17:25:8:25:33:125:69:100:3127:10000:329:1000:1000:1:1:10000"); + "7500:3000:34000:16000:13200:34500:15635:16450:10000000:1"); fail_unless_structure_field_string_equals (s, "content-light-level", - "1000:1:400:1"); + "1000:400"); if (ctx_codec_data) { fail_unless (gst_structure_has_field (s, "codec_data")); diff --git a/tests/check/elements/h265parse.c b/tests/check/elements/h265parse.c index 5a84430..7dad7ef 100644 --- a/tests/check/elements/h265parse.c +++ b/tests/check/elements/h265parse.c @@ -238,9 +238,9 @@ GST_START_TEST (test_parse_detect_stream_with_hdr_sei) fail_unless_structure_field_string_equals (s, "tier", "main"); fail_unless_structure_field_string_equals (s, "level", "2.1"); fail_unless_structure_field_string_equals (s, "mastering-display-info", - "17:25:8:25:53:200:69:100:3:20:3:50:3127:10000:329:1000:1000:1:1:10000"); + "34000:16000:13250:34500:7500:3000:15635:16450:10000000:1"); fail_unless_structure_field_string_equals (s, "content-light-level", - "1000:1:400:1"); + "1000:400"); g_free (h265_idr_plus_sei); gst_caps_unref (caps); -- 2.7.4