Blame codecparsers/h264Parser.h

Packit 1244b8
/*
Packit 1244b8
 * Copyright 2016 Intel Corporation
Packit 1244b8
 *
Packit 1244b8
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1244b8
 * you may not use this file except in compliance with the License.
Packit 1244b8
 * You may obtain a copy of the License at
Packit 1244b8
 *
Packit 1244b8
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1244b8
 *
Packit 1244b8
 * Unless required by applicable law or agreed to in writing, software
Packit 1244b8
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1244b8
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1244b8
 * See the License for the specific language governing permissions and
Packit 1244b8
 * limitations under the License.
Packit 1244b8
 */
Packit 1244b8
Packit 1244b8
/*
Packit 1244b8
 * NOTES:
Packit 1244b8
 *     All the following structs and classes definded base on the spec of H264,
Packit 1244b8
 *     you can see H.264 specification at http://www.itu.int/rec/T-REC-H.264.
Packit 1244b8
 *     And in this header file, there are two categories of code-styles for variables.
Packit 1244b8
 *     Some of them looks like "NalUnit::nal_ref_idc" which separated by underline,
Packit 1244b8
 *     that is to say, these variables defined in H264 spec and assigned by reading bits
Packit 1244b8
 *     from video bits stream directly, on my purpose, it is helpful for you to find where
Packit 1244b8
 *     they are in spec quickly. Some of variables defined use CamelCase because these
Packit 1244b8
 *     variables assigned by other variables.
Packit 1244b8
 */
Packit 1244b8
Packit 1244b8
#ifndef h264parser_h
Packit 1244b8
#define h264parser_h
Packit 1244b8
Packit 1244b8
#include "nalReader.h"
Packit 1244b8
#include "VideoCommonDefs.h"
Packit 1244b8
Packit 1244b8
#include <map>
Packit 1244b8
#include <string.h>
Packit 1244b8
Packit 1244b8
namespace YamiParser {
Packit 1244b8
namespace H264 {
Packit 1244b8
Packit 1244b8
#define MAX_SPS_ID 31
Packit 1244b8
#define MAX_PPS_ID 255
Packit 1244b8
#define MAX_IDR_PIC_ID 65535
Packit 1244b8
Packit 1244b8
//get the coding type of the slice according to Table 7-6
Packit 1244b8
#define IS_P_SLICE(slice_type) ((slice_type) % 5 == 0)
Packit 1244b8
#define IS_B_SLICE(slice_type) ((slice_type) % 5 == 1)
Packit 1244b8
#define IS_I_SLICE(slice_type) ((slice_type) % 5 == 2)
Packit 1244b8
#define IS_SP_SLICE(slice_type) ((slice_type) % 5 == 3)
Packit 1244b8
#define IS_SI_SLICE(slice_type) ((slice_type) % 5 == 4)
Packit 1244b8
Packit 1244b8
enum SliceGroupMapType {
Packit 1244b8
    SLICE_GROUP_INTERLEAVED,
Packit 1244b8
    SLICE_GROUP_DISPERSED_MAPPING,
Packit 1244b8
    SLIEC_GROUP_FOREGROUND_LEFTOVER,
Packit 1244b8
    //3, 4, 5 specify changing slice groups. when num_slice_groups_numus
Packit 1244b8
    //is not equal to 1, slice_group_map_type shall not be equal to 3, 4, or 5
Packit 1244b8
    SLICE_GROUP_CHANGING3,
Packit 1244b8
    SLICE_GROUP_CHANGING4,
Packit 1244b8
    SLICE_GROUP_CHANGING5,
Packit 1244b8
    SLICE_GROUP_ASSIGNMENT
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
enum Profile {
Packit 1244b8
    PROFILE_CAVLC_444_INTRA = 44, //A.2.11
Packit 1244b8
    PROFILE_BASELINE = 66, //A.2.1
Packit 1244b8
    PROFILE_MAIN = 77, //A.2.2
Packit 1244b8
    PROFILE_SCALABLE_BASELINE = 83, //G.10.1.1
Packit 1244b8
    PROFILE_SCALABLE_HIGH = 86, //G.10.1.2
Packit 1244b8
    PROFILE_EXTENDED = 88, //A.2.3
Packit 1244b8
    PROFILE_HIGH = 100, //A.2.4
Packit 1244b8
    PROFILE_HIGH_10 = 110, //A.2.5
Packit 1244b8
    PROFILE_MULTIVIEW_HIGH = 118, //H.10.1.1
Packit 1244b8
    PROFILE_HIGH_422 = 122, //A.2.6
Packit 1244b8
    PROFILE_STEREO_HIGH = 128, //H.10.1.2
Packit 1244b8
    PROFILE_MULTIVIEW_DEPTH_HIGH = 138, //I.10.1.1
Packit 1244b8
    PROFILE_HIGH_444 = 244, //A.2.7
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
//according 8.5.6
Packit 1244b8
static const uint8_t zigzag_scans_4x4[16] = {
Packit 1244b8
    0, 1, 4, 8,
Packit 1244b8
    5, 2, 3, 6,
Packit 1244b8
    9, 12, 13, 10,
Packit 1244b8
    7, 11, 14, 15
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
static const uint8_t zigzag_scans_8x8[64] = {
Packit 1244b8
    0, 1, 8, 16, 9, 2, 3, 10,
Packit 1244b8
    17, 24, 32, 25, 18, 11, 4, 5,
Packit 1244b8
    12, 19, 26, 33, 40, 48, 41, 34,
Packit 1244b8
    27, 20, 13, 6, 7, 14, 21, 28,
Packit 1244b8
    35, 42, 49, 56, 57, 50, 43, 36,
Packit 1244b8
    29, 22, 15, 23, 30, 37, 44, 51,
Packit 1244b8
    58, 59, 52, 45, 38, 31, 39, 46,
Packit 1244b8
    53, 60, 61, 54, 47, 55, 62, 63
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
#define transform_coefficients_for_frame_macroblocks(dest, src, len, mode) \
Packit 1244b8
    {                                                                      \
Packit 1244b8
        if ((dest) != (src)) {                                             \
Packit 1244b8
            for (uint32_t l = 0; l < (len); l++)                           \
Packit 1244b8
                (dest)[zigzag_scans_##mode[l]] = (src)[l];                 \
Packit 1244b8
        }                                                                  \
Packit 1244b8
    }
Packit 1244b8
Packit 1244b8
//according to Table 7-1
Packit 1244b8
enum NalUnitType {
Packit 1244b8
    NAL_UNSPECIFIED, //unspecified
Packit 1244b8
    NAL_SLICE_NONIDR, //coded slice of a non-IDR picture
Packit 1244b8
    NAL_SLICE_DPA, //coded slice data partiiton A
Packit 1244b8
    NAL_SLICE_DPB, //coded slice data partition B
Packit 1244b8
    NAL_SLICE_DPC, //coded slice data partition C
Packit 1244b8
    NAL_SLICE_IDR, //coded slice of an IDR picture
Packit 1244b8
    NAL_SEI, //supplemental enhancement information (SEI)
Packit 1244b8
    NAL_SPS, //sequence parameter set
Packit 1244b8
    NAL_PPS, //picture parameter set
Packit 1244b8
    NAL_AU_DELIMITER, //access unit delimiter
Packit 1244b8
    NAL_SEQ_END, //end of sequence
Packit 1244b8
    NAL_STREAM_END, //end of stream
Packit 1244b8
    NAL_FILLER_DATA, //filler data
Packit 1244b8
    NAL_SPS_EXT, //sequence parameter set extension
Packit 1244b8
    NAL_PREFIX_UNIT, //prefix NAL unit
Packit 1244b8
    NAL_SUBSET_SPS, //subset sequence parameter set
Packit 1244b8
    //16 -18 reserved
Packit 1244b8
    NAL_SLICE_AUX = 19, //coded slice of an auxiliary coded picture without partitioning
Packit 1244b8
    NAL_SLICE_EXT, //coded slice extension
Packit 1244b8
    NAL_SLICE_EXT_DEPV //coded slice extension for depth view components
Packit 1244b8
    //22 & 23 reserved, 24 - 31 unspecified
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
struct NaluHeadMvcExt {
Packit 1244b8
    bool non_idr_flag;
Packit 1244b8
    uint8_t priority_id;
Packit 1244b8
    uint16_t view_id;
Packit 1244b8
    uint8_t temporal_id;
Packit 1244b8
    bool anchor_pic_flag;
Packit 1244b8
    bool inter_view_flag;
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
struct NaluHeadSvcExt {
Packit 1244b8
    bool idr_flag;
Packit 1244b8
    uint8_t priority_id;
Packit 1244b8
    bool no_inter_layer_pred_flag;
Packit 1244b8
    uint8_t dependency_id;
Packit 1244b8
    uint8_t quality_id;
Packit 1244b8
    uint8_t temporal_id;
Packit 1244b8
    bool use_ref_base_pic_flag;
Packit 1244b8
    bool discardable_flag;
Packit 1244b8
    bool output_flag;
Packit 1244b8
    uint8_t reserved_three_2bits;
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
class Parser;
Packit 1244b8
Packit 1244b8
class NalUnit {
Packit 1244b8
public:
Packit 1244b8
    //the min size of a valid nal unit
Packit 1244b8
    enum {
Packit 1244b8
        NAL_UNIT_SEQUENCE_SIZE = 4
Packit 1244b8
    };
Packit 1244b8
Packit 1244b8
    /* nal should be a complete nal unit buffer without start code or length bytes */
Packit 1244b8
    bool parseNalUnit(const uint8_t* nal, size_t size);
Packit 1244b8
Packit 1244b8
public:
Packit 1244b8
    const uint8_t* m_data;
Packit 1244b8
    uint32_t m_size;
Packit 1244b8
Packit 1244b8
    uint16_t nal_ref_idc;
Packit 1244b8
    uint16_t nal_unit_type;
Packit 1244b8
Packit 1244b8
    //calc value, used by other syntax structs
Packit 1244b8
    bool m_idrPicFlag;
Packit 1244b8
    uint8_t m_nalUnitHeaderBytes;
Packit 1244b8
Packit 1244b8
    NaluHeadMvcExt m_mvc;
Packit 1244b8
    NaluHeadSvcExt m_svc;
Packit 1244b8
Packit 1244b8
private:
Packit 1244b8
    bool parseSvcExtension(BitReader& br);
Packit 1244b8
    bool parseMvcExtension(BitReader& br);
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
struct HRDParameters {
Packit 1244b8
    uint8_t cpb_cnt_minus1;
Packit 1244b8
    uint8_t bit_rate_scale;
Packit 1244b8
    uint8_t cpb_size_scale;
Packit 1244b8
    uint32_t bit_rate_value_minus1[32];
Packit 1244b8
    uint32_t cpb_size_value_minus1[32];
Packit 1244b8
    bool cbr_flag[32];
Packit 1244b8
    uint8_t initial_cpb_removal_delay_length_minus1;
Packit 1244b8
    uint8_t cpb_removal_delay_length_minus1;
Packit 1244b8
    uint8_t dpb_output_delay_length_minus1;
Packit 1244b8
    uint8_t time_offset_length;
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
struct VUIParameters {
Packit 1244b8
    bool aspect_ratio_info_present_flag;
Packit 1244b8
    uint8_t aspect_ratio_idc;
Packit 1244b8
    uint16_t sar_width;
Packit 1244b8
    uint16_t sar_height;
Packit 1244b8
    bool overscan_info_present_flag;
Packit 1244b8
    bool overscan_appropriate_flag;
Packit 1244b8
    bool video_signal_type_present_flag;
Packit 1244b8
    uint8_t video_format;
Packit 1244b8
    bool video_full_range_flag;
Packit 1244b8
    bool colour_description_present_flag;
Packit 1244b8
    uint8_t colour_primaries;
Packit 1244b8
    uint8_t transfer_characteristics;
Packit 1244b8
    uint8_t matrix_coefficients;
Packit 1244b8
    bool chroma_loc_info_present_flag;
Packit 1244b8
    uint8_t chroma_sample_loc_type_top_field;
Packit 1244b8
    uint8_t chroma_sample_loc_type_bottom_field;
Packit 1244b8
    bool timing_info_present_flag;
Packit 1244b8
    uint32_t num_units_in_tick;
Packit 1244b8
    uint32_t time_scale;
Packit 1244b8
    bool fixed_frame_rate_flag;
Packit 1244b8
    bool nal_hrd_parameters_present_flag;
Packit 1244b8
    HRDParameters nal_hrd_parameters;
Packit 1244b8
    bool vcl_hrd_parameters_present_flag;
Packit 1244b8
    HRDParameters vcl_hrd_parameters;
Packit 1244b8
    bool low_delay_hrd_flag;
Packit 1244b8
    bool pic_struct_present_flag;
Packit 1244b8
    bool bitstream_restriction_flag;
Packit 1244b8
    bool motion_vectors_over_pic_boundaries_flag;
Packit 1244b8
    uint32_t max_bytes_per_pic_denom;
Packit 1244b8
    uint32_t max_bits_per_mb_denom;
Packit 1244b8
    uint32_t log2_max_mv_length_horizontal;
Packit 1244b8
    uint32_t log2_max_mv_length_vertical;
Packit 1244b8
    uint32_t max_num_reorder_frames;
Packit 1244b8
    uint32_t max_dec_frame_buffering;
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
struct SPS {
Packit 1244b8
    uint8_t profile_idc;
Packit 1244b8
    bool constraint_set0_flag;
Packit 1244b8
    bool constraint_set1_flag;
Packit 1244b8
    bool constraint_set2_flag;
Packit 1244b8
    bool constraint_set3_flag;
Packit 1244b8
    bool constraint_set4_flag;
Packit 1244b8
    bool constraint_set5_flag;
Packit 1244b8
    uint8_t level_idc;
Packit 1244b8
    uint32_t sps_id; //seq_parameter_set_id
Packit 1244b8
    uint8_t chroma_format_idc;
Packit 1244b8
    bool separate_colour_plane_flag;
Packit 1244b8
    uint8_t bit_depth_luma_minus8;
Packit 1244b8
    uint8_t bit_depth_chroma_minus8;
Packit 1244b8
    bool qpprime_y_zero_transform_bypass_flag;
Packit 1244b8
    bool seq_scaling_matrix_present_flag;
Packit 1244b8
    bool seq_scaling_list_present_flag[12];
Packit 1244b8
    uint8_t scaling_lists_4x4[6][16];
Packit 1244b8
    uint8_t scaling_lists_8x8[6][64];
Packit 1244b8
    uint8_t log2_max_frame_num_minus4;
Packit 1244b8
    uint8_t pic_order_cnt_type;
Packit 1244b8
    uint8_t log2_max_pic_order_cnt_lsb_minus4;
Packit 1244b8
    bool delta_pic_order_always_zero_flag;
Packit 1244b8
    int32_t offset_for_non_ref_pic;
Packit 1244b8
    int32_t offset_for_top_to_bottom_field;
Packit 1244b8
    uint8_t num_ref_frames_in_pic_order_cnt_cycle;
Packit 1244b8
    int32_t offset_for_ref_frame[255];
Packit 1244b8
    uint32_t num_ref_frames;
Packit 1244b8
    bool gaps_in_frame_num_value_allowed_flag;
Packit 1244b8
    uint32_t pic_width_in_mbs_minus1;
Packit 1244b8
    uint32_t pic_height_in_map_units_minus1;
Packit 1244b8
    bool frame_mbs_only_flag;
Packit 1244b8
    bool mb_adaptive_frame_field_flag;
Packit 1244b8
    bool direct_8x8_inference_flag;
Packit 1244b8
    bool frame_cropping_flag;
Packit 1244b8
    uint32_t frame_crop_left_offset;
Packit 1244b8
    uint32_t frame_crop_right_offset;
Packit 1244b8
    uint32_t frame_crop_top_offset;
Packit 1244b8
    uint32_t frame_crop_bottom_offset;
Packit 1244b8
    bool vui_parameters_present_flag;
Packit 1244b8
    VUIParameters m_vui;
Packit 1244b8
Packit 1244b8
    //Because these variables calced from other variables instead of
Packit 1244b8
    //reading from bits stream, so using different style and spec do like this
Packit 1244b8
    //used to calc slice`s maxPicNum
Packit 1244b8
    uint32_t m_maxFrameNum;
Packit 1244b8
Packit 1244b8
    uint8_t m_chromaArrayType;
Packit 1244b8
Packit 1244b8
    int32_t m_width;
Packit 1244b8
    int32_t m_height;
Packit 1244b8
    int32_t m_cropX;
Packit 1244b8
    int32_t m_cropY;
Packit 1244b8
    int32_t m_cropRectWidth;
Packit 1244b8
    int32_t m_cropRectHeight;
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
struct PPS {
Packit 1244b8
    PPS();
Packit 1244b8
    ~PPS();
Packit 1244b8
Packit 1244b8
    uint32_t pps_id;
Packit 1244b8
    uint32_t sps_id;
Packit 1244b8
Packit 1244b8
Packit 1244b8
    bool entropy_coding_mode_flag;
Packit 1244b8
    bool pic_order_present_flag;
Packit 1244b8
    uint32_t num_slice_groups_minus1;
Packit 1244b8
    uint8_t slice_group_map_type;
Packit 1244b8
    uint32_t run_length_minus1[8];
Packit 1244b8
    uint32_t top_left[8];
Packit 1244b8
    uint32_t bottom_right[8];
Packit 1244b8
    bool slice_group_change_direction_flag;
Packit 1244b8
    uint32_t slice_group_change_rate_minus1;
Packit 1244b8
    uint32_t pic_size_in_map_units_minus1;
Packit 1244b8
    uint8_t* slice_group_id;
Packit 1244b8
    uint8_t num_ref_idx_l0_active_minus1;
Packit 1244b8
    uint8_t num_ref_idx_l1_active_minus1;
Packit 1244b8
    bool weighted_pred_flag;
Packit 1244b8
    uint8_t weighted_bipred_idc;
Packit 1244b8
    int8_t pic_init_qp_minus26;
Packit 1244b8
    int8_t pic_init_qs_minus26;
Packit 1244b8
    int8_t chroma_qp_index_offset;
Packit 1244b8
    bool deblocking_filter_control_present_flag;
Packit 1244b8
    bool constrained_intra_pred_flag;
Packit 1244b8
    bool redundant_pic_cnt_present_flag;
Packit 1244b8
    bool transform_8x8_mode_flag;
Packit 1244b8
    bool pic_scaling_list_present_flag[12];
Packit 1244b8
    uint8_t scaling_lists_4x4[6][16];
Packit 1244b8
    uint8_t scaling_lists_8x8[6][64];
Packit 1244b8
    int8_t second_chroma_qp_index_offset;
Packit 1244b8
    SharedPtr<SPS> m_sps;
Packit 1244b8
    //Because these variables is non pod type, it can not use memset and use offsetof to weed out it
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
struct RefPicListModification {
Packit 1244b8
    uint8_t modification_of_pic_nums_idc;
Packit 1244b8
    uint32_t abs_diff_pic_num_minus1;
Packit 1244b8
    uint32_t long_term_pic_num;
Packit 1244b8
    uint32_t abs_diff_view_idx_minus1;
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
struct PredWeightTable {
Packit 1244b8
    uint8_t luma_log2_weight_denom;
Packit 1244b8
    uint8_t chroma_log2_weight_denom;
Packit 1244b8
    bool luma_weight_l0_flag;
Packit 1244b8
    //32 is the max of num_ref_idx_l0_active_minus1
Packit 1244b8
    int16_t luma_weight_l0[32];
Packit 1244b8
    int8_t luma_offset_l0[32];
Packit 1244b8
    bool chroma_weight_l0_flag;
Packit 1244b8
    int16_t chroma_weight_l0[32][2];
Packit 1244b8
    int8_t chroma_offset_l0[32][2];
Packit 1244b8
    bool luma_weight_l1_flag;
Packit 1244b8
    int16_t luma_weight_l1[32];
Packit 1244b8
    int8_t luma_offset_l1[32];
Packit 1244b8
    bool chroma_weight_l1_flag;
Packit 1244b8
    int16_t chroma_weight_l1[32][2];
Packit 1244b8
    int8_t chroma_offset_l1[32][2];
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
struct RefPicMarking {
Packit 1244b8
    uint8_t memory_management_control_operation;
Packit 1244b8
    uint32_t difference_of_pic_nums_minus1;
Packit 1244b8
    uint32_t long_term_pic_num;
Packit 1244b8
    uint32_t long_term_frame_idx;
Packit 1244b8
    uint32_t max_long_term_frame_idx_plus1;
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
struct DecRefPicMarking {
Packit 1244b8
    bool no_output_of_prior_pics_flag;
Packit 1244b8
    bool long_term_reference_flag;
Packit 1244b8
    bool adaptive_ref_pic_marking_mode_flag;
Packit 1244b8
    RefPicMarking ref_pic_marking[10];
Packit 1244b8
    uint8_t n_ref_pic_marking;
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
class SliceHeader {
Packit 1244b8
public:
Packit 1244b8
    SliceHeader();
Packit 1244b8
    bool parseHeader(Parser* nalparser, NalUnit* nalu);
Packit 1244b8
Packit 1244b8
private:
Packit 1244b8
    bool refPicListModification(NalReader& nr,
Packit 1244b8
        RefPicListModification* pm0, RefPicListModification* pm1, bool is_mvc);
Packit 1244b8
    bool predWeightTable(NalReader& nr, uint8_t chroma_array_type);
Packit 1244b8
    bool decRefPicMarking(NalUnit* nalu, NalReader& nr);
Packit 1244b8
Packit 1244b8
public:
Packit 1244b8
    uint32_t first_mb_in_slice;
Packit 1244b8
    uint32_t slice_type;
Packit 1244b8
    uint8_t colour_plane_id;
Packit 1244b8
    uint16_t frame_num;
Packit 1244b8
    bool field_pic_flag;
Packit 1244b8
    bool bottom_field_flag;
Packit 1244b8
    uint32_t idr_pic_id;
Packit 1244b8
    uint16_t pic_order_cnt_lsb;
Packit 1244b8
    int32_t delta_pic_order_cnt_bottom;
Packit 1244b8
    int32_t delta_pic_order_cnt[2];
Packit 1244b8
    uint8_t redundant_pic_cnt;
Packit 1244b8
    bool direct_spatial_mv_pred_flag;
Packit 1244b8
    bool num_ref_idx_active_override_flag;
Packit 1244b8
    uint8_t num_ref_idx_l0_active_minus1;
Packit 1244b8
    uint8_t num_ref_idx_l1_active_minus1;
Packit 1244b8
    bool ref_pic_list_modification_flag_l0;
Packit 1244b8
    uint8_t n_ref_pic_list_modification_l0;
Packit 1244b8
    RefPicListModification ref_pic_list_modification_l0[32];
Packit 1244b8
    bool ref_pic_list_modification_flag_l1;
Packit 1244b8
    uint8_t n_ref_pic_list_modification_l1;
Packit 1244b8
    RefPicListModification ref_pic_list_modification_l1[32];
Packit 1244b8
    PredWeightTable pred_weight_table;
Packit 1244b8
    DecRefPicMarking dec_ref_pic_marking;
Packit 1244b8
    uint8_t cabac_init_idc;
Packit 1244b8
    int8_t slice_qp_delta;
Packit 1244b8
    bool sp_for_switch_flag;
Packit 1244b8
    int8_t slice_qs_delta;
Packit 1244b8
    uint8_t disable_deblocking_filter_idc;
Packit 1244b8
    int8_t slice_alpha_c0_offset_div2;
Packit 1244b8
    int8_t slice_beta_offset_div2;
Packit 1244b8
    uint16_t slice_group_change_cycle;
Packit 1244b8
Packit 1244b8
    //the allowned max value of abs_diff_pic_num_minus1
Packit 1244b8
    uint32_t m_maxPicNum;
Packit 1244b8
Packit 1244b8
    //the size of the slice header in bits
Packit 1244b8
    uint32_t m_headerSize;
Packit 1244b8
Packit 1244b8
    //the number of emulation prevention bytes
Packit 1244b8
    uint32_t m_emulationPreventionBytes;
Packit 1244b8
    SharedPtr<PPS> m_pps;
Packit 1244b8
    //Because these variables is non pod type, it can not use memset and use offsetof to weed out it
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
class Parser {
Packit 1244b8
public:
Packit 1244b8
    enum {
Packit 1244b8
        MAX_CPB_CNT_MINUS1 = 31,
Packit 1244b8
        MAX_CHROMA_FORMAT_IDC = 3,
Packit 1244b8
        SCALING_LIST_DEFAULT_VALUE = 16
Packit 1244b8
    };
Packit 1244b8
Packit 1244b8
    typedef std::map<uint8_t, SharedPtr<SPS> > SpsMap;
Packit 1244b8
    typedef std::map<uint8_t, SharedPtr<PPS> > PpsMap;
Packit 1244b8
Packit 1244b8
    bool parseSps(SharedPtr<SPS>& sps, const NalUnit* nalu);
Packit 1244b8
    bool parsePps(SharedPtr<PPS>& pps, const NalUnit* nalu);
Packit 1244b8
Packit 1244b8
    inline SharedPtr<PPS> searchPps(uint8_t id) const;
Packit 1244b8
    inline SharedPtr<SPS> searchSps(uint8_t id) const;
Packit 1244b8
Packit 1244b8
private:
Packit 1244b8
    bool hrdParameters(HRDParameters* hrd, NalReader& nr);
Packit 1244b8
    bool vuiParameters(SharedPtr<SPS>& sps, NalReader& nr);
Packit 1244b8
Packit 1244b8
    static const uint8_t EXTENDED_SAR;
Packit 1244b8
    SpsMap m_spsMap;
Packit 1244b8
    PpsMap m_ppsMap;
Packit 1244b8
};
Packit 1244b8
Packit 1244b8
}
Packit 1244b8
}
Packit 1244b8
Packit 1244b8
#endif