On Sat, Dec 14, 2013 at 3:50 PM, Guillaume Martres <[email protected]> wrote:
> According to the spec, the value of XXX_reserved_zero_44bits should be
> ignored, so don't report an error when it's not zero.

They have to be ignored but conformant streams need to have them set to 0.
Ideally they should be checked and error out when EXPLODE flag is set,
but for now these flags have no use, and code is simplified, so this
patch may go in.
Vittorio

> ---
>  libavcodec/hevc_ps.c | 33 +++++++++------------------------
>  1 file changed, 9 insertions(+), 24 deletions(-)
>
> diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c
> index d981125..5f33005 100644
> --- a/libavcodec/hevc_ps.c
> +++ b/libavcodec/hevc_ps.c
> @@ -192,7 +192,7 @@ int ff_hevc_decode_short_term_rps(HEVCContext *s, 
> ShortTermRPS *rps,
>      return 0;
>  }
>
> -static int decode_profile_tier_level(HEVCLocalContext *lc, PTL *ptl,
> +static void decode_profile_tier_level(HEVCLocalContext *lc, PTL *ptl,
>                                       int max_num_sub_layers)
>  {
>      int i, j;
> @@ -207,12 +207,9 @@ static int decode_profile_tier_level(HEVCLocalContext 
> *lc, PTL *ptl,
>      skip_bits1(gb); // general_interlaced_source_flag
>      skip_bits1(gb); // general_non_packed_constraint_flag
>      skip_bits1(gb); // general_frame_only_constraint_flag
> -    if (get_bits(gb, 16) != 0) // XXX_reserved_zero_44bits[0..15]
> -        return -1;
> -    if (get_bits(gb, 16) != 0) // XXX_reserved_zero_44bits[16..31]
> -        return -1;
> -    if (get_bits(gb, 12) != 0) // XXX_reserved_zero_44bits[32..43]
> -        return -1;
> +    skip_bits(gb, 16); // XXX_reserved_zero_44bits[0..15]
> +    skip_bits(gb, 16); // XXX_reserved_zero_44bits[16..31]
> +    skip_bits(gb, 12); // XXX_reserved_zero_44bits[32..43]
>
>      ptl->general_level_idc = get_bits(gb, 8);
>      for (i = 0; i < max_num_sub_layers - 1; i++) {
> @@ -234,17 +231,13 @@ static int decode_profile_tier_level(HEVCLocalContext 
> *lc, PTL *ptl,
>              skip_bits1(gb); // sub_layer_non_packed_constraint_flag
>              skip_bits1(gb); // sub_layer_frame_only_constraint_flag
>
> -            if (get_bits(gb, 16) != 0) // 
> sub_layer_reserved_zero_44bits[0..15]
> -                return -1;
> -            if (get_bits(gb, 16) != 0) // 
> sub_layer_reserved_zero_44bits[16..31]
> -                return -1;
> -            if (get_bits(gb, 12) != 0) // 
> sub_layer_reserved_zero_44bits[32..43]
> -                return -1;
> +            skip_bits(gb, 16); // sub_layer_reserved_zero_44bits[0..15]
> +            skip_bits(gb, 16); // sub_layer_reserved_zero_44bits[16..31]
> +            skip_bits(gb, 12); // sub_layer_reserved_zero_44bits[32..43]
>          }
>          if (ptl->sub_layer_level_present_flag[i])
>              ptl->sub_layer_level_idc[i] = get_bits(gb, 8);
>      }
> -    return 0;
>  }
>
>  static void decode_sublayer_hrd(HEVCContext *s, int nb_cpb,
> @@ -362,10 +355,7 @@ int ff_hevc_decode_nal_vps(HEVCContext *s)
>          goto err;
>      }
>
> -    if (decode_profile_tier_level(&s->HEVClc, &vps->ptl, 
> vps->vps_max_sub_layers) < 0) {
> -        av_log(s->avctx, AV_LOG_ERROR, "Error decoding profile tier 
> level.\n");
> -        goto err;
> -    }
> +    decode_profile_tier_level(&s->HEVClc, &vps->ptl, 
> vps->vps_max_sub_layers);
>      vps->vps_sub_layer_ordering_info_present_flag = get_bits1(gb);
>
>      i = vps->vps_sub_layer_ordering_info_present_flag ? 0 : 
> vps->vps_max_sub_layers - 1;
> @@ -647,12 +637,7 @@ int ff_hevc_decode_nal_sps(HEVCContext *s)
>      }
>
>      skip_bits1(gb); // temporal_id_nesting_flag
> -    if (decode_profile_tier_level(&s->HEVClc, &sps->ptl,
> -                                  sps->max_sub_layers) < 0) {
> -        av_log(s->avctx, AV_LOG_ERROR, "error decoding profile tier 
> level\n");
> -        ret = AVERROR_INVALIDDATA;
> -        goto err;
> -    }
> +    decode_profile_tier_level(&s->HEVClc, &sps->ptl, sps->max_sub_layers);
>      sps_id = get_ue_golomb_long(gb);
>      if (sps_id >= MAX_SPS_COUNT) {
>          av_log(s->avctx, AV_LOG_ERROR, "SPS id out of range: %d\n", sps_id);
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to