summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/m4v_h263/dec/src/mp4lib_int.h
blob: d6754a779525b9a3d340abbcb1ce4cde4e721b37 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
/* ------------------------------------------------------------------
 * Copyright (C) 1998-2009 PacketVideo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 * -------------------------------------------------------------------
 */
#ifndef _MP4LIB_INT_H_
#define _MP4LIB_INT_H_

#include "mp4def.h"
#include "mp4dec_api.h" // extra structure

#undef ENABLE_LOG
#define BITRATE_AVERAGE_WINDOW 4
#define FRAMERATE_SCALE ((BITRATE_AVERAGE_WINDOW-1)*10000L)
#define FAST_IDCT            /* , for fast Variable complexity IDCT */
//#define PV_DEC_EXTERNAL_IDCT  /*  for separate IDCT (i.e. no direct access to output frame) */
#define PV_ANNEX_IJKT_SUPPORT
#define mid_gray 1024

typedef struct tagBitstream
{
    /* function that reteive data from outside the library.   04/11/2000 */
    /*    In frame-based decoding mode, this shall be NULL.   08/29/2000 */
    uint32 curr_word;
    uint32 next_word;
    uint8 *bitstreamBuffer; /* pointer to buffer memory */
    int32  read_point;          /* starting point in the buffer to be read to cache */
    int  incnt;             /* bit left in cached */
    int  incnt_next;
    uint32 bitcnt;          /* total bit read so-far (from inbfr)*/
    int32  data_end_pos;        /*should be added ,  06/07/2000 */
    int searched_frame_boundary;
} BitstreamDecVideo, *LPBitstreamDecVideo;

/* complexity estimation parameters */
typedef struct tagComplexity_Est
{
    uint8   text_1;             /* texture_complexity_estimation_set_1  */
    uint8   text_2;             /* texture_complexity_estimation_set_2  */
    uint8   mc;                 /* motion_compensation_complexity       */
} Complexity_Est;


typedef struct tagVop
{
    PIXEL   *yChan;             /* The Y component */
    PIXEL   *uChan;             /* The U component */
    PIXEL   *vChan;             /* The V component */

    uint32  timeStamp;          /* Vop TimeStamp in msec */

    /* Actual syntax elements for VOP (standard) */
    int     predictionType;     /* VOP prediction type */
    uint    timeInc;            /* VOP time increment (relative to last mtb) */
    int     vopCoded;
    int     roundingType;
    int     intraDCVlcThr;
    int16       quantizer;          /* VOP quantizer */
    int     fcodeForward;       /* VOP dynamic range of motion vectors */
    int     fcodeBackward;      /* VOP dynamic range of motion vectors */
    int     refSelectCode;      /* enhancement layer reference select code */

    /* H.263 parameters */
    int     gobNumber;
    int     gobFrameID;
    int     temporalRef;        /* temporal reference, roll over at 256 */
    int     ETR;
} Vop;

typedef struct tagVol
{
    int     volID;                  /* VOL identifier (for tracking) */
    uint    timeIncrementResolution;/* VOL time increment */
    int     nbitsTimeIncRes;        /* number of bits for time increment  */
    uint        timeInc_offset;         /* timeInc offset for multiple VOP in a packet  */
    uint32  moduloTimeBase;         /* internal decoder clock */
    int     fixedVopRate;
    BitstreamDecVideo   *bitstream; /* library bitstream buffer (input buffer) */

    int     complexity_estDisable;  /* VOL disable complexity estimation */
    int     complexity_estMethod;   /* VOL complexity estimation method */
    Complexity_Est complexity;      /* complexity estimation flags      */

    /* Error Resilience Flags */
    int     errorResDisable;        /* VOL disable error resilence mode */
    /*            (Use Resynch markers) */
    int     useReverseVLC;          /* VOL reversible VLCs */
    int     dataPartitioning;       /* VOL data partitioning */

    /* Bit depth  */
    uint    bitsPerPixel;
//  int     mid_gray;               /* 2^(bits_per_pixel+2) */

    /* Quantization related parameters */
    int     quantPrecision;         /* Quantizer precision */
    uint    quantType;              /* MPEG-4 or H.263 Quantization Type */
    /* Added loaded quant mat,  05/22/2000 */
    int     loadIntraQuantMat;      /* Load intra quantization matrix */
    int     loadNonIntraQuantMat;   /* Load nonintra quantization matrix */
    int     iqmat[64];              /* Intra quant.matrix */
    int     niqmat[64];             /* Non-intra quant.matrix */

    /* Parameters used for scalability */
    int     scalability;            /* VOL scalability (flag) */
    int     scalType;               /* temporal = 0, spatial = 1, both = 2 */

    int     refVolID;               /* VOL id of reference VOL */
    int     refSampDir;             /* VOL resol. of ref. VOL */
    int     horSamp_n;              /* VOL hor. resampling of ref. VOL given by */
    int     horSamp_m;              /*     sampfac = hor_samp_n/hor_samp_m      */
    int     verSamp_n;              /* VOL ver. resampling of ref. VOL given by */
    int     verSamp_m;              /*     sampfac = ver_samp_n/ver_samp_m      */
    int     enhancementType;        /* VOL type of enhancement layer */
    /* profile and level */
    int32   profile_level_id;       /* 8-bit profile and level */ //  6/17/04

} Vol;


typedef int16 typeMBStore[6][NCOEFF_BLOCK];

typedef struct tagMacroBlock
{
    typeMBStore         block;              /* blocks */         /*  ACDC */
    uint8   pred_block[384];        /* prediction block,  Aug 3,2005 */
    uint8   bitmapcol[6][8];
    uint8   bitmaprow[6];
    int     no_coeff[6];
    int     DCScalarLum;                        /* Luminance DC Scalar */
    int     DCScalarChr;                        /* Chrominance DC Scalar */
#ifdef PV_ANNEX_IJKT_SUPPORT
    int direction;
#endif
} MacroBlock;

typedef struct tagHeaderInfoDecVideo
{
    uint8       *Mode;              /* Modes INTRA/INTER/etc. */
    uint8       *CBP;               /* MCBPC/CBPY stuff */
} HeaderInfoDecVideo;


/************************************************************/
/*                  VLC structures                          */
/************************************************************/
typedef struct tagTcoef
{
    uint last;
    uint run;
    int level;
    uint sign;
} Tcoef, *LPTcoef;



typedef struct tagVLCtab
{
    int32 val;
    int32 len;
} VLCtab, *LPVLCtab;

typedef struct tagVLCshorttab
{
    int16 val;
    int16 len;
} VLCshorttab, *LPVLCshorttab ; /* for space saving, Antoine Nguyen*/

typedef struct tagVLCtab2
{
    uint8 run;
    uint8 level;
    uint8 last;
    uint8 len;
} VLCtab2, *LPVLCtab2;  /* 10/24/2000 */

/* This type is designed for fast access of DC/AC */
/*    prediction data.  If the compiler is smart  */
/*    enough, it will use shifting for indexing.  */
/*     04/14/2000.                              */

typedef int16 typeDCStore[6];   /*  ACDC */
typedef int16 typeDCACStore[4][8];



/* Global structure that can be passed around */
typedef struct tagVideoDecData
{
    BitstreamDecVideo   *bitstream; /* library bitstream buffer (input buffer) */
    /* Data For Layers (Scalability) */
    Vol             **vol;                  /* Data stored for each VOL */

    /* Data used for reconstructing frames */
    Vop             *currVop;               /* Current VOP (frame)  */
    Vop             *prevVop;               /* Previous VOP (frame) */
    /* Data used to facilitate multiple layer decoding.   05/04/2000 */
    Vop             *prevEnhcVop;           /* New change to rid of memcpy().  04/24/2001 */
    Vop             **vopHeader;            /* one for each layer.   08/29/2000 */

    /* I/O structures */
    MacroBlock      *mblock;                    /* Macroblock data structure */
    uint8           *acPredFlag;                /*  */

    /* scratch memory used in data partitioned mode */
    typeDCStore     *predDC;        /*  The DC coeffs for each MB */
    typeDCACStore   *predDCAC_row;
    typeDCACStore   *predDCAC_col;

    int             usePrevQP;              /* running QP decision switch */
    uint8           *sliceNo;               /* Slice indicator for each MB  */
    /*     changed this to a 1D   */
    /*    array for optimization    */
    MOT             *motX;                  /* Motion vector in X direction */
    MOT             *motY;                  /* Motion vector in Y direction */
    HeaderInfoDecVideo  headerInfo;         /* MB Header information */
    int16           *QPMB;                  /* Quantizer value for each MB */

    uint8           *pstprcTypCur;          /* Postprocessing type for current frame */
    uint8           *pstprcTypPrv;          /* Postprocessing type for previous frame */
    /* scratch memory used in all modes */
    int             mbnum;                      /*  Macroblock number */
    uint            mbnum_row;
    int             mbnum_col;
    /* I added these variables since they are used a lot.   04/13/2000 */
    int     nMBPerRow, nMBPerCol;   /* number of MBs in each row & column    */
    int     nTotalMB;
    /* for short video header */
    int     nMBinGOB;               /* number of MBs in GOB,  05/22/00 */
    int     nGOBinVop;              /* number of GOB in Vop   05/22/00 */
    /* VOL Dimensions */
    int     width;                  /* Width */
    int     height;                 /* Height */
    int     displayWidth;               /* Handle image whose size is not a multiple of 16. */
    int     displayHeight;              /*   This is the actual size.   08/09/2000        */
    int32   size;
    /* Miscellaneous data points to be passed */
    int             frame_idx;              /* Current frame ID */
    int             frameRate;              /* Output frame Rate (over 10 seconds) */
    int32           duration;
    uint32          currTimestamp;
    int             currLayer;              /* Current frame layer  */
    int     shortVideoHeader;       /* shortVideoHeader mode */
    int     intra_acdcPredDisable;  /* VOL disable INTRA DC prediction */
    int             numberOfLayers;         /* Number of Layers */
    /* Frame to be used for concealment     07/07/2001 */
    uint8           *concealFrame;
    int             vop_coding_type;
    /* framerate and bitrate statistics counters.   08/23/2000 */
    int32           nBitsPerVop[BITRATE_AVERAGE_WINDOW];
    uint32          prevTimestamp[BITRATE_AVERAGE_WINDOW];
    int     nBitsForMBID;           /* how many bits required for MB number? */
    /* total data memory used by the docder library.   08/23/2000 */
    int32           memoryUsage;

    /* flag to turn on/off error concealment or soft decoding */
    int errorConcealment;

    /* Application controls */
    VideoDecControls    *videoDecControls;
    int                 postFilterType;     /* Postfilter mode  04/25/00 */



    PV_STATUS(*vlcDecCoeffIntra)(BitstreamDecVideo *stream, Tcoef *pTcoef/*, int intra_luma*/);
    PV_STATUS(*vlcDecCoeffInter)(BitstreamDecVideo *stream, Tcoef *pTcoef);
    int                 initialized;

    /* Annex IJKT */
    int     deblocking;
    int     slice_structure;
    int     modified_quant;
    int     advanced_INTRA;
    int16 QP_CHR;  /* ANNEX_T */
} VideoDecData;

/* for fast VLC+Dequant  10/12/2000*/
typedef int (*VlcDequantBlockFuncP)(void *video, int comp, int switched,
                                    uint8 *bitmaprow, uint8 *bitmapcol);

//////////////////////////////////////////////////////////////
//                  Decoder structures                      //
//////////////////////////////////////////////////////////////
#endif /* _MP4LIB_INT_H_ */