00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "contributors.h"
00017
00018 #include <math.h>
00019
00020 #include "global.h"
00021
00022 #include "image.h"
00023 #include "mb_access.h"
00024 #include "vlc.h"
00025 #include "transform.h"
00026 #include "mc_prediction.h"
00027 #include "q_offsets.h"
00028 #include "q_matrix.h"
00029 #include "quant8x8.h"
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 int quant_8x8_normal(int **tblock, int block_y, int block_x, int qp,
00044 int* ACLevel, int* ACRun,
00045 int **fadjust8x8, int **levelscale, int **invlevelscale, int **leveloffset,
00046 int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost)
00047 {
00048 static int i,j, coeff_ctr;
00049
00050 static int *m7;
00051 static int scaled_coeff;
00052
00053 int level, run = 0;
00054 int nonzero = FALSE;
00055 int qp_per = qp_per_matrix[qp];
00056 int q_bits = Q_BITS_8 + qp_per;
00057 const byte *p_scan = &pos_scan[0][0];
00058 int* ACL = &ACLevel[0];
00059 int* ACR = &ACRun[0];
00060
00061
00062 for (coeff_ctr = 0; coeff_ctr < 64; coeff_ctr++)
00063 {
00064 i = *p_scan++;
00065 j = *p_scan++;
00066
00067 m7 = &tblock[j][block_x + i];
00068 if (*m7 != 0)
00069 {
00070 scaled_coeff = iabs (*m7) * levelscale[j][i];
00071 level = (scaled_coeff + leveloffset[j][i]) >> q_bits;
00072
00073 if (level != 0)
00074 {
00075 nonzero = TRUE;
00076
00077 *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
00078
00079 level = isignab(level, *m7);
00080 *m7 = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
00081 *ACL++ = level;
00082 *ACR++ = run;
00083
00084 run = 0;
00085 }
00086 else
00087 {
00088 run++;
00089 *m7 = 0;
00090 }
00091 }
00092 else
00093 {
00094 run++;
00095 }
00096 }
00097
00098 *ACL = 0;
00099
00100 return nonzero;
00101 }
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 int quant_8x8cavlc_normal(int **tblock, int block_y, int block_x, int qp,
00116 int*** cofAC,
00117 int **fadjust8x8, int **levelscale, int **invlevelscale, int **leveloffset,
00118 int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost)
00119 {
00120 static int i,j, k, coeff_ctr;
00121
00122 static int *m7;
00123 static int scaled_coeff;
00124
00125 int level, runs[4] = { 0 };
00126 int nonzero = FALSE;
00127 int qp_per = qp_per_matrix[qp];
00128 int q_bits = Q_BITS_8 + qp_per;
00129 const byte *p_scan = &pos_scan[0][0];
00130 int* ACL[4];
00131 int* ACR[4];
00132
00133 for (k = 0; k < 4; k++)
00134 {
00135 ACL[k] = &cofAC[k][0][0];
00136 ACR[k] = &cofAC[k][1][0];
00137 }
00138
00139
00140 for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
00141 {
00142 for (k = 0; k < 4; k++)
00143 {
00144 i = *p_scan++;
00145 j = *p_scan++;
00146
00147 m7 = &tblock[j][block_x + i];
00148 if (*m7 != 0)
00149 {
00150 scaled_coeff = iabs (*m7) * levelscale[j][i];
00151 level = (scaled_coeff + leveloffset[j][i]) >> q_bits;
00152
00153 if (level != 0)
00154 {
00155 level = imin(level, CAVLC_LEVEL_LIMIT);
00156
00157 nonzero=TRUE;
00158
00159 *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[runs[k]];
00160
00161 level = isignab(level, *m7);
00162 *m7 = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
00163
00164 *(ACL[k])++ = level;
00165 *(ACR[k])++ = runs[k];
00166
00167 runs[k] = 0;
00168 }
00169 else
00170 {
00171 runs[k]++;
00172 *m7 = 0;
00173 }
00174 }
00175 else
00176 {
00177 runs[k]++;
00178 }
00179 }
00180 }
00181
00182 for(k = 0; k < 4; k++)
00183 *(ACL[k]) = 0;
00184
00185 return nonzero;
00186 }
00187