00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "contributors.h"
00019
00020 #include <math.h>
00021
00022 #include "global.h"
00023
00024 #include "image.h"
00025 #include "mb_access.h"
00026 #include "vlc.h"
00027 #include "transform.h"
00028 #include "mc_prediction.h"
00029 #include "q_offsets.h"
00030 #include "q_matrix.h"
00031 #include "quant4x4.h"
00032 #include "rdoq.h"
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 int quant_4x4_trellis(int **tblock, int block_y, int block_x, int qp,
00046 int* ACLevel, int* ACRun,
00047 int **fadjust4x4, int **levelscale, int **invlevelscale, int **leveloffset,
00048 int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost, int is_cavlc)
00049 {
00050 static int i,j, coeff_ctr;
00051
00052 static int *m7;
00053
00054 int level, run = 0;
00055 int nonzero = FALSE;
00056 int qp_per = qp_per_matrix[qp];
00057 int qp_rem = qp_rem_matrix[qp];
00058 const byte *p_scan = &pos_scan[0][0];
00059 int* ACL = &ACLevel[0];
00060 int* ACR = &ACRun[0];
00061
00062 static int levelTrellis[16];
00063
00064 rdoq_4x4(tblock, block_y, block_x, qp_per, qp_rem, levelscale, leveloffset, pos_scan, levelTrellis);
00065
00066
00067 for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
00068 {
00069 i = *p_scan++;
00070 j = *p_scan++;
00071
00072 m7 = &tblock[j][block_x + i];
00073
00074 if (*m7 != 0)
00075 {
00076
00077
00078
00079
00080 level = levelTrellis[coeff_ctr];
00081
00082 if (level != 0)
00083 {
00084 if (is_cavlc)
00085 level = imin(level, CAVLC_LEVEL_LIMIT);
00086
00087 *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
00088
00089 level = isignab(level, *m7);
00090 *m7 = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 4);
00091 *ACL++ = level;
00092 *ACR++ = run;
00093
00094 run = 0;
00095 nonzero = TRUE;
00096 }
00097 else
00098 {
00099 run++;
00100 *m7 = 0;
00101 }
00102 }
00103 else
00104 {
00105 run++;
00106 }
00107 }
00108
00109 *ACL = 0;
00110
00111 return nonzero;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 void rdoq_4x4_CAVLC(int **tblock, int block_y, int block_x, int qp_per, int qp_rem,
00123 int **levelscale, int **leveloffset, const byte (*pos_scan)[2], int levelTrellis[])
00124 {
00125 const byte *p_scan = &pos_scan[0][0];
00126 levelDataStruct levelData[16];
00127 double lambda_md = 0;
00128 Macroblock *currMB = &img->mb_data[img->current_mb_nr];
00129 int type = LUMA_4x4;
00130 int pos_x = block_x >> BLOCK_SHIFT;
00131 int pos_y = block_y >> BLOCK_SHIFT;
00132 int b8 = 2*(pos_y >> 1) + (pos_x >> 1);
00133 int b4 = 2*(pos_y & 0x01) + (pos_x & 0x01);
00134
00135 if ((img->type==B_SLICE) && img->nal_reference_idc)
00136 {
00137 lambda_md = img->lambda_md[5][img->masterQP];
00138 }
00139 else
00140 {
00141 lambda_md = img->lambda_md[img->type][img->masterQP];
00142 }
00143
00144 init_trellis_data_4x4_CAVLC(tblock, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, &levelData[0], type);
00145 est_RunLevel_CAVLC(levelData, levelTrellis, LUMA, b8, b4, 16, lambda_md);
00146 }
00147
00148
00149
00150
00151
00152
00153
00154
00155 void rdoq_4x4_CABAC(int **tblock, int block_y, int block_x, int qp_per, int qp_rem,
00156 int **levelscale, int **leveloffset, const byte (*pos_scan)[2], int levelTrellis[])
00157 {
00158 const byte *p_scan = &pos_scan[0][0];
00159 levelDataStruct levelData[16];
00160 double lambda_md = 0;
00161 int kStart=0, kStop=0, noCoeff = 0, estBits;
00162 Macroblock *currMB = &img->mb_data[img->current_mb_nr];
00163 int type = LUMA_4x4;
00164
00165 if ((img->type==B_SLICE) && img->nal_reference_idc)
00166 {
00167 lambda_md = img->lambda_md[5][img->masterQP];
00168 }
00169 else
00170 {
00171 lambda_md = img->lambda_md[img->type][img->masterQP];
00172 }
00173
00174 noCoeff = init_trellis_data_4x4_CABAC(tblock, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, &levelData[0], &kStart, &kStop, type);
00175 estBits = est_write_and_store_CBP_block_bit(currMB, LUMA_4x4);
00176 est_writeRunLevel_CABAC(levelData, levelTrellis, LUMA_4x4, lambda_md, kStart, kStop, noCoeff, estBits);
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 int quant_ac4x4_trellis(int **tblock, int block_y, int block_x, int qp,
00191 int* ACLevel, int* ACRun,
00192 int **fadjust4x4, int **levelscale, int **invlevelscale, int **leveloffset,
00193 int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost, int type, int is_calvc)
00194 {
00195 static int i,j, coeff_ctr;
00196
00197 static int *m7;
00198 int level, run = 0;
00199 int nonzero = FALSE;
00200 int qp_per = qp_per_matrix[qp];
00201 int qp_rem = qp_rem_matrix[qp];
00202 const byte *p_scan = &pos_scan[1][0];
00203 int* ACL = &ACLevel[0];
00204 int* ACR = &ACRun[0];
00205
00206 static int levelTrellis[16];
00207
00208 rdoq_ac4x4(tblock, block_y, block_x, qp_per, qp_rem, levelscale, leveloffset, pos_scan, levelTrellis, type);
00209
00210
00211 for (coeff_ctr = 1; coeff_ctr < 16; coeff_ctr++)
00212 {
00213 i = *p_scan++;
00214 j = *p_scan++;
00215
00216 m7 = &tblock[j][block_x + i];
00217 if (*m7 != 0)
00218 {
00219
00220
00221
00222
00223 level=levelTrellis[coeff_ctr - 1];
00224
00225 if (level != 0)
00226 {
00227 if (is_calvc)
00228 level = imin(level, CAVLC_LEVEL_LIMIT);
00229
00230 *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
00231
00232 level = isignab(level, *m7);
00233 *m7 = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 4);
00234
00235
00236
00237 *ACL++ = level;
00238 *ACR++ = run;
00239
00240 run = 0;
00241 nonzero = TRUE;
00242 }
00243 else
00244 {
00245 run++;
00246 *m7 = 0;
00247 }
00248 }
00249 else
00250 {
00251 run++;
00252 }
00253 }
00254
00255 *ACL = 0;
00256
00257 return nonzero;
00258 }
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 void rdoq_ac4x4_CAVLC(int **tblock, int block_y, int block_x, int qp_per, int qp_rem,
00269 int **levelscale, int **leveloffset, const byte (*pos_scan)[2], int levelTrellis[], int type)
00270 {
00271 const byte *p_scan = &pos_scan[1][0];
00272 levelDataStruct levelData[16];
00273 double lambda_md = 0;
00274 Macroblock *currMB = &img->mb_data[img->current_mb_nr];
00275 int pos_x = block_x >> BLOCK_SHIFT;
00276 int pos_y = block_y >> BLOCK_SHIFT;
00277 int b8 = 2*(pos_y >> 1) + (pos_x >> 1);
00278 int b4 = 2*(pos_y & 0x01) + (pos_x & 0x01);
00279 int block_type = ( (type == CHROMA_AC) ? CHROMA_AC : LUMA_INTRA16x16AC);
00280
00281 if ((img->type==B_SLICE) && img->nal_reference_idc)
00282 {
00283 lambda_md = img->lambda_md[5][img->masterQP];
00284 }
00285 else
00286 {
00287 lambda_md = img->lambda_md[img->type][img->masterQP];
00288 }
00289
00290 init_trellis_data_4x4_CAVLC(tblock, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, &levelData[0], type);
00291 est_RunLevel_CAVLC(levelData, levelTrellis, block_type, b8, b4, 15, lambda_md);
00292 }
00293
00294
00295
00296
00297
00298
00299
00300
00301 void rdoq_ac4x4_CABAC(int **tblock , int block_y, int block_x, int qp_per, int qp_rem,
00302 int **levelscale, int **leveloffset, const byte (*pos_scan)[2], int levelTrellis[], int type)
00303 {
00304 const byte *p_scan = &pos_scan[1][0];
00305 levelDataStruct levelData[16];
00306 double lambda_md=0;
00307 int kStart = 0, kStop = 0, noCoeff = 0, estBits;
00308 Macroblock *currMB = &img->mb_data[img->current_mb_nr];
00309
00310 if ((img->type==B_SLICE) && img->nal_reference_idc)
00311 {
00312 lambda_md = img->lambda_md[5][img->masterQP];
00313 }
00314 else
00315 {
00316 lambda_md = img->lambda_md[img->type][img->masterQP];
00317 }
00318
00319 noCoeff = init_trellis_data_4x4_CABAC(tblock, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, &levelData[0], &kStart, &kStop, type);
00320 estBits = est_write_and_store_CBP_block_bit(currMB, type);
00321 est_writeRunLevel_CABAC(levelData, levelTrellis, type, lambda_md, kStart, kStop, noCoeff, estBits);
00322 }
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335 int quant_dc4x4_trellis(int **tblock, int qp, int* DCLevel, int* DCRun,
00336 int levelscale, int invlevelscale, int leveloffset, const byte (*pos_scan)[2], int is_calvc)
00337 {
00338 static int i,j, coeff_ctr;
00339
00340 static int *m7;
00341
00342 int level, run = 0;
00343 int nonzero = FALSE;
00344 int qp_per = qp_per_matrix[qp];
00345 int qp_rem = qp_rem_matrix[qp];
00346 const byte *p_scan = &pos_scan[0][0];
00347 int* DCL = &DCLevel[0];
00348 int* DCR = &DCRun[0];
00349
00350 static int levelTrellis[16];
00351
00352 rdoq_dc(tblock, qp_per, qp_rem, levelscale, leveloffset, pos_scan, levelTrellis, LUMA_16DC);
00353
00354
00355 for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
00356 {
00357 i = *p_scan++;
00358 j = *p_scan++;
00359
00360 m7 = &tblock[j][i];
00361
00362 if (*m7 != 0)
00363 {
00364 level = levelTrellis[coeff_ctr];
00365
00366 if (level != 0)
00367 {
00368 if (is_calvc)
00369 level = imin(level, CAVLC_LEVEL_LIMIT);
00370
00371 level = isignab(level, *m7);
00372 *m7 = level;
00373 *DCL++ = level;
00374 *DCR++ = run;
00375
00376 run = 0;
00377 nonzero = TRUE;
00378 }
00379 else
00380 {
00381 run++;
00382 *m7 = 0;
00383 }
00384 }
00385 else
00386 {
00387 run++;
00388 }
00389 }
00390
00391 *DCL = 0;
00392
00393 return nonzero;
00394 }
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404 void rdoq_dc_CAVLC(int **tblock, int qp_per, int qp_rem, int levelscale, int leveloffset, const byte (*pos_scan)[2], int levelTrellis[], int type)
00405 {
00406 const byte *p_scan = &pos_scan[0][0];
00407 levelDataStruct levelData[16];
00408 double lambda_md = 0;
00409 Macroblock *currMB = &img->mb_data[img->current_mb_nr];
00410
00411 if ((img->type==B_SLICE) && img->nal_reference_idc)
00412 {
00413 lambda_md = img->lambda_md[5][img->masterQP];
00414 }
00415 else
00416 {
00417 lambda_md = img->lambda_md[img->type][img->masterQP];
00418 }
00419
00420 init_trellis_data_DC_CAVLC(tblock, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, &levelData[0], type);
00421 est_RunLevel_CAVLC(levelData, levelTrellis, LUMA_INTRA16x16DC, 0, 0, 16, lambda_md);
00422 }
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433 void rdoq_dc_CABAC(int **tblock, int qp_per, int qp_rem, int levelscale, int leveloffset, const byte (*pos_scan)[2], int levelTrellis[], int type)
00434 {
00435 const byte *p_scan = &pos_scan[0][0];
00436 levelDataStruct levelData[16];
00437 double lambda_md = 0;
00438 int kStart=0, kStop=0, noCoeff = 0, estBits;
00439 Macroblock *currMB = &img->mb_data[img->current_mb_nr];
00440
00441 if ((img->type==B_SLICE) && img->nal_reference_idc)
00442 {
00443 lambda_md = img->lambda_md[5][img->masterQP];
00444 }
00445 else
00446 {
00447 lambda_md = img->lambda_md[img->type][img->masterQP];
00448 }
00449
00450 noCoeff = init_trellis_data_DC_CABAC(tblock, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, &levelData[0], &kStart, &kStop);
00451 estBits = est_write_and_store_CBP_block_bit(currMB, type);
00452 est_writeRunLevel_CABAC(levelData, levelTrellis, type, lambda_md, kStart, kStop, noCoeff, estBits);
00453 }
00454