]> git.sesse.net Git - ffmpeg/commitdiff
Merge commit '043f46f5741e1a5caedf55d788e1a72aae3b7605'
authorHendrik Leppkes <h.leppkes@gmail.com>
Sun, 2 Aug 2015 10:25:41 +0000 (12:25 +0200)
committerHendrik Leppkes <h.leppkes@gmail.com>
Sun, 2 Aug 2015 10:25:41 +0000 (12:25 +0200)
* commit '043f46f5741e1a5caedf55d788e1a72aae3b7605':
  hevc: Use switch instead of if-nests in decode_nal_sei_message

Conflicts:
libavcodec/hevc_sei.c

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

index ecb0f24f8f1ef94b080774919af36e22226ee873,873899a9c67145b066e0d0b86cce7b7362d39078..d1e0b8626a3fe278566cac28c572b7391c6d9823
@@@ -53,16 -53,13 +53,16 @@@ enum HEVC_SEI_TYPE 
      SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO             = 144,
  };
  
- static void decode_nal_sei_decoded_picture_hash(HEVCContext *s)
+ static int decode_nal_sei_decoded_picture_hash(HEVCContext *s)
  {
      int cIdx, i;
 -    GetBitContext *gb = &s->HEVClc.gb;
 -    uint8_t hash_type = get_bits(gb, 8);
 +    uint8_t hash_type;
 +    //uint16_t picture_crc;
 +    //uint32_t picture_checksum;
 +    GetBitContext *gb = &s->HEVClc->gb;
 +    hash_type = get_bits(gb, 8);
  
 -    for (cIdx = 0; cIdx < 3; cIdx++) {
 +    for (cIdx = 0; cIdx < 3/*((s->sps->chroma_format_idc == 0) ? 1 : 3)*/; cIdx++) {
          if (hash_type == 0) {
              s->is_md5 = 1;
              for (i = 0; i < 16; i++)
              skip_bits(gb, 32);
          }
      }
+     return 0;
  }
  
- static void decode_nal_sei_frame_packing_arrangement(HEVCContext *s)
+ static int decode_nal_sei_frame_packing_arrangement(HEVCContext *s)
  {
 -    GetBitContext *gb = &s->HEVClc.gb;
 +    GetBitContext *gb = &s->HEVClc->gb;
  
      get_ue_golomb(gb);                  // frame_packing_arrangement_id
      s->sei_frame_packing_present = !get_bits1(gb);
          skip_bits1(gb);         // frame_packing_arrangement_persistance_flag
      }
      skip_bits1(gb);             // upsampled_aspect_ratio_flag
+     return 0;
  }
  
- static void decode_nal_sei_display_orientation(HEVCContext *s)
+ static int decode_nal_sei_display_orientation(HEVCContext *s)
  {
 -    GetBitContext *gb = &s->HEVClc.gb;
 +    GetBitContext *gb = &s->HEVClc->gb;
  
      s->sei_display_orientation_present = !get_bits1(gb);
  
          s->sei_anticlockwise_rotation = get_bits(gb, 16);
          skip_bits1(gb);     // display_orientation_persistence_flag
      }
+     return 0;
  }
  
 +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_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) {
-         if (payload_type == 256 /*&& s->decode_checksum_sei*/) // Mismatched value from HM 8.1
-             decode_nal_sei_decoded_picture_hash(s);
-         else if (payload_type == SEI_TYPE_FRAME_PACKING)
-             decode_nal_sei_frame_packing_arrangement(s);
-         else if (payload_type == SEI_TYPE_DISPLAY_ORIENTATION)
-             decode_nal_sei_display_orientation(s);
-         else if (payload_type == 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;
-         } else if (payload_type == SEI_TYPE_ACTIVE_PARAMETER_SETS){
+         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);
-         } else {
++            return 0;
+         default:
              av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", payload_type);
-             skip_bits(gb, 8*payload_size);
+             skip_bits(gb, 8 * payload_size);
+             return 0;
          }
      } else { /* nal_unit_type == NAL_SEI_SUFFIX */
-         if (payload_type == SEI_TYPE_DECODED_PICTURE_HASH /* && s->decode_checksum_sei */)
-             decode_nal_sei_decoded_picture_hash(s);
-         else {
+         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 0;
 +    return 1;
  }
  
  static int more_rbsp_data(GetBitContext *gb)