| /* ------------------------------------------------------------------ |
| * 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_ */ |
| |