idct.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:8k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: idct.h 548 2006-01-08 22:41:57Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23.  
  24. #ifndef __IDCT_H
  25. #define __IDCT_H
  26. #define MAXIDCTBUF 6
  27. //---------------------------------------------------------------
  28. // motion vector macros
  29. #define NOMV 0x80000000
  30. #define MVX(a) (((a)<<16)>>16)
  31. #define MVY(a) ((a)>>16)
  32. #define MAKEMV(x,y) (((y)<<16)|((x)&0xFFFF))
  33. #ifdef IS_BIG_ENDIAN
  34. #define MVXIDX 1
  35. #define MVYIDX 0
  36. #else
  37. #define MVXIDX 0
  38. #define MVYIDX 1
  39. #endif
  40. //---------------------------------------------------------------
  41. // idct (abstract)
  42. #define IDCT_CLASS FOURCC('I','D','C','T')
  43. // motion compesation rounding
  44. #define IDCT_ROUNDING 0x50
  45. // video format
  46. #define IDCT_FORMAT 0x51
  47. // output packet
  48. #define IDCT_OUTPUT 0x52
  49. // number of buffers (int)
  50. #define IDCT_BUFFERCOUNT 0x53
  51. // manual setting of buffer width, -1 for auto (int)
  52. #define IDCT_BUFFERWIDTH 0x57
  53. // manual setting of buffer height, -1 for auto (int)
  54. #define IDCT_BUFFERHEIGHT 0x58
  55. // showed buffer (int)
  56. #define IDCT_SHOW 0x56
  57. // backup/restore data (data is allocated/freed, idct is closed/inited)
  58. #define IDCT_BACKUP 0x59
  59. // low-res modes (1/2,1/4)
  60. #define IDCT_SHIFT 0x5A
  61. // mode flags
  62. #define IDCT_MODE 0x5B
  63. // frame no associated with a buffer (int) (array)
  64. #define IDCT_FRAMENO 0x1000
  65. extern DLL int IDCTEnum(void*, int* EnumNo, datadef* Out);
  66. //---------------------------------------------------------------
  67. #define IDCTMODE_QPEL 1
  68. #define IDCTMODE_INTERLACE 2
  69. #define IDCTMODE_GMC 4
  70. //---------------------------------------------------------------
  71. // scan orders (not every data format requires)
  72. #define IDCTSCAN_ZIGZAG 0
  73. #define IDCTSCAN_ALT_HORI 1
  74. #define IDCTSCAN_ALT_VERT 2
  75. //---------------------------------------------------------------
  76. // block format
  77. //
  78. // input is a idct_block_t[8][8] matrix
  79. // which is directly passed to 8x8 idct
  80. // attention: input matrix is overwritten(trashed) after the call
  81. //
  82. // length/scantype is hint how much data is in the matrix
  83. // block[scan[length..63]] souhld be zero
  84. // pass length=64 if you can't provide this information
  85. typedef short int idct_block_t;
  86. #define IDCT_BLOCK_DECLARE 
  87. idct_block_t _block[2*64+16/sizeof(idct_block_t)];
  88. #define IDCT_BLOCK_PREPARE(x,out) 
  89. out = (idct_block_t*)ALIGN16((uintptr_t)x->_block);
  90. //---------------------------------------------------------------
  91. // gmc
  92. #define GMC_FRACBITS 16
  93. typedef struct idct_gmc
  94. {
  95.     int points;
  96. int accuracy;
  97.     int offset[2][2];
  98.     int delta[2][2];
  99. } idct_gmc;
  100. //---------------------------------------------------------------
  101. // idct virtual method table
  102. // set all buffer's frameno to -1
  103. typedef void (*idctdrop)(void* This);
  104. // send packet to output
  105. typedef int (*idctsend)(void* This,tick_t RefTime,const flowstate* State);
  106. // send null packet to output (State == NULL means dropping)
  107. typedef int (*idctnull)(void* This,const flowstate* State,bool_t Empty);
  108. // lock one of the buffers
  109. typedef int (*idctlock)(void* This,int No,planes Planes,int* Brightness,video* Format);
  110. // unlock buffer
  111. typedef void (*idctunlock)(void* This,int No);
  112. // start decoding a frame (oldframeno is -1 if content is lost)
  113. typedef int (*idctframestart)(void* This,int FrameNo,int* OldFrameNo,int Dst,int Back,int Fwd,int Show,bool_t Drop);
  114. // end decoding a frame
  115. typedef void (*idctframeend)(void* This);
  116. // setup gmc params
  117. typedef void (*idctgmc)(void* This,const idct_gmc*);
  118. // start processing a macroblock
  119. typedef void (*idctprocess)(void* This,int x,int y);
  120. // copy a macroblock from the backward or forward buffer
  121. typedef void (*idctcopy)(void* This,int x,int y,int Forward);
  122. // motion compensation data (MVBack and MVFwd has to be valid during Inter8x8 are called)
  123. typedef void (*idctmcomp)(void* This,const int *MVBack,const int *MVFwd);
  124. // passing idct data 
  125. typedef void (*idctintra)(void* This,void* Data,int Length,int ScanType);
  126. // passing idct data (always has to be called even if there is no data)
  127. typedef void (*idctinter)(void* This,void* Data,int Length);
  128. typedef struct idct
  129. {
  130. VMT_NODE
  131. idctsend Send;
  132. idctnull Null;
  133. idctdrop Drop;
  134. idctlock Lock;
  135. idctunlock Unlock;
  136. idctframestart FrameStart;
  137. idctframeend FrameEnd;
  138. idctgmc GMC;
  139. idctprocess Process;
  140. idctcopy Copy16x16;
  141. idctmcomp MComp16x16;
  142. idctmcomp MComp8x8;
  143. idctintra Intra8x8;
  144. idctinter Inter8x8; // data is optional (length=0)
  145. idctprocess MCompGMC;
  146. idctinter Inter8x8GMC; // data is optional (length=0)
  147. } idct;
  148. typedef struct idctbufferbackup
  149. {
  150. int FrameNo;
  151. planes Buffer;
  152. int Brightness;
  153. video Format;
  154. } idctbufferbackup;
  155. typedef struct idctbackup
  156. {
  157. video Format;
  158. int Width;
  159. int Height;
  160. int Count;
  161. int Show;
  162. int Shift;
  163. int Mode;
  164. idctbufferbackup Buffer[MAXIDCTBUF];
  165. } idctbackup;
  166. DLL int IDCTBackup(idct*,idctbackup*);
  167. DLL int IDCTRestore(idct*,idctbackup*);
  168. DLL int IDCTSwitch(idct* Src, idct* Dst, int MinBufferCount);
  169. static INLINE void ClearBlock(idct_block_t *p) 
  170. {
  171. int *i=(int*)p,*ie=(int*)(p+64);
  172. do
  173. {
  174. i[3] = i[2] = i[1] = i[0] = 0;
  175. i[7] = i[6] = i[5] = i[4] = 0;
  176. i+=8;
  177. }
  178. while (i!=ie);
  179. }
  180. //---------------------------------------------------------------
  181. // decoder using idct (abstract)
  182. #define CODECIDCT_CLASS FOURCC('C','C','I','D')
  183. #define CODECIDCT_INPUT 0x100
  184. #define CODECIDCT_IDCT 0x101
  185. typedef int (*codecidctframe)(void* This,const uint8_t* Ptr,int Len);
  186. typedef bool_t (*codecidctnext)(void* This);
  187. typedef struct codecidct
  188. {
  189. node Node;
  190. nodefunc UpdateInput;
  191. nodefunc UpdateCount;
  192. nodefunc UpdateSize;
  193. nodefunc Discontinuity;
  194. nodefunc Flush;
  195. codecidctframe Frame;
  196. codecidctnext FindNext;
  197. int MinCount;
  198. int DefCount;
  199. tick_t DropTolerance;
  200. struct
  201. {
  202. idct *Ptr;
  203. video Format;
  204. int Width;
  205. int Height;
  206. int Count;
  207. int Mode;
  208. } IDCT;
  209. struct
  210. {
  211. pin Pin; 
  212. packetformat Format;
  213. } In;
  214. int Show;
  215. flowstate State;
  216. tick_t RefTime;
  217. bool_t RefUpdated;
  218. bool_t Dropping; // indicate that we are not after a seek, but a hard dropping period
  219. pin NotSupported;
  220. // packed stream
  221. tick_t FrameTime;
  222. int FrameEnd;
  223. buffer Buffer;
  224. int Reserved[8];
  225. } codecidct;
  226. DLL int CodecIDCTEnum(void*, int* EnumNo, datadef* Out);
  227. DLL int CodecIDCTGet(codecidct* p, int No, void* Data, int Size);
  228. DLL int CodecIDCTSet(codecidct* p, int No, const void* Data, int Size);
  229. DLL int CodecIDCTSetFormat(codecidct* p, int Flags, int Width, int Height, int IDCTWidth, int IDCTHeight,int Aspect);
  230. DLL int CodecIDCTSetCount(codecidct* p, int Count);
  231. DLL int CodecIDCTSetMode(codecidct* p, int Mode, bool_t Value);
  232. void IDCT_Init();
  233. void IDCT_Done();
  234. #endif