Merge commit '979cb55103fa8e8274806e496901203742c686d1'
authorHendrik Leppkes <h.leppkes@gmail.com>
Sun, 2 Aug 2015 10:29:30 +0000 (12:29 +0200)
committerHendrik Leppkes <h.leppkes@gmail.com>
Sun, 2 Aug 2015 10:29:30 +0000 (12:29 +0200)
* commit '979cb55103fa8e8274806e496901203742c686d1':
  hevc: Split the sei parsing in 3 functions

Conflicts:
libavcodec/hevc_sei.c

Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
1  2 
libavcodec/hevc_sei.c

@@@ -121,64 -118,41 +121,107 @@@ static int decode_nal_sei_display_orien
      return 0;
  }
  
 -    GetBitContext *gb = &s->HEVClc.gb;
 +static int decode_pic_timing(HEVCContext *s)
 +{
 +    GetBitContext *gb = &s->HEVClc->gb;
 +    HEVCSPS *sps;
 +
 +    if (!s->ps.sps_list[s->active_seq_parameter_set_id])
 +        return(AVERROR(ENOMEM));
 +    sps = (HEVCSPS*)s->ps.sps_list[s->active_seq_parameter_set_id]->data;
 +
 +    if (sps->vui.frame_field_info_present_flag) {
 +        int pic_struct = get_bits(gb, 4);
 +        s->picture_struct = AV_PICTURE_STRUCTURE_UNKNOWN;
 +        if (pic_struct == 2) {
 +            av_log(s->avctx, AV_LOG_DEBUG, "BOTTOM Field\n");
 +            s->picture_struct = AV_PICTURE_STRUCTURE_BOTTOM_FIELD;
 +        } else if (pic_struct == 1) {
 +            av_log(s->avctx, AV_LOG_DEBUG, "TOP Field\n");
 +            s->picture_struct = AV_PICTURE_STRUCTURE_TOP_FIELD;
 +        }
 +        get_bits(gb, 2);                   // source_scan_type
 +        get_bits(gb, 1);                   // duplicate_flag
 +    }
 +    return 1;
 +}
 +
 +static int active_parameter_sets(HEVCContext *s)
 +{
 +    GetBitContext *gb = &s->HEVClc->gb;
 +    int num_sps_ids_minus1;
 +    int i;
 +    unsigned active_seq_parameter_set_id;
 +
 +    get_bits(gb, 4); // active_video_parameter_set_id
 +    get_bits(gb, 1); // self_contained_cvs_flag
 +    get_bits(gb, 1); // num_sps_ids_minus1
 +    num_sps_ids_minus1 = get_ue_golomb_long(gb); // num_sps_ids_minus1
 +
 +    if (num_sps_ids_minus1 < 0 || num_sps_ids_minus1 > 15) {
 +        av_log(s->avctx, AV_LOG_ERROR, "num_sps_ids_minus1 %d invalid\n", num_sps_ids_minus1);
 +        return AVERROR_INVALIDDATA;
 +    }
 +
 +    active_seq_parameter_set_id = get_ue_golomb_long(gb);
 +    if (active_seq_parameter_set_id >= MAX_SPS_COUNT) {
 +        av_log(s->avctx, AV_LOG_ERROR, "active_parameter_set_id %d invalid\n", active_seq_parameter_set_id);
 +        return AVERROR_INVALIDDATA;
 +    }
 +    s->active_seq_parameter_set_id = active_seq_parameter_set_id;
 +
 +    for (i = 1; i <= num_sps_ids_minus1; i++)
 +        get_ue_golomb_long(gb); // active_seq_parameter_set_id[i]
 +
 +    return 0;
 +}
 +
+ static int decode_nal_sei_prefix(HEVCContext *s, int type, int size)
+ {
 -    GetBitContext *gb = &s->HEVClc.gb;
++    GetBitContext *gb = &s->HEVClc->gb;
+     switch (type) {
+     case 256:  // Mismatched value from HM 8.1
+         return decode_nal_sei_decoded_picture_hash(s);
+     case SEI_TYPE_FRAME_PACKING:
+         return decode_nal_sei_frame_packing_arrangement(s);
+     case SEI_TYPE_DISPLAY_ORIENTATION:
+         return decode_nal_sei_display_orientation(s);
++    case SEI_TYPE_PICTURE_TIMING:
++        {
++            int ret = decode_pic_timing(s);
++            av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
++            skip_bits(gb, 8 * size);
++            return ret;
++        }
++    case SEI_TYPE_ACTIVE_PARAMETER_SETS:
++        active_parameter_sets(s);
++        av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
++        return 0;
+     default:
+         av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
+         skip_bits_long(gb, 8 * size);
+         return 0;
+     }
+ }
+ static int decode_nal_sei_suffix(HEVCContext *s, int type, int size)
+ {
++    GetBitContext *gb = &s->HEVClc->gb;
+     switch (type) {
+     case SEI_TYPE_DECODED_PICTURE_HASH:
+         return decode_nal_sei_decoded_picture_hash(s);
+     default:
+         av_log(s->avctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", type);
+         skip_bits_long(gb, 8 * size);
+         return 0;
+     }
+ }
  static int decode_nal_sei_message(HEVCContext *s)
  {
 -    GetBitContext *gb = &s->HEVClc.gb;
 +    GetBitContext *gb = &s->HEVClc->gb;
  
      int payload_type = 0;
      int payload_size = 0;
          payload_size += byte;
      }
      if (s->nal_unit_type == NAL_SEI_PREFIX) {
-         switch (payload_type) {
-         case 256:  // Mismatched value from HM 8.1
-             return decode_nal_sei_decoded_picture_hash(s);
-         case SEI_TYPE_FRAME_PACKING:
-             return decode_nal_sei_frame_packing_arrangement(s);
-         case SEI_TYPE_DISPLAY_ORIENTATION:
-             return decode_nal_sei_display_orientation(s);
-         case SEI_TYPE_PICTURE_TIMING:
-             {
-                 int ret = decode_pic_timing(s);
-                 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", payload_type);
-                 skip_bits(gb, 8 * payload_size);
-                 return ret;
-             }
-         case SEI_TYPE_ACTIVE_PARAMETER_SETS:
-             active_parameter_sets(s);
-             av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", payload_type);
-             return 0;
-         default:
-             av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", payload_type);
-             skip_bits(gb, 8 * payload_size);
-             return 0;
-         }
+         return decode_nal_sei_prefix(s, payload_type, payload_size);
      } else { /* nal_unit_type == NAL_SEI_SUFFIX */
-         switch (payload_type) {
-         case SEI_TYPE_DECODED_PICTURE_HASH:
-             return decode_nal_sei_decoded_picture_hash(s);
-         default:
-             av_log(s->avctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", payload_type);
-             skip_bits(gb, 8 * payload_size);
-             return 0;
-         }
+         return decode_nal_sei_suffix(s, payload_type, payload_size);
      }
 -    return 0;
 +    return 1;
  }
  
  static int more_rbsp_data(GetBitContext *gb)