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 #include "rdoq.h"
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 int quant_dc2x2_trellis(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
00045 int level, run = 0;
00046 int nonzero = FALSE;
00047 int qp_per = qp_per_matrix[qp];
00048 int qp_rem = qp_rem_matrix[qp];
00049
00050 int* DCL = &DCLevel[0];
00051 int* DCR = &DCRun[0];
00052
00053 static int levelTrellis[16];
00054
00055 rdoq_dc_cr(tblock,qp_per,qp_rem, levelscale, leveloffset, pos_scan, levelTrellis, CHROMA_DC);
00056
00057 m7 = *tblock;
00058
00059
00060 for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
00061 {
00062
00063
00064 if (*m7)
00065 {
00066 level = levelTrellis[coeff_ctr];
00067
00068 if (level != 0)
00069 {
00070 if (is_cavlc)
00071 level = imin(level, CAVLC_LEVEL_LIMIT);
00072
00073 level = isignab(level, *m7);
00074
00075 *m7++ = ((level * invlevelscale) << qp_per);
00076
00077 *DCL++ = level;
00078 *DCR++ = run;
00079
00080 run = 0;
00081 nonzero = TRUE;
00082 }
00083 else
00084 {
00085 run++;
00086 *m7++ = 0;
00087 }
00088 }
00089 else
00090 {
00091 run++;
00092 m7++;
00093 }
00094 }
00095
00096 *DCL = 0;
00097
00098 return nonzero;
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 int quant_dc4x2_trellis(int **tblock, int qp, int* DCLevel, int* DCRun,
00113 int **fadjust, int levelscale, int invlevelscale, int leveloffset,
00114 const byte (*pos_scan)[2], int is_cavlc)
00115 {
00116 static int i,j, coeff_ctr;
00117
00118 static int *m7;
00119
00120 int level, run = 0;
00121 int nonzero = FALSE;
00122 int qp_per = qp_per_matrix[qp];
00123 int qp_rem = qp_rem_matrix[qp];
00124 const byte *p_scan = &pos_scan[0][0];
00125 int* DCL = &DCLevel[0];
00126 int* DCR = &DCRun[0];
00127
00128 static int levelTrellis[16];
00129
00130 rdoq_dc_cr(tblock,qp_per,qp_rem, levelscale, leveloffset,pos_scan, levelTrellis, CHROMA_DC_2x4);
00131
00132 for (coeff_ctr=0; coeff_ctr < 8; coeff_ctr++)
00133 {
00134 j = *p_scan++;
00135 i = *p_scan++;
00136
00137 m7 = &tblock[j][i];
00138
00139 if (*m7 != 0)
00140 {
00141 level = levelTrellis[coeff_ctr];
00142
00143 if (level != 0)
00144 {
00145 if (is_cavlc)
00146 level = imin(level, CAVLC_LEVEL_LIMIT);
00147 level = isignab(level, *m7);
00148
00149 *m7 = ((level * invlevelscale) << qp_per);
00150
00151 *DCL++ = level;
00152 *DCR++ = run;
00153
00154 run = 0;
00155 nonzero = TRUE;
00156 }
00157 else
00158 {
00159 run++;
00160 *m7 = 0;
00161 }
00162 }
00163 else
00164 {
00165 run++;
00166 }
00167 }
00168
00169 *DCL = 0;
00170
00171 return nonzero;
00172 }
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 void rdoq_dc_cr_CAVLC(int **tblock, int qp_per, int qp_rem, int levelscale, int leveloffset, const byte (*pos_scan)[2], int levelTrellis[], int type)
00183 {
00184 const byte *p_scan = &pos_scan[0][0];
00185 levelDataStruct levelData[16];
00186 double lambda_md = 0;
00187 Macroblock *currMB = &img->mb_data[img->current_mb_nr];
00188
00189 if ((img->type==B_SLICE) && img->nal_reference_idc)
00190 {
00191 lambda_md = img->lambda_md[5][img->masterQP];
00192 }
00193 else
00194 {
00195 lambda_md = img->lambda_md[img->type][img->masterQP];
00196 }
00197
00198 init_trellis_data_DC_cr_CAVLC(tblock, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, &levelData[0]);
00199 est_RunLevel_CAVLC(levelData, levelTrellis, CHROMA_DC, 0, 0, img->num_cdc_coeff, lambda_md);
00200 }
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 void rdoq_dc_cr_CABAC(int **tblock, int qp_per, int qp_rem, int levelscale, int leveloffset, const byte (*pos_scan)[2], int levelTrellis[], int type)
00211 {
00212 const byte *p_scan = &pos_scan[0][0];
00213 levelDataStruct levelData[16];
00214 double lambda_md = 0;
00215 int kStart=0, kStop=0, noCoeff = 0, estBits;
00216 Macroblock *currMB = &img->mb_data[img->current_mb_nr];
00217
00218 if ((img->type==B_SLICE) && img->nal_reference_idc)
00219 {
00220 lambda_md = img->lambda_md[5][img->masterQP];
00221 }
00222 else
00223 {
00224 lambda_md = img->lambda_md[img->type][img->masterQP];
00225 }
00226
00227 noCoeff = init_trellis_data_DC_cr_CABAC(tblock, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, &levelData[0], &kStart, &kStop);
00228 estBits = est_write_and_store_CBP_block_bit(currMB, type);
00229 est_writeRunLevel_CABAC(levelData, levelTrellis, type, lambda_md, kStart, kStop, noCoeff, estBits);
00230 }
00231
00232