• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright (C) 2018 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 /*!
21 ******************************************************************************
22 * \file ihevce_lap_enc_structs.h
23 *
24 * \brief
25 *    This file contains structure definations shared between Encoder and LAP
26 *
27 * \date
28 *    18/09/2012
29 *
30 * \author
31 *    Ittiam
32 *
33 ******************************************************************************
34 */
35 
36 #ifndef _IHEVCE_LAP_ENC_STRUCTS_H_
37 #define _IHEVCE_LAP_ENC_STRUCTS_H_
38 
39 /*****************************************************************************/
40 /* Constant Macros                                                           */
41 /*****************************************************************************/
42 #define MAX_NUM_BUFS_LAP_ENC 15
43 #define MAX_REF_PICS 16
44 #define MAX_PICS_FOR_SGI 16 /*max pics to be hold for Sub-Gop Interleave*/
45 #define MAX_DUPLICATE_ENTRIES_IN_REF_LIST 2
46 #define MAX_LAP_WINDOW_SIZE 60
47 #define MAX_SUB_GOP_SIZE 16
48 #define MAX_SCENE_NUM 30
49 #define INIT_HEVCE_QP_RC (-300)
50 #define MAX_TEMPORAL_LAYERS 3
51 #define NUM_LAP2_LOOK_AHEAD 120
52 
53 #define INFINITE_GOP_CDR_TIME_S 3
54 #define FRAME_PARALLEL_LVL 0
55 #define NUM_SG_INTERLEAVED (1 + FRAME_PARALLEL_LVL)
56 
57 //#define MAX_NUM_ENC_LOOP_PARALLEL ((1 << FRAME_PARALLEL_LVL) + 2)
58 //#define MAX_NUM_ME_PARALLEL ((1 << FRAME_PARALLEL_LVL) + 2)
59 #define MAX_NUM_ENC_LOOP_PARALLEL 1
60 #define MAX_NUM_ME_PARALLEL 1
61 #define DIST_MODE_3_NON_REF_B 0  // disabled for normal cases
62 
63 #define DENOM_DEFAULT 7
64 #define WGHT_DEFAULT (1 << DENOM_DEFAULT)
65 
66 #define MAX_NON_REF_B_PICS_IN_QUEUE_SGI MAX_PICS_FOR_SGI  //ELP_RC
67 
68 /*minimum stagger in non sequential operation*/
69 #define MIN_L1_L0_STAGGER_NON_SEQ 1
70 
71 /* Enable or disable Psedo presets*/
72 #undef PSEUDO_PRESETS
73 
74 /**
75 *******************************************************************************
76 @brief Ivalid POC value since negative POCs are also valid as per syntax
77 *******************************************************************************
78  */
79 #define INVALID_POC -16384
80 /*****************************************************************************/
81 /* Function Macros                                                           */
82 /*****************************************************************************/
83 
84 /*****************************************************************************/
85 /* Typedefs                                                                  */
86 /*****************************************************************************/
87 
88 /*****************************************************************************/
89 /* Enums                                                                     */
90 /*****************************************************************************/
91 /* Scenetype enums */
92 typedef enum SCENE_TYPE_E
93 {
94     SCENE_TYPE_NORMAL = 0,
95     SCENE_TYPE_SCENE_CUT,
96     SCENE_TYPE_FLASH,
97     SCENE_TYPE_FADE_IN,
98     SCENE_TYPE_FADE_OUT,
99     SCENE_TYPE_DISSOLVE,
100     SCENE_TYPE_PAUSE_TO_RESUME,
101     MAX_NUM_SCENE_TYPES
102 } SCENE_TYPE_E;
103 /*****************************************************************************/
104 /* Structure                                                                 */
105 /*****************************************************************************/
106 
107 /**
108 ******************************************************************************
109  *  @brief   Logo structure
110 ******************************************************************************
111  */
112 
113 typedef struct
114 {
115     /** i4_is_logo_on  : Specifies if logo is on or off */
116     WORD32 i4_is_logo_on;
117 
118     /** logo_width  : Width of the logo in pixels */
119     WORD32 logo_width;
120 
121     /** logo_height  : Width of the logo in pixels */
122     WORD32 logo_height;
123 
124     /** logo_x_offset  : horizontal offset for logo from the right end of pic */
125     WORD32 logo_x_offset;
126 
127     /** logo_y_offset  : vertical offset for logo from the bottom end of pic */
128     WORD32 logo_y_offset;
129 
130 } ihevce_logo_attrs_t;
131 
132 typedef struct
133 {
134     /**
135     *  Input YUV buffers pointers and related parameters
136     */
137     ihevce_lap_params_t s_lap_params;
138 
139     /** Width of input luma */
140     WORD32 i4_width;
141 
142     /** Height of input luma */
143     WORD32 i4_height;
144 
145     /** Max closed gop period  : Max spacing between IDR frames  */
146     WORD32 i4_max_closed_gop_period;
147 
148     /** Min closed gop period  : Min spacing between IDR frames  */
149     WORD32 i4_min_closed_gop_period;
150 
151     /** Max CRA open gop period: Max spacing between CRA frames  */
152     WORD32 i4_max_cra_open_gop_period;
153 
154     /** Max i open gop period: Max spacing between I frames  */
155     WORD32 i4_max_i_open_gop_period;
156 
157     /** limits Max gopsize = 2 ^ i4_max_temporal_layers - 1 */
158     WORD32 i4_max_temporal_layers;
159 
160     /** Minimum temporal ID from which B-pictures are coded; Tid=1 (default) 0 (no B) */
161     WORD32 i4_min_temporal_id_for_b;
162 
163     /** Maximum number of reference frames */
164     WORD32 i4_max_reference_frames;
165 
166     /** Interlace field */
167     WORD32 i4_src_interlace_field;
168 
169     /* Frame rate*/
170     WORD32 i4_frame_rate;
171 
172     /** Enable Logo flag */
173     WORD32 i4_enable_logo;
174 
175     /** Bit Depth */
176     WORD32 i4_internal_bit_depth;
177 
178     WORD32 i4_input_bit_depth;
179 
180     /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */
181     UWORD8 u1_chroma_array_type;
182 
183     WORD32 ai4_quality_preset[IHEVCE_MAX_NUM_RESOLUTIONS];
184 
185     WORD32 i4_rc_pass_num;
186 
187     /* If enable, enables blu ray compatibility of op*/
188     WORD32 i4_blu_ray_spec;
189 
190     IV_ARCH_T e_arch_type;
191 
192     UWORD8 u1_is_popcnt_available;
193 
194     WORD32 i4_mres_single_out;
195 
196     WORD32 i4_luma_size_copy_src_logo;
197 
198 } ihevce_lap_static_params_t;
199 
200 /**
201   *  @biref luma and chroma weight and offset container structure
202   */
203 typedef struct
204 {
205     /**
206     *  flag to control the weighted pred for luma component of
207     *  this reference frame
208     *  Range [0 : 1]
209     */
210     UWORD8 u1_luma_weight_enable_flag;
211 
212     /**
213     *  flag to control the weighted pred for chroma component of
214     *  this reference frame
215     *  Range [0 : 1]
216     */
217     UWORD8 u1_chroma_weight_enable_flag;
218 
219     /**
220     *  luma weight factor for a reference frame,
221     *  Range [0 : 128]
222     *  Default = 1 << as_wght_offst
223     */
224     WORD16 i2_luma_weight;
225 
226     /**
227     *  luma offset to be added after weighing for reference frame
228     *  Range [-128 : 127]
229     *  Default = 0
230     */
231     WORD16 i2_luma_offset;
232 
233     /**
234     *  chroma weight factor for a reference frame, Default = 1
235     */
236     WORD16 i2_cb_weight;
237 
238     /**
239     *  chroma offset to be added after weighing for reference frame, Default = 0
240     */
241     WORD16 i2_cb_offset;
242 
243     /**
244     *  chroma weight factor for a reference frame, Default = 1
245     */
246     WORD16 i2_cr_weight;
247 
248     /**
249     *  chroma offset to be added after weighing for reference frame, Default = 0
250     */
251     WORD16 i2_cr_offset;
252 
253 } ihevce_wght_offst_t;
254 
255 /**
256   *  @biref defines the attributes of a reference picture
257   */
258 typedef struct
259 {
260     /**
261     *  weighted prediction attribute for each duplicate entry of a ref pic
262     *  Note : Duplicate entries help in using same reference with different
263     *         weights and offsets. Example being partial flashes in scence
264     */
265     ihevce_wght_offst_t as_wght_off[MAX_DUPLICATE_ENTRIES_IN_REF_LIST];
266 
267     /**
268     * delta POC of reference frame w.r.t current Picture POC,
269     */
270     WORD32 i4_ref_pic_delta_poc;
271 
272     /**
273     * flag indicating if this reference frame is to be used as
274     * reference by current picture
275     * shall be 0 or 1
276     */
277     WORD32 i4_used_by_cur_pic_flag;
278 
279     /**
280     * Indicates the number of duplicate entries of a reference picture
281     * in the reference picture list. A reference picture may see multiple
282     * entries in the reference picture list, since that allows the LAP to
283     * assign multiple weighting related parameters to a single reference picture.
284     * Range [1, MAX_DUPLICATE_ENTRIES_IN_REF_LIST]
285     *
286     * Used only when weighted prediction is enabled
287     *
288     */
289     WORD32 i4_num_duplicate_entries_in_ref_list;
290 
291 } ihevce_ref_pic_attrs_t;
292 
293 /* @brief IV_YUV_BUF_T: This structure defines attributes
294  *        for the input yuv used in enc and lap buffer
295  */
296 typedef struct
297 {
298     /** i4_size of the structure */
299     WORD32 i4_size;
300 
301     /** Pointer to Luma (Y) Buffer  */
302     void *pv_y_buf;
303 
304     /** Pointer to Chroma (Cb) Buffer  */
305     void *pv_u_buf;
306 
307     /** Pointer to Chroma (Cr) Buffer */
308     void *pv_v_buf;
309 
310     /** Width of the Luma (Y) Buffer in pixels */
311     WORD32 i4_y_wd;
312 
313     /** Height of the Luma (Y) Buffer in pixels */
314     WORD32 i4_y_ht;
315 
316     /** Stride/Pitch of the Luma (Y) Buffer */
317     WORD32 i4_y_strd;
318 
319     /** Luma Process start offset : x dir. */
320     WORD32 i4_start_offset_x;
321 
322     /** Luma Process start offset : y dir. */
323     WORD32 i4_start_offset_y;
324 
325     /** Width of the Chroma (Cb / Cr) Buffer in pixels */
326     WORD32 i4_uv_wd;
327 
328     /** Height of the Chroma (Cb / Cr) Buffer in pixels */
329     WORD32 i4_uv_ht;
330 
331     /** Stride/Pitch of the Chroma (Cb / Cr) Buffer */
332     WORD32 i4_uv_strd;
333 
334 } iv_enc_yuv_buf_t;
335 
336 typedef struct
337 {
338     /** i4_size of the structure */
339     WORD32 i4_size;
340 
341     /** Pointer to Luma (Y) Buffer  */
342     void *pv_y_buf;
343 
344     /** Pointer to Chroma (Cb) Buffer  */
345     void *pv_u_buf;
346 
347     /** Pointer to Chroma (Cr) Buffer */
348     void *pv_v_buf;
349 
350 } iv_enc_yuv_buf_src_t;
351 
352 typedef struct
353 {
354     /*********** common params for both lap_out and rc_lap_out ****************/
355 
356     /* hevc pic types : IDR/CDR/I/P/B etc */
357     WORD32 i4_pic_type;
358     /* picture order count */
359     WORD32 i4_poc;
360     /* temporal layer of the current picture */
361     WORD32 i4_temporal_lyr_id;
362     /**
363      * indicates if the current frame is reference pic
364      * 0 : not ref pic
365      * 1 : ref pic at lower layers (w.r.t to highest layer id)
366      * 2 : ref pic at highest temporal layer id layer
367      */
368     WORD32 i4_is_ref_pic;
369     /**
370       * Scene type such as Scene Cut, fade in/ out, dissolve, flash etc
371       * enum used is IHEVCE_SCENE_TYPE
372     */
373     WORD32 i4_scene_type;
374     /**
375       * Scene number helps to identify the reference frames
376       *  for the current frame of same scene and
377       * also it can be used to reset the RC model
378       *  for each layer whenever scene cut happens
379     */
380     UWORD32 u4_scene_num;
381     /*display order num*/
382     WORD32 i4_display_num;
383 
384     WORD32 i4_quality_preset;
385 
386     /*********** parameters specific to lap_out structure **************/
387     /* cra pic type flag */
388     WORD32 i4_is_cra_pic;
389     /** IDR GOP number */
390     WORD32 i4_idr_gop_num;
391     /** weighted prediction enable flag     */
392     WORD8 i1_weighted_pred_flag;
393     /** weighted bipred enable flag         */
394     WORD8 i1_weighted_bipred_flag;
395     /* number of references for current pic */
396     WORD32 i4_num_ref_pics;
397     /**
398      * common denominator used for luma weights across all ref pics
399      * Default = 0, Shall be in the range [0:7]
400     */
401     WORD32 i4_log2_luma_wght_denom;
402     /**
403      * common denominator used for chroma weights across all ref pics
404      * Default = 0, Shall be in the range [0:7]
405     */
406     WORD32 i4_log2_chroma_wght_denom;
407     /* ref pics to str current Picture POC */
408     ihevce_ref_pic_attrs_t as_ref_pics[MAX_REF_PICS];
409     /* Structure for the ITTIAM logo */
410     ihevce_logo_attrs_t s_logo_ctxt;
411     /* first field flag */
412     WORD32 i4_first_field;
413     /* associated IRAP poc */
414     WORD32 i4_assoc_IRAP_poc;
415     WORD32 i4_is_prev_pic_in_Tid0_same_scene;
416 
417     WORD32 i4_is_I_in_any_field;
418     WORD32 i4_used;
419 
420     WORD32 i4_end_flag;
421     WORD32 i4_force_idr_flag;
422     WORD32 i4_out_flush_flag;
423     WORD32 i4_first_frm_new_res;
424 
425     /***** Spatial QP offset related *****/
426     float f_strength;
427 
428     long double ld_curr_frame_8x8_log_avg[2];
429     long double ld_curr_frame_16x16_log_avg[3];
430     long double ld_curr_frame_32x32_log_avg[3];
431 
432     LWORD64 i8_curr_frame_8x8_avg_act[2];
433     LWORD64 i8_curr_frame_16x16_avg_act[3];
434     LWORD64 i8_curr_frame_32x32_avg_act[3];
435 
436     WORD32 i4_i_pic_lamda_offset;
437 
438     double f_i_pic_lamda_modifier;
439 
440     WORD32 i4_curr_frm_qp;
441 
442     iv_enc_yuv_buf_t s_input_buf;
443 
444     /** Frame - level L0 satd accum*/
445     LWORD64 i8_frame_l0_acc_satd;
446 
447     /* Frame - level L1 Activity factor */
448     LWORD64 i8_frame_level_activity_fact;
449     /*bits esimated for frame calulated for sub pic rc bit control */
450     WORD32 ai4_frame_bits_estimated[IHEVCE_MAX_NUM_BITRATES];
451     float f_pred_factor;
452 
453 } ihevce_lap_output_params_t;
454 
455 /**
456 ******************************************************************************
457  *  @brief   Encoder and LAP I/O structutre
458  *  s_input_buf : input buffer will be populated by applciation
459  *  when LAP gets this buffer only input will be populated
460  *  During the time of seeting the encode order for current buffer
461  *  LAP should populate the s_lap_out structure.
462 ******************************************************************************
463  */
464 typedef struct
465 {
466     /**
467     *  Input YUV buffers pointers and related parameters
468     */
469     iv_input_data_ctrl_buffs_t s_input_buf;
470 
471     /**
472     * Following parameters are output of LAP
473     * for the current buffer to be encoded
474     */
475     ihevce_lap_output_params_t s_lap_out;
476     /**
477     * Following parameters are output of LAP
478     * for the current buffer to be encoded,
479     * which are RC specific parameters
480     */
481     rc_lap_out_params_t s_rc_lap_out;
482 
483     /**
484     * Following parameters are context of LAP QUEUE
485     */
486     frame_info_t s_frame_info;
487 } ihevce_lap_enc_buf_t;
488 
489 /*****************************************************************************/
490 /* Extern Variable Declarations                                              */
491 /*****************************************************************************/
492 
493 /*****************************************************************************/
494 /* Extern Function Declarations                                              */
495 /*****************************************************************************/
496 
497 #endif /* _IHEVCE_LAP_ENC_STRUCTS_H_ */
498