/*
|
*
|
* Copyright 2015 Rockchip Electronics Co. LTD
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
|
#ifndef __H264D_GLOBAL_H__
|
#define __H264D_GLOBAL_H__
|
|
#include <stdio.h>
|
#include "rk_type.h"
|
|
#include "mpp_debug.h"
|
#include "mpp_bitread.h"
|
#include "mpp_mem_pool.h"
|
|
#include "h264d_syntax.h"
|
#include "h264d_api.h"
|
|
|
#define H264D_DBG_ERROR (0x00000001)
|
#define H264D_DBG_ASSERT (0x00000002)
|
#define H264D_DBG_WARNNING (0x00000004)
|
#define H264D_DBG_LOG (0x00000008)
|
|
#define H264D_DBG_INPUT (0x00000010) //!< input packet
|
#define H264D_DBG_PPS_SPS (0x00000020)
|
#define H264D_DBG_LOOP_STATE (0x00000040)
|
#define H264D_DBG_PARSE_NALU (0x00000080)
|
|
#define H264D_DBG_DPB_INFO (0x00000100) //!< dpb size
|
#define H264D_DBG_DPB_MALLIC (0x00000200) //!< malloc
|
|
|
#define H264D_DBG_DPB_REF_ERR (0x00001000)
|
#define H264D_DBG_SLOT_FLUSH (0x00002000) //!< dpb buffer slot remain
|
#define H264D_DBG_SEI (0x00004000)
|
#define H264D_DBG_CALLBACK (0x00008000)
|
|
#define H264D_DBG_WRITE_ES_EN (0x00010000) //!< write input ts stream
|
#define H264D_DBG_FIELD_PAIRED (0x00020000)
|
#define H264D_DBG_DISCONTINUOUS (0x00040000)
|
|
extern RK_U32 rkv_h264d_parse_debug;
|
|
#define H264D_DBG(level, fmt, ...)\
|
do {\
|
if (level & rkv_h264d_parse_debug)\
|
{ mpp_log(fmt, ## __VA_ARGS__); }\
|
} while (0)
|
|
|
#define H264D_ERR(fmt, ...)\
|
do {\
|
if (H264D_DBG_ERROR & rkv_h264d_parse_debug)\
|
{ mpp_log(fmt, ## __VA_ARGS__); }\
|
} while (0)
|
|
#define ASSERT(val)\
|
do {\
|
if (H264D_DBG_ASSERT & rkv_h264d_parse_debug)\
|
{ mpp_assert(val); }\
|
} while (0)
|
|
#define H264D_WARNNING(fmt, ...)\
|
do {\
|
if (H264D_DBG_WARNNING & rkv_h264d_parse_debug)\
|
{ mpp_log(fmt, ## __VA_ARGS__); }\
|
} while (0)
|
|
#define H264D_LOG(fmt, ...)\
|
do {\
|
if (H264D_DBG_LOG & rkv_h264d_parse_debug)\
|
{ mpp_log(fmt, ## __VA_ARGS__); }\
|
} while (0)
|
|
|
//!< vaule check
|
#define VAL_CHECK(ret, val, ...)\
|
do{\
|
if (!(val)){\
|
ret = MPP_ERR_VALUE; \
|
H264D_WARNNING("value error(%d).\n", __LINE__); \
|
goto __FAILED; \
|
}} while (0)
|
//!< memory malloc check
|
#define MEM_CHECK(ret, val, ...)\
|
do{\
|
if (!(val)) {\
|
ret = MPP_ERR_MALLOC; \
|
H264D_ERR("malloc buffer error(%d).\n", __LINE__); \
|
goto __FAILED; \
|
}} while (0)
|
|
|
//!< input check
|
#define INP_CHECK(ret, val, ...)\
|
do{\
|
if ((val)) {\
|
ret = MPP_ERR_INIT; \
|
H264D_WARNNING("input empty(%d).\n", __LINE__); \
|
goto __RETURN; \
|
}} while (0)
|
//!< function return check
|
#define FUN_CHECK(val)\
|
do{\
|
if ((val) < 0) {\
|
H264D_WARNNING("Function error(%d).\n", __LINE__); \
|
goto __FAILED; \
|
}} while (0)
|
|
|
#define START_PREFIX_3BYTE 3
|
#define MAX_NUM_DPB_LAYERS 2 //!< must >= 2
|
#define MAX_LIST_SIZE 33 //!< for init list reorder
|
#define MAX_DPB_SIZE 16 //!< for prepare dpb info
|
#define MAX_REF_SIZE 32 //!< for prepare ref pic info
|
|
|
#define MAX_MARK_SIZE 35 //!< for malloc buffer mark, can be changed
|
|
#define HEAD_BUF_MAX_SIZE (1*1024*1024)
|
#define HEAD_BUF_ADD_SIZE (512)
|
#define NALU_BUF_MAX_SIZE (2*1024*1024)
|
#define NALU_BUF_ADD_SIZE (512)
|
#define SODB_BUF_MAX_SIZE (2*1024*1024)
|
#define SODB_BUF_ADD_SIZE (512)
|
|
//!< PPS parameters
|
#define MAXnum_slice_groups_minus1 8
|
typedef enum {
|
H264ScalingList4x4Length = 16,
|
H264ScalingList8x8Length = 64,
|
} ScalingListLength;
|
|
typedef enum {
|
STRUCT_NULL = 0,
|
TOP_FIELD = 0x1,
|
BOTTOM_FIELD = 0x2,
|
FRAME = 0x3,
|
STRUCT_MAX,
|
} PictureStructure; //!< New enum for field processing
|
|
typedef enum {
|
PIC_ERR_NULL = 0,
|
PIC_ERR_TOP = 0x1,
|
PIC_ERR_BOT = 0x2,
|
PIC_ERR_FRAME = 0x3,
|
PIC_ERR_WHOLE = 0x3,
|
PIC_ERR_MAX,
|
} PictureError;
|
|
typedef enum {
|
FIELD_ORDER_NULL,
|
FIELD_ORDER_TOP_FIRST,
|
FIELD_ORDER_BOT_FIRST,
|
FIELD_ORDER_SAME,
|
FIELD_ORDER_MAX
|
} FieldOrder;
|
|
//!< Field Coding Types
|
typedef enum {
|
FRAME_CODING = 0,
|
FIELD_CODING = 1,
|
ADAPTIVE_CODING = 2,
|
FRAME_MB_PAIR_CODING = 3
|
} CodingType;
|
|
typedef enum {
|
LIST_0 = 0,
|
LIST_1 = 1,
|
BI_PRED = 2,
|
BI_PRED_L0 = 3,
|
BI_PRED_L1 = 4
|
} ListType;
|
|
//!< NAL Unit structure
|
typedef struct h264_nalu_t {
|
RK_S32 startcodeprefix_len; //!< 4 for parameter sets and first slice in picture, 3 for everything else (suggested)
|
RK_U32 sodb_len; //!< Length of the NAL unit (Excluding the start code, which does not belong to the NALU)
|
RK_S32 forbidden_bit; //!< should be always FALSE
|
H264NaluType nalu_type; //!< NALU_TYPE_xxxx
|
H264NalRefIdcType nal_reference_idc; //!< NALU_PRIORITY_xxxx
|
RK_U8 *sodb_buf; //!< Data of the NAL unit (Excluding the start code, which does not belong to the NALU)
|
RK_U16 lost_packets; //!< true, if packet loss is detected, used in RTPNALU
|
//---- MVC extension
|
RK_S32 svc_extension_flag; //!< should be always 0, for MVC
|
RK_S32 non_idr_flag; //!< 0 = current is IDR
|
RK_S32 priority_id; //!< a lower value of priority_id specifies a higher priority
|
RK_S32 view_id; //!< view identifier for the NAL unit
|
RK_S32 temporal_id; //!< temporal identifier for the NAL unit
|
RK_S32 anchor_pic_flag; //!< anchor access unit
|
RK_S32 inter_view_flag; //!< inter-view prediction enable
|
RK_S32 reserved_one_bit; //!< shall be equal to 1
|
RK_S32 MVCExt_is_valid;
|
RK_S32 MVCExt_is_prefixNALU;
|
//------
|
RK_U8 ualu_header_bytes; //!< for rbsp start
|
RK_S32 used_bits;
|
|
} H264_Nalu_t;
|
|
typedef struct h264_nalu_svc_ext_t {
|
RK_U32 valid;
|
RK_U32 idr_flag;
|
RK_U32 priority_id;
|
RK_U32 no_inter_layer_pred_flag;
|
RK_U32 dependency_id;
|
RK_U32 quality_id;
|
RK_U32 temporal_id;
|
RK_U32 use_ref_base_pic_flag;
|
RK_U32 discardable_flag;
|
RK_U32 output_flag;
|
} H264_NaluSvcExt_t;
|
|
typedef struct h264_nalu_mvc_ext_t {
|
RK_U32 valid;
|
RK_U32 non_idr_flag;
|
RK_U32 priority_id;
|
RK_U32 view_id;
|
RK_U32 temporal_id;
|
RK_U32 anchor_pic_flag;
|
RK_U32 inter_view_flag;
|
RK_U32 reserved_one_bit;
|
RK_U32 iPrefixNALU;
|
} H264_NaluMvcExt_t;
|
|
//!< decoder refence picture marking
|
typedef struct h264_drpm_t {
|
RK_S32 memory_management_control_operation;
|
RK_S32 difference_of_pic_nums_minus1;
|
RK_S32 long_term_pic_num;
|
RK_S32 long_term_frame_idx;
|
RK_S32 max_long_term_frame_idx_plus1;
|
struct h264_drpm_t *Next;
|
} H264_DRPM_t;
|
|
typedef enum {
|
Mem_NULL = 0,
|
Mem_Malloc = 1,
|
Mem_Clone = 2,
|
Mem_UnPaired = 3,
|
Mem_TopOnly = 4,
|
Mem_BotOnly = 5,
|
Mem_Fake = 6,
|
Mem_Max,
|
} H264_Mem_type;
|
|
//!< decoder picture memory
|
typedef struct h264_dpb_mark_t {
|
RK_U8 top_used;
|
RK_U8 bot_used;
|
RK_U8 out_flag;
|
RK_U8 mark_idx;
|
MppFrame mframe;
|
RK_S32 slot_idx;
|
RK_S32 poc;
|
RK_S64 pts;
|
struct h264_store_pic_t *pic;
|
} H264_DpbMark_t;
|
|
//!< decoder picture buffer information
|
typedef struct h264_dpb_info_t {
|
RK_U8 colmv_is_used;
|
RK_S32 slot_index;
|
|
RK_S32 TOP_POC;
|
RK_S32 BOT_POC;
|
RK_U16 frame_num;
|
RK_U32 field_flag;
|
RK_U32 is_long_term;
|
RK_U32 is_ilt_flag;
|
RK_U32 long_term_frame_idx;
|
RK_U32 long_term_pic_num;
|
RK_U32 voidx;
|
RK_U32 view_id;
|
RK_U32 is_used;
|
RK_U32 top_valid;
|
RK_U32 bot_valid;
|
struct h264_store_pic_t *refpic;
|
|
RK_U32 have_same;
|
} H264_DpbInfo_t;
|
|
//!< refence picture information
|
typedef struct h264_refpic_info_t {
|
RK_U32 valid;
|
RK_S32 dpb_idx;
|
RK_S32 bottom_flag;
|
} H264_RefPicInfo_t;
|
|
//!< definition a picture (field or frame)
|
typedef struct h264_store_pic_t {
|
RK_S32 structure;
|
RK_S32 poc;
|
RK_S32 top_poc;
|
RK_S32 bottom_poc;
|
RK_S32 frame_poc;
|
RK_S32 ThisPOC;
|
RK_S32 pic_num;
|
RK_S32 long_term_pic_num;
|
RK_S32 long_term_frame_idx;
|
|
RK_U32 frame_num;
|
RK_U8 is_long_term;
|
RK_S32 used_for_reference;
|
RK_S32 is_output;
|
RK_S32 non_existing;
|
RK_S16 max_slice_id;
|
RK_S32 mb_aff_frame_flag;
|
RK_U32 PicWidthInMbs;
|
RK_U8 colmv_no_used_flag;
|
struct h264_store_pic_t *top_field; //!< for mb aff, if frame for referencing the top field
|
struct h264_store_pic_t *bottom_field; //!< for mb aff, if frame for referencing the bottom field
|
struct h264_store_pic_t *frame; //!< for mb aff, if field for referencing the combined frame
|
|
RK_S32 slice_type;
|
RK_S32 idr_flag;
|
RK_S32 no_output_of_prior_pics_flag;
|
RK_S32 long_term_reference_flag;
|
RK_S32 adaptive_ref_pic_buffering_flag;
|
RK_S32 chroma_format_idc;
|
RK_S32 frame_mbs_only_flag;
|
RK_S32 frame_cropping_flag;
|
|
RK_S32 frame_crop_left_offset;
|
RK_S32 frame_crop_right_offset;
|
RK_S32 frame_crop_top_offset;
|
RK_S32 frame_crop_bottom_offset;
|
RK_S32 width;
|
RK_S32 height;
|
RK_U32 width_after_crop;
|
RK_U32 height_after_crop;
|
|
struct h264_drpm_t *dec_ref_pic_marking_buffer; //!< stores the memory management control operations
|
RK_S32 proc_flag;
|
RK_S32 view_id;
|
RK_S32 inter_view_flag;
|
RK_S32 anchor_pic_flag;
|
RK_S32 iCodingType;
|
|
RK_S32 layer_id;
|
RK_U8 is_mmco_5;
|
RK_S32 poc_mmco5;
|
RK_S32 top_poc_mmco5;
|
RK_S32 bot_poc_mmco5;
|
RK_S32 combine_flag; // top && bottom field combined flag
|
H264_Mem_type mem_malloc_type;
|
struct h264_dpb_mark_t *mem_mark;
|
} H264_StorePic_t;
|
|
//!< Frame Stores for Decoded Picture Buffer
|
typedef struct h264_frame_store_t {
|
RK_S32 is_used; //!< 0=empty; 1=top; 2=bottom; 3=both fields (or frame)
|
RK_S32 is_reference; //!< 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used
|
RK_S32 is_long_term; //!< 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used
|
RK_S32 is_orig_reference; //!< original marking by nal_ref_idc: 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used
|
RK_S32 is_non_existent;
|
RK_S32 frame_num_wrap;
|
RK_S32 long_term_frame_idx;
|
RK_S32 is_output;
|
RK_S32 poc;
|
RK_S32 view_id;
|
RK_S32 inter_view_flag[2];
|
RK_S32 anchor_pic_flag[2];
|
RK_S32 layer_id;
|
RK_S32 slice_type;
|
RK_U32 frame_num;
|
RK_S32 structure;
|
RK_U32 is_directout;
|
struct h264_store_pic_t *frame;
|
struct h264_store_pic_t *top_field;
|
struct h264_store_pic_t *bottom_field;
|
|
} H264_FrameStore_t;
|
|
//!< decode picture buffer
|
typedef struct h264_dpb_buf_t {
|
RK_U32 size;
|
RK_U32 used_size;
|
RK_U32 ref_frames_in_buffer;
|
RK_U32 ltref_frames_in_buffer;
|
RK_U32 used_size_il;
|
|
RK_S32 poc_interval;
|
RK_S32 last_output_poc;
|
RK_S32 last_output_view_id;
|
RK_S32 max_long_term_pic_idx;
|
RK_S32 init_done;
|
RK_S32 num_ref_frames;
|
RK_S32 layer_id;
|
|
struct h264_frame_store_t **fs;
|
struct h264_frame_store_t **fs_ref;
|
struct h264_frame_store_t **fs_ltref;
|
struct h264_frame_store_t **fs_ilref; //!< inter-layer reference (for multi-layered codecs)
|
struct h264_frame_store_t *last_picture;
|
|
struct h264d_video_ctx_t *p_Vid;
|
} H264_DpbBuf_t;
|
|
//!< HRD
|
#define MAXIMUMVALUEOFcpb_cnt 32
|
typedef struct h264_hrd_t {
|
RK_U32 cpb_cnt_minus1; // ue(v)
|
RK_U32 bit_rate_scale; // u(4)
|
RK_U32 cpb_size_scale; // u(4)
|
RK_U32 bit_rate_value_minus1[MAXIMUMVALUEOFcpb_cnt]; // ue(v)
|
RK_U32 cpb_size_value_minus1[MAXIMUMVALUEOFcpb_cnt]; // ue(v)
|
RK_U32 cbr_flag[MAXIMUMVALUEOFcpb_cnt]; // u(1)
|
RK_U32 initial_cpb_removal_delay_length_minus1; // u(5)
|
RK_U32 cpb_removal_delay_length_minus1; // u(5)
|
RK_U32 dpb_output_delay_length_minus1; // u(5)
|
RK_U32 time_offset_length; // u(5)
|
} H264_HRD_t;
|
|
//!< VUI
|
typedef struct h264_vui_t {
|
RK_S32 aspect_ratio_info_present_flag; // u(1)
|
RK_U32 aspect_ratio_idc; // u(8)
|
RK_U16 sar_width; // u(16)
|
RK_U16 sar_height; // u(16)
|
RK_S32 overscan_info_present_flag; // u(1)
|
RK_S32 overscan_appropriate_flag; // u(1)
|
RK_S32 video_signal_type_present_flag; // u(1)
|
RK_U32 video_format; // u(3)
|
RK_S32 video_full_range_flag; // u(1)
|
RK_S32 colour_description_present_flag; // u(1)
|
RK_U32 colour_primaries; // u(8)
|
RK_U32 transfer_characteristics; // u(8)
|
RK_U32 matrix_coefficients; // u(8)
|
RK_S32 chroma_location_info_present_flag; // u(1)
|
RK_U32 chroma_sample_loc_type_top_field; // ue(v)
|
RK_U32 chroma_sample_loc_type_bottom_field; // ue(v)
|
RK_S32 timing_info_present_flag; // u(1)
|
RK_U32 num_units_in_tick; // u(32)
|
RK_U32 time_scale; // u(32)
|
RK_S32 fixed_frame_rate_flag; // u(1)
|
RK_S32 nal_hrd_parameters_present_flag; // u(1)
|
struct h264_hrd_t nal_hrd_parameters; // hrd_paramters_t
|
RK_S32 vcl_hrd_parameters_present_flag; // u(1)
|
struct h264_hrd_t vcl_hrd_parameters; // hrd_paramters_t
|
// if ((nal_hrd_parameters_present_flag || (vcl_hrd_parameters_present_flag))
|
RK_S32 low_delay_hrd_flag; // u(1)
|
RK_S32 pic_struct_present_flag; // u(1)
|
RK_S32 bitstream_restriction_flag; // u(1)
|
RK_S32 motion_vectors_over_pic_boundaries_flag; // u(1)
|
RK_U32 max_bytes_per_pic_denom; // ue(v)
|
RK_U32 max_bits_per_mb_denom; // ue(v)
|
RK_U32 log2_max_mv_length_vertical; // ue(v)
|
RK_U32 log2_max_mv_length_horizontal; // ue(v)
|
RK_U32 num_reorder_frames; // ue(v)
|
RK_U32 max_dec_frame_buffering; // ue(v)
|
} H264_VUI_t;
|
|
//!< MVC_VUI
|
typedef struct h264_mvc_vui_t {
|
RK_S32 num_ops_minus1;
|
RK_S8 *temporal_id;
|
RK_S32 *num_target_output_views_minus1;
|
RK_S32 **view_id;
|
RK_S8 *timing_info_present_flag;
|
RK_S32 *num_units_in_tick;
|
RK_S32 *time_scale;
|
RK_S8 *fixed_frame_rate_flag;
|
RK_S8 *nal_hrd_parameters_present_flag;
|
RK_S8 *vcl_hrd_parameters_present_flag;
|
RK_S8 *low_delay_hrd_flag;
|
RK_S8 *pic_struct_present_flag;
|
|
//hrd parameters;
|
RK_S8 cpb_cnt_minus1;
|
RK_S8 bit_rate_scale;
|
RK_S8 cpb_size_scale;
|
RK_S32 bit_rate_value_minus1[32];
|
RK_S32 cpb_size_value_minus1[32];
|
RK_S8 cbr_flag[32];
|
RK_S8 initial_cpb_removal_delay_length_minus1;
|
RK_S8 cpb_removal_delay_length_minus1;
|
RK_S8 dpb_output_delay_length_minus1;
|
RK_S8 time_offset_length;
|
} H264_mvcVUI_t;
|
|
//!< PREFIX
|
|
typedef struct h264_prefix_t {
|
RK_S32 Valid; // indicates the prefix set is valid
|
// nal svc syntax
|
RK_S32 store_ref_base_pic_flag; // u(1)
|
// svc base pic marking
|
RK_S32 adaptive_ref_base_pic_marking_mode_flag;
|
RK_S32 memory_management_base_control_operation;
|
RK_S32 difference_of_base_pic_nums_minus1;
|
RK_S32 long_term_base_pic_num;
|
|
RK_S32 additional_prefix_nal_unit_extension_flag; // u(1)
|
RK_S32 additional_prefix_nal_unit_extension_data_flag; // u(1)
|
} H264_PREFIX_t;
|
|
//!< SPS
|
#define MAXnum_ref_frames_in_POC_cycle 256
|
|
typedef struct h264_sps_t {
|
RK_S32 Valid; // indicates the parameter set is valid
|
|
RK_S32 profile_idc; // u(8)
|
RK_S32 constrained_set0_flag; // u(1)
|
RK_S32 constrained_set1_flag; // u(1)
|
RK_S32 constrained_set2_flag; // u(1)
|
RK_S32 constrained_set3_flag; // u(1)
|
RK_S32 constrained_set4_flag; // u(1)
|
RK_S32 constrained_set5_flag; // u(2)
|
|
RK_S32 level_idc; // u(8)
|
RK_S32 seq_parameter_set_id; // ue(v)
|
RK_S32 chroma_format_idc; // ue(v)
|
|
RK_S32 seq_scaling_matrix_present_flag; // u(1)
|
RK_S32 seq_scaling_list_present_flag[12]; // u(1)
|
RK_S32 ScalingList4x4[6][H264ScalingList4x4Length]; // se(v)
|
RK_S32 ScalingList8x8[6][H264ScalingList8x8Length]; // se(v)
|
RK_S32 UseDefaultScalingMatrix4x4Flag[6];
|
RK_S32 UseDefaultScalingMatrix8x8Flag[6];
|
|
RK_S32 bit_depth_luma_minus8; // ue(v)
|
RK_S32 bit_depth_chroma_minus8; // ue(v)
|
RK_S32 log2_max_frame_num_minus4; // ue(v)
|
RK_S32 pic_order_cnt_type;
|
// if( pic_order_cnt_type == 0 )
|
RK_S32 log2_max_pic_order_cnt_lsb_minus4; // ue(v)
|
// else if( pic_order_cnt_type == 1 )
|
RK_S32 delta_pic_order_always_zero_flag; // u(1)
|
RK_S32 offset_for_non_ref_pic; // se(v)
|
RK_S32 offset_for_top_to_bottom_field; // se(v)
|
RK_S32 num_ref_frames_in_pic_order_cnt_cycle; // ue(v)
|
// for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ )
|
RK_S32 offset_for_ref_frame[MAXnum_ref_frames_in_POC_cycle]; // se(v)
|
RK_S32 max_num_ref_frames; // ue(v)
|
RK_S32 gaps_in_frame_num_value_allowed_flag; // u(1)
|
RK_S32 pic_width_in_mbs_minus1; // ue(v)
|
RK_S32 pic_height_in_map_units_minus1; // ue(v)
|
RK_S32 frame_mbs_only_flag; // u(1)
|
// if( !frame_mbs_only_flag )
|
RK_S32 mb_adaptive_frame_field_flag; // u(1)
|
RK_S32 direct_8x8_inference_flag; // u(1)
|
RK_S32 frame_cropping_flag; // u(1)
|
RK_S32 frame_crop_left_offset; // ue(v)
|
RK_S32 frame_crop_right_offset; // ue(v)
|
RK_S32 frame_crop_top_offset; // ue(v)
|
RK_S32 frame_crop_bottom_offset; // ue(v)
|
RK_S32 vui_parameters_present_flag; // u(1)
|
struct h264_vui_t vui_seq_parameters; // vui_seq_parameters_t
|
RK_S32 separate_colour_plane_flag; // u(1)
|
RK_S32 max_dec_frame_buffering;
|
RK_S32 qpprime_y_zero_transform_bypass_flag;
|
//----
|
RK_S32 expected_delta_per_pic_order_cnt_cycle;
|
|
} H264_SPS_t;
|
|
//!< subSPS
|
typedef struct h264_subsps_t {
|
struct h264_sps_t sps;
|
|
RK_S32 bit_equal_to_one;
|
RK_S32 num_views_minus1;
|
RK_S32 *view_id;
|
RK_S32 *num_anchor_refs_l0;
|
RK_S32 **anchor_ref_l0;
|
RK_S32 *num_anchor_refs_l1;
|
RK_S32 **anchor_ref_l1;
|
|
RK_S32 *num_non_anchor_refs_l0;
|
RK_S32 **non_anchor_ref_l0;
|
RK_S32 *num_non_anchor_refs_l1;
|
RK_S32 **non_anchor_ref_l1;
|
|
RK_S32 num_level_values_signalled_minus1;
|
RK_S32 *level_idc;
|
RK_S32 *num_applicable_ops_minus1;
|
RK_S32 **applicable_op_temporal_id;
|
RK_S32 **applicable_op_num_target_views_minus1;
|
RK_S32 ***applicable_op_target_view_id;
|
RK_S32 **applicable_op_num_views_minus1;
|
|
RK_S32 mvc_vui_parameters_present_flag;
|
RK_S32 Valid; // indicates the parameter set is valid
|
|
} H264_subSPS_t;
|
|
//!< PPS
|
|
typedef struct h264_pps_t {
|
RK_S32 Valid; // indicates the parameter set is valid
|
RK_S32 pic_parameter_set_id; // ue(v)
|
RK_S32 seq_parameter_set_id; // ue(v)
|
RK_S32 entropy_coding_mode_flag; // u(1)
|
RK_S32 transform_8x8_mode_flag; // u(1)
|
|
RK_S32 pic_scaling_matrix_present_flag; // u(1)
|
RK_S32 pic_scaling_list_present_flag[12]; // u(1)
|
RK_S32 ScalingList4x4[6][H264ScalingList4x4Length]; // se(v)
|
RK_S32 ScalingList8x8[6][H264ScalingList8x8Length]; // se(v)
|
RK_S32 UseDefaultScalingMatrix4x4Flag[6];
|
RK_S32 UseDefaultScalingMatrix8x8Flag[6];
|
|
// if( pic_order_cnt_type < 2 ) in the sequence parameter set
|
RK_S32 bottom_field_pic_order_in_frame_present_flag; // u(1)
|
RK_S32 num_slice_groups_minus1; // ue(v)
|
RK_S32 slice_group_map_type; // ue(v)
|
// if( slice_group_map_type = = 0 )
|
RK_S32 run_length_minus1[MAXnum_slice_groups_minus1]; // ue(v)
|
// else if( slice_group_map_type = = 2 )
|
RK_S32 top_left[MAXnum_slice_groups_minus1]; // ue(v)
|
RK_S32 bottom_right[MAXnum_slice_groups_minus1]; // ue(v)
|
// else if( slice_group_map_type = = 3 || 4 || 5
|
RK_S32 slice_group_change_direction_flag; // u(1)
|
RK_S32 slice_group_change_rate_minus1; // ue(v)
|
// else if( slice_group_map_type = = 6 )
|
RK_S32 pic_size_in_map_units_minus1; // ue(v)
|
RK_U8 *slice_group_id; // complete MBAmap u(v)
|
|
RK_S32 num_ref_idx_l0_default_active_minus1; // ue(v)
|
RK_S32 num_ref_idx_l1_default_active_minus1; // ue(v)
|
RK_S32 weighted_pred_flag; // u(1)
|
RK_S32 weighted_bipred_idc; // u(2)
|
RK_S32 pic_init_qp_minus26; // se(v)
|
RK_S32 pic_init_qs_minus26; // se(v)
|
RK_S32 chroma_qp_index_offset; // se(v)
|
|
RK_S32 cb_qp_index_offset; // se(v)
|
RK_S32 cr_qp_index_offset; // se(v)
|
RK_S32 second_chroma_qp_index_offset; // se(v)
|
|
RK_S32 deblocking_filter_control_present_flag; // u(1)
|
RK_S32 constrained_intra_pred_flag; // u(1)
|
RK_S32 redundant_pic_cnt_present_flag; // u(1)
|
RK_S32 vui_pic_parameters_flag; // u(1)
|
RK_S32 scaleing_list_enable_flag;
|
RK_U32 scaleing_list_address;
|
|
} H264_PPS_t;
|
|
//!< MVC_scalable_nesting
|
typedef struct {
|
RK_S32 operation_point_flag;
|
RK_S32 all_view_components_in_au_flag;
|
RK_S32 num_view_components_minus1;
|
RK_S32 *sei_view_id;
|
RK_S32 num_view_components_op_minus1;
|
RK_S32 *sei_op_view_id;
|
RK_S32 sei_op_temporal_id;
|
RK_S32 Valid;
|
} MVC_scalable_nesting_t;
|
|
//!< MVC_scalability_info
|
typedef struct {
|
RK_S32 num_operation_points_minus1;
|
RK_S32 *operation_point_id;
|
RK_S32 *priority_id;
|
RK_S32 *temporal_id;
|
RK_S32 *num_target_output_views_minus1;
|
RK_S32 **view_id;
|
RK_S32 *profile_level_info_present_flag;
|
RK_S32 *bitrate_info_present_flag;
|
RK_S32 *frm_rate_info_present_flag;
|
|
RK_S32 *view_dependency_info_present_flag;
|
RK_S32 *parameter_sets_info_present_flag;
|
RK_S32 *bitstream_restriction_info_present_flag;
|
RK_S32 *op_profile_level_idc;
|
RK_S32 *avg_bitrate;
|
RK_S32 *max_bitrate;
|
RK_S32 *max_bitrate_calc_window;
|
RK_S32 *constant_frm_rate_idc;
|
RK_S32 *avg_frm_rate;
|
RK_S32 *num_directly_dependent_views;
|
RK_S32 **directly_dependent_view_id;
|
RK_S32 *view_dependency_info_src_op_id;
|
RK_S32 *num_seq_parameter_sets;
|
RK_S32 **seq_parameter_set_id_delta;
|
RK_S32 *num_subset_seq_parameter_sets;
|
RK_S32 **subset_seq_parameter_set_id_delta;
|
RK_S32 *num_pic_parameter_sets_minus1;
|
RK_S32 **pic_parameter_set_id_delta;
|
RK_S32 *parameter_sets_info_src_op_id;
|
RK_S32 *motion_vectors_over_pic_boundaries_flag;
|
RK_S32 *max_bytes_per_pic_denom;
|
RK_S32 *max_bits_per_mb_denom;
|
RK_S32 *log2_max_mv_length_horizontal;
|
RK_S32 *log2_max_mv_length_vertical;
|
RK_S32 *max_num_reorder_frames;
|
RK_S32 *max_dec_frame_buffering;
|
} MVC_scalability_info_t;
|
|
typedef struct h264_sei_pic_timing_t {
|
RK_S32 cpb_removal_delay;
|
RK_S32 dpb_output_delay;
|
RK_S32 pic_struct;
|
RK_S32 clock_timestamp_flag[3];
|
RK_S32 clock_timestamp[3];
|
RK_S32 ct_type[3];
|
RK_S32 nuit_field_based_flag[3];
|
RK_S32 counting_type[3];
|
RK_S32 full_timestamp_flag[3];
|
RK_S32 discontinuity_flag[3];
|
RK_S32 cnt_dropped_flag[3];
|
RK_S32 n_frames[3];
|
RK_S32 seconds_flag[3];
|
RK_S32 seconds_value[3];
|
RK_S32 minutes_flag[3];
|
RK_S32 minutes_value[3];
|
RK_S32 hours_flag[3];
|
RK_S32 hours_value[3];
|
RK_S32 time_offset[3];
|
} H264_SEI_PIC_TIMING_t;
|
|
//!< SEI struct
|
typedef struct h264_sei_t {
|
RK_S32 type;
|
RK_S32 payload_size;
|
struct {
|
RK_U32 recovery_frame_cnt;
|
RK_S32 exact_match_flag;
|
RK_S32 broken_link_flag;
|
RK_S32 changing_slice_group_idc;
|
} recovery_point;
|
struct {
|
RK_S32 operation_point_flag;
|
//-- for adding
|
} scalable_nesting;
|
|
RK_U32 user_data_DivX_flag;
|
// Placeholder; in future more supported types will contribute to more
|
//---- follow is used in other parts
|
RK_S32 mvc_scalable_nesting_flag;
|
RK_S32 seq_parameter_set_id;
|
|
H264_SEI_PIC_TIMING_t pic_timing;
|
|
struct h264_dec_ctx_t *p_Dec;
|
} H264_SEI_t;
|
|
//!< SLICE
|
typedef struct h264_slice_t {
|
struct h264_nalu_svc_ext_t svcExt;
|
struct h264_nalu_mvc_ext_t mvcExt;
|
//--- slice property;
|
RK_S32 layer_id;
|
RK_S32 idr_flag;
|
RK_S32 idr_pic_id;
|
RK_S32 nal_reference_idc; //!< nal_reference_idc from NAL unit
|
RK_U32 start_mb_nr; //!< MUST be set by NAL even in case of ei_flag == 1
|
RK_S32 slice_type; //!< slice type
|
RK_S32 pic_parameter_set_id;
|
RK_S32 colour_plane_id;
|
RK_S32 frame_num;
|
RK_S32 field_pic_flag;
|
RK_S32 bottom_field_flag;
|
RK_S32 structure;
|
RK_S32 mb_aff_frame_flag;
|
RK_S32 pic_order_cnt_lsb; // for poc mode 0
|
RK_S32 delta_pic_order_cnt_bottom;
|
RK_S32 delta_pic_order_cnt[2]; // for poc mode 1
|
RK_U32 poc_used_bitlen;
|
RK_S32 redundant_pic_cnt;
|
RK_S32 direct_spatial_mv_pred_flag;
|
RK_S32 num_ref_idx_active[2]; //!< number of available list references
|
RK_S32 num_ref_idx_override_flag;
|
RK_S32 ref_pic_list_reordering_flag[2];
|
RK_S32 *modification_of_pic_nums_idc[2];
|
RK_S32 *abs_diff_pic_num_minus1[2];
|
RK_S32 *long_term_pic_idx[2];
|
RK_S32 *abs_diff_view_idx_minus1[2];
|
struct h264_drpm_t *dec_ref_pic_marking_buffer;
|
RK_U32 drpm_used_bitlen;
|
RK_S32 no_output_of_prior_pics_flag;
|
RK_S32 long_term_reference_flag;
|
RK_S32 adaptive_ref_pic_buffering_flag;
|
RK_U32 model_number;
|
RK_S32 slice_qp_delta;
|
RK_S32 qp;
|
RK_S32 current_mb_nr;
|
RK_S32 ThisPOC;
|
RK_S32 toppoc; //poc for this top field
|
RK_S32 bottompoc; //poc of bottom field of frame
|
RK_S32 framepoc; //poc of this frame
|
RK_U32 AbsFrameNum;
|
RK_S32 PicOrderCntMsb;
|
//RK_S32 new_frame_flag;
|
struct h264_sps_t *active_sps;
|
struct h264_subsps_t *active_subsps;
|
struct h264_pps_t *active_pps;
|
|
struct h264_dpb_buf_t *p_Dpb;
|
struct h264_dpb_buf_t *p_Dpb_layer[MAX_NUM_DPB_LAYERS];
|
//----
|
RK_S32 listinterviewidx0;
|
RK_S32 listinterviewidx1;
|
|
RK_U8 listXsizeP[2];
|
RK_U8 listXsizeB[2];
|
|
struct h264_frame_store_t **fs_listinterview0;
|
struct h264_frame_store_t **fs_listinterview1;
|
//struct h264_store_pic_t **listX[6];
|
struct h264_store_pic_t **listP[MAX_NUM_DPB_LAYERS];
|
struct h264_store_pic_t **listB[MAX_NUM_DPB_LAYERS];
|
|
//---- MVC extend ----
|
RK_S32 svc_extension_flag; // should be always 0, for MVC
|
RK_S32 non_idr_flag; // 0 = current is IDR
|
RK_S32 priority_id; // a lower value of priority_id specifies a higher priority
|
RK_S32 view_id; // view identifier for the NAL unit
|
RK_S32 temporal_id; // temporal identifier for the NAL unit
|
RK_S32 anchor_pic_flag; // anchor access unit
|
RK_S32 inter_view_flag; // inter-view prediction enable
|
RK_S32 reserved_one_bit; // shall be equal to 1
|
RK_S32 MVCExt_is_valid;
|
RK_S32 MVCExt_is_prefixNALU;
|
|
struct h264_dec_ctx_t *p_Dec; // H264_DecCtx_t
|
struct h264d_input_ctx_t *p_Inp; // H264_InputParameters
|
struct h264d_cur_ctx_t *p_Cur; // H264_CurParameters
|
struct h264d_video_ctx_t *p_Vid;
|
} H264_SLICE_t;
|
|
//!< Old slice parameter for check new frame
|
typedef struct h264_old_slice_par_t {
|
RK_U32 current_mb_nr;
|
RK_U8 field_pic_flag;
|
RK_U8 frame_num;
|
RK_S32 nal_ref_idc;
|
RK_U8 pic_oder_cnt_lsb;
|
RK_S32 delta_pic_oder_cnt_bottom;
|
RK_S32 delta_pic_order_cnt[2];
|
RK_U8 bottom_field_flag;
|
RK_U8 idr_flag;
|
RK_S32 idr_pic_id;
|
RK_S32 pps_id;
|
RK_S32 view_id;
|
RK_S32 inter_view_flag;
|
RK_S32 anchor_pic_flag;
|
RK_S32 layer_id;
|
} H264_OldSlice_t;
|
|
//!< DXVA context
|
#define MAX_SLICE_NUM (20)
|
#define ADD_SLICE_SIZE (5)
|
#define BITSTREAM_MAX_SIZE (2*1024*1024)
|
#define BITSTREAM_ADD_SIZE (512)
|
#define SYNTAX_BUF_SIZE (5)
|
typedef struct h264d_dxva_ctx_t {
|
RK_U8 cfgBitstrmRaw;
|
struct _DXVA_PicParams_H264_MVC pp;
|
struct _DXVA_Qmatrix_H264 qm;
|
RK_U32 max_slice_size;
|
RK_U32 slice_count;
|
struct _DXVA_Slice_H264_Long *slice_long; //!< MAX_SLICES
|
RK_U8 *bitstream;
|
RK_U32 max_strm_size;
|
RK_U32 strm_offset;
|
struct h264d_syntax_t syn;
|
struct h264_dec_ctx_t *p_Dec;
|
} H264dDxvaCtx_t;
|
|
//!< input parameter
|
typedef struct h264d_input_ctx_t {
|
struct h264_dec_ctx_t *p_Dec;
|
struct h264d_cur_ctx_t *p_Cur; //!< current parameters, use in read nalu
|
struct h264d_video_ctx_t *p_Vid; //!< parameters for video decoder
|
enum mpp_decmtd_type dec_mtd;
|
|
//!< input data
|
RK_U8 *in_buf;
|
size_t in_length;
|
RK_U32 pkt_eos;
|
|
MppPacket in_pkt;
|
|
RK_S64 in_pts;
|
RK_S64 in_dts;
|
RK_U8 has_get_eos;
|
RK_U32 mvc_disable;
|
//!< output data
|
RK_U8 task_valid;
|
RK_U32 task_eos;
|
|
//!< have extradata
|
RK_U8 is_nalff;
|
RK_U8 profile;
|
RK_U8 level;
|
RK_U32 nal_size;
|
RK_S32 sps_num;
|
RK_S32 pps_num;
|
//!< write stream
|
char fname[2][512];
|
FILE *fp;
|
RK_U8 *spspps_buf;
|
RK_U32 spspps_size;
|
RK_U32 spspps_len;
|
RK_U32 spspps_offset;
|
RK_U32 spspps_update_flag;
|
|
} H264dInputCtx_t;
|
|
|
//!< current stream
|
typedef struct h264d_curstrm_t {
|
RK_U32 nalu_offset; //!< The offset of the input stream
|
RK_U32 nalu_max_size; //!< Cur Unit Buffer size
|
RK_U8 *curdata;
|
|
RK_S32 nalu_type;
|
RK_U32 nalu_len;
|
RK_U8 *nalu_buf; //!< store read nalu data
|
|
RK_U32 head_offset;
|
RK_U32 head_max_size;
|
RK_U8 *head_buf; //!< store header data, sps/pps/slice header
|
|
RK_U32 prefixdata;
|
RK_U8 startcode_found;
|
RK_U8 endcode_found;
|
|
} H264dCurStream_t;
|
|
#define MAX_REORDER_TIMES 33 // MVC: 2 * H264_MAX_REFS + 1
|
#define MAX_MARKING_TIMES 35
|
//!< current parameters
|
typedef struct h264d_cur_ctx_t {
|
struct h264_sps_t sps;
|
struct h264_subsps_t *subsps;
|
struct h264_pps_t pps;
|
struct h264_prefix_t prefix;
|
struct h264_sei_t *sei;
|
struct h264_nalu_t nalu;
|
struct bitread_ctx_t bitctx; //!< for control bit_read
|
struct h264d_curstrm_t strm;
|
struct h264_slice_t slice;
|
|
struct h264_store_pic_t **listP[MAX_NUM_DPB_LAYERS];
|
struct h264_store_pic_t **listB[MAX_NUM_DPB_LAYERS];
|
struct h264d_input_ctx_t *p_Inp;
|
struct h264_dec_ctx_t *p_Dec;
|
struct h264d_video_ctx_t *p_Vid; //!< parameters for video decoder
|
|
RK_S64 last_pts;
|
RK_S64 last_dts;
|
RK_S64 curr_pts;
|
RK_S64 curr_dts;
|
//!< malloc buffer for current slice
|
RK_S32 modification_of_pic_nums_idc[2][MAX_REORDER_TIMES];
|
RK_S32 abs_diff_pic_num_minus1[2][MAX_REORDER_TIMES];
|
RK_S32 long_term_pic_idx[2][MAX_REORDER_TIMES];
|
RK_S32 abs_diff_view_idx_minus1[2][MAX_REORDER_TIMES];
|
|
struct h264_drpm_t *dec_ref_pic_marking_buffer[MAX_MARKING_TIMES];
|
} H264dCurCtx_t;
|
|
//!< parameters for video decoder
|
typedef struct h264d_video_ctx_t {
|
struct h264_sps_t *spsSet[MAXSPS]; //!< MAXSPS, all sps storage
|
struct h264_subsps_t *subspsSet[MAXSPS]; //!< MAXSPS, all subpps storage
|
struct h264_pps_t *ppsSet[MAXPPS]; //!< MAXPPS, all pps storage
|
struct h264_sps_t *active_sps;
|
struct h264_subsps_t *active_subsps;
|
struct h264_pps_t *active_pps;
|
struct h264_dec_ctx_t *p_Dec; //!< H264_DecCtx_t
|
struct h264d_input_ctx_t *p_Inp; //!< H264_InputParameters
|
struct h264d_cur_ctx_t *p_Cur; //!< H264_CurParameters
|
struct h264_dpb_buf_t *p_Dpb_layer[MAX_NUM_DPB_LAYERS];
|
struct h264_store_pic_t *dec_pic; //!< current decoder picture
|
struct h264_store_pic_t *last_pic;
|
|
struct h264_store_pic_t *no_ref_pic; //!< no reference picture
|
struct h264_frame_store_t out_buffer;
|
struct h264_dpb_mark_t *active_dpb_mark[MAX_NUM_DPB_LAYERS]; //!< acitve_dpb_memory
|
|
struct h264_store_pic_t old_pic;
|
|
RK_S32 *qmatrix[12]; //!< scanlist pointer
|
RK_U32 stream_size;
|
RK_S32 last_toppoc[MAX_NUM_DPB_LAYERS];
|
RK_S32 last_bottompoc[MAX_NUM_DPB_LAYERS];
|
RK_S32 last_framepoc[MAX_NUM_DPB_LAYERS];
|
RK_S32 last_thispoc[MAX_NUM_DPB_LAYERS];
|
//!<
|
RK_S32 profile_idc; // u(8)
|
RK_S32 slice_type;
|
RK_S32 structure;
|
RK_S32 iNumOfSlicesDecoded;
|
RK_S32 no_output_of_prior_pics_flag;
|
RK_S32 last_has_mmco_5;
|
RK_S32 max_frame_num;
|
RK_S32 active_sps_id[MAX_NUM_DPB_LAYERS];
|
RK_U32 PicWidthInMbs;
|
RK_U32 FrameHeightInMbs;
|
RK_S32 frame_mbs_only_flag;
|
RK_S32 yuv_format;
|
RK_U32 bit_depth_chroma;
|
RK_U32 bit_depth_luma;
|
RK_S32 width;
|
RK_S32 height;
|
RK_U32 width_after_crop;
|
RK_U32 height_after_crop;
|
RK_S32 width_cr; //!< width chroma
|
RK_S32 height_cr; //!< height chroma
|
RK_S32 last_pic_structure;
|
RK_S32 last_pic_bottom_field;
|
RK_S32 last_pic_width_in_mbs_minus1[2];
|
RK_S32 last_pic_height_in_map_units_minus1[2];
|
RK_S32 last_profile_idc[2];
|
RK_S32 last_level_idc[2];
|
RK_S32 last_sps_id;
|
RK_S32 last_pps_id;
|
RK_S32 PrevPicOrderCntMsb;
|
RK_S32 PrevPicOrderCntLsb;
|
RK_U32 PreviousFrameNum;
|
RK_U32 FrameNumOffset;
|
RK_S32 PreviousFrameNumOffset;
|
RK_S32 ExpectedDeltaPerPicOrderCntCycle;
|
RK_S32 ExpectedPicOrderCnt;
|
RK_S32 PicOrderCntCycleCnt;
|
RK_S32 FrameNumInPicOrderCntCycle;
|
RK_S32 ThisPOC;
|
RK_S32 type;
|
//!< for control running
|
RK_S32 have_outpicture_flag;
|
RK_S32 exit_picture_flag;
|
RK_S32 active_mvc_sps_flag;
|
//!< for error tolerance
|
RK_U32 g_framecnt;
|
RK_U32 dpb_size[MAX_NUM_DPB_LAYERS];
|
|
MppMemPool pic_st;
|
//!< spspps data update
|
RK_U32 spspps_update;
|
} H264dVideoCtx_t;
|
|
typedef struct h264d_mem_t {
|
struct h264_dpb_mark_t dpb_mark[MAX_MARK_SIZE]; //!< for fpga register check, dpb mark
|
struct h264_dpb_info_t dpb_info[MAX_DPB_SIZE]; //!< 16
|
struct h264_refpic_info_t refpic_info_p[MAX_REF_SIZE]; //!< 32
|
struct h264_refpic_info_t refpic_info_b[2][MAX_REF_SIZE]; //!< [2][32]
|
struct h264d_dxva_ctx_t dxva_ctx;
|
} H264_DecMem_t;
|
|
//!< nalu state used in read nalu
|
typedef enum nalu_state_tpye {
|
NALU_NULL = 0,
|
|
StreamError,
|
HaveNoStream,
|
NaluNotSupport,
|
ReadNaluError,
|
StartofNalu,
|
EndofStream,
|
MvcDisAble,
|
MidOfNalu,
|
EndOfNalu,
|
StartOfPicture,
|
StartOfSlice,
|
SkipNALU,
|
NALU_SPS,
|
NALU_SubSPS,
|
NALU_PPS,
|
NALU_SEI,
|
|
NALU_MAX,
|
} NALU_STATUS;
|
|
//!< slice state used in parse loop
|
typedef enum slice_state_type {
|
SliceSTATE_NULL = 0,
|
SliceSTATE_IDLE,
|
|
SliceSTATE_ResetSlice,
|
SliceSTATE_ReadNalu,
|
SliceSTATE_ParseNalu,
|
SliceSTATE_InitPicture,
|
////SliceSTATE_InitSlice,
|
SliceSTATE_GetSliceData,
|
//SliceSTATE_RegisterOneSlice,
|
SliceSTATE_RegisterOneFrame,
|
SliceSTATE_Error,
|
SliceSTATE_MAX,
|
|
} SLICE_STATUS;
|
|
typedef struct h264_err_ctx_t {
|
RK_U32 un_spt_flag;
|
RK_U32 cur_err_flag; //!< current decoded picture error
|
RK_U32 used_ref_flag;
|
RK_U32 dpb_err_flag; //!< dpb storage had error
|
|
RK_U32 i_slice_no;
|
RK_S32 first_iframe_poc;
|
} H264dErrCtx_t;
|
//!< decoder video parameter
|
typedef struct h264_dec_ctx_t {
|
struct h264d_mem_t *mem;
|
struct h264_dpb_mark_t *dpb_mark; //!< for write out, MAX_DPB_SIZE
|
struct h264_dpb_info_t *dpb_info; //!< 16
|
struct h264_refpic_info_t *refpic_info_p; //!< 32
|
struct h264_refpic_info_t *refpic_info_b[2]; //!< [2][32]
|
struct h264d_dxva_ctx_t *dxva_ctx;
|
|
struct h264d_input_ctx_t *p_Inp;
|
struct h264d_cur_ctx_t *p_Cur; //!< current parameters, use in read nalu
|
struct h264d_video_ctx_t *p_Vid; //!< parameters for video decoder
|
RK_U32 spt_decode_mtds; //!< support decoder methods
|
NALU_STATUS nalu_ret; //!< current nalu state
|
SLICE_STATUS next_state; //!< RKV_SLICE_STATUS
|
RK_U8 have_slice_data;
|
RK_U8 is_new_frame;
|
RK_U8 is_parser_end;
|
RK_U8 svc_valid;
|
RK_U8 mvc_valid;
|
//!< add
|
MppBufSlots frame_slots; //!< corresponding to dpb_mark
|
MppBufSlots packet_slots;
|
MppDecCfgSet *cfg;
|
const MppDecHwCap *hw_info;
|
|
MppFrame curframe;
|
MppPacket task_pkt;
|
|
RK_S64 task_pts;
|
RK_U32 task_eos;
|
HalDecTask *in_task;
|
RK_S32 last_frame_slot_idx;
|
RK_U32 immediate_out;
|
struct h264_err_ctx_t errctx;
|
} H264_DecCtx_t;
|
|
#endif /* __H264D_GLOBAL_H__ */
|