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#ifndef _MP4LIB_INT_H_
19#define _MP4LIB_INT_H_
20
21#include "mp4def.h"
22#include "mp4dec_api.h" // extra structure
23
24#undef ENABLE_LOG
25#define BITRATE_AVERAGE_WINDOW 4
26#define FRAMERATE_SCALE ((BITRATE_AVERAGE_WINDOW-1)*10000L)
27#define FAST_IDCT            /* , for fast Variable complexity IDCT */
28//#define PV_DEC_EXTERNAL_IDCT  /*  for separate IDCT (i.e. no direct access to output frame) */
29#define PV_ANNEX_IJKT_SUPPORT
30#define mid_gray 1024
31
32typedef struct tagBitstream
33{
34    /* function that reteive data from outside the library.   04/11/2000 */
35    /*    In frame-based decoding mode, this shall be NULL.   08/29/2000 */
36    uint32 curr_word;
37    uint32 next_word;
38    uint8 *bitstreamBuffer; /* pointer to buffer memory */
39    int32  read_point;          /* starting point in the buffer to be read to cache */
40    int  incnt;             /* bit left in cached */
41    int  incnt_next;
42    uint32 bitcnt;          /* total bit read so-far (from inbfr)*/
43    int32  data_end_pos;        /*should be added ,  06/07/2000 */
44    int searched_frame_boundary;
45} BitstreamDecVideo, *LPBitstreamDecVideo;
46
47/* complexity estimation parameters */
48typedef struct tagComplexity_Est
49{
50    uint8   text_1;             /* texture_complexity_estimation_set_1  */
51    uint8   text_2;             /* texture_complexity_estimation_set_2  */
52    uint8   mc;                 /* motion_compensation_complexity       */
53} Complexity_Est;
54
55
56typedef struct tagVop
57{
58    PIXEL   *yChan;             /* The Y component */
59    PIXEL   *uChan;             /* The U component */
60    PIXEL   *vChan;             /* The V component */
61
62    uint32  timeStamp;          /* Vop TimeStamp in msec */
63
64    /* Actual syntax elements for VOP (standard) */
65    int     predictionType;     /* VOP prediction type */
66    uint    timeInc;            /* VOP time increment (relative to last mtb) */
67    int     vopCoded;
68    int     roundingType;
69    int     intraDCVlcThr;
70    int16       quantizer;          /* VOP quantizer */
71    int     fcodeForward;       /* VOP dynamic range of motion vectors */
72    int     fcodeBackward;      /* VOP dynamic range of motion vectors */
73    int     refSelectCode;      /* enhancement layer reference select code */
74
75    /* H.263 parameters */
76    int     gobNumber;
77    int     gobFrameID;
78    int     temporalRef;        /* temporal reference, roll over at 256 */
79    int     ETR;
80} Vop;
81
82typedef struct tagVol
83{
84    int     volID;                  /* VOL identifier (for tracking) */
85    uint    timeIncrementResolution;/* VOL time increment */
86    int     nbitsTimeIncRes;        /* number of bits for time increment  */
87    uint        timeInc_offset;         /* timeInc offset for multiple VOP in a packet  */
88    uint32  moduloTimeBase;         /* internal decoder clock */
89    int     fixedVopRate;
90    BitstreamDecVideo   *bitstream; /* library bitstream buffer (input buffer) */
91
92    int     complexity_estDisable;  /* VOL disable complexity estimation */
93    int     complexity_estMethod;   /* VOL complexity estimation method */
94    Complexity_Est complexity;      /* complexity estimation flags      */
95
96    /* Error Resilience Flags */
97    int     errorResDisable;        /* VOL disable error resilence mode */
98    /*            (Use Resynch markers) */
99    int     useReverseVLC;          /* VOL reversible VLCs */
100    int     dataPartitioning;       /* VOL data partitioning */
101
102    /* Bit depth  */
103    uint    bitsPerPixel;
104//  int     mid_gray;               /* 2^(bits_per_pixel+2) */
105
106    /* Quantization related parameters */
107    int     quantPrecision;         /* Quantizer precision */
108    uint    quantType;              /* MPEG-4 or H.263 Quantization Type */
109    /* Added loaded quant mat,  05/22/2000 */
110    int     loadIntraQuantMat;      /* Load intra quantization matrix */
111    int     loadNonIntraQuantMat;   /* Load nonintra quantization matrix */
112    int     iqmat[64];              /* Intra quant.matrix */
113    int     niqmat[64];             /* Non-intra quant.matrix */
114
115    /* Parameters used for scalability */
116    int     scalability;            /* VOL scalability (flag) */
117    int     scalType;               /* temporal = 0, spatial = 1, both = 2 */
118
119    int     refVolID;               /* VOL id of reference VOL */
120    int     refSampDir;             /* VOL resol. of ref. VOL */
121    int     horSamp_n;              /* VOL hor. resampling of ref. VOL given by */
122    int     horSamp_m;              /*     sampfac = hor_samp_n/hor_samp_m      */
123    int     verSamp_n;              /* VOL ver. resampling of ref. VOL given by */
124    int     verSamp_m;              /*     sampfac = ver_samp_n/ver_samp_m      */
125    int     enhancementType;        /* VOL type of enhancement layer */
126    /* profile and level */
127    int32   profile_level_id;       /* 8-bit profile and level */ //  6/17/04
128
129} Vol;
130
131
132typedef int16 typeMBStore[6][NCOEFF_BLOCK];
133
134typedef struct tagMacroBlock
135{
136    typeMBStore         block;              /* blocks */         /*  ACDC */
137    uint8   pred_block[384];        /* prediction block,  Aug 3,2005 */
138    uint8   bitmapcol[6][8];
139    uint8   bitmaprow[6];
140    int     no_coeff[6];
141    int     DCScalarLum;                        /* Luminance DC Scalar */
142    int     DCScalarChr;                        /* Chrominance DC Scalar */
143#ifdef PV_ANNEX_IJKT_SUPPORT
144    int direction;
145#endif
146} MacroBlock;
147
148typedef struct tagHeaderInfoDecVideo
149{
150    uint8       *Mode;              /* Modes INTRA/INTER/etc. */
151    uint8       *CBP;               /* MCBPC/CBPY stuff */
152} HeaderInfoDecVideo;
153
154
155/************************************************************/
156/*                  VLC structures                          */
157/************************************************************/
158typedef struct tagTcoef
159{
160    uint last;
161    uint run;
162    int level;
163    uint sign;
164} Tcoef, *LPTcoef;
165
166
167
168typedef struct tagVLCtab
169{
170    int32 val;
171    int32 len;
172} VLCtab, *LPVLCtab;
173
174typedef struct tagVLCshorttab
175{
176    int16 val;
177    int16 len;
178} VLCshorttab, *LPVLCshorttab ; /* for space saving, Antoine Nguyen*/
179
180typedef struct tagVLCtab2
181{
182    uint8 run;
183    uint8 level;
184    uint8 last;
185    uint8 len;
186} VLCtab2, *LPVLCtab2;  /* 10/24/2000 */
187
188/* This type is designed for fast access of DC/AC */
189/*    prediction data.  If the compiler is smart  */
190/*    enough, it will use shifting for indexing.  */
191/*     04/14/2000.                              */
192
193typedef int16 typeDCStore[6];   /*  ACDC */
194typedef int16 typeDCACStore[4][8];
195
196
197
198/* Global structure that can be passed around */
199typedef struct tagVideoDecData
200{
201    BitstreamDecVideo   *bitstream; /* library bitstream buffer (input buffer) */
202    /* Data For Layers (Scalability) */
203    Vol             **vol;                  /* Data stored for each VOL */
204
205    /* Data used for reconstructing frames */
206    Vop             *currVop;               /* Current VOP (frame)  */
207    Vop             *prevVop;               /* Previous VOP (frame) */
208    /* Data used to facilitate multiple layer decoding.   05/04/2000 */
209    Vop             *prevEnhcVop;           /* New change to rid of memcpy().  04/24/2001 */
210    Vop             **vopHeader;            /* one for each layer.   08/29/2000 */
211
212    /* I/O structures */
213    MacroBlock      *mblock;                    /* Macroblock data structure */
214    uint8           *acPredFlag;                /*  */
215
216    /* scratch memory used in data partitioned mode */
217    typeDCStore     *predDC;        /*  The DC coeffs for each MB */
218    typeDCACStore   *predDCAC_row;
219    typeDCACStore   *predDCAC_col;
220
221    int             usePrevQP;              /* running QP decision switch */
222    uint8           *sliceNo;               /* Slice indicator for each MB  */
223    /*     changed this to a 1D   */
224    /*    array for optimization    */
225    MOT             *motX;                  /* Motion vector in X direction */
226    MOT             *motY;                  /* Motion vector in Y direction */
227    HeaderInfoDecVideo  headerInfo;         /* MB Header information */
228    int16           *QPMB;                  /* Quantizer value for each MB */
229
230    uint8           *pstprcTypCur;          /* Postprocessing type for current frame */
231    uint8           *pstprcTypPrv;          /* Postprocessing type for previous frame */
232    /* scratch memory used in all modes */
233    int             mbnum;                      /*  Macroblock number */
234    uint            mbnum_row;
235    int             mbnum_col;
236    /* I added these variables since they are used a lot.   04/13/2000 */
237    int     nMBPerRow, nMBPerCol;   /* number of MBs in each row & column    */
238    int     nTotalMB;
239    /* for short video header */
240    int     nMBinGOB;               /* number of MBs in GOB,  05/22/00 */
241    int     nGOBinVop;              /* number of GOB in Vop   05/22/00 */
242    /* VOL Dimensions */
243    int     width;                  /* Width */
244    int     height;                 /* Height */
245    int     displayWidth;               /* Handle image whose size is not a multiple of 16. */
246    int     displayHeight;              /*   This is the actual size.   08/09/2000        */
247    int32   size;
248    /* Miscellaneous data points to be passed */
249    int             frame_idx;              /* Current frame ID */
250    int             frameRate;              /* Output frame Rate (over 10 seconds) */
251    int32           duration;
252    uint32          currTimestamp;
253    int             currLayer;              /* Current frame layer  */
254    int     shortVideoHeader;       /* shortVideoHeader mode */
255    int     intra_acdcPredDisable;  /* VOL disable INTRA DC prediction */
256    int             numberOfLayers;         /* Number of Layers */
257    /* Frame to be used for concealment     07/07/2001 */
258    uint8           *concealFrame;
259    int             vop_coding_type;
260    /* framerate and bitrate statistics counters.   08/23/2000 */
261    int32           nBitsPerVop[BITRATE_AVERAGE_WINDOW];
262    uint32          prevTimestamp[BITRATE_AVERAGE_WINDOW];
263    int     nBitsForMBID;           /* how many bits required for MB number? */
264    /* total data memory used by the docder library.   08/23/2000 */
265    int32           memoryUsage;
266
267    /* flag to turn on/off error concealment or soft decoding */
268    int errorConcealment;
269
270    /* Application controls */
271    VideoDecControls    *videoDecControls;
272    int                 postFilterType;     /* Postfilter mode  04/25/00 */
273
274
275
276    PV_STATUS(*vlcDecCoeffIntra)(BitstreamDecVideo *stream, Tcoef *pTcoef/*, int intra_luma*/);
277    PV_STATUS(*vlcDecCoeffInter)(BitstreamDecVideo *stream, Tcoef *pTcoef);
278    int                 initialized;
279
280    /* Annex IJKT */
281    int     deblocking;
282    int     slice_structure;
283    int     modified_quant;
284    int     advanced_INTRA;
285    int16 QP_CHR;  /* ANNEX_T */
286} VideoDecData;
287
288/* for fast VLC+Dequant  10/12/2000*/
289typedef int (*VlcDequantBlockFuncP)(void *video, int comp, int switched,
290                                    uint8 *bitmaprow, uint8 *bitmapcol);
291
292//////////////////////////////////////////////////////////////
293//                  Decoder structures                      //
294//////////////////////////////////////////////////////////////
295#endif /* _MP4LIB_INT_H_ */
296
297