memalloc.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:32k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  ************************************************************************
  3.  * file  memalloc.c
  4.  *
  5.  * brief
  6.  *    Memory allocation and free helper functions
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  ************************************************************************
  11.  */
  12. #include "memalloc.h"
  13. /*!
  14.  ************************************************************************
  15.  * brief
  16.  *    Allocate 2D memory array -> imgpel array2D[rows][columns]
  17.  *
  18.  * par Output:
  19.  *    memory size in bytes
  20.  ************************************************************************/
  21. int get_mem2Dpel(imgpel ***array2D, int dim0, int dim1)
  22. {
  23.   int i;
  24.   if((*array2D    = (imgpel**)calloc(dim0,       sizeof(imgpel*))) == NULL)
  25.     no_mem_exit("get_mem2Dpel: array2D");
  26.   if((*(*array2D) = (imgpel* )calloc(dim0 * dim1,sizeof(imgpel ))) == NULL)
  27.     no_mem_exit("get_mem2Dpel: array2D");
  28.   for(i = 1 ; i < dim0; i++)
  29.     (*array2D)[i] =  (*array2D)[i-1] + dim1;
  30.   return dim0 * dim1 * sizeof(imgpel);
  31. }
  32. /*!
  33.  ************************************************************************
  34.  * brief
  35.  *    Allocate 3D memory array -> imgpel array3D[frames][rows][columns]
  36.  *
  37.  * par Output:
  38.  *    memory size in bytes
  39.  ************************************************************************
  40.  */
  41. int get_mem3Dpel(imgpel ****array3D, int dim0, int dim1, int dim2)
  42. {
  43.   int i;
  44.   if(((*array3D) = (imgpel***)calloc(dim0,sizeof(imgpel**))) == NULL)
  45.     no_mem_exit("get_mem3Dpel: array3D");
  46.   get_mem2Dpel(*array3D, dim0 * dim1, dim2);
  47.   for(i = 1; i < dim0; i++)
  48.     (*array3D)[i] = (*array3D)[i - 1] + dim1;
  49.   
  50.   return dim0 * dim1 * dim2 * sizeof(imgpel);
  51. }
  52. /*!
  53.  ************************************************************************
  54.  * brief
  55.  *    Allocate 4D memory array -> imgpel array4D[sub_x][sub_y][rows][columns]
  56.  *
  57.  * par Output:
  58.  *    memory size in bytes
  59.  ************************************************************************
  60.  */
  61. int get_mem4Dpel(imgpel *****array4D, int dim0, int dim1, int dim2, int dim3)
  62. {  
  63.   int  i;
  64.   if(((*array4D) = (imgpel****)calloc(dim0, sizeof(imgpel***))) == NULL)
  65.     no_mem_exit("get_mem4Dpel: array4D");
  66.   get_mem3Dpel(*array4D, dim0 * dim1, dim2, dim3);
  67.   for(i = 1; i < dim0; i++)
  68.     (*array4D)[i] = (*array4D)[i - 1] + dim1;
  69.   return dim0 * dim1 * dim2 * dim3 * sizeof(imgpel);
  70. }
  71. /*!
  72.  ************************************************************************
  73.  * brief
  74.  *    Allocate 5D memory array -> imgpel array5D[dims][sub_x][sub_y][rows][columns]
  75.  *
  76.  * par Output:
  77.  *    memory size in bytes
  78.  ************************************************************************
  79.  */
  80. int get_mem5Dpel(imgpel ******array5D, int dim0, int dim1, int dim2, int dim3, int dim4)
  81. {
  82.   int  i;
  83.   if(((*array5D) = (imgpel*****)calloc(dim0, sizeof(imgpel****))) == NULL)
  84.     no_mem_exit("get_mem5Dpel: array5D");
  85.   get_mem4Dpel(*array5D, dim0 * dim1, dim2, dim3, dim4);
  86.   for(i = 1; i < dim0; i++)
  87.     (*array5D)[i] = (*array5D)[i - 1] + dim1;
  88.   return dim0 * dim1 * dim2 * dim3 * dim4 * sizeof(imgpel);
  89. }
  90. /*!
  91.  ************************************************************************
  92.  * brief
  93.  *    free 2D memory array
  94.  *    which was allocated with get_mem2Dpel()
  95.  ************************************************************************
  96.  */
  97. void free_mem2Dpel(imgpel **array2D)
  98. {
  99.   if (array2D)
  100.   {
  101.     if (*array2D)
  102.       free (*array2D);
  103.     else error ("free_mem2Dpel: trying to free unused memory",100);
  104.     free (array2D);
  105.   } 
  106.   else
  107.   {
  108.     error ("free_mem2Dpel: trying to free unused memory",100);
  109.   }
  110. }
  111. /*!
  112.  ************************************************************************
  113.  * brief
  114.  *    free 3D memory array
  115.  *    which was allocated with get_mem3Dpel()
  116.  ************************************************************************
  117.  */
  118. void free_mem3Dpel(imgpel ***array3D)
  119. {
  120.   if (array3D)
  121.   {
  122.     free_mem2Dpel(*array3D);
  123.     free (array3D);
  124.   }
  125.   else
  126.   {
  127.     error ("free_mem3Dpel: trying to free unused memory",100);
  128.   }
  129. }
  130. /*!
  131.  ************************************************************************
  132.  * brief
  133.  *    free 4D memory array
  134.  *    which was allocated with get_mem4Dpel()
  135.  ************************************************************************
  136.  */
  137. void free_mem4Dpel(imgpel ****array4D)
  138. {
  139.   if (array4D)
  140.   {
  141.     free_mem3Dpel(*array4D);
  142.     free (array4D);
  143.   }
  144.   else
  145.   {
  146.     error ("free_mem4Dpel: trying to free unused memory",100);
  147.   }
  148. }
  149. /*!
  150.  ************************************************************************
  151.  * brief
  152.  *    free 5D memory array
  153.  *    which was allocated with get_mem5Dpel()
  154.  ************************************************************************
  155.  */
  156. void free_mem5Dpel(imgpel *****array5D)
  157. {
  158.   if (array5D)
  159.   {
  160.     free_mem4Dpel(*array5D);
  161.     free (array5D);
  162.   }
  163.   else
  164.   {
  165.     error ("free_mem5Dpel: trying to free unused memory",100);
  166.   }
  167. }
  168. /*!
  169.  ************************************************************************
  170.  * brief
  171.  *    Allocate 2D memory array -> unsigned char array2D[rows][columns]
  172.  *
  173.  * par Output:
  174.  *    memory size in bytes
  175.  ************************************************************************/
  176. int get_mem2D(byte ***array2D, int dim0, int dim1)
  177. {
  178.   int i;
  179.   if((  *array2D  = (byte**)calloc(dim0,       sizeof(byte*))) == NULL)
  180.     no_mem_exit("get_mem2D: array2D");
  181.   if((*(*array2D) = (byte* )calloc(dim0 * dim1,sizeof(byte ))) == NULL)
  182.     no_mem_exit("get_mem2D: array2D");
  183.   for(i = 1; i < dim0; i++)
  184.     (*array2D)[i] = (*array2D)[i-1] + dim1;
  185.   return dim0 * dim1;
  186. }
  187. /*!
  188.  ************************************************************************
  189.  * brief
  190.  *    Allocate 2D memory array -> int array2D[rows][columns]
  191.  *
  192.  * par Output:
  193.  *    memory size in bytes
  194.  ************************************************************************
  195.  */
  196. int get_mem2Dint(int ***array2D, int dim0, int dim1)
  197. {
  198.   int i;
  199.   if((*array2D    = (int**)calloc(dim0,        sizeof(int*))) == NULL)
  200.     no_mem_exit("get_mem2Dint: array2D");
  201.   if((*(*array2D) = (int* )calloc(dim0 * dim1, sizeof(int ))) == NULL)
  202.     no_mem_exit("get_mem2Dint: array2D");
  203.   for(i = 1 ; i < dim0; i++)
  204.     (*array2D)[i] =  (*array2D)[i-1] + dim1;
  205.   return dim0 * dim1 * sizeof(int);
  206. }
  207. /*!
  208.  ************************************************************************
  209.  * brief
  210.  *    Allocate 2D memory array -> int64 array2D[rows][columns]
  211.  *
  212.  * par Output:
  213.  *    memory size in bytes
  214.  ************************************************************************
  215.  */
  216. int get_mem2Dint64(int64 ***array2D, int dim0, int dim1)
  217. {
  218.   int i;
  219.   if((*array2D    = (int64**)calloc(dim0,       sizeof(int64*))) == NULL)
  220.     no_mem_exit("get_mem2Dint64: array2D");
  221.   if((*(*array2D) = (int64* )calloc(dim0 * dim1,sizeof(int64 ))) == NULL)
  222.     no_mem_exit("get_mem2Dint64: array2D");
  223.   for(i = 1; i < dim0; i++)
  224.     (*array2D)[i] =  (*array2D)[i-1] + dim1;
  225.   return dim0 * dim1 * sizeof(int64);
  226. }
  227. /*!
  228.  ************************************************************************
  229.  * brief
  230.  *    Allocate 3D memory array -> unsigned char array3D[frames][rows][columns]
  231.  *
  232.  * par Output:
  233.  *    memory size in bytes
  234.  ************************************************************************
  235.  */
  236. int get_mem3D(byte ****array3D, int dim0, int dim1, int dim2)
  237. {
  238.   int  i;
  239.   if(((*array3D) = (byte***)calloc(dim0,sizeof(byte**))) == NULL)
  240.     no_mem_exit("get_mem3D: array3D");
  241.   get_mem2D(*array3D, dim0 * dim1, dim2);
  242.   for(i = 1; i < dim0; i++)
  243.     (*array3D)[i] =  (*array3D)[i-1] + dim1;
  244.   return dim0 * dim1 * dim2;
  245. }
  246. /*!
  247.  ************************************************************************
  248.  * brief
  249.  *    Allocate 3D memory array -> int array3D[frames][rows][columns]
  250.  *
  251.  * par Output:
  252.  *    memory size in bytes
  253.  ************************************************************************
  254.  */
  255. int get_mem3Dint(int ****array3D, int dim0, int dim1, int dim2)
  256. {
  257.   int  i;
  258.   if(((*array3D) = (int***)calloc(dim0, sizeof(int**))) == NULL)
  259.     no_mem_exit("get_mem3Dint: array3D");
  260.   get_mem2Dint(*array3D, dim0 * dim1, dim2);
  261.   for(i = 1; i < dim0; i++)
  262.     (*array3D)[i] =  (*array3D)[i-1] + dim1;
  263.   return dim0 * dim1 * dim2 * sizeof(int);
  264. }
  265. /*!
  266.  ************************************************************************
  267.  * brief
  268.  *    Allocate 3D memory array -> int64 array3D[frames][rows][columns]
  269.  *
  270.  * par Output:
  271.  *    memory size in bytes
  272.  ************************************************************************
  273.  */
  274. int get_mem3Dint64(int64 ****array3D, int dim0, int dim1, int dim2)
  275. {
  276.   int  i;
  277.   if(((*array3D) = (int64***)calloc(dim0, sizeof(int64**))) == NULL)
  278.     no_mem_exit("get_mem3Dint64: array3D");
  279.   get_mem2Dint64(*array3D, dim0 * dim1, dim2);
  280.   for(i = 1; i < dim0; i++)
  281.     (*array3D)[i] =  (*array3D)[i-1] + dim1;
  282.   return dim0 * dim1 * dim2 * sizeof(int64);
  283. }
  284. /*!
  285.  ************************************************************************
  286.  * brief
  287.  *    Allocate 4D memory array -> int array4D[frames][rows][columns][component]
  288.  *
  289.  * par Output:
  290.  *    memory size in bytes
  291.  ************************************************************************
  292.  */
  293. int get_mem4Dint(int *****array4D, int dim0, int dim1, int dim2, int dim3)
  294. {
  295.   int  i;
  296.   if(((*array4D) = (int****)calloc(dim0, sizeof(int***))) == NULL)
  297.     no_mem_exit("get_mem4Dint: array4D");
  298.   get_mem3Dint(*array4D, dim0 * dim1, dim2, dim3);
  299.   for(i = 1; i < dim0; i++)
  300.     (*array4D)[i] =  (*array4D)[i-1] + dim1;
  301.   return dim0 * dim1 * dim2 * dim3 * sizeof(int);
  302. }
  303. /*!
  304.  ************************************************************************
  305.  * brief
  306.  *    Allocate 5D memory array -> int array5D[refs][blocktype][rows][columns][component]
  307.  *
  308.  * par Output:
  309.  *    memory size in bytes
  310.  ************************************************************************
  311.  */
  312. int get_mem5Dint(int ******array5D, int dim0, int dim1, int dim2, int dim3, int dim4)
  313. {
  314.   int  i;
  315.   if(((*array5D) = (int*****)calloc(dim0, sizeof(int****))) == NULL)
  316.     no_mem_exit("get_mem5Dint: array5D");
  317.   get_mem4Dint(*array5D, dim0 * dim1, dim2, dim3, dim4);
  318.   for(i = 1; i < dim0; i++)
  319.     (*array5D)[i] =  (*array5D)[i-1] + dim1;
  320.   return dim0 * dim1 * dim2 * dim3 * dim4 * sizeof(int);
  321. }
  322. /*!
  323.  ************************************************************************
  324.  * brief
  325.  *    free 2D memory array
  326.  *    which was allocated with get_mem2D()
  327.  ************************************************************************
  328.  */
  329. void free_mem2D(byte **array2D)
  330. {
  331.   if (array2D)
  332.   {
  333.     if (*array2D)
  334.       free (*array2D);
  335.     else 
  336.       error ("free_mem2D: trying to free unused memory",100);
  337.     free (array2D);
  338.   } 
  339.   else
  340.   {
  341.     error ("free_mem2D: trying to free unused memory",100);
  342.   }
  343. }
  344. /*!
  345.  ************************************************************************
  346.  * brief
  347.  *    free 2D memory array
  348.  *    which was allocated with get_mem2Dint()
  349.  ************************************************************************
  350.  */
  351. void free_mem2Dint(int **array2D)
  352. {
  353.   if (array2D)
  354.   {
  355.     if (*array2D)
  356.       free (*array2D);
  357.     else 
  358.       error ("free_mem2Dint: trying to free unused memory",100);
  359.     free (array2D);
  360.   } 
  361.   else
  362.   {
  363.     error ("free_mem2Dint: trying to free unused memory",100);
  364.   }
  365. }
  366. /*!
  367.  ************************************************************************
  368.  * brief
  369.  *    free 2D memory array
  370.  *    which was allocated with get_mem2Dint64()
  371.  ************************************************************************
  372.  */
  373. void free_mem2Dint64(int64 **array2D)
  374. {
  375.   if (array2D)
  376.   {
  377.     if (*array2D)
  378.       free (*array2D);
  379.     else 
  380.       error ("free_mem2Dint64: trying to free unused memory",100);
  381.     free (array2D);
  382.   } 
  383.   else
  384.   {
  385.     error ("free_mem2Dint64: trying to free unused memory",100);
  386.   }
  387. }
  388. /*!
  389.  ************************************************************************
  390.  * brief
  391.  *    free 3D memory array
  392.  *    which was allocated with get_mem3D()
  393.  ************************************************************************
  394.  */
  395. void free_mem3D(byte ***array3D)
  396. {
  397.   if (array3D)
  398.   {
  399.    free_mem2D(*array3D);
  400.    free (array3D);
  401.   } 
  402.   else
  403.   {
  404.     error ("free_mem3D: trying to free unused memory",100);
  405.   }
  406. }
  407. /*!
  408.  ************************************************************************
  409.  * brief
  410.  *    free 3D memory array
  411.  *    which was allocated with get_mem3Dint()
  412.  ************************************************************************
  413.  */
  414. void free_mem3Dint(int ***array3D)
  415. {
  416.   if (array3D)
  417.   {
  418.    free_mem2Dint(*array3D);
  419.    free (array3D);
  420.   } 
  421.   else
  422.   {
  423.     error ("free_mem3Dint: trying to free unused memory",100);
  424.   }
  425. }
  426. /*!
  427.  ************************************************************************
  428.  * brief
  429.  *    free 3D memory array
  430.  *    which was allocated with get_mem3Dint64()
  431.  ************************************************************************
  432.  */
  433. void free_mem3Dint64(int64 ***array3D)
  434. {
  435.   if (array3D)
  436.   {
  437.    free_mem2Dint64(*array3D);
  438.    free (array3D);
  439.   } 
  440.   else
  441.   {
  442.     error ("free_mem3Dint64: trying to free unused memory",100);
  443.   }
  444. }
  445. /*!
  446.  ************************************************************************
  447.  * brief
  448.  *    free 4D memory array
  449.  *    which was allocated with get_mem4Dint()
  450.  ************************************************************************
  451.  */
  452. void free_mem4Dint(int ****array4D)
  453. {
  454.   if (array4D)
  455.   {
  456.     free_mem3Dint( *array4D);
  457.     free (array4D);
  458.   } else
  459.   {
  460.     error ("free_mem4Dint: trying to free unused memory",100);
  461.   }
  462. }
  463. /*!
  464.  ************************************************************************
  465.  * brief
  466.  *    free 5D int memory array
  467.  *    which was allocated with get_mem5Dint()
  468.  ************************************************************************
  469.  */
  470. void free_mem5Dint(int *****array5D)
  471. {
  472.   if (array5D)
  473.   {
  474.     free_mem4Dint( *array5D);
  475.     free (array5D);
  476.   } else
  477.   {
  478.     error ("free_mem5Dint: trying to free unused memory",100);
  479.   }
  480. }
  481. /*!
  482.  ************************************************************************
  483.  * brief
  484.  *    Exit program if memory allocation failed (using error())
  485.  * param where
  486.  *    string indicating which memory allocation failed
  487.  ************************************************************************
  488.  */
  489. void no_mem_exit(char *where)
  490. {
  491.    snprintf(errortext, ET_SIZE, "Could not allocate memory: %s",where);
  492.    error (errortext, 100);
  493. }
  494. /*!
  495.  ************************************************************************
  496.  * brief
  497.  *    Allocate 2D short memory array -> short array2D[rows][columns]
  498.  *
  499.  * par Output:
  500.  *    memory size in bytes
  501.  ************************************************************************
  502.  */
  503. int get_mem2Dshort(short ***array2D, int dim0, int dim1)
  504. {
  505.   int i;
  506.   if((  *array2D  = (short**)calloc(dim0,       sizeof(short*))) == NULL)
  507.     no_mem_exit("get_mem2Dshort: array2D");
  508.   if((*(*array2D) = (short* )calloc(dim0 * dim1,sizeof(short ))) == NULL)
  509.     no_mem_exit("get_mem2Dshort: array2D");
  510.   for(i = 1; i < dim0; i++)
  511.     (*array2D)[i] = (*array2D)[i-1] + dim1;
  512.   return dim0 * dim1 * sizeof(short);
  513. }
  514. /*!
  515.  ************************************************************************
  516.  * brief
  517.  *    Allocate 3D memory short array -> short array3D[frames][rows][columns]
  518.  *
  519.  * par Output:
  520.  *    memory size in bytes
  521.  ************************************************************************
  522.  */
  523. int get_mem3Dshort(short ****array3D,int dim0, int dim1, int dim2)
  524. {
  525.   int  i;
  526.   if(((*array3D) = (short***)calloc(dim0, sizeof(short**))) == NULL)
  527.     no_mem_exit("get_mem3Dshort: array3D");
  528.   get_mem2Dshort(*array3D, dim0 * dim1, dim2);
  529.   for(i = 1; i < dim0; i++)
  530.     (*array3D)[i] =  (*array3D)[i-1] + dim1;
  531.   return dim0 * dim1 * dim2 * sizeof(short);
  532. }
  533. /*!
  534.  ************************************************************************
  535.  * brief
  536.  *    Allocate 4D memory short array -> short array3D[frames][rows][columns][component]
  537.  *
  538.  * par Output:
  539.  *    memory size in bytes
  540.  ************************************************************************
  541.  */
  542. int get_mem4Dshort(short *****array4D, int dim0, int dim1, int dim2, int dim3)
  543. {
  544.   int  i;
  545.   if(((*array4D) = (short****)calloc(dim0, sizeof(short***))) == NULL)
  546.     no_mem_exit("get_mem4Dshort: array4D");
  547.   get_mem3Dshort(*array4D, dim0 * dim1, dim2, dim3);
  548.   for(i = 1; i < dim0; i++)
  549.     (*array4D)[i] =  (*array4D)[i-1] + dim1;
  550.   return dim0 * dim1 * dim2 * dim3 * sizeof(short);
  551. }
  552. /*!
  553.  ************************************************************************
  554.  * brief
  555.  *    Allocate 5D memory array -> short array5D[refs][blocktype][rows][columns][component]
  556.  *
  557.  * par Output:
  558.  *    memory size in bytes
  559.  ************************************************************************
  560.  */
  561. int get_mem5Dshort(short ******array5D, int dim0, int dim1, int dim2, int dim3, int dim4)
  562. {
  563.   int  i;
  564.   if(((*array5D) = (short*****)calloc(dim0, sizeof(short****))) == NULL)
  565.     no_mem_exit("get_mem5Dshort: array5D");
  566.   get_mem4Dshort(*array5D, dim0 * dim1, dim2, dim3, dim4);
  567.   for(i = 1; i < dim0; i++)
  568.     (*array5D)[i] =  (*array5D)[i-1] + dim1;
  569.   return dim0 * dim1 * dim2 * dim3 * dim4 * sizeof(short);
  570. }
  571. /*!
  572.  ************************************************************************
  573.  * brief
  574.  *    Allocate 6D memory array -> short array6D[list][refs][blocktype][rows][columns][component]
  575.  *
  576.  * par Output:
  577.  *    memory size in bytes
  578.  ************************************************************************
  579.  */
  580. int get_mem6Dshort(short *******array6D, int dim0, int dim1, int dim2, int dim3, int dim4, int dim5)
  581. {
  582.   int  i;
  583.   if(((*array6D) = (short******)calloc(dim0, sizeof(short*****))) == NULL)
  584.     no_mem_exit("get_mem6Dshort: array6D");
  585.   get_mem5Dshort(*array6D, dim0 * dim1, dim2, dim3, dim4, dim5);
  586.   for(i = 1; i < dim0; i++)
  587.     (*array6D)[i] =  (*array6D)[i-1] + dim1;
  588.   return dim0 * dim1 * dim2 * dim3 * dim4 * dim5 * sizeof(short);
  589. }
  590. /*!
  591.  ************************************************************************
  592.  * brief
  593.  *    Allocate 7D memory array -> short array7D[list][refs][blocktype][rows][columns][component]
  594.  *
  595.  * par Output:
  596.  *    memory size in bytes
  597.  ************************************************************************
  598.  */
  599. int get_mem7Dshort(short ********array7D, int dim0, int dim1, int dim2, int dim3, int dim4, int dim5, int dim6)
  600. {
  601.   int  i;
  602.   if(((*array7D) = (short*******)calloc(dim0, sizeof(short******))) == NULL)
  603.     no_mem_exit("get_mem7Dshort: array7D");
  604.   get_mem6Dshort(*array7D, dim0 * dim1, dim2, dim3, dim4, dim5, dim6);
  605.   for(i = 1; i < dim0; i++)
  606.     (*array7D)[i] =  (*array7D)[i-1] + dim1;
  607.   return dim0 * dim1 * dim2 * dim3 * dim4 * dim5 * dim6 * sizeof(short);
  608. }
  609. /*!
  610.  ************************************************************************
  611.  * brief
  612.  *    free 2D short memory array
  613.  *    which was allocated with get_mem2Dshort()
  614.  ************************************************************************
  615.  */
  616. void free_mem2Dshort(short **array2D)
  617. {
  618.   if (array2D)
  619.   {
  620.     if (*array2D)
  621.       free (*array2D);
  622.     else error ("free_mem2Dshort: trying to free unused memory",100);
  623.     free (array2D);
  624.   } 
  625.   else
  626.   {
  627.     error ("free_mem2Dshort: trying to free unused memory",100);
  628.   }
  629. }
  630. /*!
  631.  ************************************************************************
  632.  * brief
  633.  *    free 3D short memory array
  634.  *    which was allocated with get_mem3Dshort()
  635.  ************************************************************************
  636.  */
  637. void free_mem3Dshort(short ***array3D)
  638. {
  639.   if (array3D)
  640.   {
  641.    free_mem2Dshort(*array3D);
  642.    free (array3D);
  643.   } 
  644.   else
  645.   {
  646.     error ("free_mem3Dshort: trying to free unused memory",100);
  647.   }
  648. }
  649. /*!
  650.  ************************************************************************
  651.  * brief
  652.  *    free 4D short memory array
  653.  *    which was allocated with get_mem4Dshort()
  654.  ************************************************************************
  655.  */
  656. void free_mem4Dshort(short ****array4D)
  657. {  
  658.   if (array4D)
  659.   {
  660.     free_mem3Dshort( *array4D);
  661.     free (array4D);
  662.   } 
  663.   else
  664.   {
  665.     error ("free_mem4Dshort: trying to free unused memory",100);
  666.   }
  667. }
  668. /*!
  669.  ************************************************************************
  670.  * brief
  671.  *    free 5D short memory array
  672.  *    which was allocated with get_mem5Dshort()
  673.  ************************************************************************
  674.  */
  675. void free_mem5Dshort(short *****array5D)
  676. {
  677.   if (array5D)
  678.   {
  679.     free_mem4Dshort( *array5D) ;
  680.     free (array5D);
  681.   }
  682.   else
  683.   {
  684.     error ("free_mem5Dshort: trying to free unused memory",100);
  685.   }
  686. }
  687. /*!
  688.  ************************************************************************
  689.  * brief
  690.  *    free 6D short memory array
  691.  *    which was allocated with get_mem6Dshort()
  692.  ************************************************************************
  693.  */
  694. void free_mem6Dshort(short ******array6D)
  695. {
  696.   if (array6D)
  697.   {
  698.     free_mem5Dshort( *array6D);
  699.     free (array6D);
  700.   }
  701.   else
  702.   {
  703.     error ("free_mem6Dshort: trying to free unused memory",100);
  704.   }
  705. }
  706. /*!
  707.  ************************************************************************
  708.  * brief
  709.  *    free 7D short memory array
  710.  *    which was allocated with get_mem7Dshort()
  711.  ************************************************************************
  712.  */
  713. void free_mem7Dshort(short *******array7D)
  714. {
  715.   if (array7D)
  716.   {
  717.     free_mem6Dshort( *array7D);
  718.     free (array7D);
  719.   }
  720.   else
  721.   {
  722.     error ("free_mem7Dshort: trying to free unused memory",100);
  723.   }
  724. }
  725. /*!
  726.  ************************************************************************
  727.  * brief
  728.  *    Allocate 2D memory array -> double array2D[rows][columns]
  729.  *
  730.  * par Output:
  731.  *    memory size in bytes
  732.  ************************************************************************
  733.  */
  734. int get_mem2Ddouble(double ***array2D, int rows, int columns)
  735. {
  736.   int i;
  737.   if((*array2D      = (double**)calloc(rows,        sizeof(double*))) == NULL)
  738.     no_mem_exit("get_mem2Ddouble: array2D");
  739.   
  740.   if(((*array2D)[0] = (double* )calloc(rows*columns,sizeof(double ))) == NULL)
  741.     no_mem_exit("get_mem2Ddouble: array2D");
  742.   for(i=1 ; i<rows ; i++)
  743.     (*array2D)[i] =  (*array2D)[i-1] + columns  ;
  744.   return rows*columns*sizeof(double);
  745. }
  746. /*!
  747.  ************************************************************************
  748.  * brief
  749.  *    Allocate 2D memory array -> double array2D[rows][columns]
  750.  *    Note that array is shifted towards offset allowing negative values
  751.  *
  752.  * par Output:
  753.  *    memory size in bytes
  754.  ************************************************************************
  755.  */
  756. int get_mem2Dodouble(double ***array2D, int rows, int columns, int offset)
  757. {
  758.   int i;
  759.   if((*array2D      = (double**)calloc(rows,        sizeof(double*))) == NULL)
  760.     no_mem_exit("get_mem2Dodouble: array2D");
  761.   if(((*array2D)[0] = (double* )calloc(rows*columns,sizeof(double ))) == NULL)
  762.     no_mem_exit("get_mem2Dodouble: array2D");
  763.   (*array2D)[0] += offset;
  764.   for(i=1 ; i<rows ; i++)
  765.     (*array2D)[i] =  (*array2D)[i-1] + columns  ;
  766.   return rows*columns*sizeof(double);
  767. }
  768. /*!
  769.  ************************************************************************
  770.  * brief
  771.  *    Allocate 3D memory double array -> double array3D[pels][rows][columns]
  772.  *
  773.  * par Output:
  774.  *    memory size in bytes
  775.  ************************************************************************
  776.  */
  777. int get_mem3Dodouble(double ****array3D, int rows, int columns, int pels, int offset)
  778. {
  779.   int  i,j;
  780.   if(((*array3D) = (double***)calloc(rows,sizeof(double**))) == NULL)
  781.     no_mem_exit("get_mem3Dodouble: array3D");
  782.   if(((*array3D)[0] = (double** )calloc(rows*columns,sizeof(double*))) == NULL)
  783.     no_mem_exit("get_mem3Dodouble: array3D");
  784.   (*array3D) [0] += offset;
  785.   for(i=1 ; i<rows ; i++)
  786.     (*array3D)[i] =  (*array3D)[i-1] + columns  ;
  787.   for (i = 0; i < rows; i++)
  788.     for (j = -offset; j < columns - offset; j++)
  789.       if(((*array3D)[i][j] = (double* )calloc(pels,sizeof(double))) == NULL)
  790.         no_mem_exit("get_mem3Dodouble: array3D");
  791.   return rows*columns*pels*sizeof(double);
  792. }
  793. /*!
  794.  ************************************************************************
  795.  * brief
  796.  *    Allocate 2D memory array -> int array2D[rows][columns]
  797.  *    Note that array is shifted towards offset allowing negative values
  798.  *
  799.  * par Output:
  800.  *    memory size in bytes
  801.  ************************************************************************
  802.  */
  803. int get_offset_mem2Dshort(short ***array2D, int rows, int columns, int offset_y, int offset_x)
  804. {
  805.   int i;
  806.   if((*array2D      = (short**)calloc(rows, sizeof(short*))) == NULL)
  807.     no_mem_exit("get_offset_mem2Dshort: array2D");
  808.   if(((*array2D)[0] = (short* )calloc(rows * columns,sizeof(short))) == NULL)
  809.     no_mem_exit("get_offset_mem2Dshort: array2D");
  810.   (*array2D)[0] += offset_x + offset_y * columns;
  811.   for(i=-1 ; i > -offset_y - 1; i--)
  812.   {
  813.     (*array2D)[i] =  (*array2D)[i+1] - columns;
  814.   }
  815.   for(i=1 ; i < columns - offset_y; i++)
  816.     (*array2D)[i] =  (*array2D)[i-1] + columns;
  817.   return rows * columns * sizeof(short);
  818. }
  819. /*!
  820.  ************************************************************************
  821.  * brief
  822.  *    Allocate 3D memory int array -> int array3D[rows][columns][pels]
  823.  *
  824.  * par Output:
  825.  *    memory size in bytes
  826.  ************************************************************************
  827.  */
  828. int get_mem3Doint(int ****array3D, int rows, int columns, int pels, int offset)
  829. {
  830.   int  i,j;
  831.   if(((*array3D) = (int***)calloc(rows,sizeof(int**))) == NULL)
  832.     no_mem_exit("get_mem3Doint: array3D");
  833.   if(((*array3D)[0] = (int** )calloc(rows*columns,sizeof(int*))) == NULL)
  834.     no_mem_exit("get_mem3Doint: array3D");
  835.   (*array3D) [0] += offset;
  836.   for(i=1 ; i<rows ; i++)
  837.     (*array3D)[i] =  (*array3D)[i-1] + columns  ;
  838.   for (i = 0; i < rows; i++)
  839.     for (j = -offset; j < columns - offset; j++)
  840.       if(((*array3D)[i][j] = (int* )calloc(pels,sizeof(int))) == NULL)
  841.         no_mem_exit("get_mem3Doint: array3D");
  842.   return rows*columns*pels*sizeof(int);
  843. }
  844. /*!
  845.  ************************************************************************
  846.  * brief
  847.  *    Allocate 2D memory array -> int array2D[rows][columns]
  848.  *    Note that array is shifted towards offset allowing negative values
  849.  *
  850.  * par Output:
  851.  *    memory size in bytes
  852.  ************************************************************************
  853.  */
  854. int get_mem2Doint(int ***array2D, int rows, int columns, int offset)
  855. {
  856.   int i;
  857.   if((*array2D      = (int**)calloc(rows, sizeof(int*))) == NULL)
  858.     no_mem_exit("get_mem2Dint: array2D");
  859.   if(((*array2D)[0] = (int* )calloc(rows*columns,sizeof(int))) == NULL)
  860.     no_mem_exit("get_mem2Dint: array2D");
  861.   (*array2D)[0] += offset;
  862.   for(i=1 ; i<rows ; i++)
  863.     (*array2D)[i] =  (*array2D)[i-1] + columns  ;
  864.   return rows*columns*sizeof(int);
  865. }
  866. /*!
  867.  ************************************************************************
  868.  * brief
  869.  *    Allocate 3D memory array -> int array3D[frames][rows][columns]
  870.  *
  871.  * par Output:
  872.  *    memory size in bytes
  873.  ************************************************************************
  874.  */
  875. // same change as in get_mem3Dint
  876. int get_mem3Ddouble(double ****array3D, int frames, int rows, int columns)
  877. {
  878. int  j;
  879.   double **array2D;
  880.   get_mem2Ddouble(&array2D, frames * rows, columns);
  881.   if(((*array3D) = (double***)calloc(frames,sizeof(double**))) == NULL)
  882.     no_mem_exit("get_mem3Ddouble: array3D");
  883.   for(j=0;j<frames;j++)
  884.   {    
  885.     (*array3D)[j] = &array2D[j * rows];
  886.   }
  887.   return frames*rows*columns*sizeof(double);
  888. }
  889. /*!
  890.  ************************************************************************
  891.  * brief
  892.  *    free 2D double memory array
  893.  *    which was allocated with get_mem2Ddouble()
  894.  ************************************************************************
  895.  */
  896. void free_mem2Ddouble(double **array2D)
  897. {
  898.   if (array2D)
  899.   {
  900.     if (*array2D)
  901.       free (*array2D);
  902.     else 
  903.       error ("free_mem2Ddouble: trying to free unused memory",100);
  904.     free (array2D);
  905.   }
  906.   else
  907.   {
  908.     error ("free_mem2Ddouble: trying to free unused memory",100);
  909.   }
  910. }
  911. /*!
  912. ************************************************************************
  913. * brief
  914. *    free 2D double memory array (with offset)
  915. *    which was allocated with get_mem2Ddouble()
  916. ************************************************************************
  917. */
  918. void free_mem2Dodouble(double **array2D, int offset)
  919. {
  920.   if (array2D)
  921.   {
  922.     array2D[0] -= offset;
  923.     if (array2D[0])
  924.       free (array2D[0]);
  925.     else error ("free_mem2Dodouble: trying to free unused memory",100);
  926.     free (array2D);
  927.   } else
  928.   {
  929.     error ("free_mem2Dodouble: trying to free unused memory",100);
  930.   }
  931. }
  932. /*!
  933.  ************************************************************************
  934.  * brief
  935.  *    free 3D memory array with offset
  936.  ************************************************************************
  937.  */
  938. void free_mem3Dodouble(double ***array3D, int rows, int columns, int offset)
  939. {
  940.   int i, j;
  941.   if (array3D)
  942.   {
  943.     for (i = 0; i < rows; i++)
  944.     {
  945.       for (j = -offset; j < columns - offset; j++)
  946.       {
  947.         if (array3D[i][j])
  948.           free(array3D[i][j]);
  949.         else
  950.           error ("free_mem3Dodouble: trying to free unused memory",100);
  951.       }
  952.     }
  953.     array3D[0] -= offset;
  954.     if (array3D[0])
  955.       free(array3D[0]);
  956.     else
  957.       error ("free_mem3Dodouble: trying to free unused memory",100);
  958.     free (array3D);
  959.   }
  960.   else
  961.   {
  962.     error ("free_mem3Dodouble: trying to free unused memory",100);
  963.   }
  964. }
  965. /*!
  966.  ************************************************************************
  967.  * brief
  968.  *    free 3D memory array with offset
  969.  ************************************************************************
  970.  */
  971. void free_mem3Doint(int ***array3D, int rows, int columns, int offset)
  972. {
  973.   int i, j;
  974.   if (array3D)
  975.   {
  976.     for (i = 0; i < rows; i++)
  977.     {
  978.       for (j = -offset; j < columns - offset; j++)
  979.       {
  980.         if (array3D[i][j])
  981.           free(array3D[i][j]);
  982.         else
  983.           error ("free_mem3Doint: trying to free unused memory",100);
  984.       }
  985.     }
  986.     array3D[0] -= offset;
  987.     if (array3D[0])
  988.       free(array3D[0]);
  989.     else
  990.       error ("free_mem3Doint: trying to free unused memory",100);
  991.     free (array3D);
  992.   }
  993.   else
  994.   {
  995.     error ("free_mem3Doint: trying to free unused memory",100);
  996.   }
  997. }
  998. /*!
  999. ************************************************************************
  1000. * brief
  1001. *    free 2D double memory array (with offset)
  1002. *    which was allocated with get_mem2Ddouble()
  1003. ************************************************************************
  1004. */
  1005. void free_mem2Doint(int **array2D, int offset)
  1006. {
  1007.   if (array2D)
  1008.   {
  1009.     array2D[0] -= offset;
  1010.     if (array2D[0])
  1011.       free (array2D[0]);
  1012.     else 
  1013.       error ("free_mem2Doint: trying to free unused memory",100);
  1014.     free (array2D);
  1015.   } 
  1016.   else
  1017.   {
  1018.     error ("free_mem2Doint: trying to free unused memory",100);
  1019.   }
  1020. }
  1021. /*!
  1022. ************************************************************************
  1023. * brief
  1024. *    free 2D double memory array (with offset)
  1025. *    which was allocated with get_mem2Ddouble()
  1026. ************************************************************************
  1027. */
  1028. void free_offset_mem2Dshort(short **array2D, int columns, int offset_y, int offset_x)
  1029. {
  1030.   if (array2D)
  1031.   {
  1032.     array2D[0] -= offset_x + offset_y * columns;
  1033.     if (array2D[0])
  1034.       free (array2D[0]);
  1035.     else 
  1036.       error ("free_offset_mem2Dshort: trying to free unused memory",100);
  1037.     free (array2D);
  1038.   } 
  1039.   else
  1040.   {
  1041.     error ("free_offset_mem2Dshort: trying to free unused memory",100);
  1042.   }
  1043. }
  1044. /*!
  1045.  ************************************************************************
  1046.  * brief
  1047.  *    free 3D memory array
  1048.  *    which was alocated with get_mem3Dint()
  1049.  ************************************************************************
  1050.  */
  1051. void free_mem3Ddouble(double ***array3D)
  1052. {
  1053.   if (array3D)
  1054.   {
  1055.     free_mem2Ddouble(*array3D);
  1056.     free (array3D);
  1057.   } 
  1058.   else
  1059.   {
  1060.     error ("free_mem3D: trying to free unused memory",100);
  1061.   }
  1062. }