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

多媒体编程

开发平台:

Visual C++

  1. #include "mom_util.h"
  2. Char *emalloc(Int n);
  3. Char *ecalloc(Int n, Int s);
  4. Char *erealloc(Char *p, Int n);
  5. Void CopyImageI(ImageI *image_in, ImageI *image_out);
  6. Void CopyImageF(ImageF *image_in, ImageF *image_out);
  7. Void SetConstantImageI(ImageI *image, SInt val);
  8. Void SetConstantImageF(ImageF *image, Float val);
  9. Void SubImageI(ImageI *image_in1, ImageI *image_in2, ImageI *image_out);
  10. Void SubImageF(ImageF *image_in1, ImageF *image_in2, ImageF *image_out);
  11. Image *
  12. AllocImage(UInt size_x, UInt size_y, ImageType type)
  13. {
  14.   Image *image;
  15.   
  16.   image = (Image *) emalloc(sizeof(Image));
  17.   
  18.   image->version = VERSION;
  19.   image->x = size_x;
  20.   image->y = size_y;
  21.   image->upperodd = 0;
  22.   image->grid = 's';
  23.   image->type = type;
  24.   image->data = (ImageData *) emalloc(sizeof(ImageData)); 
  25.   
  26.   switch(type)
  27.     {
  28.     case SHORT_TYPE:
  29.       image->data->s = (SInt *) ecalloc(size_x*size_y,sizeof(SInt));
  30.       break;
  31.     case FLOAT_TYPE:
  32.       image->data->f = (Float *) ecalloc(size_x*size_y,sizeof(Float));
  33.       break;
  34.     case UCHAR_TYPE:
  35.       image->data->u = (UChar *) ecalloc(size_x*size_y,sizeof(UChar));
  36.       break;
  37.     }
  38.   
  39.   image->f = image->data->s;
  40.   
  41.   return(image);
  42. }
  43. Void
  44. FreeImage(Image *image)
  45. {
  46.   SInt *ps;
  47.   Float *pf;
  48.   UChar  *pu;
  49.   if (image == NULL) return;
  50.   switch(image->type)
  51.     {
  52.     case SHORT_TYPE:
  53.       ps = (SInt *)GetImageData(image);
  54.       if(ps != NULL) free((Char *)ps);
  55.       free((Char *) image->data);
  56.       free((Char *)image);
  57.       break;
  58.     case FLOAT_TYPE:
  59.       pf = (Float *)GetImageData(image);
  60.       if(pf != NULL) free((Char *)pf);
  61.       free((Char *) image->data);
  62.       free((Char *)image);
  63.       break;
  64.     case UCHAR_TYPE:
  65.       pu = (UChar *)GetImageData(image);
  66.       if(pu != NULL) free((Char *)pu);
  67.       free((Char *) image->data);
  68.       free((Char *)image);
  69.       break;
  70.     }
  71. }
  72. Void
  73. CopyImage(Image *image_in, Image *image_out)
  74. {
  75.   switch(image_out->type)
  76.     {
  77.     case SHORT_TYPE:
  78.       CopyImageI(image_in,image_out);
  79.       break;
  80.     case FLOAT_TYPE:
  81.       CopyImageF(image_in,image_out);
  82.       break;
  83.     }
  84. }
  85. Void
  86. CopyImageI(ImageI *image_in, ImageI *image_out)
  87. {
  88.   SInt  *p_in  = image_in->data->s,
  89. *p_out = image_out->data->s,
  90. *p_end;
  91.   UInt sx_in  = image_in->x,
  92. sx_out = image_out->x,
  93. sy_in  = image_in->y,
  94. sy_out = image_out->y,
  95. sxy_in = sx_in * sy_in;
  96.   p_end = p_in + sxy_in;
  97.   while (p_in != p_end) 
  98.     {
  99.       *p_out = *p_in;
  100.       p_in++;
  101.       p_out++;
  102.     }
  103. }
  104. Void
  105. CopyImageF(ImageF *image_in, ImageF *image_out)
  106. {
  107.   Float *p_in  = image_in->data->f,
  108. *p_out = image_out->data->f,
  109. *p_end;
  110.   UInt  sx_in = image_in->x,
  111. sx_out = image_out->x,
  112. sy_in = image_in->y,
  113. sy_out = image_out->y,
  114. sxy_in = sx_in * sy_in;
  115.   p_end = p_in + sxy_in;
  116.   while (p_in != p_end) 
  117.     {
  118.       *p_out = *p_in;
  119.       p_in++;
  120.       p_out++;
  121.     }
  122. }
  123. Void
  124. SetConstantImage(Image *image, Float val)
  125. {
  126.   switch(image->type)
  127.     {
  128.     case SHORT_TYPE:
  129.       SetConstantImageI(image,(SInt)val);
  130.       break;
  131.     case FLOAT_TYPE:
  132.       SetConstantImageF(image,val);
  133.       break;
  134.     }
  135. }
  136. Void
  137. SetConstantImageI(ImageI *image, SInt val)
  138. {
  139.   SInt *p  = image->data->s,
  140.         *p_end;
  141.   UInt sxy = image->x * image->y;
  142.   if (val == 0)
  143.   memset (p, 0, sxy * 2);
  144.   else
  145.   {
  146. p_end = p + sxy;
  147. while (p != p_end)
  148. {
  149. *p = val;
  150. p++;
  151.     }
  152.   }
  153. }
  154. Void
  155. SetConstantImageF(ImageF *image, Float val)
  156. {
  157.   Float *p  = image->data->f,
  158.             *p_end;
  159.   UInt sxy = image->x * image->y;
  160.   p_end = p + sxy;
  161.   while (p != p_end)
  162.     {
  163.       *p = val;
  164.       p++;
  165.     }
  166. }
  167. Void
  168. SubImage(Image *image_in1, Image *image_in2, Image *image_out)
  169. {
  170.   switch(image_in1->type)
  171.     {
  172.     case SHORT_TYPE:
  173.       SubImageI(image_in1,image_in2,image_out);
  174.       break;
  175.     case FLOAT_TYPE:
  176.       SubImageF(image_in1,image_in2,image_out);
  177.       break;
  178.     }
  179. }
  180. Void
  181. SubImageI(ImageI *image_in1, ImageI *image_in2, ImageI *image_out)
  182. {
  183.   SInt *p  = image_out->data->s,
  184. *p1 = image_in1->data->s,
  185. *p2 = image_in2->data->s,
  186. *p_end;
  187.   UInt sx_in1 = image_in1->x,
  188. sx_in2 = image_in2->x,
  189. sx_out = image_out->x,
  190. sy_in1 = image_in1->y,
  191. sy_in2 = image_in2->y,
  192. sy_out = image_out->y,
  193. sxy    = sx_out * sy_out;
  194.   p_end = p + sxy;
  195.   while (p != p_end)
  196.     {
  197.       *p = *p1 - *p2;
  198.       p++;
  199.       p1++;
  200.       p2++;
  201.     }
  202. }
  203. Void
  204. SubImageF(ImageF *image_in1, ImageF *image_in2, ImageF *image_out)
  205. {
  206.   Float *p  = image_out->data->f,
  207. *p1 = image_in1->data->f,
  208. *p2 = image_in2->data->f,
  209. *p_end;
  210.   UInt sx_in1 = image_in1->x,
  211. sx_in2 = image_in2->x,
  212. sx_out = image_out->x,
  213. sy_in1 = image_in1->y,
  214. sy_in2 = image_in2->y,
  215. sy_out = image_out->y,
  216. sxy    = sx_out * sy_out;
  217.   p_end = p + sxy;
  218.   while (p != p_end)
  219.     {
  220.       *p = *p1 - *p2;
  221.       p++;
  222.       p1++;
  223.       p2++;
  224.     }
  225. }
  226. Vop *
  227. SallocVop()
  228. {
  229. Vop   *vop;
  230. vop = (Vop *)ecalloc(1,sizeof(Vop));
  231. return(vop);
  232. }
  233. Vop *
  234. AllocVop(UInt x, UInt y)
  235. {
  236.   Vop *vop;
  237.   Image *y_chan,
  238. *u_chan,
  239. *v_chan; 
  240.   
  241.   vop = SallocVop();
  242.   vop->width = x;
  243.   vop->height = y;
  244.   
  245.   y_chan = AllocImage(x,y,SHORT_TYPE);
  246.   u_chan = AllocImage(x/2,y/2,SHORT_TYPE);
  247.   v_chan = AllocImage(x/2,y/2,SHORT_TYPE);
  248.   
  249.   FreeImage(vop->y_chan);
  250.   vop->y_chan = y_chan;
  251.   FreeImage(vop->u_chan);
  252.   vop->u_chan = u_chan;
  253.   FreeImage(vop->v_chan);
  254.   vop->v_chan = v_chan;
  255.   return(vop);
  256. }
  257. Void
  258. SfreeVop (Vop *vop)
  259. {
  260. free ((Char*)vop);
  261. return;
  262. }
  263. Void
  264. FreeVop(Vop *vop)
  265. {
  266.   Image *data=NULL; 
  267.   if(vop != NULL) {
  268.     
  269.     data = vop->y_chan;
  270.     FreeImage(data);
  271.     data = vop->u_chan;
  272.     FreeImage(data);
  273.     data = vop->v_chan;
  274.     FreeImage(data);
  275.     SfreeVop(vop);
  276.   }
  277.   return;
  278. }
  279. Void
  280. CopyVopNonImageField(Vop *in,Vop *out)
  281. {
  282. out->prediction_type = in->prediction_type;
  283. }
  284. Char *
  285. emalloc(Int n)
  286. {
  287.   Char  *p;
  288.   p = (Char *) malloc((UInt)n);
  289.   return p;
  290. }
  291. Char *
  292. ecalloc(Int n, Int s)
  293. {
  294.   Char  *p;
  295.   p = (Char *) calloc((UInt)n,(UInt)s);
  296.   return p;
  297. }
  298. Char *
  299. erealloc(Char *p, Int n)
  300. {
  301.   p = (Char *) realloc(p,(UInt)n);
  302.   return p;
  303. }