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

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 "global.h"
  13.  /*!
  14.  ************************************************************************
  15.  * brief
  16.  *    Initialize 2-dimensional top and bottom field to point to the proper
  17.  *    lines in frame
  18.  *
  19.  * par Output:
  20.  *    memory size in bytes
  21.  ************************************************************************/
  22. int init_top_bot_planes(imgpel **imgFrame, int rows, int columns, imgpel ***imgTopField, imgpel ***imgBotField)
  23. {
  24.   int i;
  25.   if((*imgTopField   = (imgpel**)calloc((rows>>1) , sizeof(imgpel*))) == NULL)
  26.     no_mem_exit("init_top_bot_planes: imgTopField");
  27.   if((*imgBotField   = (imgpel**)calloc((rows>>1) , sizeof(imgpel*))) == NULL)
  28.     no_mem_exit("init_top_bot_planes: imgBotField");
  29.   for(i = 0; i < (rows>>1); i++)
  30.   {
  31.     (*imgTopField)[i] =  imgFrame[2*i  ];
  32.     (*imgBotField)[i] =  imgFrame[2*i+1];
  33.   }
  34.   return rows*sizeof(imgpel*);
  35. }
  36.  /*!
  37.  ************************************************************************
  38.  * brief
  39.  *    free 2-dimensional top and bottom fields without freeing target memory
  40.  *
  41.  * par Output:
  42.  *    memory size in bytes
  43.  ************************************************************************/
  44. void free_top_bot_planes(imgpel **imgTopField, imgpel **imgBotField)
  45. {
  46.   free (imgTopField);
  47.   free (imgBotField);
  48. }
  49. /*!
  50.  ************************************************************************
  51.  * brief
  52.  *    Allocate 2D memory array -> LambdaParams array2D[rows][columns]
  53.  *
  54.  * par Output:
  55.  *    memory size in bytes
  56.  ************************************************************************/
  57. int get_mem2Dlm(LambdaParams ***array2D, int dim0, int dim1)
  58. {
  59.   int i;
  60.   if((*array2D    = (LambdaParams**)calloc(dim0,       sizeof(LambdaParams*))) == NULL)
  61.     no_mem_exit("get_mem2Dlm: array2D");
  62.   if((*(*array2D) = (LambdaParams* )calloc(dim0 * dim1,sizeof(LambdaParams ))) == NULL)
  63.     no_mem_exit("get_mem2Dlm: array2D");
  64.   for(i = 1 ; i < dim0; i++)
  65.     (*array2D)[i] =  (*array2D)[i-1] + dim1;
  66.   return dim0 * dim1 * sizeof(LambdaParams);
  67. }
  68. /*!
  69.  ************************************************************************
  70.  * brief
  71.  *    free 2D memory array
  72.  *    which was allocated with get_mem2Dlm()
  73.  ************************************************************************
  74.  */
  75. void free_mem2Dlm(LambdaParams **array2D)
  76. {
  77.   if (array2D)
  78.   {
  79.     if (*array2D)
  80.       free (*array2D);
  81.     else 
  82.       error ("free_mem2Dlm: trying to free unused memory",100);
  83.     free (array2D);
  84.   } 
  85.   else
  86.   {
  87.     error ("free_mem2Dlm: trying to free unused memory",100);
  88.   }
  89. }
  90. /*!
  91.  ************************************************************************
  92.  * brief
  93.  *    Allocate 2D memory array -> PicMotionParams2 array2D[rows][columns]
  94.  *
  95.  * par Output:
  96.  *    memory size in bytes
  97.  ************************************************************************/
  98. int get_mem2Dmp(PicMotionParams2 ***array2D, int dim0, int dim1)
  99. {
  100.   int i;
  101.   if((*array2D    = (PicMotionParams2**)calloc(dim0,       sizeof(PicMotionParams2*))) == NULL)
  102.     no_mem_exit("get_mem2Dmv: array2D");
  103.   if((*(*array2D) = (PicMotionParams2* )calloc(dim0 * dim1,sizeof(PicMotionParams2 ))) == NULL)
  104.     no_mem_exit("get_mem2Dmp: array2D");
  105.   for(i = 1 ; i < dim0; i++)
  106.     (*array2D)[i] =  (*array2D)[i-1] + dim1;
  107.   return dim0 * dim1 * sizeof(PicMotionParams2);
  108. }
  109. /*!
  110.  ************************************************************************
  111.  * brief
  112.  *    Allocate 3D memory array -> PicMotionParams2 array3D[frames][rows][columns]
  113.  *
  114.  * par Output:
  115.  *    memory size in bytes
  116.  ************************************************************************
  117.  */
  118. int get_mem3Dmp(PicMotionParams2 ****array3D, int dim0, int dim1, int dim2)
  119. {
  120.   int i;
  121.   if(((*array3D) = (PicMotionParams2***)calloc(dim0,sizeof(PicMotionParams2**))) == NULL)
  122.     no_mem_exit("get_mem3Dmp: array3D");
  123.   get_mem2Dmp(*array3D, dim0 * dim1, dim2);
  124.   for(i = 1; i < dim0; i++)
  125.     (*array3D)[i] = (*array3D)[i - 1] + dim1;
  126.   
  127.   return dim0 * dim1 * dim2 * sizeof(PicMotionParams2);
  128. }
  129. /*!
  130.  ************************************************************************
  131.  * brief
  132.  *    free 2D memory array
  133.  *    which was allocated with get_mem2Dmp()
  134.  ************************************************************************
  135.  */
  136. void free_mem2Dmp(PicMotionParams2 **array2D)
  137. {
  138.   if (array2D)
  139.   {
  140.     if (*array2D)
  141.       free (*array2D);
  142.     else 
  143.       error ("free_mem2Dmp: trying to free unused memory",100);
  144.     free (array2D);
  145.   } 
  146.   else
  147.   {
  148.     error ("free_mem2Dmp: trying to free unused memory",100);
  149.   }
  150. }
  151. /*!
  152.  ************************************************************************
  153.  * brief
  154.  *    free 3D memory array
  155.  *    which was allocated with get_mem3Dmp()
  156.  ************************************************************************
  157.  */
  158. void free_mem3Dmp(PicMotionParams2 ***array3D)
  159. {
  160.   if (array3D)
  161.   {
  162.     free_mem2Dmp(*array3D);
  163.     free (array3D);
  164.   }
  165.   else
  166.   {
  167.     error ("free_mem3Dmp: trying to free unused memory",100);
  168.   }
  169. }
  170. /*!
  171.  ************************************************************************
  172.  * brief
  173.  *    Allocate 2D memory array -> MotionVector array2D[rows][columns]
  174.  *
  175.  * par Output:
  176.  *    memory size in bytes
  177.  ************************************************************************/
  178. int get_mem2Dmv(MotionVector ***array2D, int dim0, int dim1)
  179. {
  180.   int i;
  181.   if((*array2D    = (MotionVector**)calloc(dim0,       sizeof(MotionVector*))) == NULL)
  182.     no_mem_exit("get_mem2Dmv: array2D");
  183.   if((*(*array2D) = (MotionVector* )calloc(dim0 * dim1,sizeof(MotionVector ))) == NULL)
  184.     no_mem_exit("get_mem2Dmv: array2D");
  185.   for(i = 1 ; i < dim0; i++)
  186.     (*array2D)[i] =  (*array2D)[i-1] + dim1;
  187.   return dim0 * dim1 * sizeof(MotionVector);
  188. }
  189. /*!
  190.  ************************************************************************
  191.  * brief
  192.  *    Allocate 3D memory array -> MotionVector array3D[frames][rows][columns]
  193.  *
  194.  * par Output:
  195.  *    memory size in bytes
  196.  ************************************************************************
  197.  */
  198. int get_mem3Dmv(MotionVector ****array3D, int dim0, int dim1, int dim2)
  199. {
  200.   int i;
  201.   if(((*array3D) = (MotionVector***)calloc(dim0,sizeof(MotionVector**))) == NULL)
  202.     no_mem_exit("get_mem3Dmv: array3D");
  203.   get_mem2Dmv(*array3D, dim0 * dim1, dim2);
  204.   for(i = 1; i < dim0; i++)
  205.     (*array3D)[i] = (*array3D)[i - 1] + dim1;
  206.   
  207.   return dim0 * dim1 * dim2 * sizeof(MotionVector);
  208. }
  209. /*!
  210.  ************************************************************************
  211.  * brief
  212.  *    Allocate 4D memory array -> MotionVector array3D[dim0][dim1][dim2][dim3]
  213.  *
  214.  * par Output:
  215.  *    memory size in bytes
  216.  ************************************************************************
  217.  */
  218. int get_mem4Dmv(MotionVector *****array4D, int dim0, int dim1, int dim2, int dim3)
  219. {
  220.   int i;
  221.   if(((*array4D) = (MotionVector****)calloc(dim0,sizeof(MotionVector***))) == NULL)
  222.     no_mem_exit("get_mem4Dpel: array4D");
  223.   get_mem3Dmv(*array4D, dim0 * dim1, dim2, dim3);
  224.   for(i = 1; i < dim0; i++)
  225.     (*array4D)[i] = (*array4D)[i - 1] + dim1;
  226.   
  227.   return dim0 * dim1 * dim2 * dim3 * sizeof(MotionVector);
  228. }
  229. /*!
  230.  ************************************************************************
  231.  * brief
  232.  *    Allocate 5D memory array -> MotionVector array3D[dim0][dim1][dim2][dim3][dim4]
  233.  *
  234.  * par Output:
  235.  *    memory size in bytes
  236.  ************************************************************************
  237.  */
  238. int get_mem5Dmv(MotionVector ******array5D, int dim0, int dim1, int dim2, int dim3, int dim4)
  239. {
  240.   int i;
  241.   if(((*array5D) = (MotionVector*****)calloc(dim0,sizeof(MotionVector****))) == NULL)
  242.     no_mem_exit("get_mem5Dpel: array5D");
  243.   get_mem4Dmv(*array5D, dim0 * dim1, dim2, dim3, dim4);
  244.   for(i = 1; i < dim0; i++)
  245.     (*array5D)[i] = (*array5D)[i - 1] + dim1;
  246.   
  247.   return dim0 * dim1 * dim2 * dim3 * dim4 * sizeof(MotionVector);
  248. }
  249. /*!
  250.  ************************************************************************
  251.  * brief
  252.  *    free 2D memory array
  253.  *    which was allocated with get_mem2Dmv()
  254.  ************************************************************************
  255.  */
  256. void free_mem2Dmv(MotionVector **array2D)
  257. {
  258.   if (array2D)
  259.   {
  260.     if (*array2D)
  261.       free (*array2D);
  262.     else 
  263.       error ("free_mem2Dmv: trying to free unused memory",100);
  264.     free (array2D);
  265.   } 
  266.   else
  267.   {
  268.     error ("free_mem2Dmv: trying to free unused memory",100);
  269.   }
  270. }
  271. /*!
  272.  ************************************************************************
  273.  * brief
  274.  *    free 3D memory array
  275.  *    which was allocated with get_mem3Dmv()
  276.  ************************************************************************
  277.  */
  278. void free_mem3Dmv(MotionVector ***array3D)
  279. {
  280.   if (array3D)
  281.   {
  282.     free_mem2Dmv(*array3D);
  283.     free (array3D);
  284.   }
  285.   else
  286.   {
  287.     error ("free_mem3Dmv: trying to free unused memory",100);
  288.   }
  289. }
  290. /*!
  291.  ************************************************************************
  292.  * brief
  293.  *    free 4D memory array
  294.  *    which was allocated with get_mem4Dmv()
  295.  ************************************************************************
  296.  */
  297. void free_mem4Dmv(MotionVector ****array4D)
  298. {
  299.   if (array4D)
  300.   {
  301.     free_mem3Dmv(*array4D);
  302.     free (array4D);
  303.   }
  304.   else
  305.   {
  306.     error ("free_mem4Dmv: trying to free unused memory",100);
  307.   }
  308. }
  309. /*!
  310.  ************************************************************************
  311.  * brief
  312.  *    free 5D memory array
  313.  *    which was allocated with get_mem5Dmv()
  314.  ************************************************************************
  315.  */
  316. void free_mem5Dmv(MotionVector *****array5D)
  317. {
  318.   if (array5D)
  319.   {
  320.     free_mem4Dmv(*array5D);
  321.     free (array5D);
  322.   }
  323.   else
  324.   {
  325.     error ("free_mem5Dmv: trying to free unused memory",100);
  326.   }
  327. }
  328. /*!
  329.  ************************************************************************
  330.  * brief
  331.  *    Allocate 2D memory array -> imgpel array2D[rows][columns]
  332.  *
  333.  * par Output:
  334.  *    memory size in bytes
  335.  ************************************************************************/
  336. int get_mem2Dpel(imgpel ***array2D, int dim0, int dim1)
  337. {
  338.   int i;
  339.   if((*array2D    = (imgpel**)calloc(dim0,       sizeof(imgpel*))) == NULL)
  340.     no_mem_exit("get_mem2Dpel: array2D");
  341.   if((*(*array2D) = (imgpel* )calloc(dim0 * dim1,sizeof(imgpel ))) == NULL)
  342.     no_mem_exit("get_mem2Dpel: array2D");
  343.   for(i = 1 ; i < dim0; i++)
  344.     (*array2D)[i] =  (*array2D)[i-1] + dim1;
  345.   return dim0 * dim1 * sizeof(imgpel);
  346. }
  347. /*!
  348.  ************************************************************************
  349.  * brief
  350.  *    Allocate 3D memory array -> imgpel array3D[frames][rows][columns]
  351.  *
  352.  * par Output:
  353.  *    memory size in bytes
  354.  ************************************************************************
  355.  */
  356. int get_mem3Dpel(imgpel ****array3D, int dim0, int dim1, int dim2)
  357. {
  358.   int i;
  359.   if(((*array3D) = (imgpel***)calloc(dim0,sizeof(imgpel**))) == NULL)
  360.     no_mem_exit("get_mem3Dpel: array3D");
  361.   get_mem2Dpel(*array3D, dim0 * dim1, dim2);
  362.   for(i = 1; i < dim0; i++)
  363.     (*array3D)[i] = (*array3D)[i - 1] + dim1;
  364.   
  365.   return dim0 * dim1 * dim2 * sizeof(imgpel);
  366. }
  367. /*!
  368.  ************************************************************************
  369.  * brief
  370.  *    Allocate 4D memory array -> imgpel array4D[sub_x][sub_y][rows][columns]
  371.  *
  372.  * par Output:
  373.  *    memory size in bytes
  374.  ************************************************************************
  375.  */
  376. int get_mem4Dpel(imgpel *****array4D, int dim0, int dim1, int dim2, int dim3)
  377. {  
  378.   int  i;
  379.   if(((*array4D) = (imgpel****)calloc(dim0, sizeof(imgpel***))) == NULL)
  380.     no_mem_exit("get_mem4Dpel: array4D");
  381.   get_mem3Dpel(*array4D, dim0 * dim1, dim2, dim3);
  382.   for(i = 1; i < dim0; i++)
  383.     (*array4D)[i] = (*array4D)[i - 1] + dim1;
  384.   return dim0 * dim1 * dim2 * dim3 * sizeof(imgpel);
  385. }
  386. /*!
  387.  ************************************************************************
  388.  * brief
  389.  *    Allocate 5D memory array -> imgpel array5D[dims][sub_x][sub_y][rows][columns]
  390.  *
  391.  * par Output:
  392.  *    memory size in bytes
  393.  ************************************************************************
  394.  */
  395. int get_mem5Dpel(imgpel ******array5D, int dim0, int dim1, int dim2, int dim3, int dim4)
  396. {
  397.   int  i;
  398.   if(((*array5D) = (imgpel*****)calloc(dim0, sizeof(imgpel****))) == NULL)
  399.     no_mem_exit("get_mem5Dpel: array5D");
  400.   get_mem4Dpel(*array5D, dim0 * dim1, dim2, dim3, dim4);
  401.   for(i = 1; i < dim0; i++)
  402.     (*array5D)[i] = (*array5D)[i - 1] + dim1;
  403.   return dim0 * dim1 * dim2 * dim3 * dim4 * sizeof(imgpel);
  404. }
  405. /*!
  406.  ************************************************************************
  407.  * brief
  408.  *    free 2D memory array
  409.  *    which was allocated with get_mem2Dpel()
  410.  ************************************************************************
  411.  */
  412. void free_mem2Dpel(imgpel **array2D)
  413. {
  414.   if (array2D)
  415.   {
  416.     if (*array2D)
  417.       free (*array2D);
  418.     else 
  419.       error ("free_mem2Dpel: trying to free unused memory",100);
  420.     free (array2D);
  421.   } 
  422.   else
  423.   {
  424.     error ("free_mem2Dpel: trying to free unused memory",100);
  425.   }
  426. }
  427. /*!
  428.  ************************************************************************
  429.  * brief
  430.  *    free 3D memory array
  431.  *    which was allocated with get_mem3Dpel()
  432.  ************************************************************************
  433.  */
  434. void free_mem3Dpel(imgpel ***array3D)
  435. {
  436.   if (array3D)
  437.   {
  438.     free_mem2Dpel(*array3D);
  439.     free (array3D);
  440.   }
  441.   else
  442.   {
  443.     error ("free_mem3Dpel: trying to free unused memory",100);
  444.   }
  445. }
  446. /*!
  447.  ************************************************************************
  448.  * brief
  449.  *    free 4D memory array
  450.  *    which was allocated with get_mem4Dpel()
  451.  ************************************************************************
  452.  */
  453. void free_mem4Dpel(imgpel ****array4D)
  454. {
  455.   if (array4D)
  456.   {
  457.     free_mem3Dpel(*array4D);
  458.     free (array4D);
  459.   }
  460.   else
  461.   {
  462.     error ("free_mem4Dpel: trying to free unused memory",100);
  463.   }
  464. }
  465. /*!
  466.  ************************************************************************
  467.  * brief
  468.  *    free 5D memory array
  469.  *    which was allocated with get_mem5Dpel()
  470.  ************************************************************************
  471.  */
  472. void free_mem5Dpel(imgpel *****array5D)
  473. {
  474.   if (array5D)
  475.   {
  476.     free_mem4Dpel(*array5D);
  477.     free (array5D);
  478.   }
  479.   else
  480.   {
  481.     error ("free_mem5Dpel: trying to free unused memory",100);
  482.   }
  483. }
  484. /*!
  485.  ************************************************************************
  486.  * brief
  487.  *    Allocate 2D memory array -> unsigned char array2D[rows][columns]
  488.  *
  489.  * par Output:
  490.  *    memory size in bytes
  491.  ************************************************************************/
  492. int get_mem2D(byte ***array2D, int dim0, int dim1)
  493. {
  494.   int i;
  495.   if((  *array2D  = (byte**)calloc(dim0,       sizeof(byte*))) == NULL)
  496.     no_mem_exit("get_mem2D: array2D");
  497.   if((*(*array2D) = (byte* )calloc(dim0 * dim1,sizeof(byte ))) == NULL)
  498.     no_mem_exit("get_mem2D: array2D");
  499.   for(i = 1; i < dim0; i++)
  500.     (*array2D)[i] = (*array2D)[i-1] + dim1;
  501.   return dim0 * dim1;
  502. }
  503. /*!
  504.  ************************************************************************
  505.  * brief
  506.  *    Allocate 2D memory array -> int array2D[rows][columns]
  507.  *
  508.  * par Output:
  509.  *    memory size in bytes
  510.  ************************************************************************
  511.  */
  512. int get_mem2Dint(int ***array2D, int dim0, int dim1)
  513. {
  514.   int i;
  515.   if((*array2D    = (int**)calloc(dim0,        sizeof(int*))) == NULL)
  516.     no_mem_exit("get_mem2Dint: array2D");
  517.   if((*(*array2D) = (int* )calloc(dim0 * dim1, sizeof(int ))) == NULL)
  518.     no_mem_exit("get_mem2Dint: array2D");
  519.   for(i = 1 ; i < dim0; i++)
  520.     (*array2D)[i] =  (*array2D)[i-1] + dim1;
  521.   return dim0 * dim1 * sizeof(int);
  522. }
  523. /*!
  524.  ************************************************************************
  525.  * brief
  526.  *    Allocate 2D memory array -> int64 array2D[rows][columns]
  527.  *
  528.  * par Output:
  529.  *    memory size in bytes
  530.  ************************************************************************
  531.  */
  532. int get_mem2Dint64(int64 ***array2D, int dim0, int dim1)
  533. {
  534.   int i;
  535.   if((*array2D    = (int64**)calloc(dim0,       sizeof(int64*))) == NULL)
  536.     no_mem_exit("get_mem2Dint64: array2D");
  537.   if((*(*array2D) = (int64* )calloc(dim0 * dim1,sizeof(int64 ))) == NULL)
  538.     no_mem_exit("get_mem2Dint64: array2D");
  539.   for(i = 1; i < dim0; i++)
  540.     (*array2D)[i] =  (*array2D)[i-1] + dim1;
  541.   return dim0 * dim1 * sizeof(int64);
  542. }
  543. /*!
  544.  ************************************************************************
  545.  * brief
  546.  *    Allocate 3D memory array -> unsigned char array3D[frames][rows][columns]
  547.  *
  548.  * par Output:
  549.  *    memory size in bytes
  550.  ************************************************************************
  551.  */
  552. int get_mem3D(byte ****array3D, int dim0, int dim1, int dim2)
  553. {
  554.   int  i;
  555.   if(((*array3D) = (byte***)calloc(dim0,sizeof(byte**))) == NULL)
  556.     no_mem_exit("get_mem3D: array3D");
  557.   get_mem2D(*array3D, dim0 * dim1, dim2);
  558.   for(i = 1; i < dim0; i++)
  559.     (*array3D)[i] =  (*array3D)[i-1] + dim1;
  560.   return dim0 * dim1 * dim2;
  561. }
  562. /*!
  563.  ************************************************************************
  564.  * brief
  565.  *    Allocate 3D memory array -> int array3D[frames][rows][columns]
  566.  *
  567.  * par Output:
  568.  *    memory size in bytes
  569.  ************************************************************************
  570.  */
  571. int get_mem3Dint(int ****array3D, int dim0, int dim1, int dim2)
  572. {
  573.   int  i;
  574.   if(((*array3D) = (int***)calloc(dim0, sizeof(int**))) == NULL)
  575.     no_mem_exit("get_mem3Dint: array3D");
  576.   get_mem2Dint(*array3D, dim0 * dim1, dim2);
  577.   for(i = 1; i < dim0; i++)
  578.     (*array3D)[i] =  (*array3D)[i-1] + dim1;
  579.   return dim0 * dim1 * dim2 * sizeof(int);
  580. }
  581. /*!
  582.  ************************************************************************
  583.  * brief
  584.  *    Allocate 3D memory array -> int64 array3D[frames][rows][columns]
  585.  *
  586.  * par Output:
  587.  *    memory size in bytes
  588.  ************************************************************************
  589.  */
  590. int get_mem3Dint64(int64 ****array3D, int dim0, int dim1, int dim2)
  591. {
  592.   int  i;
  593.   if(((*array3D) = (int64***)calloc(dim0, sizeof(int64**))) == NULL)
  594.     no_mem_exit("get_mem3Dint64: array3D");
  595.   get_mem2Dint64(*array3D, dim0 * dim1, dim2);
  596.   for(i = 1; i < dim0; i++)
  597.     (*array3D)[i] =  (*array3D)[i-1] + dim1;
  598.   return dim0 * dim1 * dim2 * sizeof(int64);
  599. }
  600. /*!
  601.  ************************************************************************
  602.  * brief
  603.  *    Allocate 4D memory array -> int array4D[frames][rows][columns][component]
  604.  *
  605.  * par Output:
  606.  *    memory size in bytes
  607.  ************************************************************************
  608.  */
  609. int get_mem4Dint(int *****array4D, int dim0, int dim1, int dim2, int dim3)
  610. {
  611.   int  i;
  612.   if(((*array4D) = (int****)calloc(dim0, sizeof(int***))) == NULL)
  613.     no_mem_exit("get_mem4Dint: array4D");
  614.   get_mem3Dint(*array4D, dim0 * dim1, dim2, dim3);
  615.   for(i = 1; i < dim0; i++)
  616.     (*array4D)[i] =  (*array4D)[i-1] + dim1;
  617.   return dim0 * dim1 * dim2 * dim3 * sizeof(int);
  618. }
  619. /*!
  620.  ************************************************************************
  621.  * brief
  622.  *    Allocate 5D memory array -> int array5D[refs][blocktype][rows][columns][component]
  623.  *
  624.  * par Output:
  625.  *    memory size in bytes
  626.  ************************************************************************
  627.  */
  628. int get_mem5Dint(int ******array5D, int dim0, int dim1, int dim2, int dim3, int dim4)
  629. {
  630.   int  i;
  631.   if(((*array5D) = (int*****)calloc(dim0, sizeof(int****))) == NULL)
  632.     no_mem_exit("get_mem5Dint: array5D");
  633.   get_mem4Dint(*array5D, dim0 * dim1, dim2, dim3, dim4);
  634.   for(i = 1; i < dim0; i++)
  635.     (*array5D)[i] =  (*array5D)[i-1] + dim1;
  636.   return dim0 * dim1 * dim2 * dim3 * dim4 * sizeof(int);
  637. }
  638. /*!
  639.  ************************************************************************
  640.  * brief
  641.  *    free 2D memory array
  642.  *    which was allocated with get_mem2D()
  643.  ************************************************************************
  644.  */
  645. void free_mem2D(byte **array2D)
  646. {
  647.   if (array2D)
  648.   {
  649.     if (*array2D)
  650.       free (*array2D);
  651.     else 
  652.       error ("free_mem2D: trying to free unused memory",100);
  653.     free (array2D);
  654.   } 
  655.   else
  656.   {
  657.     error ("free_mem2D: trying to free unused memory",100);
  658.   }
  659. }
  660. /*!
  661.  ************************************************************************
  662.  * brief
  663.  *    free 2D memory array
  664.  *    which was allocated with get_mem2Dint()
  665.  ************************************************************************
  666.  */
  667. void free_mem2Dint(int **array2D)
  668. {
  669.   if (array2D)
  670.   {
  671.     if (*array2D)
  672.       free (*array2D);
  673.     else 
  674.       error ("free_mem2Dint: trying to free unused memory",100);
  675.     free (array2D);
  676.   } 
  677.   else
  678.   {
  679.     error ("free_mem2Dint: trying to free unused memory",100);
  680.   }
  681. }
  682. /*!
  683.  ************************************************************************
  684.  * brief
  685.  *    free 2D memory array
  686.  *    which was allocated with get_mem2Dint64()
  687.  ************************************************************************
  688.  */
  689. void free_mem2Dint64(int64 **array2D)
  690. {
  691.   if (array2D)
  692.   {
  693.     if (*array2D)
  694.       free (*array2D);
  695.     else 
  696.       error ("free_mem2Dint64: trying to free unused memory",100);
  697.     free (array2D);
  698.   } 
  699.   else
  700.   {
  701.     error ("free_mem2Dint64: trying to free unused memory",100);
  702.   }
  703. }
  704. /*!
  705.  ************************************************************************
  706.  * brief
  707.  *    free 3D memory array
  708.  *    which was allocated with get_mem3D()
  709.  ************************************************************************
  710.  */
  711. void free_mem3D(byte ***array3D)
  712. {
  713.   if (array3D)
  714.   {
  715.    free_mem2D(*array3D);
  716.    free (array3D);
  717.   } 
  718.   else
  719.   {
  720.     error ("free_mem3D: trying to free unused memory",100);
  721.   }
  722. }
  723. /*!
  724.  ************************************************************************
  725.  * brief
  726.  *    free 3D memory array
  727.  *    which was allocated with get_mem3Dint()
  728.  ************************************************************************
  729.  */
  730. void free_mem3Dint(int ***array3D)
  731. {
  732.   if (array3D)
  733.   {
  734.    free_mem2Dint(*array3D);
  735.    free (array3D);
  736.   } 
  737.   else
  738.   {
  739.     error ("free_mem3Dint: trying to free unused memory",100);
  740.   }
  741. }
  742. /*!
  743.  ************************************************************************
  744.  * brief
  745.  *    free 3D memory array
  746.  *    which was allocated with get_mem3Dint64()
  747.  ************************************************************************
  748.  */
  749. void free_mem3Dint64(int64 ***array3D)
  750. {
  751.   if (array3D)
  752.   {
  753.    free_mem2Dint64(*array3D);
  754.    free (array3D);
  755.   } 
  756.   else
  757.   {
  758.     error ("free_mem3Dint64: trying to free unused memory",100);
  759.   }
  760. }
  761. /*!
  762.  ************************************************************************
  763.  * brief
  764.  *    free 4D memory array
  765.  *    which was allocated with get_mem4Dint()
  766.  ************************************************************************
  767.  */
  768. void free_mem4Dint(int ****array4D)
  769. {
  770.   if (array4D)
  771.   {
  772.     free_mem3Dint( *array4D);
  773.     free (array4D);
  774.   } else
  775.   {
  776.     error ("free_mem4Dint: trying to free unused memory",100);
  777.   }
  778. }
  779. /*!
  780.  ************************************************************************
  781.  * brief
  782.  *    free 5D int memory array
  783.  *    which was allocated with get_mem5Dint()
  784.  ************************************************************************
  785.  */
  786. void free_mem5Dint(int *****array5D)
  787. {
  788.   if (array5D)
  789.   {
  790.     free_mem4Dint( *array5D);
  791.     free (array5D);
  792.   } else
  793.   {
  794.     error ("free_mem5Dint: trying to free unused memory",100);
  795.   }
  796. }
  797. /*!
  798.  ************************************************************************
  799.  * brief
  800.  *    Exit program if memory allocation failed (using error())
  801.  * param where
  802.  *    string indicating which memory allocation failed
  803.  ************************************************************************
  804.  */
  805. void no_mem_exit(char *where)
  806. {
  807.    snprintf(errortext, ET_SIZE, "Could not allocate memory: %s",where);
  808.    error (errortext, 100);
  809. }
  810. /*!
  811.  ************************************************************************
  812.  * brief
  813.  *    Allocate 2D short memory array -> short array2D[rows][columns]
  814.  *
  815.  * par Output:
  816.  *    memory size in bytes
  817.  ************************************************************************
  818.  */
  819. int get_mem2Dshort(short ***array2D, int dim0, int dim1)
  820. {
  821.   int i;
  822.   if((  *array2D  = (short**)calloc(dim0,       sizeof(short*))) == NULL)
  823.     no_mem_exit("get_mem2Dshort: array2D");
  824.   if((*(*array2D) = (short* )calloc(dim0 * dim1,sizeof(short ))) == NULL)
  825.     no_mem_exit("get_mem2Dshort: array2D");
  826.   for(i = 1; i < dim0; i++)
  827.     (*array2D)[i] = (*array2D)[i-1] + dim1;
  828.   return dim0 * dim1 * sizeof(short);
  829. }
  830. /*!
  831.  ************************************************************************
  832.  * brief
  833.  *    Allocate 3D memory short array -> short array3D[frames][rows][columns]
  834.  *
  835.  * par Output:
  836.  *    memory size in bytes
  837.  ************************************************************************
  838.  */
  839. int get_mem3Dshort(short ****array3D,int dim0, int dim1, int dim2)
  840. {
  841.   int  i;
  842.   if(((*array3D) = (short***)calloc(dim0, sizeof(short**))) == NULL)
  843.     no_mem_exit("get_mem3Dshort: array3D");
  844.   get_mem2Dshort(*array3D, dim0 * dim1, dim2);
  845.   for(i = 1; i < dim0; i++)
  846.     (*array3D)[i] =  (*array3D)[i-1] + dim1;
  847.   return dim0 * dim1 * dim2 * sizeof(short);
  848. }
  849. /*!
  850.  ************************************************************************
  851.  * brief
  852.  *    Allocate 4D memory short array -> short array3D[frames][rows][columns][component]
  853.  *
  854.  * par Output:
  855.  *    memory size in bytes
  856.  ************************************************************************
  857.  */
  858. int get_mem4Dshort(short *****array4D, int dim0, int dim1, int dim2, int dim3)
  859. {
  860.   int  i;
  861.   if(((*array4D) = (short****)calloc(dim0, sizeof(short***))) == NULL)
  862.     no_mem_exit("get_mem4Dshort: array4D");
  863.   get_mem3Dshort(*array4D, dim0 * dim1, dim2, dim3);
  864.   for(i = 1; i < dim0; i++)
  865.     (*array4D)[i] =  (*array4D)[i-1] + dim1;
  866.   return dim0 * dim1 * dim2 * dim3 * sizeof(short);
  867. }
  868. /*!
  869.  ************************************************************************
  870.  * brief
  871.  *    Allocate 5D memory array -> short array5D[refs][blocktype][rows][columns][component]
  872.  *
  873.  * par Output:
  874.  *    memory size in bytes
  875.  ************************************************************************
  876.  */
  877. int get_mem5Dshort(short ******array5D, int dim0, int dim1, int dim2, int dim3, int dim4)
  878. {
  879.   int  i;
  880.   if(((*array5D) = (short*****)calloc(dim0, sizeof(short****))) == NULL)
  881.     no_mem_exit("get_mem5Dshort: array5D");
  882.   get_mem4Dshort(*array5D, dim0 * dim1, dim2, dim3, dim4);
  883.   for(i = 1; i < dim0; i++)
  884.     (*array5D)[i] =  (*array5D)[i-1] + dim1;
  885.   return dim0 * dim1 * dim2 * dim3 * dim4 * sizeof(short);
  886. }
  887. /*!
  888.  ************************************************************************
  889.  * brief
  890.  *    Allocate 6D memory array -> short array6D[list][refs][blocktype][rows][columns][component]
  891.  *
  892.  * par Output:
  893.  *    memory size in bytes
  894.  ************************************************************************
  895.  */
  896. int get_mem6Dshort(short *******array6D, int dim0, int dim1, int dim2, int dim3, int dim4, int dim5)
  897. {
  898.   int  i;
  899.   if(((*array6D) = (short******)calloc(dim0, sizeof(short*****))) == NULL)
  900.     no_mem_exit("get_mem6Dshort: array6D");
  901.   get_mem5Dshort(*array6D, dim0 * dim1, dim2, dim3, dim4, dim5);
  902.   for(i = 1; i < dim0; i++)
  903.     (*array6D)[i] =  (*array6D)[i-1] + dim1;
  904.   return dim0 * dim1 * dim2 * dim3 * dim4 * dim5 * sizeof(short);
  905. }
  906. /*!
  907.  ************************************************************************
  908.  * brief
  909.  *    Allocate 7D memory array -> short array7D[list][refs][blocktype][rows][columns][component]
  910.  *
  911.  * par Output:
  912.  *    memory size in bytes
  913.  ************************************************************************
  914.  */
  915. int get_mem7Dshort(short ********array7D, int dim0, int dim1, int dim2, int dim3, int dim4, int dim5, int dim6)
  916. {
  917.   int  i;
  918.   if(((*array7D) = (short*******)calloc(dim0, sizeof(short******))) == NULL)
  919.     no_mem_exit("get_mem7Dshort: array7D");
  920.   get_mem6Dshort(*array7D, dim0 * dim1, dim2, dim3, dim4, dim5, dim6);
  921.   for(i = 1; i < dim0; i++)
  922.     (*array7D)[i] =  (*array7D)[i-1] + dim1;
  923.   return dim0 * dim1 * dim2 * dim3 * dim4 * dim5 * dim6 * sizeof(short);
  924. }
  925. /*!
  926.  ************************************************************************
  927.  * brief
  928.  *    free 2D short memory array
  929.  *    which was allocated with get_mem2Dshort()
  930.  ************************************************************************
  931.  */
  932. void free_mem2Dshort(short **array2D)
  933. {
  934.   if (array2D)
  935.   {
  936.     if (*array2D)
  937.       free (*array2D);
  938.     else error ("free_mem2Dshort: trying to free unused memory",100);
  939.     free (array2D);
  940.   } 
  941.   else
  942.   {
  943.     error ("free_mem2Dshort: trying to free unused memory",100);
  944.   }
  945. }
  946. /*!
  947.  ************************************************************************
  948.  * brief
  949.  *    free 3D short memory array
  950.  *    which was allocated with get_mem3Dshort()
  951.  ************************************************************************
  952.  */
  953. void free_mem3Dshort(short ***array3D)
  954. {
  955.   if (array3D)
  956.   {
  957.    free_mem2Dshort(*array3D);
  958.    free (array3D);
  959.   } 
  960.   else
  961.   {
  962.     error ("free_mem3Dshort: trying to free unused memory",100);
  963.   }
  964. }
  965. /*!
  966.  ************************************************************************
  967.  * brief
  968.  *    free 4D short memory array
  969.  *    which was allocated with get_mem4Dshort()
  970.  ************************************************************************
  971.  */
  972. void free_mem4Dshort(short ****array4D)
  973. {  
  974.   if (array4D)
  975.   {
  976.     free_mem3Dshort( *array4D);
  977.     free (array4D);
  978.   } 
  979.   else
  980.   {
  981.     error ("free_mem4Dshort: trying to free unused memory",100);
  982.   }
  983. }
  984. /*!
  985.  ************************************************************************
  986.  * brief
  987.  *    free 5D short memory array
  988.  *    which was allocated with get_mem5Dshort()
  989.  ************************************************************************
  990.  */
  991. void free_mem5Dshort(short *****array5D)
  992. {
  993.   if (array5D)
  994.   {
  995.     free_mem4Dshort( *array5D) ;
  996.     free (array5D);
  997.   }
  998.   else
  999.   {
  1000.     error ("free_mem5Dshort: trying to free unused memory",100);
  1001.   }
  1002. }
  1003. /*!
  1004.  ************************************************************************
  1005.  * brief
  1006.  *    free 6D short memory array
  1007.  *    which was allocated with get_mem6Dshort()
  1008.  ************************************************************************
  1009.  */
  1010. void free_mem6Dshort(short ******array6D)
  1011. {
  1012.   if (array6D)
  1013.   {
  1014.     free_mem5Dshort( *array6D);
  1015.     free (array6D);
  1016.   }
  1017.   else
  1018.   {
  1019.     error ("free_mem6Dshort: trying to free unused memory",100);
  1020.   }
  1021. }
  1022. /*!
  1023.  ************************************************************************
  1024.  * brief
  1025.  *    free 7D short memory array
  1026.  *    which was allocated with get_mem7Dshort()
  1027.  ************************************************************************
  1028.  */
  1029. void free_mem7Dshort(short *******array7D)
  1030. {
  1031.   if (array7D)
  1032.   {
  1033.     free_mem6Dshort( *array7D);
  1034.     free (array7D);
  1035.   }
  1036.   else
  1037.   {
  1038.     error ("free_mem7Dshort: trying to free unused memory",100);
  1039.   }
  1040. }
  1041. /*!
  1042.  ************************************************************************
  1043.  * brief
  1044.  *    Allocate 2D memory array -> double array2D[rows][columns]
  1045.  *
  1046.  * par Output:
  1047.  *    memory size in bytes
  1048.  ************************************************************************
  1049.  */
  1050. int get_mem2Ddouble(double ***array2D, int rows, int columns)
  1051. {
  1052.   int i;
  1053.   if((*array2D      = (double**)calloc(rows,        sizeof(double*))) == NULL)
  1054.     no_mem_exit("get_mem2Ddouble: array2D");
  1055.   
  1056.   if(((*array2D)[0] = (double* )calloc(rows*columns,sizeof(double ))) == NULL)
  1057.     no_mem_exit("get_mem2Ddouble: array2D");
  1058.   for(i=1 ; i<rows ; i++)
  1059.     (*array2D)[i] =  (*array2D)[i-1] + columns  ;
  1060.   return rows*columns*sizeof(double);
  1061. }
  1062. /*!
  1063.  ************************************************************************
  1064.  * brief
  1065.  *    Allocate 2D memory array -> double array2D[rows][columns]
  1066.  *    Note that array is shifted towards offset allowing negative values
  1067.  *
  1068.  * par Output:
  1069.  *    memory size in bytes
  1070.  ************************************************************************
  1071.  */
  1072. int get_mem2Dodouble(double ***array2D, int rows, int columns, int offset)
  1073. {
  1074.   int i;
  1075.   if((*array2D      = (double**)calloc(rows,        sizeof(double*))) == NULL)
  1076.     no_mem_exit("get_mem2Dodouble: array2D");
  1077.   if(((*array2D)[0] = (double* )calloc(rows*columns,sizeof(double ))) == NULL)
  1078.     no_mem_exit("get_mem2Dodouble: array2D");
  1079.   (*array2D)[0] += offset;
  1080.   for(i=1 ; i<rows ; i++)
  1081.     (*array2D)[i] =  (*array2D)[i-1] + columns  ;
  1082.   return rows*columns*sizeof(double);
  1083. }
  1084. /*!
  1085.  ************************************************************************
  1086.  * brief
  1087.  *    Allocate 3D memory double array -> double array3D[pels][rows][columns]
  1088.  *
  1089.  * par Output:
  1090.  *    memory size in bytes
  1091.  ************************************************************************
  1092.  */
  1093. int get_mem3Dodouble(double ****array3D, int rows, int columns, int pels, int offset)
  1094. {
  1095.   int  i,j;
  1096.   if(((*array3D) = (double***)calloc(rows,sizeof(double**))) == NULL)
  1097.     no_mem_exit("get_mem3Dodouble: array3D");
  1098.   if(((*array3D)[0] = (double** )calloc(rows*columns,sizeof(double*))) == NULL)
  1099.     no_mem_exit("get_mem3Dodouble: array3D");
  1100.   (*array3D) [0] += offset;
  1101.   for(i=1 ; i<rows ; i++)
  1102.     (*array3D)[i] =  (*array3D)[i-1] + columns  ;
  1103.   for (i = 0; i < rows; i++)
  1104.     for (j = -offset; j < columns - offset; j++)
  1105.       if(((*array3D)[i][j] = (double* )calloc(pels,sizeof(double))) == NULL)
  1106.         no_mem_exit("get_mem3Dodouble: array3D");
  1107.   return rows*columns*pels*sizeof(double);
  1108. }
  1109. /*!
  1110.  ************************************************************************
  1111.  * brief
  1112.  *    Allocate 2D memory array -> int array2D[rows][columns]
  1113.  *    Note that array is shifted towards offset allowing negative values
  1114.  *
  1115.  * par Output:
  1116.  *    memory size in bytes
  1117.  ************************************************************************
  1118.  */
  1119. int get_offset_mem2Dshort(short ***array2D, int rows, int columns, int offset_y, int offset_x)
  1120. {
  1121.   int i;
  1122.   if((*array2D      = (short**)calloc(rows, sizeof(short*))) == NULL)
  1123.     no_mem_exit("get_offset_mem2Dshort: array2D");
  1124.   if(((*array2D)[0] = (short* )calloc(rows * columns,sizeof(short))) == NULL)
  1125.     no_mem_exit("get_offset_mem2Dshort: array2D");
  1126.   (*array2D)[0] += offset_x + offset_y * columns;
  1127.   for(i=-1 ; i > -offset_y - 1; i--)
  1128.   {
  1129.     (*array2D)[i] =  (*array2D)[i+1] - columns;
  1130.   }
  1131.   for(i=1 ; i < columns - offset_y; i++)
  1132.     (*array2D)[i] =  (*array2D)[i-1] + columns;
  1133.   return rows * columns * sizeof(short);
  1134. }
  1135. /*!
  1136.  ************************************************************************
  1137.  * brief
  1138.  *    Allocate 3D memory int array -> int array3D[rows][columns][pels]
  1139.  *
  1140.  * par Output:
  1141.  *    memory size in bytes
  1142.  ************************************************************************
  1143.  */
  1144. int get_mem3Doint(int ****array3D, int rows, int columns, int pels, int offset)
  1145. {
  1146.   int  i,j;
  1147.   if(((*array3D) = (int***)calloc(rows,sizeof(int**))) == NULL)
  1148.     no_mem_exit("get_mem3Doint: array3D");
  1149.   if(((*array3D)[0] = (int** )calloc(rows*columns,sizeof(int*))) == NULL)
  1150.     no_mem_exit("get_mem3Doint: array3D");
  1151.   (*array3D) [0] += offset;
  1152.   for(i=1 ; i<rows ; i++)
  1153.     (*array3D)[i] =  (*array3D)[i-1] + columns  ;
  1154.   for (i = 0; i < rows; i++)
  1155.     for (j = -offset; j < columns - offset; j++)
  1156.       if(((*array3D)[i][j] = (int* )calloc(pels,sizeof(int))) == NULL)
  1157.         no_mem_exit("get_mem3Doint: array3D");
  1158.   return rows*columns*pels*sizeof(int);
  1159. }
  1160. /*!
  1161.  ************************************************************************
  1162.  * brief
  1163.  *    Allocate 2D memory array -> int array2D[rows][columns]
  1164.  *    Note that array is shifted towards offset allowing negative values
  1165.  *
  1166.  * par Output:
  1167.  *    memory size in bytes
  1168.  ************************************************************************
  1169.  */
  1170. int get_mem2Doint(int ***array2D, int rows, int columns, int offset)
  1171. {
  1172.   int i;
  1173.   if((*array2D      = (int**)calloc(rows, sizeof(int*))) == NULL)
  1174.     no_mem_exit("get_mem2Dint: array2D");
  1175.   if(((*array2D)[0] = (int* )calloc(rows*columns,sizeof(int))) == NULL)
  1176.     no_mem_exit("get_mem2Dint: array2D");
  1177.   (*array2D)[0] += offset;
  1178.   for(i=1 ; i<rows ; i++)
  1179.     (*array2D)[i] =  (*array2D)[i-1] + columns  ;
  1180.   return rows*columns*sizeof(int);
  1181. }
  1182. /*!
  1183.  ************************************************************************
  1184.  * brief
  1185.  *    Allocate 3D memory array -> int array3D[frames][rows][columns]
  1186.  *
  1187.  * par Output:
  1188.  *    memory size in bytes
  1189.  ************************************************************************
  1190.  */
  1191. // same change as in get_mem3Dint
  1192. int get_mem3Ddouble(double ****array3D, int frames, int rows, int columns)
  1193. {
  1194. int  j;
  1195.   double **array2D;
  1196.   get_mem2Ddouble(&array2D, frames * rows, columns);
  1197.   if(((*array3D) = (double***)calloc(frames,sizeof(double**))) == NULL)
  1198.     no_mem_exit("get_mem3Ddouble: array3D");
  1199.   for(j=0;j<frames;j++)
  1200.   {    
  1201.     (*array3D)[j] = &array2D[j * rows];
  1202.   }
  1203.   return frames*rows*columns*sizeof(double);
  1204. }
  1205. /*!
  1206.  ************************************************************************
  1207.  * brief
  1208.  *    free 2D double memory array
  1209.  *    which was allocated with get_mem2Ddouble()
  1210.  ************************************************************************
  1211.  */
  1212. void free_mem2Ddouble(double **array2D)
  1213. {
  1214.   if (array2D)
  1215.   {
  1216.     if (*array2D)
  1217.       free (*array2D);
  1218.     else 
  1219.       error ("free_mem2Ddouble: trying to free unused memory",100);
  1220.     free (array2D);
  1221.   }
  1222.   else
  1223.   {
  1224.     error ("free_mem2Ddouble: trying to free unused memory",100);
  1225.   }
  1226. }
  1227. /*!
  1228. ************************************************************************
  1229. * brief
  1230. *    free 2D double memory array (with offset)
  1231. *    which was allocated with get_mem2Ddouble()
  1232. ************************************************************************
  1233. */
  1234. void free_mem2Dodouble(double **array2D, int offset)
  1235. {
  1236.   if (array2D)
  1237.   {
  1238.     array2D[0] -= offset;
  1239.     if (array2D[0])
  1240.       free (array2D[0]);
  1241.     else error ("free_mem2Dodouble: trying to free unused memory",100);
  1242.     free (array2D);
  1243.   } else
  1244.   {
  1245.     error ("free_mem2Dodouble: trying to free unused memory",100);
  1246.   }
  1247. }
  1248. /*!
  1249.  ************************************************************************
  1250.  * brief
  1251.  *    free 3D memory array with offset
  1252.  ************************************************************************
  1253.  */
  1254. void free_mem3Dodouble(double ***array3D, int rows, int columns, int offset)
  1255. {
  1256.   int i, j;
  1257.   if (array3D)
  1258.   {
  1259.     for (i = 0; i < rows; i++)
  1260.     {
  1261.       for (j = -offset; j < columns - offset; j++)
  1262.       {
  1263.         if (array3D[i][j])
  1264.           free(array3D[i][j]);
  1265.         else
  1266.           error ("free_mem3Dodouble: trying to free unused memory",100);
  1267.       }
  1268.     }
  1269.     array3D[0] -= offset;
  1270.     if (array3D[0])
  1271.       free(array3D[0]);
  1272.     else
  1273.       error ("free_mem3Dodouble: trying to free unused memory",100);
  1274.     free (array3D);
  1275.   }
  1276.   else
  1277.   {
  1278.     error ("free_mem3Dodouble: trying to free unused memory",100);
  1279.   }
  1280. }
  1281. /*!
  1282.  ************************************************************************
  1283.  * brief
  1284.  *    free 3D memory array with offset
  1285.  ************************************************************************
  1286.  */
  1287. void free_mem3Doint(int ***array3D, int rows, int columns, int offset)
  1288. {
  1289.   int i, j;
  1290.   if (array3D)
  1291.   {
  1292.     for (i = 0; i < rows; i++)
  1293.     {
  1294.       for (j = -offset; j < columns - offset; j++)
  1295.       {
  1296.         if (array3D[i][j])
  1297.           free(array3D[i][j]);
  1298.         else
  1299.           error ("free_mem3Doint: trying to free unused memory",100);
  1300.       }
  1301.     }
  1302.     array3D[0] -= offset;
  1303.     if (array3D[0])
  1304.       free(array3D[0]);
  1305.     else
  1306.       error ("free_mem3Doint: trying to free unused memory",100);
  1307.     free (array3D);
  1308.   }
  1309.   else
  1310.   {
  1311.     error ("free_mem3Doint: trying to free unused memory",100);
  1312.   }
  1313. }
  1314. /*!
  1315. ************************************************************************
  1316. * brief
  1317. *    free 2D double memory array (with offset)
  1318. *    which was allocated with get_mem2Ddouble()
  1319. ************************************************************************
  1320. */
  1321. void free_mem2Doint(int **array2D, int offset)
  1322. {
  1323.   if (array2D)
  1324.   {
  1325.     array2D[0] -= offset;
  1326.     if (array2D[0])
  1327.       free (array2D[0]);
  1328.     else 
  1329.       error ("free_mem2Doint: trying to free unused memory",100);
  1330.     free (array2D);
  1331.   } 
  1332.   else
  1333.   {
  1334.     error ("free_mem2Doint: trying to free unused memory",100);
  1335.   }
  1336. }
  1337. /*!
  1338. ************************************************************************
  1339. * brief
  1340. *    free 2D double memory array (with offset)
  1341. *    which was allocated with get_mem2Ddouble()
  1342. ************************************************************************
  1343. */
  1344. void free_offset_mem2Dshort(short **array2D, int columns, int offset_y, int offset_x)
  1345. {
  1346.   if (array2D)
  1347.   {
  1348.     array2D[0] -= offset_x + offset_y * columns;
  1349.     if (array2D[0])
  1350.       free (array2D[0]);
  1351.     else 
  1352.       error ("free_offset_mem2Dshort: trying to free unused memory",100);
  1353.     free (array2D);
  1354.   } 
  1355.   else
  1356.   {
  1357.     error ("free_offset_mem2Dshort: trying to free unused memory",100);
  1358.   }
  1359. }
  1360. /*!
  1361.  ************************************************************************
  1362.  * brief
  1363.  *    free 3D memory array
  1364.  *    which was alocated with get_mem3Dint()
  1365.  ************************************************************************
  1366.  */
  1367. void free_mem3Ddouble(double ***array3D)
  1368. {
  1369. if (array3D)
  1370. {
  1371.    free_mem2Ddouble(*array3D);
  1372. free (array3D);
  1373. else
  1374. {
  1375. error ("free_mem3D: trying to free unused memory",100);
  1376. }
  1377. }
  1378. /*!
  1379.  ************************************************************************
  1380.  * brief
  1381.  *    Allocate 2D memory array -> LambdaParams array2D[rows][columns]
  1382.  *    Note that array is shifted towards offset allowing negative values
  1383.  *
  1384.  * par Output:
  1385.  *    memory size in bytes
  1386.  ************************************************************************
  1387.  */
  1388. int get_mem2Dolm(LambdaParams ***array2D, int rows, int columns, int offset)
  1389. {
  1390.   int i;
  1391.   if((*array2D      = (LambdaParams**) calloc(rows, sizeof(LambdaParams*))) == NULL)
  1392.     no_mem_exit("get_mem2Dolm: array2D");
  1393.   if(((*array2D)[0] = (LambdaParams* ) calloc(rows*columns,sizeof(LambdaParams))) == NULL)
  1394.     no_mem_exit("get_mem2Dolm: array2D");
  1395.   (*array2D)[0] += offset;
  1396.   for(i=1 ; i<rows ; i++)
  1397.     (*array2D)[i] =  (*array2D)[i-1] + columns  ;
  1398.   return rows*columns*sizeof(LambdaParams);
  1399. }
  1400. /*!
  1401. ************************************************************************
  1402. * brief
  1403. *    free 2D LambdaParams memory array (with offset)
  1404. *    which was allocated with get_mem2Dlm()
  1405. ************************************************************************
  1406. */
  1407. void free_mem2Dolm(LambdaParams **array2D, int offset)
  1408. {
  1409.   if (array2D)
  1410.   {
  1411.     array2D[0] -= offset;
  1412.     if (array2D[0])
  1413.       free (array2D[0]);
  1414.     else 
  1415.       error ("free_mem2Dolm: trying to free unused memory",100);
  1416.     free (array2D);
  1417.   } 
  1418.   else
  1419.   {
  1420.     error ("free_mem2Dolm: trying to free unused memory",100);
  1421.   }
  1422. }