libVP62.h
Upload User: dgatc004
Upload Date: 2009-08-04
Package Size: 434k
Code Size: 9k
Development Platform:

Visual C++

  1. #ifndef _LIBVP62_
  2. #define _LIBVP62_
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/timeb.h>
  7. #define VP62_FRAME_INTRA        0
  8. #define VP62_MB_SIZE        16
  9. #define VP62_REF_FRAME_CURRENT  0
  10. #define VP62_REF_FRAME_PREVIOUS 1
  11. #define VP62_REF_FRAME_TAGGED   2
  12. #define VP62_MB_INTER_NOVEC_PF  0 /* Inter MB, no vector, from previous frame */
  13. #define VP62_MB_INTRA 1 /* Intra MB */
  14. #define VP62_MB_INTER_DELTA_PF  2 /* Inter MB, above/left vector + delta, from previous Frame */
  15. #define VP62_MB_INTER_V1_PF     3 /* Inter MB, first vector, from previous Frame */
  16. #define VP62_MB_INTER_V2_PF     4 /* Inter MB, second vector, from previous Frame */
  17. #define VP62_MB_INTER_NOVEC_TF  5 /* Inter MB, no vector, from tagged frame */
  18. #define VP62_MB_INTER_DELTA_TF  6 /* Inter MB, above/left vector + delta, from tagged Frame */
  19. #define VP62_MB_INTER_4V 7 /* Inter MB, 4 vectors, from previous Frame */
  20. #define VP62_MB_INTER_V1_TF     8 /* Inter MB, first vector, from tagged Frame */
  21. #define VP62_MB_INTER_V2_TF     9 /* Inter MB, second vector, from tagged Frame */
  22. #define VP62_CLIP(p, v) (p->clip0to255[(v)+512])
  23. #define VP62_ABS(p, v) (p->valAbs[(v)+512])
  24. #define COS_1_16 64277 /* 64277 = Cos   PI/16 * 65536 */
  25. #define COS_2_16 60547 /* 60547 = Cos 2xPI/16 * 65536 */
  26. #define COS_3_16 54491 /* 54491 = Cos 3xPI/16 * 65536 */
  27. #define COS_4_16 46341 /* 46341 = Cos 4xPI/16 * 65536 */
  28. #define COS_5_16 36410 /* 36410 = Cos 5xPI/16 * 65536 */
  29. #define COS_6_16 25080 /* 25080 = Cos 6xPI/16 * 65536 */
  30. #define COS_7_16 12785 /* 12785 = Cos 7xPI/16 * 65536 */
  31. typedef struct _VP62_AB{
  32. char  notNullDC;
  33. char  refFrame;
  34. short  dcCoeff;
  35. }
  36. VP62_AB;
  37. typedef struct _VP62_MB{
  38. unsigned char type;
  39. short vx,vy;
  40. }
  41. VP62_MB;
  42. typedef struct _VP62{
  43.     unsigned char   *inputBuffer; /* Points to payload buffer */
  44.     /* Frame characteristics */
  45.     int  frameType;
  46.     int  tagFrame;
  47.     int  displayRows;
  48.     int  displayColumns;
  49.     int  movieWidth;
  50.     int  movieHeight;
  51.     int  lastRows;
  52.     int  lastCols;
  53.     /* Interlacing */
  54.     int  interlacedBlock;
  55.     unsigned char    useInterlacing;
  56.     int  ilProb;
  57.     int  quantizer;
  58.     int  lastQuantizer;
  59.     short  coeffScale[64];
  60.     /* Arithmetic Coding (AC) */
  61.     int  acHigh;
  62.     unsigned long  acCodeWord;
  63.     int  acBits;
  64.     unsigned char   *acBuffer;
  65.     unsigned char   *acBufferEnd;
  66.     /* Buffers */
  67.     unsigned char   *yuvCurrentFrame;
  68.     unsigned char   *yuvTaggedFrame;
  69.     unsigned char   *yuvLastFrame;
  70.     int  yStride; /* actual stride + 96 */
  71.     int  uvStride; /* actual stride + 48 */
  72.     int  ySize; /* Luma Y */
  73.     int  uvSize; /* Chroma U or V */
  74.     int  mbc; /* Number of horizontal MB */
  75.     int  mbr; /* Number of vertical MB  */
  76.     int  orgPlaneStride[6];
  77.     int  planeStride[6];
  78.     int  pixelOffset[6]; /* Offset to upper left corner pixel for each blocks */
  79.     /* DC Predictors management */
  80.     VP62_AB *aboveBlocks; /* Above blocks */
  81.     int  aboveBlockIndex[6];
  82.     VP62_AB  prevBlock[4]; /* Left blocks */
  83.     short  prevDCRefFrame[3][3];
  84.     /* Blocks And Macroblock */
  85.     int  currentMbType;
  86.     int  prevMbType;
  87.     short  block8x8[6][64];
  88.     unsigned char    block12x12[144]; /* Intermediate 12x12 block for filtering */
  89.     int  coeffIndexToPos[64];
  90.     unsigned char    coeffReorder[64];
  91.     short  coeff420[6][64]; /* DCT Coeff for each blocks */
  92.     VP62_MB *macroblocks;
  93.     /* Vectors (Motion compensation) */
  94.     short  blockVector[6][2]; /* Vectors for each block in MB */
  95.     short  prevFrameFirstVectorCandidate[2];
  96.     short  prevFrameSecondVectorCandidate[2];
  97.     int  prevFrameFirstVectorCandidatePos;
  98.     short  tagFrameFirstVectorCandidate[2];
  99.     short  tagFrameSecondVectorCandidate[2];
  100.     int  tagFrameFirstVectorCandidatePos;
  101.     /* Predictors candidates */
  102.     int  predOffset[12];
  103.     /* Filtering hints for moved blocks */
  104.     int  blockCopyFiltering;
  105.     int  blockCopyFilterMode;
  106.     int  maxVectorLength;
  107.     int  VP62_SampleVarianceThreshold;
  108.     int  filterSelection;
  109.     /* AC Models */
  110.     unsigned char    sigVectorModel[2]; /* Delta sign */
  111.     unsigned char    dctVectorModel[2]; /* Delta Coding Types */
  112.     unsigned char    pdvVectorModel[2][7]; /* Predefined Delta Values */
  113.     unsigned char    fdvVectorModel[2][8]; /* 8 bit delta value definition */
  114.     unsigned char    sameMbTypeModel[3][10]; /* Same as previous MB type */
  115.     unsigned char    nextMbTypeModel[3][10][9]; /* Next MB type */
  116.     unsigned char    dccvCoeffModel[2][11]; /* DC Coeff value */
  117.     unsigned char    ractCoeffModel[2][3][6][11]; /* Run/AC coding type and AC coeff value */
  118.     unsigned char    dcctCoeffModel[2][3][5]; /* DC coeff coding type */
  119.     unsigned char    runvCoeffModel[2][14]; /* Run value */
  120.     unsigned char    mbTypesStats[3][2][10]; /* Contextual, next MbType statistics */
  121. /* Fast Clipping And Value Computation */
  122. unsigned char  clip0to255[1024]; /* Indexes from -512 to +512, biased by 512 */
  123. unsigned char  valAbs[1024]; /* Ditto */
  124. int  referenceFrame[10];
  125. int  b6to4[6];
  126. int  b6to3[6];
  127. }
  128. VP62, *PVP62;
  129. /* Internal API */
  130. void    VP62_ParseAndDecodeFrame(PVP62 pVP62);
  131. int     VP62_ParseAndCheckHeaderForImageResizing(PVP62 pVP62);
  132. void    VP62_AllocateBuffers(PVP62 pVP62);
  133. void    VP62_InitOffscreenBorders(PVP62 pVP62, unsigned char *yuv);
  134. void    VP62_InitCoeffScaleFactors(PVP62 pVP62);
  135. /* Arithmetic Coding */
  136. void    VP62_ACInit(PVP62 pVP62, unsigned char *);
  137. int     VP62_ACGetBitProb(PVP62 pVP62, int prob);
  138. int     VP62_ACGetBit(PVP62 pVP62);
  139. int     VP62_ACGetBits(PVP62 pVP62, int bits);
  140. /* Block Blitters */
  141. void    VP62_DrawMacroBlock(PVP62 pVP62, int block);
  142. void    VP62_DrawDeltaBlockFromYUV(PVP62 pVP62, unsigned char *yuv, int block);
  143. void    VP62_DrawDeltaBlockFromMacroBlock(PVP62 pVP62, short *srcBlock, short *delta, int b);
  144. /* Stream Models */
  145. void    VP62_DefaultModelsInit(PVP62 pVP62);
  146. void    VP62_ParseVectorModelsChanges(PVP62 pVP62);
  147. void    VP62_ParseVectorAdjustment(PVP62 pVP62, short *v, int mbType);
  148. void    VP62_ParseCoeffModelsChanges(PVP62 pVP62);
  149. void    VP62_ParseMacroblockTypeModelsChanges(PVP62 pVP62);
  150. void    VP62_InitCoeffOrderTable(PVP62 pVP62);
  151. /* Parsing And Decoding */
  152. void    VP62_IDCT8x8(PVP62 pVP62, int block);
  153. void    VP62_ParseDecodeDraxMacroBlock(PVP62 pVP62, int row, int col);
  154. int     VP62_ParseMacroblockType(PVP62 pVP62, int prevType, int index);
  155. void    VP62_ParseCoeff(PVP62 pVP62);
  156. void    VP62_AddPredictorsDC(PVP62 pVP62);
  157. void    VP62_DecodeMacroBlockTypeAndVectors(PVP62 pVP62, int row, int col);
  158. void    VP62_Decode4Vectors(PVP62 pVP62, int row, int col);
  159. /* Motion Compensation */
  160. void    VP62_GetBlock(PVP62 pVP62, int block, short *dstBlock, unsigned char *yuv);
  161. int     VP62_GetVectorsPredictors(PVP62 pVP62, int row, int col, int refFrame);
  162. /* Copy And Filter */
  163. void    VP62_Fill12x12Block(PVP62 pVP62, unsigned char *yuv, int pixOffset, int vx, int vy, int block);
  164. void    VP62_SimpleBlockCopy(PVP62 pVP62, short *dstBlock, unsigned char *yuv, int offset, int stride);
  165. void    VP62_FourPointFilterHV(PVP62 pVP62, short *dstBlock, unsigned char *yuv, int offset, int stride, int delta, int *filter);
  166. void    VP62_FourPointFilterDiag(PVP62 pVP62, short *dstBlock, unsigned char *yuv, int offset, int stride, int *hFilter, int *vFilter);
  167. void    VP62_AAFilterHV(PVP62 pVP62, short *dstBlock, unsigned char *yuv, int offset, int stride, int delta, int *aa);
  168. void    VP62_AAFilterDiag(PVP62 pVP62, short *dstBlock, unsigned char *yuv, int offset, int stride, int *hAA, int *vAA);
  169. void    VP62_FilteredBlockCopy(PVP62 pVP62, short *dstBlock, unsigned char *yuv, int iOffset, int oOffset, int stride, int x8, int y8, unsigned char useEnhancedFilter, int select);
  170. int    *VP62_GetCoordDiv();
  171. int     VP62_Adjust(int v, int t);
  172. void    VP62_EdgeFilter(PVP62 pVP62, int n, int pixInc, int lineInc, int t);
  173. /* C API */
  174. PVP62   VP62_NewStream();
  175. void    VP62_DelStream(PVP62 pVP62);
  176. int     VP62_DecodePayloadPacket(PVP62 pVP62, unsigned char *payload, int length);
  177. void    VP62_GetImageSize(PVP62 pVP62, int *width, int *height);
  178. void    VP62_GetDisplaySize(PVP62 pVP62, int *width, int *height);
  179. void    VP62_GetRGB(PVP62 pVP62, unsigned char *rgb);
  180. #endif /* _LIBVP62_ */