xref: /rockchip-linux_mpp/mpp/codec/dec/h265/h265d_codec.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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