mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
va: Consider the compatibility when we get_profile() for H265 decoder.
Adding the compatile profiles when we decide the final profile used for decoding. The final profile candidates include: 1. The profile directly specified by SPS, which is the exact one. 2. The compatile profiles decided by the upstream element such as the h265parse. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2322>
This commit is contained in:
parent
8ba730a564
commit
b269cd5319
1 changed files with 32 additions and 1 deletions
|
@ -953,11 +953,19 @@ static const struct
|
||||||
static VAProfile
|
static VAProfile
|
||||||
_get_profile (GstVaH265Dec * self, const GstH265SPS * sps, gint max_dpb_size)
|
_get_profile (GstVaH265Dec * self, const GstH265SPS * sps, gint max_dpb_size)
|
||||||
{
|
{
|
||||||
|
GstH265Decoder *h265_decoder = GST_H265_DECODER (self);
|
||||||
GstVaBaseDec *base = GST_VA_BASE_DEC (self);
|
GstVaBaseDec *base = GST_VA_BASE_DEC (self);
|
||||||
GstH265Profile profile = gst_h265_get_profile_from_sps ((GstH265SPS *) sps);
|
GstH265Profile profile = gst_h265_get_profile_from_sps ((GstH265SPS *) sps);
|
||||||
VAProfile profiles[4];
|
VAProfile profiles[4];
|
||||||
gint i = 0, j;
|
gint i = 0, j;
|
||||||
|
|
||||||
|
/* 1. The profile directly specified by the SPS should always be the
|
||||||
|
first choice. It is the exact one.
|
||||||
|
2. The profile in the input caps may contain the compatible profile
|
||||||
|
chosen by the upstream element. Upstream element such as the parse
|
||||||
|
may already decide the best compatible profile for us. We also need
|
||||||
|
to consider it as a choice. */
|
||||||
|
|
||||||
for (j = 0; j < G_N_ELEMENTS (profile_map); j++) {
|
for (j = 0; j < G_N_ELEMENTS (profile_map); j++) {
|
||||||
if (profile_map[j].profile == profile) {
|
if (profile_map[j].profile == profile) {
|
||||||
profiles[i++] = profile_map[j].va_profile;
|
profiles[i++] = profile_map[j].va_profile;
|
||||||
|
@ -965,7 +973,30 @@ _get_profile (GstVaH265Dec * self, const GstH265SPS * sps, gint max_dpb_size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO Special cases here */
|
if (h265_decoder->input_state->caps
|
||||||
|
&& gst_caps_is_fixed (h265_decoder->input_state->caps)) {
|
||||||
|
GstH265Profile compatible_profile = GST_H265_PROFILE_INVALID;
|
||||||
|
GstStructure *structure;
|
||||||
|
const gchar *profile_str;
|
||||||
|
|
||||||
|
structure = gst_caps_get_structure (h265_decoder->input_state->caps, 0);
|
||||||
|
|
||||||
|
profile_str = gst_structure_get_string (structure, "profile");
|
||||||
|
if (profile_str)
|
||||||
|
compatible_profile = gst_h265_profile_from_string (profile_str);
|
||||||
|
|
||||||
|
if (compatible_profile != profile) {
|
||||||
|
GST_INFO_OBJECT (self, "The upstream set the compatible profile %s, "
|
||||||
|
"also consider it as a candidate.", profile_str);
|
||||||
|
|
||||||
|
for (j = 0; j < G_N_ELEMENTS (profile_map); j++) {
|
||||||
|
if (profile_map[j].profile == compatible_profile) {
|
||||||
|
profiles[i++] = profile_map[j].va_profile;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (j = 0; j < i && j < G_N_ELEMENTS (profiles); j++) {
|
for (j = 0; j < i && j < G_N_ELEMENTS (profiles); j++) {
|
||||||
if (gst_va_decoder_has_profile (base->decoder, profiles[j]))
|
if (gst_va_decoder_has_profile (base->decoder, profiles[j]))
|
||||||
|
|
Loading…
Reference in a new issue