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

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: block_mx1.h 271 2005-08-09 08:31:35Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #ifndef SWAPXY
  24. #define MV_X(v) ((v<<16)>>17)
  25. #define MV_Y(v) (v>>17)
  26. #define MV_SUB(v) (v&1)+((v>>15)&2)
  27. static INLINE void Push(softidct* p,idct_block_t *Block)
  28. {
  29. volatile int* MX1 = p->MX1;
  30. idct_block_t *BlockEnd = Block+8;
  31. do
  32. {
  33. *MX1 = ((uint16_t*)Block)[0*8] + (((uint16_t*)Block)[1*8] << 16);
  34. *MX1 = ((uint16_t*)Block)[2*8] + (((uint16_t*)Block)[3*8] << 16);
  35. *MX1 = ((uint16_t*)Block)[4*8] + (((uint16_t*)Block)[5*8] << 16);
  36. *MX1 = ((uint16_t*)Block)[6*8] + (((uint16_t*)Block)[7*8] << 16);
  37. ++Block;
  38. } while (Block != BlockEnd);
  39. }
  40. #else
  41. #define MV_X(v) (v>>17)
  42. #define MV_Y(v) ((v<<16)>>17)
  43. #define MV_SUB(v) ((v<<1)&2)+((v>>16)&1)
  44. #define Push PushSwap
  45. static INLINE void Push(softidct* p,idct_block_t *Block)
  46. {
  47. volatile int* MX1 = p->MX1;
  48. idct_block_t *BlockEnd = Block+64;
  49. do
  50. {
  51. *MX1 = ((uint16_t*)Block)[0] + (((uint16_t*)Block)[1] << 16);
  52. *MX1 = ((uint16_t*)Block)[2] + (((uint16_t*)Block)[3] << 16);
  53. *MX1 = ((uint16_t*)Block)[4] + (((uint16_t*)Block)[5] << 16);
  54. *MX1 = ((uint16_t*)Block)[6] + (((uint16_t*)Block)[7] << 16);
  55. Block += 8;
  56. } while (Block != BlockEnd);
  57. }
  58. #endif
  59. void Intra8x8(softidct* p,idct_block_t *Block,int Length,int ScanType)
  60. {
  61. p->MX1Pop(p);
  62. p->MX1Dst = p->DstPtr;
  63. p->MX1Pitch = p->CurrPitch;
  64. p->MX1Pop = MX1Pop;
  65. Push(p,Block);
  66. EMMS();
  67. IncPtr(p,0,0);
  68. }
  69. void Inter8x8BackFwd(softidct* p,idct_block_t *Block,int Length)
  70. {
  71. uint8_t* Ptr;
  72. int MV;
  73. p->MX1Pop(p);
  74. if (Length)
  75. {
  76. // mcomp and idct (using tmp buffer)
  77. if (Length != 1)
  78. {
  79. p->MX1Dst = p->DstPtr;
  80. p->MX1Pitch = p->CurrPitch;
  81. p->MX1Pop = MX1PopAdd;
  82. Push(p,Block);
  83. }
  84. if (p->MVBack)
  85. {
  86. MV = *(p->MVBack++);
  87. Ptr = p->RefPtr[0] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  88. if (Ptr >= p->RefMin[0] && Ptr < p->RefMax[0])
  89. p->CopyBlock[MV_SUB(MV)](Ptr,p->Tmp,p->CurrPitch,8);
  90. if (p->MVFwd)
  91. {
  92. MV = *(p->MVFwd++);
  93. Ptr = p->RefPtr[1] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  94. if (Ptr >= p->RefMin[1] && Ptr < p->RefMax[1])
  95. {
  96. #if defined(MIPS32)
  97. p->CopyBlock[MV_SUB(MV)](Ptr,p->Tmp+64,p->CurrPitch,8);
  98. AddBlock8x8(p->Tmp+64,p->Tmp,8,8);
  99. #else
  100. p->AddBlock[MV_SUB(MV)](Ptr,p->Tmp,p->CurrPitch);
  101. #endif
  102. }
  103. }
  104. }
  105. else
  106. if (p->MVFwd)
  107. {
  108. MV = *(p->MVFwd++);
  109. Ptr = p->RefPtr[1] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  110. if (Ptr >= p->RefMin[1] && Ptr < p->RefMax[1])
  111. p->CopyBlock[MV_SUB(MV)](Ptr,p->Tmp,p->CurrPitch,8);
  112. }
  113. if (Length == 1)
  114. {
  115. IDCT_Const8x8((Block[0]+4) >> 3,p->DstPtr,p->CurrPitch,p->Tmp);
  116. p->MX1Pop = MX1PopNone;
  117. }
  118. }
  119. else 
  120. {
  121. // interpolate back and foward (using tmp buffer)
  122. if (p->MVBack && p->MVFwd)
  123. {
  124. MV = *(p->MVBack++);
  125. Ptr = p->RefPtr[0] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  126. if (Ptr >= p->RefMin[0] && Ptr < p->RefMax[0])
  127. p->CopyBlock[MV_SUB(MV)](Ptr,p->Tmp,p->CurrPitch,8);
  128. MV = *(p->MVFwd++);
  129. Ptr = p->RefPtr[1] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  130. if (Ptr >= p->RefMin[1] && Ptr < p->RefMax[1])
  131. {
  132. #if defined(MIPS32)
  133. p->CopyBlock[MV_SUB(MV)](Ptr,p->DstPtr,p->CurrPitch,p->CurrPitch);
  134. AddBlock8x8(p->Tmp,p->DstPtr,8,p->CurrPitch);
  135. #else
  136. p->AddBlock[MV_SUB(MV)](Ptr,p->Tmp,p->CurrPitch);
  137. // copy Tmp to Dst
  138. CopyBlock(p->Tmp,p->DstPtr,8,p->CurrPitch);
  139. #endif
  140. }
  141. }
  142. else
  143. if (p->MVBack)
  144. {
  145. MV = *(p->MVBack++);
  146. Ptr = p->RefPtr[0] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  147. if (Ptr >= p->RefMin[0] && Ptr < p->RefMax[0])
  148. p->CopyBlock[MV_SUB(MV)](Ptr,p->DstPtr,p->CurrPitch,p->CurrPitch);
  149. }
  150. else
  151. if (p->MVFwd)
  152. {
  153. MV = *(p->MVFwd++);
  154. Ptr = p->RefPtr[1] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  155. if (Ptr >= p->RefMin[1] && Ptr < p->RefMax[1])
  156. p->CopyBlock[MV_SUB(MV)](Ptr,p->DstPtr,p->CurrPitch,p->CurrPitch);
  157. }
  158. p->MX1Pop = MX1PopNone;
  159. }
  160. EMMS();
  161. IncPtr(p,1,1);
  162. }
  163. void Inter8x8Back(softidct* p,idct_block_t *Block,int Length)
  164. {
  165. uint8_t* Ptr;
  166. int MV;
  167. p->MX1Pop(p);
  168. if (Length)
  169. {
  170. // mcomp and idct (using tmp buffer)
  171. if (Length != 1)
  172. {
  173. p->MX1Dst = p->DstPtr;
  174. p->MX1Pitch = p->CurrPitch;
  175. p->MX1Pop = MX1PopAdd;
  176. Push(p,Block);
  177. }
  178. MV = *(p->MVBack++);
  179. Ptr = p->RefPtr[0] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  180. if (Ptr >= p->RefMin[0] && Ptr < p->RefMax[0])
  181. p->CopyBlock[MV_SUB(MV)](Ptr,p->Tmp,p->CurrPitch,8);
  182. if (Length == 1)
  183. {
  184. IDCT_Const8x8((Block[0]+4) >> 3,p->DstPtr,p->CurrPitch,p->Tmp);
  185. p->MX1Pop = MX1PopNone;
  186. }
  187. }
  188. else 
  189. {
  190. // only back mcomp
  191. MV = *(p->MVBack++);
  192. Ptr = p->RefPtr[0] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  193. if (Ptr >= p->RefMin[0] && Ptr < p->RefMax[0])
  194. p->CopyBlock[MV_SUB(MV)](Ptr,p->DstPtr,p->CurrPitch,p->CurrPitch);
  195. p->MX1Pop = MX1PopNone;
  196. }
  197. EMMS();
  198. IncPtr(p,1,0);
  199. }
  200. #undef MV_X
  201. #undef MV_Y
  202. #undef MV_SUB
  203. #undef Push