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

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_c.c 323 2005-11-01 20:52:32Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23.  
  24. #include "../common.h"
  25. #include "softidct.h"
  26. //#define STAT
  27. #ifdef STAT
  28. int Len[16] = {0};
  29. int Count = 0;
  30. int Type[2][3] = {0};
  31. int Spec[2][5] = {0};
  32. int Skip = 0;
  33. int Max = 0;
  34. void Statistics(idct_block_t *Block, int Length, int ScanType, int Add)
  35. {
  36. int i;
  37. for (i=0;i<Length;++i)
  38. {
  39. int v = Block[i];
  40. if (v<0) v=-v;
  41. if (v>Max) Max=v;
  42. }
  43. ++Len[Length >> 2];
  44. ++Count;
  45. ++Type[Add][ScanType];
  46. if (Length==1)
  47. Spec[Add][0]++;
  48. else
  49. if (ScanType==0 && Length==2)
  50. Spec[Add][1]++;
  51. else
  52. if (!Add && ScanType!=1 && Length < 15)
  53. {
  54. Spec[Add][2]++;
  55. }
  56. else
  57. if (Add && ScanType==0 && (Length < 15 || (Length<26 && ((uint32_t*)Block)[2]==0 && ((uint32_t*)Block)[6]==0)))
  58. {
  59. Spec[Add][2]++;
  60. }
  61. DebugMessage(T("%d %d %d [%d %d %d %d %d %d %d %d][%d %d %d %d %d %d %d %d][%d %d %d %d %d %d %d %d]"
  62. "[%d %d %d %d %d %d %d %d][%d %d %d %d %d %d %d %d][%d %d %d %d %d %d %d %d][%d %d %d %d %d %d %d %d][%d %d %d %d %d %d %d %d]"),
  63. Add,ScanType,Length,
  64. Block[0+0*8],Block[1+0*8],Block[2+0*8],Block[3+0*8],Block[4+0*8],Block[5+0*8],Block[6+0*8],Block[7+0*8],
  65. Block[0+1*8],Block[1+1*8],Block[2+1*8],Block[3+1*8],Block[4+1*8],Block[5+1*8],Block[6+1*8],Block[7+1*8],
  66. Block[0+2*8],Block[1+2*8],Block[2+2*8],Block[3+2*8],Block[4+2*8],Block[5+2*8],Block[6+2*8],Block[7+2*8],
  67. Block[0+3*8],Block[1+3*8],Block[2+3*8],Block[3+3*8],Block[4+3*8],Block[5+3*8],Block[6+3*8],Block[7+3*8],
  68. Block[0+4*8],Block[1+4*8],Block[2+4*8],Block[3+4*8],Block[4+4*8],Block[5+4*8],Block[6+4*8],Block[7+4*8],
  69. Block[0+5*8],Block[1+5*8],Block[2+5*8],Block[3+5*8],Block[4+5*8],Block[5+5*8],Block[6+5*8],Block[7+5*8],
  70. Block[0+6*8],Block[1+6*8],Block[2+6*8],Block[3+6*8],Block[4+6*8],Block[5+6*8],Block[6+6*8],Block[7+6*8],
  71. Block[0+7*8],Block[1+7*8],Block[2+7*8],Block[3+7*8],Block[4+7*8],Block[5+7*8],Block[6+7*8],Block[7+7*8]);
  72. }
  73. #else
  74. #define Statistics(a,b,c,d)
  75. #endif
  76. void Copy420(softidct* p,int x,int y,int Forward)
  77. {
  78. SetPtr420(p,x,y,0);
  79. CopyBlock16x16(p->RefPtr[Forward],p->DstPtr,p->CurrPitch,p->CurrPitch);
  80. IncPtrLum(p);
  81. CopyBlock8x8(p->RefPtr[Forward],p->DstPtr,p->CurrPitch,p->CurrPitch);
  82. IncPtr(p,1,1);
  83. CopyBlock8x8(p->RefPtr[Forward],p->DstPtr,p->CurrPitch,p->CurrPitch);
  84. EMMS();
  85. }
  86. void Process420(softidct* p,int x,int y)
  87. {
  88. ProcessHead(p,x,y);
  89. SetPtr420(p,x,y,0);
  90. ProcessTail(p,x,y);
  91. }
  92. void Process422(softidct* p,int x,int y)
  93. {
  94. ProcessHead(p,x,y);
  95. SetPtr422(p,x,y,0);
  96. ProcessTail(p,x,y);
  97. }
  98. void Process444(softidct* p,int x,int y)
  99. {
  100. ProcessHead(p,x,y);
  101. SetPtr444(p,x,y,0);
  102. ProcessTail(p,x,y);
  103. }
  104. #ifndef MIPS64
  105. void SoftMComp8x8(softidct* p,const int* MVBack,const int* MVFwd)
  106. {
  107. p->MVBack = MVBack;
  108. p->MVFwd = MVFwd;
  109. #ifdef STAT
  110. if (MVBack)
  111. DebugMessage(T("back 08x %08x %08x %08x %08x %08x"),MVBack[0],MVBack[1],MVBack[2],MVBack[3],MVBack[4],MVBack[5]);
  112. if (MVFwd)
  113. DebugMessage(T("fwd 08x %08x %08x %08x %08x %08x"),MVFwd[0],MVFwd[1],MVFwd[2],MVFwd[3],MVFwd[4],MVFwd[5]);
  114. #endif
  115. }
  116. #endif
  117. #include "block.h"
  118. #ifdef CONFIG_IDCT_SWAP
  119. void Copy420Swap(softidct* p,int x,int y,int Forward)
  120. {
  121. SetPtr420(p,y,x,0);
  122. CopyBlock16x16(p->RefPtr[Forward],p->DstPtr,p->CurrPitch,p->CurrPitch);
  123. IncPtrLum(p);
  124. CopyBlock8x8(p->RefPtr[Forward],p->DstPtr,p->CurrPitch,p->CurrPitch);
  125. IncPtr(p,1,1);
  126. CopyBlock8x8(p->RefPtr[Forward],p->DstPtr,p->CurrPitch,p->CurrPitch);
  127. EMMS();
  128. }
  129. void Process420Swap(softidct* p,int x,int y)
  130. {
  131. SetPtr420(p,y,x,0);
  132. }
  133. void Process422Swap(softidct* p,int x,int y)
  134. {
  135. SetPtr422(p,y,x,0);
  136. }
  137. void Process444Swap(softidct* p,int x,int y)
  138. {
  139. SetPtr444(p,y,x,0);
  140. }
  141. #ifndef MIPS64
  142. void SoftMComp8x8Swap(softidct* p,const int* MVBack,const int* MVFwd)
  143. {
  144. p->MVBack = MVBack;
  145. p->MVFwd = MVFwd;
  146. }
  147. #endif
  148. #define SWAPXY
  149. #define SWAP8X4
  150. #define Intra8x8 Intra8x8Swap
  151. #define Inter8x8Back Inter8x8BackSwap
  152. #define Inter8x8BackFwd Inter8x8BackFwdSwap
  153. #include "block.h"
  154. #endif