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#ifndef _IH264D_DEFS_H_
21#define _IH264D_DEFS_H_
22
23/**
24 ************************************************************************
25 * \file ih264d_defs.h
26 *
27 * \brief
28 *    Type definitions used in the code
29 *
30 * \date
31 *    19/11/2002
32 *
33 * \author  Sriram Sethuraman
34 *
35 ************************************************************************
36 */
37#define H264_MAX_FRAME_WIDTH                3840
38#define H264_MAX_FRAME_HEIGHT               2176
39
40#define H264_MIN_FRAME_WIDTH                16
41#define H264_MIN_FRAME_HEIGHT               16
42
43#define FMT_CONV_NUM_ROWS       16
44
45/** Bit manipulation macros */
46#define CHECKBIT(a,i) ((a) &  (1 << i))
47#define CLEARBIT(a,i) ((a) &= ~(1 << i))
48
49/** Macro to convert a integer to a boolean value */
50#define BOOLEAN(x) (!!(x))
51
52/** Arithmetic operations */
53#define MOD(x,y) ((x)%(y))
54#define DIV(x,y) ((x)/(y))
55#define MUL(x,y) ((x)*(y))
56#define SIGN_POW2_DIV(x, y) (((x) < 0) ? (-((-(x)) >> (y))) : ((x) >> (y)))
57
58#define MB_ENABLE_FILTERING           0x00
59#define MB_DISABLE_FILTERING          0x01
60#define MB_DISABLE_TOP_EDGE           0x02
61#define MB_DISABLE_LEFT_EDGE          0x04
62
63/** Maximum number of reference pics */
64#define MAX_REF_BUFS    32
65#define MAX_DISP_BUFS_NEW 64
66#define MAX_FRAMES              16
67
68#define INVALID_FRAME_NUM       0x0fffffff
69#define GAP_FRAME_NUM           0x1fffffff
70
71/** macros for reference picture lists, refIdx to POC mapping */
72// 1 extra entry into reference picture lists for refIdx = -1.
73// this entry is always 0. this saves conditional checks in
74// FillBs modules.
75#define POC_LIST_L0_TO_L1_DIFF  (( 2*MAX_FRAMES) + 1)
76#define POC_LIST_L0_TO_L1_DIFF_1  ((MAX_FRAMES) + 1)
77
78#define FRM_LIST_L0             0                                               //0
79#define FRM_LIST_L1             1 * POC_LIST_L0_TO_L1_DIFF//FRM_LIST_L0 + POC_LIST_L0_TO_L1_DIFF        //0+33                  //(1 * POC_LIST_L0_TO_L1_DIFF)
80#define TOP_LIST_FLD_L0         2 * POC_LIST_L0_TO_L1_DIFF//FRM_LIST_L1 + POC_LIST_L0_TO_L1_DIFF        //0+33+33                   //(2 * POC_LIST_L0_TO_L1_DIFF)
81#define TOP_LIST_FLD_L1         3 * POC_LIST_L0_TO_L1_DIFF//TOP_LIST_FLD_L0 + POC_LIST_L0_TO_L1_DIFF_1  //0+33+33+17                //(3 * POC_LIST_L0_TO_L1_DIFF)
82#define BOT_LIST_FLD_L0         4 * POC_LIST_L0_TO_L1_DIFF//TOP_LIST_FLD_L1 + POC_LIST_L0_TO_L1_DIFF_1  //0+33+33+17+17
83#define BOT_LIST_FLD_L1         5 * POC_LIST_L0_TO_L1_DIFF//BOT_LIST_FLD_L0 + POC_LIST_L0_TO_L1_DIFF_1  //0+33+33+17+17+17
84#define TOTAL_LIST_ENTRIES      6 * POC_LIST_L0_TO_L1_DIFF//BOT_LIST_FLD_L1 + POC_LIST_L0_TO_L1_DIFF_1  //0+33+33+17+17+17+17
85#define PAD_MV_BANK_ROW             64
86#define OFFSET_MV_BANK_ROW          ((PAD_MV_BANK_ROW)>>1)
87#define PAD_PUC_CURNNZ              32
88#define OFFSET_PUC_CURNNZ           (PAD_PUC_CURNNZ)
89#define PAD_MAP_IDX_POC             (1)
90#define OFFSET_MAP_IDX_POC          (1)
91
92#define OFFSET_MAP_IDX_POC          (1)
93
94#define NAL_REF_IDC(nal_first_byte)       ((nal_first_byte >> 5) & 0x3)
95#define NAL_FORBIDDEN_BIT(nal_first_byte) (nal_first_byte>>7)
96#define NAL_UNIT_TYPE(nal_first_byte)     (nal_first_byte & 0x1F)
97
98#define INT_PIC_TYPE_I        (0x00)
99
100#define YIELD_CNT_THRESHOLD  8
101
102
103#define OK        0
104#define END       1
105#define NOT_OK    -1
106
107/* For 420SP */
108#define YUV420SP_FACTOR 2
109
110
111/**
112 ***************************************************************************
113 * Enum to hold various mem records being request
114 ****************************************************************************
115 */
116enum
117{
118    /**
119     * Codec Object at API level
120     */
121    MEM_REC_IV_OBJ,
122
123    /**
124     * Codec context
125     */
126    MEM_REC_CODEC,
127
128    /**
129     * Bitstream buffer which holds emulation prevention removed bytes
130     */
131    MEM_REC_BITSBUF,
132
133    /**
134     * Buffer to hold  coeff data
135     */
136    MEM_REC_COEFF_DATA,
137
138    /**
139     * Motion vector bank
140     */
141    MEM_REC_MVBANK,
142
143    /**
144     * Holds mem records passed to the codec.
145     */
146    MEM_REC_BACKUP,
147
148    /**
149     * Holds SPS
150     */
151    MEM_REC_SPS,
152
153    /**
154     * Holds PPS
155     */
156    MEM_REC_PPS,
157
158    /**
159     * Holds Slice Headers
160     */
161    MEM_REC_SLICE_HDR,
162
163    /**
164     * Holds thread handles
165     */
166    MEM_REC_THREAD_HANDLE,
167
168    /**
169     * Contains i4_status map indicating parse i4_status per MB basis
170     */
171    MEM_REC_PARSE_MAP,
172
173    /**
174     * Contains i4_status map indicating processing i4_status per MB basis
175     */
176    MEM_REC_PROC_MAP,
177
178    /**
179     * Contains slice number info for each MB
180     */
181
182    MEM_REC_SLICE_NUM_MAP,
183
184    /**
185     * Holds dpb manager context
186     */
187    MEM_REC_DPB_MGR,
188
189    /**
190     * Holds neighbors' info
191     */
192    MEM_REC_NEIGHBOR_INFO,
193
194    /**
195     * Holds neighbors' info
196     */
197    MEM_REC_PRED_INFO,
198
199
200    /**
201     * Holds inter pred inforamation on packed format info
202     */
203    MEM_REC_PRED_INFO_PKD,
204    /**
205     * Holds neighbors' info
206     */
207    MEM_REC_MB_INFO,
208
209    /**
210     * Holds deblock Mb info structure frame level)
211     */
212    MEM_REC_DEBLK_MB_INFO,
213
214    /**
215     * Holds  reference picture buffers in non-shared mode
216     */
217    MEM_REC_REF_PIC,
218
219    /**
220     * Holds  some misc intermediate_buffers
221     */
222    MEM_REC_EXTRA_MEM,
223
224    /**
225     * Holds  some misc intermediate_buffers
226     */
227    MEM_REC_INTERNAL_SCRATCH,
228
229    /**
230     * Holds  some misc intermediate_buffers
231     */
232    MEM_REC_INTERNAL_PERSIST,
233
234    /* holds structures related to picture buffer manager*/
235    MEM_REC_PIC_BUF_MGR,
236
237    /*holds structure related to MV buffer manager*/
238    MEM_REC_MV_BUF_MGR,
239
240    /**
241     * Place holder to compute number of memory records.
242     */
243    MEM_REC_CNT
244/* Do not add anything below */
245};
246
247#ifdef DEBLOCK_THREAD
248#define H264_MUTEX_LOCK(lock) ithread_mutex_lock(lock)
249#define H264_MUTEX_UNLOCK(lock) ithread_mutex_unlock(lock)
250#else //DEBLOCK_THREAD
251#define H264_MUTEX_LOCK(lock)
252#define H264_MUTEX_UNLOCK(lock)
253
254#define DEBUG_THREADS_PRINTF(...)
255#define DEBUG_PERF_PRINTF(...)
256
257/** Profile Types*/
258#define BASE_PROFILE_IDC    66
259#define MAIN_PROFILE_IDC    77
260#define HIGH_PROFILE_IDC   100
261
262
263#define MB_SIZE             16
264#define BLK8x8SIZE           8
265#define BLK_SIZE             4
266#define NUM_BLKS_PER_MB     24
267#define NUM_LUM_BLKS_PER_MB 16
268#define LUM_BLK              0
269#define CHROM_BLK            1
270#define NUM_PELS_IN_MB      64
271
272/* Level Types */
273#define H264_LEVEL_1_0     10
274#define H264_LEVEL_1_1     11
275#define H264_LEVEL_1_2     12
276#define H264_LEVEL_1_3     13
277#define H264_LEVEL_2_0     20
278#define H264_LEVEL_2_1     21
279#define H264_LEVEL_2_2     22
280#define H264_LEVEL_3_0     30
281#define H264_LEVEL_3_1     31
282#define H264_LEVEL_3_2     32
283#define H264_LEVEL_4_0     40
284#define H264_LEVEL_4_1     41
285#define H264_LEVEL_4_2     42
286#define H264_LEVEL_5_0     50
287#define H264_LEVEL_5_1     51
288
289#define MAX_MBS_LEVEL_51 36864
290#define MAX_MBS_LEVEL_50 22080
291#define MAX_MBS_LEVEL_42 8704
292#define MAX_MBS_LEVEL_41 8192
293#define MAX_MBS_LEVEL_40 8192
294#define MAX_MBS_LEVEL_32 5120
295#define MAX_MBS_LEVEL_31 3600
296#define MAX_MBS_LEVEL_30 1620
297#define MAX_MBS_LEVEL_22 1620
298#define MAX_MBS_LEVEL_21 792
299#define MAX_MBS_LEVEL_20 396
300#define MAX_MBS_LEVEL_13 396
301#define MAX_MBS_LEVEL_12 396
302#define MAX_MBS_LEVEL_11 396
303#define MAX_MBS_LEVEL_10 99
304
305/** NAL Types */
306#define SLICE_NAL                       1
307#define SLICE_DATA_PARTITION_A_NAL      2
308#define SLICE_DATA_PARTITION_B_NAL      3
309#define SLICE_DATA_PARTITION_C_NAL      4
310#define IDR_SLICE_NAL                   5
311#define SEI_NAL                         6
312#define SEQ_PARAM_NAL                   7
313#define PIC_PARAM_NAL                   8
314#define ACCESS_UNIT_DELIMITER_RBSP      9
315#define END_OF_SEQ_RBSP                 10
316#define END_OF_STREAM_RBSP              11
317#define FILLER_DATA_NAL                 12
318
319/** Entropy coding modes */
320#define CAVLC  0
321#define CABAC  1
322
323/** Picture Types */
324#define I_PIC       0
325#define IP_PIC      1
326#define IPB_PIC     2
327#define SI_PIC      3
328#define SIP_PIC     4
329#define ISI_PIC     5
330#define ISI_PSP_PIC 6
331#define ALL_PIC     7
332
333/* Frame or field picture type */
334#define FRM_PIC         0x00
335#define TOP_FLD         0x01
336#define BOT_FLD         0x02
337#define COMP_FLD_PAIR   0x03 /* TOP_FLD | BOT_FLD */
338#define AFRM_PIC        0x04
339#define TOP_REF         0x08
340#define BOT_REF         0x10
341#define PIC_MASK        0x03
342#define NON_EXISTING    0xff
343
344/* field picture type for display */
345#define DISP_TOP_FLD    0x00
346#define DISP_BOT_FLD    0x01
347
348/** Slice Types */
349#define P_SLICE  0
350#define B_SLICE  1
351#define I_SLICE  2
352#define SP_SLICE 3
353#define SI_SLICE 4
354
355/* Definition for picture skip */
356#define SKIP_NONE  (0x0)
357#define I_SLC_BIT  (0x1)
358#define P_SLC_BIT  (0x2)
359#define B_SLC_BIT  (0x4)
360
361/** Macros used for Deblocking */
362#define D_INTER_MB        0
363#define D_INTRA_MB        1
364#define D_PRED_NON_16x16  2
365#define D_B_SLICE         4
366#define D_B_SUBMB         6 //D_B_SLICE | D_PRED_NON_16x16 | D_INTER_MB
367#define D_FLD_MB          0x80
368
369/** Macros for Cabac checks */
370/** MbType */
371/** |x|x|I_PCM|SKIP|
372 |S|Inter/Intra|P/B|NON-BD16x16/BD16x16,I16x16/I4x4| */
373#define CAB_INTRA         0x00 /* 0000 00xx */
374#define CAB_INTER         0x04 /* 0000 01xx */
375#define CAB_I4x4          0x00 /* 0000 00x0 */
376#define CAB_I16x16        0x01 /* 0000 00x1 */
377#define CAB_BD16x16       0x04 /* 0000 0100 */
378#define CAB_NON_BD16x16   0x05 /* 0000 0101 */
379#define CAB_P             0x07 /* 0000 0111 */
380#define CAB_SI4x4         0x08 /* 0000 10x0 */
381#define CAB_SI16x16       0x09 /* 0000 10x1 */
382#define CAB_SKIP_MASK     0x10 /* 0001 0000 */
383#define CAB_SKIP          0x10 /* 0001 0000 */
384#define CAB_P_SKIP        0x16 /* 0001 x11x */
385#define CAB_B_SKIP        0x14 /* 0001 x100 */
386#define CAB_BD16x16_MASK  0x07 /* 0000 0111 */
387#define CAB_INTRA_MASK    0x04 /* 0000 0100 */
388#define CAB_I_PCM         0x20 /* 001x xxxx */
389
390/**< Binarization types for CABAC */
391/* |x|x|x|x|MSB_FIRST_FLC|FLC|TUNARY|UNARY| */
392#define UNARY           1
393#define TUNARY          2
394#define FLC             4
395#define MSB_FIRST_FLC   12
396
397/** Macroblock Types */
398#define I_4x4_MB    0
399#define I_16x16_MB  1
400#define P_MB        2
401#define B_MB        3
402#define SI_MB       4
403#define SP_MB       5
404#define I_PCM_MB    6
405
406#define SI4x4_MB 0xFF
407
408/** Intra luma 16x16 and chroma 8x8 prediction modes */
409#define NUM_INTRA_PRED_MODES  4
410#define VERT    0
411#define HORIZ   1
412#define DC      2
413#define PLANE   3
414#define NOT_VALID -1
415#define DC_DC_DC_DC   0x02020202 /*packed 4 bytes used in Decode Intra Mb*/
416
417/** Intra luma 4x4 prediction modes */
418#define NUM_INTRA4x4_PRED_MODES 9
419
420/** VERT, HORIZ, DC are applicable to 4x4 as well */
421/** D - Down; U - Up; L - Left; R - Right */
422#define DIAG_DL   3
423#define DIAG_DR   4
424#define VERT_R    5
425#define HORIZ_D   6
426#define VERT_L    7
427#define HORIZ_U   8
428
429/** P_MB prediction modes */
430#define NUM_INTER_MB_PRED_MODES 5
431#define PRED_16x16  0
432#define PRED_16x8   1
433#define PRED_8x16   2
434#define PRED_8x8    3
435#define PRED_8x8R0  4
436#define MAGIC_16x16 5
437#define MB_SKIP     255
438
439/* P_MB submb modes */
440#define P_L0_8x8    0
441#define P_L0_8x4    1
442#define P_L0_4x8    2
443#define P_L0_4x4    3
444
445/* B_MB submb modes */
446#define B_DIRECT_8x8    0
447#define B_L0_8x8        1
448#define B_L1_8x8        2
449#define B_BI_8x8        3
450#define B_L0_8x4        4
451#define B_L0_4x8        5
452#define B_L1_8x4        6
453#define B_L1_4x8        7
454#define B_BI_8x4        8
455#define B_BI_4x8        9
456#define B_L0_4x4        10
457#define B_L1_4x4        11
458#define B_BI_4x4        12
459
460/** B_MB prediction modes */
461#define B_8x8    22
462#define PRED_INVALID  -1
463#define B_DIRECT  0
464#define PRED_L0   1
465#define PRED_L1   2
466#define BI_PRED   3
467#define B_DIRECT_BI_PRED  23
468#define B_DIRECT_PRED_L0  24
469#define B_DIRECT_PRED_L1  25
470#define B_DIRECT_SPATIAL  26
471
472#define B_DIRECT8x8_BI_PRED  13
473#define B_DIRECT8x8_PRED_L0  14
474#define B_DIRECT8x8_PRED_L1  15
475
476#define ONE_TO_ONE  0
477#define FRM_TO_FLD  1
478#define FLD_TO_FRM  2
479
480/** Inter Sub MB Pred modes */
481#define NUM_INTER_SUBMB_PRED_MODES 4
482#define SUBMB_8x8    0
483#define SUBMB_8x4    1
484#define SUBMB_4x8    2
485#define SUBMB_4x4    3
486
487/** Coded Block Pattern - Chroma */
488#define CBPC_ALLZERO    0
489#define CBPC_ACZERO     1
490#define CBPC_NONZERO    2
491
492/** Index for accessing the left MB in the MV predictor array */
493#define LEFT  0
494/** Index for accessing the top MB in the MV predictor array */
495#define TOP   1
496/** Index for accessing the top right MB in the MV predictor array */
497#define TOP_R 2
498/** Index for accessing the top Left MB in the MV predictor array */
499#define TOP_L 3
500
501/** Maximum number of Sequence Parameter sets */
502#define MAX_NUM_SEQ_PARAMS 32
503
504/** Maximum number of Picture Parameter sets */
505#define MAX_NUM_PIC_PARAMS 256
506
507#define MASK_ERR_SEQ_SET_ID   (0xFFFFFFE0)
508#define MASK_ERR_PIC_SET_ID   (0xFFFFFF00)
509
510#define MAX_PIC_ORDER_CNT_TYPE    2
511
512#define MAX_BITS_IN_FRAME_NUM     16
513#define MAX_BITS_IN_POC_LSB       16
514
515#define H264_MAX_REF_PICS         16
516#define H264_MAX_REF_IDX          32
517#define MAX_WEIGHT_BIPRED_IDC     2
518#define MAX_CABAC_INIT_IDC        2
519
520#define H264_DEFAULT_NUM_CORES 1
521#define DEFAULT_SEPARATE_PARSE (H264_DEFAULT_NUM_CORES == 2)? 1 :0
522
523/** Maximum number of Slice groups */
524#define MAX_NUM_SLICE_GROUPS 8
525#define MAX_NUM_REF_FRAMES_OFFSET 255
526
527/** Deblocking modes for a slice */
528#define SLICE_BOUNDARY_DBLK_DISABLED  2
529#define DBLK_DISABLED                 1
530#define DBLK_ENABLED                  0
531#define MIN_DBLK_FIL_OFF              -12
532#define MAX_DBLK_FIL_OFF              12
533
534/** Width of the predictor buffers used for MC */
535#define MB_SIZE             16
536#define BLK8x8SIZE          8
537#define BLK_SIZE             4
538#define NUM_BLKS_PER_MB     24
539#define NUM_LUM_BLKS_PER_MB 16
540
541#define SUB_BLK_WIDTH                 4
542#define SUB_SUB_BLK_SIZE              4 /* 2x2 pixel i4_size */
543#define SUB_BLK_SIZE                  ((SUB_BLK_WIDTH) * (SUB_BLK_WIDTH))
544#define MB_LUM_SIZE                   256
545#define MB_CHROM_SIZE                 64
546
547/**< Width to pad the luminance frame buff    */
548/**< Height to pad the luminance frame buff   */
549/**< Width to pad the chrominance frame buff  */
550/**< Height to pad the chrominance frame buff */
551
552#define PAD_LEN_Y_H                   32
553#define PAD_LEN_Y_V                   20
554#define PAD_LEN_UV_H                  16
555#define PAD_LEN_UV_V                  8
556
557#define PAD_MV_BANK_ROW             64
558
559/**< Maimum u4_ofst by which the Mvs could point outside the frame buffers
560 horizontally in the left and vertically in the top direction */
561#define MAX_OFFSET_OUTSIDE_X_FRM      -20
562#define MAX_OFFSET_OUTSIDE_Y_FRM      -20
563#define MAX_OFFSET_OUTSIDE_UV_FRM     -8
564
565/** UVLC parsing macros */
566#define   UEV     1
567#define   SEV     2
568#define   TEV     3
569
570/** Defines for Boolean values */
571#ifndef TRUE
572#define TRUE    1
573#define FALSE   0
574#endif
575
576#define UNUSED_FOR_REF 0
577#define IS_SHORT_TERM  1
578#define IS_LONG_TERM   2
579
580/** Defines for which field gets displayed first */
581#define MAX_FRAMES              16
582#define INVALID_FRAME_NUM       0x0fffffff
583#define DO_NOT_DISP             254
584#define DISP_FLD_FIRST_UNDEF  0
585#define DISP_TOP_FLD_FIRST   1
586#define DISP_BOT_FLD_FIRST   2
587
588/** Misc error resilience requirements*/
589#define MASK_LOG2_WEIGHT_DENOM      0xFFFFFFF8
590#define MASK_PRED_WEIGHT_OFFSET     0xFFFFFF00
591#define MAX_REDUNDANT_PIC_CNT       127
592
593
594
595#endif //DEBLOCK_THREAD
596
597#define NUM_COEFFS_IN_4x4BLK 16
598
599
600#define MEMSET_16BYTES(pu4_start,value)                         \
601{                                                               \
602    memset(pu4_start,value,16);                                 \
603}
604
605#define MEMCPY_16BYTES(dst,src)                                 \
606{                                                               \
607    memcpy(dst,src,16);                                         \
608}
609
610
611#endif /*_IH264D_DEFS_H_*/
612