mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 09:40:37 +00:00
decoder: h264: fix decoding of BA3_SVA_C.264.
Conformance test Base_Ext_Main_profiles/BA3_SVA_C.264 complys with extended profile specifications. However, the SPS header has the constraint_set1_flag syntax element set to 1. This means that, if a Main profile compliant decoder is available, then it should be able to decode this stream. This changes makes it possible to fall-back from Extended profile to Main profile if constraint_set1_flag is set to 1. https://bugzilla.gnome.org/show_bug.cgi?id=720190
This commit is contained in:
parent
416ab33e34
commit
1dd89800b0
1 changed files with 31 additions and 10 deletions
|
@ -752,6 +752,23 @@ gst_vaapi_decoder_h264_create(GstVaapiDecoder *base_decoder)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fill_profiles(GstVaapiProfile profiles[16], guint *n_profiles_ptr,
|
||||||
|
GstVaapiProfile profile)
|
||||||
|
{
|
||||||
|
guint n_profiles = *n_profiles_ptr;
|
||||||
|
|
||||||
|
profiles[n_profiles++] = profile;
|
||||||
|
switch (profile) {
|
||||||
|
case GST_VAAPI_PROFILE_H264_MAIN:
|
||||||
|
profiles[n_profiles++] = GST_VAAPI_PROFILE_H264_HIGH;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*n_profiles_ptr = n_profiles;
|
||||||
|
}
|
||||||
|
|
||||||
static GstVaapiProfile
|
static GstVaapiProfile
|
||||||
get_profile(GstVaapiDecoderH264 *decoder, GstH264SPS *sps)
|
get_profile(GstVaapiDecoderH264 *decoder, GstH264SPS *sps)
|
||||||
{
|
{
|
||||||
|
@ -764,17 +781,21 @@ get_profile(GstVaapiDecoderH264 *decoder, GstH264SPS *sps)
|
||||||
if (!profile)
|
if (!profile)
|
||||||
return GST_VAAPI_PROFILE_UNKNOWN;
|
return GST_VAAPI_PROFILE_UNKNOWN;
|
||||||
|
|
||||||
if (sps->constraint_set1_flag && profile == GST_VAAPI_PROFILE_H264_BASELINE)
|
fill_profiles(profiles, &n_profiles, profile);
|
||||||
profile = GST_VAAPI_PROFILE_H264_CONSTRAINED_BASELINE;
|
|
||||||
|
|
||||||
profiles[n_profiles++] = profile;
|
|
||||||
switch (profile) {
|
switch (profile) {
|
||||||
case GST_VAAPI_PROFILE_H264_CONSTRAINED_BASELINE:
|
case GST_VAAPI_PROFILE_H264_BASELINE:
|
||||||
profiles[n_profiles++] = GST_VAAPI_PROFILE_H264_BASELINE;
|
if (sps->constraint_set1_flag) { // A.2.2 (main profile)
|
||||||
profiles[n_profiles++] = GST_VAAPI_PROFILE_H264_MAIN;
|
fill_profiles(profiles, &n_profiles,
|
||||||
// fall-through
|
GST_VAAPI_PROFILE_H264_CONSTRAINED_BASELINE);
|
||||||
case GST_VAAPI_PROFILE_H264_MAIN:
|
fill_profiles(profiles, &n_profiles,
|
||||||
profiles[n_profiles++] = GST_VAAPI_PROFILE_H264_HIGH;
|
GST_VAAPI_PROFILE_H264_MAIN);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GST_VAAPI_PROFILE_H264_EXTENDED:
|
||||||
|
if (sps->constraint_set1_flag) { // A.2.2 (main profile)
|
||||||
|
fill_profiles(profiles, &n_profiles,
|
||||||
|
GST_VAAPI_PROFILE_H264_MAIN);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue