mom_util.c
上传用户:enenge
上传日期:2007-01-08
资源大小:96k
文件大小:15k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**************************************************************************
  2.  *                                                                        *
  3.  * This code is developed by Adam Li.  This software is an                *
  4.  * implementation of a part of one or more MPEG-4 Video tools as          *
  5.  * specified in ISO/IEC 14496-2 standard.  Those intending to use this    *
  6.  * software module in hardware or software products are advised that its  *
  7.  * use may infringe existing patents or copyrights, and any such use      *
  8.  * would be at such party's own risk.  The original developer of this     *
  9.  * software module and his/her company, and subsequent editors and their  *
  10.  * companies (including Project Mayo), will have no liability for use of  *
  11.  * this software or modifications or derivatives thereof.                 *
  12.  *                                                                        *
  13.  * Project Mayo gives users of the Codec a license to this software       *
  14.  * module or modifications thereof for use in hardware or software        *
  15.  * products claiming conformance to the MPEG-4 Video Standard as          *
  16.  * described in the Open DivX license.                                    *
  17.  *                                                                        *
  18.  * The complete Open DivX license can be found at                         *
  19.  * http://www.projectmayo.com/opendivx/license.php .                      *
  20.  *                                                                        *
  21.  **************************************************************************/
  22. /**************************************************************************
  23.  *
  24.  *  mom_util.c
  25.  *
  26.  *  Copyright (C) 2001  Project Mayo
  27.  *
  28.  *  Adam Li
  29.  *
  30.  *  DivX Advance Research Center <darc@projectmayo.com>
  31.  *
  32.  **************************************************************************/
  33. /* This file contains some utility functions to manipulate Image data     */
  34. /* structures.                                                            */
  35. /* Some codes of this project come from MoMuSys MPEG-4 implementation.    */
  36. /* Please see seperate acknowledgement file for a list of contributors.   */
  37. #include "mom_util.h"
  38. /* private prototypes */
  39. Char *emalloc(Int n);
  40. Char *ecalloc(Int n, Int s);
  41. Char *erealloc(Char *p, Int n);
  42. Void CopyImageI(ImageI *image_in, ImageI *image_out);
  43. Void CopyImageF(ImageF *image_in, ImageF *image_out);
  44. Void SetConstantImageI(ImageI *image, SInt val);
  45. Void SetConstantImageF(ImageF *image, Float val);
  46. Void SubImageI(ImageI *image_in1, ImageI *image_in2, ImageI *image_out);
  47. Void SubImageF(ImageF *image_in1, ImageF *image_in2, ImageF *image_out);
  48. /* The following is the Image maintance functions. */
  49. /***********************************************************CommentBegin******
  50.  *
  51.  * -- AllocImage -- Allocates memory for an Image structure
  52.  *
  53.  * Purpose :
  54.  * Allocates memory for an Image structure, including memory
  55.  * for the actual image pixels. The image pixels can be of type
  56.  * UChar, SInt or Float depending on the parameter type.
  57.  * 
  58.  * Return values :
  59.  * A pointer to the allocated Image structure.
  60.  *
  61.  * Description :
  62.  * Allocates memory for the Image if possible, otherwise a 
  63.  * memory allocation error is signalled and the program will
  64.  * exit.
  65.  *
  66.  ***********************************************************CommentEnd********/
  67. Image *
  68. AllocImage(UInt size_x, UInt size_y, ImageType type)
  69. {
  70.   Image *image;
  71.   
  72.   image = (Image *) emalloc(sizeof(Image));
  73.   
  74.   image->version = VERSION;
  75.   image->x = size_x;
  76.   image->y = size_y;
  77.   image->upperodd = 0;
  78.   image->grid = 's';
  79.   image->type = type;
  80.   image->data = (ImageData *) emalloc(sizeof(ImageData)); 
  81.   
  82.   switch(type)
  83.     {
  84.     case SHORT_TYPE:
  85.       image->data->s = (SInt *) ecalloc(size_x*size_y,sizeof(SInt));
  86.       break;
  87.     case FLOAT_TYPE:
  88.       image->data->f = (Float *) ecalloc(size_x*size_y,sizeof(Float));
  89.       break;
  90.     case UCHAR_TYPE:
  91.       image->data->u = (UChar *) ecalloc(size_x*size_y,sizeof(UChar));
  92.       break;
  93.     }
  94.   
  95.   image->f = image->data->s; /* For compatibility with KHOROS */
  96.   
  97.   return(image);
  98. }
  99. /***********************************************************CommentBegin******
  100.  *
  101.  * -- FreeImage -- Frees up all the memory associated with an Image structure
  102.  *
  103.  * Purpose :
  104.  * Frees up all the memory associated with an Image structure
  105.  * 
  106.  ***********************************************************CommentEnd********/
  107. Void
  108. FreeImage(Image *image)
  109. {
  110.   SInt *ps;
  111.   Float *pf;
  112.   UChar  *pu;
  113.   if (image == NULL) return;
  114.   switch(image->type)
  115.     {
  116.     case SHORT_TYPE:
  117.       ps = (SInt *)GetImageData(image);
  118.       if(ps != NULL) free((Char *)ps);
  119.       free((Char *) image->data);
  120.       free((Char *)image);
  121.       break;
  122.     case FLOAT_TYPE:
  123.       pf = (Float *)GetImageData(image);
  124.       if(pf != NULL) free((Char *)pf);
  125.       free((Char *) image->data);
  126.       free((Char *)image);
  127.       break;
  128.     case UCHAR_TYPE:
  129.       pu = (UChar *)GetImageData(image);
  130.       if(pu != NULL) free((Char *)pu);
  131.       free((Char *) image->data);
  132.       free((Char *)image);
  133.       break;
  134.     }
  135. }
  136. /***********************************************************CommentBegin******
  137.  *
  138.  * -- CopyImage -- Copies the pixel values of one image to another image
  139.  *
  140.  * Purpose :
  141.  * Copies the pixel values of one image to another image.
  142.  * 
  143.  * Description :
  144.  * Currently, the function exits with an error if
  145.  * the source and destination images are not of the same allocated
  146.  * size and type.
  147.  *
  148.  * Also, the images of type UChar are not yet supported.
  149.  *
  150.  ***********************************************************CommentEnd********/
  151. Void
  152. CopyImage(Image *image_in, Image *image_out)
  153. {
  154.   switch(image_out->type)
  155.     {
  156.     case SHORT_TYPE:
  157.       CopyImageI(image_in,image_out);
  158.       break;
  159.     case FLOAT_TYPE:
  160.       CopyImageF(image_in,image_out);
  161.       break;
  162.     }
  163. }
  164. /***********************************************************CommentBegin******
  165.  *
  166.  * -- CopyImageI -- 
  167.  *
  168.  ***********************************************************CommentEnd********/
  169. Void
  170. CopyImageI(ImageI *image_in, ImageI *image_out)
  171. {
  172.   SInt  *p_in  = image_in->data->s,
  173. *p_out = image_out->data->s,
  174. *p_end;
  175.   UInt sx_in  = image_in->x,
  176. sx_out = image_out->x,
  177. sy_in  = image_in->y,
  178. sy_out = image_out->y,
  179. sxy_in = sx_in * sy_in;
  180.   p_end = p_in + sxy_in;
  181.   while (p_in != p_end) 
  182.     {
  183.       *p_out = *p_in;
  184.       p_in++;
  185.       p_out++;
  186.     }
  187. }
  188. /***********************************************************CommentBegin******
  189.  *
  190.  * -- CopyImageF -- Copies image_in to image_out
  191.  *
  192.  ***********************************************************CommentEnd********/
  193. Void
  194. CopyImageF(ImageF *image_in, ImageF *image_out)
  195. {
  196.   Float *p_in  = image_in->data->f,
  197. *p_out = image_out->data->f,
  198. *p_end;
  199.   UInt  sx_in = image_in->x,
  200. sx_out = image_out->x,
  201. sy_in = image_in->y,
  202. sy_out = image_out->y,
  203. sxy_in = sx_in * sy_in;
  204.   p_end = p_in + sxy_in;
  205.   while (p_in != p_end) 
  206.     {
  207.       *p_out = *p_in;
  208.       p_in++;
  209.       p_out++;
  210.     }
  211. }
  212. /***********************************************************CommentBegin******
  213.  *
  214.  * -- SetConstantImage -- Sets each pixel in the Image to val
  215.  *
  216.  * Purpose :
  217.  * Sets each pixel in the Image to val.
  218.  * 
  219.  * Side effects :
  220.  * Note val is a Float. If image is not a Float image then
  221.  * val is cast to the appropriate type i.e. SInt, unsigned
  222.  * Char.
  223.  *
  224.  * Description :
  225.  * Images of type UChar are not yet supported.
  226.  *
  227.  ***********************************************************CommentEnd********/
  228. Void
  229. SetConstantImage(Image *image, Float val)
  230. {
  231.   switch(image->type)
  232.     {
  233.     case SHORT_TYPE:
  234.       SetConstantImageI(image,(SInt)val);
  235.       break;
  236.     case FLOAT_TYPE:
  237.       SetConstantImageF(image,val);
  238.       break;
  239.     }
  240. }
  241. /***********************************************************CommentBegin******
  242.  *
  243.  * -- SetConstantImageI -- 
  244.  *
  245.  ***********************************************************CommentEnd********/
  246. Void
  247. SetConstantImageI(ImageI *image, SInt val)
  248. {
  249.   SInt *p  = image->data->s,
  250.         *p_end;
  251.   UInt sxy = image->x * image->y;
  252.   if (val == 0)
  253.   memset (p, 0, sxy * 2);
  254.   else
  255.   {
  256. p_end = p + sxy;
  257. while (p != p_end)
  258. {
  259. *p = val;
  260. p++;
  261.     }
  262.   }
  263. }
  264. /***********************************************************CommentBegin******
  265.  *
  266.  * -- SetConstantImageF -- 
  267.  *
  268.  ***********************************************************CommentEnd********/
  269. Void
  270. SetConstantImageF(ImageF *image, Float val)
  271. {
  272.   Float *p  = image->data->f,
  273.             *p_end;
  274.   UInt sxy = image->x * image->y;
  275.   p_end = p + sxy;
  276.   while (p != p_end)
  277.     {
  278.       *p = val;
  279.       p++;
  280.     }
  281. }
  282. /***********************************************************CommentBegin******
  283.  *
  284.  * -- SubImage -- Subtracts two images
  285.  *
  286.  * Purpose :
  287.  * Subtracts two images and stores the result in the third
  288.  *  i.e. image_out = image_in1 - image_in2
  289.  * 
  290.  * Description :
  291.  * Currently, the function exits with an error if
  292.  * the source and destination images are not of the same allocated
  293.  * size and type.
  294.  *
  295.  * Also, the images of type UChar are not yet supported.
  296.  *
  297.  ***********************************************************CommentEnd********/
  298. Void
  299. SubImage(Image *image_in1, Image *image_in2, Image *image_out)
  300. {
  301.   switch(image_in1->type)
  302.     {
  303.     case SHORT_TYPE:
  304.       SubImageI(image_in1,image_in2,image_out);
  305.       break;
  306.     case FLOAT_TYPE:
  307.       SubImageF(image_in1,image_in2,image_out);
  308.       break;
  309.     }
  310. }
  311. /***********************************************************CommentBegin******
  312.  *
  313.  * -- SubImageI -- 
  314.  *
  315.  ***********************************************************CommentEnd********/
  316. Void
  317. SubImageI(ImageI *image_in1, ImageI *image_in2, ImageI *image_out)
  318. {
  319.   SInt *p  = image_out->data->s,
  320. *p1 = image_in1->data->s,
  321. *p2 = image_in2->data->s,
  322. *p_end;
  323.   UInt sx_in1 = image_in1->x,
  324. sx_in2 = image_in2->x,
  325. sx_out = image_out->x,
  326. sy_in1 = image_in1->y,
  327. sy_in2 = image_in2->y,
  328. sy_out = image_out->y,
  329. sxy    = sx_out * sy_out;
  330.   p_end = p + sxy;
  331.   while (p != p_end)
  332.     {
  333.       *p = *p1 - *p2;
  334.       p++;
  335.       p1++;
  336.       p2++;
  337.     }
  338. }
  339. /***********************************************************CommentBegin******
  340.  *
  341.  * -- SubImageF -- 
  342.  *
  343.  ***********************************************************CommentEnd********/
  344. Void
  345. SubImageF(ImageF *image_in1, ImageF *image_in2, ImageF *image_out)
  346. {
  347.   Float *p  = image_out->data->f,
  348. *p1 = image_in1->data->f,
  349. *p2 = image_in2->data->f,
  350. *p_end;
  351.   UInt sx_in1 = image_in1->x,
  352. sx_in2 = image_in2->x,
  353. sx_out = image_out->x,
  354. sy_in1 = image_in1->y,
  355. sy_in2 = image_in2->y,
  356. sy_out = image_out->y,
  357. sxy    = sx_out * sy_out;
  358.   p_end = p + sxy;
  359.   while (p != p_end)
  360.     {
  361.       *p = *p1 - *p2;
  362.       p++;
  363.       p1++;
  364.       p2++;
  365.     }
  366. }
  367. /* The following is Vop maintance functions. */
  368. Vop *
  369. SallocVop()
  370. {
  371. Vop   *vop;
  372. vop = (Vop *)ecalloc(1,sizeof(Vop));
  373. return(vop);
  374. }
  375. Vop *
  376. AllocVop(UInt x, UInt y)
  377. {
  378.   Vop *vop;
  379.   Image *y_chan,
  380. *u_chan,
  381. *v_chan; 
  382.   /* first allocate memory for the data structure */
  383.   vop = SallocVop();
  384.   vop->width = x;
  385.   vop->height = y;
  386.   /* Allocate image fields */
  387.   y_chan = AllocImage(x,y,SHORT_TYPE);
  388.   u_chan = AllocImage(x/2,y/2,SHORT_TYPE);
  389.   v_chan = AllocImage(x/2,y/2,SHORT_TYPE);
  390.   /* Include image fields in structure */
  391.   FreeImage(vop->y_chan);
  392.   vop->y_chan = y_chan;
  393.   FreeImage(vop->u_chan);
  394.   vop->u_chan = u_chan;
  395.   FreeImage(vop->v_chan);
  396.   vop->v_chan = v_chan;
  397.   return(vop);
  398. }
  399. Void
  400. SfreeVop (Vop *vop)
  401. {
  402. free ((Char*)vop);
  403. /* vop = NULL; */
  404. return;
  405. }
  406. Void
  407. FreeVop(Vop *vop)
  408. {
  409.   Image *data=NULL; /*SpSc: added the initialization */
  410.   if(vop != NULL) {
  411.     /* Deallocate memory for image fields */
  412.     data = vop->y_chan;
  413.     FreeImage(data);
  414.     data = vop->u_chan;
  415.     FreeImage(data);
  416.     data = vop->v_chan;
  417.     FreeImage(data);
  418.     SfreeVop(vop);
  419.   }
  420.   return;
  421. }
  422. Void
  423. CopyVopNonImageField(Vop *in,Vop *out)
  424. {
  425. /* out->quant_precision = in->quant_precision;
  426. out->bits_per_pixel = in->bits_per_pixel;
  427. */
  428. // out->mod_time_base = in->mod_time_base;
  429. // out->time_inc = in->time_inc;
  430. out->prediction_type = in->prediction_type;
  431. /* out->rounding_type = in->rounding_type;
  432. out->width = in->width;
  433. out->height = in->height;
  434. out->hor_spat_ref = in->hor_spat_ref;
  435. out->ver_spat_ref = in->ver_spat_ref;
  436. out->quantizer = in->quantizer;
  437. out->intra_quantizer = in->intra_quantizer;
  438. out->time_increment_resolution = in->time_increment_resolution;
  439. out->intra_acdc_pred_disable = in->intra_acdc_pred_disable;
  440. out->fcode_for = in->fcode_for;
  441. out->sr_for = in->sr_for;
  442. out->intra_dc_vlc_thr = in->intra_dc_vlc_thr;
  443. */
  444. }
  445. /* The following is Memory allocation functions. */
  446. /***********************************************************CommentBegin******
  447.  *
  448.  * -- emalloc -- Memory allocation with error handling
  449.  *
  450.  * Purpose :
  451.  * Memory allocation with error handling.
  452.  * 
  453.  * Description :
  454.  * WARNING: There is a problem when you want to allocate more memory
  455.  * than size can handle.  Malloc gets as argument an unsigned.  It poses
  456.  * a problem when sizeof(unsigned) < sizeof(Char *)...
  457.  *
  458.  ***********************************************************CommentEnd********/
  459. Char *
  460. emalloc(Int n)
  461. {
  462.   Char  *p;
  463.   p = (Char *) malloc((UInt)n);
  464.   return p;
  465. }
  466. /***********************************************************CommentBegin******
  467.  *
  468.  * -- ecalloc -- Memory allocation with error handling
  469.  *
  470.  * Purpose :
  471.  * Memory allocation with error handling.
  472.  * 
  473.  * Description :
  474.  * WARNING: There is a problem when you want to allocate more memory
  475.  * than size can handle.  Malloc gets as argument an unsigned.  It poses
  476.  * a problem when sizeof(unsigned) < sizeof(Char *)...
  477.  *
  478.  ***********************************************************CommentEnd********/
  479. Char *
  480. ecalloc(Int n, Int s)
  481. {
  482.   Char  *p;
  483.   p = (Char *) calloc((UInt)n,(UInt)s);
  484.   return p;
  485. }
  486. /***********************************************************CommentBegin******
  487.  *
  488.  * -- erealloc -- Memory re-allocation with error handling.
  489.  *
  490.  * Purpose :
  491.  * Memory re-allocation with error handling
  492.  * 
  493.  * Description :
  494.  * WARNING: There is a problem when you want to allocate more memory
  495.  * than size can handle.  Malloc gets as argument an unsigned.  It poses
  496.  * a problem when sizeof(unsigned) < sizeof(Char *)...
  497.  *
  498.  ***********************************************************CommentEnd********/
  499. Char *
  500. erealloc(Char *p, Int n)
  501. {
  502.   p = (Char *) realloc(p,(UInt)n);
  503.   return p;
  504. }