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 *  ih264_defs.h
24 *
25 * @brief
26 *  Definitions used in the codec
27 *
28 * @author
29 *  Ittiam
30 *
31 *
32 * @remarks
33 *  None
34 *
35 *******************************************************************************
36 */
37 
38 #ifndef IH264_DEFS_H_
39 #define IH264_DEFS_H_
40 
41 /*****************************************************************************/
42 /* Enums                                                                     */
43 /*****************************************************************************/
44 
45 
46 /*****************************************************************************/
47 /* Profile and Levels                                                        */
48 /*****************************************************************************/
49 
50 /**
51 ******************************************************************************
52  *  @enum  PROFILE_IDC
53  *  @brief Defines the set of possible profiles
54 ******************************************************************************
55 */
56 enum
57 {
58     IH264_PROFILE_BASELINE = 66,
59     IH264_PROFILE_MAIN = 77,
60     IH264_PROFILE_EXTENDED = 88,
61     IH264_PROFILE_HIGH = 100,
62     IH264_PROFILE_HIGH10 = 110,
63     IH264_PROFILE_HIGH422 = 122,
64     IH264_PROFILE_HIGH444 = 144,
65 };
66 
67 /**
68 ******************************************************************************
69  *  @enum  LEVEL_IDC
70  *  @brief Defines the set of possible levels
71 ******************************************************************************
72 */
73 typedef enum
74 {
75     IH264_LEVEL_10         = 10,
76     IH264_LEVEL_1B         = 9,
77     IH264_LEVEL_11         = 11,
78     IH264_LEVEL_12         = 12,
79     IH264_LEVEL_13         = 13,
80     IH264_LEVEL_20         = 20,
81     IH264_LEVEL_21         = 21,
82     IH264_LEVEL_22         = 22,
83     IH264_LEVEL_30         = 30,
84     IH264_LEVEL_31         = 31,
85     IH264_LEVEL_32         = 32,
86     IH264_LEVEL_40         = 40,
87     IH264_LEVEL_41         = 41,
88     IH264_LEVEL_42         = 42,
89     IH264_LEVEL_50         = 50,
90     IH264_LEVEL_51         = 51,
91 }IH264_LEVEL_T;
92 
93 
94 /**
95 ******************************************************************************
96  *  @enum  PIC TYPES
97  *  @brief Defines the set of possible picture type - not signaled in bitstream
98 ******************************************************************************
99 */
100 typedef enum
101 {
102     PIC_NA = 0x7FFFFFFF,
103     PIC_IDR = 0,
104     PIC_I = 1,
105     PIC_P = 2,
106     PIC_B = 3,
107     PIC_P_NONREF = 4,
108     PIC_B_NONREF = 5,
109     PIC_MAX,
110 }PIC_TYPE_T;
111 
112 /**
113 ******************************************************************************
114  *  @enum  FRAME-FIELD types
115  *  @brief Defines the set of possible field types.
116 ******************************************************************************
117 */
118 enum
119 {
120     TOP_FIELD,
121     BOTTOM_FIELD,
122     FRAME,
123 };
124 
125 /**
126 ******************************************************************************
127  *  @enum  SLICE TYPES
128  *  @brief Defines the set of possible SLICE TYPES
129 ******************************************************************************
130 */
131 enum
132 {
133     PSLICE = 0,
134     BSLICE = 1,
135     ISLICE = 2,
136     SPSLICE = 3,
137     SISLICE = 4,
138     MAXSLICE_TYPE,
139 };
140 
141 /**
142 ******************************************************************************
143  *  @enum  NAL_UNIT_TYPE
144  *  @brief Defines the set of possible nal unit types
145 ******************************************************************************
146 */
147 enum
148 {
149     NAL_UNSPEC_0        = 0,
150     NAL_SLICE_NON_IDR   = 1,
151     NAL_SLICE_DPA       = 2,
152     NAL_SLICE_DPB       = 3,
153     NAL_SLICE_DPC       = 4,
154     NAL_SLICE_IDR       = 5,
155     NAL_SEI             = 6,
156     NAL_SPS             = 7,
157     NAL_PPS             = 8,
158     NAL_AUD             = 9,
159     NAL_EOSEQ           = 10,
160     NAL_EOSTR           = 11,
161     NAL_FILLER          = 12,
162     NAL_SPSE            = 13,
163     NAL_RES_18          = 14,
164     NAL_AUX_PIC         = 19,
165     NAL_RES_23          = 20,
166     NAL_UNSPEC_31       = 24,
167 };
168 
169 /**
170 ******************************************************************************
171  *  @enum  CHROMA_FORMAT_IDC
172  *  @brief Defines the set of possible chroma formats
173  *  Note Chorma format Do not change enum values
174 ******************************************************************************
175 */
176 enum
177 {
178     CHROMA_FMT_IDC_MONOCHROME   = 0,
179     CHROMA_FMT_IDC_YUV420       = 1,
180     CHROMA_FMT_IDC_YUV422       = 2,
181     CHROMA_FMT_IDC_YUV444       = 3,
182     CHROMA_FMT_IDC_YUV444_PLANES = 4,
183 };
184 
185 
186 /**
187 ******************************************************************************
188  *  @enum  MBMODES_I16x16
189  *  @brief Defines the set of possible intra 16x16 mb modes
190 ******************************************************************************
191 */
192 typedef enum
193 {
194     VERT_I16x16     = 0,
195     HORZ_I16x16     = 1,
196     DC_I16x16       = 2,
197     PLANE_I16x16    = 3,
198     MAX_I16x16      = 4,
199 }MBMODES_I16x16;
200 
201 /**
202 ******************************************************************************
203  *  @enum  MBMODES_I4x4
204  *  @brief Defines the set of possible intra 4x4 mb modes
205 ******************************************************************************
206 */
207 typedef enum
208 {
209     VERT_I4x4     = 0,
210     HORZ_I4x4     = 1,
211     DC_I4x4       = 2,
212     DIAG_DL_I4x4  = 3,
213     DIAG_DR_I4x4  = 4,
214     VERT_R_I4x4   = 5,
215     HORZ_D_I4x4   = 6,
216     VERT_L_I4x4   = 7,
217     HORZ_U_I4x4   = 8,
218     MAX_I4x4      = 9,
219 }MBMODES_I4x4;
220 
221 /**
222 ******************************************************************************
223  *  @enum  MBMODES_I8x8
224  *  @brief Defines the set of possible intra 8x8 mb modes
225 ******************************************************************************
226 */
227 typedef enum
228 {
229     VERT_I8x8     = 0,
230     HORZ_I8x8     = 1,
231     DC_I8x8       = 2,
232     DIAG_DL_I8x8  = 3,
233     DIAG_DR_I8x8  = 4,
234     VERT_R_I8x8   = 5,
235     HORZ_D_I8x8   = 6,
236     VERT_L_I8x8   = 7,
237     HORZ_U_I8x8   = 8,
238     MAX_I8x8      = 9,
239 }MBMODES_I8x8;
240 
241 /**
242 ******************************************************************************
243  *  @enum  MBMODES_CHROMA_I8x8 (Chroma)
244  *  @brief Defines the set of possible intra 8x8 mb modes for chroma
245 ******************************************************************************
246 */
247 typedef enum
248 {
249     DC_CH_I8x8     = 0,
250     HORZ_CH_I8x8   = 1,
251     VERT_CH_I8x8   = 2,
252     PLANE_CH_I8x8  = 3,
253     MAX_CH_I8x8    = 4,
254 }MBMODES_CHROMA_I8x8;
255 
256 /**
257 ******************************************************************************
258  *  @enum  MBTYPES
259  *  @brief Defines the set of possible macro block types
260 ******************************************************************************
261 */
262 typedef enum
263 {
264     I16x16      = 0,
265     I4x4        = 1,
266     I8x8        = 2,
267     P16x16      = 3,
268     P16x8       = 4,
269     P8x16       = 5,
270     P8x8        = 6,
271     PSKIP       = 7,
272     IPCM        = 8,
273     B16x16      = 9,
274     BSKIP       = 10,
275     BDIRECT     = 11,
276     MAX_MBTYPES,
277 }MBTYPES_T;
278 
279 /* Prediction list */
280 /* Do not change enum values */
281 enum
282 {
283     PRED_L0 = 0,
284     PRED_L1 = 1,
285     PRED_BI = 2
286 };
287 
288 
289 /**
290 ******************************************************************************
291  *  @enum  ENTROPY_BLK_TYPE
292  *  @brief Defines the nature of blocks employed in entropy coding
293 ******************************************************************************
294 */
295 typedef enum
296 {
297     ENTROPY_BLK_INVALID = -1,
298     CAVLC_LUMA_4x4_DC = 0,
299     CAVLC_LUMA_4x4_AC = 1,
300     CAVLC_LUMA_4x4 = 2,
301     CAVLC_CHROMA_4x4_DC = 3,
302     CAVLC_CHROMA_4x4_AC = 4,
303 } ENTROPY_BLK_TYPE;
304 
305 /**
306 ******************************************************************************
307  *  @enum  ENTROPY_MODE
308  *  @brief Entropy coding modes
309 ******************************************************************************
310 */
311 typedef enum
312 {
313     CAVLC = 0,
314     CABAC = 1,
315 } ENTROPY_MODE;
316 
317 /**
318 ******************************************************************************
319  *  @enum  COMPONENT_TYPE
320  *  @brief components Y, U & V
321 ******************************************************************************
322 */
323 typedef enum
324 {
325     Y,
326     U,
327     V,
328 } COMPONENT_TYPE;
329 
330 
331 /**
332 ******************************************************************************
333  *  @enum  MBPART_PREDMODE_T
334  *  @brief MbPartps_pred_mode_ctxt Table 7-11 to 7-14
335 ******************************************************************************
336 */
337 typedef enum
338 {
339     MBPART_NA,
340     MBPART_I4x4,
341     MBPART_I8x8,
342     MBPART_I16x16,
343     MBPART_L0,
344     MBPART_L1,
345     MBPART_BI,
346     MBPART_DIRECT,
347     MBPART_IPCM,
348 }MBPART_PREDMODE_T;
349 
350 
351 typedef enum
352 {
353     I_NxN,
354     I_16x16_0_0_0,
355     I_16x16_1_0_0,
356     I_16x16_2_0_0,
357     I_16x16_3_0_0,
358     I_16x16_0_1_0,
359     I_16x16_1_1_0,
360     I_16x16_2_1_0,
361     I_16x16_3_1_0,
362     I_16x16_0_2_0,
363     I_16x16_1_2_0,
364     I_16x16_2_2_0,
365     I_16x16_3_2_0,
366     I_16x16_0_0_1,
367     I_16x16_1_0_1,
368     I_16x16_2_0_1,
369     I_16x16_3_0_1,
370     I_16x16_0_1_1,
371     I_16x16_1_1_1,
372     I_16x16_2_1_1,
373     I_16x16_3_1_1,
374     I_16x16_0_2_1,
375     I_16x16_1_2_1,
376     I_16x16_2_2_1,
377     I_16x16_3_2_1,
378     I_PCM,
379 }MBTYPE_ISLICE_T;
380 
381 typedef enum
382 {
383     P_L0_16x16,
384     P_L0_L0_16x8,
385     P_L0_L0_8x16,
386     P_8x8,
387     P_8x8REF0,
388     P_SKIP
389 }MBTYPE_PSLICE_T;
390 
391 typedef enum
392 {
393     B_DIRECT_16x16,
394     B_L0_16x16,
395     B_L1_16x16,
396     B_BI_16x16,
397     B_L0_L0_16x8,
398     B_L0_L0_8x16,
399     B_L1_L1_16x8,
400     B_L1_L1_8x16,
401     B_L0_L1_16x8,
402     B_L0_L1_8x16,
403     B_L1_L0_16x8,
404     B_L1_L0_8x16,
405     B_L0_BI_16x8,
406     B_L0_BI_8x16,
407     B_L1_BI_16x8,
408     B_L1_BI_8x16,
409     B_BI_L0_16x8,
410     B_BI_L0_8x16,
411     B_BI_L1_16x8,
412     B_BI_L1_8x16,
413     B_BI_BI_16x8,
414     B_BI_BI_8x16,
415     B_8x8,
416     B_SKIP,
417 }MBTYPE_BSLICE_T;
418 
419 
420 typedef enum
421 {
422     P_L0_8x8,
423     P_L0_8x4,
424     P_L0_4x8,
425     P_L0_4x4,
426 }SUBMBTYPE_PSLICE_T;
427 
428 typedef enum
429 {
430     B_DIRECT_8x8,
431     B_L0_8x8,
432     B_L1_8x8,
433     B_BI_8x8,
434     B_L0_8x4,
435     B_L0_4x8,
436     B_L1_8x4,
437     B_L1_4x8,
438     B_BI_8x4,
439     B_BI_4x8,
440     B_L0_4x4,
441     B_L1_4x4,
442     B_BI_4x4,
443 }SUBMBTYPE_BSLICE_T;
444 
445 /**
446  * DC Mode pattern for 4 4x4 sub blocks in an MB row
447  */
448 #define DC_I16X16_MB_ROW (DC_I16x16 << 24) | (DC_I16x16 << 16) | \
449                          (DC_I16x16 << 8)  | DC_I16x16
450 
451 
452 
453 /*****************************************************************************/
454 /* Constant Macros                                                           */
455 /*****************************************************************************/
456 
457 /*****************************************************************************/
458 /* Reference frame defs                                                      */
459 /*****************************************************************************/
460 /* Maximum DPB size */
461 #define MAX_DPB_SIZE 16
462 
463 /* Maximum mmco commands in slice header */
464 #define MAX_MMCO_COMMANDS 32
465 
466 /* Maximum reference reorder idc */
467 #define MAX_MODICATION_IDC 32
468 
469 /*****************************************************************************/
470 /* SPS restrictions                                                          */
471 /*****************************************************************************/
472 
473 /* Number of SPS allowed */
474 /* An extra buffer is allocated to write the parsed data
475  * It is copied to the appropriate location later */
476 #define MAX_SPS_CNT         (32 + 1)
477 
478 /* Maximum long term reference pics */
479 #define MAX_LTREF_PICS_SPS 16
480 
481 /* Maximum short term reference pics */
482 #define MAX_STREF_PICS_SPS 64
483 
484 
485 /*****************************************************************************/
486 /* PPS restrictions                                                          */
487 /*****************************************************************************/
488 
489 /* Number of PPS allowed  */
490 /* An extra buffer is allocated to write the parsed data
491  * It is copied to the appropriate location later */
492 #define MAX_PPS_CNT         (256 + 1)
493 
494 /*****************************************************************************/
495 /* Macro definitions for sizes of MB, PU, TU, CU                            */
496 /*****************************************************************************/
497 #define MB_SIZE             16
498 #define BLK8x8SIZE          8
499 #define BLK_SIZE            4
500 
501 
502 /* TU Size Range */
503 #define MAX_TU_SIZE         8
504 #define MIN_TU_SIZE         4
505 
506 /* Max Transform Size */
507 #define MAX_TRANS_SIZE      (MAX_TU_SIZE*MAX_TU_SIZE)
508 
509 /* PU Size Range */
510 #define MAX_PU_SIZE         16
511 #define MIN_PU_SIZE         4
512 
513 /* Number of max TU in a MB row */
514 #define MAX_TU_IN_MB_ROW   ((MB_SIZE / MIN_TU_SIZE))
515 
516 /* Number of max PU in a CTb row */
517 #define MAX_PU_IN_MB_ROW   ((MB_SIZE / MIN_PU_SIZE))
518 
519 
520 /* Number of max PU in a MB */
521 /*****************************************************************************/
522 /* Note though for 64 x 64 MB, Max PU in MB is 128, in order to store      */
523 /*  intra pred info, 256 entries are needed                                  */
524 /*****************************************************************************/
525 #define MAX_PU_IN_MB       ((MB_SIZE / MIN_PU_SIZE) * \
526                              (MB_SIZE / MIN_PU_SIZE))
527 
528 /* Number of max TU in a MB */
529 #define MAX_TU_IN_MB       ((MB_SIZE / MIN_TU_SIZE) * \
530                              (MB_SIZE / MIN_TU_SIZE))
531 
532 
533 
534 /**
535  * Maximum transform depths
536  */
537 #define MAX_TRAFO_DEPTH 5
538 
539 #define MAX_DC_4x4_SUBBLK_LUMA 1
540 #define MAX_AC_4x4_SUBBLK_LUMA 16
541 #define MAX_DC_4x4_SUBBLK_CHROMA 2
542 #define MAX_AC_4x4_SUBBLK_CHROMA 8
543 
544 #define MAX_4x4_SUBBLKS (MAX_DC_4x4_SUBBLK_LUMA + MAX_DC_4x4_SUBBLK_CHROMA +\
545                          MAX_AC_4x4_SUBBLK_LUMA + MAX_AC_4x4_SUBBLK_CHROMA)
546 
547 /* Max number of deblocking edges */
548 #define MAX_VERT_DEBLK_EDGES ((MB_SIZE/8) * (MB_SIZE/4))
549 #define MAX_HORZ_DEBLK_EDGES ((MB_SIZE/4) * (MB_SIZE/8))
550 
551 /* Qp can not change below 8x8 level */
552 #define MAX_DEBLK_QP_CNT     ((MB_SIZE/8) * (MB_SIZE/8))
553 
554 /*****************************************************************************/
555 /* Parsing related macros                                                    */
556 /*****************************************************************************/
557 #define SUBBLK_COEFF_CNT    16
558 
559 /* Quant and Trans defs */
560 
561 /*****************************************************************************/
562 /* Sizes for Transform functions                                             */
563 /*****************************************************************************/
564 #define TRANS_SIZE_4   4
565 #define TRANS_SIZE_8   8
566 #define TRANS_SIZE_16 16
567 #define TRANS_SIZE_32 32
568 
569 
570 #define IT_SHIFT_STAGE_1 7
571 #define IT_SHIFT_STAGE_2 12
572 
573 /**
574  * @breif  Maximum transform dynamic range (excluding sign bit)
575  */
576 #define MAX_TR_DYNAMIC_RANGE  15
577 
578 /**
579  * @brief  Q(QP%6) * IQ(QP%6) = 2^20
580  */
581 #define QUANT_IQUANT_SHIFT    20
582 
583 /**
584  * @breif Q factor for Qp%6 multiplication
585  */
586 #define QUANT_SHIFT           14
587 
588 /**
589  * @breif Q shift factor for flat rescale matrix weights
590  */
591 #define FLAT_RESCALE_MAT_Q_SHIFT    11
592 
593 /**
594  * @breif  Scaling matrix is represented in Q15 format
595  */
596 #define SCALING_Q_SHIFT       15
597 
598 /**
599  * @brief  rounding factor for quantization represented in Q9 format
600  */
601 #define QUANT_ROUND_FACTOR_Q   9
602 
603 /**
604  * @brief  Minimum qp supported in H264 spec
605  */
606 #define MIN_H264_QP 0
607 
608 /**
609  * @brief  Maximum qp supported in H264 spec
610  */
611 #define MAX_H264_QP 51
612 
613 /**
614  * @breif  Total number of transform sizes
615  * used for sizeID while getting scale matrix
616  */
617 #define NUM_UNIQUE_TRANS_SIZE 4
618 
619 /**
620  * @breif  Maximum number of bits in frameNumber signaling
621  */
622 #define MAX_BITS_IN_FRAME_NUM     16
623 
624 /**
625  * @breif  Maximum number of bits in POC LSB signaling
626  */
627 #define MAX_BITS_IN_POC_LSB     16
628 
629 
630 /**
631  * @breif  Maximum PIC Order Count type
632  */
633 #define MAX_PIC_ORDER_COUNT_TYPE    2
634 
635 
636 /**
637  * @breif  Maximum Weighted bipred idc
638  */
639 #define MAX_WEIGHT_BIPRED_IDC 2
640 
641 /*****************************************************************************/
642 /* Number of scaling matrices for each transform size                        */
643 /*****************************************************************************/
644 #define SCALE_MAT_CNT_TRANS_SIZE_4    6
645 #define SCALE_MAT_CNT_TRANS_SIZE_8    6
646 #define SCALE_MAT_CNT_TRANS_SIZE_16   6
647 #define SCALE_MAT_CNT_TRANS_SIZE_32   2
648 
649 /* Maximum number of scale matrices for a given transform size */
650 #define SCALE_MAT_CNT_MAX_PER_TRANS_SIZE 6
651 
652 /* Total number of scale matrices */
653 #define TOTAL_SCALE_MAT_COUNT   (SCALE_MAT_CNT_TRANS_SIZE_4     + \
654                                  SCALE_MAT_CNT_TRANS_SIZE_8     + \
655                                  SCALE_MAT_CNT_TRANS_SIZE_16    + \
656                                  SCALE_MAT_CNT_TRANS_SIZE_32)
657 
658 
659 /*****************************************************************************/
660 /* Intra pred Macros                                                         */
661 /*****************************************************************************/
662 /** Planar Intra prediction mode */
663 #define INTRA_PLANAR             0
664 
665 /** DC Intra prediction mode */
666 #define INTRA_DC                 1
667 
668 /** Gives angular mode for intra prediction */
669 #define INTRA_ANGULAR(x) (x)
670 
671 /** Following is used to signal no intra prediction in case of pcm blocks
672  */
673 #define INTRA_PRED_NONE  63
674 
675 
676 /** Following is used to signal no intra prediction is needed for first three
677  * 4x4 luma blocks in case of 4x4 TU sizes
678  * Also used in pcm cases
679  */
680 #define INTRA_PRED_CHROMA_IDX_NONE  7
681 
682 
683 /**
684 ******************************************************************************
685  *  @brief  neighbor availability masks
686 ******************************************************************************
687  */
688 #define LEFT_MB_AVAILABLE_MASK      0x01
689 #define TOP_LEFT_MB_AVAILABLE_MASK  0x02
690 #define TOP_MB_AVAILABLE_MASK       0x04
691 #define TOP_RIGHT_MB_AVAILABLE_MASK 0x08
692 
693 #endif /* IH264_DEFS_H_ */
694