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/**
19This file contains common code shared between AVC decoder and AVC encoder for
20internal 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/**
40Mathematic functions defined in subclause 5.7.
41Can 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/**
85Architectural related macros.
86@publishedAll
87*/
88#ifdef USE_PRED_BLOCK
89#define MB_BASED_DEBLOCK
90#endif
91
92/**
93Picture type, PV created.
94@publishedAll
95*/
96typedef enum
97{
98    AVC_FRAME = 3
99} AVCPictureType;
100
101/**
102This slice type follows Table 7-3. The bottom 5 items may not needed.
103@publishedAll
104*/
105typedef 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/**
120Types of the macroblock and partition. PV Created.
121@publishedAll
122*/
123typedef 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/**
142Enumeration for sub-macroblock mode, interpreted from sub_mb_type.
143@publishedAll
144*/
145typedef 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/**
156Mode of prediction of partition or sub-partition. PV Created.
157Do not change the order!!! Used in table look-up mode prediction in
158vlc.c.
159@publishedAll
160*/
161typedef enum
162{
163    AVC_Pred_L0 = 0,
164    AVC_Pred_L1,
165    AVC_BiPred,
166    AVC_Direct
167} AVCPredMode;
168
169
170/**
171Mode of intra 4x4 prediction. Table 8-2
172@publishedAll
173*/
174typedef 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/**
188Mode of intra 16x16 prediction. Table 8-3
189@publishedAll
190*/
191typedef enum
192{
193    AVC_I16_Vertical = 0,
194    AVC_I16_Horizontal,
195    AVC_I16_DC,
196    AVC_I16_Plane
197} AVCIntra16x16PredMode;
198
199
200/**
201Mode of intra chroma prediction. Table 8-4
202@publishedAll
203*/
204typedef enum
205{
206    AVC_IC_DC = 0,
207    AVC_IC_Horizontal,
208    AVC_IC_Vertical,
209    AVC_IC_Plane
210} AVCIntraChromaPredMode;
211
212/**
213Type of residual going to residual_block_cavlc function, PV created.
214@publishedAll
215*/
216typedef enum
217{
218    AVC_Luma,
219    AVC_Intra16DC,
220    AVC_Intra16AC,
221    AVC_ChromaDC,
222    AVC_ChromaAC
223} AVCResidualType;
224
225
226/**
227This structure contains VUI parameters as specified in Annex E.
228Some variables may be removed from the structure if they are found to be useless to store.
229@publishedAll
230*/
231typedef 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/**
246This structure contains VUI parameters as specified in Annex E.
247Some variables may be removed from the structure if they are found to be useless to store.
248@publishedAll
249*/
250typedef 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/**
291This structure contains information in a sequence parameter set NAL.
292Some variables may be removed from the structure if they are found to be useless to store.
293@publishedAll
294*/
295typedef 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/**
340This structure contains information in a picture parameter set NAL.
341Some variables may be removed from the structure if they are found to be useless to store.
342@publishedAll
343*/
344typedef 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/**
381This structure contains slice header information.
382Some variables may be removed from the structure if they are found to be useless to store.
383@publishedAll
384*/
385typedef 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/**
456This struct contains information about the neighboring pixel.
457@publishedAll
458*/
459typedef 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
469typedef 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/**
478This structure contains picture data and related information necessary to be used as
479reference frame.
480@publishedAll
481*/
482typedef 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/**
511This structure contains information for frame storage.
512@publishedAll
513*/
514typedef 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/**
536This structure maintains the actual memory for the decoded picture buffer (DPB) which is
537allocated at the beginning according to profile/level.
538Once decoded_picture_buffer is allocated, Sl,Scb,Scr in
539AVCPictureData structure just point to the address in decoded_picture_buffer.
540used_size maintains the used space.
541NOTE:: In order to maintain contiguous memory space, memory equal to a single frame is
542assigned 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*/
552typedef 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/**
564This structure contains macroblock related variables.
565@publishedAll
566*/
567typedef 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/**
607This structure contains common internal variables between the encoder and decoder
608such that some functions can be shared among them.
609@publishedAll
610*/
611typedef 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/**
779Commonly used constant arrays.
780@publishedAll
781*/
782/**
783Zigzag scan from 1-D to 2-D. */
784const 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]. */
786const static uint8 ZZ_SCAN_BLOCK[16] = {0, 1, 16, 32, 17, 2, 3, 18, 33, 48, 49, 34, 19, 35, 50, 51};
787
788/**
789From zigzag to raster for luma DC value */
790const static uint8 ZIGZAG2RASTERDC[16] = {0, 4, 64, 128, 68, 8, 12, 72, 132, 192, 196, 136, 76, 140, 200, 204};
791
792
793/**
794Mapping from coding scan block indx to raster scan block index */
795const static int blkIdx2blkX[16] = {0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 2, 3, 2, 3};
796const 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 */
798const static int blkIdx2blkXY[4][4] = {{0, 1, 4, 5}, {2, 3, 6, 7}, {8, 9, 12, 13}, {10, 11, 14, 15}};
799
800/*
801Availability of the neighboring top-right block relative to the current block. */
802const static int BlkTopRight[16] = {2, 2, 2, 3, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0};
803
804/**
805Table 8-13 Specification of QPc as a function of qPI. */
806const 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/**
812See 8.5.5 equation (8-252 and 8-253) the definition of v matrix. */
813/* in zigzag scan */
814const 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/**
825From jm7.6 block.c. (in zigzag scan) */
826const 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/**
837Convert scan from raster scan order to block decoding order and
838from block decoding order to raster scan order. Same table!!!
839*/
840const 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 */
843const 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 */
851const static uint8 mapIdx2Lev[MAX_LEVEL_IDX] = {10, 11, 12, 13, 20, 21, 22, 30, 31, 32, 40, 41, 42, 50, 51};
852
853/**
854from the index map to the MaxDPB value times 2 */
855const 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 */
860const 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 */
865const 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 */
870const 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 */
875const 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 */
880const 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