00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "contributors.h"
00016
00017 #include <math.h>
00018
00019 #include "global.h"
00020
00021 #include "image.h"
00022 #include "mb_access.h"
00023 #include "vlc.h"
00024 #include "transform.h"
00025 #include "mc_prediction.h"
00026 #include "q_offsets.h"
00027 #include "q_matrix.h"
00028 #include "quant8x8.h"
00029 #include "rdoq.h"
00030
00031 void rdoq_8x8_CABAC(int **tblock, int block_y, int block_x, int qp_per, int qp_rem,
00032 int **levelscale, int **leveloffset, const byte *p_scan, int levelTrellis[64]);
00033
00034 void rdoq_8x8_CAVLC(int **tblock, int block_y, int block_x, int qp_per, int qp_rem,
00035 int **levelscale, int **leveloffset, const byte *p_scan, int levelTrellis[4][16]);
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 int quant_8x8_trellis(int **tblock, int block_y, int block_x, int qp,
00049 int* ACLevel, int* ACRun,
00050 int **fadjust8x8, int **levelscale, int **invlevelscale, int **leveloffset,
00051 int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost)
00052 {
00053 static int i,j, coeff_ctr;
00054
00055 static int *m7;
00056 static int scaled_coeff;
00057 int level, run = 0;
00058 int nonzero = FALSE;
00059 int qp_per = qp_per_matrix[qp];
00060 int qp_rem = qp_rem_matrix[qp];
00061 const byte *p_scan = &pos_scan[0][0];
00062 int* ACL = &ACLevel[0];
00063 int* ACR = &ACRun[0];
00064 int levelTrellis[64];
00065
00066 rdoq_8x8_CABAC(tblock, block_y, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, levelTrellis);
00067
00068
00069 for (coeff_ctr = 0; coeff_ctr < 64; coeff_ctr++)
00070 {
00071 i = *p_scan++;
00072 j = *p_scan++;
00073
00074 m7 = &tblock[j][block_x + i];
00075 if (*m7 != 0)
00076 {
00077 scaled_coeff = iabs (*m7) * levelscale[j][i];
00078 level = levelTrellis[coeff_ctr];
00079
00080 if (level != 0)
00081 {
00082 nonzero = TRUE;
00083
00084 *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
00085
00086 level = isignab(level, *m7);
00087 *m7 = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
00088 *ACL++ = level;
00089 *ACR++ = run;
00090
00091 run = 0;
00092 }
00093 else
00094 {
00095 run++;
00096 *m7 = 0;
00097 }
00098 }
00099 else
00100 {
00101 run++;
00102 }
00103 }
00104
00105 *ACL = 0;
00106
00107 return nonzero;
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 int quant_8x8cavlc_trellis(int **tblock, int block_y, int block_x, int qp, 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 int level, runs[4] = { 0 };
00130 int nonzero = FALSE;
00131 int qp_per = qp_per_matrix[qp];
00132 int qp_rem = qp_rem_matrix[qp];
00133 const byte *p_scan = &pos_scan[0][0];
00134 int* ACL[4];
00135 int* ACR[4];
00136
00137 int levelTrellis[4][16];
00138
00139 rdoq_8x8_CAVLC(tblock, block_y, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, levelTrellis);
00140
00141 for (k = 0; k < 4; k++)
00142 {
00143 ACL[k] = &cofAC[k][0][0];
00144 ACR[k] = &cofAC[k][1][0];
00145 }
00146
00147
00148 for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
00149 {
00150 for (k = 0; k < 4; k++)
00151 {
00152 i = *p_scan++;
00153 j = *p_scan++;
00154
00155 m7 = &tblock[j][block_x + i];
00156
00157 if (m7 != 0)
00158 {
00159 level = levelTrellis[k][coeff_ctr];
00160
00161 if (level != 0)
00162 {
00163 nonzero=TRUE;
00164
00165 *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[runs[k]];
00166
00167 level = isignab(level, *m7);
00168 *m7 = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
00169
00170 *(ACL[k])++ = level;
00171 *(ACR[k])++ = runs[k];
00172
00173 runs[k] = 0;
00174 }
00175 else
00176 {
00177 runs[k]++;
00178 *m7 = 0;
00179 }
00180 }
00181 else
00182 {
00183 runs[k]++;
00184 }
00185 }
00186 }
00187
00188 for(k = 0; k < 4; k++)
00189 *(ACL[k]) = 0;
00190
00191 return nonzero;
00192 }
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202 void rdoq_8x8_CABAC(int **tblock, int block_y, int block_x,int qp_per, int qp_rem,
00203 int **levelscale, int **leveloffset, const byte *p_scan, int levelTrellis[64])
00204 {
00205 levelDataStruct levelData[64];
00206 double lambda_md=0;
00207 int kStart = 0, kStop = 0, noCoeff = 0;
00208 Macroblock *currMB = &img->mb_data[img->current_mb_nr];
00209
00210 if ((img->type==B_SLICE) && img->nal_reference_idc)
00211 {
00212 lambda_md = img->lambda_md[5][img->masterQP];
00213 }
00214 else
00215 {
00216 lambda_md = img->lambda_md[img->type][img->masterQP];
00217 }
00218
00219 noCoeff = init_trellis_data_8x8_CABAC(tblock, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, &levelData[0], &kStart, &kStop, CABAC);
00220 est_writeRunLevel_CABAC(levelData, levelTrellis, LUMA_8x8, lambda_md, kStart, kStop, noCoeff, 0);
00221 }
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 void rdoq_8x8_CAVLC(int **tblock, int block_y, int block_x, int qp_per, int qp_rem,
00232 int **levelscale, int **leveloffset, const byte *p_scan, int levelTrellis[4][16])
00233 {
00234 int k;
00235 levelDataStruct levelData[4][16];
00236 double lambda_md;
00237 Macroblock *currMB = &img->mb_data[img->current_mb_nr];
00238 int b8 = ((block_y/8)<<1)+block_x/8;
00239
00240 if ((img->type==B_SLICE) && img->nal_reference_idc)
00241 {
00242 lambda_md = img->lambda_md[5][img->masterQP];
00243 }
00244 else
00245 {
00246 lambda_md = img->lambda_md[img->type][img->masterQP];
00247 }
00248
00249 init_trellis_data_8x8_CAVLC (tblock, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, levelData);
00250
00251 for (k = 0; k < 4; k++)
00252 est_RunLevel_CAVLC(levelData[k], levelTrellis[k], LUMA, b8, k, 16, lambda_md);
00253 }
00254