1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /**
19 This file contains common code shared between AVC decoder and AVC encoder for
20 internal use only.
21 @publishedAll
22 */
23 
24 #ifndef AVCINT_COMMON_H_INCLUDED
25 #define AVCINT_COMMON_H_INCLUDED
26 
27 #ifndef AVCAPI_COMMON_H_INCLUDED
28 #include "avcapi_common.h"
29 #endif
30 
31 
32 #ifndef TRUE
33 #define TRUE  1
34 #define FALSE 0
35 #endif
36 
37 
38 
39 /**
40 Mathematic functions defined in subclause 5.7.
41 Can be replaced with assembly instructions for speedup.
42 @publishedAll
43 */
44 #define AVC_ABS(x)   (((x)<0)? -(x) : (x))
45 #define AVC_SIGN(x)  (((x)<0)? -1 : 1)
46 #define AVC_SIGN0(x) (((x)<0)? -1 : (((x)>0) ? 1 : 0))
47 #define AVC_MAX(x,y) ((x)>(y)? (x):(y))
48 #define AVC_MIN(x,y) ((x)<(y)? (x):(y))
49 #define AVC_MEDIAN(A,B,C) ((A) > (B) ? ((A) < (C) ? (A) : (B) > (C) ? (B) : (C)): (B) < (C) ? (B) : (C) > (A) ? (C) : (A))
50 #define AVC_CLIP3(a,b,x) (AVC_MAX(a,AVC_MIN(x,b)))  /* clip x between a and b */
51 #define AVC_CLIP(x)  AVC_CLIP3(0,255,x)
52 #define AVC_FLOOR(x) ((int)(x))
53 #define AVC_RASTER_SCAN(x,y,n)  ((x)+(y)*(n))
54 #define AVC_ROUND(x) (AVC_SIGN(x)*AVC_FLOOR(AVC_ABS(x)+0.5))
55 #define AVC_INVERSE_RASTER_SCAN(a,b,c,d,e) (((e)==0)? (((a)%((d)/(b)))*(b)): (((a)/((d)/(b)))*(c)))
56 /* a:block address, b:block width, c:block height, d:total_width, e:x or y coordinate */
57 
58 #define DEFAULT_ATTR  0  /* default memory attribute  */
59 #define FAST_MEM_ATTR 1  /* fast memory attribute */
60 
61 
62 /* This section is for definition of constants. */
63 #define MB_SIZE 16
64 #define BLOCK_SIZE 4
65 #define EMULATION_PREVENTION_THREE_BYTE 0x3
66 #define NUM_PIXELS_IN_MB  (24*16)
67 #define NUM_BLKS_IN_MB 24
68 
69 #define AVCNumI4PredMode  9
70 #define AVCNumI16PredMode  4
71 #define AVCNumIChromaMode  4
72 
73 /* constants used in the structures below */
74 #define MAXIMUMVALUEOFcpb_cnt   32  /* used in HRDParams */
75 #define MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE 255   /* used in SeqParamSet */
76 #define MAX_NUM_SLICE_GROUP  8      /* used in PicParamSet */
77 #define MAX_REF_PIC_LIST_REORDERING 32  /* 32 is maximum according to Annex A, SliceHeader */
78 #define MAX_DEC_REF_PIC_MARKING 64   /* 64 is the maximum possible given the max num ref pictures to 31. */
79 #define MAX_FS (16+1)  /* pre-defined size of frame store array */
80 #define MAX_LEVEL_IDX  15  /* only 15 levels defined for now */
81 #define MAX_REF_PIC_LIST 33 /* max size of the RefPicList0 and RefPicList1 */
82 
83 
84 /**
85 Architectural related macros.
86 @publishedAll
87 */
88 #ifdef USE_PRED_BLOCK
89 #define MB_BASED_DEBLOCK
90 #endif
91 
92 /**
93 Picture type, PV created.
94 @publishedAll
95 */
96 typedef enum
97 {
98     AVC_FRAME = 3
99 } AVCPictureType;
100 
101 /**
102 This slice type follows Table 7-3. The bottom 5 items may not needed.
103 @publishedAll
104 */
105 typedef enum
106 {
107     AVC_P_SLICE = 0,
108     AVC_B_SLICE = 1,
109     AVC_I_SLICE = 2,
110     AVC_SP_SLICE = 3,
111     AVC_SI_SLICE = 4,
112     AVC_P_ALL_SLICE = 5,
113     AVC_B_ALL_SLICE = 6,
114     AVC_I_ALL_SLICE = 7,
115     AVC_SP_ALL_SLICE = 8,
116     AVC_SI_ALL_SLICE = 9
117 } AVCSliceType;
118 
119 /**
120 Types of the macroblock and partition. PV Created.
121 @publishedAll
122 */
123 typedef enum
124 {
125     /* intra */
126     AVC_I4,
127     AVC_I16,
128     AVC_I_PCM,
129     AVC_SI4,
130 
131     /* inter for both P and B*/
132     AVC_BDirect16,
133     AVC_P16,
134     AVC_P16x8,
135     AVC_P8x16,
136     AVC_P8,
137     AVC_P8ref0,
138     AVC_SKIP
139 } AVCMBMode;
140 
141 /**
142 Enumeration for sub-macroblock mode, interpreted from sub_mb_type.
143 @publishedAll
144 */
145 typedef enum
146 {
147     /* for sub-partition mode */
148     AVC_BDirect8,
149     AVC_8x8,
150     AVC_8x4,
151     AVC_4x8,
152     AVC_4x4
153 } AVCSubMBMode;
154 
155 /**
156 Mode of prediction of partition or sub-partition. PV Created.
157 Do not change the order!!! Used in table look-up mode prediction in
158 vlc.c.
159 @publishedAll
160 */
161 typedef enum
162 {
163     AVC_Pred_L0 = 0,
164     AVC_Pred_L1,
165     AVC_BiPred,
166     AVC_Direct
167 } AVCPredMode;
168 
169 
170 /**
171 Mode of intra 4x4 prediction. Table 8-2
172 @publishedAll
173 */
174 typedef enum
175 {
176     AVC_I4_Vertical = 0,
177     AVC_I4_Horizontal,
178     AVC_I4_DC,
179     AVC_I4_Diagonal_Down_Left,
180     AVC_I4_Diagonal_Down_Right,
181     AVC_I4_Vertical_Right,
182     AVC_I4_Horizontal_Down,
183     AVC_I4_Vertical_Left,
184     AVC_I4_Horizontal_Up
185 } AVCIntra4x4PredMode;
186 
187 /**
188 Mode of intra 16x16 prediction. Table 8-3
189 @publishedAll
190 */
191 typedef enum
192 {
193     AVC_I16_Vertical = 0,
194     AVC_I16_Horizontal,
195     AVC_I16_DC,
196     AVC_I16_Plane
197 } AVCIntra16x16PredMode;
198 
199 
200 /**
201 Mode of intra chroma prediction. Table 8-4
202 @publishedAll
203 */
204 typedef enum
205 {
206     AVC_IC_DC = 0,
207     AVC_IC_Horizontal,
208     AVC_IC_Vertical,
209     AVC_IC_Plane
210 } AVCIntraChromaPredMode;
211 
212 /**
213 Type of residual going to residual_block_cavlc function, PV created.
214 @publishedAll
215 */
216 typedef enum
217 {
218     AVC_Luma,
219     AVC_Intra16DC,
220     AVC_Intra16AC,
221     AVC_ChromaDC,
222     AVC_ChromaAC
223 } AVCResidualType;
224 
225 
226 /**
227 This structure contains VUI parameters as specified in Annex E.
228 Some variables may be removed from the structure if they are found to be useless to store.
229 @publishedAll
230 */
231 typedef struct tagHRDParams
232 {
233     uint  cpb_cnt_minus1;                                   /* ue(v), range 0..31 */
234     uint  bit_rate_scale;                          /* u(4) */
235     uint  cpb_size_scale;                          /* u(4) */
236     uint32  bit_rate_value_minus1[MAXIMUMVALUEOFcpb_cnt];/* ue(v), range 0..2^32-2 */
237     uint32  cpb_size_value_minus1[MAXIMUMVALUEOFcpb_cnt]; /* ue(v), range 0..2^32-2 */
238     uint  cbr_flag[MAXIMUMVALUEOFcpb_cnt];         /* u(1) */
239     uint  initial_cpb_removal_delay_length_minus1;   /* u(5), default 23 */
240     uint  cpb_removal_delay_length_minus1;           /* u(5), default 23 */
241     uint  dpb_output_delay_length_minus1;            /* u(5), default 23 */
242     uint  time_offset_length;                        /* u(5), default 24 */
243 } AVCHRDParams;
244 
245 /**
246 This structure contains VUI parameters as specified in Annex E.
247 Some variables may be removed from the structure if they are found to be useless to store.
248 @publishedAll
249 */
250 typedef struct tagVUIParam
251 {
252     uint      aspect_ratio_info_present_flag;     /* u(1) */
253     uint  aspect_ratio_idc;                     /* u(8), table E-1 */
254     uint  sar_width;                          /* u(16) */
255     uint  sar_height;                         /* u(16) */
256     uint      overscan_info_present_flag;         /* u(1) */
257     uint      overscan_appropriate_flag;        /* u(1) */
258     uint      video_signal_type_present_flag;     /* u(1) */
259     uint  video_format;                         /* u(3), Table E-2, default 5, unspecified */
260     uint      video_full_range_flag;            /* u(1) */
261     uint      colour_description_present_flag;  /* u(1) */
262     uint  colour_primaries;                   /* u(8), Table E-3, default 2, unspecified */
263     uint  transfer_characteristics;           /* u(8), Table E-4, default 2, unspecified */
264     uint  matrix_coefficients;                /* u(8), Table E-5, default 2, unspecified */
265     uint      chroma_location_info_present_flag;  /* u(1) */
266     uint  chroma_sample_loc_type_top_field;                /* ue(v), Fig. E-1range 0..5, default 0 */
267     uint  chroma_sample_loc_type_bottom_field;                /* ue(v) */
268     uint      timing_info_present_flag;           /* u(1) */
269     uint  num_units_in_tick;                    /* u(32), must be > 0 */
270     uint  time_scale;                           /* u(32), must be > 0 */
271     uint      fixed_frame_rate_flag;            /* u(1), Eq. C-13 */
272     uint      nal_hrd_parameters_present_flag;    /* u(1) */
273     AVCHRDParams nal_hrd_parameters;               /* hrd_paramters */
274     uint      vcl_hrd_parameters_present_flag;    /* u(1) */
275     AVCHRDParams vcl_hrd_parameters;               /* hrd_paramters */
276     /* if ((nal_hrd_parameters_present_flag || (vcl_hrd_parameters_present_flag)) */
277     uint      low_delay_hrd_flag;               /* u(1) */
278     uint    pic_struct_present_flag;
279     uint      bitstream_restriction_flag;         /* u(1) */
280     uint      motion_vectors_over_pic_boundaries_flag;    /* u(1) */
281     uint  max_bytes_per_pic_denom;              /* ue(v), default 2 */
282     uint  max_bits_per_mb_denom;                /* ue(v), range 0..16, default 1 */
283     uint  log2_max_mv_length_vertical;          /* ue(v), range 0..16, default 16 */
284     uint  log2_max_mv_length_horizontal;        /* ue(v), range 0..16, default 16 */
285     uint  max_dec_frame_reordering;             /* ue(v) */
286     uint  max_dec_frame_buffering;              /* ue(v) */
287 } AVCVUIParams;
288 
289 
290 /**
291 This structure contains information in a sequence parameter set NAL.
292 Some variables may be removed from the structure if they are found to be useless to store.
293 @publishedAll
294 */
295 typedef struct tagSeqParamSet
296 {
297     uint   Valid;            /* indicates the parameter set is valid */
298 
299     uint  profile_idc;              /* u(8) */
300     uint   constrained_set0_flag;  /* u(1) */
301     uint   constrained_set1_flag;  /* u(1) */
302     uint   constrained_set2_flag;  /* u(1) */
303     uint   constrained_set3_flag;  /* u(1) */
304     uint  level_idc;               /* u(8) */
305     uint  seq_parameter_set_id;    /* ue(v), range 0..31 */
306     uint  log2_max_frame_num_minus4; /* ue(v), range 0..12 */
307     uint pic_order_cnt_type;        /* ue(v), range 0..2 */
308     /* if( pic_order_cnt_type == 0 )  */
309     uint log2_max_pic_order_cnt_lsb_minus4; /* ue(v), range 0..12 */
310     /* else if( pic_order_cnt_type == 1 ) */
311     uint delta_pic_order_always_zero_flag;  /* u(1) */
312     int32  offset_for_non_ref_pic;       /* se(v) */
313     int32  offset_for_top_to_bottom_field;  /* se(v) */
314     uint  num_ref_frames_in_pic_order_cnt_cycle;   /* ue(v) , range 0..255 */
315     /* for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ ) */
316     int32   offset_for_ref_frame[MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE];        /* se(v) */
317     uint  num_ref_frames;                           /* ue(v), range 0..16 */
318     uint   gaps_in_frame_num_value_allowed_flag;    /* u(1) */
319     uint  pic_width_in_mbs_minus1;                  /* ue(v) */
320     uint  pic_height_in_map_units_minus1;           /* ue(v) */
321     uint   frame_mbs_only_flag;                     /* u(1) */
322     /* if( !frame_mbs_only_flag ) */
323     uint   mb_adaptive_frame_field_flag;          /* u(1) */
324     uint   direct_8x8_inference_flag;    /* u(1), must be 1 when frame_mbs_only_flag is 0 */
325     uint   frame_cropping_flag;                     /* u(1) */
326     /* if( frmae_cropping_flag) */
327     uint  frame_crop_left_offset;                /* ue(v) */
328     uint  frame_crop_right_offset;               /* ue(v) */
329     uint  frame_crop_top_offset;                 /* ue(v) */
330     uint  frame_crop_bottom_offset;              /* ue(v) */
331     uint   vui_parameters_present_flag;                      /* u(1) */
332 //  uint nal_hrd_parameters_present_flag;
333 //  uint vcl_hrd_parameters_present_flag;
334 //  AVCHRDParams *nal_hrd_parameters;
335 //  AVCHRDParams *vcl_hrd_parameters;
336     AVCVUIParams vui_parameters;                  /* AVCVUIParam */
337 } AVCSeqParamSet;
338 
339 /**
340 This structure contains information in a picture parameter set NAL.
341 Some variables may be removed from the structure if they are found to be useless to store.
342 @publishedAll
343 */
344 typedef struct tagPicParamSet
345 {
346     uint  pic_parameter_set_id;              /* ue(v), range 0..255 */
347     uint  seq_parameter_set_id;              /* ue(v), range 0..31 */
348     uint  entropy_coding_mode_flag;         /* u(1) */
349     uint  pic_order_present_flag;        /* u(1) */
350     uint  num_slice_groups_minus1;           /* ue(v), range in Annex A */
351     /* if( num_slice_groups_minus1 > 0) */
352     uint  slice_group_map_type;           /* ue(v), range 0..6 */
353     /* if( slice_group_map_type = = 0 ) */
354     /* for(0:1:num_slice_groups_minus1) */
355     uint  run_length_minus1[MAX_NUM_SLICE_GROUP]; /* ue(v) */
356     /* else if( slice_group_map_type = = 2 ) */
357     /* for(0:1:num_slice_groups_minus1-1) */
358     uint  top_left[MAX_NUM_SLICE_GROUP-1];      /* ue(v) */
359     uint  bottom_right[MAX_NUM_SLICE_GROUP-1];  /* ue(v) */
360     /* else if( slice_group_map_type = = 3 || 4 || 5 */
361     uint  slice_group_change_direction_flag;        /* u(1) */
362     uint  slice_group_change_rate_minus1;            /* ue(v) */
363     /* else if( slice_group_map_type = = 6 ) */
364     uint  pic_size_in_map_units_minus1;          /* ue(v) */
365     /* for(0:1:pic_size_in_map_units_minus1) */
366     uint  *slice_group_id;                           /* complete MBAmap u(v) */
367     uint  num_ref_idx_l0_active_minus1;                  /* ue(v), range 0..31 */
368     uint  num_ref_idx_l1_active_minus1;                  /* ue(v), range 0..31 */
369     uint  weighted_pred_flag;                           /* u(1) */
370     uint  weighted_bipred_idc;                          /* u(2), range 0..2 */
371     int   pic_init_qp_minus26;                       /* se(v), range -26..25 */
372     int   pic_init_qs_minus26;                       /* se(v), range -26..25 */
373     int   chroma_qp_index_offset;                    /* se(v), range -12..12 */
374     uint  deblocking_filter_control_present_flag;       /* u(1) */
375     uint  constrained_intra_pred_flag;                  /* u(1) */
376     uint  redundant_pic_cnt_present_flag;               /* u(1) */
377 } AVCPicParamSet;
378 
379 
380 /**
381 This structure contains slice header information.
382 Some variables may be removed from the structure if they are found to be useless to store.
383 @publishedAll
384 */
385 typedef struct tagSliceHeader
386 {
387     uint    first_mb_in_slice;      /* ue(v) */
388     AVCSliceType slice_type;                /* ue(v), Table 7-3, range 0..9 */
389     uint    pic_parameter_set_id;   /* ue(v), range 0..255 */
390     uint    frame_num;              /* u(v), see log2max_frame_num_minus4 */
391     /* if( !frame_mbs_only_flag) */
392     uint    field_pic_flag;         /* u(1) */
393     /* if(field_pic_flag) */
394     uint bottom_field_flag; /* u(1) */
395     /* if(nal_unit_type == 5) */
396     uint    idr_pic_id;         /* ue(v), range 0..65535 */
397     /* if(pic_order_cnt_type==0) */
398     uint    pic_order_cnt_lsb;  /* u(v), range 0..MaxPicOrderCntLsb-1 */
399     /* if(pic_order_present_flag && !field_pic_flag) */
400     int32 delta_pic_order_cnt_bottom;   /* se(v) */
401     /* if(pic_order_cnt_type==1 && !delta_pic_order_always_zero_flag) */
402     /* if(pic_order_present_flag && !field_pic_flag) */
403     int32 delta_pic_order_cnt[2];
404     /* if(redundant_pic_cnt_present_flag) */
405     uint redundant_pic_cnt; /* ue(v), range 0..127 */
406     /* if(slice_type == B) */
407     uint direct_spatial_mv_pred_flag; /* u(1) */
408     /* if(slice_type == P || slice_type==SP || slice_type==B) */
409     uint num_ref_idx_active_override_flag;  /* u(1) */
410     /* if(num_ref_idx_active_override_flag) */
411     uint num_ref_idx_l0_active_minus1;  /* ue(v) */
412     /* if(slie_type == B) */
413     uint num_ref_idx_l1_active_minus1;  /* ue(v) */
414 
415     /* ref_pic_list_reordering() */
416     uint ref_pic_list_reordering_flag_l0;   /* u(1) */
417     uint reordering_of_pic_nums_idc_l0[MAX_REF_PIC_LIST_REORDERING];   /* ue(v), range 0..3 */
418     uint abs_diff_pic_num_minus1_l0[MAX_REF_PIC_LIST_REORDERING];   /* ue(v) */
419     uint long_term_pic_num_l0[MAX_REF_PIC_LIST_REORDERING];     /* ue(v) */
420     uint ref_pic_list_reordering_flag_l1;   /* u(1) */
421     uint reordering_of_pic_nums_idc_l1[MAX_REF_PIC_LIST_REORDERING];   /* ue(v), range 0..3 */
422     uint abs_diff_pic_num_minus1_l1[MAX_REF_PIC_LIST_REORDERING];   /* ue(v) */
423     uint long_term_pic_num_l1[MAX_REF_PIC_LIST_REORDERING];     /* ue(v) */
424 
425     /* end ref_pic_list_reordering() */
426     /* if(nal_ref_idc!=0) */
427     /* dec_ref_pic_marking() */
428     uint    no_output_of_prior_pics_flag;   /* u(1) */
429     uint long_term_reference_flag;      /* u(1) */
430     uint    adaptive_ref_pic_marking_mode_flag; /* u(1) */
431     uint    memory_management_control_operation[MAX_DEC_REF_PIC_MARKING];   /* ue(v), range 0..6 */
432     uint difference_of_pic_nums_minus1[MAX_DEC_REF_PIC_MARKING];    /* ue(v) */
433     uint    long_term_pic_num[MAX_DEC_REF_PIC_MARKING];             /* ue(v) */
434     uint    long_term_frame_idx[MAX_DEC_REF_PIC_MARKING];           /* ue(v) */
435     uint    max_long_term_frame_idx_plus1[MAX_DEC_REF_PIC_MARKING]; /* ue(v) */
436     /* end dec_ref_pic_marking() */
437     /* if(entropy_coding_mode_flag && slice_type!=I && slice_type!=SI) */
438     uint cabac_init_idc;        /* ue(v), range 0..2 */
439     int slice_qp_delta;     /* se(v), range 0..51 */
440     /* if(slice_type==SP || slice_type==SI) */
441     /* if(slice_type==SP) */
442     uint    sp_for_switch_flag; /* u(1) */
443     int slice_qs_delta;     /* se(v) */
444 
445     /* if(deblocking_filter_control_present_flag)*/
446     uint disable_deblocking_filter_idc; /* ue(v), range 0..2 */
447     /* if(disable_deblocking_filter_idc!=1) */
448     int slice_alpha_c0_offset_div2; /* se(v), range -6..6, default 0 */
449     int slice_beta_offset_div_2; /* se(v), range -6..6, default 0 */
450     /* if(num_slice_groups_minus1>0 && slice_group_map_type>=3 && slice_group_map_type<=5)*/
451     uint    slice_group_change_cycle;   /* u(v), use ceil(log2(PicSizeInMapUnits/SliceGroupChangeRate + 1)) bits*/
452 
453 } AVCSliceHeader;
454 
455 /**
456 This struct contains information about the neighboring pixel.
457 @publishedAll
458 */
459 typedef struct tagPixPos
460 {
461     int available;
462     int mb_addr;    /* macroblock address of the current pixel, see below */
463     int x;      /* x,y positions of current pixel relative to the macroblock mb_addr */
464     int y;
465     int pos_x;  /* x,y positions of current pixel relative to the picture. */
466     int pos_y;
467 } AVCPixelPos;
468 
469 typedef struct tagNeighborAvailability
470 {
471     int left;
472     int top;    /* macroblock address of the current pixel, see below */
473     int top_right;      /* x,y positions of current pixel relative to the macroblock mb_addr */
474 } AVCNeighborAvailability;
475 
476 
477 /**
478 This structure contains picture data and related information necessary to be used as
479 reference frame.
480 @publishedAll
481 */
482 typedef struct tagPictureData
483 {
484     uint16 RefIdx;  /* index used for reference frame */
485     uint8 *Sl;   /* derived from base_dpb in AVCFrameStore */
486     uint8 *Scb;  /* for complementary fields, YUV are interlaced */
487     uint8 *Scr;  /* Sl of top_field and bottom_fields will be one line apart and the
488                     stride will be 2 times the width. */
489     /* For non-complementary field, the above still applies. A special
490        output formatting is required. */
491 
492     /* Then, necessary variables that need to be stored */
493     AVCPictureType  picType; /* frame, top-field or bot-field */
494     /*bool*/
495     uint    isReference;
496     /*bool*/
497     uint    isLongTerm;
498     int     PicOrderCnt;
499     int     PicNum;
500     int     LongTermPicNum;
501 
502     int     width; /* how many pixel per line */
503     int     height;/* how many line */
504     int     pitch; /* how many pixel between the line */
505 
506     uint    padded; /* flag for being padded */
507 
508 } AVCPictureData;
509 
510 /**
511 This structure contains information for frame storage.
512 @publishedAll
513 */
514 typedef struct tagFrameStore
515 {
516     uint8 *base_dpb;    /* base pointer for the YCbCr */
517 
518     int     IsReference; /*  0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used */
519     int     IsLongTerm;  /*  0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used */
520     /* if IsLongTerm is true, IsReference can be ignored. */
521     /* if IsReference is true, IsLongterm will be checked for short-term or long-term. */
522     /* IsUsed must be true to enable the validity of IsReference and IsLongTerm */
523 
524     int     IsOutputted;  /* has it been outputted via AVCDecGetOutput API, then don't output it again,
525                             wait until it is returned. */
526     AVCPictureData frame;
527 
528     int     FrameNum;
529     int     FrameNumWrap;
530     int     LongTermFrameIdx;
531     int     PicOrderCnt; /* of the frame, smaller of the 2 fields */
532 
533 } AVCFrameStore;
534 
535 /**
536 This structure maintains the actual memory for the decoded picture buffer (DPB) which is
537 allocated at the beginning according to profile/level.
538 Once decoded_picture_buffer is allocated, Sl,Scb,Scr in
539 AVCPictureData structure just point to the address in decoded_picture_buffer.
540 used_size maintains the used space.
541 NOTE:: In order to maintain contiguous memory space, memory equal to a single frame is
542 assigned at a time. Two opposite fields reside in the same frame memory.
543 
544   |-------|---|---|---|xxx|-------|xxx|---|-------|   decoded_picture_buffer
545     frame  top bot top      frame      bot  frame
546       0     1   1   2         3         4     5
547 
548   bot 2 and top 4 do not exist, the memory is not used.
549 
550 @publishedAll
551 */
552 typedef struct tagDecPicBuffer
553 {
554     uint8 *decoded_picture_buffer;  /* actual memory */
555     uint32  dpb_size;       /* size of dpb in bytes */
556     uint32  used_size;  /* used size */
557     struct tagFrameStore    *fs[MAX_FS]; /* list of frame stored, actual buffer */
558     int     num_fs;  /* size of fs */
559 
560 } AVCDecPicBuffer;
561 
562 
563 /**
564 This structure contains macroblock related variables.
565 @publishedAll
566 */
567 typedef struct tagMacroblock
568 {
569     AVCIntraChromaPredMode  intra_chroma_pred_mode;  /* ue(v) */
570 
571     int32 mvL0[16];  /* motion vectors, 16 bit packed (x,y) per element  */
572     int32 mvL1[16];
573     int16 ref_idx_L0[4];
574     int16 ref_idx_L1[4];
575     uint16 RefIdx[4]; /* ref index, has value of AVCPictureData->RefIdx */
576     /* stored data */
577     /*bool*/
578     uint    mb_intra; /* intra flag */
579     /*bool*/
580     uint    mb_bottom_field;
581 
582     AVCMBMode mbMode;   /* type of MB prediction */
583     AVCSubMBMode subMbMode[4]; /* for each 8x8 partition */
584 
585     uint    CBP; /* CodeBlockPattern */
586     AVCIntra16x16PredMode i16Mode; /* Intra16x16PredMode */
587     AVCIntra4x4PredMode i4Mode[16]; /* Intra4x4PredMode, in raster scan order */
588     int NumMbPart; /* number of partition */
589     AVCPredMode MBPartPredMode[4][4]; /* prediction mode [MBPartIndx][subMBPartIndx] */
590     int MbPartWidth;
591     int MbPartHeight;
592     int NumSubMbPart[4];  /* for each 8x8 partition */
593     int SubMbPartWidth[4];  /* for each 8x8 partition */
594     int SubMbPartHeight[4]; /* for each 8x8 partition */
595 
596     uint8 nz_coeff[NUM_BLKS_IN_MB];  /* [blk_y][blk_x], Chroma is [4..5][0...3], see predict_nnz() function */
597 
598     int QPy; /* Luma QP */
599     int QPc; /* Chroma QP */
600     int QSc; /* Chroma QP S-picture */
601 
602     int slice_id;           // MC slice
603 } AVCMacroblock;
604 
605 
606 /**
607 This structure contains common internal variables between the encoder and decoder
608 such that some functions can be shared among them.
609 @publishedAll
610 */
611 typedef struct tagCommonObj
612 {
613     /* put these 2 up here to make sure they are word-aligned */
614     int16   block[NUM_PIXELS_IN_MB]; /* for transformed residue coefficient */
615     uint8   *pred_block;    /* pointer to prediction block, could point to a frame */
616 #ifdef USE_PRED_BLOCK
617     uint8   pred[688];  /* for prediction */
618     /* Luma [0-399], Cb [400-543], Cr[544-687] */
619 #endif
620     int     pred_pitch; /* either equal to 20 or to frame pitch */
621 
622     /* temporary buffers for intra prediction */
623     /* these variables should remain inside fast RAM */
624 #ifdef MB_BASED_DEBLOCK
625     uint8   *intra_pred_top; /* a row of pixel for intra prediction */
626     uint8   intra_pred_left[17]; /* a column of pixel for intra prediction */
627     uint8   *intra_pred_top_cb;
628     uint8   intra_pred_left_cb[9];
629     uint8   *intra_pred_top_cr;
630     uint8   intra_pred_left_cr[9];
631 #endif
632     /* pointer to the prediction area for intra prediction */
633     uint8   *pintra_pred_top;   /* pointer to the top intra prediction value */
634     uint8   *pintra_pred_left;  /* pointer to the left intra prediction value */
635     uint8   intra_pred_topleft; /* the [-1,-1] neighboring pixel */
636     uint8   *pintra_pred_top_cb;
637     uint8   *pintra_pred_left_cb;
638     uint8   intra_pred_topleft_cb;
639     uint8   *pintra_pred_top_cr;
640     uint8   *pintra_pred_left_cr;
641     uint8   intra_pred_topleft_cr;
642 
643     int QPy;
644     int QPc;
645     int QPy_div_6;
646     int QPy_mod_6;
647     int QPc_div_6;
648     int QPc_mod_6;
649     /**** nal_unit ******/
650     /* previously in AVCNALUnit format */
651     uint    NumBytesInRBSP;
652     int     forbidden_bit;
653     int     nal_ref_idc;
654     AVCNalUnitType  nal_unit_type;
655     AVCNalUnitType  prev_nal_unit_type;
656     /*bool*/
657     uint    slice_data_partitioning; /* flag when nal_unit_type is between 2 and 4 */
658     /**** ******** ******/
659     AVCSliceType slice_type;
660     AVCDecPicBuffer     *decPicBuf; /* decoded picture buffer */
661 
662     AVCSeqParamSet *currSeqParams; /*  the currently used one */
663 
664     AVCPicParamSet  *currPicParams; /* the currently used one */
665     uint        seq_parameter_set_id;
666     /* slice header */
667     AVCSliceHeader *sliceHdr;   /* slice header param syntax variables */
668 
669     AVCPictureData  *currPic; /* pointer to current picture */
670     AVCFrameStore   *currFS;  /* pointer to current frame store */
671     AVCPictureType  currPicType; /* frame, top-field or bot-field */
672     /*bool*/
673     uint    newPic; /* flag for new picture */
674     uint            newSlice; /* flag for new slice */
675     AVCPictureData  *prevRefPic; /* pointer to previous picture */
676 
677     AVCMacroblock   *mblock; /* array of macroblocks covering entire picture */
678     AVCMacroblock   *currMB; /* pointer to current macroblock */
679     uint                    mbNum; /* number of current MB */
680     int                 mb_x;  /* x-coordinate of the current mbNum */
681     int                 mb_y;  /* y-coordinate of the current mbNum */
682 
683     /* For internal operation, scratch memory for MV, prediction, transform, etc.*/
684     uint32 cbp4x4; /* each bit represent nonzero 4x4 block in reverse raster scan order */
685     /* starting from luma, Cb and Cr, lsb toward msb */
686     int mvd_l0[4][4][2]; /* [mbPartIdx][subMbPartIdx][compIdx], se(v) */
687     int mvd_l1[4][4][2]; /* [mbPartIdx][subMbPartIdx][compIdx], se(v) */
688 
689     int mbAddrA, mbAddrB, mbAddrC, mbAddrD; /* address of neighboring MBs */
690     /*bool*/
691     uint    mbAvailA, mbAvailB, mbAvailC, mbAvailD; /* availability */
692     /*bool*/
693     uint    intraAvailA, intraAvailB, intraAvailC, intraAvailD; /* for intra mode */
694     /***********************************************/
695     /* The following variables are defined in the draft. */
696     /* They may need to be stored in PictureData structure and used for reference. */
697     /* In that case, just move or copy it to AVCDecPictureData structure. */
698 
699     int     padded_size;    /* size of extra padding to a frame */
700 
701     uint    MaxFrameNum;    /*2^(log2_max_frame_num_minus4+4), range 0.. 2^16-1 */
702     uint    MaxPicOrderCntLsb; /*2^(log2_max_pic_order_cnt_lsb_minus4+4), 0..2^16-1 */
703     uint    PicWidthInMbs;  /*pic_width_in_mbs_minus1+1 */
704     uint    PicWidthInSamplesL; /* PicWidthInMbs*16 */
705     uint    PicWidthInSamplesC; /* PicWIdthInMbs*8 */
706     uint    PicHeightInMapUnits; /* pic_height_in_map_units_minus1+1 */
707     uint    PicSizeInMapUnits;  /* PicWidthInMbs*PicHeightInMapUnits */
708     uint    FrameHeightInMbs;   /*(2-frame_mbs_only_flag)*PicHeightInMapUnits */
709 
710     uint    SliceGroupChangeRate; /* slice_group_change_rate_minus1 + 1 */
711 
712     /* access unit */
713     uint    primary_pic_type;   /* u(3), Table 7-2, kinda informative only */
714 
715     /* slice data partition */
716     uint    slice_id;           /* ue(v) */
717 
718     uint    UnusedShortTermFrameNum;
719     uint    PrevRefFrameNum;
720     uint    MbaffFrameFlag; /* (mb_adaptive_frame_field_flag && !field_pic_flag) */
721     uint    PicHeightInMbs; /* FrameHeightInMbs/(1+field_pic_flag) */
722     int     PicHeightInSamplesL; /* PicHeightInMbs*16 */
723     int     PicHeightInSamplesC; /* PicHeightInMbs*8 */
724     uint    PicSizeInMbs;   /* PicWidthInMbs*PicHeightInMbs */
725     uint    level_idc;
726     int     numMBs;
727     uint    MaxPicNum;
728     uint    CurrPicNum;
729     int     QSy;    /* 26+pic_init_qp_minus26+slice_qs_delta */
730     int     FilterOffsetA;
731     int     FilterOffsetB;
732     uint    MapUnitsInSliceGroup0;  /* Min(slie_group_change_cycle*SliceGroupChangeRate,PicSizeInMapUnits) */
733     /* dec_ref_pic_marking */
734     int     MaxLongTermFrameIdx;
735     int     LongTermFrameIdx;
736 
737     /* POC related variables */
738     /*bool*/
739     uint    mem_mgr_ctrl_eq_5;  /* if memory_management_control_operation equal to 5 flag */
740     int     PicOrderCnt;
741     int     BottomFieldOrderCnt, TopFieldOrderCnt;
742     /* POC mode 0 */
743     int     prevPicOrderCntMsb;
744     uint    prevPicOrderCntLsb;
745     int     PicOrderCntMsb;
746     /* POC mode 1 */
747     int     prevFrameNumOffset, FrameNumOffset;
748     uint    prevFrameNum;
749     int     absFrameNum;
750     int     picOrderCntCycleCnt, frameNumInPicOrderCntCycle;
751     int     expectedDeltaPerPicOrderCntCycle;
752     int     expectedPicOrderCnt;
753 
754     /* FMO */
755     int *MbToSliceGroupMap;  /* to be re-calculate at the beginning */
756 
757     /* ref pic list */
758     AVCPictureData  *RefPicList0[MAX_REF_PIC_LIST]; /* list 0 */
759     AVCPictureData  *RefPicList1[MAX_REF_PIC_LIST]; /* list 1 */
760     AVCFrameStore   *refFrameList0ShortTerm[32];
761     AVCFrameStore   *refFrameList1ShortTerm[32];
762     AVCFrameStore   *refFrameListLongTerm[32];
763     int     refList0Size;
764     int     refList1Size;
765 
766     /* slice data semantics*/
767     int mb_skip_run;    /* ue(v) */
768     /*uint  mb_skip_flag;*/ /* ae(v) */
769     /* uint end_of_slice_flag;*//* ae(v) */
770     /***********************************************/
771 
772     /* function pointers */
773     int (*is_short_ref)(AVCPictureData *s);
774     int (*is_long_ref)(AVCPictureData *s);
775 
776 } AVCCommonObj;
777 
778 /**
779 Commonly used constant arrays.
780 @publishedAll
781 */
782 /**
783 Zigzag scan from 1-D to 2-D. */
784 const static uint8 ZZ_SCAN[16] = {0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15};
785 /* Zigzag scan from 1-D to 2-D output to block[24][16]. */
786 const static uint8 ZZ_SCAN_BLOCK[16] = {0, 1, 16, 32, 17, 2, 3, 18, 33, 48, 49, 34, 19, 35, 50, 51};
787 
788 /**
789 From zigzag to raster for luma DC value */
790 const static uint8 ZIGZAG2RASTERDC[16] = {0, 4, 64, 128, 68, 8, 12, 72, 132, 192, 196, 136, 76, 140, 200, 204};
791 
792 
793 /**
794 Mapping from coding scan block indx to raster scan block index */
795 const static int blkIdx2blkX[16] = {0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 2, 3, 2, 3};
796 const static int blkIdx2blkY[16] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3};
797 /** from [blk8indx][blk4indx] to raster scan index */
798 const static int blkIdx2blkXY[4][4] = {{0, 1, 4, 5}, {2, 3, 6, 7}, {8, 9, 12, 13}, {10, 11, 14, 15}};
799 
800 /*
801 Availability of the neighboring top-right block relative to the current block. */
802 const static int BlkTopRight[16] = {2, 2, 2, 3, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0};
803 
804 /**
805 Table 8-13 Specification of QPc as a function of qPI. */
806 const static uint8 mapQPi2QPc[52] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
807                                      21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 34, 35, 35, 36, 36,
808                                      37, 37, 37, 38, 38, 38, 39, 39, 39, 39
809                                     };
810 
811 /**
812 See 8.5.5 equation (8-252 and 8-253) the definition of v matrix. */
813 /* in zigzag scan */
814 const static int dequant_coefres[6][16] =
815 {
816     {10, 13, 13, 10, 16, 10, 13, 13, 13, 13, 16, 10, 16, 13, 13, 16},
817     {11, 14, 14, 11, 18, 11, 14, 14, 14, 14, 18, 11, 18, 14, 14, 18},
818     {13, 16, 16, 13, 20, 13, 16, 16, 16, 16, 20, 13, 20, 16, 16, 20},
819     {14, 18, 18, 14, 23, 14, 18, 18, 18, 18, 23, 14, 23, 18, 18, 23},
820     {16, 20, 20, 16, 25, 16, 20, 20, 20, 20, 25, 16, 25, 20, 20, 25},
821     {18, 23, 23, 18, 29, 18, 23, 23, 23, 23, 29, 18, 29, 23, 23, 29}
822 };
823 
824 /**
825 From jm7.6 block.c. (in zigzag scan) */
826 const static int quant_coef[6][16] =
827 {
828     {13107, 8066,   8066,   13107,  5243,   13107,  8066,   8066,   8066,   8066,   5243,   13107,  5243,   8066,   8066,   5243},
829     {11916, 7490,   7490,   11916,  4660,   11916,  7490,   7490,   7490,   7490,   4660,   11916,  4660,   7490,   7490,   4660},
830     {10082, 6554,   6554,   10082,  4194,   10082,  6554,   6554,   6554,   6554,   4194,   10082,  4194,   6554,   6554,   4194},
831     {9362,  5825,   5825,   9362,   3647,   9362,   5825,   5825,   5825,   5825,   3647,   9362,   3647,   5825,   5825,   3647},
832     {8192,  5243,   5243,   8192,   3355,   8192,   5243,   5243,   5243,   5243,   3355,   8192,   3355,   5243,   5243,   3355},
833     {7282,  4559,   4559,   7282,   2893,   7282,   4559,   4559,   4559,   4559,   2893,   7282,   2893,   4559,   4559,   2893}
834 };
835 
836 /**
837 Convert scan from raster scan order to block decoding order and
838 from block decoding order to raster scan order. Same table!!!
839 */
840 const static uint8 ras2dec[16] = {0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15};
841 
842 /* mapping from level_idc to index map */
843 const static uint8 mapLev2Idx[61] = {255, 255, 255, 255, 255, 255, 255, 255, 255, 1,
844                                      0, 1, 2, 3, 255, 255, 255, 255, 255, 255,
845                                      4, 5, 6, 255, 255, 255, 255, 255, 255, 255,
846                                      7, 8, 9, 255, 255, 255, 255, 255, 255, 255,
847                                      10, 11, 12, 255, 255, 255, 255, 255, 255, 255,
848                                      13, 14, 255, 255, 255, 255, 255, 255, 255, 255
849                                     };
850 /* map back from index to Level IDC */
851 const static uint8 mapIdx2Lev[MAX_LEVEL_IDX] = {10, 11, 12, 13, 20, 21, 22, 30, 31, 32, 40, 41, 42, 50, 51};
852 
853 /**
854 from the index map to the MaxDPB value times 2 */
855 const static int32 MaxDPBX2[MAX_LEVEL_IDX] = {297, 675, 1782, 1782, 1782, 3564, 6075, 6075,
856         13500, 15360, 24576, 24576, 24576, 82620, 138240
857                                              };
858 
859 /* map index to the max frame size */
860 const static int MaxFS[MAX_LEVEL_IDX] = {99, 396, 396, 396, 396, 792, 1620, 1620, 3600, 5120,
861                                         8192, 8192, 8192, 22080, 36864
862                                         };
863 
864 /* map index to max MB processing rate */
865 const static int32 MaxMBPS[MAX_LEVEL_IDX] = {1485, 3000, 6000, 11880, 11880, 19800, 20250, 40500,
866         108000, 216000, 245760, 245760, 491520, 589824, 983040
867                                             };
868 
869 /* map index to max video bit rate */
870 const static uint32 MaxBR[MAX_LEVEL_IDX] = {64, 192, 384, 768, 2000, 4000, 4000, 10000, 14000, 20000,
871         20000, 50000, 50000, 135000, 240000
872                                            };
873 
874 /* map index to max CPB size */
875 const static uint32 MaxCPB[MAX_LEVEL_IDX] = {175, 500, 1000, 2000, 2000, 4000, 4000, 10000, 14000,
876         20000, 25000, 62500, 62500, 135000, 240000
877                                             };
878 
879 /* map index to max vertical MV range */
880 const static int MaxVmvR[MAX_LEVEL_IDX] = {64, 128, 128, 128, 128, 256, 256, 256, 512, 512, 512, 512, 512, 512, 512};
881 
882 #endif /*  _AVCINT_COMMON_H_ */
883