xref: /rockchip-linux_mpp/mpp/base/inc/mpp_frame_impl.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #ifndef __MPP_FRAME_IMPL_H__
18*437bfbebSnyanmisaka #define __MPP_FRAME_IMPL_H__
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include "mpp_time.h"
21*437bfbebSnyanmisaka #include "mpp_frame.h"
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka typedef struct MppFrameImpl_t MppFrameImpl;
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka typedef union MppFrameStatus_u {
26*437bfbebSnyanmisaka     /* total 64 bit frame status for internal flow */
27*437bfbebSnyanmisaka     RK_U64              val;
28*437bfbebSnyanmisaka 
29*437bfbebSnyanmisaka     struct {
30*437bfbebSnyanmisaka         /* bit 0 ~ 7 common frame status flag for both encoder and decoder */
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka         /*
33*437bfbebSnyanmisaka          * data status flag
34*437bfbebSnyanmisaka          * 0 - pixel data is invalid
35*437bfbebSnyanmisaka          * 1 - pixel data is valid
36*437bfbebSnyanmisaka          */
37*437bfbebSnyanmisaka         RK_U32          valid           : 1;
38*437bfbebSnyanmisaka 
39*437bfbebSnyanmisaka         /* reference status flag */
40*437bfbebSnyanmisaka         /*
41*437bfbebSnyanmisaka          * 0 - inter frame
42*437bfbebSnyanmisaka          * 1 - intra frame
43*437bfbebSnyanmisaka          */
44*437bfbebSnyanmisaka         RK_U32          is_intra        : 1;
45*437bfbebSnyanmisaka 
46*437bfbebSnyanmisaka         /*
47*437bfbebSnyanmisaka          * Valid when is_intra is true
48*437bfbebSnyanmisaka          * 0 - normal intra frame
49*437bfbebSnyanmisaka          * 1 - IDR frame
50*437bfbebSnyanmisaka          */
51*437bfbebSnyanmisaka         RK_U32          is_idr          : 1;
52*437bfbebSnyanmisaka 
53*437bfbebSnyanmisaka         /*
54*437bfbebSnyanmisaka          * 0 - mark as reference frame
55*437bfbebSnyanmisaka          * 1 - mark as non-refernce frame
56*437bfbebSnyanmisaka          */
57*437bfbebSnyanmisaka         RK_U32          is_non_ref      : 1;
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka         /*
60*437bfbebSnyanmisaka          * Valid when is_non_ref is false
61*437bfbebSnyanmisaka          * 0 - mark as short-term reference frame
62*437bfbebSnyanmisaka          * 1 - mark as long-term refernce frame
63*437bfbebSnyanmisaka          */
64*437bfbebSnyanmisaka         RK_U32          is_lt_ref       : 1;
65*437bfbebSnyanmisaka         RK_U32          is_b_frame      : 1;
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka         /*
68*437bfbebSnyanmisaka          * frame usage flag for decoder / encoder flow
69*437bfbebSnyanmisaka          * 0 - mark as general frame
70*437bfbebSnyanmisaka          * 1 - mark as used by decoder
71*437bfbebSnyanmisaka          * 2 - mark as used by encoder
72*437bfbebSnyanmisaka          * 4 - mark as used by vproc
73*437bfbebSnyanmisaka          */
74*437bfbebSnyanmisaka         RK_U32          usage           : 3;
75*437bfbebSnyanmisaka     };
76*437bfbebSnyanmisaka } MppFrameStatus;
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka struct MppFrameImpl_t {
79*437bfbebSnyanmisaka     const char  *name;
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka     /*
82*437bfbebSnyanmisaka      * dimension parameter for display
83*437bfbebSnyanmisaka      */
84*437bfbebSnyanmisaka     RK_U32  width;
85*437bfbebSnyanmisaka     RK_U32  height;
86*437bfbebSnyanmisaka     RK_U32  hor_stride;
87*437bfbebSnyanmisaka     RK_U32  ver_stride;
88*437bfbebSnyanmisaka     RK_U32  hor_stride_pixel;
89*437bfbebSnyanmisaka     RK_U32  fbc_hdr_stride;
90*437bfbebSnyanmisaka     RK_U32  offset_x;
91*437bfbebSnyanmisaka     RK_U32  offset_y;
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka     /*
94*437bfbebSnyanmisaka      * interlaced related mode status
95*437bfbebSnyanmisaka      *
96*437bfbebSnyanmisaka      * 0 - frame
97*437bfbebSnyanmisaka      * 1 - top field
98*437bfbebSnyanmisaka      * 2 - bottom field
99*437bfbebSnyanmisaka      * 3 - paired top and bottom field
100*437bfbebSnyanmisaka      * 4 - deinterlaced flag
101*437bfbebSnyanmisaka      * 7 - deinterlaced paired field
102*437bfbebSnyanmisaka      */
103*437bfbebSnyanmisaka     RK_U32  mode;
104*437bfbebSnyanmisaka     /*
105*437bfbebSnyanmisaka      * current decoded frame whether to display
106*437bfbebSnyanmisaka      *
107*437bfbebSnyanmisaka      * 0 - reserve
108*437bfbebSnyanmisaka      * 1 - discard
109*437bfbebSnyanmisaka      */
110*437bfbebSnyanmisaka     RK_U32  discard;
111*437bfbebSnyanmisaka     /*
112*437bfbebSnyanmisaka      * send decoded frame belong which view
113*437bfbebSnyanmisaka      */
114*437bfbebSnyanmisaka     RK_U32  viewid;
115*437bfbebSnyanmisaka     /*
116*437bfbebSnyanmisaka     * poc - picture order count
117*437bfbebSnyanmisaka     */
118*437bfbebSnyanmisaka     RK_U32  poc;
119*437bfbebSnyanmisaka     /*
120*437bfbebSnyanmisaka      * pts - display time stamp
121*437bfbebSnyanmisaka      * dts - decode time stamp
122*437bfbebSnyanmisaka      */
123*437bfbebSnyanmisaka     RK_S64  pts;
124*437bfbebSnyanmisaka     RK_S64  dts;
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka     /*
127*437bfbebSnyanmisaka      * eos - end of stream
128*437bfbebSnyanmisaka      * info_change - set when buffer resized or frame infomation changed
129*437bfbebSnyanmisaka      */
130*437bfbebSnyanmisaka     RK_U32  eos;
131*437bfbebSnyanmisaka     RK_U32  info_change;
132*437bfbebSnyanmisaka     RK_U32  errinfo;
133*437bfbebSnyanmisaka     MppFrameColorRange color_range;
134*437bfbebSnyanmisaka     MppFrameColorPrimaries color_primaries;
135*437bfbebSnyanmisaka     MppFrameColorTransferCharacteristic color_trc;
136*437bfbebSnyanmisaka 
137*437bfbebSnyanmisaka     /**
138*437bfbebSnyanmisaka      * YUV colorspace type.
139*437bfbebSnyanmisaka      * It must be accessed using av_frame_get_colorspace() and
140*437bfbebSnyanmisaka      * av_frame_set_colorspace().
141*437bfbebSnyanmisaka      * - encoding: Set by user
142*437bfbebSnyanmisaka      * - decoding: Set by libavcodec
143*437bfbebSnyanmisaka      */
144*437bfbebSnyanmisaka     MppFrameColorSpace colorspace;
145*437bfbebSnyanmisaka     MppFrameChromaLocation chroma_location;
146*437bfbebSnyanmisaka 
147*437bfbebSnyanmisaka     MppFrameFormat fmt;
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka     MppFrameRational sar;
150*437bfbebSnyanmisaka     MppFrameMasteringDisplayMetadata mastering_display;
151*437bfbebSnyanmisaka     MppFrameContentLightMetadata content_light;
152*437bfbebSnyanmisaka     MppFrameHdrDynamicMeta *hdr_dynamic_meta;
153*437bfbebSnyanmisaka 
154*437bfbebSnyanmisaka     /*
155*437bfbebSnyanmisaka      * buffer information
156*437bfbebSnyanmisaka      * NOTE: buf_size only access internally
157*437bfbebSnyanmisaka      */
158*437bfbebSnyanmisaka     MppBuffer       buffer;
159*437bfbebSnyanmisaka     size_t          buf_size;
160*437bfbebSnyanmisaka 
161*437bfbebSnyanmisaka     /*
162*437bfbebSnyanmisaka      * meta data information
163*437bfbebSnyanmisaka      */
164*437bfbebSnyanmisaka     MppTask         task;
165*437bfbebSnyanmisaka     MppMeta         meta;
166*437bfbebSnyanmisaka     MppStopwatch    stopwatch;
167*437bfbebSnyanmisaka 
168*437bfbebSnyanmisaka     /*
169*437bfbebSnyanmisaka      * frame buffer compression (FBC) information
170*437bfbebSnyanmisaka      *
171*437bfbebSnyanmisaka      * NOTE: some constraint on fbc data
172*437bfbebSnyanmisaka      * 1. FBC config need two addresses but only one buffer.
173*437bfbebSnyanmisaka      *    The second address should be represented by base + offset form.
174*437bfbebSnyanmisaka      * 2. FBC has header address and payload address
175*437bfbebSnyanmisaka      *    Both addresses should be 4K aligned.
176*437bfbebSnyanmisaka      * 3. The header section size is default defined by:
177*437bfbebSnyanmisaka      *    header size = aligned(aligned(width, 16) * aligned(height, 16) / 16, 4096)
178*437bfbebSnyanmisaka      * 4. The stride in header section is defined by:
179*437bfbebSnyanmisaka      *    stride = aligned(width, 16)
180*437bfbebSnyanmisaka      */
181*437bfbebSnyanmisaka     RK_U32          fbc_offset;
182*437bfbebSnyanmisaka     size_t          fbc_size;
183*437bfbebSnyanmisaka 
184*437bfbebSnyanmisaka     /*
185*437bfbebSnyanmisaka      * frame buffer contain downsacle pic
186*437bfbebSnyanmisaka      *
187*437bfbebSnyanmisaka      * downscale pic is no fbc fmt the downscale pic size
188*437bfbebSnyanmisaka      * w/2 x h / 2
189*437bfbebSnyanmisaka      */
190*437bfbebSnyanmisaka     RK_U32          thumbnail_en;
191*437bfbebSnyanmisaka 
192*437bfbebSnyanmisaka     /*
193*437bfbebSnyanmisaka      * frame status info for internal flow
194*437bfbebSnyanmisaka      */
195*437bfbebSnyanmisaka     MppFrameStatus  status;
196*437bfbebSnyanmisaka };
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka #ifdef __cplusplus
199*437bfbebSnyanmisaka extern "C" {
200*437bfbebSnyanmisaka #endif
201*437bfbebSnyanmisaka 
202*437bfbebSnyanmisaka MppFrame mpp_frame_dup(MppFrame src);
203*437bfbebSnyanmisaka MPP_RET mpp_frame_copy(MppFrame dst, MppFrame src);
204*437bfbebSnyanmisaka MPP_RET mpp_frame_info_cmp(MppFrame frame0, MppFrame frame1);
205*437bfbebSnyanmisaka RK_U32  mpp_frame_get_fbc_offset(MppFrame frame);
206*437bfbebSnyanmisaka RK_U32  mpp_frame_get_fbc_stride(MppFrame frame);
207*437bfbebSnyanmisaka size_t  mpp_frame_get_fbc_size(MppFrame frame);
208*437bfbebSnyanmisaka void    mpp_frame_set_fbc_size(MppFrame frame, size_t size);
209*437bfbebSnyanmisaka 
210*437bfbebSnyanmisaka MppFrameStatus *mpp_frame_get_status(MppFrame frame);
211*437bfbebSnyanmisaka 
212*437bfbebSnyanmisaka /*
213*437bfbebSnyanmisaka  * Debug for frame process timing
214*437bfbebSnyanmisaka  */
215*437bfbebSnyanmisaka void mpp_frame_set_stopwatch_enable(MppFrame frame, RK_S32 enable);
216*437bfbebSnyanmisaka MppStopwatch mpp_frame_get_stopwatch(const MppFrame frame);
217*437bfbebSnyanmisaka 
218*437bfbebSnyanmisaka MPP_RET __check_is_mpp_frame(void *frame);
219*437bfbebSnyanmisaka 
220*437bfbebSnyanmisaka #ifdef __cplusplus
221*437bfbebSnyanmisaka }
222*437bfbebSnyanmisaka #endif
223*437bfbebSnyanmisaka 
224*437bfbebSnyanmisaka #endif /*__MPP_FRAME_IMPL_H__*/
225