• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright (C) 2015 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
23 *  ih264e_defs.h
24 *
25 * @brief
26 *  Definitions used in the encoder
27 *
28 * @author
29 *  ittiam
30 *
31 * @remarks
32 *  None
33 *
34 *******************************************************************************
35 */
36 
37 #ifndef IH264E_DEFS_H_
38 #define IH264E_DEFS_H_
39 
40 
41 #define PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, u4_nnz, u4_sig_coeff_map, pi2_res_block)   \
42 {                                                                          \
43     ps_mb_coeff_data = pv_mb_coeff_data;                                   \
44     u4_nnz = ps_mb_coeff_data->i4_sig_map_nnz & 0xff;                      \
45     if (u4_nnz)                                                            \
46     {                                                                      \
47         u4_sig_coeff_map = ps_mb_coeff_data->i4_sig_map_nnz >> 16;         \
48         pi2_res_block = ps_mb_coeff_data->ai2_residue;                     \
49         pv_mb_coeff_data = ps_mb_coeff_data->ai2_residue + ALIGN2(u4_nnz); \
50     }                                                                      \
51     else                                                                   \
52     {                                                                      \
53       pv_mb_coeff_data = ps_mb_coeff_data->ai2_residue;                    \
54     }                                                                      \
55 }
56 
57 /*****************************************************************************/
58 /* Width and height restrictions                                             */
59 /*****************************************************************************/
60 /**
61  * Minimum width supported by codec
62  */
63 #define MIN_WD   16
64 
65 /**
66  * Maximum width supported by codec
67  */
68 
69 /* changed by haining@ to support Nexus 6P screen size, was previously 1920 */
70 #define MAX_WD   2560
71 
72 /**
73  * Minimum height supported by codec
74  */
75 #define MIN_HT   16
76 
77 /**
78  * Maximum height supported by codec
79  */
80 
81 /* changed by haining@ to support Nexus 6P screen size, was previously 1920 */
82 #define MAX_HT   2560
83 
84 /*****************************************************************************/
85 /* Padding sizes                                                             */
86 /*****************************************************************************/
87 /**
88  * Padding used for top of the frame
89  */
90 #define PAD_TOP     32
91 
92 /**
93  * Padding used for bottom of the frame
94  */
95 #define PAD_BOT     32
96 
97 /**
98  * Padding used at left of the frame
99  */
100 #define PAD_LEFT    32
101 
102 /**
103  * Padding used at right of the frame
104  */
105 #define PAD_RIGHT   32
106 /**
107  * Padding for width
108  */
109 #define PAD_WD      (PAD_LEFT + PAD_RIGHT)
110 /**
111  * Padding for height
112  */
113 #define PAD_HT      (PAD_TOP  + PAD_BOT)
114 
115 /*
116  * buffer width and height for half pel buffers
117  */
118 #define HP_BUFF_WD  24
119 #define HP_BUFF_HT  18
120 
121 /*****************************************************************************/
122 /* Number of frame restrictions                                              */
123 /*****************************************************************************/
124 /**
125  *  Maximum number of reference pictures
126  */
127 #define MAX_REF_PIC_CNT  2
128 
129 /**
130  *  Minimum number of reference pictures
131  */
132 #define MIN_REF_PIC_CNT  1
133 
134 /**
135  *  Maximum number of B pictures between two I/P pictures
136  */
137 #define MAX_NUM_BFRAMES     10
138 
139 /**
140  *  Maximum number of reference buffers in DPB manager
141  */
142 #define MAX_REF_CNT  32
143 
144 /*****************************************************************************/
145 /* Minimum size of inter prediction unit supported by encoder                */
146 /*****************************************************************************/
147 #define ENC_MIN_PU_SIZE     16
148 
149 /*****************************************************************************/
150 /* Num cores releated defs                                                   */
151 /*****************************************************************************/
152 /**
153  *  Maximum number of cores
154  */
155 #define MAX_NUM_CORES       8
156 
157 /**
158  *  Maximum number of threads for pixel processing
159  */
160 #define MAX_PROCESS_THREADS MAX_NUM_CORES
161 
162 /**
163  * Maximum process context sets
164  * Used to stagger encoding of MAX_CTXT_SETS in parallel
165  */
166 #define MAX_CTXT_SETS   1
167 /**
168  * Maximum number of contexts
169  * Kept as twice the number of threads, to make it easier to initialize the contexts
170  * from master thread
171  */
172 #define MAX_PROCESS_CTXT    MAX_NUM_CORES * MAX_CTXT_SETS
173 
174 /*****************************************************************************/
175 /* Profile and level restrictions                                            */
176 /*****************************************************************************/
177 /**
178  * Max level supported by the codec
179  */
180 #define MAX_LEVEL  IH264_LEVEL_51
181 
182 /**
183  * Min level supported by the codec
184  */
185 #define MIN_LEVEL  IH264_LEVEL_10
186 
187 /**
188  * Maximum number of slice headers that are held in memory simultaneously
189  * For single core implementation only 1 slice header is enough.
190  * But for multi-core parsing thread needs to ensure that slice headers are
191  * stored till the last CB in a slice is decoded.
192  * Parsing thread has to wait till last CB of a slice is consumed before reusing
193  * overwriting the slice header
194  * MAX_SLICE_HDR_CNT is assumed to be a power of 2
195  */
196 
197 #define LOG2_MAX_SLICE_HDR_CNT 8
198 #define MAX_SLICE_HDR_CNT (1 << LOG2_MAX_SLICE_HDR_CNT)
199 
200 /* Generic declarations */
201 #define DEFAULT_MAX_LEVEL               40
202 #define DEFAULT_RECON_ENABLE            0
203 #define DEFAULT_RC                      IVE_RC_STORAGE
204 #define DEFAULT_MAX_FRAMERATE           120000
205 #define DEFAULT_MAX_BITRATE             20000000
206 #define DEFAULT_MAX_NUM_BFRAMES         0
207 #define DEFAULT_MAX_SRCH_RANGE_X        256
208 #define DEFAULT_MAX_SRCH_RANGE_Y        256
209 #define DEFAULT_SLICE_PARAM             256
210 #define DEFAULT_SRC_FRAME_RATE          30000
211 #define DEFAULT_TGT_FRAME_RATE          30000
212 #define DEFAULT_BITRATE                 6000000
213 #define DEFAULT_QP_MIN                  10
214 #define DEFAULT_QP_MAX                  51
215 #define DEFAULT_I_QP                    25
216 #define DEFAULT_P_QP                    28
217 #define DEFAULT_B_QP                    28
218 #define DEFAULT_AIR_MODE                IVE_AIR_MODE_NONE
219 #define DEFAULT_AIR_REFRESH_PERIOD      30
220 #define DEFAULT_VBV_DELAY               1000
221 #define DEFAULT_VBV_SIZE                16800000 /* level 3.1 */
222 #define DEFAULT_NUM_CORES               1
223 #define DEFAULT_ME_SPEED_PRESET         100
224 #define DEFAULT_HPEL                    1
225 #define DEFAULT_QPEL                    1
226 #define DEFAULT_I4                      1
227 #define DEFAULT_I8                      0
228 #define DEFAULT_I16                     1
229 #define DEFAULT_ENABLE_FAST_SAD         0
230 #define DEFAULT_ENABLE_SATQD            1
231 #define DEFAULT_MIN_SAD_ENABLE          0
232 #define DEFAULT_MIN_SAD_DISABLE         -1
233 #define DEFAULT_SRCH_RNG_X              64
234 #define DEFAULT_SRCH_RNG_Y              48
235 #define DEFAULT_I_INTERVAL              30
236 #define DEFAULT_IDR_INTERVAL            1000
237 #define DEFAULT_B_FRAMES                0
238 #define DEFAULT_DISABLE_DEBLK_LEVEL     0
239 #define DEFAULT_PROFILE                 IV_PROFILE_BASE
240 #define DEFAULT_MIN_INTRA_FRAME_RATE    1
241 #define DEFAULT_MAX_INTRA_FRAME_RATE    2147483647
242 #define DEFAULT_MIN_BUFFER_DELAY        30
243 #define DEFAULT_MAX_BUFFER_DELAY        20000
244 #define DEFAULT_STRIDE                  0
245 #define DEFAULT_ENC_SPEED_PRESET        IVE_USER_DEFINED
246 #define DEFAULT_PRE_ENC_ME              0
247 #define DEFAULT_PRE_ENC_IPE             0
248 #define DEFAULT_ENTROPY_CODING_MODE     0
249 
250 /** Maximum number of entries in input buffer list */
251 #define MAX_INP_BUF_LIST_ENTRIES         32
252 
253 /** Maximum number of entries in output buffer list */
254 #define MAX_OUT_BUF_LIST_ENTRIES         32
255 
256 /** Maximum number of entries in recon buffer list used within the encoder */
257 #define MAX_REC_LIST_ENTRIES             16
258 
259 /** Number of buffers created to hold half-pel planes for every reference buffer */
260 #define HPEL_PLANES_CNT                 1
261 
262 /** Number of buffers Needed for SUBPEL and BIPRED computation */
263 #define SUBPEL_BUFF_CNT                 4
264 
265 /**
266  *****************************************************************************
267  * Macro to compute total size required to hold on set of scaling matrices
268  *****************************************************************************
269  */
270 #define SCALING_MAT_SIZE(m_scaling_mat_size)                                 \
271 {                                                                            \
272     m_scaling_mat_size = 6 * TRANS_SIZE_4 * TRANS_SIZE_4;                    \
273     m_scaling_mat_size += 6 * TRANS_SIZE_8 * TRANS_SIZE_8;                   \
274     m_scaling_mat_size += 6 * TRANS_SIZE_16 * TRANS_SIZE_16;                 \
275     m_scaling_mat_size += 2 * TRANS_SIZE_32 * TRANS_SIZE_32;                 \
276 }
277 
278 /**
279  ******************************************************************************
280  *  @brief Macros to get raster scan position of a block[8x8] / sub block[4x4]
281  ******************************************************************************
282  */
283 #define GET_BLK_RASTER_POS_X(x)     ((x & 0x01))
284 #define GET_BLK_RASTER_POS_Y(y)     ((y >> 1))
285 #define GET_SUB_BLK_RASTER_POS_X(x) ((x & 0x01))
286 #define GET_SUB_BLK_RASTER_POS_Y(y) ((y >> 1))
287 
288 #define NUM_RC_MEMTABS 17
289 
290 /**
291  ***************************************************************************
292  * Enum to hold various mem records being request
293  ****************************************************************************
294  */
295 enum
296 {
297     /**
298      * Codec Object at API level
299      */
300     MEM_REC_IV_OBJ,
301 
302     /**
303      * Codec context
304      */
305     MEM_REC_CODEC,
306 
307     /**
308      * Cabac context
309      */
310     MEM_REC_CABAC,
311 
312     /**
313      * Cabac context_mb_info
314      */
315     MEM_REC_CABAC_MB_INFO,
316 
317     /**
318      * entropy context
319      */
320     MEM_REC_ENTROPY,
321 
322     /**
323      * Buffer to hold coeff data
324      */
325     MEM_REC_MB_COEFF_DATA,
326 
327     /**
328      * Buffer to hold coeff data
329      */
330     MEM_REC_MB_HEADER_DATA,
331 
332     /**
333      * Motion vector bank
334      */
335     MEM_REC_MVBANK,
336 
337     /**
338      * Motion vector bits
339      */
340     MEM_REC_MVBITS,
341 
342     /**
343      * Holds mem records passed to the codec.
344      */
345     MEM_REC_BACKUP,
346 
347     /**
348      * Holds SPS
349      */
350     MEM_REC_SPS,
351 
352     /**
353      * Holds PPS
354      */
355     MEM_REC_PPS,
356 
357     /**
358      * Holds Slice Headers
359      */
360     MEM_REC_SLICE_HDR,
361 
362     /**
363      * Contains map indicating slice index per MB basis
364      */
365     MEM_REC_SLICE_MAP,
366 
367     /**
368      * Holds thread handles
369      */
370     MEM_REC_THREAD_HANDLE,
371 
372     /**
373      * Holds control call mutex
374      */
375     MEM_REC_CTL_MUTEX,
376 
377     /**
378      * Holds entropy call mutex
379      */
380     MEM_REC_ENTROPY_MUTEX,
381 
382     /**
383      * Holds memory for Process JOB Queue
384      */
385     MEM_REC_PROC_JOBQ,
386 
387     /**
388      * Holds memory for Entropy JOB Queue
389      */
390     MEM_REC_ENTROPY_JOBQ,
391 
392     /**
393      * Contains status map indicating processing status per MB basis
394      */
395     MEM_REC_PROC_MAP,
396 
397     /**
398      * Contains status map indicating deblocking status per MB basis
399      */
400     MEM_REC_DBLK_MAP,
401 
402     /*
403      * Contains AIR map and mask
404      */
405     MEM_REC_AIR_MAP,
406 
407     /**
408      * Contains status map indicating ME status per MB basis
409      */
410     MEM_REC_ME_MAP,
411 
412     /**
413      * Holds dpb manager context
414      */
415     MEM_REC_DPB_MGR,
416 
417     /**
418      * Holds intermediate buffers needed during processing stage
419      * Memory for process contexts is allocated in this memtab
420      */
421     MEM_REC_PROC_SCRATCH,
422 
423     /**
424      * Holds buffers for vert_bs, horz_bs and QP (all frame level)
425      */
426     MEM_REC_QUANT_PARAM,
427 
428     /**
429      * Holds top row syntax information
430      */
431     MEM_REC_TOP_ROW_SYN_INFO,
432 
433     /**
434      * Holds buffers for vert_bs, horz_bs and QP (all frame level)
435      */
436     MEM_REC_BS_QP,
437 
438     /**
439      * Holds input buffer manager context
440      */
441     MEM_REC_INP_PIC,
442 
443     /**
444      * Holds output buffer manager context
445      */
446     MEM_REC_OUT,
447 
448     /**
449      * Holds picture buffer manager context and array of pic_buf_ts
450      * Also holds reference picture buffers in non-shared mode
451      */
452     MEM_REC_REF_PIC,
453 
454     /*
455      * Mem record for color space conversion
456      */
457     MEM_REC_CSC,
458 
459     /**
460      * NMB info struct
461      */
462     MEM_REC_MB_INFO_NMB,
463 
464     /**
465      * Rate control of memory records.
466      */
467     MEM_REC_RC,
468 
469     /**
470      * Place holder to compute number of memory records.
471      */
472     MEM_REC_CNT = MEM_REC_RC + NUM_RC_MEMTABS,
473 
474     /*
475      * Do not add anything below
476      */
477 };
478 
479 #define DISABLE_DEBLOCK_INTERVAL 8
480 
481 /**
482  ****************************************************************************
483  * Disable deblock levels
484  * Level 0 enables deblocking completely and level 4 disables completely
485  * Other levels are intermediate values to control deblocking level
486  ****************************************************************************
487  */
488 enum
489 {
490     /**
491      * Enable deblocking completely
492      */
493     DISABLE_DEBLK_LEVEL_0,
494 
495     /**
496      * Disable only within MB edges - Not supported currently
497      */
498     DISABLE_DEBLK_LEVEL_1,
499 
500     /**
501      * Enable deblocking once in DEBLOCK_INTERVAL number of pictures
502      * and for I slices
503      */
504     DISABLE_DEBLK_LEVEL_2,
505 
506     /**
507      * Enable deblocking only for I slices
508      */
509     DISABLE_DEBLK_LEVEL_3,
510 
511     /**
512      * Disable deblocking completely
513      */
514     DISABLE_DEBLK_LEVEL_4
515 };
516 
517 /**
518  ****************************************************************************
519  * Number of buffers for I/O based on format
520  ****************************************************************************
521  */
522 
523 /** Minimum number of input buffers */
524 #define MIN_INP_BUFS                 2
525 
526 /** Minimum number of output buffers */
527 #define MIN_OUT_BUFS                1
528 
529 /** Minimum number of components in bitstream buffer */
530 #define MIN_BITS_BUFS_COMP           1
531 
532 /** Minimum number of components in raw buffer */
533 #define MIN_RAW_BUFS_420_COMP        3
534 #define MIN_RAW_BUFS_422ILE_COMP     1
535 #define MIN_RAW_BUFS_RGB565_COMP     1
536 #define MIN_RAW_BUFS_RGBA8888_COMP   1
537 #define MIN_RAW_BUFS_420SP_COMP      2
538 
539 /** Maximum number of active config paramter sets */
540 #define MAX_ACTIVE_CONFIG_PARAMS 32
541 
542 /**
543 ******************************************************************************
544  *  @brief Thresholds for luma & chroma to determine if the 8x8 subblock needs
545  *  to be encoded or skipped
546 ******************************************************************************
547 */
548 #define LUMA_SUB_BLOCK_SKIP_THRESHOLD 4
549 #define LUMA_BLOCK_SKIP_THRESHOLD 5
550 #define CHROMA_BLOCK_SKIP_THRESHOLD 4
551 
552 /**
553 ******************************************************************************
554  *  @brief      defines the first byte of a NAL unit
555  *  forbidden zero bit - nal_ref_idc - nal_unit_type
556 ******************************************************************************
557 */
558 /* [0 - 11 - 00111] */
559 #define NAL_SPS_FIRST_BYTE 0x67
560 
561 /* [0 - 11 - 01000] */
562 #define NAL_PPS_FIRST_BYTE 0x68
563 
564 /* [0 - 11 - 00001] */
565 #define NAL_SLICE_FIRST_BYTE 0x61
566 
567 /* [0 - 00 - 00001] */
568 #define NAL_NON_REF_SLICE_FIRST_BYTE 0x01
569 
570 /* [0 - 11 - 00101] */
571 #define NAL_IDR_SLICE_FIRST_BYTE 0x65
572 
573 /* [0 - 00 - 01100] */
574 #define NAL_FILLER_FIRST_BYTE 0x0C
575 
576 /* [0 - 00 - 00110] */
577 #define NAL_SEI_FIRST_BYTE 0x06
578 
579 #define H264_ALLOC_INTER_FRM_INTV        2
580 
581 #define H264_MPEG_QP_MAP    255
582 
583 #define MPEG2_QP_ELEM       (H264_MPEG_QP_MAP + 1)
584 #define H264_QP_ELEM        (MAX_H264_QP + 1)
585 
586 #define H264_INIT_QUANT_I                26
587 #define H264_INIT_QUANT_P                34
588 
589 #endif /*IH264E_DEFS_H_*/
590