xref: /rockchip-linux_mpp/inc/rk_venc_cmd.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #ifndef __RK_VENC_CMD_H__
7*437bfbebSnyanmisaka #define __RK_VENC_CMD_H__
8*437bfbebSnyanmisaka 
9*437bfbebSnyanmisaka #include "mpp_frame.h"
10*437bfbebSnyanmisaka #include "rk_venc_rc.h"
11*437bfbebSnyanmisaka 
12*437bfbebSnyanmisaka /*
13*437bfbebSnyanmisaka  * Configure of encoder is very complicated. So we divide configures into
14*437bfbebSnyanmisaka  * four parts:
15*437bfbebSnyanmisaka  *
16*437bfbebSnyanmisaka  * 1. Rate control parameter
17*437bfbebSnyanmisaka  *    This is quality and bitrate request from user.
18*437bfbebSnyanmisaka  *
19*437bfbebSnyanmisaka  * 2. Data source MppFrame parameter
20*437bfbebSnyanmisaka  *    This is data source buffer information.
21*437bfbebSnyanmisaka  *    Now it is PreP config
22*437bfbebSnyanmisaka  *    PreP  : Encoder Preprocess configuration
23*437bfbebSnyanmisaka  *
24*437bfbebSnyanmisaka  * 3. Video codec infomation
25*437bfbebSnyanmisaka  *    This is user custormized stream information.
26*437bfbebSnyanmisaka  *    including:
27*437bfbebSnyanmisaka  *    H.264 / H.265 / vp8 / mjpeg
28*437bfbebSnyanmisaka  *
29*437bfbebSnyanmisaka  * 4. Misc parameter
30*437bfbebSnyanmisaka  *    including:
31*437bfbebSnyanmisaka  *    Split : Slice split configuration
32*437bfbebSnyanmisaka  *    GopRef: Reference gop configuration
33*437bfbebSnyanmisaka  *    ROI   : Region Of Interest
34*437bfbebSnyanmisaka  *    OSD   : On Screen Display
35*437bfbebSnyanmisaka  *    MD    : Motion Detection
36*437bfbebSnyanmisaka  *
37*437bfbebSnyanmisaka  * The module transcation flow is as follows:
38*437bfbebSnyanmisaka  *
39*437bfbebSnyanmisaka  *                 +                      +
40*437bfbebSnyanmisaka  *     User        |      Mpi/Mpp         |          EncImpl
41*437bfbebSnyanmisaka  *                 |                      |            Hal
42*437bfbebSnyanmisaka  *                 |                      |
43*437bfbebSnyanmisaka  * +----------+    |    +---------+       |       +-----------+
44*437bfbebSnyanmisaka  * |          |    |    |         +-----RcCfg----->           |
45*437bfbebSnyanmisaka  * |  RcCfg   +--------->         |       |       |  EncImpl  |
46*437bfbebSnyanmisaka  * |          |    |    |         |   +-Frame----->           |
47*437bfbebSnyanmisaka  * +----------+    |    |         |   |   |       +--+-----^--+
48*437bfbebSnyanmisaka  *                 |    |         |   |   |          |     |
49*437bfbebSnyanmisaka  *                 |    |         |   |   |          |     |
50*437bfbebSnyanmisaka  * +----------+    |    |         |   |   |       syntax   |
51*437bfbebSnyanmisaka  * |          |    |    |         |   |   |          |     |
52*437bfbebSnyanmisaka  * | MppFrame +--------->  MppEnc +---+   |          |   result
53*437bfbebSnyanmisaka  * |          |    |    |         |   |   |          |     |
54*437bfbebSnyanmisaka  * +----------+    |    |         |   |   |          |     |
55*437bfbebSnyanmisaka  *                 |    |         |   |   |       +--v-----+--+
56*437bfbebSnyanmisaka  *                 |    |         |   +-Frame----->           |
57*437bfbebSnyanmisaka  * +----------+    |    |         |       |       |           |
58*437bfbebSnyanmisaka  * |          |    |    |         +---CodecCfg---->    Hal    |
59*437bfbebSnyanmisaka  * | CodecCfg +--------->         |       |       |           |
60*437bfbebSnyanmisaka  * |          |    |    |         <-----Extra----->           |
61*437bfbebSnyanmisaka  * +----------+    |    +---------+       |       +-----------+
62*437bfbebSnyanmisaka  *                 |                      |
63*437bfbebSnyanmisaka  *                 |                      |
64*437bfbebSnyanmisaka  *                 +                      +
65*437bfbebSnyanmisaka  *
66*437bfbebSnyanmisaka  * The function call flow is shown below:
67*437bfbebSnyanmisaka  *
68*437bfbebSnyanmisaka  *  mpi                      mpp_enc         controller                  hal
69*437bfbebSnyanmisaka  *   +                          +                 +                       +
70*437bfbebSnyanmisaka  *   |                          |                 |                       |
71*437bfbebSnyanmisaka  *   |                          |                 |                       |
72*437bfbebSnyanmisaka  *   +----------init------------>                 |                       |
73*437bfbebSnyanmisaka  *   |                          |                 |                       |
74*437bfbebSnyanmisaka  *   |                          |                 |                       |
75*437bfbebSnyanmisaka  *   |         PrepCfg          |                 |                       |
76*437bfbebSnyanmisaka  *   +---------control---------->     PrepCfg     |                       |
77*437bfbebSnyanmisaka  *   |                          +-----control----->                       |
78*437bfbebSnyanmisaka  *   |                          |                 |        PrepCfg        |
79*437bfbebSnyanmisaka  *   |                          +--------------------------control-------->
80*437bfbebSnyanmisaka  *   |                          |                 |                    allocate
81*437bfbebSnyanmisaka  *   |                          |                 |                     buffer
82*437bfbebSnyanmisaka  *   |                          |                 |                       |
83*437bfbebSnyanmisaka  *   |          RcCfg           |                 |                       |
84*437bfbebSnyanmisaka  *   +---------control---------->      RcCfg      |                       |
85*437bfbebSnyanmisaka  *   |                          +-----control----->                       |
86*437bfbebSnyanmisaka  *   |                          |              rc_init                    |
87*437bfbebSnyanmisaka  *   |                          |                 |                       |
88*437bfbebSnyanmisaka  *   |                          |                 |                       |
89*437bfbebSnyanmisaka  *   |         CodecCfg         |                 |                       |
90*437bfbebSnyanmisaka  *   +---------control---------->                 |        CodecCfg       |
91*437bfbebSnyanmisaka  *   |                          +--------------------------control-------->
92*437bfbebSnyanmisaka  *   |                          |                 |                    generate
93*437bfbebSnyanmisaka  *   |                          |                 |                    sps/pps
94*437bfbebSnyanmisaka  *   |                          |                 |     Get extra info    |
95*437bfbebSnyanmisaka  *   |                          +--------------------------control-------->
96*437bfbebSnyanmisaka  *   |      Get extra info      |                 |                       |
97*437bfbebSnyanmisaka  *   +---------control---------->                 |                       |
98*437bfbebSnyanmisaka  *   |                          |                 |                       |
99*437bfbebSnyanmisaka  *   |                          |                 |                       |
100*437bfbebSnyanmisaka  *   |         ROICfg           |                 |                       |
101*437bfbebSnyanmisaka  *   +---------control---------->                 |        ROICfg         |
102*437bfbebSnyanmisaka  *   |                          +--------------------------control-------->
103*437bfbebSnyanmisaka  *   |                          |                 |                       |
104*437bfbebSnyanmisaka  *   |         OSDCfg           |                 |                       |
105*437bfbebSnyanmisaka  *   +---------control---------->                 |        OSDCfg         |
106*437bfbebSnyanmisaka  *   |                          +--------------------------control-------->
107*437bfbebSnyanmisaka  *   |                          |                 |                       |
108*437bfbebSnyanmisaka  *   |          MDCfg           |                 |                       |
109*437bfbebSnyanmisaka  *   +---------control---------->                 |         MDCfg         |
110*437bfbebSnyanmisaka  *   |                          +--------------------------control-------->
111*437bfbebSnyanmisaka  *   |                          |                 |                       |
112*437bfbebSnyanmisaka  *   |      Set extra info      |                 |                       |
113*437bfbebSnyanmisaka  *   +---------control---------->                 |     Set extra info    |
114*437bfbebSnyanmisaka  *   |                          +--------------------------control-------->
115*437bfbebSnyanmisaka  *   |                          |                 |                       |
116*437bfbebSnyanmisaka  *   |           task           |                 |                       |
117*437bfbebSnyanmisaka  *   +----------encode---------->      task       |                       |
118*437bfbebSnyanmisaka  *   |                          +-----encode------>                       |
119*437bfbebSnyanmisaka  *   |                          |              encode                     |
120*437bfbebSnyanmisaka  *   |                          |                 |        syntax         |
121*437bfbebSnyanmisaka  *   |                          +--------------------------gen_reg-------->
122*437bfbebSnyanmisaka  *   |                          |                 |                       |
123*437bfbebSnyanmisaka  *   |                          |                 |                       |
124*437bfbebSnyanmisaka  *   |                          +---------------------------start--------->
125*437bfbebSnyanmisaka  *   |                          |                 |                       |
126*437bfbebSnyanmisaka  *   |                          |                 |                       |
127*437bfbebSnyanmisaka  *   |                          +---------------------------wait---------->
128*437bfbebSnyanmisaka  *   |                          |                 |                       |
129*437bfbebSnyanmisaka  *   |                          |    callback     |                       |
130*437bfbebSnyanmisaka  *   |                          +----------------->                       |
131*437bfbebSnyanmisaka  *   +--OSD-MD--encode---------->                 |                       |
132*437bfbebSnyanmisaka  *   |             .            |                 |                       |
133*437bfbebSnyanmisaka  *   |             .            |                 |                       |
134*437bfbebSnyanmisaka  *   |             .            |                 |                       |
135*437bfbebSnyanmisaka  *   +--OSD-MD--encode---------->                 |                       |
136*437bfbebSnyanmisaka  *   |                          |                 |                       |
137*437bfbebSnyanmisaka  *   +----------deinit---------->                 |                       |
138*437bfbebSnyanmisaka  *   +                          +                 +                       +
139*437bfbebSnyanmisaka  */
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka /*
142*437bfbebSnyanmisaka  * encoder query interface is only for debug usage
143*437bfbebSnyanmisaka  */
144*437bfbebSnyanmisaka #define MPP_ENC_QUERY_STATUS        (0x00000001)
145*437bfbebSnyanmisaka #define MPP_ENC_QUERY_WAIT          (0x00000002)
146*437bfbebSnyanmisaka #define MPP_ENC_QUERY_FPS           (0x00000004)
147*437bfbebSnyanmisaka #define MPP_ENC_QUERY_BPS           (0x00000008)
148*437bfbebSnyanmisaka #define MPP_ENC_QUERY_ENC_IN_FRM    (0x00000010)
149*437bfbebSnyanmisaka #define MPP_ENC_QUERY_ENC_WORK      (0x00000020)
150*437bfbebSnyanmisaka #define MPP_ENC_QUERY_ENC_OUT_PKT   (0x00000040)
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka #define MPP_ENC_QUERY_ALL           (MPP_ENC_QUERY_STATUS       | \
153*437bfbebSnyanmisaka                                      MPP_ENC_QUERY_WAIT         | \
154*437bfbebSnyanmisaka                                      MPP_ENC_QUERY_FPS          | \
155*437bfbebSnyanmisaka                                      MPP_ENC_QUERY_BPS          | \
156*437bfbebSnyanmisaka                                      MPP_ENC_QUERY_ENC_IN_FRM   | \
157*437bfbebSnyanmisaka                                      MPP_ENC_QUERY_ENC_WORK     | \
158*437bfbebSnyanmisaka                                      MPP_ENC_QUERY_ENC_OUT_PKT)
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka typedef struct MppEncQueryCfg_t {
161*437bfbebSnyanmisaka     /*
162*437bfbebSnyanmisaka      * 32 bit query flag for query data check
163*437bfbebSnyanmisaka      * Each bit represent a query data switch.
164*437bfbebSnyanmisaka      * bit 0 - for querying encoder runtime status
165*437bfbebSnyanmisaka      * bit 1 - for querying encoder runtime waiting status
166*437bfbebSnyanmisaka      * bit 2 - for querying encoder realtime encode fps
167*437bfbebSnyanmisaka      * bit 3 - for querying encoder realtime output bps
168*437bfbebSnyanmisaka      * bit 4 - for querying encoder input frame count
169*437bfbebSnyanmisaka      * bit 5 - for querying encoder start hardware times
170*437bfbebSnyanmisaka      * bit 6 - for querying encoder output packet count
171*437bfbebSnyanmisaka      */
172*437bfbebSnyanmisaka     RK_U32      query_flag;
173*437bfbebSnyanmisaka 
174*437bfbebSnyanmisaka     /* 64 bit query data output */
175*437bfbebSnyanmisaka     RK_U32      rt_status;
176*437bfbebSnyanmisaka     RK_U32      rt_wait;
177*437bfbebSnyanmisaka     RK_U32      rt_fps;
178*437bfbebSnyanmisaka     RK_U32      rt_bps;
179*437bfbebSnyanmisaka     RK_U32      enc_in_frm_cnt;
180*437bfbebSnyanmisaka     RK_U32      enc_hw_run_cnt;
181*437bfbebSnyanmisaka     RK_U32      enc_out_pkt_cnt;
182*437bfbebSnyanmisaka } MppEncQueryCfg;
183*437bfbebSnyanmisaka 
184*437bfbebSnyanmisaka /*
185*437bfbebSnyanmisaka  * base working mode parameter
186*437bfbebSnyanmisaka  */
187*437bfbebSnyanmisaka typedef struct MppEncBaseCfg_t {
188*437bfbebSnyanmisaka     MppCodingType coding;
189*437bfbebSnyanmisaka     RK_S32  low_delay;
190*437bfbebSnyanmisaka     RK_S32  smart_en;
191*437bfbebSnyanmisaka     RK_S32  smt1_en;
192*437bfbebSnyanmisaka     RK_S32  smt3_en;
193*437bfbebSnyanmisaka } MppEncBaseCfg;
194*437bfbebSnyanmisaka 
195*437bfbebSnyanmisaka /*
196*437bfbebSnyanmisaka  * Rate control parameter
197*437bfbebSnyanmisaka  */
198*437bfbebSnyanmisaka typedef enum MppEncRcQuality_e {
199*437bfbebSnyanmisaka     MPP_ENC_RC_QUALITY_WORST,
200*437bfbebSnyanmisaka     MPP_ENC_RC_QUALITY_WORSE,
201*437bfbebSnyanmisaka     MPP_ENC_RC_QUALITY_MEDIUM,
202*437bfbebSnyanmisaka     MPP_ENC_RC_QUALITY_BETTER,
203*437bfbebSnyanmisaka     MPP_ENC_RC_QUALITY_BEST,
204*437bfbebSnyanmisaka     MPP_ENC_RC_QUALITY_CQP,
205*437bfbebSnyanmisaka     MPP_ENC_RC_QUALITY_AQ_ONLY,
206*437bfbebSnyanmisaka     MPP_ENC_RC_QUALITY_BUTT
207*437bfbebSnyanmisaka } MppEncRcQuality;
208*437bfbebSnyanmisaka 
209*437bfbebSnyanmisaka typedef struct MppEncRcCfg_t {
210*437bfbebSnyanmisaka     /*
211*437bfbebSnyanmisaka      * rc_mode - rate control mode
212*437bfbebSnyanmisaka      *
213*437bfbebSnyanmisaka      * mpp provide two rate control mode:
214*437bfbebSnyanmisaka      *
215*437bfbebSnyanmisaka      * Constant Bit Rate (CBR) mode
216*437bfbebSnyanmisaka      * - paramter 'bps*' define target bps
217*437bfbebSnyanmisaka      * - paramter quality and qp will not take effect
218*437bfbebSnyanmisaka      *
219*437bfbebSnyanmisaka      * Variable Bit Rate (VBR) mode
220*437bfbebSnyanmisaka      * - paramter 'quality' define 5 quality levels
221*437bfbebSnyanmisaka      * - paramter 'bps*' is used as reference but not strict condition
222*437bfbebSnyanmisaka      * - special Constant QP (CQP) mode is under VBR mode
223*437bfbebSnyanmisaka      *   CQP mode will work with qp in CodecCfg. But only use for test
224*437bfbebSnyanmisaka      *
225*437bfbebSnyanmisaka      * default: CBR
226*437bfbebSnyanmisaka      */
227*437bfbebSnyanmisaka     MppEncRcMode rc_mode;
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka     /*
230*437bfbebSnyanmisaka      * quality - quality parameter, only takes effect in VBR mode
231*437bfbebSnyanmisaka      *
232*437bfbebSnyanmisaka      * Mpp does not give the direct parameter in different protocol.
233*437bfbebSnyanmisaka      *
234*437bfbebSnyanmisaka      * Mpp provide total 5 quality level:
235*437bfbebSnyanmisaka      * Worst - worse - Medium - better - best
236*437bfbebSnyanmisaka      *
237*437bfbebSnyanmisaka      * extra CQP level means special constant-qp (CQP) mode
238*437bfbebSnyanmisaka      *
239*437bfbebSnyanmisaka      * default value: Medium
240*437bfbebSnyanmisaka      */
241*437bfbebSnyanmisaka     MppEncRcQuality quality;
242*437bfbebSnyanmisaka 
243*437bfbebSnyanmisaka     /*
244*437bfbebSnyanmisaka      * bit rate parameters
245*437bfbebSnyanmisaka      * mpp gives three bit rate control parameter for control
246*437bfbebSnyanmisaka      * bps_target   - target  bit rate, unit: bit per second
247*437bfbebSnyanmisaka      * bps_max      - maximun bit rate, unit: bit per second
248*437bfbebSnyanmisaka      * bps_min      - minimun bit rate, unit: bit per second
249*437bfbebSnyanmisaka      * if user need constant bit rate set parameters to the similar value
250*437bfbebSnyanmisaka      * if user need variable bit rate set parameters as they need
251*437bfbebSnyanmisaka      */
252*437bfbebSnyanmisaka     RK_S32  bps_target;
253*437bfbebSnyanmisaka     RK_S32  bps_max;
254*437bfbebSnyanmisaka     RK_S32  bps_min;
255*437bfbebSnyanmisaka 
256*437bfbebSnyanmisaka     /*
257*437bfbebSnyanmisaka      * frame rate parameters have great effect on rate control
258*437bfbebSnyanmisaka      *
259*437bfbebSnyanmisaka      * fps_in_flex
260*437bfbebSnyanmisaka      * 0 - fix input frame rate
261*437bfbebSnyanmisaka      * 1 - variable input frame rate
262*437bfbebSnyanmisaka      *
263*437bfbebSnyanmisaka      * fps_in_num
264*437bfbebSnyanmisaka      * input frame rate numerator, if 0 then default 30
265*437bfbebSnyanmisaka      *
266*437bfbebSnyanmisaka      * fps_in_denom
267*437bfbebSnyanmisaka      * input frame rate denominator, if 0 then default 1
268*437bfbebSnyanmisaka      *
269*437bfbebSnyanmisaka      * fps_out_flex
270*437bfbebSnyanmisaka      * 0 - fix output frame rate
271*437bfbebSnyanmisaka      * 1 - variable output frame rate
272*437bfbebSnyanmisaka      *
273*437bfbebSnyanmisaka      * fps_out_num
274*437bfbebSnyanmisaka      * output frame rate numerator, if 0 then default 30
275*437bfbebSnyanmisaka      *
276*437bfbebSnyanmisaka      * fps_out_denom
277*437bfbebSnyanmisaka      * output frame rate denominator, if 0 then default 1
278*437bfbebSnyanmisaka      */
279*437bfbebSnyanmisaka     RK_S32  fps_in_flex;
280*437bfbebSnyanmisaka     RK_S32  fps_in_num;
281*437bfbebSnyanmisaka     RK_S32  fps_in_denom;
282*437bfbebSnyanmisaka     RK_S32  fps_out_flex;
283*437bfbebSnyanmisaka     RK_S32  fps_out_num;
284*437bfbebSnyanmisaka     RK_S32  fps_out_denom;
285*437bfbebSnyanmisaka     /*
286*437bfbebSnyanmisaka      * Whether to encoder IDR when fps_out is changed.
287*437bfbebSnyanmisaka      * 0 -- default value, SPS, PPS headers and IDR will be added.
288*437bfbebSnyanmisaka      * 1 -- only SPS, PPS headers is added.
289*437bfbebSnyanmisaka      */
290*437bfbebSnyanmisaka     RK_S32  fps_chg_no_idr;
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka     /*
293*437bfbebSnyanmisaka      * gop - group of picture, gap between Intra frame
294*437bfbebSnyanmisaka      * 0 for only 1 I frame the rest are all P frames
295*437bfbebSnyanmisaka      * 1 for all I frame
296*437bfbebSnyanmisaka      * 2 for I P I P I P
297*437bfbebSnyanmisaka      * 3 for I P P I P P
298*437bfbebSnyanmisaka      * etc...
299*437bfbebSnyanmisaka      */
300*437bfbebSnyanmisaka     RK_S32  gop;
301*437bfbebSnyanmisaka     /* internal gop mode: 0 - normal P; 1 - smart P */
302*437bfbebSnyanmisaka     RK_S32                  gop_mode;
303*437bfbebSnyanmisaka     void    *ref_cfg;
304*437bfbebSnyanmisaka 
305*437bfbebSnyanmisaka     /*
306*437bfbebSnyanmisaka      * skip_cnt - max continuous frame skip count
307*437bfbebSnyanmisaka      * 0 - frame skip is not allow
308*437bfbebSnyanmisaka      */
309*437bfbebSnyanmisaka     RK_S32  skip_cnt;
310*437bfbebSnyanmisaka 
311*437bfbebSnyanmisaka     /*
312*437bfbebSnyanmisaka      * max_reenc_times - max reencode time for one frame
313*437bfbebSnyanmisaka      * 0 - reencode is not allowed
314*437bfbebSnyanmisaka      * 1~3 max reencode time is limited to 3
315*437bfbebSnyanmisaka      */
316*437bfbebSnyanmisaka     RK_U32  max_reenc_times;
317*437bfbebSnyanmisaka 
318*437bfbebSnyanmisaka     /*
319*437bfbebSnyanmisaka      * stats_time   - the time of bitrate statistics
320*437bfbebSnyanmisaka      */
321*437bfbebSnyanmisaka     RK_S32  stats_time;
322*437bfbebSnyanmisaka 
323*437bfbebSnyanmisaka     /*
324*437bfbebSnyanmisaka      * drop frame parameters
325*437bfbebSnyanmisaka      * used on bitrate is far over the max bitrate
326*437bfbebSnyanmisaka      *
327*437bfbebSnyanmisaka      * drop_mode
328*437bfbebSnyanmisaka      *
329*437bfbebSnyanmisaka      * MPP_ENC_RC_DROP_FRM_DISABLED
330*437bfbebSnyanmisaka      * - do not drop frame when bitrate overflow.
331*437bfbebSnyanmisaka      * MPP_ENC_RC_DROP_FRM_NORMAL
332*437bfbebSnyanmisaka      * - do not encode the dropped frame when bitrate overflow.
333*437bfbebSnyanmisaka      * MPP_ENC_RC_DROP_FRM_PSKIP
334*437bfbebSnyanmisaka      * - encode a all skip frame when bitrate overflow.
335*437bfbebSnyanmisaka      *
336*437bfbebSnyanmisaka      * drop_threshold
337*437bfbebSnyanmisaka      *
338*437bfbebSnyanmisaka      * The percentage threshold over max_bitrate for trigger frame drop.
339*437bfbebSnyanmisaka      *
340*437bfbebSnyanmisaka      * drop_gap
341*437bfbebSnyanmisaka      * The max continuous frame drop number
342*437bfbebSnyanmisaka      */
343*437bfbebSnyanmisaka     MppEncRcDropFrmMode     drop_mode;
344*437bfbebSnyanmisaka     RK_U32                  drop_threshold;
345*437bfbebSnyanmisaka     RK_U32                  drop_gap;
346*437bfbebSnyanmisaka 
347*437bfbebSnyanmisaka     MppEncRcSuperFrameMode  super_mode;
348*437bfbebSnyanmisaka     RK_U32                  super_i_thd;
349*437bfbebSnyanmisaka     RK_U32                  super_p_thd;
350*437bfbebSnyanmisaka 
351*437bfbebSnyanmisaka     MppEncRcPriority        rc_priority;
352*437bfbebSnyanmisaka 
353*437bfbebSnyanmisaka     RK_U32                  debreath_en;
354*437bfbebSnyanmisaka     RK_U32                  debre_strength;
355*437bfbebSnyanmisaka     RK_S32                  max_i_prop;
356*437bfbebSnyanmisaka     RK_S32                  min_i_prop;
357*437bfbebSnyanmisaka     RK_S32                  init_ip_ratio;
358*437bfbebSnyanmisaka 
359*437bfbebSnyanmisaka     /* general qp control */
360*437bfbebSnyanmisaka     RK_S32                  qp_init;
361*437bfbebSnyanmisaka     RK_S32                  qp_max;
362*437bfbebSnyanmisaka     RK_S32                  qp_max_i;
363*437bfbebSnyanmisaka     RK_S32                  qp_min;
364*437bfbebSnyanmisaka     RK_S32                  qp_min_i;
365*437bfbebSnyanmisaka     RK_S32                  qp_max_step;                /* delta qp between each two P frame */
366*437bfbebSnyanmisaka     RK_S32                  qp_delta_ip;                /* delta qp between I and P */
367*437bfbebSnyanmisaka     RK_S32                  qp_delta_vi;                /* delta qp between vi and P */
368*437bfbebSnyanmisaka     RK_S32                  fqp_min_i;
369*437bfbebSnyanmisaka     RK_S32                  fqp_min_p;
370*437bfbebSnyanmisaka     RK_S32                  fqp_max_i;
371*437bfbebSnyanmisaka     RK_S32                  fqp_max_p;
372*437bfbebSnyanmisaka     RK_S32                  mt_st_swth_frm_qp;
373*437bfbebSnyanmisaka 
374*437bfbebSnyanmisaka     RK_S32                  hier_qp_en;
375*437bfbebSnyanmisaka     RK_S32                  hier_qp_delta[4];
376*437bfbebSnyanmisaka     RK_S32                  hier_frame_num[4];
377*437bfbebSnyanmisaka 
378*437bfbebSnyanmisaka     RK_U32                  refresh_en;
379*437bfbebSnyanmisaka     MppEncRcRefreshMode     refresh_mode;
380*437bfbebSnyanmisaka     RK_U32                  refresh_num;
381*437bfbebSnyanmisaka     RK_S32                  refresh_length;
382*437bfbebSnyanmisaka     RK_S32                  inst_br_lvl;
383*437bfbebSnyanmisaka } MppEncRcCfg;
384*437bfbebSnyanmisaka 
385*437bfbebSnyanmisaka /*
386*437bfbebSnyanmisaka  * Hardware related rate control config
387*437bfbebSnyanmisaka  *
388*437bfbebSnyanmisaka  * This config will open some detail feature to external user to control
389*437bfbebSnyanmisaka  * hardware behavior directly.
390*437bfbebSnyanmisaka  */
391*437bfbebSnyanmisaka typedef struct MppEncHwCfg_t {
392*437bfbebSnyanmisaka     /* vepu541/vepu540 */
393*437bfbebSnyanmisaka     RK_S32                  qp_delta_row;               /* delta qp between two row in P frame */
394*437bfbebSnyanmisaka     RK_S32                  qp_delta_row_i;             /* delta qp between two row in I frame */
395*437bfbebSnyanmisaka     RK_S32                  qbias_i;
396*437bfbebSnyanmisaka     RK_S32                  qbias_p;
397*437bfbebSnyanmisaka     RK_S32                  qbias_en;
398*437bfbebSnyanmisaka     RK_S32                  flt_str_i;
399*437bfbebSnyanmisaka     RK_S32                  flt_str_p;
400*437bfbebSnyanmisaka     RK_U32                  aq_thrd_i[16];
401*437bfbebSnyanmisaka     RK_U32                  aq_thrd_p[16];
402*437bfbebSnyanmisaka     RK_S32                  aq_step_i[16];
403*437bfbebSnyanmisaka     RK_S32                  aq_step_p[16];
404*437bfbebSnyanmisaka 
405*437bfbebSnyanmisaka     /* vepu1/2 */
406*437bfbebSnyanmisaka     RK_S32                  mb_rc_disable;
407*437bfbebSnyanmisaka 
408*437bfbebSnyanmisaka     /* vepu580 */
409*437bfbebSnyanmisaka     RK_S32                  extra_buf;
410*437bfbebSnyanmisaka 
411*437bfbebSnyanmisaka     /*
412*437bfbebSnyanmisaka      * block mode decision bias config
413*437bfbebSnyanmisaka      * 0 - intra32x32
414*437bfbebSnyanmisaka      * 1 - intra16x16
415*437bfbebSnyanmisaka      * 2 - intra8x8
416*437bfbebSnyanmisaka      * 3 - intra4x4
417*437bfbebSnyanmisaka      * 4 - inter64x64
418*437bfbebSnyanmisaka      * 5 - inter32x32
419*437bfbebSnyanmisaka      * 6 - inter16x16
420*437bfbebSnyanmisaka      * 7 - inter8x8
421*437bfbebSnyanmisaka      * value range 0 ~ 15, default : 8
422*437bfbebSnyanmisaka      * If the value is smaller then encoder will be more likely to encode corresponding block mode.
423*437bfbebSnyanmisaka      */
424*437bfbebSnyanmisaka     RK_S32                  mode_bias[8];
425*437bfbebSnyanmisaka 
426*437bfbebSnyanmisaka     /*
427*437bfbebSnyanmisaka      * skip mode bias config
428*437bfbebSnyanmisaka      * skip_bias_en - enable flag for skip bias config
429*437bfbebSnyanmisaka      * skip_sad     - sad threshold for skip / non-skip
430*437bfbebSnyanmisaka      * skip_bias    - tendency for skip, value range 0 ~ 15, default : 8
431*437bfbebSnyanmisaka      *                If the value is smaller then encoder will be more likely to encode skip block.
432*437bfbebSnyanmisaka      */
433*437bfbebSnyanmisaka     RK_S32                  skip_bias_en;
434*437bfbebSnyanmisaka     RK_S32                  skip_sad;
435*437bfbebSnyanmisaka     RK_S32                  skip_bias;
436*437bfbebSnyanmisaka 
437*437bfbebSnyanmisaka     /* vepu500
438*437bfbebSnyanmisaka      * 0-2: I frame thd; 3-6: I frame bias
439*437bfbebSnyanmisaka      * 7-9: P frame thd; 10-13: I block bias of P frame
440*437bfbebSnyanmisaka      * 14-17: P block bias of P frame
441*437bfbebSnyanmisaka      */
442*437bfbebSnyanmisaka     RK_S32                  qbias_arr[18];
443*437bfbebSnyanmisaka     /* vepu500
444*437bfbebSnyanmisaka      * 0: aq16_range; 1: aq32_range; 2: aq8_range
445*437bfbebSnyanmisaka      * 3: aq16_diff0; 4: aq16_diff1
446*437bfbebSnyanmisaka      * 0 ~ 4 for I frame, 5 ~ 9 for P frame
447*437bfbebSnyanmisaka      */
448*437bfbebSnyanmisaka     RK_S32                  aq_rnge_arr[10];
449*437bfbebSnyanmisaka } MppEncHwCfg;
450*437bfbebSnyanmisaka 
451*437bfbebSnyanmisaka /*
452*437bfbebSnyanmisaka  * Mpp preprocess parameter
453*437bfbebSnyanmisaka  */
454*437bfbebSnyanmisaka /*
455*437bfbebSnyanmisaka  * Preprocess sharpen parameter
456*437bfbebSnyanmisaka  *
457*437bfbebSnyanmisaka  * 5x5 sharpen core
458*437bfbebSnyanmisaka  *
459*437bfbebSnyanmisaka  * enable_y  - enable luma sharpen
460*437bfbebSnyanmisaka  * enable_uv - enable chroma sharpen
461*437bfbebSnyanmisaka  */
462*437bfbebSnyanmisaka typedef struct {
463*437bfbebSnyanmisaka     RK_U32              enable_y;
464*437bfbebSnyanmisaka     RK_U32              enable_uv;
465*437bfbebSnyanmisaka     RK_S32              coef[5];
466*437bfbebSnyanmisaka     RK_S32              div;
467*437bfbebSnyanmisaka     RK_S32              threshold;
468*437bfbebSnyanmisaka } MppEncPrepSharpenCfg;
469*437bfbebSnyanmisaka 
470*437bfbebSnyanmisaka /*
471*437bfbebSnyanmisaka  * input frame rotation parameter
472*437bfbebSnyanmisaka  * 0 - disable rotation
473*437bfbebSnyanmisaka  * 1 - 90 degree
474*437bfbebSnyanmisaka  * 2 - 180 degree
475*437bfbebSnyanmisaka  * 3 - 270 degree
476*437bfbebSnyanmisaka  */
477*437bfbebSnyanmisaka typedef enum MppEncRotationCfg_e {
478*437bfbebSnyanmisaka     MPP_ENC_ROT_0,
479*437bfbebSnyanmisaka     MPP_ENC_ROT_90,
480*437bfbebSnyanmisaka     MPP_ENC_ROT_180,
481*437bfbebSnyanmisaka     MPP_ENC_ROT_270,
482*437bfbebSnyanmisaka     MPP_ENC_ROT_BUTT
483*437bfbebSnyanmisaka } MppEncRotationCfg;
484*437bfbebSnyanmisaka 
485*437bfbebSnyanmisaka typedef struct MppEncPrepCfg_t {
486*437bfbebSnyanmisaka     /*
487*437bfbebSnyanmisaka      * Mpp encoder input data dimension config
488*437bfbebSnyanmisaka      *
489*437bfbebSnyanmisaka      * width / height / hor_stride / ver_stride / format
490*437bfbebSnyanmisaka      * These information will be used for buffer allocation and rc config init
491*437bfbebSnyanmisaka      * The output format is always YUV420. So if input is RGB then color
492*437bfbebSnyanmisaka      * conversion will be done internally
493*437bfbebSnyanmisaka      */
494*437bfbebSnyanmisaka     /* width / height set - user set value */
495*437bfbebSnyanmisaka     RK_S32              width_set;
496*437bfbebSnyanmisaka     RK_S32              height_set;
497*437bfbebSnyanmisaka     /* width / height - final value in bitstream */
498*437bfbebSnyanmisaka     RK_S32              width;
499*437bfbebSnyanmisaka     RK_S32              height;
500*437bfbebSnyanmisaka     RK_S32              hor_stride;
501*437bfbebSnyanmisaka     RK_S32              ver_stride;
502*437bfbebSnyanmisaka     RK_S32              max_width;
503*437bfbebSnyanmisaka     RK_S32              max_height;
504*437bfbebSnyanmisaka 
505*437bfbebSnyanmisaka     /* resolution change flag */
506*437bfbebSnyanmisaka     RK_S32              change_res;
507*437bfbebSnyanmisaka 
508*437bfbebSnyanmisaka     /*
509*437bfbebSnyanmisaka      * Mpp encoder input/output color config
510*437bfbebSnyanmisaka      */
511*437bfbebSnyanmisaka     MppFrameFormat      format;
512*437bfbebSnyanmisaka     MppFrameColorSpace  color;
513*437bfbebSnyanmisaka     MppFrameColorPrimaries colorprim;
514*437bfbebSnyanmisaka     MppFrameColorTransferCharacteristic colortrc;
515*437bfbebSnyanmisaka     MppFrameColorRange  range;
516*437bfbebSnyanmisaka     MppFrameChromaFormat format_out;
517*437bfbebSnyanmisaka     MppFrameChromaDownSampleMode chroma_ds_mode;
518*437bfbebSnyanmisaka     MppFrameColorRange  range_out;
519*437bfbebSnyanmisaka     RK_S32              fix_chroma_en;
520*437bfbebSnyanmisaka     RK_S32              fix_chroma_u;
521*437bfbebSnyanmisaka     RK_S32              fix_chroma_v;
522*437bfbebSnyanmisaka 
523*437bfbebSnyanmisaka     /* suffix ext means the user set config externally */
524*437bfbebSnyanmisaka     MppEncRotationCfg   rotation;
525*437bfbebSnyanmisaka     MppEncRotationCfg   rotation_ext;
526*437bfbebSnyanmisaka 
527*437bfbebSnyanmisaka     /*
528*437bfbebSnyanmisaka      * input frame mirroring parameter
529*437bfbebSnyanmisaka      * 0 - disable mirroring
530*437bfbebSnyanmisaka      * 1 - horizontal mirroring
531*437bfbebSnyanmisaka      */
532*437bfbebSnyanmisaka     RK_S32              mirroring;
533*437bfbebSnyanmisaka     RK_S32              mirroring_ext;
534*437bfbebSnyanmisaka 
535*437bfbebSnyanmisaka     /*
536*437bfbebSnyanmisaka      * input frame flip parameter
537*437bfbebSnyanmisaka      * 0 - disable flip
538*437bfbebSnyanmisaka      * 1 - flip, vertical mirror transformation
539*437bfbebSnyanmisaka      */
540*437bfbebSnyanmisaka     RK_S32              flip;
541*437bfbebSnyanmisaka 
542*437bfbebSnyanmisaka     /*
543*437bfbebSnyanmisaka      * TODO:
544*437bfbebSnyanmisaka      */
545*437bfbebSnyanmisaka     RK_S32              denoise;
546*437bfbebSnyanmisaka 
547*437bfbebSnyanmisaka     MppEncPrepSharpenCfg sharpen;
548*437bfbebSnyanmisaka } MppEncPrepCfg;
549*437bfbebSnyanmisaka 
550*437bfbebSnyanmisaka /*
551*437bfbebSnyanmisaka  * Mpp Motion Detection parameter
552*437bfbebSnyanmisaka  *
553*437bfbebSnyanmisaka  * Mpp can output Motion Detection infomation for each frame.
554*437bfbebSnyanmisaka  * If user euqueue a encode task with KEY_MOTION_INFO by following function
555*437bfbebSnyanmisaka  * then encoder will output Motion Detection information to the buffer.
556*437bfbebSnyanmisaka  *
557*437bfbebSnyanmisaka  * mpp_task_meta_set_buffer(task, KEY_MOTION_INFO, buffer);
558*437bfbebSnyanmisaka  *
559*437bfbebSnyanmisaka  * Motion Detection information will be organized in this way:
560*437bfbebSnyanmisaka  * 1. Each 16x16 block will have a 32 bit block information which contains
561*437bfbebSnyanmisaka  *    15 bit SAD(Sum of Abstract Difference value
562*437bfbebSnyanmisaka  *    9 bit signed horizontal motion vector
563*437bfbebSnyanmisaka  *    8 bit signed vertical motion vector
564*437bfbebSnyanmisaka  * 2. The sequence of MD information in the buffer is corresponding to the
565*437bfbebSnyanmisaka  *    block position in the frame, left-to right, top-to-bottom.
566*437bfbebSnyanmisaka  * 3. If the width of the frame is not a multiple of 256 pixels (16 macro
567*437bfbebSnyanmisaka  *    blocks), DMA would extend the frame to a multiple of 256 pixels and
568*437bfbebSnyanmisaka  *    the extended blocks' MD information are 32'h0000_0000.
569*437bfbebSnyanmisaka  * 4. Buffer must be ion buffer and 1024 byte aligned.
570*437bfbebSnyanmisaka  */
571*437bfbebSnyanmisaka typedef struct MppEncMDBlkInfo_t {
572*437bfbebSnyanmisaka     RK_U32              sad     : 15;   /* bit  0~14 - SAD */
573*437bfbebSnyanmisaka     RK_S32              mvx     : 9;    /* bit 15~23 - signed horizontal mv */
574*437bfbebSnyanmisaka     RK_S32              mvy     : 8;    /* bit 24~31 - signed vertical mv */
575*437bfbebSnyanmisaka } MppEncMDBlkInfo;
576*437bfbebSnyanmisaka 
577*437bfbebSnyanmisaka typedef enum MppEncHeaderMode_e {
578*437bfbebSnyanmisaka     /* default mode: attach vps/sps/pps only on first frame */
579*437bfbebSnyanmisaka     MPP_ENC_HEADER_MODE_DEFAULT,
580*437bfbebSnyanmisaka     /* IDR mode: attach vps/sps/pps on each IDR frame */
581*437bfbebSnyanmisaka     MPP_ENC_HEADER_MODE_EACH_IDR,
582*437bfbebSnyanmisaka     MPP_ENC_HEADER_MODE_BUTT,
583*437bfbebSnyanmisaka } MppEncHeaderMode;
584*437bfbebSnyanmisaka 
585*437bfbebSnyanmisaka typedef enum MppEncSeiMode_e {
586*437bfbebSnyanmisaka     MPP_ENC_SEI_MODE_DISABLE,                /* default mode, SEI writing is disabled */
587*437bfbebSnyanmisaka     MPP_ENC_SEI_MODE_ONE_SEQ,                /* one sequence has only one SEI */
588*437bfbebSnyanmisaka     MPP_ENC_SEI_MODE_ONE_FRAME               /* one frame may have one SEI, if SEI info has changed */
589*437bfbebSnyanmisaka } MppEncSeiMode;
590*437bfbebSnyanmisaka 
591*437bfbebSnyanmisaka /*
592*437bfbebSnyanmisaka  * Mpp codec parameter
593*437bfbebSnyanmisaka  * parameter is defined from here
594*437bfbebSnyanmisaka  */
595*437bfbebSnyanmisaka typedef struct MppEncVuiCfg_t {
596*437bfbebSnyanmisaka     RK_U32              change;
597*437bfbebSnyanmisaka     RK_S32              vui_en;
598*437bfbebSnyanmisaka     RK_S32              vui_aspect_ratio;
599*437bfbebSnyanmisaka     RK_S32              vui_sar_size;
600*437bfbebSnyanmisaka     RK_S32              full_range;
601*437bfbebSnyanmisaka     RK_S32              time_scale;
602*437bfbebSnyanmisaka } MppEncVuiCfg;
603*437bfbebSnyanmisaka 
604*437bfbebSnyanmisaka /*
605*437bfbebSnyanmisaka  * H.264 configurable parameter
606*437bfbebSnyanmisaka  */
607*437bfbebSnyanmisaka /* default H.264 hardware config */
608*437bfbebSnyanmisaka typedef struct MppEncH264HwCfg_t {
609*437bfbebSnyanmisaka     /*
610*437bfbebSnyanmisaka      * VEPU 1/2 : 2
611*437bfbebSnyanmisaka      * others   : 0
612*437bfbebSnyanmisaka      */
613*437bfbebSnyanmisaka     RK_U32 hw_poc_type;
614*437bfbebSnyanmisaka     /*
615*437bfbebSnyanmisaka      * VEPU 1/2 : fixed to 12
616*437bfbebSnyanmisaka      * others   : changeable, default 12
617*437bfbebSnyanmisaka      */
618*437bfbebSnyanmisaka     RK_U32 hw_log2_max_frame_num_minus4;
619*437bfbebSnyanmisaka     /* default 0, only RKVENC2 support split out */
620*437bfbebSnyanmisaka     RK_U32 hw_split_out;
621*437bfbebSnyanmisaka } MppEncH264HwCfg;
622*437bfbebSnyanmisaka 
623*437bfbebSnyanmisaka typedef struct MppEncH264Cfg_t {
624*437bfbebSnyanmisaka     /*
625*437bfbebSnyanmisaka      * H.264 stream format
626*437bfbebSnyanmisaka      * 0 - H.264 Annex B: NAL unit starts with '00 00 00 01'
627*437bfbebSnyanmisaka      * 1 - Plain NAL units without startcode
628*437bfbebSnyanmisaka      */
629*437bfbebSnyanmisaka     RK_S32              stream_type;
630*437bfbebSnyanmisaka 
631*437bfbebSnyanmisaka     /*
632*437bfbebSnyanmisaka      * H.264 codec syntax config
633*437bfbebSnyanmisaka      *
634*437bfbebSnyanmisaka      * do NOT setup the three option below unless you are familiar with encoder detail
635*437bfbebSnyanmisaka      * poc_type             - picture order count type 0 ~ 2
636*437bfbebSnyanmisaka      * log2_max_poc_lsb     - used in sps with poc_type 0,
637*437bfbebSnyanmisaka      * log2_max_frame_num   - used in sps
638*437bfbebSnyanmisaka      */
639*437bfbebSnyanmisaka     RK_U32              poc_type;
640*437bfbebSnyanmisaka     RK_U32              log2_max_poc_lsb;
641*437bfbebSnyanmisaka     RK_U32              log2_max_frame_num; /* actually log2_max_frame_num_minus4 */
642*437bfbebSnyanmisaka     RK_U32              gaps_not_allowed;
643*437bfbebSnyanmisaka 
644*437bfbebSnyanmisaka     MppEncH264HwCfg     hw_cfg;
645*437bfbebSnyanmisaka 
646*437bfbebSnyanmisaka     /*
647*437bfbebSnyanmisaka      * H.264 profile_idc parameter
648*437bfbebSnyanmisaka      * 66  - Baseline profile
649*437bfbebSnyanmisaka      * 77  - Main profile
650*437bfbebSnyanmisaka      * 100 - High profile
651*437bfbebSnyanmisaka      */
652*437bfbebSnyanmisaka     RK_S32              profile;
653*437bfbebSnyanmisaka 
654*437bfbebSnyanmisaka     /*
655*437bfbebSnyanmisaka      * H.264 level_idc parameter
656*437bfbebSnyanmisaka      * 10 / 11 / 12 / 13    - qcif@15fps / cif@7.5fps / cif@15fps / cif@30fps
657*437bfbebSnyanmisaka      * 20 / 21 / 22         - cif@30fps / half-D1@@25fps / D1@12.5fps
658*437bfbebSnyanmisaka      * 30 / 31 / 32         - D1@25fps / 720p@30fps / 720p@60fps
659*437bfbebSnyanmisaka      * 40 / 41 / 42         - 1080p@30fps / 1080p@30fps / 1080p@60fps
660*437bfbebSnyanmisaka      * 50 / 51 / 52         - 4K@30fps
661*437bfbebSnyanmisaka      */
662*437bfbebSnyanmisaka     RK_S32              level;
663*437bfbebSnyanmisaka 
664*437bfbebSnyanmisaka     /*
665*437bfbebSnyanmisaka      * H.264 entropy coding method
666*437bfbebSnyanmisaka      * 0 - CAVLC
667*437bfbebSnyanmisaka      * 1 - CABAC
668*437bfbebSnyanmisaka      * When CABAC is select cabac_init_idc can be range 0~2
669*437bfbebSnyanmisaka      */
670*437bfbebSnyanmisaka     RK_S32              entropy_coding_mode;
671*437bfbebSnyanmisaka     RK_S32              entropy_coding_mode_ex;
672*437bfbebSnyanmisaka     RK_S32              cabac_init_idc;
673*437bfbebSnyanmisaka     RK_S32              cabac_init_idc_ex;
674*437bfbebSnyanmisaka 
675*437bfbebSnyanmisaka     /*
676*437bfbebSnyanmisaka      * 8x8 intra prediction and 8x8 transform enable flag
677*437bfbebSnyanmisaka      * This flag can only be enable under High profile
678*437bfbebSnyanmisaka      * 0 : disable (BP/MP)
679*437bfbebSnyanmisaka      * 1 : enable  (HP)
680*437bfbebSnyanmisaka      */
681*437bfbebSnyanmisaka     RK_S32              transform8x8_mode;
682*437bfbebSnyanmisaka     RK_S32              transform8x8_mode_ex;
683*437bfbebSnyanmisaka 
684*437bfbebSnyanmisaka     /*
685*437bfbebSnyanmisaka      * 0 : disable
686*437bfbebSnyanmisaka      * 1 : enable
687*437bfbebSnyanmisaka      */
688*437bfbebSnyanmisaka     RK_S32              constrained_intra_pred_mode;
689*437bfbebSnyanmisaka 
690*437bfbebSnyanmisaka     /*
691*437bfbebSnyanmisaka      * 0 : flat scaling list
692*437bfbebSnyanmisaka      * 1 : default scaling list for all cases
693*437bfbebSnyanmisaka      * 2 : customized scaling list (not supported)
694*437bfbebSnyanmisaka      */
695*437bfbebSnyanmisaka     RK_S32              scaling_list_mode;
696*437bfbebSnyanmisaka 
697*437bfbebSnyanmisaka     /*
698*437bfbebSnyanmisaka      * chroma qp offset (-12 - 12)
699*437bfbebSnyanmisaka      */
700*437bfbebSnyanmisaka     RK_S32              chroma_cb_qp_offset;
701*437bfbebSnyanmisaka     RK_S32              chroma_cr_qp_offset;
702*437bfbebSnyanmisaka 
703*437bfbebSnyanmisaka     /*
704*437bfbebSnyanmisaka      * H.264 deblock filter mode flag
705*437bfbebSnyanmisaka      * 0 : enable
706*437bfbebSnyanmisaka      * 1 : disable
707*437bfbebSnyanmisaka      * 2 : disable deblocking filter at slice boundaries
708*437bfbebSnyanmisaka      *
709*437bfbebSnyanmisaka      * deblock filter offset alpha (-6 - 6)
710*437bfbebSnyanmisaka      * deblock filter offset beta  (-6 - 6)
711*437bfbebSnyanmisaka      */
712*437bfbebSnyanmisaka     RK_S32              deblock_disable;
713*437bfbebSnyanmisaka     RK_S32              deblock_offset_alpha;
714*437bfbebSnyanmisaka     RK_S32              deblock_offset_beta;
715*437bfbebSnyanmisaka 
716*437bfbebSnyanmisaka     /*
717*437bfbebSnyanmisaka      * H.264 long term reference picture enable flag
718*437bfbebSnyanmisaka      * 0 - disable
719*437bfbebSnyanmisaka      * 1 - enable
720*437bfbebSnyanmisaka      */
721*437bfbebSnyanmisaka     RK_S32              use_longterm;
722*437bfbebSnyanmisaka 
723*437bfbebSnyanmisaka     /*
724*437bfbebSnyanmisaka      * quality config
725*437bfbebSnyanmisaka      * qp_max       - 8  ~ 51
726*437bfbebSnyanmisaka      * qp_max_i     - 10 ~ 40
727*437bfbebSnyanmisaka      * qp_min       - 8  ~ 48
728*437bfbebSnyanmisaka      * qp_min_i     - 10 ~ 40
729*437bfbebSnyanmisaka      * qp_max_step  - max delta qp step between two frames
730*437bfbebSnyanmisaka      */
731*437bfbebSnyanmisaka     RK_S32              qp_init;
732*437bfbebSnyanmisaka     RK_S16              qp_max;
733*437bfbebSnyanmisaka     RK_S16              qp_max_i;
734*437bfbebSnyanmisaka     RK_S16              qp_min;
735*437bfbebSnyanmisaka     RK_S16              qp_min_i;
736*437bfbebSnyanmisaka     RK_S16              qp_max_step;
737*437bfbebSnyanmisaka     RK_S16              qp_delta_ip;
738*437bfbebSnyanmisaka 
739*437bfbebSnyanmisaka     /*
740*437bfbebSnyanmisaka      * intra fresh config
741*437bfbebSnyanmisaka      *
742*437bfbebSnyanmisaka      * intra_refresh_mode
743*437bfbebSnyanmisaka      * 0 - no intra refresh
744*437bfbebSnyanmisaka      * 1 - intra refresh by MB row
745*437bfbebSnyanmisaka      * 2 - intra refresh by MB column
746*437bfbebSnyanmisaka      * 3 - intra refresh by MB gap
747*437bfbebSnyanmisaka      *
748*437bfbebSnyanmisaka      * intra_refresh_arg
749*437bfbebSnyanmisaka      * mode 0 - no effect
750*437bfbebSnyanmisaka      * mode 1 - refresh MB row number
751*437bfbebSnyanmisaka      * mode 2 - refresh MB colmn number
752*437bfbebSnyanmisaka      * mode 3 - refresh MB gap count
753*437bfbebSnyanmisaka      */
754*437bfbebSnyanmisaka     RK_S32              intra_refresh_mode;
755*437bfbebSnyanmisaka     RK_S32              intra_refresh_arg;
756*437bfbebSnyanmisaka 
757*437bfbebSnyanmisaka     /* extra mode config */
758*437bfbebSnyanmisaka     RK_S32              max_ltr_frames;
759*437bfbebSnyanmisaka     RK_S32              max_tid;
760*437bfbebSnyanmisaka     RK_S32              prefix_mode;
761*437bfbebSnyanmisaka     RK_S32              base_layer_pid;
762*437bfbebSnyanmisaka     /*
763*437bfbebSnyanmisaka      * Mpp encoder constraint_set parameter
764*437bfbebSnyanmisaka      * Mpp encoder constraint_set controls constraint_setx_flag in AVC.
765*437bfbebSnyanmisaka      * Mpp encoder constraint_set uses type RK_U32 to store force_flag and constraint_force as followed.
766*437bfbebSnyanmisaka      * | 00 | force_flag | 00 | constraint_force |
767*437bfbebSnyanmisaka      * As for force_flag and constraint_force, only low 6 bits are valid,
768*437bfbebSnyanmisaka      * corresponding to constraint_setx_flag from 5 to 0.
769*437bfbebSnyanmisaka      * If force_flag bit is enabled, constraint_setx_flag will be set correspondingly.
770*437bfbebSnyanmisaka      * Otherwise, constraint_setx_flag will use default value.
771*437bfbebSnyanmisaka      */
772*437bfbebSnyanmisaka     RK_U32              constraint_set;
773*437bfbebSnyanmisaka 
774*437bfbebSnyanmisaka     /* extra info */
775*437bfbebSnyanmisaka     MppEncVuiCfg        vui;
776*437bfbebSnyanmisaka } MppEncH264Cfg;
777*437bfbebSnyanmisaka 
778*437bfbebSnyanmisaka #define H265E_MAX_ROI_NUMBER  64
779*437bfbebSnyanmisaka 
780*437bfbebSnyanmisaka typedef struct H265eRect_t {
781*437bfbebSnyanmisaka     RK_S32              left;
782*437bfbebSnyanmisaka     RK_S32              right;
783*437bfbebSnyanmisaka     RK_S32              top;
784*437bfbebSnyanmisaka     RK_S32              bottom;
785*437bfbebSnyanmisaka } H265eRect;
786*437bfbebSnyanmisaka 
787*437bfbebSnyanmisaka typedef struct H265eRoi_Region_t {
788*437bfbebSnyanmisaka     RK_U8               level;
789*437bfbebSnyanmisaka     H265eRect           rect;
790*437bfbebSnyanmisaka } H265eRoiRegion;
791*437bfbebSnyanmisaka 
792*437bfbebSnyanmisaka typedef struct H265eCtuQp_t {
793*437bfbebSnyanmisaka     /* the qp value using in ctu region */
794*437bfbebSnyanmisaka     RK_U32              qp;
795*437bfbebSnyanmisaka 
796*437bfbebSnyanmisaka     /*
797*437bfbebSnyanmisaka      * define the ctu region
798*437bfbebSnyanmisaka      * method = H265E_METHOD_CUT_SIZE, the value of rect is in ctu size
799*437bfbebSnyanmisaka      * method = H264E_METHOD_COORDINATE,the value of rect is in coordinates
800*437bfbebSnyanmisaka      */
801*437bfbebSnyanmisaka     H265eRect           rect;
802*437bfbebSnyanmisaka } H265eCtu;
803*437bfbebSnyanmisaka 
804*437bfbebSnyanmisaka /*
805*437bfbebSnyanmisaka  * define the method when set CTU/ROI parameters
806*437bfbebSnyanmisaka  * this value is using by method in H265eCtuRegion or H265eRoi struct
807*437bfbebSnyanmisaka  */
808*437bfbebSnyanmisaka typedef enum {
809*437bfbebSnyanmisaka     H265E_METHOD_CTU_SIZE,
810*437bfbebSnyanmisaka     H264E_METHOD_COORDINATE,
811*437bfbebSnyanmisaka } H265eCtuMethod;
812*437bfbebSnyanmisaka 
813*437bfbebSnyanmisaka /*
814*437bfbebSnyanmisaka  * H.265 configurable parameter
815*437bfbebSnyanmisaka  */
816*437bfbebSnyanmisaka typedef struct MppEncH265SliceCfg_t {
817*437bfbebSnyanmisaka     /* default value: 0, means no slice split*/
818*437bfbebSnyanmisaka     RK_U32  split_enable;
819*437bfbebSnyanmisaka 
820*437bfbebSnyanmisaka     /* 0: by bits number; 1: by lcu line number*/
821*437bfbebSnyanmisaka     RK_U32  split_mode;
822*437bfbebSnyanmisaka 
823*437bfbebSnyanmisaka     /*
824*437bfbebSnyanmisaka      * when splitmode is 0, this value presents bits number,
825*437bfbebSnyanmisaka      * when splitmode is 1, this value presents lcu line number
826*437bfbebSnyanmisaka      */
827*437bfbebSnyanmisaka     RK_U32  slice_size;
828*437bfbebSnyanmisaka     RK_U32  slice_out;
829*437bfbebSnyanmisaka } MppEncH265SliceCfg;
830*437bfbebSnyanmisaka 
831*437bfbebSnyanmisaka typedef struct MppEncH265CuCfg_t {
832*437bfbebSnyanmisaka     RK_U32  cu32x32_en;                             /*default: 1 */
833*437bfbebSnyanmisaka     RK_U32  cu16x16_en;                             /*default: 1 */
834*437bfbebSnyanmisaka     RK_U32  cu8x8_en;                               /*default: 1 */
835*437bfbebSnyanmisaka     RK_U32  cu4x4_en;                               /*default: 1 */
836*437bfbebSnyanmisaka 
837*437bfbebSnyanmisaka     // intra pred
838*437bfbebSnyanmisaka     RK_U32  constrained_intra_pred_flag;            /*default: 0 */
839*437bfbebSnyanmisaka     RK_U32  strong_intra_smoothing_enabled_flag;    /*INTRA_SMOOTH*/
840*437bfbebSnyanmisaka     RK_U32  pcm_enabled_flag;                       /*default: 0, enable ipcm*/
841*437bfbebSnyanmisaka     RK_U32  pcm_loop_filter_disabled_flag;
842*437bfbebSnyanmisaka } MppEncH265CuCfg;
843*437bfbebSnyanmisaka 
844*437bfbebSnyanmisaka typedef struct MppEncH265DblkCfg_t {
845*437bfbebSnyanmisaka     RK_U32  slice_deblocking_filter_disabled_flag;  /* default value: 0. {0,1} */
846*437bfbebSnyanmisaka     RK_S32  slice_beta_offset_div2;                 /* default value: 0. [-6,+6] */
847*437bfbebSnyanmisaka     RK_S32  slice_tc_offset_div2;                   /* default value: 0. [-6,+6] */
848*437bfbebSnyanmisaka } MppEncH265DblkCfg_t;
849*437bfbebSnyanmisaka 
850*437bfbebSnyanmisaka typedef struct MppEncH265SaoCfg_t {
851*437bfbebSnyanmisaka     RK_U32  slice_sao_luma_disable;
852*437bfbebSnyanmisaka     RK_U32  slice_sao_chroma_disable;
853*437bfbebSnyanmisaka     RK_U32  sao_bit_ratio;
854*437bfbebSnyanmisaka } MppEncH265SaoCfg;
855*437bfbebSnyanmisaka 
856*437bfbebSnyanmisaka typedef struct MppEncH265TransCfg_t {
857*437bfbebSnyanmisaka     RK_U32  transquant_bypass_enabled_flag;
858*437bfbebSnyanmisaka     RK_U32  transform_skip_enabled_flag;
859*437bfbebSnyanmisaka     RK_U32  scaling_list_mode;                      /* default: 0 */
860*437bfbebSnyanmisaka     RK_S32  cb_qp_offset;
861*437bfbebSnyanmisaka     RK_S32  cr_qp_offset;
862*437bfbebSnyanmisaka     RK_S32  diff_cu_qp_delta_depth;
863*437bfbebSnyanmisaka } MppEncH265TransCfg;
864*437bfbebSnyanmisaka 
865*437bfbebSnyanmisaka typedef struct MppEncH265MergeCfg_t {
866*437bfbebSnyanmisaka     RK_U32  max_mrg_cnd;
867*437bfbebSnyanmisaka     RK_U32  merge_up_flag;
868*437bfbebSnyanmisaka     RK_U32  merge_left_flag;
869*437bfbebSnyanmisaka } MppEncH265MergesCfg;
870*437bfbebSnyanmisaka 
871*437bfbebSnyanmisaka typedef struct MppEncH265EntropyCfg_t {
872*437bfbebSnyanmisaka     RK_U32  cabac_init_flag;                        /* default: 0 */
873*437bfbebSnyanmisaka } MppEncH265EntropyCfg;
874*437bfbebSnyanmisaka 
875*437bfbebSnyanmisaka typedef struct MppEncH265Cfg_t {
876*437bfbebSnyanmisaka     /* H.265 codec syntax config */
877*437bfbebSnyanmisaka     RK_S32              profile;
878*437bfbebSnyanmisaka     RK_S32              level;
879*437bfbebSnyanmisaka     RK_S32              tier;
880*437bfbebSnyanmisaka 
881*437bfbebSnyanmisaka     /* constraint intra prediction flag */
882*437bfbebSnyanmisaka     RK_S32              const_intra_pred;
883*437bfbebSnyanmisaka     RK_S32              ctu_size;
884*437bfbebSnyanmisaka     RK_S32              max_cu_size;
885*437bfbebSnyanmisaka     RK_S32              tmvp_enable;
886*437bfbebSnyanmisaka     RK_S32              amp_enable;
887*437bfbebSnyanmisaka     RK_S32              wpp_enable;
888*437bfbebSnyanmisaka     RK_S32              merge_range;
889*437bfbebSnyanmisaka     RK_S32              sao_enable;
890*437bfbebSnyanmisaka     RK_U32              num_ref;
891*437bfbebSnyanmisaka 
892*437bfbebSnyanmisaka     /* quality config */
893*437bfbebSnyanmisaka     RK_S32              intra_qp;
894*437bfbebSnyanmisaka     RK_U8               qpmax_map[8];
895*437bfbebSnyanmisaka     RK_U8               qpmin_map[8];
896*437bfbebSnyanmisaka     RK_S32              qpmap_mode;
897*437bfbebSnyanmisaka 
898*437bfbebSnyanmisaka     /* extra mode config */
899*437bfbebSnyanmisaka     RK_S32              max_ltr_frames;
900*437bfbebSnyanmisaka     RK_S32              max_tid;
901*437bfbebSnyanmisaka     RK_S32              base_layer_pid;
902*437bfbebSnyanmisaka 
903*437bfbebSnyanmisaka     MppEncH265CuCfg      cu_cfg;
904*437bfbebSnyanmisaka     MppEncH265SliceCfg   slice_cfg;
905*437bfbebSnyanmisaka     MppEncH265EntropyCfg entropy_cfg;
906*437bfbebSnyanmisaka     MppEncH265TransCfg   trans_cfg;
907*437bfbebSnyanmisaka     MppEncH265SaoCfg     sao_cfg;
908*437bfbebSnyanmisaka     MppEncH265DblkCfg_t  dblk_cfg;
909*437bfbebSnyanmisaka     MppEncH265MergesCfg  merge_cfg;
910*437bfbebSnyanmisaka     RK_S32               auto_tile;
911*437bfbebSnyanmisaka     RK_U32               lpf_acs_sli_en;
912*437bfbebSnyanmisaka     RK_U32               lpf_acs_tile_disable;
913*437bfbebSnyanmisaka 
914*437bfbebSnyanmisaka     /* extra info */
915*437bfbebSnyanmisaka     MppEncVuiCfg        vui;
916*437bfbebSnyanmisaka } MppEncH265Cfg;
917*437bfbebSnyanmisaka 
918*437bfbebSnyanmisaka /*
919*437bfbebSnyanmisaka  * motion jpeg configurable parameter
920*437bfbebSnyanmisaka  */
921*437bfbebSnyanmisaka typedef enum MppEncJpegQpMode_e {
922*437bfbebSnyanmisaka     JPEG_QP_NA                              = 0,
923*437bfbebSnyanmisaka     JPEG_QUANT                              = 1,
924*437bfbebSnyanmisaka     JPEG_QFACTOR                            = 2,
925*437bfbebSnyanmisaka     JPEG_QTABLE                             = 3,
926*437bfbebSnyanmisaka } MppEncJpegQpMode;
927*437bfbebSnyanmisaka 
928*437bfbebSnyanmisaka typedef struct MppEncJpegCfg_t {
929*437bfbebSnyanmisaka     RK_S32              q_mode;
930*437bfbebSnyanmisaka     RK_S32              update;
931*437bfbebSnyanmisaka 
932*437bfbebSnyanmisaka     RK_S32              quant;
933*437bfbebSnyanmisaka     RK_S32              quant_ext;
934*437bfbebSnyanmisaka     /*
935*437bfbebSnyanmisaka      * quality factor config
936*437bfbebSnyanmisaka      *
937*437bfbebSnyanmisaka      * q_factor     - 1  ~ 99
938*437bfbebSnyanmisaka      * qf_max       - 1  ~ 99
939*437bfbebSnyanmisaka      * qf_min       - 1  ~ 99
940*437bfbebSnyanmisaka      * qtable_y: qtable for luma
941*437bfbebSnyanmisaka      * qtable_u: qtable for chroma
942*437bfbebSnyanmisaka      * qtable_v: default equal qtable_u
943*437bfbebSnyanmisaka      */
944*437bfbebSnyanmisaka     RK_S32              q_factor;
945*437bfbebSnyanmisaka     RK_S32              q_factor_ext;
946*437bfbebSnyanmisaka     RK_S32              qf_max;
947*437bfbebSnyanmisaka     RK_S32              qf_max_ext;
948*437bfbebSnyanmisaka     RK_S32              qf_min;
949*437bfbebSnyanmisaka     RK_S32              qf_min_ext;
950*437bfbebSnyanmisaka     /*
951*437bfbebSnyanmisaka      * qtable_y: qtable for luma
952*437bfbebSnyanmisaka      * qtable_u: qtable for chroma u
953*437bfbebSnyanmisaka      * qtable_v: qtable for chroma v
954*437bfbebSnyanmisaka      * for most case u and v use the same table
955*437bfbebSnyanmisaka      */
956*437bfbebSnyanmisaka     RK_U8               qtable_y[64];
957*437bfbebSnyanmisaka     RK_U8               qtable_u[64];
958*437bfbebSnyanmisaka     RK_U8               qtable_v[64];
959*437bfbebSnyanmisaka } MppEncJpegCfg;
960*437bfbebSnyanmisaka 
961*437bfbebSnyanmisaka /*
962*437bfbebSnyanmisaka  * vp8 configurable parameter
963*437bfbebSnyanmisaka  */
964*437bfbebSnyanmisaka typedef struct MppEncVp8Cfg_t {
965*437bfbebSnyanmisaka     RK_S32              quant;
966*437bfbebSnyanmisaka     RK_S32              disable_ivf;
967*437bfbebSnyanmisaka } MppEncVp8Cfg;
968*437bfbebSnyanmisaka 
969*437bfbebSnyanmisaka typedef enum MppEncSliceSplit_e {
970*437bfbebSnyanmisaka     /* change on quant parameter */
971*437bfbebSnyanmisaka     MPP_ENC_SPLIT_CFG_CHANGE_MODE           = (1 << 0),
972*437bfbebSnyanmisaka     MPP_ENC_SPLIT_CFG_CHANGE_ARG            = (1 << 1),
973*437bfbebSnyanmisaka     MPP_ENC_SPLIT_CFG_CHANGE_OUTPUT         = (1 << 2),
974*437bfbebSnyanmisaka     MPP_ENC_SPLIT_CFG_CHANGE_ALL            = (0xFFFFFFFF),
975*437bfbebSnyanmisaka } MppEncSliceSplitChange;
976*437bfbebSnyanmisaka 
977*437bfbebSnyanmisaka typedef enum MppEncSplitMode_e {
978*437bfbebSnyanmisaka     MPP_ENC_SPLIT_NONE,
979*437bfbebSnyanmisaka     MPP_ENC_SPLIT_BY_BYTE,
980*437bfbebSnyanmisaka     MPP_ENC_SPLIT_BY_CTU,
981*437bfbebSnyanmisaka     MPP_ENC_SPLIT_MODE_BUTT,
982*437bfbebSnyanmisaka } MppEncSplitMode;
983*437bfbebSnyanmisaka 
984*437bfbebSnyanmisaka typedef enum MppEncSplitOutMode_e {
985*437bfbebSnyanmisaka     MPP_ENC_SPLIT_OUT_LOWDELAY              = (1 << 0),
986*437bfbebSnyanmisaka     MPP_ENC_SPLIT_OUT_SEGMENT               = (1 << 1),
987*437bfbebSnyanmisaka } MppEncSplitOutMode;
988*437bfbebSnyanmisaka 
989*437bfbebSnyanmisaka typedef struct MppEncSliceSplit_t {
990*437bfbebSnyanmisaka     RK_U32  change;
991*437bfbebSnyanmisaka     /*
992*437bfbebSnyanmisaka      * slice split mode
993*437bfbebSnyanmisaka      *
994*437bfbebSnyanmisaka      * MPP_ENC_SPLIT_NONE    - No slice is split
995*437bfbebSnyanmisaka      * MPP_ENC_SPLIT_BY_BYTE - Slice is split by byte number
996*437bfbebSnyanmisaka      * MPP_ENC_SPLIT_BY_CTU  - Slice is split by macroblock / ctu number
997*437bfbebSnyanmisaka      */
998*437bfbebSnyanmisaka     RK_U32  split_mode;
999*437bfbebSnyanmisaka 
1000*437bfbebSnyanmisaka     /*
1001*437bfbebSnyanmisaka      * slice split size parameter
1002*437bfbebSnyanmisaka      *
1003*437bfbebSnyanmisaka      * When split by byte number this value is the max byte number for each
1004*437bfbebSnyanmisaka      * slice.
1005*437bfbebSnyanmisaka      * When split by macroblock / ctu number this value is the MB/CTU number
1006*437bfbebSnyanmisaka      * for each slice.
1007*437bfbebSnyanmisaka      */
1008*437bfbebSnyanmisaka     RK_U32  split_arg;
1009*437bfbebSnyanmisaka 
1010*437bfbebSnyanmisaka     /*
1011*437bfbebSnyanmisaka      * slice split output mode
1012*437bfbebSnyanmisaka      *
1013*437bfbebSnyanmisaka      * MPP_ENC_SPLIT_OUT_LOWDELAY
1014*437bfbebSnyanmisaka      * - When enabled encoder will lowdelay output each slice in a single packet
1015*437bfbebSnyanmisaka      * MPP_ENC_SPLIT_OUT_SEGMENT
1016*437bfbebSnyanmisaka      * - When enabled encoder will packet with segment info for each slice
1017*437bfbebSnyanmisaka      */
1018*437bfbebSnyanmisaka     RK_U32  split_out;
1019*437bfbebSnyanmisaka } MppEncSliceSplit;
1020*437bfbebSnyanmisaka 
1021*437bfbebSnyanmisaka /**
1022*437bfbebSnyanmisaka  * @brief Mpp ROI parameter
1023*437bfbebSnyanmisaka  *        Region configure define a rectangle as ROI
1024*437bfbebSnyanmisaka  * @note  x, y, w, h are calculated in pixels, which had better be 16-pixel aligned.
1025*437bfbebSnyanmisaka  *        These parameters MUST retain in memory when encoder is running.
1026*437bfbebSnyanmisaka  *        Both absolute qp and relative qp are supported in vepu541.
1027*437bfbebSnyanmisaka  *        Only absolute qp is supported in rv1108
1028*437bfbebSnyanmisaka  */
1029*437bfbebSnyanmisaka typedef struct MppEncROIRegion_t {
1030*437bfbebSnyanmisaka     RK_U16              x;              /**< horizontal position of top left corner */
1031*437bfbebSnyanmisaka     RK_U16              y;              /**< vertical position of top left corner */
1032*437bfbebSnyanmisaka     RK_U16              w;              /**< width of ROI rectangle */
1033*437bfbebSnyanmisaka     RK_U16              h;              /**< height of ROI rectangle */
1034*437bfbebSnyanmisaka     RK_U16              intra;          /**< flag of forced intra macroblock */
1035*437bfbebSnyanmisaka     RK_S16              quality;        /**< absolute / relative qp of macroblock */
1036*437bfbebSnyanmisaka     RK_U16              qp_area_idx;    /**< qp min max area select*/
1037*437bfbebSnyanmisaka     RK_U8               area_map_en;    /**< enable area map */
1038*437bfbebSnyanmisaka     RK_U8               abs_qp_en;      /**< absolute qp enable flag*/
1039*437bfbebSnyanmisaka } MppEncROIRegion;
1040*437bfbebSnyanmisaka 
1041*437bfbebSnyanmisaka /**
1042*437bfbebSnyanmisaka  * @brief MPP encoder's ROI configuration
1043*437bfbebSnyanmisaka  */
1044*437bfbebSnyanmisaka typedef struct MppEncROICfg_t {
1045*437bfbebSnyanmisaka     RK_U32              number;         /**< ROI rectangle number */
1046*437bfbebSnyanmisaka     MppEncROIRegion     *regions;       /**< ROI parameters */
1047*437bfbebSnyanmisaka } MppEncROICfg;
1048*437bfbebSnyanmisaka 
1049*437bfbebSnyanmisaka typedef struct MppEncROICfg0_t {
1050*437bfbebSnyanmisaka     RK_U32              change;         /**< change flag */
1051*437bfbebSnyanmisaka     RK_U32              number;         /**< ROI rectangle number */
1052*437bfbebSnyanmisaka     MppEncROIRegion     regions[8];     /**< ROI parameters */
1053*437bfbebSnyanmisaka } MppEncROICfgLegacy;
1054*437bfbebSnyanmisaka 
1055*437bfbebSnyanmisaka /**
1056*437bfbebSnyanmisaka  * @brief Mpp ROI parameter for vepu54x / vepu58x
1057*437bfbebSnyanmisaka  * @note  These encoders have more complex roi configure structure.
1058*437bfbebSnyanmisaka  *        User need to generate roi structure data for different soc.
1059*437bfbebSnyanmisaka  *        And send buffers to encoder through metadata.
1060*437bfbebSnyanmisaka  */
1061*437bfbebSnyanmisaka typedef struct MppEncROICfg2_t {
1062*437bfbebSnyanmisaka     MppBuffer          base_cfg_buf;
1063*437bfbebSnyanmisaka     MppBuffer          qp_cfg_buf;
1064*437bfbebSnyanmisaka     MppBuffer          amv_cfg_buf;
1065*437bfbebSnyanmisaka     MppBuffer          mv_cfg_buf;
1066*437bfbebSnyanmisaka 
1067*437bfbebSnyanmisaka     RK_U32             roi_qp_en    : 1;
1068*437bfbebSnyanmisaka     RK_U32             roi_amv_en   : 1;
1069*437bfbebSnyanmisaka     RK_U32             roi_mv_en    : 1;
1070*437bfbebSnyanmisaka     RK_U32             reserve_bits : 29;
1071*437bfbebSnyanmisaka     RK_U32             reserve[3];
1072*437bfbebSnyanmisaka } MppEncROICfg2;
1073*437bfbebSnyanmisaka 
1074*437bfbebSnyanmisaka typedef struct MppJpegROIRegion_t {
1075*437bfbebSnyanmisaka     RK_U16              x;              /* horizontal position of top left corner */
1076*437bfbebSnyanmisaka     RK_U16              y;              /* vertical position of top left corner */
1077*437bfbebSnyanmisaka     RK_U16              w;              /* width of ROI rectangle */
1078*437bfbebSnyanmisaka     RK_U16              h;              /* height of ROI rectangle */
1079*437bfbebSnyanmisaka     RK_U8               level;          /* the strength of erasing residuals for roi */
1080*437bfbebSnyanmisaka     RK_U8               roi_en;         /* enable roi */
1081*437bfbebSnyanmisaka } MppJpegROIRegion;
1082*437bfbebSnyanmisaka 
1083*437bfbebSnyanmisaka typedef struct MppJpegROICfg_t {
1084*437bfbebSnyanmisaka     RK_U32              change;
1085*437bfbebSnyanmisaka     RK_U16              non_roi_level;  /* the strength of erasing residuals for non-roi */
1086*437bfbebSnyanmisaka     RK_U16              non_roi_en;     /* enable non-roi */
1087*437bfbebSnyanmisaka     MppJpegROIRegion    regions[16];
1088*437bfbebSnyanmisaka } MppJpegROICfg;
1089*437bfbebSnyanmisaka 
1090*437bfbebSnyanmisaka /*
1091*437bfbebSnyanmisaka  * Mpp OSD parameter
1092*437bfbebSnyanmisaka  *
1093*437bfbebSnyanmisaka  * Mpp OSD support total 8 regions
1094*437bfbebSnyanmisaka  * Mpp OSD support 256-color palette two mode palette:
1095*437bfbebSnyanmisaka  * 1. Configurable OSD palette
1096*437bfbebSnyanmisaka  *    When palette is set.
1097*437bfbebSnyanmisaka  * 2. fixed OSD palette
1098*437bfbebSnyanmisaka  *    When palette is NULL.
1099*437bfbebSnyanmisaka  *
1100*437bfbebSnyanmisaka  * if MppEncOSDPlt.buf != NULL , palette includes maximun 256 levels,
1101*437bfbebSnyanmisaka  * every level composed of 32 bits defined below:
1102*437bfbebSnyanmisaka  * Y     : 8 bits
1103*437bfbebSnyanmisaka  * U     : 8 bits
1104*437bfbebSnyanmisaka  * V     : 8 bits
1105*437bfbebSnyanmisaka  * alpha : 8 bits
1106*437bfbebSnyanmisaka  */
1107*437bfbebSnyanmisaka #define MPP_ENC_OSD_PLT_WHITE           ((255<<24)|(128<<16)|(128<<8)|235)
1108*437bfbebSnyanmisaka #define MPP_ENC_OSD_PLT_YELLOW          ((255<<24)|(146<<16)|( 16<<8)|210)
1109*437bfbebSnyanmisaka #define MPP_ENC_OSD_PLT_CYAN            ((255<<24)|( 16<<16)|(166<<8)|170)
1110*437bfbebSnyanmisaka #define MPP_ENC_OSD_PLT_GREEN           ((255<<24)|( 34<<16)|( 54<<8)|145)
1111*437bfbebSnyanmisaka #define MPP_ENC_OSD_PLT_TRANS           ((  0<<24)|(222<<16)|(202<<8)|106)
1112*437bfbebSnyanmisaka #define MPP_ENC_OSD_PLT_RED             ((255<<24)|(240<<16)|( 90<<8)| 81)
1113*437bfbebSnyanmisaka #define MPP_ENC_OSD_PLT_BLUE            ((255<<24)|(110<<16)|(240<<8)| 41)
1114*437bfbebSnyanmisaka #define MPP_ENC_OSD_PLT_BLACK           ((255<<24)|(128<<16)|(128<<8)| 16)
1115*437bfbebSnyanmisaka 
1116*437bfbebSnyanmisaka typedef enum MppEncOSDPltType_e {
1117*437bfbebSnyanmisaka     MPP_ENC_OSD_PLT_TYPE_DEFAULT,
1118*437bfbebSnyanmisaka     MPP_ENC_OSD_PLT_TYPE_USERDEF,
1119*437bfbebSnyanmisaka     MPP_ENC_OSD_PLT_TYPE_BUTT,
1120*437bfbebSnyanmisaka } MppEncOSDPltType;
1121*437bfbebSnyanmisaka 
1122*437bfbebSnyanmisaka /* OSD palette value define */
1123*437bfbebSnyanmisaka typedef union MppEncOSDPltVal_u {
1124*437bfbebSnyanmisaka     struct {
1125*437bfbebSnyanmisaka         RK_U32          v       : 8;
1126*437bfbebSnyanmisaka         RK_U32          u       : 8;
1127*437bfbebSnyanmisaka         RK_U32          y       : 8;
1128*437bfbebSnyanmisaka         RK_U32          alpha   : 8;
1129*437bfbebSnyanmisaka     };
1130*437bfbebSnyanmisaka     RK_U32              val;
1131*437bfbebSnyanmisaka } MppEncOSDPltVal;
1132*437bfbebSnyanmisaka 
1133*437bfbebSnyanmisaka typedef struct MppEncOSDPlt_t {
1134*437bfbebSnyanmisaka     MppEncOSDPltVal     data[256];
1135*437bfbebSnyanmisaka } MppEncOSDPlt;
1136*437bfbebSnyanmisaka 
1137*437bfbebSnyanmisaka typedef enum MppEncOSDPltCfgChange_e {
1138*437bfbebSnyanmisaka     MPP_ENC_OSD_PLT_CFG_CHANGE_MODE     = (1 << 0),     /* change osd plt type */
1139*437bfbebSnyanmisaka     MPP_ENC_OSD_PLT_CFG_CHANGE_PLT_VAL  = (1 << 1),     /* change osd plt table value */
1140*437bfbebSnyanmisaka     MPP_ENC_OSD_PLT_CFG_CHANGE_ALL      = (0xFFFFFFFF),
1141*437bfbebSnyanmisaka } MppEncOSDPltCfgChange;
1142*437bfbebSnyanmisaka 
1143*437bfbebSnyanmisaka typedef struct MppEncOSDPltCfg_t {
1144*437bfbebSnyanmisaka     RK_U32              change;
1145*437bfbebSnyanmisaka     MppEncOSDPltType    type;
1146*437bfbebSnyanmisaka     MppEncOSDPlt        *plt;
1147*437bfbebSnyanmisaka } MppEncOSDPltCfg;
1148*437bfbebSnyanmisaka 
1149*437bfbebSnyanmisaka /* position info is unit in 16 pixels(one MB), and
1150*437bfbebSnyanmisaka  * x-directon range in pixels = (rd_pos_x - lt_pos_x + 1) * 16;
1151*437bfbebSnyanmisaka  * y-directon range in pixels = (rd_pos_y - lt_pos_y + 1) * 16;
1152*437bfbebSnyanmisaka  */
1153*437bfbebSnyanmisaka typedef struct MppEncOSDRegion_t {
1154*437bfbebSnyanmisaka     RK_U32              enable;
1155*437bfbebSnyanmisaka     RK_U32              inverse;
1156*437bfbebSnyanmisaka     RK_U32              start_mb_x;
1157*437bfbebSnyanmisaka     RK_U32              start_mb_y;
1158*437bfbebSnyanmisaka     RK_U32              num_mb_x;
1159*437bfbebSnyanmisaka     RK_U32              num_mb_y;
1160*437bfbebSnyanmisaka     RK_U32              buf_offset;
1161*437bfbebSnyanmisaka } MppEncOSDRegion;
1162*437bfbebSnyanmisaka 
1163*437bfbebSnyanmisaka /* if num_region > 0 && region==NULL
1164*437bfbebSnyanmisaka  * use old osd data
1165*437bfbebSnyanmisaka  */
1166*437bfbebSnyanmisaka typedef struct MppEncOSDData_t {
1167*437bfbebSnyanmisaka     MppBuffer           buf;
1168*437bfbebSnyanmisaka     RK_U32              num_region;
1169*437bfbebSnyanmisaka     MppEncOSDRegion     region[8];
1170*437bfbebSnyanmisaka } MppEncOSDData;
1171*437bfbebSnyanmisaka 
1172*437bfbebSnyanmisaka typedef struct MppEncOSDRegion2_t {
1173*437bfbebSnyanmisaka     RK_U32              enable;
1174*437bfbebSnyanmisaka     RK_U32              inverse;
1175*437bfbebSnyanmisaka     RK_U32              start_mb_x;
1176*437bfbebSnyanmisaka     RK_U32              start_mb_y;
1177*437bfbebSnyanmisaka     RK_U32              num_mb_x;
1178*437bfbebSnyanmisaka     RK_U32              num_mb_y;
1179*437bfbebSnyanmisaka     RK_U32              buf_offset;
1180*437bfbebSnyanmisaka     MppBuffer           buf;
1181*437bfbebSnyanmisaka } MppEncOSDRegion2;
1182*437bfbebSnyanmisaka 
1183*437bfbebSnyanmisaka typedef struct MppEncOSDData2_t {
1184*437bfbebSnyanmisaka     RK_U32              num_region;
1185*437bfbebSnyanmisaka     MppEncOSDRegion2    region[8];
1186*437bfbebSnyanmisaka } MppEncOSDData2;
1187*437bfbebSnyanmisaka 
1188*437bfbebSnyanmisaka /* kmpp osd configure */
1189*437bfbebSnyanmisaka typedef struct EncOSDInvCfg_t {
1190*437bfbebSnyanmisaka     RK_U32              yg_inv_en;
1191*437bfbebSnyanmisaka     RK_U32              uvrb_inv_en;
1192*437bfbebSnyanmisaka     RK_U32              alpha_inv_en;
1193*437bfbebSnyanmisaka     RK_U32              inv_sel;
1194*437bfbebSnyanmisaka     RK_U32              uv_sw_inv_en;
1195*437bfbebSnyanmisaka     RK_U32              inv_size;
1196*437bfbebSnyanmisaka     RK_U32              inv_stride;
1197*437bfbebSnyanmisaka     KmppShmPtr          inv_buf;
1198*437bfbebSnyanmisaka } EncOSDInvCfg;
1199*437bfbebSnyanmisaka 
1200*437bfbebSnyanmisaka typedef struct EncOSDAlphaCfg_t {
1201*437bfbebSnyanmisaka     RK_U32              alpha_swap;
1202*437bfbebSnyanmisaka     RK_U32              bg_alpha;
1203*437bfbebSnyanmisaka     RK_U32              fg_alpha;
1204*437bfbebSnyanmisaka     RK_U32              fg_alpha_sel;
1205*437bfbebSnyanmisaka } EncOSDAlphaCfg;
1206*437bfbebSnyanmisaka 
1207*437bfbebSnyanmisaka typedef struct EncOSDQpCfg_t {
1208*437bfbebSnyanmisaka     RK_U32              qp_adj_en;
1209*437bfbebSnyanmisaka     RK_U32              qp_adj_sel;
1210*437bfbebSnyanmisaka     RK_S32              qp;
1211*437bfbebSnyanmisaka     RK_U32              qp_max;
1212*437bfbebSnyanmisaka     RK_U32              qp_min;
1213*437bfbebSnyanmisaka     RK_U32              qp_prj;
1214*437bfbebSnyanmisaka } EncOSDQpCfg;
1215*437bfbebSnyanmisaka 
1216*437bfbebSnyanmisaka typedef struct MppEncOSDRegion3_t {
1217*437bfbebSnyanmisaka     RK_U32              enable;
1218*437bfbebSnyanmisaka     RK_U32              range_trns_en;
1219*437bfbebSnyanmisaka     RK_U32              range_trns_sel;
1220*437bfbebSnyanmisaka     RK_U32              fmt;
1221*437bfbebSnyanmisaka     RK_U32              rbuv_swap;
1222*437bfbebSnyanmisaka     RK_U32              lt_x;
1223*437bfbebSnyanmisaka     RK_U32              lt_y;
1224*437bfbebSnyanmisaka     RK_U32              rb_x;
1225*437bfbebSnyanmisaka     RK_U32              rb_y;
1226*437bfbebSnyanmisaka     RK_U32              stride;
1227*437bfbebSnyanmisaka     RK_U32              ch_ds_mode;
1228*437bfbebSnyanmisaka     RK_U32              osd_endn;
1229*437bfbebSnyanmisaka     EncOSDInvCfg        inv_cfg;
1230*437bfbebSnyanmisaka     EncOSDAlphaCfg      alpha_cfg;
1231*437bfbebSnyanmisaka     EncOSDQpCfg         qp_cfg;
1232*437bfbebSnyanmisaka     KmppShmPtr          osd_buf;
1233*437bfbebSnyanmisaka     RK_U8               lut[8];  //vuy vuy alpha
1234*437bfbebSnyanmisaka } MppEncOSDRegion3;
1235*437bfbebSnyanmisaka 
1236*437bfbebSnyanmisaka typedef struct MppEncOSDData3_t {
1237*437bfbebSnyanmisaka     RK_U32              change;
1238*437bfbebSnyanmisaka     RK_U32              num_region;
1239*437bfbebSnyanmisaka     MppEncOSDRegion3    region[8];
1240*437bfbebSnyanmisaka } MppEncOSDData3;
1241*437bfbebSnyanmisaka /* kmpp osd configure end */
1242*437bfbebSnyanmisaka 
1243*437bfbebSnyanmisaka typedef struct MppEncUserData_t {
1244*437bfbebSnyanmisaka     RK_U32              len;
1245*437bfbebSnyanmisaka     void                *pdata;
1246*437bfbebSnyanmisaka } MppEncUserData;
1247*437bfbebSnyanmisaka 
1248*437bfbebSnyanmisaka typedef struct MppEncUserDataFull_t {
1249*437bfbebSnyanmisaka     RK_U32              len;
1250*437bfbebSnyanmisaka     RK_U8               *uuid;
1251*437bfbebSnyanmisaka     void                *pdata;
1252*437bfbebSnyanmisaka } MppEncUserDataFull;
1253*437bfbebSnyanmisaka 
1254*437bfbebSnyanmisaka typedef struct MppEncUserDataSet_t {
1255*437bfbebSnyanmisaka     RK_U32              count;
1256*437bfbebSnyanmisaka     MppEncUserDataFull  *datas;
1257*437bfbebSnyanmisaka } MppEncUserDataSet;
1258*437bfbebSnyanmisaka 
1259*437bfbebSnyanmisaka typedef enum MppEncSceneMode_e {
1260*437bfbebSnyanmisaka     MPP_ENC_SCENE_MODE_DEFAULT,
1261*437bfbebSnyanmisaka     MPP_ENC_SCENE_MODE_IPC,
1262*437bfbebSnyanmisaka     MPP_ENC_SCENE_MODE_IPC_PTZ,
1263*437bfbebSnyanmisaka     MPP_ENC_SCENE_MODE_BUTT,
1264*437bfbebSnyanmisaka } MppEncSceneMode;
1265*437bfbebSnyanmisaka 
1266*437bfbebSnyanmisaka typedef struct MppEncFineTuneCfg_t {
1267*437bfbebSnyanmisaka     MppEncSceneMode     scene_mode;
1268*437bfbebSnyanmisaka     MppEncSeMode        se_mode;
1269*437bfbebSnyanmisaka     RK_S32              deblur_en; /* qpmap_en */
1270*437bfbebSnyanmisaka     RK_S32              deblur_str; /* deblur strength */
1271*437bfbebSnyanmisaka     RK_S32              anti_flicker_str;
1272*437bfbebSnyanmisaka     RK_S32              lambda_idx_i;
1273*437bfbebSnyanmisaka     RK_S32              lambda_idx_p;
1274*437bfbebSnyanmisaka     RK_S32              atr_str_i; /* line_en */
1275*437bfbebSnyanmisaka     RK_S32              atr_str_p; /* line_en */
1276*437bfbebSnyanmisaka     RK_S32              atl_str; /* anti_stripe */
1277*437bfbebSnyanmisaka     RK_S32              sao_str_i; /* anti blur */
1278*437bfbebSnyanmisaka     RK_S32              sao_str_p; /* anti blur */
1279*437bfbebSnyanmisaka     RK_S32              rc_container;
1280*437bfbebSnyanmisaka     RK_S32              vmaf_opt;
1281*437bfbebSnyanmisaka 
1282*437bfbebSnyanmisaka     RK_S32              motion_static_switch_enable;
1283*437bfbebSnyanmisaka     RK_S32              atf_str;
1284*437bfbebSnyanmisaka     /* vepu500 only */
1285*437bfbebSnyanmisaka     RK_S32              lgt_chg_lvl; /* light change level, [0, 3] */
1286*437bfbebSnyanmisaka     RK_S32              static_frm_num; /* static frame number, [0, 7] */
1287*437bfbebSnyanmisaka     RK_S32              madp16_th; /* madp threshold for static block detection, [0, 63] */
1288*437bfbebSnyanmisaka     RK_S32              skip16_wgt; /* weight for skip16, 0 or [3, 8] */
1289*437bfbebSnyanmisaka     RK_S32              skip32_wgt; /* weight for skip32, 0 or [3, 8] */
1290*437bfbebSnyanmisaka     RK_S32              qpmap_en;
1291*437bfbebSnyanmisaka     RK_S32              speed; /* encoder speed [0..3], 0:normal; 1:fast; 2:faster; 3:fastest */
1292*437bfbebSnyanmisaka 
1293*437bfbebSnyanmisaka     /* smart v3 only */
1294*437bfbebSnyanmisaka     RK_S32              bg_delta_qp_i; /* background delta qp for i frame */
1295*437bfbebSnyanmisaka     RK_S32              bg_delta_qp_p; /* background delta qp for p frame */
1296*437bfbebSnyanmisaka     RK_S32              fg_delta_qp_i; /* foreground delta qp for i frame */
1297*437bfbebSnyanmisaka     RK_S32              fg_delta_qp_p; /* foreground delta qp for p frame */
1298*437bfbebSnyanmisaka     RK_S32              bmap_qpmin_i; /* min qp for i frame in bmap */
1299*437bfbebSnyanmisaka     RK_S32              bmap_qpmin_p; /* min qp for p frame in bmap */
1300*437bfbebSnyanmisaka     RK_S32              bmap_qpmax_i; /* max qp for i frame in bmap */
1301*437bfbebSnyanmisaka     RK_S32              bmap_qpmax_p; /* max qp for p frame in bmap */
1302*437bfbebSnyanmisaka     RK_S32              min_bg_fqp; /* min frame qp for background region */
1303*437bfbebSnyanmisaka     RK_S32              max_bg_fqp; /* max frame qp for background region */
1304*437bfbebSnyanmisaka     RK_S32              min_fg_fqp; /* min frame qp for foreground region */
1305*437bfbebSnyanmisaka     RK_S32              max_fg_fqp; /* max frame qp for foreground region */
1306*437bfbebSnyanmisaka     RK_S32              fg_area; /* foreground area, [-1, 100] */
1307*437bfbebSnyanmisaka } MppEncFineTuneCfg;
1308*437bfbebSnyanmisaka 
1309*437bfbebSnyanmisaka #endif /*__RK_VENC_CMD_H__*/
1310