blob: d6754a779525b9a3d340abbcb1ce4cde4e721b37 [file] [log] [blame]
/* ------------------------------------------------------------------
* 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_ */