| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 extern void vp8_auto_select_speed(VP8_COMP *cpi); | 43 extern void vp8_auto_select_speed(VP8_COMP *cpi); |
| 44 extern void vp8cx_init_mbrthread_data(VP8_COMP *cpi, | 44 extern void vp8cx_init_mbrthread_data(VP8_COMP *cpi, |
| 45 MACROBLOCK *x, | 45 MACROBLOCK *x, |
| 46 MB_ROW_COMP *mbr_ei, | 46 MB_ROW_COMP *mbr_ei, |
| 47 int mb_row, | 47 int mb_row, |
| 48 int count); | 48 int count); |
| 49 void vp8_build_block_offsets(MACROBLOCK *x); | 49 void vp8_build_block_offsets(MACROBLOCK *x); |
| 50 void vp8_setup_block_ptrs(MACROBLOCK *x); | 50 void vp8_setup_block_ptrs(MACROBLOCK *x); |
| 51 int vp8cx_encode_inter_macroblock(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t,
int recon_yoffset, int recon_uvoffset); | 51 int vp8cx_encode_inter_macroblock(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t,
int recon_yoffset, int recon_uvoffset); |
| 52 int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
; | 52 int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
; |
| 53 static void adjust_act_zbin( VP8_COMP *cpi, MACROBLOCK *x ); |
| 53 | 54 |
| 54 #ifdef MODE_STATS | 55 #ifdef MODE_STATS |
| 55 unsigned int inter_y_modes[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | 56 unsigned int inter_y_modes[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
| 56 unsigned int inter_uv_modes[4] = {0, 0, 0, 0}; | 57 unsigned int inter_uv_modes[4] = {0, 0, 0, 0}; |
| 57 unsigned int inter_b_modes[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | 58 unsigned int inter_b_modes[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
| 58 unsigned int y_modes[5] = {0, 0, 0, 0, 0}; | 59 unsigned int y_modes[5] = {0, 0, 0, 0, 0}; |
| 59 unsigned int uv_modes[4] = {0, 0, 0, 0}; | 60 unsigned int uv_modes[4] = {0, 0, 0, 0}; |
| 60 unsigned int b_modes[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | 61 unsigned int b_modes[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
| 61 #endif | 62 #endif |
| 62 | 63 |
| 63 static const int qrounding_factors[129] = | |
| 64 { | |
| 65 48, 48, 48, 48, 48, 48, 48, 48, | |
| 66 48, 48, 48, 48, 48, 48, 48, 48, | |
| 67 48, 48, 48, 48, 48, 48, 48, 48, | |
| 68 48, 48, 48, 48, 48, 48, 48, 48, | |
| 69 48, 48, 48, 48, 48, 48, 48, 48, | |
| 70 48, 48, 48, 48, 48, 48, 48, 48, | |
| 71 48, 48, 48, 48, 48, 48, 48, 48, | |
| 72 48, 48, 48, 48, 48, 48, 48, 48, | |
| 73 48, 48, 48, 48, 48, 48, 48, 48, | |
| 74 48, 48, 48, 48, 48, 48, 48, 48, | |
| 75 48, 48, 48, 48, 48, 48, 48, 48, | |
| 76 48, 48, 48, 48, 48, 48, 48, 48, | |
| 77 48, 48, 48, 48, 48, 48, 48, 48, | |
| 78 48, 48, 48, 48, 48, 48, 48, 48, | |
| 79 48, 48, 48, 48, 48, 48, 48, 48, | |
| 80 48, 48, 48, 48, 48, 48, 48, 48, | |
| 81 48 | |
| 82 }; | |
| 83 | |
| 84 static const int qzbin_factors[129] = | |
| 85 { | |
| 86 84, 84, 84, 84, 84, 84, 84, 84, | |
| 87 84, 84, 84, 84, 84, 84, 84, 84, | |
| 88 84, 84, 84, 84, 84, 84, 84, 84, | |
| 89 84, 84, 84, 84, 84, 84, 84, 84, | |
| 90 84, 84, 84, 84, 84, 84, 84, 84, | |
| 91 84, 84, 84, 84, 84, 84, 84, 84, | |
| 92 80, 80, 80, 80, 80, 80, 80, 80, | |
| 93 80, 80, 80, 80, 80, 80, 80, 80, | |
| 94 80, 80, 80, 80, 80, 80, 80, 80, | |
| 95 80, 80, 80, 80, 80, 80, 80, 80, | |
| 96 80, 80, 80, 80, 80, 80, 80, 80, | |
| 97 80, 80, 80, 80, 80, 80, 80, 80, | |
| 98 80, 80, 80, 80, 80, 80, 80, 80, | |
| 99 80, 80, 80, 80, 80, 80, 80, 80, | |
| 100 80, 80, 80, 80, 80, 80, 80, 80, | |
| 101 80, 80, 80, 80, 80, 80, 80, 80, | |
| 102 80 | |
| 103 }; | |
| 104 | |
| 105 static const int qrounding_factors_y2[129] = | |
| 106 { | |
| 107 48, 48, 48, 48, 48, 48, 48, 48, | |
| 108 48, 48, 48, 48, 48, 48, 48, 48, | |
| 109 48, 48, 48, 48, 48, 48, 48, 48, | |
| 110 48, 48, 48, 48, 48, 48, 48, 48, | |
| 111 48, 48, 48, 48, 48, 48, 48, 48, | |
| 112 48, 48, 48, 48, 48, 48, 48, 48, | |
| 113 48, 48, 48, 48, 48, 48, 48, 48, | |
| 114 48, 48, 48, 48, 48, 48, 48, 48, | |
| 115 48, 48, 48, 48, 48, 48, 48, 48, | |
| 116 48, 48, 48, 48, 48, 48, 48, 48, | |
| 117 48, 48, 48, 48, 48, 48, 48, 48, | |
| 118 48, 48, 48, 48, 48, 48, 48, 48, | |
| 119 48, 48, 48, 48, 48, 48, 48, 48, | |
| 120 48, 48, 48, 48, 48, 48, 48, 48, | |
| 121 48, 48, 48, 48, 48, 48, 48, 48, | |
| 122 48, 48, 48, 48, 48, 48, 48, 48, | |
| 123 48 | |
| 124 }; | |
| 125 | |
| 126 static const int qzbin_factors_y2[129] = | |
| 127 { | |
| 128 84, 84, 84, 84, 84, 84, 84, 84, | |
| 129 84, 84, 84, 84, 84, 84, 84, 84, | |
| 130 84, 84, 84, 84, 84, 84, 84, 84, | |
| 131 84, 84, 84, 84, 84, 84, 84, 84, | |
| 132 84, 84, 84, 84, 84, 84, 84, 84, | |
| 133 84, 84, 84, 84, 84, 84, 84, 84, | |
| 134 80, 80, 80, 80, 80, 80, 80, 80, | |
| 135 80, 80, 80, 80, 80, 80, 80, 80, | |
| 136 80, 80, 80, 80, 80, 80, 80, 80, | |
| 137 80, 80, 80, 80, 80, 80, 80, 80, | |
| 138 80, 80, 80, 80, 80, 80, 80, 80, | |
| 139 80, 80, 80, 80, 80, 80, 80, 80, | |
| 140 80, 80, 80, 80, 80, 80, 80, 80, | |
| 141 80, 80, 80, 80, 80, 80, 80, 80, | |
| 142 80, 80, 80, 80, 80, 80, 80, 80, | |
| 143 80, 80, 80, 80, 80, 80, 80, 80, | |
| 144 80 | |
| 145 }; | |
| 146 | |
| 147 #define EXACT_QUANT | |
| 148 #ifdef EXACT_QUANT | |
| 149 static void vp8cx_invert_quant(int improved_quant, short *quant, | |
| 150 short *shift, short d) | |
| 151 { | |
| 152 if(improved_quant) | |
| 153 { | |
| 154 unsigned t; | |
| 155 int l; | |
| 156 t = d; | |
| 157 for(l = 0; t > 1; l++) | |
| 158 t>>=1; | |
| 159 t = 1 + (1<<(16+l))/d; | |
| 160 *quant = (short)(t - (1<<16)); | |
| 161 *shift = l; | |
| 162 } | |
| 163 else | |
| 164 { | |
| 165 *quant = (1 << 16) / d; | |
| 166 *shift = 0; | |
| 167 } | |
| 168 } | |
| 169 | |
| 170 void vp8cx_init_quantizer(VP8_COMP *cpi) | |
| 171 { | |
| 172 int i; | |
| 173 int quant_val; | |
| 174 int Q; | |
| 175 | |
| 176 int zbin_boost[16] = {0, 0, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 4
4, 44}; | |
| 177 | |
| 178 for (Q = 0; Q < QINDEX_RANGE; Q++) | |
| 179 { | |
| 180 // dc values | |
| 181 quant_val = vp8_dc_quant(Q, cpi->common.y1dc_delta_q); | |
| 182 cpi->Y1quant_fast[Q][0] = (1 << 16) / quant_val; | |
| 183 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + 0, | |
| 184 cpi->Y1quant_shift[Q] + 0, quant_val); | |
| 185 cpi->Y1zbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7; | |
| 186 cpi->Y1round[Q][0] = (qrounding_factors[Q] * quant_val) >> 7; | |
| 187 cpi->common.Y1dequant[Q][0] = quant_val; | |
| 188 cpi->zrun_zbin_boost_y1[Q][0] = (quant_val * zbin_boost[0]) >> 7; | |
| 189 | |
| 190 quant_val = vp8_dc2quant(Q, cpi->common.y2dc_delta_q); | |
| 191 cpi->Y2quant_fast[Q][0] = (1 << 16) / quant_val; | |
| 192 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + 0, | |
| 193 cpi->Y2quant_shift[Q] + 0, quant_val); | |
| 194 cpi->Y2zbin[Q][0] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7; | |
| 195 cpi->Y2round[Q][0] = (qrounding_factors_y2[Q] * quant_val) >> 7; | |
| 196 cpi->common.Y2dequant[Q][0] = quant_val; | |
| 197 cpi->zrun_zbin_boost_y2[Q][0] = (quant_val * zbin_boost[0]) >> 7; | |
| 198 | |
| 199 quant_val = vp8_dc_uv_quant(Q, cpi->common.uvdc_delta_q); | |
| 200 cpi->UVquant_fast[Q][0] = (1 << 16) / quant_val; | |
| 201 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + 0, | |
| 202 cpi->UVquant_shift[Q] + 0, quant_val); | |
| 203 cpi->UVzbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;; | |
| 204 cpi->UVround[Q][0] = (qrounding_factors[Q] * quant_val) >> 7; | |
| 205 cpi->common.UVdequant[Q][0] = quant_val; | |
| 206 cpi->zrun_zbin_boost_uv[Q][0] = (quant_val * zbin_boost[0]) >> 7; | |
| 207 | |
| 208 // all the ac values = ; | |
| 209 for (i = 1; i < 16; i++) | |
| 210 { | |
| 211 int rc = vp8_default_zig_zag1d[i]; | |
| 212 | |
| 213 quant_val = vp8_ac_yquant(Q); | |
| 214 cpi->Y1quant_fast[Q][rc] = (1 << 16) / quant_val; | |
| 215 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + rc, | |
| 216 cpi->Y1quant_shift[Q] + rc, quant_val); | |
| 217 cpi->Y1zbin[Q][rc] = ((qzbin_factors[Q] * quant_val) + 64) >> 7; | |
| 218 cpi->Y1round[Q][rc] = (qrounding_factors[Q] * quant_val) >> 7; | |
| 219 cpi->common.Y1dequant[Q][rc] = quant_val; | |
| 220 cpi->zrun_zbin_boost_y1[Q][i] = (quant_val * zbin_boost[i]) >> 7; | |
| 221 | |
| 222 quant_val = vp8_ac2quant(Q, cpi->common.y2ac_delta_q); | |
| 223 cpi->Y2quant_fast[Q][rc] = (1 << 16) / quant_val; | |
| 224 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + rc, | |
| 225 cpi->Y2quant_shift[Q] + rc, quant_val); | |
| 226 cpi->Y2zbin[Q][rc] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7; | |
| 227 cpi->Y2round[Q][rc] = (qrounding_factors_y2[Q] * quant_val) >> 7; | |
| 228 cpi->common.Y2dequant[Q][rc] = quant_val; | |
| 229 cpi->zrun_zbin_boost_y2[Q][i] = (quant_val * zbin_boost[i]) >> 7; | |
| 230 | |
| 231 quant_val = vp8_ac_uv_quant(Q, cpi->common.uvac_delta_q); | |
| 232 cpi->UVquant_fast[Q][rc] = (1 << 16) / quant_val; | |
| 233 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + rc, | |
| 234 cpi->UVquant_shift[Q] + rc, quant_val); | |
| 235 cpi->UVzbin[Q][rc] = ((qzbin_factors[Q] * quant_val) + 64) >> 7; | |
| 236 cpi->UVround[Q][rc] = (qrounding_factors[Q] * quant_val) >> 7; | |
| 237 cpi->common.UVdequant[Q][rc] = quant_val; | |
| 238 cpi->zrun_zbin_boost_uv[Q][i] = (quant_val * zbin_boost[i]) >> 7; | |
| 239 } | |
| 240 } | |
| 241 } | |
| 242 #else | |
| 243 void vp8cx_init_quantizer(VP8_COMP *cpi) | |
| 244 { | |
| 245 int i; | |
| 246 int quant_val; | |
| 247 int Q; | |
| 248 | |
| 249 int zbin_boost[16] = {0, 0, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 4
4, 44}; | |
| 250 | |
| 251 for (Q = 0; Q < QINDEX_RANGE; Q++) | |
| 252 { | |
| 253 // dc values | |
| 254 quant_val = vp8_dc_quant(Q, cpi->common.y1dc_delta_q); | |
| 255 cpi->Y1quant[Q][0] = (1 << 16) / quant_val; | |
| 256 cpi->Y1zbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7; | |
| 257 cpi->Y1round[Q][0] = (qrounding_factors[Q] * quant_val) >> 7; | |
| 258 cpi->common.Y1dequant[Q][0] = quant_val; | |
| 259 cpi->zrun_zbin_boost_y1[Q][0] = (quant_val * zbin_boost[0]) >> 7; | |
| 260 | |
| 261 quant_val = vp8_dc2quant(Q, cpi->common.y2dc_delta_q); | |
| 262 cpi->Y2quant[Q][0] = (1 << 16) / quant_val; | |
| 263 cpi->Y2zbin[Q][0] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7; | |
| 264 cpi->Y2round[Q][0] = (qrounding_factors_y2[Q] * quant_val) >> 7; | |
| 265 cpi->common.Y2dequant[Q][0] = quant_val; | |
| 266 cpi->zrun_zbin_boost_y2[Q][0] = (quant_val * zbin_boost[0]) >> 7; | |
| 267 | |
| 268 quant_val = vp8_dc_uv_quant(Q, cpi->common.uvdc_delta_q); | |
| 269 cpi->UVquant[Q][0] = (1 << 16) / quant_val; | |
| 270 cpi->UVzbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;; | |
| 271 cpi->UVround[Q][0] = (qrounding_factors[Q] * quant_val) >> 7; | |
| 272 cpi->common.UVdequant[Q][0] = quant_val; | |
| 273 cpi->zrun_zbin_boost_uv[Q][0] = (quant_val * zbin_boost[0]) >> 7; | |
| 274 | |
| 275 // all the ac values = ; | |
| 276 for (i = 1; i < 16; i++) | |
| 277 { | |
| 278 int rc = vp8_default_zig_zag1d[i]; | |
| 279 | |
| 280 quant_val = vp8_ac_yquant(Q); | |
| 281 cpi->Y1quant[Q][rc] = (1 << 16) / quant_val; | |
| 282 cpi->Y1zbin[Q][rc] = ((qzbin_factors[Q] * quant_val) + 64) >> 7; | |
| 283 cpi->Y1round[Q][rc] = (qrounding_factors[Q] * quant_val) >> 7; | |
| 284 cpi->common.Y1dequant[Q][rc] = quant_val; | |
| 285 cpi->zrun_zbin_boost_y1[Q][i] = (quant_val * zbin_boost[i]) >> 7; | |
| 286 | |
| 287 quant_val = vp8_ac2quant(Q, cpi->common.y2ac_delta_q); | |
| 288 cpi->Y2quant[Q][rc] = (1 << 16) / quant_val; | |
| 289 cpi->Y2zbin[Q][rc] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7; | |
| 290 cpi->Y2round[Q][rc] = (qrounding_factors_y2[Q] * quant_val) >> 7; | |
| 291 cpi->common.Y2dequant[Q][rc] = quant_val; | |
| 292 cpi->zrun_zbin_boost_y2[Q][i] = (quant_val * zbin_boost[i]) >> 7; | |
| 293 | |
| 294 quant_val = vp8_ac_uv_quant(Q, cpi->common.uvac_delta_q); | |
| 295 cpi->UVquant[Q][rc] = (1 << 16) / quant_val; | |
| 296 cpi->UVzbin[Q][rc] = ((qzbin_factors[Q] * quant_val) + 64) >> 7; | |
| 297 cpi->UVround[Q][rc] = (qrounding_factors[Q] * quant_val) >> 7; | |
| 298 cpi->common.UVdequant[Q][rc] = quant_val; | |
| 299 cpi->zrun_zbin_boost_uv[Q][i] = (quant_val * zbin_boost[i]) >> 7; | |
| 300 } | |
| 301 } | |
| 302 } | |
| 303 #endif | |
| 304 void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x) | |
| 305 { | |
| 306 int i; | |
| 307 int QIndex; | |
| 308 MACROBLOCKD *xd = &x->e_mbd; | |
| 309 int zbin_extra; | |
| 310 | |
| 311 // Select the baseline MB Q index. | |
| 312 if (xd->segmentation_enabled) | |
| 313 { | |
| 314 // Abs Value | |
| 315 if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA) | |
| 316 | |
| 317 QIndex = xd->segment_feature_data[MB_LVL_ALT_Q][xd->mode_info_contex
t->mbmi.segment_id]; | |
| 318 // Delta Value | |
| 319 else | |
| 320 { | |
| 321 QIndex = cpi->common.base_qindex + xd->segment_feature_data[MB_LVL_A
LT_Q][xd->mode_info_context->mbmi.segment_id]; | |
| 322 QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0;
// Clamp to valid range | |
| 323 } | |
| 324 } | |
| 325 else | |
| 326 QIndex = cpi->common.base_qindex; | |
| 327 | |
| 328 // Y | |
| 329 zbin_extra = (cpi->common.Y1dequant[QIndex][1] * (cpi->zbin_over_quant + cpi
->zbin_mode_boost)) >> 7; | |
| 330 | |
| 331 for (i = 0; i < 16; i++) | |
| 332 { | |
| 333 x->block[i].quant = cpi->Y1quant[QIndex]; | |
| 334 x->block[i].quant_fast = cpi->Y1quant_fast[QIndex]; | |
| 335 x->block[i].quant_shift = cpi->Y1quant_shift[QIndex]; | |
| 336 x->block[i].zbin = cpi->Y1zbin[QIndex]; | |
| 337 x->block[i].round = cpi->Y1round[QIndex]; | |
| 338 x->e_mbd.block[i].dequant = cpi->common.Y1dequant[QIndex]; | |
| 339 x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_y1[QIndex]; | |
| 340 x->block[i].zbin_extra = (short)zbin_extra; | |
| 341 } | |
| 342 | |
| 343 // UV | |
| 344 zbin_extra = (cpi->common.UVdequant[QIndex][1] * (cpi->zbin_over_quant + cpi
->zbin_mode_boost)) >> 7; | |
| 345 | |
| 346 for (i = 16; i < 24; i++) | |
| 347 { | |
| 348 x->block[i].quant = cpi->UVquant[QIndex]; | |
| 349 x->block[i].quant_fast = cpi->UVquant_fast[QIndex]; | |
| 350 x->block[i].quant_shift = cpi->UVquant_shift[QIndex]; | |
| 351 x->block[i].zbin = cpi->UVzbin[QIndex]; | |
| 352 x->block[i].round = cpi->UVround[QIndex]; | |
| 353 x->e_mbd.block[i].dequant = cpi->common.UVdequant[QIndex]; | |
| 354 x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_uv[QIndex]; | |
| 355 x->block[i].zbin_extra = (short)zbin_extra; | |
| 356 } | |
| 357 | |
| 358 // Y2 | |
| 359 zbin_extra = (cpi->common.Y2dequant[QIndex][1] * ((cpi->zbin_over_quant / 2)
+ cpi->zbin_mode_boost)) >> 7; | |
| 360 x->block[24].quant_fast = cpi->Y2quant_fast[QIndex]; | |
| 361 x->block[24].quant = cpi->Y2quant[QIndex]; | |
| 362 x->block[24].quant_shift = cpi->Y2quant_shift[QIndex]; | |
| 363 x->block[24].zbin = cpi->Y2zbin[QIndex]; | |
| 364 x->block[24].round = cpi->Y2round[QIndex]; | |
| 365 x->e_mbd.block[24].dequant = cpi->common.Y2dequant[QIndex]; | |
| 366 x->block[24].zrun_zbin_boost = cpi->zrun_zbin_boost_y2[QIndex]; | |
| 367 x->block[24].zbin_extra = (short)zbin_extra; | |
| 368 | |
| 369 /* save this macroblock QIndex for vp8_update_zbin_extra() */ | |
| 370 x->q_index = QIndex; | |
| 371 } | |
| 372 void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x) | |
| 373 { | |
| 374 int i; | |
| 375 int QIndex = x->q_index; | |
| 376 int zbin_extra; | |
| 377 | |
| 378 // Y | |
| 379 zbin_extra = (cpi->common.Y1dequant[QIndex][1] * (cpi->zbin_over_quant + cpi
->zbin_mode_boost)) >> 7; | |
| 380 for (i = 0; i < 16; i++) | |
| 381 { | |
| 382 x->block[i].zbin_extra = (short)zbin_extra; | |
| 383 } | |
| 384 | |
| 385 // UV | |
| 386 zbin_extra = (cpi->common.UVdequant[QIndex][1] * (cpi->zbin_over_quant + cpi
->zbin_mode_boost)) >> 7; | |
| 387 for (i = 16; i < 24; i++) | |
| 388 { | |
| 389 x->block[i].zbin_extra = (short)zbin_extra; | |
| 390 } | |
| 391 | |
| 392 // Y2 | |
| 393 zbin_extra = (cpi->common.Y2dequant[QIndex][1] * ((cpi->zbin_over_quant / 2)
+ cpi->zbin_mode_boost)) >> 7; | |
| 394 x->block[24].zbin_extra = (short)zbin_extra; | |
| 395 } | |
| 396 | |
| 397 void vp8cx_frame_init_quantizer(VP8_COMP *cpi) | |
| 398 { | |
| 399 // Clear Zbin mode boost for default case | |
| 400 cpi->zbin_mode_boost = 0; | |
| 401 | |
| 402 // MB level quantizer setup | |
| 403 vp8cx_mb_init_quantizer(cpi, &cpi->mb); | |
| 404 } | |
| 405 | |
| 406 | 64 |
| 407 /* activity_avg must be positive, or flat regions could get a zero weight | 65 /* activity_avg must be positive, or flat regions could get a zero weight |
| 408 * (infinite lambda), which confounds analysis. | 66 * (infinite lambda), which confounds analysis. |
| 409 * This also avoids the need for divide by zero checks in | 67 * This also avoids the need for divide by zero checks in |
| 410 * vp8_activity_masking(). | 68 * vp8_activity_masking(). |
| 411 */ | 69 */ |
| 412 #define VP8_ACTIVITY_AVG_MIN (64) | 70 #define VP8_ACTIVITY_AVG_MIN (64) |
| 413 | 71 |
| 414 /* This is used as a reference when computing the source variance for the | 72 /* This is used as a reference when computing the source variance for the |
| 415 * purposes of activity masking. | 73 * purposes of activity masking. |
| 416 * Eventually this should be replaced by custom no-reference routines, | 74 * Eventually this should be replaced by custom no-reference routines, |
| 417 * which will be faster. | 75 * which will be faster. |
| 418 */ | 76 */ |
| 419 static const unsigned char VP8_VAR_OFFS[16]= | 77 static const unsigned char VP8_VAR_OFFS[16]= |
| 420 { | 78 { |
| 421 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128 | 79 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128 |
| 422 }; | 80 }; |
| 423 | 81 |
| 424 unsigned int vp8_activity_masking(VP8_COMP *cpi, MACROBLOCK *x) | 82 |
| 83 // Original activity measure from Tim T's code. |
| 84 static unsigned int tt_activity_measure( VP8_COMP *cpi, MACROBLOCK *x ) |
| 425 { | 85 { |
| 426 unsigned int act; | 86 unsigned int act; |
| 427 unsigned int sse; | 87 unsigned int sse; |
| 428 int sum; | |
| 429 unsigned int a; | |
| 430 unsigned int b; | |
| 431 /* TODO: This could also be done over smaller areas (8x8), but that would | 88 /* TODO: This could also be done over smaller areas (8x8), but that would |
| 432 * require extensive changes elsewhere, as lambda is assumed to be fixed | 89 * require extensive changes elsewhere, as lambda is assumed to be fixed |
| 433 * over an entire MB in most of the code. | 90 * over an entire MB in most of the code. |
| 434 * Another option is to compute four 8x8 variances, and pick a single | 91 * Another option is to compute four 8x8 variances, and pick a single |
| 435 * lambda using a non-linear combination (e.g., the smallest, or second | 92 * lambda using a non-linear combination (e.g., the smallest, or second |
| 436 * smallest, etc.). | 93 * smallest, etc.). |
| 437 */ | 94 */ |
| 438 VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16var)(x->src.y_buffer, | 95 act = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16)(x->src.y_buffer, |
| 439 x->src.y_stride, VP8_VAR_OFFS, 0, &sse, &sum); | 96 x->src.y_stride, VP8_VAR_OFFS, 0, &sse); |
| 440 /* This requires a full 32 bits of precision. */ | 97 act = act<<4; |
| 441 act = (sse<<8) - sum*sum; | 98 |
| 442 /* Drop 4 to give us some headroom to work with. */ | |
| 443 act = (act + 8) >> 4; | |
| 444 /* If the region is flat, lower the activity some more. */ | 99 /* If the region is flat, lower the activity some more. */ |
| 445 if (act < 8<<12) | 100 if (act < 8<<12) |
| 446 act = act < 5<<12 ? act : 5<<12; | 101 act = act < 5<<12 ? act : 5<<12; |
| 447 /* TODO: For non-flat regions, edge regions should receive less masking | 102 |
| 448 * than textured regions, but identifying edge regions quickly and | |
| 449 * reliably enough is still a subject of experimentation. | |
| 450 * This will be most noticable near edges with a complex shape (e.g., | |
| 451 * text), but the 4x4 transform size should make this less of a problem | |
| 452 * than it would be for an 8x8 transform. | |
| 453 */ | |
| 454 /* Apply the masking to the RD multiplier. */ | |
| 455 a = act + 4*cpi->activity_avg; | |
| 456 b = 4*act + cpi->activity_avg; | |
| 457 x->rdmult = (unsigned int)(((INT64)x->rdmult*b + (a>>1))/a); | |
| 458 return act; | 103 return act; |
| 459 } | 104 } |
| 460 | 105 |
| 461 | 106 // Stub for alternative experimental activity measures. |
| 107 static unsigned int alt_activity_measure( VP8_COMP *cpi, |
| 108 MACROBLOCK *x, int use_dc_pred ) |
| 109 { |
| 110 return vp8_encode_intra(cpi,x, use_dc_pred); |
| 111 } |
| 112 |
| 113 |
| 114 // Measure the activity of the current macroblock |
| 115 // What we measure here is TBD so abstracted to this function |
| 116 #define ALT_ACT_MEASURE 1 |
| 117 static unsigned int mb_activity_measure( VP8_COMP *cpi, MACROBLOCK *x, |
| 118 int mb_row, int mb_col) |
| 119 { |
| 120 unsigned int mb_activity; |
| 121 |
| 122 if ( ALT_ACT_MEASURE ) |
| 123 { |
| 124 int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); |
| 125 |
| 126 // Or use and alternative. |
| 127 mb_activity = alt_activity_measure( cpi, x, use_dc_pred ); |
| 128 } |
| 129 else |
| 130 { |
| 131 // Original activity measure from Tim T's code. |
| 132 mb_activity = tt_activity_measure( cpi, x ); |
| 133 } |
| 134 |
| 135 if ( mb_activity < VP8_ACTIVITY_AVG_MIN ) |
| 136 mb_activity = VP8_ACTIVITY_AVG_MIN; |
| 137 |
| 138 return mb_activity; |
| 139 } |
| 140 |
| 141 // Calculate an "average" mb activity value for the frame |
| 142 #define ACT_MEDIAN 0 |
| 143 static void calc_av_activity( VP8_COMP *cpi, int64_t activity_sum ) |
| 144 { |
| 145 #if ACT_MEDIAN |
| 146 // Find median: Simple n^2 algorithm for experimentation |
| 147 { |
| 148 unsigned int median; |
| 149 unsigned int i,j; |
| 150 unsigned int * sortlist; |
| 151 unsigned int tmp; |
| 152 |
| 153 // Create a list to sort to |
| 154 CHECK_MEM_ERROR(sortlist, |
| 155 vpx_calloc(sizeof(unsigned int), |
| 156 cpi->common.MBs)); |
| 157 |
| 158 // Copy map to sort list |
| 159 vpx_memcpy( sortlist, cpi->mb_activity_map, |
| 160 sizeof(unsigned int) * cpi->common.MBs ); |
| 161 |
| 162 |
| 163 // Ripple each value down to its correct position |
| 164 for ( i = 1; i < cpi->common.MBs; i ++ ) |
| 165 { |
| 166 for ( j = i; j > 0; j -- ) |
| 167 { |
| 168 if ( sortlist[j] < sortlist[j-1] ) |
| 169 { |
| 170 // Swap values |
| 171 tmp = sortlist[j-1]; |
| 172 sortlist[j-1] = sortlist[j]; |
| 173 sortlist[j] = tmp; |
| 174 } |
| 175 else |
| 176 break; |
| 177 } |
| 178 } |
| 179 |
| 180 // Even number MBs so estimate median as mean of two either side. |
| 181 median = ( 1 + sortlist[cpi->common.MBs >> 1] + |
| 182 sortlist[(cpi->common.MBs >> 1) + 1] ) >> 1; |
| 183 |
| 184 cpi->activity_avg = median; |
| 185 |
| 186 vpx_free(sortlist); |
| 187 } |
| 188 #else |
| 189 // Simple mean for now |
| 190 cpi->activity_avg = (unsigned int)(activity_sum/cpi->common.MBs); |
| 191 #endif |
| 192 |
| 193 if (cpi->activity_avg < VP8_ACTIVITY_AVG_MIN) |
| 194 cpi->activity_avg = VP8_ACTIVITY_AVG_MIN; |
| 195 |
| 196 // Experimental code: return fixed value normalized for several clips |
| 197 if ( ALT_ACT_MEASURE ) |
| 198 cpi->activity_avg = 100000; |
| 199 } |
| 200 |
| 201 #define USE_ACT_INDEX 0 |
| 202 #define OUTPUT_NORM_ACT_STATS 0 |
| 203 |
| 204 #if USE_ACT_INDEX |
| 205 // Calculate and activity index for each mb |
| 206 static void calc_activity_index( VP8_COMP *cpi, MACROBLOCK *x ) |
| 207 { |
| 208 VP8_COMMON *const cm = & cpi->common; |
| 209 int mb_row, mb_col; |
| 210 |
| 211 int64_t act; |
| 212 int64_t a; |
| 213 int64_t b; |
| 214 |
| 215 #if OUTPUT_NORM_ACT_STATS |
| 216 FILE *f = fopen("norm_act.stt", "a"); |
| 217 fprintf(f, "\n%12d\n", cpi->activity_avg ); |
| 218 #endif |
| 219 |
| 220 // Reset pointers to start of activity map |
| 221 x->mb_activity_ptr = cpi->mb_activity_map; |
| 222 |
| 223 // Calculate normalized mb activity number. |
| 224 for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) |
| 225 { |
| 226 // for each macroblock col in image |
| 227 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) |
| 228 { |
| 229 // Read activity from the map |
| 230 act = *(x->mb_activity_ptr); |
| 231 |
| 232 // Calculate a normalized activity number |
| 233 a = act + 4*cpi->activity_avg; |
| 234 b = 4*act + cpi->activity_avg; |
| 235 |
| 236 if ( b >= a ) |
| 237 *(x->activity_ptr) = (int)((b + (a>>1))/a) - 1; |
| 238 else |
| 239 *(x->activity_ptr) = 1 - (int)((a + (b>>1))/b); |
| 240 |
| 241 #if OUTPUT_NORM_ACT_STATS |
| 242 fprintf(f, " %6d", *(x->mb_activity_ptr)); |
| 243 #endif |
| 244 // Increment activity map pointers |
| 245 x->mb_activity_ptr++; |
| 246 } |
| 247 |
| 248 #if OUTPUT_NORM_ACT_STATS |
| 249 fprintf(f, "\n"); |
| 250 #endif |
| 251 |
| 252 } |
| 253 |
| 254 #if OUTPUT_NORM_ACT_STATS |
| 255 fclose(f); |
| 256 #endif |
| 257 |
| 258 } |
| 259 #endif |
| 260 |
| 261 // Loop through all MBs. Note activity of each, average activity and |
| 262 // calculate a normalized activity for each |
| 263 static void build_activity_map( VP8_COMP *cpi ) |
| 264 { |
| 265 MACROBLOCK *const x = & cpi->mb; |
| 266 MACROBLOCKD *xd = &x->e_mbd; |
| 267 VP8_COMMON *const cm = & cpi->common; |
| 268 |
| 269 #if ALT_ACT_MEASURE |
| 270 YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx]; |
| 271 int recon_yoffset; |
| 272 int recon_y_stride = new_yv12->y_stride; |
| 273 #endif |
| 274 |
| 275 int mb_row, mb_col; |
| 276 unsigned int mb_activity; |
| 277 int64_t activity_sum = 0; |
| 278 |
| 279 // for each macroblock row in image |
| 280 for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) |
| 281 { |
| 282 #if ALT_ACT_MEASURE |
| 283 // reset above block coeffs |
| 284 xd->up_available = (mb_row != 0); |
| 285 recon_yoffset = (mb_row * recon_y_stride * 16); |
| 286 #endif |
| 287 // for each macroblock col in image |
| 288 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) |
| 289 { |
| 290 #if ALT_ACT_MEASURE |
| 291 xd->dst.y_buffer = new_yv12->y_buffer + recon_yoffset; |
| 292 xd->left_available = (mb_col != 0); |
| 293 recon_yoffset += 16; |
| 294 #endif |
| 295 //Copy current mb to a buffer |
| 296 RECON_INVOKE(&xd->rtcd->recon, copy16x16)(x->src.y_buffer, x->src.y_
stride, x->thismb, 16); |
| 297 |
| 298 // measure activity |
| 299 mb_activity = mb_activity_measure( cpi, x, mb_row, mb_col ); |
| 300 |
| 301 // Keep frame sum |
| 302 activity_sum += mb_activity; |
| 303 |
| 304 // Store MB level activity details. |
| 305 *x->mb_activity_ptr = mb_activity; |
| 306 |
| 307 // Increment activity map pointer |
| 308 x->mb_activity_ptr++; |
| 309 |
| 310 // adjust to the next column of source macroblocks |
| 311 x->src.y_buffer += 16; |
| 312 } |
| 313 |
| 314 |
| 315 // adjust to the next row of mbs |
| 316 x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols; |
| 317 |
| 318 #if ALT_ACT_MEASURE |
| 319 //extend the recon for intra prediction |
| 320 vp8_extend_mb_row(new_yv12, xd->dst.y_buffer + 16, |
| 321 xd->dst.u_buffer + 8, xd->dst.v_buffer + 8); |
| 322 #endif |
| 323 |
| 324 } |
| 325 |
| 326 // Calculate an "average" MB activity |
| 327 calc_av_activity(cpi, activity_sum); |
| 328 |
| 329 #if USE_ACT_INDEX |
| 330 // Calculate an activity index number of each mb |
| 331 calc_activity_index( cpi, x ); |
| 332 #endif |
| 333 |
| 334 } |
| 335 |
| 336 // Macroblock activity masking |
| 337 void vp8_activity_masking(VP8_COMP *cpi, MACROBLOCK *x) |
| 338 { |
| 339 #if USE_ACT_INDEX |
| 340 x->rdmult += *(x->mb_activity_ptr) * (x->rdmult >> 2); |
| 341 x->errorperbit = x->rdmult * 100 /(110 * x->rddiv); |
| 342 x->errorperbit += (x->errorperbit==0); |
| 343 #else |
| 344 int64_t a; |
| 345 int64_t b; |
| 346 int64_t act = *(x->mb_activity_ptr); |
| 347 |
| 348 // Apply the masking to the RD multiplier. |
| 349 a = act + (2*cpi->activity_avg); |
| 350 b = (2*act) + cpi->activity_avg; |
| 351 |
| 352 x->rdmult = (unsigned int)(((int64_t)x->rdmult*b + (a>>1))/a); |
| 353 x->errorperbit = x->rdmult * 100 /(110 * x->rddiv); |
| 354 x->errorperbit += (x->errorperbit==0); |
| 355 #endif |
| 356 |
| 357 // Activity based Zbin adjustment |
| 358 adjust_act_zbin(cpi, x); |
| 359 } |
| 462 | 360 |
| 463 static | 361 static |
| 464 void encode_mb_row(VP8_COMP *cpi, | 362 void encode_mb_row(VP8_COMP *cpi, |
| 465 VP8_COMMON *cm, | 363 VP8_COMMON *cm, |
| 466 int mb_row, | 364 int mb_row, |
| 467 MACROBLOCK *x, | 365 MACROBLOCK *x, |
| 468 MACROBLOCKD *xd, | 366 MACROBLOCKD *xd, |
| 469 TOKENEXTRA **tp, | 367 TOKENEXTRA **tp, |
| 470 int *segment_counts, | 368 int *segment_counts, |
| 471 int *totalrate) | 369 int *totalrate) |
| 472 { | 370 { |
| 473 INT64 activity_sum = 0; | |
| 474 int i; | 371 int i; |
| 475 int recon_yoffset, recon_uvoffset; | 372 int recon_yoffset, recon_uvoffset; |
| 476 int mb_col; | 373 int mb_col; |
| 477 int ref_fb_idx = cm->lst_fb_idx; | 374 int ref_fb_idx = cm->lst_fb_idx; |
| 478 int dst_fb_idx = cm->new_fb_idx; | 375 int dst_fb_idx = cm->new_fb_idx; |
| 479 int recon_y_stride = cm->yv12_fb[ref_fb_idx].y_stride; | 376 int recon_y_stride = cm->yv12_fb[ref_fb_idx].y_stride; |
| 480 int recon_uv_stride = cm->yv12_fb[ref_fb_idx].uv_stride; | 377 int recon_uv_stride = cm->yv12_fb[ref_fb_idx].uv_stride; |
| 481 int seg_map_index = (mb_row * cpi->common.mb_cols); | 378 int map_index = (mb_row * cpi->common.mb_cols); |
| 482 | 379 |
| 483 #if CONFIG_MULTITHREAD | 380 #if CONFIG_MULTITHREAD |
| 484 const int nsync = cpi->mt_sync_range; | 381 const int nsync = cpi->mt_sync_range; |
| 485 const int rightmost_col = cm->mb_cols - 1; | 382 const int rightmost_col = cm->mb_cols - 1; |
| 486 volatile const int *last_row_current_mb_col; | 383 volatile const int *last_row_current_mb_col; |
| 487 | 384 |
| 488 if ((cpi->b_multi_threaded != 0) && (mb_row != 0)) | 385 if ((cpi->b_multi_threaded != 0) && (mb_row != 0)) |
| 489 last_row_current_mb_col = &cpi->mt_current_mb_col[mb_row - 1]; | 386 last_row_current_mb_col = &cpi->mt_current_mb_col[mb_row - 1]; |
| 490 else | 387 else |
| 491 last_row_current_mb_col = &rightmost_col; | 388 last_row_current_mb_col = &rightmost_col; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 505 // units as they are always compared to values that are in 1/8th pel units | 402 // units as they are always compared to values that are in 1/8th pel units |
| 506 xd->mb_to_top_edge = -((mb_row * 16) << 3); | 403 xd->mb_to_top_edge = -((mb_row * 16) << 3); |
| 507 xd->mb_to_bottom_edge = ((cm->mb_rows - 1 - mb_row) * 16) << 3; | 404 xd->mb_to_bottom_edge = ((cm->mb_rows - 1 - mb_row) * 16) << 3; |
| 508 | 405 |
| 509 // Set up limit values for vertical motion vector components | 406 // Set up limit values for vertical motion vector components |
| 510 // to prevent them extending beyond the UMV borders | 407 // to prevent them extending beyond the UMV borders |
| 511 x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16)); | 408 x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16)); |
| 512 x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) | 409 x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) |
| 513 + (VP8BORDERINPIXELS - 16); | 410 + (VP8BORDERINPIXELS - 16); |
| 514 | 411 |
| 412 // Set the mb activity pointer to the start of the row. |
| 413 x->mb_activity_ptr = &cpi->mb_activity_map[map_index]; |
| 414 |
| 515 // for each macroblock col in image | 415 // for each macroblock col in image |
| 516 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) | 416 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) |
| 517 { | 417 { |
| 518 // Distance of Mb to the left & right edges, specified in | 418 // Distance of Mb to the left & right edges, specified in |
| 519 // 1/8th pel units as they are always compared to values | 419 // 1/8th pel units as they are always compared to values |
| 520 // that are in 1/8th pel units | 420 // that are in 1/8th pel units |
| 521 xd->mb_to_left_edge = -((mb_col * 16) << 3); | 421 xd->mb_to_left_edge = -((mb_col * 16) << 3); |
| 522 xd->mb_to_right_edge = ((cm->mb_cols - 1 - mb_col) * 16) << 3; | 422 xd->mb_to_right_edge = ((cm->mb_cols - 1 - mb_col) * 16) << 3; |
| 523 | 423 |
| 524 // Set up limit values for horizontal motion vector components | 424 // Set up limit values for horizontal motion vector components |
| 525 // to prevent them extending beyond the UMV borders | 425 // to prevent them extending beyond the UMV borders |
| 526 x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16)); | 426 x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16)); |
| 527 x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) | 427 x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) |
| 528 + (VP8BORDERINPIXELS - 16); | 428 + (VP8BORDERINPIXELS - 16); |
| 529 | 429 |
| 530 xd->dst.y_buffer = cm->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset; | 430 xd->dst.y_buffer = cm->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset; |
| 531 xd->dst.u_buffer = cm->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset; | 431 xd->dst.u_buffer = cm->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset; |
| 532 xd->dst.v_buffer = cm->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset; | 432 xd->dst.v_buffer = cm->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset; |
| 533 xd->left_available = (mb_col != 0); | 433 xd->left_available = (mb_col != 0); |
| 534 | 434 |
| 535 x->rddiv = cpi->RDDIV; | 435 x->rddiv = cpi->RDDIV; |
| 536 x->rdmult = cpi->RDMULT; | 436 x->rdmult = cpi->RDMULT; |
| 537 | 437 |
| 438 //Copy current mb to a buffer |
| 439 RECON_INVOKE(&xd->rtcd->recon, copy16x16)(x->src.y_buffer, x->src.y_stri
de, x->thismb, 16); |
| 440 |
| 538 #if CONFIG_MULTITHREAD | 441 #if CONFIG_MULTITHREAD |
| 539 if ((cpi->b_multi_threaded != 0) && (mb_row != 0)) | 442 if ((cpi->b_multi_threaded != 0) && (mb_row != 0)) |
| 540 { | 443 { |
| 541 if ((mb_col & (nsync - 1)) == 0) | 444 if ((mb_col & (nsync - 1)) == 0) |
| 542 { | 445 { |
| 543 while (mb_col > (*last_row_current_mb_col - nsync) | 446 while (mb_col > (*last_row_current_mb_col - nsync) |
| 544 && (*last_row_current_mb_col) != (cm->mb_cols - 1)) | 447 && (*last_row_current_mb_col) != (cm->mb_cols - 1)) |
| 545 { | 448 { |
| 546 x86_pause_hint(); | 449 x86_pause_hint(); |
| 547 thread_sleep(0); | 450 thread_sleep(0); |
| 548 } | 451 } |
| 549 } | 452 } |
| 550 } | 453 } |
| 551 #endif | 454 #endif |
| 552 | 455 |
| 553 if(cpi->oxcf.tuning == VP8_TUNE_SSIM) | 456 if(cpi->oxcf.tuning == VP8_TUNE_SSIM) |
| 554 activity_sum += vp8_activity_masking(cpi, x); | 457 vp8_activity_masking(cpi, x); |
| 555 | 458 |
| 556 // Is segmentation enabled | 459 // Is segmentation enabled |
| 557 // MB level adjutment to quantizer | 460 // MB level adjutment to quantizer |
| 558 if (xd->segmentation_enabled) | 461 if (xd->segmentation_enabled) |
| 559 { | 462 { |
| 560 // Code to set segment id in xd->mbmi.segment_id for current MB (wit
h range checking) | 463 // Code to set segment id in xd->mbmi.segment_id for current MB (wit
h range checking) |
| 561 if (cpi->segmentation_map[seg_map_index+mb_col] <= 3) | 464 if (cpi->segmentation_map[map_index+mb_col] <= 3) |
| 562 xd->mode_info_context->mbmi.segment_id = cpi->segmentation_map[s
eg_map_index+mb_col]; | 465 xd->mode_info_context->mbmi.segment_id = cpi->segmentation_map[m
ap_index+mb_col]; |
| 563 else | 466 else |
| 564 xd->mode_info_context->mbmi.segment_id = 0; | 467 xd->mode_info_context->mbmi.segment_id = 0; |
| 565 | 468 |
| 566 vp8cx_mb_init_quantizer(cpi, x); | 469 vp8cx_mb_init_quantizer(cpi, x); |
| 567 } | 470 } |
| 568 else | 471 else |
| 569 xd->mode_info_context->mbmi.segment_id = 0; // Set to Segmen
t 0 by default | 472 xd->mode_info_context->mbmi.segment_id = 0; // Set to Segmen
t 0 by default |
| 570 | 473 |
| 571 x->active_ptr = cpi->active_map + seg_map_index + mb_col; | 474 x->active_ptr = cpi->active_map + map_index + mb_col; |
| 572 | 475 |
| 573 if (cm->frame_type == KEY_FRAME) | 476 if (cm->frame_type == KEY_FRAME) |
| 574 { | 477 { |
| 575 *totalrate += vp8cx_encode_intra_macro_block(cpi, x, tp); | 478 *totalrate += vp8cx_encode_intra_macro_block(cpi, x, tp); |
| 576 #ifdef MODE_STATS | 479 #ifdef MODE_STATS |
| 577 y_modes[xd->mbmi.mode] ++; | 480 y_modes[xd->mbmi.mode] ++; |
| 578 #endif | 481 #endif |
| 579 } | 482 } |
| 580 else | 483 else |
| 581 { | 484 { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 598 | 501 |
| 599 // Count of last ref frame 0,0 useage | 502 // Count of last ref frame 0,0 useage |
| 600 if ((xd->mode_info_context->mbmi.mode == ZEROMV) && (xd->mode_info_c
ontext->mbmi.ref_frame == LAST_FRAME)) | 503 if ((xd->mode_info_context->mbmi.mode == ZEROMV) && (xd->mode_info_c
ontext->mbmi.ref_frame == LAST_FRAME)) |
| 601 cpi->inter_zz_count ++; | 504 cpi->inter_zz_count ++; |
| 602 | 505 |
| 603 // Special case code for cyclic refresh | 506 // Special case code for cyclic refresh |
| 604 // If cyclic update enabled then copy xd->mbmi.segment_id; (which ma
y have been updated based on mode | 507 // If cyclic update enabled then copy xd->mbmi.segment_id; (which ma
y have been updated based on mode |
| 605 // during vp8cx_encode_inter_macroblock()) back into the global sgme
ntation map | 508 // during vp8cx_encode_inter_macroblock()) back into the global sgme
ntation map |
| 606 if (cpi->cyclic_refresh_mode_enabled && xd->segmentation_enabled) | 509 if (cpi->cyclic_refresh_mode_enabled && xd->segmentation_enabled) |
| 607 { | 510 { |
| 608 cpi->segmentation_map[seg_map_index+mb_col] = xd->mode_info_cont
ext->mbmi.segment_id; | 511 cpi->segmentation_map[map_index+mb_col] = xd->mode_info_context-
>mbmi.segment_id; |
| 609 | 512 |
| 610 // If the block has been refreshed mark it as clean (the magnitu
de of the -ve influences how long it will be before we consider another refresh)
: | 513 // If the block has been refreshed mark it as clean (the magnitu
de of the -ve influences how long it will be before we consider another refresh)
: |
| 611 // Else if it was coded (last frame 0,0) and has not already bee
n refreshed then mark it as a candidate for cleanup next time (marked 0) | 514 // Else if it was coded (last frame 0,0) and has not already bee
n refreshed then mark it as a candidate for cleanup next time (marked 0) |
| 612 // else mark it as dirty (1). | 515 // else mark it as dirty (1). |
| 613 if (xd->mode_info_context->mbmi.segment_id) | 516 if (xd->mode_info_context->mbmi.segment_id) |
| 614 cpi->cyclic_refresh_map[seg_map_index+mb_col] = -1; | 517 cpi->cyclic_refresh_map[map_index+mb_col] = -1; |
| 615 else if ((xd->mode_info_context->mbmi.mode == ZEROMV) && (xd->mo
de_info_context->mbmi.ref_frame == LAST_FRAME)) | 518 else if ((xd->mode_info_context->mbmi.mode == ZEROMV) && (xd->mo
de_info_context->mbmi.ref_frame == LAST_FRAME)) |
| 616 { | 519 { |
| 617 if (cpi->cyclic_refresh_map[seg_map_index+mb_col] == 1) | 520 if (cpi->cyclic_refresh_map[map_index+mb_col] == 1) |
| 618 cpi->cyclic_refresh_map[seg_map_index+mb_col] = 0; | 521 cpi->cyclic_refresh_map[map_index+mb_col] = 0; |
| 619 } | 522 } |
| 620 else | 523 else |
| 621 cpi->cyclic_refresh_map[seg_map_index+mb_col] = 1; | 524 cpi->cyclic_refresh_map[map_index+mb_col] = 1; |
| 622 | 525 |
| 623 } | 526 } |
| 624 } | 527 } |
| 625 | 528 |
| 626 cpi->tplist[mb_row].stop = *tp; | 529 cpi->tplist[mb_row].stop = *tp; |
| 627 | 530 |
| 628 x->gf_active_ptr++; // Increment pointer into gf useage flags struc
ture for next mb | 531 // Increment pointer into gf useage flags structure. |
| 532 x->gf_active_ptr++; |
| 629 | 533 |
| 534 // Increment the activity mask pointers. |
| 535 x->mb_activity_ptr++; |
| 536 |
| 537 /* save the block info */ |
| 630 for (i = 0; i < 16; i++) | 538 for (i = 0; i < 16; i++) |
| 631 vpx_memcpy(&xd->mode_info_context->bmi[i], &xd->block[i].bmi, sizeof
(xd->block[i].bmi)); | 539 xd->mode_info_context->bmi[i] = xd->block[i].bmi; |
| 632 | 540 |
| 633 // adjust to the next column of macroblocks | 541 // adjust to the next column of macroblocks |
| 634 x->src.y_buffer += 16; | 542 x->src.y_buffer += 16; |
| 635 x->src.u_buffer += 8; | 543 x->src.u_buffer += 8; |
| 636 x->src.v_buffer += 8; | 544 x->src.v_buffer += 8; |
| 637 | 545 |
| 638 recon_yoffset += 16; | 546 recon_yoffset += 16; |
| 639 recon_uvoffset += 8; | 547 recon_uvoffset += 8; |
| 640 | 548 |
| 641 // Keep track of segment useage | 549 // Keep track of segment useage |
| (...skipping 15 matching lines...) Expand all Loading... |
| 657 //extend the recon for intra prediction | 565 //extend the recon for intra prediction |
| 658 vp8_extend_mb_row( | 566 vp8_extend_mb_row( |
| 659 &cm->yv12_fb[dst_fb_idx], | 567 &cm->yv12_fb[dst_fb_idx], |
| 660 xd->dst.y_buffer + 16, | 568 xd->dst.y_buffer + 16, |
| 661 xd->dst.u_buffer + 8, | 569 xd->dst.u_buffer + 8, |
| 662 xd->dst.v_buffer + 8); | 570 xd->dst.v_buffer + 8); |
| 663 | 571 |
| 664 // this is to account for the border | 572 // this is to account for the border |
| 665 xd->mode_info_context++; | 573 xd->mode_info_context++; |
| 666 x->partition_info++; | 574 x->partition_info++; |
| 667 x->activity_sum += activity_sum; | |
| 668 | 575 |
| 669 #if CONFIG_MULTITHREAD | 576 #if CONFIG_MULTITHREAD |
| 670 if ((cpi->b_multi_threaded != 0) && (mb_row == cm->mb_rows - 1)) | 577 if ((cpi->b_multi_threaded != 0) && (mb_row == cm->mb_rows - 1)) |
| 671 { | 578 { |
| 672 sem_post(&cpi->h_event_end_encoding); /* signal frame encoding end */ | 579 sem_post(&cpi->h_event_end_encoding); /* signal frame encoding end */ |
| 673 } | 580 } |
| 674 #endif | 581 #endif |
| 675 } | 582 } |
| 676 | 583 |
| 584 void init_encode_frame_mb_context(VP8_COMP *cpi) |
| 585 { |
| 586 MACROBLOCK *const x = & cpi->mb; |
| 587 VP8_COMMON *const cm = & cpi->common; |
| 588 MACROBLOCKD *const xd = & x->e_mbd; |
| 589 |
| 590 // GF active flags data structure |
| 591 x->gf_active_ptr = (signed char *)cpi->gf_active_flags; |
| 592 |
| 593 // Activity map pointer |
| 594 x->mb_activity_ptr = cpi->mb_activity_map; |
| 595 |
| 596 x->vector_range = 32; |
| 597 |
| 598 x->act_zbin_adj = 0; |
| 599 |
| 600 x->partition_info = x->pi; |
| 601 |
| 602 xd->mode_info_context = cm->mi; |
| 603 xd->mode_info_stride = cm->mode_info_stride; |
| 604 |
| 605 xd->frame_type = cm->frame_type; |
| 606 |
| 607 xd->frames_since_golden = cm->frames_since_golden; |
| 608 xd->frames_till_alt_ref_frame = cm->frames_till_alt_ref_frame; |
| 609 |
| 610 // reset intra mode contexts |
| 611 if (cm->frame_type == KEY_FRAME) |
| 612 vp8_init_mbmode_probs(cm); |
| 613 |
| 614 // Copy data over into macro block data sturctures. |
| 615 x->src = * cpi->Source; |
| 616 xd->pre = cm->yv12_fb[cm->lst_fb_idx]; |
| 617 xd->dst = cm->yv12_fb[cm->new_fb_idx]; |
| 618 |
| 619 // set up frame for intra coded blocks |
| 620 vp8_setup_intra_recon(&cm->yv12_fb[cm->new_fb_idx]); |
| 621 |
| 622 vp8_build_block_offsets(x); |
| 623 |
| 624 vp8_setup_block_dptrs(&x->e_mbd); |
| 625 |
| 626 vp8_setup_block_ptrs(x); |
| 627 |
| 628 xd->mode_info_context->mbmi.mode = DC_PRED; |
| 629 xd->mode_info_context->mbmi.uv_mode = DC_PRED; |
| 630 |
| 631 xd->left_context = &cm->left_context; |
| 632 |
| 633 vp8_zero(cpi->count_mb_ref_frame_usage) |
| 634 vp8_zero(cpi->ymode_count) |
| 635 vp8_zero(cpi->uv_mode_count) |
| 636 |
| 637 x->mvc = cm->fc.mvc; |
| 638 |
| 639 vpx_memset(cm->above_context, 0, |
| 640 sizeof(ENTROPY_CONTEXT_PLANES) * cm->mb_cols); |
| 641 |
| 642 xd->ref_frame_cost[INTRA_FRAME] = vp8_cost_zero(cpi->prob_intra_coded); |
| 643 |
| 644 // Special case treatment when GF and ARF are not sensible options for refer
ence |
| 645 if (cpi->ref_frame_flags == VP8_LAST_FLAG) |
| 646 { |
| 647 xd->ref_frame_cost[LAST_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 648 + vp8_cost_zero(255); |
| 649 xd->ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 650 + vp8_cost_one(255) |
| 651 + vp8_cost_zero(128); |
| 652 xd->ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 653 + vp8_cost_one(255) |
| 654 + vp8_cost_one(128); |
| 655 } |
| 656 else |
| 657 { |
| 658 xd->ref_frame_cost[LAST_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 659 + vp8_cost_zero(cpi->prob_last_coded); |
| 660 xd->ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 661 + vp8_cost_one(cpi->prob_last_coded) |
| 662 + vp8_cost_zero(cpi->prob_gf_coded); |
| 663 xd->ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 664 + vp8_cost_one(cpi->prob_last_coded) |
| 665 + vp8_cost_one(cpi->prob_gf_coded); |
| 666 } |
| 667 |
| 668 } |
| 669 |
| 677 void vp8_encode_frame(VP8_COMP *cpi) | 670 void vp8_encode_frame(VP8_COMP *cpi) |
| 678 { | 671 { |
| 679 int mb_row; | 672 int mb_row; |
| 680 MACROBLOCK *const x = & cpi->mb; | 673 MACROBLOCK *const x = & cpi->mb; |
| 681 VP8_COMMON *const cm = & cpi->common; | 674 VP8_COMMON *const cm = & cpi->common; |
| 682 MACROBLOCKD *const xd = & x->e_mbd; | 675 MACROBLOCKD *const xd = & x->e_mbd; |
| 683 | 676 |
| 684 TOKENEXTRA *tp = cpi->tok; | 677 TOKENEXTRA *tp = cpi->tok; |
| 685 int segment_counts[MAX_MB_SEGMENTS]; | 678 int segment_counts[MAX_MB_SEGMENTS]; |
| 686 int totalrate; | 679 int totalrate; |
| 687 | 680 |
| 681 vpx_memset(segment_counts, 0, sizeof(segment_counts)); |
| 682 totalrate = 0; |
| 683 |
| 684 if (cpi->compressor_speed == 2) |
| 685 { |
| 686 if (cpi->oxcf.cpu_used < 0) |
| 687 cpi->Speed = -(cpi->oxcf.cpu_used); |
| 688 else |
| 689 vp8_auto_select_speed(cpi); |
| 690 } |
| 691 |
| 688 // Functions setup for all frame types so we can use MC in AltRef | 692 // Functions setup for all frame types so we can use MC in AltRef |
| 689 if (cm->mcomp_filter_type == SIXTAP) | 693 if (cm->mcomp_filter_type == SIXTAP) |
| 690 { | 694 { |
| 691 xd->subpixel_predict = SUBPIX_INVOKE( | 695 xd->subpixel_predict = SUBPIX_INVOKE( |
| 692 &cpi->common.rtcd.subpix, sixtap4x4); | 696 &cpi->common.rtcd.subpix, sixtap4x4); |
| 693 xd->subpixel_predict8x4 = SUBPIX_INVOKE( | 697 xd->subpixel_predict8x4 = SUBPIX_INVOKE( |
| 694 &cpi->common.rtcd.subpix, sixtap8x4); | 698 &cpi->common.rtcd.subpix, sixtap8x4); |
| 695 xd->subpixel_predict8x8 = SUBPIX_INVOKE( | 699 xd->subpixel_predict8x8 = SUBPIX_INVOKE( |
| 696 &cpi->common.rtcd.subpix, sixtap8x8); | 700 &cpi->common.rtcd.subpix, sixtap8x8); |
| 697 xd->subpixel_predict16x16 = SUBPIX_INVOKE( | 701 xd->subpixel_predict16x16 = SUBPIX_INVOKE( |
| 698 &cpi->common.rtcd.subpix, sixtap16x16); | 702 &cpi->common.rtcd.subpix, sixtap16x16); |
| 699 } | 703 } |
| 700 else | 704 else |
| 701 { | 705 { |
| 702 xd->subpixel_predict = SUBPIX_INVOKE( | 706 xd->subpixel_predict = SUBPIX_INVOKE( |
| 703 &cpi->common.rtcd.subpix, bilinear4x4); | 707 &cpi->common.rtcd.subpix, bilinear4x4); |
| 704 xd->subpixel_predict8x4 = SUBPIX_INVOKE( | 708 xd->subpixel_predict8x4 = SUBPIX_INVOKE( |
| 705 &cpi->common.rtcd.subpix, bilinear8x4); | 709 &cpi->common.rtcd.subpix, bilinear8x4); |
| 706 xd->subpixel_predict8x8 = SUBPIX_INVOKE( | 710 xd->subpixel_predict8x8 = SUBPIX_INVOKE( |
| 707 &cpi->common.rtcd.subpix, bilinear8x8); | 711 &cpi->common.rtcd.subpix, bilinear8x8); |
| 708 xd->subpixel_predict16x16 = SUBPIX_INVOKE( | 712 xd->subpixel_predict16x16 = SUBPIX_INVOKE( |
| 709 &cpi->common.rtcd.subpix, bilinear16x16); | 713 &cpi->common.rtcd.subpix, bilinear16x16); |
| 710 } | 714 } |
| 711 | 715 |
| 712 x->gf_active_ptr = (signed char *)cpi->gf_active_flags; // Point to base
of GF active flags data structure | |
| 713 | |
| 714 x->vector_range = 32; | |
| 715 | |
| 716 // Count of MBs using the alternate Q if any | |
| 717 cpi->alt_qcount = 0; | |
| 718 | |
| 719 // Reset frame count of inter 0,0 motion vector useage. | 716 // Reset frame count of inter 0,0 motion vector useage. |
| 720 cpi->inter_zz_count = 0; | 717 cpi->inter_zz_count = 0; |
| 721 | 718 |
| 722 vpx_memset(segment_counts, 0, sizeof(segment_counts)); | 719 vpx_memset(segment_counts, 0, sizeof(segment_counts)); |
| 723 | 720 |
| 724 cpi->prediction_error = 0; | 721 cpi->prediction_error = 0; |
| 725 cpi->intra_error = 0; | 722 cpi->intra_error = 0; |
| 726 cpi->skip_true_count = 0; | 723 cpi->skip_true_count = 0; |
| 727 cpi->skip_false_count = 0; | 724 cpi->skip_false_count = 0; |
| 728 | 725 |
| 729 #if 0 | 726 #if 0 |
| 730 // Experimental code | 727 // Experimental code |
| 731 cpi->frame_distortion = 0; | 728 cpi->frame_distortion = 0; |
| 732 cpi->last_mb_distortion = 0; | 729 cpi->last_mb_distortion = 0; |
| 733 #endif | 730 #endif |
| 734 | 731 |
| 735 totalrate = 0; | 732 xd->mode_info_context = cm->mi; |
| 736 | 733 |
| 737 x->partition_info = x->pi; | |
| 738 | |
| 739 xd->mode_info_context = cm->mi; | |
| 740 xd->mode_info_stride = cm->mode_info_stride; | |
| 741 | |
| 742 xd->frame_type = cm->frame_type; | |
| 743 | |
| 744 xd->frames_since_golden = cm->frames_since_golden; | |
| 745 xd->frames_till_alt_ref_frame = cm->frames_till_alt_ref_frame; | |
| 746 vp8_zero(cpi->MVcount); | 734 vp8_zero(cpi->MVcount); |
| 747 // vp8_zero( Contexts) | |
| 748 vp8_zero(cpi->coef_counts); | 735 vp8_zero(cpi->coef_counts); |
| 749 | 736 |
| 750 // reset intra mode contexts | |
| 751 if (cm->frame_type == KEY_FRAME) | |
| 752 vp8_init_mbmode_probs(cm); | |
| 753 | |
| 754 | |
| 755 vp8cx_frame_init_quantizer(cpi); | 737 vp8cx_frame_init_quantizer(cpi); |
| 756 | 738 |
| 757 if (cpi->compressor_speed == 2) | 739 vp8_initialize_rd_consts(cpi, |
| 740 vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q)); |
| 741 |
| 742 vp8cx_initialize_me_consts(cpi, cm->base_qindex); |
| 743 |
| 744 if(cpi->oxcf.tuning == VP8_TUNE_SSIM) |
| 758 { | 745 { |
| 759 if (cpi->oxcf.cpu_used < 0) | 746 // Initialize encode frame context. |
| 760 cpi->Speed = -(cpi->oxcf.cpu_used); | 747 init_encode_frame_mb_context(cpi); |
| 761 else | 748 |
| 762 vp8_auto_select_speed(cpi); | 749 // Build a frame level activity map |
| 750 build_activity_map(cpi); |
| 763 } | 751 } |
| 764 | 752 |
| 765 vp8_initialize_rd_consts(cpi, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q
)); | 753 // re-initencode frame context. |
| 766 vp8cx_initialize_me_consts(cpi, cm->base_qindex); | 754 init_encode_frame_mb_context(cpi); |
| 767 | |
| 768 // Copy data over into macro block data sturctures. | |
| 769 | |
| 770 x->src = * cpi->Source; | |
| 771 xd->pre = cm->yv12_fb[cm->lst_fb_idx]; | |
| 772 xd->dst = cm->yv12_fb[cm->new_fb_idx]; | |
| 773 | |
| 774 // set up frame new frame for intra coded blocks | |
| 775 | |
| 776 vp8_setup_intra_recon(&cm->yv12_fb[cm->new_fb_idx]); | |
| 777 | |
| 778 vp8_build_block_offsets(x); | |
| 779 | |
| 780 vp8_setup_block_dptrs(&x->e_mbd); | |
| 781 | |
| 782 vp8_setup_block_ptrs(x); | |
| 783 | |
| 784 x->activity_sum = 0; | |
| 785 | |
| 786 xd->mode_info_context->mbmi.mode = DC_PRED; | |
| 787 xd->mode_info_context->mbmi.uv_mode = DC_PRED; | |
| 788 | |
| 789 xd->left_context = &cm->left_context; | |
| 790 | |
| 791 vp8_zero(cpi->count_mb_ref_frame_usage) | |
| 792 vp8_zero(cpi->ymode_count) | |
| 793 vp8_zero(cpi->uv_mode_count) | |
| 794 | |
| 795 x->mvc = cm->fc.mvc; | |
| 796 | |
| 797 vpx_memset(cm->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * cm->mb_col
s); | |
| 798 | 755 |
| 799 { | 756 { |
| 800 struct vpx_usec_timer emr_timer; | 757 struct vpx_usec_timer emr_timer; |
| 801 vpx_usec_timer_start(&emr_timer); | 758 vpx_usec_timer_start(&emr_timer); |
| 802 | 759 |
| 803 #if CONFIG_MULTITHREAD | 760 #if CONFIG_MULTITHREAD |
| 804 if (cpi->b_multi_threaded) | 761 if (cpi->b_multi_threaded) |
| 805 { | 762 { |
| 806 int i; | 763 int i; |
| 807 | 764 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 823 | 780 |
| 824 encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &tota
lrate); | 781 encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &tota
lrate); |
| 825 | 782 |
| 826 // adjust to the next row of mbs | 783 // adjust to the next row of mbs |
| 827 x->src.y_buffer += 16 * x->src.y_stride * (cpi->encoding_thread_
count + 1) - 16 * cm->mb_cols; | 784 x->src.y_buffer += 16 * x->src.y_stride * (cpi->encoding_thread_
count + 1) - 16 * cm->mb_cols; |
| 828 x->src.u_buffer += 8 * x->src.uv_stride * (cpi->encoding_thread
_count + 1) - 8 * cm->mb_cols; | 785 x->src.u_buffer += 8 * x->src.uv_stride * (cpi->encoding_thread
_count + 1) - 8 * cm->mb_cols; |
| 829 x->src.v_buffer += 8 * x->src.uv_stride * (cpi->encoding_thread
_count + 1) - 8 * cm->mb_cols; | 786 x->src.v_buffer += 8 * x->src.uv_stride * (cpi->encoding_thread
_count + 1) - 8 * cm->mb_cols; |
| 830 | 787 |
| 831 xd->mode_info_context += xd->mode_info_stride * cpi->encoding_th
read_count; | 788 xd->mode_info_context += xd->mode_info_stride * cpi->encoding_th
read_count; |
| 832 x->partition_info += xd->mode_info_stride * cpi->encoding_threa
d_count; | 789 x->partition_info += xd->mode_info_stride * cpi->encoding_threa
d_count; |
| 790 x->gf_active_ptr += cm->mb_cols * cpi->encoding_thread_count; |
| 833 | 791 |
| 834 } | 792 } |
| 835 | 793 |
| 836 sem_wait(&cpi->h_event_end_encoding); /* wait for other threads to f
inish */ | 794 sem_wait(&cpi->h_event_end_encoding); /* wait for other threads to f
inish */ |
| 837 | 795 |
| 838 cpi->tok_count = 0; | 796 cpi->tok_count = 0; |
| 839 | 797 |
| 840 for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++) | 798 for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++) |
| 841 { | 799 { |
| 842 cpi->tok_count += cpi->tplist[mb_row].stop - cpi->tplist[mb_row]
.start; | 800 cpi->tok_count += cpi->tplist[mb_row].stop - cpi->tplist[mb_row]
.start; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 855 segment_counts[j] += cpi->mb_row_ei[i].segment_count
s[j]; | 813 segment_counts[j] += cpi->mb_row_ei[i].segment_count
s[j]; |
| 856 } | 814 } |
| 857 } | 815 } |
| 858 } | 816 } |
| 859 | 817 |
| 860 for (i = 0; i < cpi->encoding_thread_count; i++) | 818 for (i = 0; i < cpi->encoding_thread_count; i++) |
| 861 { | 819 { |
| 862 totalrate += cpi->mb_row_ei[i].totalrate; | 820 totalrate += cpi->mb_row_ei[i].totalrate; |
| 863 } | 821 } |
| 864 | 822 |
| 865 for (i = 0; i < cpi->encoding_thread_count; i++) | |
| 866 { | |
| 867 x->activity_sum += cpi->mb_row_ei[i].mb.activity_sum; | |
| 868 } | |
| 869 | |
| 870 } | 823 } |
| 871 else | 824 else |
| 872 #endif | 825 #endif |
| 873 { | 826 { |
| 874 // for each macroblock row in image | 827 // for each macroblock row in image |
| 875 for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) | 828 for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) |
| 876 { | 829 { |
| 877 | 830 |
| 878 vp8_zero(cm->left_context) | 831 vp8_zero(cm->left_context) |
| 879 | 832 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 972 { | 925 { |
| 973 if (cm->fc.pre_mvc[1][cnt] != cm->fc.mvc[1][cnt]) | 926 if (cm->fc.pre_mvc[1][cnt] != cm->fc.mvc[1][cnt]) |
| 974 { | 927 { |
| 975 flag[1] = 1; | 928 flag[1] = 1; |
| 976 vpx_memcpy(cm->fc.pre_mvc[1], cm->fc.mvc[1], MVPcount); | 929 vpx_memcpy(cm->fc.pre_mvc[1], cm->fc.mvc[1], MVPcount); |
| 977 break; | 930 break; |
| 978 } | 931 } |
| 979 } | 932 } |
| 980 | 933 |
| 981 if (flag[0] || flag[1]) | 934 if (flag[0] || flag[1]) |
| 982 vp8_build_component_cost_table(cpi->mb.mvcost, cpi->mb.mvsadcost, (c
onst MV_CONTEXT *) cm->fc.mvc, flag); | 935 vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *)
cm->fc.mvc, flag); |
| 983 } | 936 } |
| 984 #endif | 937 #endif |
| 985 | 938 |
| 986 // Adjust the projected reference frame useage probability numbers to reflec
t | 939 // Adjust the projected reference frame useage probability numbers to reflec
t |
| 987 // what we have just seen. This may be usefull when we make multiple itterat
ions | 940 // what we have just seen. This may be usefull when we make multiple itterat
ions |
| 988 // of the recode loop rather than continuing to use values from the previous
frame. | 941 // of the recode loop rather than continuing to use values from the previous
frame. |
| 989 if ((cm->frame_type != KEY_FRAME) && !cm->refresh_alt_ref_frame && !cm->refr
esh_golden_frame) | 942 if ((cm->frame_type != KEY_FRAME) && !cm->refresh_alt_ref_frame && !cm->refr
esh_golden_frame) |
| 990 { | 943 { |
| 991 const int *const rfct = cpi->count_mb_ref_frame_usage; | 944 const int *const rfct = cpi->count_mb_ref_frame_usage; |
| 992 const int rf_intra = rfct[INTRA_FRAME]; | 945 const int rf_intra = rfct[INTRA_FRAME]; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1013 cpi->prob_gf_coded = 1; | 966 cpi->prob_gf_coded = 1; |
| 1014 } | 967 } |
| 1015 } | 968 } |
| 1016 } | 969 } |
| 1017 | 970 |
| 1018 #if 0 | 971 #if 0 |
| 1019 // Keep record of the total distortion this time around for future use | 972 // Keep record of the total distortion this time around for future use |
| 1020 cpi->last_frame_distortion = cpi->frame_distortion; | 973 cpi->last_frame_distortion = cpi->frame_distortion; |
| 1021 #endif | 974 #endif |
| 1022 | 975 |
| 1023 /* Update the average activity for the next frame. | |
| 1024 * This is feed-forward for now; it could also be saved in two-pass, or | |
| 1025 * done during lookahead when that is eventually added. | |
| 1026 */ | |
| 1027 cpi->activity_avg = (unsigned int )(x->activity_sum/cpi->common.MBs); | |
| 1028 if (cpi->activity_avg < VP8_ACTIVITY_AVG_MIN) | |
| 1029 cpi->activity_avg = VP8_ACTIVITY_AVG_MIN; | |
| 1030 | |
| 1031 } | 976 } |
| 1032 void vp8_setup_block_ptrs(MACROBLOCK *x) | 977 void vp8_setup_block_ptrs(MACROBLOCK *x) |
| 1033 { | 978 { |
| 1034 int r, c; | 979 int r, c; |
| 1035 int i; | 980 int i; |
| 1036 | 981 |
| 1037 for (r = 0; r < 4; r++) | 982 for (r = 0; r < 4; r++) |
| 1038 { | 983 { |
| 1039 for (c = 0; c < 4; c++) | 984 for (c = 0; c < 4; c++) |
| 1040 { | 985 { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1069 } | 1014 } |
| 1070 | 1015 |
| 1071 void vp8_build_block_offsets(MACROBLOCK *x) | 1016 void vp8_build_block_offsets(MACROBLOCK *x) |
| 1072 { | 1017 { |
| 1073 int block = 0; | 1018 int block = 0; |
| 1074 int br, bc; | 1019 int br, bc; |
| 1075 | 1020 |
| 1076 vp8_build_block_doffsets(&x->e_mbd); | 1021 vp8_build_block_doffsets(&x->e_mbd); |
| 1077 | 1022 |
| 1078 // y blocks | 1023 // y blocks |
| 1024 x->thismb_ptr = &x->thismb[0]; |
| 1079 for (br = 0; br < 4; br++) | 1025 for (br = 0; br < 4; br++) |
| 1080 { | 1026 { |
| 1081 for (bc = 0; bc < 4; bc++) | 1027 for (bc = 0; bc < 4; bc++) |
| 1082 { | 1028 { |
| 1083 BLOCK *this_block = &x->block[block]; | 1029 BLOCK *this_block = &x->block[block]; |
| 1084 this_block->base_src = &x->src.y_buffer; | 1030 //this_block->base_src = &x->src.y_buffer; |
| 1085 this_block->src_stride = x->src.y_stride; | 1031 //this_block->src_stride = x->src.y_stride; |
| 1086 this_block->src = 4 * br * this_block->src_stride + 4 * bc; | 1032 //this_block->src = 4 * br * this_block->src_stride + 4 * bc; |
| 1033 this_block->base_src = &x->thismb_ptr; |
| 1034 this_block->src_stride = 16; |
| 1035 this_block->src = 4 * br * 16 + 4 * bc; |
| 1087 ++block; | 1036 ++block; |
| 1088 } | 1037 } |
| 1089 } | 1038 } |
| 1090 | 1039 |
| 1091 // u blocks | 1040 // u blocks |
| 1092 for (br = 0; br < 2; br++) | 1041 for (br = 0; br < 2; br++) |
| 1093 { | 1042 { |
| 1094 for (bc = 0; bc < 2; bc++) | 1043 for (bc = 0; bc < 2; bc++) |
| 1095 { | 1044 { |
| 1096 BLOCK *this_block = &x->block[block]; | 1045 BLOCK *this_block = &x->block[block]; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1138 } | 1087 } |
| 1139 while (++b < 16); | 1088 while (++b < 16); |
| 1140 } | 1089 } |
| 1141 | 1090 |
| 1142 #endif | 1091 #endif |
| 1143 | 1092 |
| 1144 ++cpi->ymode_count[m]; | 1093 ++cpi->ymode_count[m]; |
| 1145 ++cpi->uv_mode_count[uvm]; | 1094 ++cpi->uv_mode_count[uvm]; |
| 1146 | 1095 |
| 1147 } | 1096 } |
| 1097 |
| 1098 // Experimental stub function to create a per MB zbin adjustment based on |
| 1099 // some previously calculated measure of MB activity. |
| 1100 static void adjust_act_zbin( VP8_COMP *cpi, MACROBLOCK *x ) |
| 1101 { |
| 1102 #if USE_ACT_INDEX |
| 1103 x->act_zbin_adj = *(x->mb_activity_ptr); |
| 1104 #else |
| 1105 int64_t a; |
| 1106 int64_t b; |
| 1107 int64_t act = *(x->mb_activity_ptr); |
| 1108 |
| 1109 // Apply the masking to the RD multiplier. |
| 1110 a = act + 4*cpi->activity_avg; |
| 1111 b = 4*act + cpi->activity_avg; |
| 1112 |
| 1113 if ( act > cpi->activity_avg ) |
| 1114 x->act_zbin_adj = (int)(((int64_t)b + (a>>1))/a) - 1; |
| 1115 else |
| 1116 x->act_zbin_adj = 1 - (int)(((int64_t)a + (b>>1))/b); |
| 1117 #endif |
| 1118 } |
| 1119 |
| 1148 int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) | 1120 int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) |
| 1149 { | 1121 { |
| 1150 int Error4x4, Error16x16, error_uv; | 1122 int rate; |
| 1151 int rate4x4, rate16x16, rateuv; | |
| 1152 int dist4x4, dist16x16, distuv; | |
| 1153 int rate = 0; | |
| 1154 int rate4x4_tokenonly = 0; | |
| 1155 int rate16x16_tokenonly = 0; | |
| 1156 int rateuv_tokenonly = 0; | |
| 1157 | 1123 |
| 1158 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; | 1124 if (cpi->sf.RD && cpi->compressor_speed != 2) |
| 1125 vp8_rd_pick_intra_mode(cpi, x, &rate); |
| 1126 else |
| 1127 vp8_pick_intra_mode(cpi, x, &rate); |
| 1159 | 1128 |
| 1160 #if !(CONFIG_REALTIME_ONLY) | 1129 if(cpi->oxcf.tuning == VP8_TUNE_SSIM) |
| 1161 if (cpi->sf.RD && cpi->compressor_speed != 2) | |
| 1162 { | 1130 { |
| 1163 error_uv = vp8_rd_pick_intra_mbuv_mode(cpi, x, &rateuv, &rateuv_tokenonl
y, &distuv); | 1131 adjust_act_zbin( cpi, x ); |
| 1164 rate += rateuv; | 1132 vp8_update_zbin_extra(cpi, x); |
| 1165 | |
| 1166 Error16x16 = vp8_rd_pick_intra16x16mby_mode(cpi, x, &rate16x16, &rate16x
16_tokenonly, &dist16x16); | |
| 1167 | |
| 1168 Error4x4 = vp8_rd_pick_intra4x4mby_modes(cpi, x, &rate4x4, &rate4x4_toke
nonly, &dist4x4, Error16x16); | |
| 1169 | |
| 1170 rate += (Error4x4 < Error16x16) ? rate4x4 : rate16x16; | |
| 1171 } | |
| 1172 else | |
| 1173 #endif | |
| 1174 { | |
| 1175 int rate2, best_distortion; | |
| 1176 MB_PREDICTION_MODE mode, best_mode = DC_PRED; | |
| 1177 int this_rd; | |
| 1178 Error16x16 = INT_MAX; | |
| 1179 | |
| 1180 vp8_pick_intra_mbuv_mode(x); | |
| 1181 | |
| 1182 for (mode = DC_PRED; mode <= TM_PRED; mode ++) | |
| 1183 { | |
| 1184 int distortion2; | |
| 1185 | |
| 1186 x->e_mbd.mode_info_context->mbmi.mode = mode; | |
| 1187 RECON_INVOKE(&cpi->common.rtcd.recon, build_intra_predictors_mby) | |
| 1188 (&x->e_mbd); | |
| 1189 distortion2 = VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16prederror
)(x->src.y_buffer, x->src.y_stride, x->e_mbd.predictor, 16, 0x7fffffff); | |
| 1190 rate2 = x->mbmode_cost[x->e_mbd.frame_type][mode]; | |
| 1191 this_rd = RD_ESTIMATE(x->rdmult, x->rddiv, rate2, distortion2); | |
| 1192 | |
| 1193 if (Error16x16 > this_rd) | |
| 1194 { | |
| 1195 Error16x16 = this_rd; | |
| 1196 best_mode = mode; | |
| 1197 best_distortion = distortion2; | |
| 1198 } | |
| 1199 } | |
| 1200 x->e_mbd.mode_info_context->mbmi.mode = best_mode; | |
| 1201 | |
| 1202 Error4x4 = vp8_pick_intra4x4mby_modes(IF_RTCD(&cpi->rtcd), x, &rate2, &b
est_distortion); | |
| 1203 } | 1133 } |
| 1204 | 1134 |
| 1205 if (Error4x4 < Error16x16) | 1135 if (x->e_mbd.mode_info_context->mbmi.mode == B_PRED) |
| 1206 { | |
| 1207 x->e_mbd.mode_info_context->mbmi.mode = B_PRED; | |
| 1208 vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x); | 1136 vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x); |
| 1209 } | |
| 1210 else | 1137 else |
| 1211 { | |
| 1212 vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x); | 1138 vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x); |
| 1213 } | |
| 1214 | 1139 |
| 1215 vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x); | 1140 vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x); |
| 1216 sum_intra_stats(cpi, x); | 1141 sum_intra_stats(cpi, x); |
| 1217 vp8_tokenize_mb(cpi, &x->e_mbd, t); | 1142 vp8_tokenize_mb(cpi, &x->e_mbd, t); |
| 1218 | 1143 |
| 1219 return rate; | 1144 return rate; |
| 1220 } | 1145 } |
| 1221 #ifdef SPEEDSTATS | 1146 #ifdef SPEEDSTATS |
| 1222 extern int cnt_pm; | 1147 extern int cnt_pm; |
| 1223 #endif | 1148 #endif |
| 1224 | 1149 |
| 1225 extern void vp8_fix_contexts(MACROBLOCKD *x); | 1150 extern void vp8_fix_contexts(MACROBLOCKD *x); |
| 1226 | 1151 |
| 1227 int vp8cx_encode_inter_macroblock | 1152 int vp8cx_encode_inter_macroblock |
| 1228 ( | 1153 ( |
| 1229 VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t, | 1154 VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t, |
| 1230 int recon_yoffset, int recon_uvoffset | 1155 int recon_yoffset, int recon_uvoffset |
| 1231 ) | 1156 ) |
| 1232 { | 1157 { |
| 1233 MACROBLOCKD *const xd = &x->e_mbd; | 1158 MACROBLOCKD *const xd = &x->e_mbd; |
| 1234 int inter_error; | |
| 1235 int intra_error = 0; | 1159 int intra_error = 0; |
| 1236 int rate; | 1160 int rate; |
| 1237 int distortion; | 1161 int distortion; |
| 1238 | 1162 |
| 1239 x->skip = 0; | 1163 x->skip = 0; |
| 1240 | 1164 |
| 1241 if (xd->segmentation_enabled) | 1165 if (xd->segmentation_enabled) |
| 1242 x->encode_breakout = cpi->segment_encode_breakout[xd->mode_info_context-
>mbmi.segment_id]; | 1166 x->encode_breakout = cpi->segment_encode_breakout[xd->mode_info_context-
>mbmi.segment_id]; |
| 1243 else | 1167 else |
| 1244 x->encode_breakout = cpi->oxcf.encode_breakout; | 1168 x->encode_breakout = cpi->oxcf.encode_breakout; |
| 1245 | 1169 |
| 1246 #if !(CONFIG_REALTIME_ONLY) | |
| 1247 | |
| 1248 if (cpi->sf.RD) | 1170 if (cpi->sf.RD) |
| 1249 { | 1171 { |
| 1250 int zbin_mode_boost_enabled = cpi->zbin_mode_boost_enabled; | 1172 int zbin_mode_boost_enabled = cpi->zbin_mode_boost_enabled; |
| 1251 | 1173 |
| 1252 /* Are we using the fast quantizer for the mode selection? */ | 1174 /* Are we using the fast quantizer for the mode selection? */ |
| 1253 if(cpi->sf.use_fastquant_for_pick) | 1175 if(cpi->sf.use_fastquant_for_pick) |
| 1254 { | 1176 { |
| 1255 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize, fastq
uantb); | 1177 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize, |
| 1178 fastquantb); |
| 1179 cpi->mb.quantize_b_pair = QUANTIZE_INVOKE(&cpi->rtcd.quantize, |
| 1180 fastquantb_pair); |
| 1256 | 1181 |
| 1257 /* the fast quantizer does not use zbin_extra, so | 1182 /* the fast quantizer does not use zbin_extra, so |
| 1258 * do not recalculate */ | 1183 * do not recalculate */ |
| 1259 cpi->zbin_mode_boost_enabled = 0; | 1184 cpi->zbin_mode_boost_enabled = 0; |
| 1260 } | 1185 } |
| 1261 inter_error = vp8_rd_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffs
et, &rate, &distortion, &intra_error); | 1186 vp8_rd_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate, |
| 1187 &distortion, &intra_error); |
| 1262 | 1188 |
| 1263 /* switch back to the regular quantizer for the encode */ | 1189 /* switch back to the regular quantizer for the encode */ |
| 1264 if (cpi->sf.improved_quant) | 1190 if (cpi->sf.improved_quant) |
| 1265 { | 1191 { |
| 1266 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize, quantb)
; | 1192 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize, |
| 1193 quantb); |
| 1194 cpi->mb.quantize_b_pair = QUANTIZE_INVOKE(&cpi->rtcd.quantize, |
| 1195 quantb_pair); |
| 1267 } | 1196 } |
| 1268 | 1197 |
| 1269 /* restore cpi->zbin_mode_boost_enabled */ | 1198 /* restore cpi->zbin_mode_boost_enabled */ |
| 1270 cpi->zbin_mode_boost_enabled = zbin_mode_boost_enabled; | 1199 cpi->zbin_mode_boost_enabled = zbin_mode_boost_enabled; |
| 1271 | 1200 |
| 1272 } | 1201 } |
| 1273 else | 1202 else |
| 1274 #endif | 1203 vp8_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate, |
| 1275 inter_error = vp8_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset,
&rate, &distortion, &intra_error); | 1204 &distortion, &intra_error); |
| 1276 | 1205 |
| 1206 cpi->prediction_error += distortion; |
| 1207 cpi->intra_error += intra_error; |
| 1277 | 1208 |
| 1278 cpi->prediction_error += inter_error; | 1209 if(cpi->oxcf.tuning == VP8_TUNE_SSIM) |
| 1279 cpi->intra_error += intra_error; | 1210 { |
| 1211 // Adjust the zbin based on this MB rate. |
| 1212 adjust_act_zbin( cpi, x ); |
| 1213 } |
| 1280 | 1214 |
| 1281 #if 0 | 1215 #if 0 |
| 1282 // Experimental RD code | 1216 // Experimental RD code |
| 1283 cpi->frame_distortion += distortion; | 1217 cpi->frame_distortion += distortion; |
| 1284 cpi->last_mb_distortion = distortion; | 1218 cpi->last_mb_distortion = distortion; |
| 1285 #endif | 1219 #endif |
| 1286 | 1220 |
| 1287 // MB level adjutment to quantizer setup | 1221 // MB level adjutment to quantizer setup |
| 1288 if (xd->segmentation_enabled) | 1222 if (xd->segmentation_enabled) |
| 1289 { | 1223 { |
| 1290 // If cyclic update enabled | 1224 // If cyclic update enabled |
| 1291 if (cpi->cyclic_refresh_mode_enabled) | 1225 if (cpi->cyclic_refresh_mode_enabled) |
| 1292 { | 1226 { |
| 1293 // Clear segment_id back to 0 if not coded (last frame 0,0) | 1227 // Clear segment_id back to 0 if not coded (last frame 0,0) |
| 1294 if ((xd->mode_info_context->mbmi.segment_id == 1) && | 1228 if ((xd->mode_info_context->mbmi.segment_id == 1) && |
| 1295 ((xd->mode_info_context->mbmi.ref_frame != LAST_FRAME) || (xd->m
ode_info_context->mbmi.mode != ZEROMV))) | 1229 ((xd->mode_info_context->mbmi.ref_frame != LAST_FRAME) || (xd->m
ode_info_context->mbmi.mode != ZEROMV))) |
| 1296 { | 1230 { |
| 1297 xd->mode_info_context->mbmi.segment_id = 0; | 1231 xd->mode_info_context->mbmi.segment_id = 0; |
| 1298 | 1232 |
| 1299 /* segment_id changed, so update */ | 1233 /* segment_id changed, so update */ |
| 1300 vp8cx_mb_init_quantizer(cpi, x); | 1234 vp8cx_mb_init_quantizer(cpi, x); |
| 1301 } | 1235 } |
| 1302 } | 1236 } |
| 1303 } | 1237 } |
| 1304 | 1238 |
| 1305 { | 1239 { |
| 1306 // Experimental code. Special case for gf and arf zeromv modes. Increase
zbin size to supress noise | 1240 // Experimental code. Special case for gf and arf zeromv modes. |
| 1241 // Increase zbin size to supress noise |
| 1242 cpi->zbin_mode_boost = 0; |
| 1307 if (cpi->zbin_mode_boost_enabled) | 1243 if (cpi->zbin_mode_boost_enabled) |
| 1308 { | 1244 { |
| 1309 if ( xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME ) | 1245 if ( xd->mode_info_context->mbmi.ref_frame != INTRA_FRAME ) |
| 1310 cpi->zbin_mode_boost = 0; | |
| 1311 else | |
| 1312 { | 1246 { |
| 1313 if (xd->mode_info_context->mbmi.mode == ZEROMV) | 1247 if (xd->mode_info_context->mbmi.mode == ZEROMV) |
| 1314 { | 1248 { |
| 1315 if (xd->mode_info_context->mbmi.ref_frame != LAST_FRAME) | 1249 if (xd->mode_info_context->mbmi.ref_frame != LAST_FRAME) |
| 1316 cpi->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST; | 1250 cpi->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST; |
| 1317 else | 1251 else |
| 1318 cpi->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST; | 1252 cpi->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST; |
| 1319 } | 1253 } |
| 1320 else if (xd->mode_info_context->mbmi.mode == SPLITMV) | 1254 else if (xd->mode_info_context->mbmi.mode == SPLITMV) |
| 1321 cpi->zbin_mode_boost = 0; | 1255 cpi->zbin_mode_boost = 0; |
| 1322 else | 1256 else |
| 1323 cpi->zbin_mode_boost = MV_ZBIN_BOOST; | 1257 cpi->zbin_mode_boost = MV_ZBIN_BOOST; |
| 1324 } | 1258 } |
| 1325 } | 1259 } |
| 1326 else | |
| 1327 cpi->zbin_mode_boost = 0; | |
| 1328 | |
| 1329 vp8_update_zbin_extra(cpi, x); | 1260 vp8_update_zbin_extra(cpi, x); |
| 1330 } | 1261 } |
| 1331 | 1262 |
| 1332 cpi->count_mb_ref_frame_usage[xd->mode_info_context->mbmi.ref_frame] ++; | 1263 cpi->count_mb_ref_frame_usage[xd->mode_info_context->mbmi.ref_frame] ++; |
| 1333 | 1264 |
| 1334 if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) | 1265 if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) |
| 1335 { | 1266 { |
| 1336 vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x); | 1267 vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x); |
| 1337 | 1268 |
| 1338 if (xd->mode_info_context->mbmi.mode == B_PRED) | 1269 if (xd->mode_info_context->mbmi.mode == B_PRED) |
| 1339 { | 1270 { |
| 1340 vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x); | 1271 vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x); |
| 1341 } | 1272 } |
| 1342 else | 1273 else |
| 1343 { | 1274 { |
| 1344 vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x); | 1275 vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x); |
| 1345 } | 1276 } |
| 1346 | 1277 |
| 1347 sum_intra_stats(cpi, x); | 1278 sum_intra_stats(cpi, x); |
| 1348 } | 1279 } |
| 1349 else | 1280 else |
| 1350 { | 1281 { |
| 1351 MV best_ref_mv; | |
| 1352 MV nearest, nearby; | |
| 1353 int mdcounts[4]; | |
| 1354 int ref_fb_idx; | 1282 int ref_fb_idx; |
| 1355 | 1283 |
| 1356 vp8_find_near_mvs(xd, xd->mode_info_context, | |
| 1357 &nearest, &nearby, &best_ref_mv, mdcounts, xd->mode_in
fo_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias); | |
| 1358 | |
| 1359 vp8_build_uvmvs(xd, cpi->common.full_pixel); | 1284 vp8_build_uvmvs(xd, cpi->common.full_pixel); |
| 1360 | 1285 |
| 1361 if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) | 1286 if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) |
| 1362 ref_fb_idx = cpi->common.lst_fb_idx; | 1287 ref_fb_idx = cpi->common.lst_fb_idx; |
| 1363 else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME) | 1288 else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME) |
| 1364 ref_fb_idx = cpi->common.gld_fb_idx; | 1289 ref_fb_idx = cpi->common.gld_fb_idx; |
| 1365 else | 1290 else |
| 1366 ref_fb_idx = cpi->common.alt_fb_idx; | 1291 ref_fb_idx = cpi->common.alt_fb_idx; |
| 1367 | 1292 |
| 1368 xd->pre.y_buffer = cpi->common.yv12_fb[ref_fb_idx].y_buffer + recon_yoff
set; | 1293 xd->pre.y_buffer = cpi->common.yv12_fb[ref_fb_idx].y_buffer + recon_yoff
set; |
| 1369 xd->pre.u_buffer = cpi->common.yv12_fb[ref_fb_idx].u_buffer + recon_uvof
fset; | 1294 xd->pre.u_buffer = cpi->common.yv12_fb[ref_fb_idx].u_buffer + recon_uvof
fset; |
| 1370 xd->pre.v_buffer = cpi->common.yv12_fb[ref_fb_idx].v_buffer + recon_uvof
fset; | 1295 xd->pre.v_buffer = cpi->common.yv12_fb[ref_fb_idx].v_buffer + recon_uvof
fset; |
| 1371 | 1296 |
| 1372 if (xd->mode_info_context->mbmi.mode == SPLITMV) | 1297 if (!x->skip) |
| 1373 { | |
| 1374 int i; | |
| 1375 | |
| 1376 for (i = 0; i < 16; i++) | |
| 1377 { | |
| 1378 if (xd->block[i].bmi.mode == NEW4X4) | |
| 1379 { | |
| 1380 cpi->MVcount[0][mv_max+((xd->block[i].bmi.mv.as_mv.row - bes
t_ref_mv.row) >> 1)]++; | |
| 1381 cpi->MVcount[1][mv_max+((xd->block[i].bmi.mv.as_mv.col - bes
t_ref_mv.col) >> 1)]++; | |
| 1382 } | |
| 1383 } | |
| 1384 } | |
| 1385 else if (xd->mode_info_context->mbmi.mode == NEWMV) | |
| 1386 { | |
| 1387 cpi->MVcount[0][mv_max+((xd->block[0].bmi.mv.as_mv.row - best_ref_mv
.row) >> 1)]++; | |
| 1388 cpi->MVcount[1][mv_max+((xd->block[0].bmi.mv.as_mv.col - best_ref_mv
.col) >> 1)]++; | |
| 1389 } | |
| 1390 | |
| 1391 if (!x->skip && !x->e_mbd.mode_info_context->mbmi.force_no_skip) | |
| 1392 { | 1298 { |
| 1393 vp8_encode_inter16x16(IF_RTCD(&cpi->rtcd), x); | 1299 vp8_encode_inter16x16(IF_RTCD(&cpi->rtcd), x); |
| 1394 | 1300 |
| 1395 // Clear mb_skip_coeff if mb_no_coeff_skip is not set | 1301 // Clear mb_skip_coeff if mb_no_coeff_skip is not set |
| 1396 if (!cpi->common.mb_no_coeff_skip) | 1302 if (!cpi->common.mb_no_coeff_skip) |
| 1397 xd->mode_info_context->mbmi.mb_skip_coeff = 0; | 1303 xd->mode_info_context->mbmi.mb_skip_coeff = 0; |
| 1398 | 1304 |
| 1399 } | 1305 } |
| 1400 else | 1306 else |
| 1401 vp8_stuff_inter16x16(x); | 1307 vp8_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer, |
| 1308 xd->dst.u_buffer, xd->dst.v_buffer, |
| 1309 xd->dst.y_stride, xd->dst.uv_stride); |
| 1310 |
| 1402 } | 1311 } |
| 1403 | 1312 |
| 1404 if (!x->skip) | 1313 if (!x->skip) |
| 1405 vp8_tokenize_mb(cpi, xd, t); | 1314 vp8_tokenize_mb(cpi, xd, t); |
| 1406 else | 1315 else |
| 1407 { | 1316 { |
| 1408 if (cpi->common.mb_no_coeff_skip) | 1317 if (cpi->common.mb_no_coeff_skip) |
| 1409 { | 1318 { |
| 1410 if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_cont
ext->mbmi.mode != SPLITMV) | |
| 1411 xd->mode_info_context->mbmi.dc_diff = 0; | |
| 1412 else | |
| 1413 xd->mode_info_context->mbmi.dc_diff = 1; | |
| 1414 | |
| 1415 xd->mode_info_context->mbmi.mb_skip_coeff = 1; | 1319 xd->mode_info_context->mbmi.mb_skip_coeff = 1; |
| 1416 cpi->skip_true_count ++; | 1320 cpi->skip_true_count ++; |
| 1417 vp8_fix_contexts(xd); | 1321 vp8_fix_contexts(xd); |
| 1418 } | 1322 } |
| 1419 else | 1323 else |
| 1420 { | 1324 { |
| 1421 vp8_stuff_mb(cpi, xd, t); | 1325 vp8_stuff_mb(cpi, xd, t); |
| 1422 xd->mode_info_context->mbmi.mb_skip_coeff = 0; | 1326 xd->mode_info_context->mbmi.mb_skip_coeff = 0; |
| 1423 cpi->skip_false_count ++; | 1327 cpi->skip_false_count ++; |
| 1424 } | 1328 } |
| 1425 } | 1329 } |
| 1426 | 1330 |
| 1427 return rate; | 1331 return rate; |
| 1428 } | 1332 } |
| OLD | NEW |