From 3040a2607308fe8d931a23d2c2a0ef7094c0df12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Wed, 15 Dec 2021 11:58:07 +0100 Subject: [PATCH] codecparsers: h265parser: Use a table map to get profile. Instead of a sequence of if statements, declare a table to map profile idc with profiles and traverse it. Also, first add the profile from the parsed profile idc and later add, into the profile array, the profile from the compatibility flags. Part-of: --- .../gst-libs/gst/codecparsers/gsth265parser.c | 105 +++++++++--------- 1 file changed, 55 insertions(+), 50 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265parser.c b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265parser.c index dcd7c39d38..4b3676f153 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265parser.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265parser.c @@ -3645,63 +3645,68 @@ append_profile (GstH265Profile profiles[GST_H265_PROFILE_MAX], guint * idx, profiles[*idx++] = profile; } +/* *INDENT-OFF* */ +struct h265_profiles_map +{ + GstH265ProfileIDC profile_idc; + GstH265Profile (*get_profile) (const GstH265ProfileTierLevel *); + GstH265Profile profile; +}; +/* *INDENT-ON* */ + +static const struct h265_profiles_map profiles_map[] = { + /* keep profile check in asc order */ + {GST_H265_PROFILE_IDC_MAIN, NULL, GST_H265_PROFILE_MAIN}, + {GST_H265_PROFILE_IDC_MAIN_10, NULL, GST_H265_PROFILE_MAIN_10}, + {GST_H265_PROFILE_IDC_MAIN_STILL_PICTURE, NULL, + GST_H265_PROFILE_MAIN_STILL_PICTURE}, + {GST_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSION, + get_format_range_extension_profile, GST_H265_PROFILE_INVALID}, + {GST_H265_PROFILE_IDC_HIGH_THROUGHPUT, get_high_throughput_profile, + GST_H265_PROFILE_INVALID}, + {GST_H265_PROFILE_IDC_MULTIVIEW_MAIN, get_multiview_profile, + GST_H265_PROFILE_INVALID}, + {GST_H265_PROFILE_IDC_SCALABLE_MAIN, get_scalable_profile, + GST_H265_PROFILE_INVALID}, + {GST_H265_PROFILE_IDC_3D_MAIN, get_3d_profile, GST_H265_PROFILE_INVALID}, + {GST_H265_PROFILE_IDC_SCREEN_CONTENT_CODING, + get_screen_content_coding_extensions_profile, + GST_H265_PROFILE_INVALID}, + {GST_H265_PROFILE_IDC_SCALABLE_FORMAT_RANGE_EXTENSION, + get_scalable_format_range_extensions_profile, + GST_H265_PROFILE_INVALID}, + {GST_H265_PROFILE_IDC_HIGH_THROUGHPUT_SCREEN_CONTENT_CODING_EXTENSION, + get_screen_content_coding_extensions_high_throughput_profile, + GST_H265_PROFILE_INVALID}, +}; + static void gst_h265_profile_tier_level_get_profiles (const GstH265ProfileTierLevel * ptl, GstH265Profile profiles[GST_H265_PROFILE_MAX], guint * len) { - guint i = 0; + guint i = 0, j; - /* keep profile check in asc order */ - - if (ptl->profile_idc == GST_H265_PROFILE_IDC_MAIN - || ptl->profile_compatibility_flag[1]) - profiles[i++] = GST_H265_PROFILE_MAIN; - - if (ptl->profile_idc == GST_H265_PROFILE_IDC_MAIN_10 - || ptl->profile_compatibility_flag[2]) - profiles[i++] = GST_H265_PROFILE_MAIN_10; - - if (ptl->profile_idc == GST_H265_PROFILE_IDC_MAIN_STILL_PICTURE - || ptl->profile_compatibility_flag[3]) - profiles[i++] = GST_H265_PROFILE_MAIN_STILL_PICTURE; - - if (ptl->profile_idc == GST_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSION - || ptl->profile_compatibility_flag[4]) - append_profile (profiles, &i, get_format_range_extension_profile (ptl)); - - if (ptl->profile_idc == GST_H265_PROFILE_IDC_HIGH_THROUGHPUT - || ptl->profile_compatibility_flag[5]) - append_profile (profiles, &i, get_high_throughput_profile (ptl)); - - if (ptl->profile_idc == GST_H265_PROFILE_IDC_MULTIVIEW_MAIN - || ptl->profile_compatibility_flag[6]) - append_profile (profiles, &i, get_multiview_profile (ptl)); - - if (ptl->profile_idc == GST_H265_PROFILE_IDC_SCALABLE_MAIN - || ptl->profile_compatibility_flag[7]) - append_profile (profiles, &i, get_scalable_profile (ptl)); - - if (ptl->profile_idc == GST_H265_PROFILE_IDC_3D_MAIN - || ptl->profile_compatibility_flag[8]) - append_profile (profiles, &i, get_3d_profile (ptl)); - - if (ptl->profile_idc == GST_H265_PROFILE_IDC_SCREEN_CONTENT_CODING - || ptl->profile_compatibility_flag[9]) { - append_profile (profiles, &i, - get_screen_content_coding_extensions_profile (ptl)); + /* First add profile idc */ + for (j = 0; j < G_N_ELEMENTS (profiles_map); j++) { + if (ptl->profile_idc == profiles_map[j].profile_idc) { + if (profiles_map[j].get_profile) + append_profile (profiles, &i, profiles_map[j].get_profile (ptl)); + else + profiles[i++] = profiles_map[j].profile; + break; + } } - if (ptl->profile_idc == GST_H265_PROFILE_IDC_SCALABLE_FORMAT_RANGE_EXTENSION - || ptl->profile_compatibility_flag[10]) { - append_profile (profiles, &i, - get_scalable_format_range_extensions_profile (ptl)); - } - - if (ptl->profile_idc == - GST_H265_PROFILE_IDC_HIGH_THROUGHPUT_SCREEN_CONTENT_CODING_EXTENSION - || ptl->profile_compatibility_flag[11]) { - append_profile (profiles, &i, - get_screen_content_coding_extensions_high_throughput_profile (ptl)); + /* Later add compatibility flags */ + for (j = 0; j < G_N_ELEMENTS (profiles_map); j++) { + if (i > 0 && ptl->profile_idc == profiles_map[j].profile_idc) + continue; + if (ptl->profile_compatibility_flag[profiles_map[j].profile_idc]) { + if (profiles_map[j].get_profile) + append_profile (profiles, &i, profiles_map[j].get_profile (ptl)); + else + profiles[i++] = profiles_map[j].profile; + } } *len = i;