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

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_mips64.c 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.  
  24. #include "../common.h"
  25. #include "softidct.h"
  26. #ifdef MIPS64
  27. #define MV_X(v) ((v<<16)>>17)
  28. #define MV_Y(v) (v>>17)
  29. #define MV_SUB(v) (v&1)+((v>>15)&2)
  30. void Inter8x8Add(softidct* p,idct_block_t *Block,int Length)
  31. {
  32. // mcomp part is done by Process()
  33. if (Length)
  34. {
  35. if (Length == 1)
  36. IDCT_Const8x8((Block[0]+4) >> 3,p->DstPtr,p->CurrPitch,p->DstPtr);
  37. #ifdef SWAP8X4
  38. else if (Length < 11 || (Length<20 && Block[32]==0))
  39. IDCT_Block4x8(Block,p->DstPtr,p->CurrPitch,p->DstPtr);
  40. #else
  41. else if (Length < 15 || (Length<26 && ((uint32_t*)Block)[2]==0 && ((uint32_t*)Block)[6]==0))
  42. IDCT_Block4x8(Block,p->DstPtr,p->CurrPitch,p->DstPtr);
  43. #endif
  44. else
  45. IDCT_Block8x8(Block,p->DstPtr,p->CurrPitch,p->DstPtr);
  46. }
  47. IncPtr(p,0,0);
  48. }
  49. void MComp8x8(softidct* p,const int* MVPtr,const int* MVEnd,int Ref)
  50. {
  51. uint8_t* Min = p->RefMin[Ref];
  52. uint8_t* Max = p->RefMax[Ref];
  53. uint8_t* Ptr;
  54. int MV;
  55. for (;MVPtr!=MVEnd;++MVPtr)
  56. {
  57. MV = *MVPtr;
  58. Ptr = p->RefPtr[Ref] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  59. if (Ptr >= Min && Ptr < Max)
  60. p->CopyBlock[MV_SUB(MV)](Ptr,p->DstPtr,p->CurrPitch,p->CurrPitch);
  61. IncPtr(p,1,1);
  62. }
  63. }
  64. void MComp8x8Add(softidct* p,const int* MVBack,const int* MVEnd,const int* MVFwd)
  65. {
  66. uint8_t* Min0 = p->RefMin[0];
  67. uint8_t* Max0 = p->RefMax[0];
  68. uint8_t* Min1 = p->RefMin[1];
  69. uint8_t* Max1 = p->RefMax[1];
  70. uint8_t* Ptr;
  71. int MV;
  72. for (;MVBack!=MVEnd;++MVBack,++MVFwd)
  73. {
  74. MV = *MVBack;
  75. Ptr = p->RefPtr[0] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  76. if (Ptr >= Min0 && Ptr < Max0)
  77. p->CopyBlock[MV_SUB(MV)](Ptr,p->DstPtr,p->CurrPitch,p->CurrPitch);
  78. MV = *MVFwd;
  79. Ptr = p->RefPtr[1] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  80. if (Ptr >= Min1 && Ptr < Max1)
  81. {
  82. p->CopyBlock[MV_SUB(MV)](Ptr,p->Tmp,p->CurrPitch,8);
  83. AddBlock8x8(p->Tmp,p->DstPtr,8,p->CurrPitch);
  84. }
  85. IncPtr(p,1,1);
  86. }
  87. }
  88. void SoftMComp8x8(softidct* p,const int *MVBack,const int *MVFwd)
  89. {
  90. uint8_t* SaveDstPtr = p->DstPtr;
  91. if (MVBack)
  92. {
  93. if (MVFwd)
  94. MComp8x8Add(p,MVBack,MVBack+6,MVFwd);
  95. else
  96. MComp8x8(p,MVBack,MVBack+6,0);
  97. }
  98. else
  99. if (MVFwd)
  100. MComp8x8(p,MVFwd,MVFwd+6,1);
  101. p->CurrPitch <<= 1;
  102. p->Ptr -= 6;
  103. p->DstPtr = SaveDstPtr;
  104. }
  105. void SoftMComp16x16(softidct* p,const int *MVBack,const int *MVFwd)
  106. {
  107. uint8_t* SaveDstPtr = p->DstPtr;
  108. uint8_t* Ptr;
  109. int MV;
  110. if (MVBack)
  111. {
  112. MV = MVBack[0];
  113. Ptr = p->RefPtr[0] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  114. if (Ptr >= p->RefMin[0] && Ptr < p->RefMax[0])
  115. p->CopyMBlock[MV_SUB(MV)](Ptr,p->DstPtr,p->CurrPitch,p->CurrPitch);
  116. if (MVFwd)
  117. {
  118. MV = MVFwd[0];
  119. Ptr = p->RefPtr[1] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  120. if (Ptr >= p->RefMin[1] && Ptr < p->RefMax[1])
  121. {
  122. p->CopyMBlock[MV_SUB(MV)](Ptr,p->Tmp,p->CurrPitch,16);
  123. AddBlock16x16(p->Tmp,p->DstPtr,16,p->CurrPitch);
  124. }
  125. IncPtrLum(p);
  126. MComp8x8Add(p,MVBack+4,MVBack+6,MVFwd+4);
  127. }
  128. else
  129. {
  130. IncPtrLum(p);
  131. MComp8x8(p,MVBack+4,MVBack+6,0);
  132. }
  133. }
  134. else
  135. if (MVFwd)
  136. {
  137. MV = MVFwd[0];
  138. Ptr = p->RefPtr[1] + MV_X(MV) + p->CurrPitch * MV_Y(MV);
  139. if (Ptr >= p->RefMin[1] && Ptr < p->RefMax[1])
  140. p->CopyMBlock[MV_SUB(MV)](Ptr,p->DstPtr,p->CurrPitch,p->CurrPitch);
  141. IncPtrLum(p);
  142. MComp8x8(p,MVFwd+4,MVFwd+6,1);
  143. }
  144. p->CurrPitch <<= 1;
  145. p->Ptr -= 6;
  146. p->DstPtr = SaveDstPtr;
  147. }
  148. #endif