|
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
|