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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file q_around.c
  4.  *
  5.  * brief
  6.  *    Quantization Adaptive Rounding (JVT-N011)
  7.  * author
  8.  *    - Alexis Michael Tourapis    <alexismt@ieee.org>
  9.  *    - Ehsan Maani                <emaan@dolby.com>
  10.  *
  11.  *************************************************************************************
  12.  */
  13. #include "global.h"
  14. #include "memalloc.h"
  15. #include "q_offsets.h"
  16. #include "q_around.h"
  17. static const int AdaptRndCrPos[2][5] =
  18. {
  19.   //  P,   B,   I,  SP,  SI
  20.   {   4,   7,   1,   4,   1}, // Intra MB
  21.   {  10,  13,  10,  10,  10}  // Inter MB
  22. };
  23. static const int AdaptRndPos[4][5] =
  24. {
  25.   //  P,   B,   I,  SP,  SI
  26.   {   3,   6,   0,   3,   0}, // 4x4 Intra MB
  27.   {   1,   2,   0,   1,   2}, // 8x8 Intra MB
  28.   {   9,  12,   9,   9,   9}, // 4x4 Inter MB
  29.   {   3,   4,   3,   3,   3}, // 8x8 Inter MB
  30. };
  31. ARoundOffset bestOffset;
  32. int   **fadjust8x8 = NULL, **fadjust4x4 = NULL, ***fadjust4x4Cr = NULL, ***fadjust8x8Cr = NULL;
  33. static void allocate_offset_memory(InputParameters *params, ARoundOffset *offset)
  34. {
  35.   get_mem2Dint(&offset->InterFAdjust4x4, 16, 16);
  36.   get_mem2Dint(&offset->IntraFAdjust4x4, 16, 16);
  37.   get_mem2Dint(&offset->InterFAdjust8x8, 16, 16);
  38.   get_mem2Dint(&offset->IntraFAdjust8x8, 16, 16);
  39.   if (params->yuv_format != 0 )
  40.   {
  41.     if  (params->yuv_format == YUV444)
  42.     {
  43.       get_mem3Dint(&offset->InterFAdjust8x8Cr, 2, 16, 16);
  44.       get_mem3Dint(&offset->IntraFAdjust8x8Cr, 2, 16, 16);
  45.     }
  46.     get_mem3Dint(&offset->InterFAdjust4x4Cr, 2, img->mb_cr_size_y, img->mb_cr_size_x);
  47.     get_mem3Dint(&offset->IntraFAdjust4x4Cr, 2, img->mb_cr_size_y, img->mb_cr_size_x);
  48.   }
  49. }
  50. static void free_offset_memory(InputParameters *params, ARoundOffset *offset)
  51. {
  52.   free_mem2Dint(offset->InterFAdjust4x4);
  53.   free_mem2Dint(offset->IntraFAdjust4x4);
  54.   free_mem2Dint(offset->InterFAdjust8x8);
  55.   free_mem2Dint(offset->IntraFAdjust8x8);
  56.   if (params->yuv_format != 0 )
  57.   {
  58.     if  (params->yuv_format == YUV444)
  59.     {
  60.       free_mem3Dint(offset->InterFAdjust8x8Cr);
  61.       free_mem3Dint(offset->IntraFAdjust8x8Cr);
  62.     }
  63.     free_mem3Dint(offset->InterFAdjust4x4Cr);
  64.     free_mem3Dint(offset->IntraFAdjust4x4Cr);
  65.   }
  66. }
  67. void setup_adaptive_rounding (InputParameters *params)
  68. {
  69.   allocate_offset_memory(params, &bestOffset);
  70.   get_mem2Dint(&fadjust8x8, 16, 16);
  71.   get_mem2Dint(&fadjust4x4, 16, 16);
  72.   if (params->yuv_format != 0 )
  73.   {
  74.     get_mem3Dint(&fadjust4x4Cr, 2, img->mb_cr_size_y, img->mb_cr_size_x);
  75.     get_mem3Dint(&fadjust8x8Cr, 2, img->mb_cr_size_y, img->mb_cr_size_x);
  76.   }
  77. }
  78. void clear_adaptive_rounding (InputParameters *params)
  79. {
  80.   free_offset_memory(params, &bestOffset);
  81.   free_mem2Dint(fadjust8x8);
  82.   free_mem2Dint(fadjust4x4);
  83.   if (params->yuv_format != 0)
  84.   {
  85.     free_mem3Dint(fadjust4x4Cr);
  86.     free_mem3Dint(fadjust8x8Cr);
  87.   }
  88. }
  89. void store_adaptive_rounding (ImageParameters *img, int block_y, int block_x)
  90. {
  91.   int j;
  92.   for (j = block_y; j < block_y + 4; j++)
  93.     memcpy(&fadjust4x4[j][block_x],&img->fadjust4x4[1][j][block_x], BLOCK_SIZE * sizeof(int));
  94.   if (img->P444_joined)
  95.   {
  96.     for (j = block_y; j < block_y + 4; j++)
  97.     {
  98.       memcpy(&fadjust4x4Cr[0][j][block_x],&img->fadjust4x4Cr[0][1][j][block_x], BLOCK_SIZE * sizeof(int));
  99.     }
  100.     for (j = block_y; j < block_y + 4; j++)
  101.     {
  102.       memcpy(&fadjust4x4Cr[1][j][block_x],&img->fadjust4x4Cr[1][1][j][block_x], BLOCK_SIZE * sizeof(int));
  103.     }
  104.   }
  105. }
  106. void update_adaptive_rounding(ImageParameters *img, int block_y, int block_x)
  107. {
  108.   int j;
  109.   for (j = block_y; j < block_y + BLOCK_SIZE; j++)
  110.     memcpy (&img->fadjust4x4[1][j][block_x],&fadjust4x4[j][block_x], BLOCK_SIZE * sizeof(int));
  111.   if (img->P444_joined)
  112.   {
  113.     for (j = 0; j < block_y + BLOCK_SIZE; j++)
  114.     {
  115.       memcpy (&img->fadjust4x4Cr[0][1][j][block_x],&fadjust4x4Cr[0][j][block_x], BLOCK_SIZE * sizeof(int));
  116.     }
  117.     for (j = 0; j < block_y + BLOCK_SIZE; j++)
  118.     {
  119.       memcpy (&img->fadjust4x4Cr[1][1][j][block_x],&fadjust4x4Cr[1][j][block_x], BLOCK_SIZE * sizeof(int));
  120.     }
  121.   }
  122. }
  123. /*!
  124.  *************************************************************************************
  125.  * brief
  126.  *    Store adaptive rounding luma parameters
  127.  *************************************************************************************
  128.  */
  129. void store_adaptive_rounding_parameters_luma (Macroblock *currMB, int mode)
  130. {
  131.    int is_inter = (mode != I4MB) && (mode != I16MB) && (mode != I8MB);
  132.   if (currMB->luma_transform_size_8x8_flag)
  133.   {
  134.     if ((mode == P8x8))
  135.       memcpy(&(bestOffset.InterFAdjust8x8[0][0]),&(img->fadjust8x8[2][0][0]), MB_PIXELS * sizeof(int));
  136.     else if (is_inter)
  137.       memcpy(&(bestOffset.InterFAdjust8x8[0][0]),&(img->fadjust8x8[0][0][0]), MB_PIXELS * sizeof(int));
  138.     else
  139.       memcpy(&(bestOffset.IntraFAdjust8x8[0][0]),&(img->fadjust8x8[1][0][0]), MB_PIXELS * sizeof(int));
  140.   }
  141.   else
  142.   {
  143.     if ((mode == P8x8))
  144.       memcpy(&(bestOffset.InterFAdjust4x4[0][0]),&(img->fadjust4x4[3][0][0]),MB_PIXELS * sizeof(int));
  145.     else if (is_inter)
  146.       memcpy(&(bestOffset.InterFAdjust4x4[0][0]),&(img->fadjust4x4[0][0][0]),MB_PIXELS * sizeof(int));
  147.     else
  148.       memcpy(&(bestOffset.IntraFAdjust4x4[0][0]),&(img->fadjust4x4[1 + mode == I16MB][0][0]),MB_PIXELS * sizeof(int));
  149.   }
  150. }
  151. /*!
  152.  *************************************************************************************
  153.  * brief  
  154.  *    Store adaptive rounding chroma parameters
  155.  *************************************************************************************
  156.  */
  157. void store_adaptive_rounding_parameters_chroma (Macroblock *currMB, int mode)
  158. {
  159.   int j;
  160.   int is_inter = (mode != I4MB)&&(mode != I16MB)&&(mode != I8MB);
  161.   if (img->P444_joined)
  162.   {
  163.     if (currMB->luma_transform_size_8x8_flag)
  164.     {
  165.       if ((mode == P8x8))
  166.       {
  167.         memcpy(&(bestOffset.InterFAdjust8x8Cr[0][0][0]),&(img->fadjust8x8Cr[0][2][0][0]), MB_PIXELS * sizeof(int));
  168.         memcpy(&(bestOffset.InterFAdjust8x8Cr[1][0][0]),&(img->fadjust8x8Cr[1][2][0][0]), MB_PIXELS * sizeof(int));
  169.       }
  170.       else if (is_inter)
  171.       {
  172.         memcpy(&(bestOffset.InterFAdjust8x8Cr[0][0][0]),&(img->fadjust8x8Cr[0][0][0][0]), MB_PIXELS * sizeof(int));
  173.         memcpy(&(bestOffset.InterFAdjust8x8Cr[1][0][0]),&(img->fadjust8x8Cr[1][0][0][0]), MB_PIXELS * sizeof(int));
  174.       }
  175.       else
  176.       {
  177.         memcpy(&(bestOffset.IntraFAdjust8x8Cr[0][0][0]),&(img->fadjust8x8Cr[0][1][0][0]), MB_PIXELS * sizeof(int));
  178.         memcpy(&(bestOffset.IntraFAdjust8x8Cr[1][0][0]),&(img->fadjust8x8Cr[1][1][0][0]), MB_PIXELS * sizeof(int));
  179.       }
  180. }
  181.     else
  182.     {
  183.       if ((mode == P8x8))
  184.       {
  185.         memcpy(&(bestOffset.InterFAdjust4x4Cr[0][0][0]),&(img->fadjust4x4Cr[0][3][0][0]), MB_PIXELS * sizeof(int));
  186.         memcpy(&(bestOffset.InterFAdjust4x4Cr[1][0][0]),&(img->fadjust4x4Cr[1][3][0][0]), MB_PIXELS * sizeof(int));
  187.       }
  188.       else if (is_inter)
  189.       {
  190.         memcpy(&(bestOffset.InterFAdjust4x4Cr[0][0][0]),&(img->fadjust4x4Cr[0][0][0][0]), MB_PIXELS * sizeof(int));
  191.         memcpy(&(bestOffset.InterFAdjust4x4Cr[1][0][0]),&(img->fadjust4x4Cr[1][0][0][0]), MB_PIXELS * sizeof(int));
  192.       }
  193.       else
  194.       {
  195.         memcpy(&(bestOffset.IntraFAdjust4x4Cr[0][0][0]),&(img->fadjust4x4Cr[0][1 + mode == I16MB][0][0]), MB_PIXELS * sizeof(int));
  196.         memcpy(&(bestOffset.IntraFAdjust4x4Cr[1][0][0]),&(img->fadjust4x4Cr[1][1 + mode == I16MB][0][0]), MB_PIXELS * sizeof(int));
  197.       }
  198.     }
  199.   }
  200.   if ( (params->yuv_format == YUV420 || params->yuv_format == YUV422) && (params->AdaptRndChroma))  
  201.   {
  202.     if (currMB->luma_transform_size_8x8_flag && mode == P8x8)
  203.     {
  204.       for (j = 0; j < img->mb_cr_size_y; j++)
  205.       {
  206.         memcpy(bestOffset.InterFAdjust4x4Cr[0][j],img->fadjust8x8Cr[0][0][j],img->mb_cr_size_x * sizeof(int));
  207.         memcpy(bestOffset.InterFAdjust4x4Cr[1][j],img->fadjust8x8Cr[1][0][j],img->mb_cr_size_x * sizeof(int));
  208.       }
  209.     }
  210.     else if (mode == P8x8)
  211.     {
  212.       for (j = 0; j < img->mb_cr_size_y; j++)
  213.       {
  214.         memcpy(bestOffset.InterFAdjust4x4Cr[0][j],img->fadjust4x4Cr[0][2][j],img->mb_cr_size_x * sizeof(int));
  215.         memcpy(bestOffset.InterFAdjust4x4Cr[1][j],img->fadjust4x4Cr[1][2][j],img->mb_cr_size_x * sizeof(int));
  216.       }
  217.     }
  218.     else if (is_inter)
  219.     {
  220.       for (j = 0; j < img->mb_cr_size_y; j++)
  221.       {
  222.         memcpy(bestOffset.InterFAdjust4x4Cr[0][j],img->fadjust4x4Cr[0][0][j],img->mb_cr_size_x * sizeof(int));
  223.         memcpy(bestOffset.InterFAdjust4x4Cr[1][j],img->fadjust4x4Cr[1][0][j],img->mb_cr_size_x * sizeof(int));
  224.       }
  225.     }
  226.     else
  227.     {
  228.       for (j = 0; j < img->mb_cr_size_y; j++)
  229.       {
  230.         memcpy(bestOffset.IntraFAdjust4x4Cr[0][j],img->fadjust4x4Cr[0][1][j],img->mb_cr_size_x * sizeof(int));
  231.         memcpy(bestOffset.IntraFAdjust4x4Cr[1][j],img->fadjust4x4Cr[1][1][j],img->mb_cr_size_x * sizeof(int));
  232.       }
  233.     }
  234.   }
  235. }
  236. /*!
  237.  *************************************************************************************
  238.  * brief
  239.  *    Store all adaptive rounding parameters
  240.  *************************************************************************************
  241.  */
  242. void store_adaptive_rounding_parameters (Macroblock *currMB, int mode)
  243. {
  244.   store_adaptive_rounding_parameters_luma (currMB, mode);
  245.   store_adaptive_rounding_parameters_chroma (currMB, mode);
  246. }
  247. /*!
  248. ************************************************************************
  249. * brief
  250. *    update rounding offsets based on JVT-N011
  251. ************************************************************************
  252. */
  253. void update_offset_params(Macroblock *currMB, int mode, int luma_transform_size_8x8_flag)
  254. {
  255.   int is_inter = (mode != I4MB)&&(mode != I16MB) && (mode != I8MB);
  256.   int luma_pos = AdaptRndPos[(is_inter<<1) + luma_transform_size_8x8_flag][img->type];
  257.   int i,j;
  258.   int qp = currMB->qp + img->bitdepth_luma_qp_scale;
  259.   int cur_qp = params->AdaptRoundingFixed ? 0 : qp;
  260.   int temp = 0;
  261.   int offsetRange = 1 << (OffsetBits - 1);
  262.   int blk_mask = 0x03 + (luma_transform_size_8x8_flag<<2);
  263.   int blk_shift = 2 + luma_transform_size_8x8_flag;
  264.   short **offsetList = luma_transform_size_8x8_flag ? OffsetList8x8[cur_qp] : OffsetList4x4[cur_qp];
  265.   int **fAdjust = is_inter
  266.     ? (luma_transform_size_8x8_flag ? bestOffset.InterFAdjust8x8 : bestOffset.InterFAdjust4x4)
  267.     : (luma_transform_size_8x8_flag ? bestOffset.IntraFAdjust8x8 : bestOffset.IntraFAdjust4x4);
  268.   if( (active_sps->chroma_format_idc == YUV444) && IS_INDEPENDENT(params) )
  269.   {
  270.     if( luma_transform_size_8x8_flag )  // 8x8
  271.       luma_pos += 5 * img->colour_plane_id;
  272.     else  // 4x4
  273.       luma_pos += img->colour_plane_id;
  274.   }
  275.   for (j=0; j < MB_BLOCK_SIZE; j++)
  276.   {
  277.     int j_pos = ((j & blk_mask)<<blk_shift);
  278.     for (i=0; i < MB_BLOCK_SIZE; i++)
  279.     {
  280.       temp = j_pos + (i & blk_mask);
  281.       offsetList[luma_pos][temp] += fAdjust[j][i];
  282.       offsetList[luma_pos][temp]  = iClip3(0, offsetRange, offsetList[luma_pos][temp]);
  283.     }
  284.   }
  285.   if(img->P444_joined)
  286.   { 
  287.     int ***fAdjustCbCr = (int ***) (is_inter
  288.       ? (luma_transform_size_8x8_flag ? bestOffset.InterFAdjust8x8Cr : bestOffset.InterFAdjust4x4Cr)
  289.       : (luma_transform_size_8x8_flag ? bestOffset.IntraFAdjust8x8Cr : bestOffset.IntraFAdjust4x4Cr));
  290.     int uv;
  291.     for(uv = 0; uv < 2; uv++)
  292.     {
  293.       luma_pos = AdaptRndPos[(is_inter<<1) + luma_transform_size_8x8_flag][img->type];
  294.       if(luma_transform_size_8x8_flag )  // 8x8
  295.         luma_pos += 5 * (uv+1);
  296.       else  // 4x4
  297.         luma_pos += (uv+1);
  298.       for (j=0; j < MB_BLOCK_SIZE; j++)
  299.       {
  300.         int j_pos = ((j & blk_mask)<<blk_shift);
  301.         for (i=0; i < MB_BLOCK_SIZE; i++)
  302.         {
  303.           temp = j_pos + (i & blk_mask);
  304.           offsetList[luma_pos][temp] += fAdjustCbCr[uv][j][i];
  305.           offsetList[luma_pos][temp] = iClip3(0,offsetRange,offsetList[luma_pos][temp]);
  306.         }
  307.       }
  308.     }
  309.   }
  310.   if ((params->AdaptRndChroma) && (params->yuv_format == YUV420 || params->yuv_format == YUV422 ))
  311.   {
  312.     int u_pos = AdaptRndCrPos[is_inter][img->type];
  313.     int v_pos = u_pos + 1;
  314.     int jpos;
  315.     int ***fAdjustCr = is_inter ? bestOffset.InterFAdjust4x4Cr : bestOffset.IntraFAdjust4x4Cr;
  316.     for (j = 0; j < img->mb_cr_size_y; j++)
  317.     {
  318.       jpos = ((j & 0x03)<<2);
  319.       for (i = 0; i < img->mb_cr_size_x; i++)
  320.       {
  321.         temp = jpos + (i & 0x03);
  322.         OffsetList4x4[cur_qp][u_pos][temp] += fAdjustCr[0][j][i];
  323.         OffsetList4x4[cur_qp][u_pos][temp]  = iClip3(0,offsetRange,OffsetList4x4[cur_qp][u_pos][temp]);
  324.         OffsetList4x4[cur_qp][v_pos][temp] += fAdjustCr[1][j][i];
  325.         OffsetList4x4[cur_qp][v_pos][temp]  = iClip3(0,offsetRange,OffsetList4x4[cur_qp][v_pos][temp]);
  326.       }
  327.     }
  328.   }
  329. }