1*437bfbebSnyanmisaka /* 2*437bfbebSnyanmisaka * 3*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD 4*437bfbebSnyanmisaka * 5*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License"); 6*437bfbebSnyanmisaka * you may not use this file except in compliance with the License. 7*437bfbebSnyanmisaka * You may obtain a copy of the License at 8*437bfbebSnyanmisaka * 9*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0 10*437bfbebSnyanmisaka * 11*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software 12*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS, 13*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*437bfbebSnyanmisaka * See the License for the specific language governing permissions and 15*437bfbebSnyanmisaka * limitations under the License. 16*437bfbebSnyanmisaka */ 17*437bfbebSnyanmisaka 18*437bfbebSnyanmisaka /* 19*437bfbebSnyanmisaka * @file h265d_codec.h 20*437bfbebSnyanmisaka * @brief 21*437bfbebSnyanmisaka * @author csy(csy@rock-chips.com) 22*437bfbebSnyanmisaka 23*437bfbebSnyanmisaka * @version 1.0.0 24*437bfbebSnyanmisaka * @history 25*437bfbebSnyanmisaka * 2015.7.15 : Create 26*437bfbebSnyanmisaka */ 27*437bfbebSnyanmisaka 28*437bfbebSnyanmisaka #ifndef __H265D_CODEC_H__ 29*437bfbebSnyanmisaka #define __H265D_CODEC_H__ 30*437bfbebSnyanmisaka 31*437bfbebSnyanmisaka #include "mpp_frame.h" 32*437bfbebSnyanmisaka #include "mpp_soc.h" 33*437bfbebSnyanmisaka #include "mpp_dec_cfg.h" 34*437bfbebSnyanmisaka 35*437bfbebSnyanmisaka typedef struct MppRational { 36*437bfbebSnyanmisaka RK_S32 num; ///< numerator 37*437bfbebSnyanmisaka RK_S32 den; ///< denominator 38*437bfbebSnyanmisaka } MppRational_t; 39*437bfbebSnyanmisaka 40*437bfbebSnyanmisaka enum MppPictureStructure { 41*437bfbebSnyanmisaka MPP_PICTURE_STRUCTURE_UNKNOWN, //< unknown 42*437bfbebSnyanmisaka MPP_PICTURE_STRUCTURE_TOP_FIELD, //< coded as top field 43*437bfbebSnyanmisaka MPP_PICTURE_STRUCTURE_BOTTOM_FIELD, //< coded as bottom field 44*437bfbebSnyanmisaka MPP_PICTURE_STRUCTURE_FRAME, //< coded as frame 45*437bfbebSnyanmisaka }; 46*437bfbebSnyanmisaka 47*437bfbebSnyanmisaka #define END_NOT_FOUND (-100) 48*437bfbebSnyanmisaka #define MPP_PARSER_PTS_NB 4 49*437bfbebSnyanmisaka 50*437bfbebSnyanmisaka typedef struct SplitContext { 51*437bfbebSnyanmisaka RK_U8 *buffer; 52*437bfbebSnyanmisaka RK_U32 buffer_size; 53*437bfbebSnyanmisaka RK_S32 index; 54*437bfbebSnyanmisaka RK_S32 last_index; 55*437bfbebSnyanmisaka RK_U32 state; ///< contains the last few bytes in MSB order 56*437bfbebSnyanmisaka RK_S32 frame_start_found; 57*437bfbebSnyanmisaka RK_S32 overread; ///< the number of bytes which where irreversibly read from the next frame 58*437bfbebSnyanmisaka RK_S32 overread_index; ///< the index into ParseContext.buffer of the overread bytes 59*437bfbebSnyanmisaka RK_U64 state64; ///< contains the last 8 bytes in MSB order 60*437bfbebSnyanmisaka RK_S64 pts; /* pts of the current frame */ 61*437bfbebSnyanmisaka RK_S64 dts; /* dts of the current frame */ 62*437bfbebSnyanmisaka RK_S64 frame_offset; /* offset of the current frame */ 63*437bfbebSnyanmisaka RK_S64 cur_offset; /* current offset 64*437bfbebSnyanmisaka (incremented by each av_parser_parse()) */ 65*437bfbebSnyanmisaka RK_S64 next_frame_offset; /* offset of the next frame */ 66*437bfbebSnyanmisaka /* private data */ 67*437bfbebSnyanmisaka RK_S64 last_pts; 68*437bfbebSnyanmisaka RK_S64 last_dts; 69*437bfbebSnyanmisaka RK_S32 fetch_timestamp; 70*437bfbebSnyanmisaka 71*437bfbebSnyanmisaka RK_S32 cur_frame_start_index; 72*437bfbebSnyanmisaka RK_S64 cur_frame_offset[MPP_PARSER_PTS_NB]; 73*437bfbebSnyanmisaka RK_S64 cur_frame_pts[MPP_PARSER_PTS_NB]; 74*437bfbebSnyanmisaka RK_S64 cur_frame_dts[MPP_PARSER_PTS_NB]; 75*437bfbebSnyanmisaka 76*437bfbebSnyanmisaka RK_S64 offset; ///< byte offset from starting packet start 77*437bfbebSnyanmisaka RK_S64 cur_frame_end[MPP_PARSER_PTS_NB]; 78*437bfbebSnyanmisaka /** 79*437bfbebSnyanmisaka * Set by parser to 1 for key frames and 0 for non-key frames. 80*437bfbebSnyanmisaka * It is initialized to -1, so if the parser doesn't set this flag, 81*437bfbebSnyanmisaka * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames 82*437bfbebSnyanmisaka * will be used. 83*437bfbebSnyanmisaka */ 84*437bfbebSnyanmisaka RK_S32 key_frame; 85*437bfbebSnyanmisaka RK_S32 eos; 86*437bfbebSnyanmisaka } SplitContext_t; 87*437bfbebSnyanmisaka 88*437bfbebSnyanmisaka typedef struct H265dContext { 89*437bfbebSnyanmisaka 90*437bfbebSnyanmisaka void *priv_data; 91*437bfbebSnyanmisaka 92*437bfbebSnyanmisaka void *split_cxt; 93*437bfbebSnyanmisaka 94*437bfbebSnyanmisaka /** 95*437bfbebSnyanmisaka * for rk log printf 96*437bfbebSnyanmisaka **/ 97*437bfbebSnyanmisaka // RK_LOG_CONTEX_t *log_ctx; 98*437bfbebSnyanmisaka /** 99*437bfbebSnyanmisaka * display width & height 100*437bfbebSnyanmisaka **/ 101*437bfbebSnyanmisaka RK_S32 width, height; 102*437bfbebSnyanmisaka 103*437bfbebSnyanmisaka /** 104*437bfbebSnyanmisaka *codec decoder width & height 105*437bfbebSnyanmisaka **/ 106*437bfbebSnyanmisaka RK_S32 coded_width, coded_height; 107*437bfbebSnyanmisaka 108*437bfbebSnyanmisaka RK_U8 *extradata; 109*437bfbebSnyanmisaka 110*437bfbebSnyanmisaka RK_U32 extradata_size; 111*437bfbebSnyanmisaka 112*437bfbebSnyanmisaka /** 113*437bfbebSnyanmisaka * Pixel format 114*437bfbebSnyanmisaka **/ 115*437bfbebSnyanmisaka RK_U32 pix_fmt; 116*437bfbebSnyanmisaka 117*437bfbebSnyanmisaka RK_U32 nBitDepth; 118*437bfbebSnyanmisaka RK_U32 err_recognition; 119*437bfbebSnyanmisaka 120*437bfbebSnyanmisaka /** 121*437bfbebSnyanmisaka * sample aspect ratio (0 if unknown) 122*437bfbebSnyanmisaka * That is the width of a pixel divided by the height of the pixel. 123*437bfbebSnyanmisaka * Numerator and denominator must be relatively prime and smaller than 256 for some video standards. 124*437bfbebSnyanmisaka * - decoding: Set by rkcodec. 125*437bfbebSnyanmisaka */ 126*437bfbebSnyanmisaka MppRational_t sample_aspect_ratio; 127*437bfbebSnyanmisaka 128*437bfbebSnyanmisaka /** 129*437bfbebSnyanmisaka * YUV colorspace type. 130*437bfbebSnyanmisaka * - decoding: Set by rkcodec 131*437bfbebSnyanmisaka */ 132*437bfbebSnyanmisaka MppFrameColorSpace colorspace; 133*437bfbebSnyanmisaka 134*437bfbebSnyanmisaka /** 135*437bfbebSnyanmisaka * MPEG vs JPEG YUV range. 136*437bfbebSnyanmisaka * - decoding: Set by rkcodec 137*437bfbebSnyanmisaka */ 138*437bfbebSnyanmisaka MppFrameColorRange color_range; 139*437bfbebSnyanmisaka 140*437bfbebSnyanmisaka void *compare_info; 141*437bfbebSnyanmisaka 142*437bfbebSnyanmisaka MppDecCfgSet *cfg; 143*437bfbebSnyanmisaka 144*437bfbebSnyanmisaka const MppDecHwCap *hw_info; 145*437bfbebSnyanmisaka } H265dContext_t; 146*437bfbebSnyanmisaka #ifdef __cplusplus 147*437bfbebSnyanmisaka extern "C" { 148*437bfbebSnyanmisaka #endif 149*437bfbebSnyanmisaka 150*437bfbebSnyanmisaka RK_S32 h265d_parser2_syntax(void *ctx); 151*437bfbebSnyanmisaka RK_S32 h265d_syntax_fill_slice(void *ctx, RK_S32 input_index); 152*437bfbebSnyanmisaka 153*437bfbebSnyanmisaka #ifdef __cplusplus 154*437bfbebSnyanmisaka } 155*437bfbebSnyanmisaka #endif 156*437bfbebSnyanmisaka 157*437bfbebSnyanmisaka #endif /* __H265D_CODEC_H__ */ 158