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 #include "q_matrix.h"
00022 #include "quant4x4.h"
00023 #include "quantChroma.h"
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 int quant_dc2x2_normal(int **tblock, int qp, int* DCLevel, int* DCRun,
00038 int **fadjust, int levelscale, int invlevelscale, int leveloffset,
00039 const byte (*pos_scan)[2], int is_cavlc)
00040 {
00041 static int coeff_ctr;
00042
00043 static int *m7;
00044 static int scaled_coeff;
00045
00046 int level, run = 0;
00047 int nonzero = FALSE;
00048 int qp_per = qp_per_matrix[qp];
00049 int q_bits = Q_BITS + qp_per + 1;
00050
00051 int* DCL = &DCLevel[0];
00052 int* DCR = &DCRun[0];
00053
00054 m7 = *tblock;
00055
00056
00057 for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
00058 {
00059
00060
00061 if (*m7)
00062 {
00063 scaled_coeff = iabs (*m7) * levelscale;
00064 level = (scaled_coeff + (leveloffset << 1) ) >> q_bits;
00065
00066 if (level != 0)
00067 {
00068 if (is_cavlc)
00069 level = imin(level, CAVLC_LEVEL_LIMIT);
00070
00071 level = isignab(level, *m7);
00072
00073 *m7++ = ((level * invlevelscale) << qp_per);
00074
00075 *DCL++ = level;
00076 *DCR++ = run;
00077 run = 0;
00078 nonzero = TRUE;
00079 }
00080 else
00081 {
00082 run++;
00083 *m7++ = 0;
00084 }
00085 }
00086 else
00087 {
00088 run++;
00089 m7++;
00090 }
00091 }
00092
00093 *DCL = 0;
00094
00095 return nonzero;
00096 }
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 int quant_dc4x2_normal(int **tblock, int qp, int* DCLevel, int* DCRun,
00110 int **fadjust, int levelscale, int invlevelscale, int leveloffset,
00111 const byte (*pos_scan)[2], int is_cavlc)
00112 {
00113 static int i,j, coeff_ctr;
00114
00115 static int *m7;
00116 static int scaled_coeff;
00117
00118 int level, run = 0;
00119 int nonzero = FALSE;
00120 int qp_per = qp_per_matrix[qp];
00121 int q_bits = Q_BITS + qp_per + 1;
00122 const byte *p_scan = &pos_scan[0][0];
00123 int* DCL = &DCLevel[0];
00124 int* DCR = &DCRun[0];
00125
00126
00127 for (coeff_ctr = 0; coeff_ctr < 8; coeff_ctr++)
00128 {
00129 j = *p_scan++;
00130 i = *p_scan++;
00131
00132 m7 = &tblock[j][i];
00133
00134 if (*m7 != 0)
00135 {
00136 scaled_coeff = iabs (*m7) * levelscale;
00137 level = (scaled_coeff + (leveloffset << 1) ) >> q_bits;
00138
00139 if (level != 0)
00140 {
00141 if (is_cavlc)
00142 level = imin(level, CAVLC_LEVEL_LIMIT);
00143 level = isignab(level, *m7);
00144
00145 *m7 = ((level * invlevelscale) << qp_per);
00146
00147 *DCL++ = level;
00148 *DCR++ = run;
00149
00150 run = 0;
00151 nonzero = TRUE;
00152 }
00153 else
00154 {
00155 run++;
00156 *m7 = 0;
00157 }
00158 }
00159 else
00160 {
00161 run++;
00162 }
00163 }
00164
00165 *DCL = 0;
00166
00167 return nonzero;
00168 }
00169
00170
00171