/*
|
* 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.
|
*/
|
|
/*
|
* @file m2vd_parser.h
|
* @brief
|
* @author lks(lks@rock-chips.com)
|
|
* @version 1.0.0
|
* @history
|
* 2015.7.15 : Create
|
*/
|
|
#ifndef __M2VD_PARSER_H__
|
#define __M2VD_PARSER_H__
|
|
#include "mpp_mem.h"
|
#include "mpp_bitread.h"
|
|
#include "parser_api.h"
|
#include "m2vd_syntax.h"
|
#include "m2vd_com.h"
|
|
#define M2VD_SKIP_ERROR_FRAME_EN 1
|
#define M2VD_DEC_OK 0
|
#define M2VD_IFNO_CHG 0x10
|
#define M2VD_DEC_UNSURPORT -1
|
#define M2VD_DEC_MEMORY_FAIL -2
|
#define M2VD_DEC_FILE_END -3
|
#define M2VD_HW_DEC_UNKNOW_ERROR -4
|
#define M2VD_DEC_PICHEAD_OK 1
|
#define M2VD_DEC_STREAM_END 2
|
|
#define TEMP_DBG_FM 0
|
|
|
#define PICTURE_START_CODE 0x100
|
#define SLICE_START_CODE_MIN 0x101
|
#define SLICE_START_CODE_MAX 0x1AF
|
#define USER_DATA_START_CODE 0x1B2
|
#define SEQUENCE_HEADER_CODE 0x1B3
|
#define SEQUENCE_ERROR_CODE 0x1B4
|
#define EXTENSION_START_CODE 0x1B5
|
#define SEQUENCE_END_CODE 0x1B7
|
#define GROUP_START_CODE 0x1B8
|
#define SYSTEM_START_CODE_MIN 0x1B9
|
#define SYSTEM_START_CODE_MAX 0x1FF
|
|
#define ISO_END_CODE 0x1B9
|
#define PACK_START_CODE 0x1BA
|
#define SYSTEM_START_CODE 0x1BB
|
|
#define VIDEO_ELEMENTARY_STREAM 0x1e0
|
#define NO_MORE_STREAM 0xffffffff
|
|
#define SEQUENCE_EXTENSION_ID 1
|
#define SEQUENCE_DISPLAY_EXTENSION_ID 2
|
#define QUANT_MATRIX_EXTENSION_ID 3
|
#define COPYRIGHT_EXTENSION_ID 4
|
#define SEQUENCE_SCALABLE_EXTENSION_ID 5
|
#define PICTURE_DISPLAY_EXTENSION_ID 7
|
#define PICTURE_CODING_EXTENSION_ID 8
|
#define PICTURE_SPATIAL_SCALABLE_EXTENSION_ID 9
|
#define PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID 10
|
|
|
typedef enum M2VDPicCodingType_e {
|
M2VD_CODING_TYPE_I = 1,
|
M2VD_CODING_TYPE_P = 2,
|
M2VD_CODING_TYPE_B = 3,
|
M2VD_CODING_TYPE_D = 4
|
} M2VDPicCodingType;
|
|
typedef enum M2VDPicStruct_e {
|
M2VD_PIC_STRUCT_TOP_FIELD = 1,
|
M2VD_PIC_STRUCT_BOTTOM_FIELD = 2,
|
M2VD_PIC_STRUCT_FRAME = 3
|
} M2VDPicStruct;
|
|
#define M2VD_DBG_FILE_NUM 1
|
#define M2VD_DBG_FILE_W 1
|
#define M2VD_BUF_SIZE_BITMEM (512 * 1024)
|
#define M2VD_BUF_SIZE_QPTAB (256)
|
#define M2V_OUT_FLAG 0x1;
|
|
typedef enum M2VDBufGrpIdx_t {
|
M2VD_BUF_GRP_BITMEM,
|
M2VD_BUF_GRP_QPTAB,
|
M2VD_BUF_GRP_BUTT,
|
} M2VDBufGrpIdx;
|
|
typedef struct M2VFrameHead_t {
|
RK_U32 frameNumber;
|
RK_U32 tr;
|
RK_U32 picCodingType;
|
RK_U32 totalMbInFrame;
|
RK_U32 frameWidth; /* in macro blocks */
|
RK_U32 frameHeight; /* in macro blocks */
|
RK_U32 mb_width;
|
RK_U32 mb_height;
|
RK_U32 vlcSet;
|
RK_U32 qp;
|
RK_U32 frame_codelen;
|
// VPU_FRAME *frame_space;
|
MppFrame f;
|
RK_U32 flags;
|
RK_S32 slot_index;
|
//RK_U32 error_info;
|
} M2VDFrameHead;
|
|
|
/* ISO/IEC 13818-2 section 6.2.2.1: sequence_header() */
|
typedef struct M2VDHeadSeq_t {
|
RK_U32 decode_width; //horizontal_size_value
|
RK_U32 decode_height; //vertical_size_value
|
RK_S32 aspect_ratio_information;
|
RK_S32 frame_rate_code;
|
RK_S32 bit_rate_value;
|
RK_S32 vbv_buffer_size;
|
RK_S32 constrained_parameters_flag;
|
RK_U32 load_intra_quantizer_matrix; //[TEMP]
|
RK_U32 load_non_intra_quantizer_matrix; //[TEMP]
|
RK_U8 *pIntra_table; //intra_quantiser_matrix[64]
|
RK_U8 *pInter_table; //non_intra_quantiser_matrix[64]
|
} M2VDHeadSeq;
|
|
/* ISO/IEC 13818-2 section 6.2.2.3: sequence_extension() */
|
typedef struct M2VDHeadSeqExt_t {
|
RK_U32 horizontal_size_extension; //[TEMP]
|
RK_U32 vertical_size_extension; //[TEMP]
|
RK_U32 bit_rate_extension; //[TEMP]
|
RK_U32 vbv_buffer_size_extension; //[TEMP]
|
RK_S32 profile_and_level_indication;
|
RK_S32 progressive_sequence;
|
RK_S32 chroma_format;
|
RK_S32 low_delay;
|
RK_S32 frame_rate_extension_n;
|
RK_S32 frame_rate_extension_d;
|
} M2VDHeadSeqExt;
|
|
/* ISO/IEC 13818-2 section 6.2.2.6: group_of_pictures_header() */
|
typedef struct M2VDHeadGop_t {
|
RK_S32 drop_flag;
|
RK_S32 hour;
|
RK_S32 minute;
|
RK_S32 sec;
|
RK_S32 frame;
|
RK_S32 closed_gop;
|
RK_S32 broken_link;
|
} M2VDHeadGop;
|
|
|
/* ISO/IEC 13818-2 section 6.2.3: picture_header() */
|
typedef struct M2VDHeadPic_t {
|
RK_S32 temporal_reference;
|
RK_S32 picture_coding_type;
|
RK_S32 pre_picture_coding_type;
|
RK_S32 vbv_delay;
|
RK_S32 full_pel_forward_vector;
|
RK_S32 forward_f_code;
|
RK_S32 full_pel_backward_vector;
|
RK_S32 backward_f_code;
|
RK_S32 pre_temporal_reference;
|
} M2VDHeadPic;
|
|
|
/* ISO/IEC 13818-2 section 6.2.2.4: sequence_display_extension() */
|
typedef struct M2VDHeadSeqDispExt_t {
|
RK_S32 video_format;
|
RK_S32 color_description;
|
RK_S32 color_primaries;
|
RK_S32 transfer_characteristics;
|
RK_S32 matrix_coefficients;
|
} M2VDHeadSeqDispExt;
|
|
/* ISO/IEC 13818-2 section 6.2.3.1: picture_coding_extension() header */
|
typedef struct M2VDHeadPicCodeExt_t {
|
RK_S32 f_code[2][2];
|
RK_S32 intra_dc_precision;
|
RK_S32 picture_structure;
|
RK_S32 top_field_first;
|
RK_S32 frame_pred_frame_dct;
|
RK_S32 concealment_motion_vectors;
|
RK_S32 q_scale_type;
|
RK_S32 intra_vlc_format;
|
RK_S32 alternate_scan;
|
RK_S32 repeat_first_field;
|
RK_S32 chroma_420_type;
|
RK_S32 progressive_frame;
|
RK_S32 composite_display_flag;
|
RK_S32 v_axis;
|
RK_S32 field_sequence;
|
RK_S32 sub_carrier;
|
RK_S32 burst_amplitude;
|
RK_S32 sub_carrier_phase;
|
} M2VDHeadPicCodeExt;
|
|
|
/* ISO/IEC 13818-2 section 6.2.3.3: picture_display_extension() header */
|
typedef struct M2VDHeadPicDispExt_t {
|
RK_S32 frame_center_horizontal_offset[3];
|
RK_S32 frame_center_vertical_offset[3];
|
} M2VDHeadPicDispExt;
|
|
typedef struct M2VDCombMem_t {
|
MppBuffer hw_buf;
|
RK_U8* sw_buf;
|
RK_U8 buf_size;
|
RK_U8* sw_pos;
|
RK_U32 length;
|
} M2VDCombMem;
|
|
typedef struct M2VDParserContext_t {
|
M2VDDxvaParam *dxva_ctx;
|
BitReadCtx_t *bitread_ctx;
|
RK_U8 *bitstream_sw_buf;
|
RK_U8 *qp_tab_sw_buf;
|
RK_U32 max_stream_size;
|
RK_U32 left_length;
|
RK_U32 need_split;
|
RK_U32 state;
|
RK_U32 vop_header_found;
|
|
RK_U32 frame_size;
|
|
RK_U32 display_width;
|
RK_U32 display_height;
|
RK_U32 frame_width;
|
RK_U32 frame_height;
|
RK_U32 mb_width;
|
RK_U32 mb_height;
|
RK_U32 MPEG2_Flag;
|
|
M2VDHeadSeq seq_head;
|
M2VDHeadSeqExt seq_ext_head;
|
M2VDHeadGop gop_head;
|
M2VDHeadPic pic_head;
|
M2VDHeadSeqDispExt seq_disp_ext_head;
|
M2VDHeadPicCodeExt pic_code_ext_head;
|
M2VDHeadPicDispExt pic_disp_ext_head;
|
|
RK_S32 resetFlag;
|
|
RK_U64 PreGetFrameTime;
|
RK_S64 Group_start_Time;
|
RK_U32 GroupFrameCnt;
|
RK_U32 pretemporal_reference;
|
RK_U32 pretime_temporal;
|
RK_U32 max_temporal_reference;
|
RK_U32 PreChangeTime_index;
|
RK_S32 frame_period;
|
RK_S32 preframe_period;
|
RK_U32 maxFrame_inGOP;
|
RK_U32 ref_frame_cnt;
|
long long top_first_cnt;
|
long long bottom_first_cnt;
|
RK_S32 mHeaderDecFlag;
|
RK_S32 mExtraHeaderDecFlag;
|
M2VDFrameHead Framehead[3];
|
M2VDFrameHead *frame_ref0;
|
M2VDFrameHead *frame_ref1;
|
M2VDFrameHead *frame_cur;
|
#if M2VD_SKIP_ERROR_FRAME_EN
|
RK_S32 mHwDecStatus;
|
#endif
|
RK_S32 flush_dpb_eos;
|
|
MppPacket input_packet;
|
RK_U32 eos;
|
|
RK_S32 initFlag;
|
RK_S32 decoder_err;
|
|
MppBufSlots packet_slots;
|
MppBufSlots frame_slots;
|
RK_U32 cur_slot_index;
|
|
RK_U64 pts;
|
|
FILE *fp_dbg_file[M2VD_DBG_FILE_NUM];
|
FILE *fp_dbg_yuv;
|
} M2VDParserContext;
|
|
MPP_RET m2vd_parser_init (void *ctx, ParserCfg *cfg);
|
MPP_RET m2vd_parser_deinit (void *ctx);
|
MPP_RET m2vd_parser_reset (void *ctx);
|
MPP_RET m2vd_parser_flush (void *ctx);
|
MPP_RET m2vd_parser_control(void *ctx, MpiCmd cmd_type, void *param);
|
MPP_RET m2vd_parser_prepare(void *ctx, MppPacket pkt, HalDecTask *task);
|
MPP_RET m2vd_parser_parse (void *ctx, HalDecTask *task);
|
MPP_RET m2vd_parser_callback(void *ctx, void *err_info);
|
|
#endif
|