mot_util.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "mom_structs.h"
  2. #include "vm_common_defs.h"
  3. #include "mot_util.h"
  4. #define DIFF1(v1,v2,idx) (P_diff = (v1[idx]-v2[idx]), ABS(P_diff))
  5. Void
  6. InterpolateImage(
  7. Image   *input_image,   
  8. Image   *output_image,   
  9. Int     rounding_control
  10. )
  11. {
  12. SInt   *ii, *oo;
  13. UInt    i, j;
  14. UInt   width, height;
  15. width = input_image->x;
  16. height = input_image->y;
  17. ii = (SInt*)GetImageData(output_image);
  18. oo = (SInt*)GetImageData(input_image);
  19. for (j = 0; j < height-1; j++)
  20. {
  21. for (i = 0; i  < width-1; i++)
  22. {
  23. *(ii + (i<<1)) = *(oo + i);
  24. *(ii + (i<<1)+1) = (*(oo + i) + *(oo + i + 1) + 1- rounding_control)>>1;
  25. *(ii + (i<<1)+(width<<1)) = (*(oo + i) + *(oo + i + width) + 1-
  26. rounding_control)>>1;
  27. *(ii + (i<<1)+1+(width<<1)) = (*(oo+i) + *(oo+i+1) +
  28. *(oo+i+width) + *(oo+i+1+width) + 2-
  29. rounding_control)>>2;
  30. }
  31. *(ii+ (width<<1) - 2) = *(oo + width - 1);
  32. *(ii+ (width<<1) - 1) = *(oo + width - 1);
  33. *(ii+ (width<<1)+ (width<<1)-2) = (*(oo+width-1)+*(oo+width+width-1)+1-
  34. rounding_control)>>1;
  35. *(ii+ (width<<1)+ (width<<1)-1) = (*(oo+width-1)+*(oo+width+width-1)+1-
  36. rounding_control)>>1;
  37. ii += (width<<2);
  38. oo += width;
  39. }
  40. for (i = 0; i < width-1; i++)
  41. {
  42. *(ii+ (i<<1)) = *(oo + i);
  43. *(ii+ (i<<1)+1) = (*(oo + i) + *(oo + i + 1) + 1- rounding_control)>>1;
  44. *(ii+ (width<<1)+ (i<<1)) = *(oo + i);
  45. *(ii+ (width<<1)+ (i<<1)+1) = (*(oo + i) + *(oo + i + 1) + 1-
  46. rounding_control)>>1;
  47. }
  48. *(ii + (width<<1) - 2) = *(oo + width -1);
  49. *(ii + (width<<1) - 1) = *(oo + width -1);
  50. *(ii + (width<<2) - 2) = *(oo + width -1);
  51. *(ii + (width<<2) - 1) = *(oo + width -1);
  52. return;
  53. }
  54. Int
  55. GetMotionImages(
  56. Image   *imv16_w,   
  57. Image   *imv16_h,   
  58. Image   *imv8_w,   
  59. Image   *imv8_h,   
  60. Image   *imode16,   
  61. Image   **mv_x,   
  62. Image   **mv_y,   
  63. Image   **mode   
  64. )
  65. {
  66. Int     i, j;
  67. Int     width, height, base;
  68. Float   val_x, val_y;
  69. Float   *data_x, *data_y,
  70. *mv16_w, *mv16_h,
  71. *mv8_w,  *mv8_h;
  72. SInt    *mode16, *data_mode;
  73. SInt    modo;
  74. width = imode16->x; height = imode16->y;
  75. (*mode)=AllocImage(width,height,SHORT_TYPE);
  76. (*mv_x)=AllocImage(width*2,height*2,FLOAT_TYPE);
  77. (*mv_y)=AllocImage(width*2,height*2,FLOAT_TYPE);
  78. data_x = (Float*)GetImageData((*mv_x));
  79. data_y = (Float*)GetImageData((*mv_y));
  80. data_mode = (SInt*)GetImageData((*mode));
  81. mode16=(SInt*)GetImageData(imode16);
  82. mv16_w=(Float*)GetImageData(imv16_w);
  83. mv16_h=(Float*)GetImageData(imv16_h);
  84. mv8_w=(Float*)GetImageData(imv8_w);
  85. mv8_h=(Float*)GetImageData(imv8_h);
  86. for(j=0;j<height;j++)
  87. {
  88. for(i=0;i< width;i++)
  89. {
  90. modo=data_mode[j*width+i]=mode16[j*width+i];
  91. if ( modo==MBM_INTRA)   
  92. {
  93. base=2*j*2*width+2*i;
  94. data_x[base]=0.0;  data_x[base+1]=0.0;
  95. data_y[base]=0.0;  data_y[base+1]=0.0;
  96. base+=width*2;
  97. data_x[base]=0.0;  data_x[base+1]=0.0;
  98. data_y[base]=0.0;  data_y[base+1]=0.0;
  99. }
  100. else if(modo==MBM_INTER16)   
  101. {
  102. base=2*j*2*width+2*i;
  103. val_x=mv16_w[base];val_y=mv16_h[base];
  104. data_x[base]=val_x; data_x[base+1]=val_x;
  105. data_y[base]=val_y; data_y[base+1]=val_y;
  106. base+=width*2;
  107. data_x[base]=val_x; data_x[base+1]=val_x;
  108. data_y[base]=val_y; data_y[base+1]=val_y;
  109. }
  110. else if (modo==MBM_INTER8)   
  111. {
  112. base=2*j*2*width+2*i;
  113. data_x[base]   = mv8_w[base];
  114. data_y[base]   = mv8_h[base];
  115. data_x[base+1] = mv8_w[base+1];
  116. data_y[base+1] = mv8_h[base+1];
  117. base+=width*2;
  118. data_x[base]   = mv8_w[base];
  119. data_y[base]   = mv8_h[base];
  120. data_x[base+1] = mv8_w[base+1];
  121. data_y[base+1] = mv8_h[base+1];
  122. }
  123. }   
  124. }   
  125. return(1);
  126. }
  127. Int
  128. ChooseMode(
  129. SInt   *curr,   
  130. Int    x_pos,   
  131. Int    y_pos,   
  132. Int    min_SAD,   
  133. UInt   width   
  134. )
  135. {
  136. Int   i, j;
  137. Int   MB_mean = 0, A = 0;
  138. Int   y_off;
  139. for (j = 0; j < MB_SIZE; j++)
  140. {
  141. y_off = (y_pos + j) * width;
  142. for (i = 0; i < MB_SIZE; i++)
  143. {
  144. MB_mean += *(curr + x_pos + i + y_off);
  145. }
  146. }
  147. MB_mean /= 256;
  148. for (j = 0; j < MB_SIZE; j++)
  149. {
  150. y_off = (y_pos + j) * width;
  151. for (i = 0; i < MB_SIZE; i++)
  152. {
  153. A += abs( *(curr + x_pos + i + y_off) - MB_mean );
  154. }
  155. }
  156. if (A < (min_SAD - 2*256))
  157. return 0;
  158. else
  159. return 1;
  160. }
  161. Int
  162. SAD_Macroblock(
  163. SInt   *ii,   
  164. SInt   *act_block,   
  165. UInt   h_length,   
  166. Int    Min_FRAME   
  167. )
  168. {
  169. int i, j;
  170. int sad = 0;
  171. SInt *p1 = ii, *p2 = act_block;
  172. i = 16;
  173. while (i--) {
  174. j = 16;
  175. while (j --)
  176. sad += abs((int)*(p1++) - (int)*(p2++));
  177. if (sad > Min_FRAME)
  178. return MV_MAX_ERROR;
  179. p1 += h_length - 16;
  180. }
  181. return sad;
  182. }
  183. Int
  184. SAD_Block(
  185. SInt   *ii,   
  186. SInt   *act_block,   
  187. UInt   h_length,   
  188. Int    min_sofar   
  189. )
  190. {
  191. int i, j;
  192. int sad = 0;
  193. SInt *p1 = ii, *p2 = act_block;
  194. i = 8;
  195. while (i--) {
  196. j = 8;
  197. while (j --)
  198. sad += abs((int)*(p1++) - (int)*(p2++));
  199. if (sad > min_sofar)
  200. return INT_MAX;
  201. p1 += h_length - 8;
  202. p2 += 16 - 8;
  203. }
  204. return sad;
  205. }
  206. Void
  207. LoadArea(
  208. SInt *im,   
  209. Int x,   
  210. Int y,   
  211. Int x_size,   
  212. Int y_size,   
  213. Int lx,   
  214. SInt *block   
  215. )
  216. {
  217. SInt   *in;
  218. SInt   *out;
  219. Int    i = x_size;
  220. Int    j = y_size;
  221. in = im + (y*lx) + x;
  222. out = block;
  223. while (j--)
  224. {
  225. while (i--)
  226. *out++ = *in++;
  227. i = x_size;
  228. in += lx - x_size;
  229. }
  230. return;
  231. }
  232. Void
  233. SetArea(
  234. SInt   *block,   
  235. Int    x,   
  236. Int    y,   
  237. Int    x_size,   
  238. Int    y_size,   
  239. Int    lx,   
  240. SInt   *im   
  241. )
  242. {
  243. SInt   *in;
  244. SInt   *out;
  245. Int    i = x_size;
  246. Int    j = y_size;
  247. in  = block;
  248. out = im + (y*lx) + x;
  249. while (j--)
  250. {
  251. while (i--)
  252. *out++ = *in++;
  253. i = x_size;
  254. out += lx - x_size;
  255. }
  256. }