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