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_around(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 int* padjust8x8;
00061
00062
00063 for (coeff_ctr = 0; coeff_ctr < 64; coeff_ctr++)
00064 {
00065 i = *p_scan++;
00066 j = *p_scan++;
00067
00068 padjust8x8 = &fadjust8x8[j][block_x + i];
00069 m7 = &tblock[j][block_x + i];
00070 if (*m7 != 0)
00071 {
00072 scaled_coeff = iabs (*m7) * levelscale[j][i];
00073 level = (scaled_coeff + leveloffset[j][i]) >> q_bits;
00074
00075 if (level != 0)
00076 {
00077 *padjust8x8 = rshift_rnd_sf((AdaptRndWeight * (scaled_coeff - (level << q_bits))), (q_bits + 1));
00078
00079 nonzero = TRUE;
00080
00081 *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
00082
00083 level = isignab(level, *m7);
00084 *m7 = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
00085 *ACL++ = level;
00086 *ACR++ = run;
00087
00088 run = 0;
00089 }
00090 else
00091 {
00092 *padjust8x8 = 0;
00093 run++;
00094 *m7 = 0;
00095 }
00096 }
00097 else
00098 {
00099 *padjust8x8 = 0;
00100 run++;
00101 }
00102 }
00103
00104 *ACL = 0;
00105
00106 return nonzero;
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 int quant_8x8cavlc_around(int **tblock, int block_y, int block_x, int qp,
00122 int*** cofAC,
00123 int **fadjust8x8, int **levelscale, int **invlevelscale, int **leveloffset,
00124 int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost)
00125 {
00126 static int i,j, k, coeff_ctr;
00127
00128 static int *m7;
00129 static int scaled_coeff;
00130
00131 int level, runs[4] = { 0 };
00132 int nonzero = FALSE;
00133 int qp_per = qp_per_matrix[qp];
00134 int q_bits = Q_BITS_8 + qp_per;
00135 const byte *p_scan = &pos_scan[0][0];
00136 int* ACL[4];
00137 int* ACR[4];
00138 int* padjust8x8;
00139
00140 for (k = 0; k < 4; k++)
00141 {
00142 ACL[k] = &cofAC[k][0][0];
00143 ACR[k] = &cofAC[k][1][0];
00144 }
00145
00146
00147 for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
00148 {
00149 for (k = 0; k < 4; k++)
00150 {
00151 i = *p_scan++;
00152 j = *p_scan++;
00153
00154 padjust8x8 = &fadjust8x8[j][block_x + i];
00155 m7 = &tblock[j][block_x + i];
00156 if (*m7 != 0)
00157 {
00158 scaled_coeff = iabs (*m7) * levelscale[j][i];
00159 level = (scaled_coeff + leveloffset[j][i]) >> q_bits;
00160
00161 if (level != 0)
00162 {
00163 level = imin(level, CAVLC_LEVEL_LIMIT);
00164
00165 *padjust8x8 = rshift_rnd_sf((AdaptRndWeight * (scaled_coeff - (level << q_bits))), (q_bits + 1));
00166
00167 nonzero=TRUE;
00168
00169 *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[runs[k]];
00170
00171 level = isignab(level, *m7);
00172 *m7 = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
00173
00174 *(ACL[k])++ = level;
00175 *(ACR[k])++ = runs[k];
00176
00177 runs[k] = 0;
00178 }
00179 else
00180 {
00181 *padjust8x8 = 0;
00182 *m7 = 0;
00183 runs[k]++;
00184 }
00185 }
00186 else
00187 {
00188 *padjust8x8 = 0;
00189 runs[k]++;
00190 }
00191 }
00192 }
00193
00194 for(k = 0; k < 4; k++)
00195 *(ACL[k]) = 0;
00196
00197 return nonzero;
00198 }
00199