quant8x8_around.c
资源名称:chapter15.rar [点击查看]
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:5k
源码类别:
Audio
开发平台:
Visual C++
- /*!
- *************************************************************************************
- * file quant8x8_around.c
- *
- * brief
- * Quantization process for a 8x8 block with adaptive rounding
- *
- * author
- * Main contributors (see contributors.h for copyright, address and affiliation details)
- * - Alexis Michael Tourapis <alexismt@ieee.org>
- *
- *************************************************************************************
- */
- #include "contributors.h"
- #include <math.h>
- #include "global.h"
- #include "image.h"
- #include "mb_access.h"
- #include "vlc.h"
- #include "transform.h"
- #include "mc_prediction.h"
- #include "q_offsets.h"
- #include "q_matrix.h"
- #include "quant8x8.h"
- /*!
- ************************************************************************
- * brief
- * Quantization process for All coefficients for a 8x8 block
- *
- * par Input:
- *
- * par Output:
- *
- ************************************************************************
- */
- int quant_8x8_around(int (*tblock)[16], int block_y, int block_x, int qp,
- int* ACLevel, int* ACRun,
- int **fadjust8x8, int **levelscale, int **invlevelscale, int **leveloffset,
- int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost)
- {
- static int i,j, coeff_ctr;
- static int *m7;
- static int scaled_coeff;
- int level, run = 0;
- int nonzero = FALSE;
- int qp_per = qp_per_matrix[qp];
- int q_bits = Q_BITS_8 + qp_per;
- const byte *p_scan = &pos_scan[0][0];
- int* ACL = &ACLevel[0];
- int* ACR = &ACRun[0];
- // Quantization
- for (coeff_ctr = 0; coeff_ctr < 64; coeff_ctr++)
- {
- i = *p_scan++; // horizontal position
- j = *p_scan++; // vertical position
- m7 = &tblock[j][block_x + i];
- if (*m7 != 0)
- {
- scaled_coeff = iabs (*m7) * levelscale[j][i];
- level = (scaled_coeff + leveloffset[j][i]) >> q_bits;
- if (level != 0)
- {
- fadjust8x8[j][block_x + i] = rshift_rnd_sf((AdaptRndWeight * (scaled_coeff - (level << q_bits))), (q_bits + 1));
- nonzero = TRUE;
- *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
- level = isignab(level, *m7);
- *m7 = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
- *ACL++ = level;
- *ACR++ = run;
- // reset zero level counter
- run = 0;
- }
- else
- {
- fadjust8x8[j][block_x + i] = 0;
- run++;
- *m7 = 0;
- }
- }
- else
- {
- fadjust8x8[j][block_x + i] = 0;
- run++;
- }
- }
- *ACL = 0;
- return nonzero;
- }
- /*!
- ************************************************************************
- * brief
- * Quantization process for All coefficients for a 8x8 block
- * CAVLC version
- *
- * par Input:
- *
- * par Output:
- *
- ************************************************************************
- */
- int quant_8x8cavlc_around(int (*tblock)[16], int block_y, int block_x, int qp,
- int*** cofAC,
- int **fadjust8x8, int **levelscale, int **invlevelscale, int **leveloffset,
- int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost)
- {
- static int i,j, k, coeff_ctr;
- static int *m7;
- static int scaled_coeff;
- int level, runs[4] = { 0 };
- int nonzero = FALSE;
- int qp_per = qp_per_matrix[qp];
- int q_bits = Q_BITS_8 + qp_per;
- const byte *p_scan = &pos_scan[0][0];
- int* ACL[4];
- int* ACR[4];
- for (k = 0; k < 4; k++)
- {
- ACL[k] = &cofAC[k][0][0];
- ACR[k] = &cofAC[k][1][0];
- }
- // Quantization
- for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
- {
- for (k = 0; k < 4; k++)
- {
- i = *p_scan++; // horizontal position
- j = *p_scan++; // vertical position
- m7 = &tblock[j][block_x + i];
- if (*m7 != 0)
- {
- scaled_coeff = iabs (*m7) * levelscale[j][i];
- level = (scaled_coeff + leveloffset[j][i]) >> q_bits;
- if (level != 0)
- {
- level = imin(level, CAVLC_LEVEL_LIMIT);
- fadjust8x8[j][block_x + i] = rshift_rnd_sf((AdaptRndWeight * (scaled_coeff - (level << q_bits))), (q_bits + 1));
- nonzero=TRUE;
- *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[runs[k]];
- level = isignab(level, *m7);
- *m7 = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
- *(ACL[k])++ = level;
- *(ACR[k])++ = runs[k];
- // reset zero level counter
- runs[k] = 0;
- }
- else
- {
- fadjust8x8[j][block_x + i] = 0;
- runs[k]++;
- *m7 = 0;
- }
- }
- else
- {
- fadjust8x8[j][block_x + i] = 0;
- runs[k]++;
- }
- }
- }
- for(k = 0; k < 4; k++)
- *(ACL[k]) = 0;
- return nonzero;
- }