/* * 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 __AVSD_PARSE_H__ #define __AVSD_PARSE_H__ #include "mpp_debug.h" #include "parser_api.h" #include "mpp_bitread.h" #include "avsd_syntax.h" #include "avsd_api.h" #define AVSD_DBG_ERROR (0x00000001) #define AVSD_DBG_ASSERT (0x00000002) #define AVSD_DBG_WARNNING (0x00000004) #define AVSD_DBG_LOG (0x00000008) #define AVSD_DBG_INPUT (0x00000010) //!< input packet #define AVSD_DBG_TIME (0x00000020) //!< input packet #define AVSD_DBG_CALLBACK (0x00008000) extern RK_U32 avsd_parse_debug; #define AVSD_PARSE_TRACE(fmt, ...)\ do {\ if (AVSD_DBG_LOG & avsd_parse_debug)\ { mpp_log_f(fmt, ## __VA_ARGS__); }\ } while (0) #define AVSD_DBG(level, fmt, ...)\ do {\ if (level & avsd_parse_debug)\ { mpp_log(fmt, ## __VA_ARGS__); }\ } while (0) //!< input check #define INP_CHECK(ret, val, ...)\ do{\ if ((val)) {\ ret = MPP_ERR_INIT; \ AVSD_DBG(AVSD_DBG_WARNNING, "input empty(%d).\n", __LINE__); \ goto __RETURN; \ }} while (0) //!< memory malloc check #define MEM_CHECK(ret, val, ...)\ do{\ if(!(val)) {\ ret = MPP_ERR_MALLOC;\ mpp_err_f("malloc buffer error(%d).\n", __LINE__); \ goto __FAILED; \ }} while (0) //!< function return check #define FUN_CHECK(val)\ do{\ if ((val) < 0) {\ AVSD_DBG(AVSD_DBG_WARNNING, "Function error(%d).\n", __LINE__); \ goto __FAILED; \ }} while (0) #define MAX_HEADER_SIZE (2*1024) #define MAX_STREAM_SIZE (2*1024*1024) //!< NALU type #define SEQUENCE_DISPLAY_EXTENTION 0x00000002 #define COPYRIGHT_EXTENTION 0x00000004 #define PICTURE_DISPLAY_EXTENTION 0x00000007 #define CAMERA_PARAMETERS_EXTENTION 0x0000000B #define SLICE_MIN_START_CODE 0x00000100 #define SLICE_MAX_START_CODE 0x000001AF #define VIDEO_SEQUENCE_START_CODE 0x000001B0 #define VIDEO_SEQUENCE_END_CODE 0x000001B1 #define USER_DATA_CODE 0x000001B2 #define I_PICUTRE_START_CODE 0x000001B3 #define EXTENSION_START_CODE 0x000001B5 #define PB_PICUTRE_START_CODE 0x000001B6 #define VIDEO_EDIT_CODE 0x000001B7 #define VIDEO_TIME_CODE 0x000001E0 #define EDGE_SIZE 16 #define MB_SIZE 16 #define YUV420 0 //!< picture type enum avsd_picture_type_e { I_PICTURE = 0, P_PICTURE = 1, B_PICTURE = 2 }; typedef struct avsd_nalu_t { RK_U32 header; RK_U32 size; RK_U32 length; RK_U8 *pdata; RK_U8 start_pos; RK_U8 eof; //!< end of frame stream } AvsdNalu_t; typedef struct avsd_sequence_header_t { RK_U8 profile_id; RK_U8 level_id; RK_U8 progressive_sequence; RK_U32 horizontal_size; RK_U32 vertical_size; RK_U8 chroma_format; RK_U8 sample_precision; RK_U8 aspect_ratio; RK_U8 frame_rate_code; RK_U32 bit_rate; RK_U8 low_delay; RK_U32 bbv_buffer_size; } AvsdSeqHeader_t; //!< sequence display extension header typedef struct avsd_seqence_extension_header_t { RK_U32 video_format; RK_U32 sample_range; RK_U32 color_description; RK_U32 color_primaries; RK_U32 transfer_characteristics; RK_U32 matrix_coefficients; RK_U32 display_horizontalSize; RK_U32 display_verticalSize; } AvsdSeqExtHeader_t; typedef struct avsd_picture_header { RK_U16 bbv_delay; RK_U16 bbv_delay_extension; RK_U8 picture_coding_type; RK_U8 time_code_flag; RK_U32 time_code; RK_U8 picture_distance; RK_U32 bbv_check_times; RK_U8 progressive_frame; RK_U8 picture_structure; RK_U8 advanced_pred_mode_disable; RK_U8 top_field_first; RK_U8 repeat_first_field; RK_U8 fixed_picture_qp; RK_U8 picture_qp; RK_U8 picture_reference_flag; RK_U8 no_forward_reference_flag; RK_U8 pb_field_enhanced_flag; RK_U8 skip_mode_flag; RK_U8 loop_filter_disable; RK_U8 loop_filter_parameter_flag; RK_U32 alpha_c_offset; RK_U32 beta_offset; RK_U8 weighting_quant_flag; RK_U8 chroma_quant_param_disable; RK_S32 chroma_quant_param_delta_cb; RK_S32 chroma_quant_param_delta_cr; RK_U32 weighting_quant_param_index; RK_U32 weighting_quant_model; RK_S32 weighting_quant_param_delta1[6]; RK_S32 weighting_quant_param_delta2[6]; RK_S32 weighting_quant_param[6]; RK_U8 aec_enable; } AvsdPicHeader_t; typedef struct avsd_frame_t { RK_U32 valid; RK_U32 pic_type; RK_U32 frame_mode; //!< set mpp frame flag RK_U32 width; RK_U32 height; RK_U32 ver_stride; RK_U32 hor_stride; RK_S64 pts; RK_S64 dts; RK_U32 had_display; RK_S32 slot_idx; } AvsdFrame_t; typedef struct avsd_stream_buf_t { RK_U8 *pbuf; RK_U32 size; RK_U32 len; } AvsdStreamBuf_t; typedef struct avsd_memory_t { struct avsd_stream_buf_t headerbuf; struct avsd_stream_buf_t streambuf; struct avsd_syntax_t syntax; struct avsd_frame_t save[3]; } AvsdMemory_t; //!< decoder parameters typedef struct avs_dec_ctx_t { MppBufSlots frame_slots; MppBufSlots packet_slots; MppPacket task_pkt; struct avsd_memory_t *mem; //!< resotre slice data to decoder struct avsd_stream_buf_t *p_stream; struct avsd_stream_buf_t *p_header; //-------- input --------------- RK_U32 frame_no; ParserCfg init; RK_U8 has_get_eos; RK_U64 pkt_no; //-------- current -------------- struct avsd_nalu_t *nal; //!< current nalu //-------- video -------------- struct bitread_ctx_t bitctx; AvsdSeqHeader_t vsh; AvsdSeqExtHeader_t ext; AvsdPicHeader_t ph; AvsdSyntax_t *syn; AvsdFrame_t *dpb[2]; //!< 2 refer frames or 4 refer field AvsdFrame_t *cur; //!< for decoder field //!<------------------------------------ RK_U32 got_vsh; RK_U32 got_keyframe; RK_U32 mb_width; RK_U32 mb_height; RK_U32 vec_flag; //!< video_edit_code_flag } AvsdCtx_t; #ifdef __cplusplus extern "C" { #endif MPP_RET avsd_free_resource(AvsdCtx_t *p_dec); MPP_RET avsd_reset_parameters(AvsdCtx_t *p_dec); MPP_RET avsd_set_dpb(AvsdCtx_t *p_dec, HalDecTask *task); MPP_RET avsd_commit_syntaxs(AvsdSyntax_t *syn, HalDecTask *task); MPP_RET avsd_fill_parameters(AvsdCtx_t *p_dec, AvsdSyntax_t *syn); MPP_RET avsd_update_dpb(AvsdCtx_t *p_dec); MPP_RET avsd_parse_prepare(AvsdCtx_t *p_dec, MppPacket *pkt, HalDecTask *task); MPP_RET avsd_parse_stream(AvsdCtx_t *p_dec, HalDecTask *task); #ifdef __cplusplus } #endif #endif /*__AVSD_PARSE_H__*/