| 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 13 matching lines...) Expand all Loading... |
| 24 #include "vp8/common/reconinter.h" | 24 #include "vp8/common/reconinter.h" |
| 25 #include "vp8/common/reconintra.h" | 25 #include "vp8/common/reconintra.h" |
| 26 #include "vp8/common/reconintra4x4.h" | 26 #include "vp8/common/reconintra4x4.h" |
| 27 #include "vp8/common/findnearmv.h" | 27 #include "vp8/common/findnearmv.h" |
| 28 #include "encodemb.h" | 28 #include "encodemb.h" |
| 29 #include "quantize.h" | 29 #include "quantize.h" |
| 30 #include "vp8/common/idct.h" | 30 #include "vp8/common/idct.h" |
| 31 #include "vp8/common/g_common.h" | 31 #include "vp8/common/g_common.h" |
| 32 #include "variance.h" | 32 #include "variance.h" |
| 33 #include "mcomp.h" | 33 #include "mcomp.h" |
| 34 #include "rdopt.h" | 34 |
| 35 #include "vpx_mem/vpx_mem.h" | 35 #include "vpx_mem/vpx_mem.h" |
| 36 #include "dct.h" | 36 #include "dct.h" |
| 37 #include "vp8/common/systemdependent.h" | 37 #include "vp8/common/systemdependent.h" |
| 38 | 38 |
| 39 #if CONFIG_RUNTIME_CPU_DETECT | 39 #if CONFIG_RUNTIME_CPU_DETECT |
| 40 #define IF_RTCD(x) (x) | 40 #define IF_RTCD(x) (x) |
| 41 #else | 41 #else |
| 42 #define IF_RTCD(x) NULL | 42 #define IF_RTCD(x) NULL |
| 43 #endif | 43 #endif |
| 44 | 44 |
| 45 | 45 |
| 46 extern void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x); | 46 extern void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x); |
| 47 extern void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x); | 47 extern void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x); |
| 48 | 48 |
| 49 |
| 50 #define RDCOST(RM,DM,R,D) ( ((128+(R)*(RM)) >> 8) + (DM)*(D) ) |
| 51 |
| 49 #define MAXF(a,b) (((a) > (b)) ? (a) : (b)) | 52 #define MAXF(a,b) (((a) > (b)) ? (a) : (b)) |
| 50 | 53 |
| 54 |
| 55 |
| 51 static const int auto_speed_thresh[17] = | 56 static const int auto_speed_thresh[17] = |
| 52 { | 57 { |
| 53 1000, | 58 1000, |
| 54 200, | 59 200, |
| 55 150, | 60 150, |
| 56 130, | 61 130, |
| 57 150, | 62 150, |
| 58 125, | 63 125, |
| 59 120, | 64 120, |
| 60 115, | 65 115, |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 ALTREF_FRAME, | 132 ALTREF_FRAME, |
| 128 | 133 |
| 129 LAST_FRAME, | 134 LAST_FRAME, |
| 130 GOLDEN_FRAME, | 135 GOLDEN_FRAME, |
| 131 ALTREF_FRAME, | 136 ALTREF_FRAME, |
| 132 | 137 |
| 133 INTRA_FRAME, | 138 INTRA_FRAME, |
| 134 }; | 139 }; |
| 135 | 140 |
| 136 static void fill_token_costs( | 141 static void fill_token_costs( |
| 137 unsigned int c [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENT
ROPY_TOKENS], | 142 unsigned int c [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coe
f_tokens], |
| 138 const vp8_prob p [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY
_NODES] | 143 const vp8_prob p [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coe
f_tokens-1] |
| 139 ) | 144 ) |
| 140 { | 145 { |
| 141 int i, j, k; | 146 int i, j, k; |
| 142 | 147 |
| 143 | 148 |
| 144 for (i = 0; i < BLOCK_TYPES; i++) | 149 for (i = 0; i < BLOCK_TYPES; i++) |
| 145 for (j = 0; j < COEF_BANDS; j++) | 150 for (j = 0; j < COEF_BANDS; j++) |
| 146 for (k = 0; k < PREV_COEF_CONTEXTS; k++) | 151 for (k = 0; k < PREV_COEF_CONTEXTS; k++) |
| 147 | 152 |
| 148 vp8_cost_tokens((int *)(c [i][j][k]), p [i][j][k], vp8_coef_tree
); | 153 vp8_cost_tokens((int *)(c [i][j][k]), p [i][j][k], vp8_coef_tree
); |
| 149 | 154 |
| 150 } | 155 } |
| 151 | 156 |
| 152 static int rd_iifactor [ 32 ] = { 4, 4, 3, 2, 1, 0, 0, 0, | 157 static int rd_iifactor [ 32 ] = { 4, 4, 3, 2, 1, 0, 0, 0, |
| 153 0, 0, 0, 0, 0, 0, 0, 0, | 158 0, 0, 0, 0, 0, 0, 0, 0, |
| 154 0, 0, 0, 0, 0, 0, 0, 0, | 159 0, 0, 0, 0, 0, 0, 0, 0, |
| 155 0, 0, 0, 0, 0, 0, 0, 0, | 160 0, 0, 0, 0, 0, 0, 0, 0, |
| 156 }; | 161 }; |
| 157 | 162 |
| 163 |
| 158 /* values are now correlated to quantizer */ | 164 /* values are now correlated to quantizer */ |
| 159 static int sad_per_bit16lut[QINDEX_RANGE] = | 165 static int sad_per_bit16lut[QINDEX_RANGE] = |
| 160 { | 166 { |
| 161 2, 2, 2, 2, 2, 2, 2, 2, | |
| 162 2, 2, 2, 2, 2, 2, 2, 2, | |
| 163 3, 3, 3, 3, 3, 3, 3, 3, | |
| 164 3, 3, 3, 3, 3, 3, 4, 4, | |
| 165 4, 4, 4, 4, 4, 4, 4, 4, | |
| 166 4, 4, 5, 5, 5, 5, 5, 5, | |
| 167 5, 5, 5, 5, 5, 5, 6, 6, | 167 5, 5, 5, 5, 5, 5, 6, 6, |
| 168 6, 6, 6, 6, 6, 6, 6, 6, | 168 6, 6, 6, 6, 6, 7, 7, 7, |
| 169 6, 6, 7, 7, 7, 7, 7, 7, | 169 7, 7, 7, 7, 8, 8, 8, 8, |
| 170 7, 7, 7, 7, 7, 7, 8, 8, | 170 8, 8, 8, 8, 8, 8, 9, 9, |
| 171 8, 8, 8, 8, 8, 8, 8, 8, | 171 9, 9, 9, 9, 10, 10, 10, 10, |
| 172 8, 8, 9, 9, 9, 9, 9, 9, | 172 10, 10, 11, 11, 11, 11, 11, 11, |
| 173 9, 9, 9, 9, 9, 9, 10, 10, | 173 12, 12, 12, 12, 12, 12, 12, 13, |
| 174 10, 10, 10, 10, 10, 10, 11, 11, | 174 13, 13, 13, 13, 13, 14, 14, 14, |
| 175 11, 11, 11, 11, 12, 12, 12, 12, | 175 14, 14, 15, 15, 15, 15, 15, 15, |
| 176 12, 12, 13, 13, 13, 13, 14, 14 | 176 16, 16, 16, 16, 16, 16, 17, 17, |
| 177 17, 17, 17, 17, 17, 18, 18, 18, |
| 178 18, 18, 19, 19, 19, 19, 19, 19, |
| 179 20, 20, 20, 21, 21, 21, 21, 22, |
| 180 22, 22, 23, 23, 23, 24, 24, 24, |
| 181 25, 25, 26, 26, 27, 27, 27, 28, |
| 182 28, 28, 29, 29, 30, 30, 31, 31 |
| 177 }; | 183 }; |
| 178 static int sad_per_bit4lut[QINDEX_RANGE] = | 184 static int sad_per_bit4lut[QINDEX_RANGE] = |
| 179 { | 185 { |
| 180 2, 2, 2, 2, 2, 2, 3, 3, | 186 5, 5, 5, 5, 5, 5, 7, 7, |
| 181 3, 3, 3, 3, 3, 3, 3, 3, | |
| 182 3, 3, 3, 3, 4, 4, 4, 4, | |
| 183 4, 4, 4, 4, 4, 4, 5, 5, | |
| 184 5, 5, 5, 5, 6, 6, 6, 6, | |
| 185 6, 6, 6, 6, 6, 6, 6, 6, | |
| 186 7, 7, 7, 7, 7, 7, 7, 7, | |
| 187 7, 7, 7, 7, 7, 8, 8, 8, | 187 7, 7, 7, 7, 7, 8, 8, 8, |
| 188 8, 8, 9, 9, 9, 9, 9, 9, | 188 8, 8, 8, 8, 10, 10, 10, 10, |
| 189 10, 10, 10, 10, 10, 10, 10, 10, | 189 10, 10, 10, 10, 10, 10, 11, 11, |
| 190 11, 11, 11, 11, 11, 11, 11, 11, | 190 11, 11, 11, 11, 13, 13, 13, 13, |
| 191 12, 12, 12, 12, 12, 12, 12, 12, | 191 13, 13, 14, 14, 14, 14, 14, 14, |
| 192 13, 13, 13, 13, 13, 13, 13, 14, | 192 16, 16, 16, 16, 16, 16, 16, 17, |
| 193 14, 14, 14, 14, 15, 15, 15, 15, | 193 17, 17, 17, 17, 17, 19, 19, 19, |
| 194 16, 16, 16, 16, 17, 17, 17, 18, | 194 19, 19, 20, 20, 20, 20, 20, 20, |
| 195 18, 18, 19, 19, 19, 20, 20, 20, | 195 22, 22, 22, 22, 22, 22, 23, 23, |
| 196 23, 23, 23, 23, 23, 25, 25, 25, |
| 197 25, 25, 26, 26, 26, 26, 26, 26, |
| 198 28, 28, 28, 29, 29, 29, 29, 31, |
| 199 31, 31, 32, 32, 32, 34, 34, 34, |
| 200 35, 35, 37, 37, 38, 38, 38, 40, |
| 201 40, 40, 41, 41, 43, 43, 44, 44, |
| 196 }; | 202 }; |
| 197 | 203 |
| 198 void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex) | 204 void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex) |
| 199 { | 205 { |
| 200 cpi->mb.sadperbit16 = sad_per_bit16lut[QIndex]; | 206 cpi->mb.sadperbit16 = sad_per_bit16lut[QIndex]; |
| 201 cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex]; | 207 cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex]; |
| 202 } | 208 } |
| 203 | 209 |
| 204 void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue) | 210 void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue) |
| 205 { | 211 { |
| 206 int q; | 212 int q; |
| 207 int i; | 213 int i; |
| 208 double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0; | 214 double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0; |
| 209 double rdconst = 2.70; | 215 double rdconst = 3.00; |
| 210 | 216 |
| 211 vp8_clear_system_state(); //__asm emms; | 217 vp8_clear_system_state(); //__asm emms; |
| 212 | 218 |
| 213 // Further tests required to see if optimum is different | 219 // Further tests required to see if optimum is different |
| 214 // for key frames, golden frames and arf frames. | 220 // for key frames, golden frames and arf frames. |
| 215 // if (cpi->common.refresh_golden_frame || | 221 // if (cpi->common.refresh_golden_frame || |
| 216 // cpi->common.refresh_alt_ref_frame) | 222 // cpi->common.refresh_alt_ref_frame) |
| 217 cpi->RDMULT = (int)(rdconst * (capped_q * capped_q)); | 223 cpi->RDMULT = (int)(rdconst * (capped_q * capped_q)); |
| 218 | 224 |
| 219 // Extend rate multiplier along side quantizer zbin increases | 225 // Extend rate multiplier along side quantizer zbin increases |
| 220 if (cpi->zbin_over_quant > 0) | 226 if (cpi->zbin_over_quant > 0) |
| 221 { | 227 { |
| 222 double oq_factor; | 228 double oq_factor; |
| 223 double modq; | 229 double modq; |
| 224 | 230 |
| 225 // Experimental code using the same basic equation as used for Q above | 231 // Experimental code using the same basic equation as used for Q above |
| 226 // The units of cpi->zbin_over_quant are 1/128 of Q bin size | 232 // The units of cpi->zbin_over_quant are 1/128 of Q bin size |
| 227 oq_factor = 1.0 + ((double)0.0015625 * cpi->zbin_over_quant); | 233 oq_factor = 1.0 + ((double)0.0015625 * cpi->zbin_over_quant); |
| 228 modq = (int)((double)capped_q * oq_factor); | 234 modq = (int)((double)capped_q * oq_factor); |
| 229 cpi->RDMULT = (int)(rdconst * (modq * modq)); | 235 cpi->RDMULT = (int)(rdconst * (modq * modq)); |
| 230 } | 236 } |
| 231 | 237 |
| 232 if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) | 238 if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) |
| 233 { | 239 { |
| 234 if (cpi->twopass.next_iiratio > 31) | 240 if (cpi->next_iiratio > 31) |
| 235 cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4; | 241 cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4; |
| 236 else | 242 else |
| 237 cpi->RDMULT += | 243 cpi->RDMULT += (cpi->RDMULT * rd_iifactor[cpi->next_iiratio]) >> 4; |
| 238 (cpi->RDMULT * rd_iifactor[cpi->twopass.next_iiratio]) >> 4; | |
| 239 } | 244 } |
| 240 | 245 |
| 241 cpi->mb.errorperbit = (cpi->RDMULT / 110); | 246 cpi->mb.errorperbit = (cpi->RDMULT / 100); |
| 242 cpi->mb.errorperbit += (cpi->mb.errorperbit==0); | 247 cpi->mb.errorperbit += (cpi->mb.errorperbit==0); |
| 243 | 248 |
| 244 vp8_set_speed_features(cpi); | 249 vp8_set_speed_features(cpi); |
| 245 | 250 |
| 251 if (cpi->common.simpler_lpf) |
| 252 cpi->common.filter_type = SIMPLE_LOOPFILTER; |
| 253 |
| 246 q = (int)pow(Qvalue, 1.25); | 254 q = (int)pow(Qvalue, 1.25); |
| 247 | 255 |
| 248 if (q < 8) | 256 if (q < 8) |
| 249 q = 8; | 257 q = 8; |
| 250 | 258 |
| 251 if (cpi->RDMULT > 1000) | 259 if (cpi->RDMULT > 1000) |
| 252 { | 260 { |
| 253 cpi->RDDIV = 1; | 261 cpi->RDDIV = 1; |
| 254 cpi->RDMULT /= 100; | 262 cpi->RDMULT /= 100; |
| 255 | 263 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 cpi->mb.token_costs, | 298 cpi->mb.token_costs, |
| 291 (const vp8_prob( *)[8][3][11]) cpi->common.fc.coef_probs | 299 (const vp8_prob( *)[8][3][11]) cpi->common.fc.coef_probs |
| 292 ); | 300 ); |
| 293 | 301 |
| 294 vp8_init_mode_costs(cpi); | 302 vp8_init_mode_costs(cpi); |
| 295 | 303 |
| 296 } | 304 } |
| 297 | 305 |
| 298 void vp8_auto_select_speed(VP8_COMP *cpi) | 306 void vp8_auto_select_speed(VP8_COMP *cpi) |
| 299 { | 307 { |
| 308 int used = cpi->oxcf.cpu_used; |
| 309 |
| 300 int milliseconds_for_compress = (int)(1000000 / cpi->oxcf.frame_rate); | 310 int milliseconds_for_compress = (int)(1000000 / cpi->oxcf.frame_rate); |
| 301 | 311 |
| 302 milliseconds_for_compress = milliseconds_for_compress * (16 - cpi->oxcf.cpu_
used) / 16; | 312 milliseconds_for_compress = milliseconds_for_compress * (16 - cpi->oxcf.cpu_
used) / 16; |
| 303 | 313 |
| 304 #if 0 | 314 #if 0 |
| 305 | 315 |
| 306 if (0) | 316 if (0) |
| 307 { | 317 { |
| 308 FILE *f; | 318 FILE *f; |
| 309 | 319 |
| 310 f = fopen("speed.stt", "a"); | 320 f = fopen("speed.stt", "a"); |
| 311 fprintf(f, " %8ld %10ld %10ld %10ld\n", | 321 fprintf(f, " %8ld %10ld %10ld %10ld\n", |
| 312 cpi->common.current_video_frame, cpi->Speed, milliseconds_for_co
mpress, cpi->avg_pick_mode_time); | 322 cpi->common.current_video_frame, cpi->Speed, milliseconds_for_co
mpress, cpi->avg_pick_mode_time); |
| 313 fclose(f); | 323 fclose(f); |
| 314 } | 324 } |
| 315 | 325 |
| 316 #endif | 326 #endif |
| 317 | 327 |
| 318 /* | 328 /* |
| 319 // this is done during parameter valid check | 329 // this is done during parameter valid check |
| 320 if( cpi->oxcf.cpu_used > 16) | 330 if( used > 16) |
| 321 cpi->oxcf.cpu_used = 16; | 331 used = 16; |
| 322 if( cpi->oxcf.cpu_used < -16) | 332 if( used < -16) |
| 323 cpi->oxcf.cpu_used = -16; | 333 used = -16; |
| 324 */ | 334 */ |
| 325 | 335 |
| 326 if (cpi->avg_pick_mode_time < milliseconds_for_compress && (cpi->avg_encode_
time - cpi->avg_pick_mode_time) < milliseconds_for_compress) | 336 if (cpi->avg_pick_mode_time < milliseconds_for_compress && (cpi->avg_encode_
time - cpi->avg_pick_mode_time) < milliseconds_for_compress) |
| 327 { | 337 { |
| 328 if (cpi->avg_pick_mode_time == 0) | 338 if (cpi->avg_pick_mode_time == 0) |
| 329 { | 339 { |
| 330 cpi->Speed = 4; | 340 cpi->Speed = 4; |
| 331 } | 341 } |
| 332 else | 342 else |
| 333 { | 343 { |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 vp8_build_uvmvs(&x->e_mbd, 0); | 458 vp8_build_uvmvs(&x->e_mbd, 0); |
| 449 mv_row = x->e_mbd.block[16].bmi.mv.as_mv.row; | 459 mv_row = x->e_mbd.block[16].bmi.mv.as_mv.row; |
| 450 mv_col = x->e_mbd.block[16].bmi.mv.as_mv.col; | 460 mv_col = x->e_mbd.block[16].bmi.mv.as_mv.col; |
| 451 | 461 |
| 452 offset = (mv_row >> 3) * pre_stride + (mv_col >> 3); | 462 offset = (mv_row >> 3) * pre_stride + (mv_col >> 3); |
| 453 uptr = x->e_mbd.pre.u_buffer + offset; | 463 uptr = x->e_mbd.pre.u_buffer + offset; |
| 454 vptr = x->e_mbd.pre.v_buffer + offset; | 464 vptr = x->e_mbd.pre.v_buffer + offset; |
| 455 | 465 |
| 456 if ((mv_row | mv_col) & 7) | 466 if ((mv_row | mv_col) & 7) |
| 457 { | 467 { |
| 458 VARIANCE_INVOKE(rtcd, subpixvar8x8)(uptr, pre_stride, | 468 VARIANCE_INVOKE(rtcd, subpixvar8x8)(uptr, pre_stride, mv_col & 7, mv_row
& 7, upred_ptr, uv_stride, &sse2); |
| 459 mv_col & 7, mv_row & 7, upred_ptr, uv_stride, &sse2); | 469 VARIANCE_INVOKE(rtcd, subpixvar8x8)(vptr, pre_stride, mv_col & 7, mv_row
& 7, vpred_ptr, uv_stride, &sse1); |
| 460 VARIANCE_INVOKE(rtcd, subpixvar8x8)(vptr, pre_stride, | |
| 461 mv_col & 7, mv_row & 7, vpred_ptr, uv_stride, &sse1); | |
| 462 sse2 += sse1; | 470 sse2 += sse1; |
| 463 } | 471 } |
| 464 else | 472 else |
| 465 { | 473 { |
| 466 VARIANCE_INVOKE(rtcd, var8x8)(uptr, pre_stride, | 474 VARIANCE_INVOKE(rtcd, subpixvar8x8)(uptr, pre_stride, mv_col & 7, mv_row
& 7, upred_ptr, uv_stride, &sse2); |
| 467 upred_ptr, uv_stride, &sse2); | 475 VARIANCE_INVOKE(rtcd, subpixvar8x8)(vptr, pre_stride, mv_col & 7, mv_row
& 7, vpred_ptr, uv_stride, &sse1); |
| 468 VARIANCE_INVOKE(rtcd, var8x8)(vptr, pre_stride, | |
| 469 vpred_ptr, uv_stride, &sse1); | |
| 470 sse2 += sse1; | 476 sse2 += sse1; |
| 471 } | 477 } |
| 478 |
| 472 return sse2; | 479 return sse2; |
| 473 | 480 |
| 474 } | 481 } |
| 475 | 482 |
| 483 #if !(CONFIG_REALTIME_ONLY) |
| 476 static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a,
ENTROPY_CONTEXT *l) | 484 static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a,
ENTROPY_CONTEXT *l) |
| 477 { | 485 { |
| 478 int c = !type; /* start at coef 0, unless Y with Y2 */ | 486 int c = !type; /* start at coef 0, unless Y with Y2 */ |
| 479 int eob = b->eob; | 487 int eob = b->eob; |
| 480 int pt ; /* surrounding block/prev coef predictor */ | 488 int pt ; /* surrounding block/prev coef predictor */ |
| 481 int cost = 0; | 489 int cost = 0; |
| 482 short *qcoeff_ptr = b->qcoeff; | 490 short *qcoeff_ptr = b->qcoeff; |
| 483 | 491 |
| 484 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 492 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
| 485 | 493 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 const vp8_encodemb_rtcd_vtable_t *rtcd) | 544 const vp8_encodemb_rtcd_vtable_t *rtcd) |
| 537 { | 545 { |
| 538 int b; | 546 int b; |
| 539 MACROBLOCKD *const x = &mb->e_mbd; | 547 MACROBLOCKD *const x = &mb->e_mbd; |
| 540 BLOCK *const mb_y2 = mb->block + 24; | 548 BLOCK *const mb_y2 = mb->block + 24; |
| 541 BLOCKD *const x_y2 = x->block + 24; | 549 BLOCKD *const x_y2 = x->block + 24; |
| 542 short *Y2DCPtr = mb_y2->src_diff; | 550 short *Y2DCPtr = mb_y2->src_diff; |
| 543 BLOCK *beptr; | 551 BLOCK *beptr; |
| 544 int d; | 552 int d; |
| 545 | 553 |
| 546 ENCODEMB_INVOKE(rtcd, submby)( mb->src_diff, *(mb->block[0].base_src), | 554 ENCODEMB_INVOKE(rtcd, submby)( mb->src_diff, mb->src.y_buffer, |
| 547 mb->e_mbd.predictor, mb->block[0].src_stride
); | 555 mb->e_mbd.predictor, mb->src.y_stride ); |
| 548 | 556 |
| 549 // Fdct and building the 2nd order block | 557 // Fdct and building the 2nd order block |
| 550 for (beptr = mb->block; beptr < mb->block + 16; beptr += 2) | 558 for (beptr = mb->block; beptr < mb->block + 16; beptr += 2) |
| 551 { | 559 { |
| 552 mb->vp8_short_fdct8x4(beptr->src_diff, beptr->coeff, 32); | 560 mb->vp8_short_fdct8x4(beptr->src_diff, beptr->coeff, 32); |
| 553 *Y2DCPtr++ = beptr->coeff[0]; | 561 *Y2DCPtr++ = beptr->coeff[0]; |
| 554 *Y2DCPtr++ = beptr->coeff[16]; | 562 *Y2DCPtr++ = beptr->coeff[16]; |
| 555 } | 563 } |
| 556 | 564 |
| 557 // 2nd order fdct | 565 // 2nd order fdct |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 DECLARE_ALIGNED_ARRAY(16, unsigned char, best_predictor, 16*4); | 622 DECLARE_ALIGNED_ARRAY(16, unsigned char, best_predictor, 16*4); |
| 615 DECLARE_ALIGNED_ARRAY(16, short, best_dqcoeff, 16); | 623 DECLARE_ALIGNED_ARRAY(16, short, best_dqcoeff, 16); |
| 616 | 624 |
| 617 for (mode = B_DC_PRED; mode <= B_HU_PRED; mode++) | 625 for (mode = B_DC_PRED; mode <= B_HU_PRED; mode++) |
| 618 { | 626 { |
| 619 int this_rd; | 627 int this_rd; |
| 620 int ratey; | 628 int ratey; |
| 621 | 629 |
| 622 rate = bmode_costs[mode]; | 630 rate = bmode_costs[mode]; |
| 623 | 631 |
| 624 RECON_INVOKE(&cpi->rtcd.common->recon, intra4x4_predict) | 632 vp8_predict_intra4x4(b, mode, b->predictor); |
| 625 (b, mode, b->predictor); | |
| 626 ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), subb)(be, b, 16); | 633 ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), subb)(be, b, 16); |
| 627 x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32); | 634 x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32); |
| 628 x->quantize_b(be, b); | 635 x->quantize_b(be, b); |
| 629 | 636 |
| 630 tempa = ta; | 637 tempa = ta; |
| 631 templ = tl; | 638 templ = tl; |
| 632 | 639 |
| 633 ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ); | 640 ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ); |
| 634 rate += ratey; | 641 rate += ratey; |
| 635 distortion = ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), berr)(be->coe
ff, b->dqcoeff) >> 2; | 642 distortion = ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), berr)(be->coe
ff, b->dqcoeff) >> 2; |
| 636 | 643 |
| 637 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); | 644 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); |
| 638 | 645 |
| 639 if (this_rd < best_rd) | 646 if (this_rd < best_rd) |
| 640 { | 647 { |
| 641 *bestrate = rate; | 648 *bestrate = rate; |
| 642 *bestratey = ratey; | 649 *bestratey = ratey; |
| 643 *bestdistortion = distortion; | 650 *bestdistortion = distortion; |
| 644 best_rd = this_rd; | 651 best_rd = this_rd; |
| 645 *best_mode = mode; | 652 *best_mode = mode; |
| 646 *a = tempa; | 653 *a = tempa; |
| 647 *l = templ; | 654 *l = templ; |
| 648 copy_predictor(best_predictor, b->predictor); | 655 copy_predictor(best_predictor, b->predictor); |
| 649 vpx_memcpy(best_dqcoeff, b->dqcoeff, 32); | 656 vpx_memcpy(best_dqcoeff, b->dqcoeff, 32); |
| 650 } | 657 } |
| 651 } | 658 } |
| 652 b->bmi.as_mode = (B_PREDICTION_MODE)(*best_mode); | 659 |
| 660 b->bmi.mode = (B_PREDICTION_MODE)(*best_mode); |
| 653 | 661 |
| 654 IDCT_INVOKE(IF_RTCD(&cpi->rtcd.common->idct), idct16)(best_dqcoeff, b->diff,
32); | 662 IDCT_INVOKE(IF_RTCD(&cpi->rtcd.common->idct), idct16)(best_dqcoeff, b->diff,
32); |
| 655 RECON_INVOKE(IF_RTCD(&cpi->rtcd.common->recon), recon)(best_predictor, b->di
ff, *(b->base_dst) + b->dst, b->dst_stride); | 663 RECON_INVOKE(IF_RTCD(&cpi->rtcd.common->recon), recon)(best_predictor, b->di
ff, *(b->base_dst) + b->dst, b->dst_stride); |
| 656 | 664 |
| 657 return best_rd; | 665 return best_rd; |
| 658 } | 666 } |
| 659 | 667 |
| 660 static int rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate, | 668 int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate, |
| 661 int *rate_y, int *Distortion, int best_rd) | 669 int *rate_y, int *Distortion, int best_rd) |
| 662 { | 670 { |
| 663 MACROBLOCKD *const xd = &mb->e_mbd; | 671 MACROBLOCKD *const xd = &mb->e_mbd; |
| 664 int i; | 672 int i; |
| 665 int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; | 673 int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; |
| 666 int distortion = 0; | 674 int distortion = 0; |
| 667 int tot_rate_y = 0; | 675 int tot_rate_y = 0; |
| 668 int64_t total_rd = 0; | 676 long long total_rd = 0; |
| 669 ENTROPY_CONTEXT_PLANES t_above, t_left; | 677 ENTROPY_CONTEXT_PLANES t_above, t_left; |
| 670 ENTROPY_CONTEXT *ta; | 678 ENTROPY_CONTEXT *ta; |
| 671 ENTROPY_CONTEXT *tl; | 679 ENTROPY_CONTEXT *tl; |
| 672 unsigned int *bmode_costs; | 680 unsigned int *bmode_costs; |
| 673 | 681 |
| 674 vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)
); | 682 vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)
); |
| 675 vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); | 683 vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); |
| 676 | 684 |
| 677 ta = (ENTROPY_CONTEXT *)&t_above; | 685 ta = (ENTROPY_CONTEXT *)&t_above; |
| 678 tl = (ENTROPY_CONTEXT *)&t_left; | 686 tl = (ENTROPY_CONTEXT *)&t_left; |
| 679 | 687 |
| 680 vp8_intra_prediction_down_copy(xd); | 688 vp8_intra_prediction_down_copy(xd); |
| 681 | 689 |
| 682 bmode_costs = mb->inter_bmode_costs; | 690 bmode_costs = mb->inter_bmode_costs; |
| 683 | 691 |
| 684 for (i = 0; i < 16; i++) | 692 for (i = 0; i < 16; i++) |
| 685 { | 693 { |
| 686 MODE_INFO *const mic = xd->mode_info_context; | 694 MODE_INFO *const mic = xd->mode_info_context; |
| 687 const int mis = xd->mode_info_stride; | 695 const int mis = xd->mode_info_stride; |
| 688 B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); | 696 B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); |
| 689 int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(ry), UNINITIALIZED_I
S_SAFE(d); | 697 int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(ry), UNINITIALIZED_I
S_SAFE(d); |
| 690 | 698 |
| 691 if (mb->e_mbd.frame_type == KEY_FRAME) | 699 if (mb->e_mbd.frame_type == KEY_FRAME) |
| 692 { | 700 { |
| 693 const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); | 701 const B_PREDICTION_MODE A = vp8_above_bmi(mic, i, mis)->mode; |
| 694 const B_PREDICTION_MODE L = left_block_mode(mic, i); | 702 const B_PREDICTION_MODE L = vp8_left_bmi(mic, i)->mode; |
| 695 | 703 |
| 696 bmode_costs = mb->bmode_costs[A][L]; | 704 bmode_costs = mb->bmode_costs[A][L]; |
| 697 } | 705 } |
| 698 | 706 |
| 699 total_rd += rd_pick_intra4x4block( | 707 total_rd += rd_pick_intra4x4block( |
| 700 cpi, mb, mb->block + i, xd->block + i, &best_mode, bmode_costs, | 708 cpi, mb, mb->block + i, xd->block + i, &best_mode, bmode_costs, |
| 701 ta + vp8_block2above[i], | 709 ta + vp8_block2above[i], |
| 702 tl + vp8_block2left[i], &r, &ry, &d); | 710 tl + vp8_block2left[i], &r, &ry, &d); |
| 703 | 711 |
| 704 cost += r; | 712 cost += r; |
| 705 distortion += d; | 713 distortion += d; |
| 706 tot_rate_y += ry; | 714 tot_rate_y += ry; |
| 715 mic->bmi[i].mode = xd->block[i].bmi.mode = best_mode; |
| 707 | 716 |
| 708 mic->bmi[i].as_mode = best_mode; | 717 if(total_rd >= (long long)best_rd) |
| 709 | |
| 710 if(total_rd >= (int64_t)best_rd) | |
| 711 break; | 718 break; |
| 712 } | 719 } |
| 713 | 720 |
| 714 if(total_rd >= (int64_t)best_rd) | 721 if(total_rd >= (long long)best_rd) |
| 715 return INT_MAX; | 722 return INT_MAX; |
| 716 | 723 |
| 717 *Rate = cost; | 724 *Rate = cost; |
| 718 *rate_y += tot_rate_y; | 725 *rate_y += tot_rate_y; |
| 719 *Distortion = distortion; | 726 *Distortion = distortion; |
| 720 | 727 |
| 721 return RDCOST(mb->rdmult, mb->rddiv, cost, distortion); | 728 return RDCOST(mb->rdmult, mb->rddiv, cost, distortion); |
| 722 } | 729 } |
| 723 | 730 int vp8_rd_pick_intra16x16mby_mode(VP8_COMP *cpi, |
| 724 | 731 MACROBLOCK *x, |
| 725 static int rd_pick_intra16x16mby_mode(VP8_COMP *cpi, | 732 int *Rate, |
| 726 MACROBLOCK *x, | 733 int *rate_y, |
| 727 int *Rate, | 734 int *Distortion) |
| 728 int *rate_y, | |
| 729 int *Distortion) | |
| 730 { | 735 { |
| 731 MB_PREDICTION_MODE mode; | 736 MB_PREDICTION_MODE mode; |
| 732 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); | 737 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); |
| 733 int rate, ratey; | 738 int rate, ratey; |
| 734 int distortion; | 739 int distortion; |
| 735 int best_rd = INT_MAX; | 740 int best_rd = INT_MAX; |
| 736 int this_rd; | 741 int this_rd; |
| 737 | 742 |
| 738 //Y Search for 16x16 intra prediction mode | 743 //Y Search for 16x16 intra prediction mode |
| 739 for (mode = DC_PRED; mode <= TM_PRED; mode++) | 744 for (mode = DC_PRED; mode <= TM_PRED; mode++) |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 791 vp8_build_uvmvs(&x->e_mbd, fullpixel); | 796 vp8_build_uvmvs(&x->e_mbd, fullpixel); |
| 792 vp8_encode_inter16x16uvrd(IF_RTCD(&cpi->rtcd), x); | 797 vp8_encode_inter16x16uvrd(IF_RTCD(&cpi->rtcd), x); |
| 793 | 798 |
| 794 | 799 |
| 795 *rate = rd_cost_mbuv(x); | 800 *rate = rd_cost_mbuv(x); |
| 796 *distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4; | 801 *distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4; |
| 797 | 802 |
| 798 return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); | 803 return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); |
| 799 } | 804 } |
| 800 | 805 |
| 801 static void rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int
*rate_tokenonly, int *distortion) | 806 int vp8_rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *ra
te_tokenonly, int *distortion) |
| 802 { | 807 { |
| 803 MB_PREDICTION_MODE mode; | 808 MB_PREDICTION_MODE mode; |
| 804 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); | 809 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); |
| 805 int best_rd = INT_MAX; | 810 int best_rd = INT_MAX; |
| 806 int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r); | 811 int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r); |
| 807 int rate_to; | 812 int rate_to; |
| 808 | 813 |
| 809 for (mode = DC_PRED; mode <= TM_PRED; mode++) | 814 for (mode = DC_PRED; mode <= TM_PRED; mode++) |
| 810 { | 815 { |
| 811 int rate; | 816 int rate; |
| 812 int distortion; | 817 int distortion; |
| 813 int this_rd; | 818 int this_rd; |
| 814 | 819 |
| 815 x->e_mbd.mode_info_context->mbmi.uv_mode = mode; | 820 x->e_mbd.mode_info_context->mbmi.uv_mode = mode; |
| 816 RECON_INVOKE(&cpi->rtcd.common->recon, build_intra_predictors_mbuv) | 821 vp8_build_intra_predictors_mbuv(&x->e_mbd); |
| 817 (&x->e_mbd); | |
| 818 ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), submbuv)(x->src_diff, | 822 ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), submbuv)(x->src_diff, |
| 819 x->src.u_buffer, x->src.v_buffer, x->e_mbd.predictor, | 823 x->src.u_buffer, x->src.v_buffer, x->e_mbd.predictor, |
| 820 x->src.uv_stride); | 824 x->src.uv_stride); |
| 821 vp8_transform_mbuv(x); | 825 vp8_transform_mbuv(x); |
| 822 vp8_quantize_mbuv(x); | 826 vp8_quantize_mbuv(x); |
| 823 | 827 |
| 824 rate_to = rd_cost_mbuv(x); | 828 rate_to = rd_cost_mbuv(x); |
| 825 rate = rate_to + x->intra_uv_mode_cost[x->e_mbd.frame_type][x->e_mbd.mod
e_info_context->mbmi.uv_mode]; | 829 rate = rate_to + x->intra_uv_mode_cost[x->e_mbd.frame_type][x->e_mbd.mod
e_info_context->mbmi.uv_mode]; |
| 826 | 830 |
| 827 distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4; | 831 distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4; |
| 828 | 832 |
| 829 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); | 833 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); |
| 830 | 834 |
| 831 if (this_rd < best_rd) | 835 if (this_rd < best_rd) |
| 832 { | 836 { |
| 833 best_rd = this_rd; | 837 best_rd = this_rd; |
| 834 d = distortion; | 838 d = distortion; |
| 835 r = rate; | 839 r = rate; |
| 836 *rate_tokenonly = rate_to; | 840 *rate_tokenonly = rate_to; |
| 837 mode_selected = mode; | 841 mode_selected = mode; |
| 838 } | 842 } |
| 839 } | 843 } |
| 840 | 844 |
| 841 *rate = r; | 845 *rate = r; |
| 842 *distortion = d; | 846 *distortion = d; |
| 843 | 847 |
| 844 x->e_mbd.mode_info_context->mbmi.uv_mode = mode_selected; | 848 x->e_mbd.mode_info_context->mbmi.uv_mode = mode_selected; |
| 849 return best_rd; |
| 845 } | 850 } |
| 851 #endif |
| 846 | 852 |
| 847 int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]) | 853 int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]) |
| 848 { | 854 { |
| 849 vp8_prob p [VP8_MVREFS-1]; | 855 vp8_prob p [VP8_MVREFS-1]; |
| 850 assert(NEARESTMV <= m && m <= SPLITMV); | 856 assert(NEARESTMV <= m && m <= SPLITMV); |
| 851 vp8_mv_ref_probs(p, near_mv_ref_ct); | 857 vp8_mv_ref_probs(p, near_mv_ref_ct); |
| 852 return vp8_cost_token(vp8_mv_ref_tree, p, | 858 return vp8_cost_token(vp8_mv_ref_tree, p, |
| 853 vp8_mv_ref_encoding_array - NEARESTMV + m); | 859 vp8_mv_ref_encoding_array - NEARESTMV + m); |
| 854 } | 860 } |
| 855 | 861 |
| 856 void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv) | 862 void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, MV *mv) |
| 857 { | 863 { |
| 864 int i; |
| 865 |
| 858 x->e_mbd.mode_info_context->mbmi.mode = mb; | 866 x->e_mbd.mode_info_context->mbmi.mode = mb; |
| 859 x->e_mbd.mode_info_context->mbmi.mv.as_int = mv->as_int; | 867 x->e_mbd.mode_info_context->mbmi.mv.as_mv.row = mv->row; |
| 868 x->e_mbd.mode_info_context->mbmi.mv.as_mv.col = mv->col; |
| 869 |
| 870 for (i = 0; i < 16; i++) |
| 871 { |
| 872 B_MODE_INFO *bmi = &x->e_mbd.block[i].bmi; |
| 873 bmi->mode = (B_PREDICTION_MODE) mb; |
| 874 bmi->mv.as_mv.row = mv->row; |
| 875 bmi->mv.as_mv.col = mv->col; |
| 876 } |
| 860 } | 877 } |
| 861 | 878 |
| 879 #if !(CONFIG_REALTIME_ONLY) |
| 862 static int labels2mode( | 880 static int labels2mode( |
| 863 MACROBLOCK *x, | 881 MACROBLOCK *x, |
| 864 int const *labelings, int which_label, | 882 int const *labelings, int which_label, |
| 865 B_PREDICTION_MODE this_mode, | 883 B_PREDICTION_MODE this_mode, |
| 866 int_mv *this_mv, int_mv *best_ref_mv, | 884 MV *this_mv, MV *best_ref_mv, |
| 867 int *mvcost[2] | 885 int *mvcost[2] |
| 868 ) | 886 ) |
| 869 { | 887 { |
| 870 MACROBLOCKD *const xd = & x->e_mbd; | 888 MACROBLOCKD *const xd = & x->e_mbd; |
| 871 MODE_INFO *const mic = xd->mode_info_context; | 889 MODE_INFO *const mic = xd->mode_info_context; |
| 872 const int mis = xd->mode_info_stride; | 890 const int mis = xd->mode_info_stride; |
| 873 | 891 |
| 874 int cost = 0; | 892 int cost = 0; |
| 875 int thismvcost = 0; | 893 int thismvcost = 0; |
| 876 | 894 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 897 else | 915 else |
| 898 { | 916 { |
| 899 // the only time we should do costing for new motion vector or mode | 917 // the only time we should do costing for new motion vector or mode |
| 900 // is when we are on a new label (jbb May 08, 2007) | 918 // is when we are on a new label (jbb May 08, 2007) |
| 901 switch (m = this_mode) | 919 switch (m = this_mode) |
| 902 { | 920 { |
| 903 case NEW4X4 : | 921 case NEW4X4 : |
| 904 thismvcost = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102)
; | 922 thismvcost = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102)
; |
| 905 break; | 923 break; |
| 906 case LEFT4X4: | 924 case LEFT4X4: |
| 907 this_mv->as_int = col ? d[-1].bmi.mv.as_int : left_block_mv(mic,
i); | 925 *this_mv = col ? d[-1].bmi.mv.as_mv : vp8_left_bmi(mic, i)->mv.a
s_mv; |
| 908 break; | 926 break; |
| 909 case ABOVE4X4: | 927 case ABOVE4X4: |
| 910 this_mv->as_int = row ? d[-4].bmi.mv.as_int : above_block_mv(mic
, i, mis); | 928 *this_mv = row ? d[-4].bmi.mv.as_mv : vp8_above_bmi(mic, i, mis)
->mv.as_mv; |
| 911 break; | 929 break; |
| 912 case ZERO4X4: | 930 case ZERO4X4: |
| 913 this_mv->as_int = 0; | 931 this_mv->row = this_mv->col = 0; |
| 914 break; | 932 break; |
| 915 default: | 933 default: |
| 916 break; | 934 break; |
| 917 } | 935 } |
| 918 | 936 |
| 919 if (m == ABOVE4X4) // replace above with left if same | 937 if (m == ABOVE4X4) // replace above with left if same |
| 920 { | 938 { |
| 921 int_mv left_mv; | 939 const MV mv = col ? d[-1].bmi.mv.as_mv : vp8_left_bmi(mic, i)->m
v.as_mv; |
| 922 | 940 |
| 923 left_mv.as_int = col ? d[-1].bmi.mv.as_int : | 941 if (mv.row == this_mv->row && mv.col == this_mv->col) |
| 924 left_block_mv(mic, i); | |
| 925 | |
| 926 if (left_mv.as_int == this_mv->as_int) | |
| 927 m = LEFT4X4; | 942 m = LEFT4X4; |
| 928 } | 943 } |
| 929 | 944 |
| 930 cost = x->inter_bmode_costs[ m]; | 945 cost = x->inter_bmode_costs[ m]; |
| 931 } | 946 } |
| 932 | 947 |
| 933 d->bmi.mv.as_int = this_mv->as_int; | 948 d->bmi.mode = m; |
| 934 | 949 d->bmi.mv.as_mv = *this_mv; |
| 935 x->partition_info->bmi[i].mode = m; | |
| 936 x->partition_info->bmi[i].mv.as_int = this_mv->as_int; | |
| 937 | 950 |
| 938 } | 951 } |
| 939 while (++i < 16); | 952 while (++i < 16); |
| 940 | 953 |
| 941 cost += thismvcost ; | 954 cost += thismvcost ; |
| 942 return cost; | 955 return cost; |
| 943 } | 956 } |
| 944 | 957 |
| 945 static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels, | 958 static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels, |
| 946 int which_label, ENTROPY_CONTEXT *ta, | 959 int which_label, ENTROPY_CONTEXT *ta, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 986 | 999 |
| 987 return distortion; | 1000 return distortion; |
| 988 } | 1001 } |
| 989 | 1002 |
| 990 | 1003 |
| 991 static const unsigned int segmentation_to_sseshift[4] = {3, 3, 2, 0}; | 1004 static const unsigned int segmentation_to_sseshift[4] = {3, 3, 2, 0}; |
| 992 | 1005 |
| 993 | 1006 |
| 994 typedef struct | 1007 typedef struct |
| 995 { | 1008 { |
| 996 int_mv *ref_mv; | 1009 MV *ref_mv; |
| 997 int_mv mvp; | 1010 MV *mvp; |
| 998 | 1011 |
| 999 int segment_rd; | 1012 int segment_rd; |
| 1000 int segment_num; | 1013 int segment_num; |
| 1001 int r; | 1014 int r; |
| 1002 int d; | 1015 int d; |
| 1003 int segment_yrate; | 1016 int segment_yrate; |
| 1004 B_PREDICTION_MODE modes[16]; | 1017 B_PREDICTION_MODE modes[16]; |
| 1005 int_mv mvs[16]; | 1018 int_mv mvs[16]; |
| 1006 unsigned char eobs[16]; | 1019 unsigned char eobs[16]; |
| 1007 | 1020 |
| 1008 int mvthresh; | 1021 int mvthresh; |
| 1009 int *mdcounts; | 1022 int *mdcounts; |
| 1010 | 1023 |
| 1011 int_mv sv_mvp[4]; // save 4 mvp from 8x8 | 1024 MV sv_mvp[4]; // save 4 mvp from 8x8 |
| 1012 int sv_istep[2]; // save 2 initial step_param for 16x8/8x16 | 1025 int sv_istep[2]; // save 2 initial step_param for 16x8/8x16 |
| 1013 | 1026 |
| 1014 } BEST_SEG_INFO; | 1027 } BEST_SEG_INFO; |
| 1015 | 1028 |
| 1016 | 1029 |
| 1017 static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, | 1030 static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, |
| 1018 BEST_SEG_INFO *bsi, unsigned int segmentation) | 1031 BEST_SEG_INFO *bsi, unsigned int segmentation) |
| 1019 { | 1032 { |
| 1020 int i; | 1033 int i; |
| 1021 int const *labels; | 1034 int const *labels; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1063 label_mv_thresh = 1 * bsi->mvthresh / label_count ; | 1076 label_mv_thresh = 1 * bsi->mvthresh / label_count ; |
| 1064 | 1077 |
| 1065 // Segmentation method overheads | 1078 // Segmentation method overheads |
| 1066 rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encod
ings + segmentation); | 1079 rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encod
ings + segmentation); |
| 1067 rate += vp8_cost_mv_ref(SPLITMV, bsi->mdcounts); | 1080 rate += vp8_cost_mv_ref(SPLITMV, bsi->mdcounts); |
| 1068 this_segment_rd += RDCOST(x->rdmult, x->rddiv, rate, 0); | 1081 this_segment_rd += RDCOST(x->rdmult, x->rddiv, rate, 0); |
| 1069 br += rate; | 1082 br += rate; |
| 1070 | 1083 |
| 1071 for (i = 0; i < label_count; i++) | 1084 for (i = 0; i < label_count; i++) |
| 1072 { | 1085 { |
| 1073 int_mv mode_mv[B_MODE_COUNT]; | 1086 MV mode_mv[B_MODE_COUNT]; |
| 1074 int best_label_rd = INT_MAX; | 1087 int best_label_rd = INT_MAX; |
| 1075 B_PREDICTION_MODE mode_selected = ZERO4X4; | 1088 B_PREDICTION_MODE mode_selected = ZERO4X4; |
| 1076 int bestlabelyrate = 0; | 1089 int bestlabelyrate = 0; |
| 1077 | 1090 |
| 1078 // search for the best motion vector on this segment | 1091 // search for the best motion vector on this segment |
| 1079 for (this_mode = LEFT4X4; this_mode <= NEW4X4 ; this_mode ++) | 1092 for (this_mode = LEFT4X4; this_mode <= NEW4X4 ; this_mode ++) |
| 1080 { | 1093 { |
| 1081 int this_rd; | 1094 int this_rd; |
| 1082 int distortion; | 1095 int distortion; |
| 1083 int labelyrate; | 1096 int labelyrate; |
| 1084 ENTROPY_CONTEXT_PLANES t_above_s, t_left_s; | 1097 ENTROPY_CONTEXT_PLANES t_above_s, t_left_s; |
| 1085 ENTROPY_CONTEXT *ta_s; | 1098 ENTROPY_CONTEXT *ta_s; |
| 1086 ENTROPY_CONTEXT *tl_s; | 1099 ENTROPY_CONTEXT *tl_s; |
| 1087 | 1100 |
| 1088 vpx_memcpy(&t_above_s, &t_above, sizeof(ENTROPY_CONTEXT_PLANES)); | 1101 vpx_memcpy(&t_above_s, &t_above, sizeof(ENTROPY_CONTEXT_PLANES)); |
| 1089 vpx_memcpy(&t_left_s, &t_left, sizeof(ENTROPY_CONTEXT_PLANES)); | 1102 vpx_memcpy(&t_left_s, &t_left, sizeof(ENTROPY_CONTEXT_PLANES)); |
| 1090 | 1103 |
| 1091 ta_s = (ENTROPY_CONTEXT *)&t_above_s; | 1104 ta_s = (ENTROPY_CONTEXT *)&t_above_s; |
| 1092 tl_s = (ENTROPY_CONTEXT *)&t_left_s; | 1105 tl_s = (ENTROPY_CONTEXT *)&t_left_s; |
| 1093 | 1106 |
| 1094 if (this_mode == NEW4X4) | 1107 if (this_mode == NEW4X4) |
| 1095 { | 1108 { |
| 1096 int sseshift; | 1109 int sseshift; |
| 1097 int num00; | 1110 int num00; |
| 1098 int step_param = 0; | 1111 int step_param = 0; |
| 1099 int further_steps; | 1112 int further_steps; |
| 1100 int n; | 1113 int n; |
| 1101 int thissme; | 1114 int thissme; |
| 1102 int bestsme = INT_MAX; | 1115 int bestsme = INT_MAX; |
| 1103 int_mv temp_mv; | 1116 MV temp_mv; |
| 1104 BLOCK *c; | 1117 BLOCK *c; |
| 1105 BLOCKD *e; | 1118 BLOCKD *e; |
| 1106 | 1119 |
| 1107 // Is the best so far sufficiently good that we cant justify doi
ng and new motion search. | 1120 // Is the best so far sufficiently good that we cant justify doi
ng and new motion search. |
| 1108 if (best_label_rd < label_mv_thresh) | 1121 if (best_label_rd < label_mv_thresh) |
| 1109 break; | 1122 break; |
| 1110 | 1123 |
| 1111 if(cpi->compressor_speed) | 1124 if(cpi->compressor_speed) |
| 1112 { | 1125 { |
| 1113 if (segmentation == BLOCK_8X16 || segmentation == BLOCK_16X8
) | 1126 if (segmentation == BLOCK_8X16 || segmentation == BLOCK_16X8
) |
| 1114 { | 1127 { |
| 1115 bsi->mvp.as_int = bsi->sv_mvp[i].as_int; | 1128 bsi->mvp = &bsi->sv_mvp[i]; |
| 1116 if (i==1 && segmentation == BLOCK_16X8) | 1129 if (i==1 && segmentation == BLOCK_16X8) bsi->mvp = &bsi-
>sv_mvp[2]; |
| 1117 bsi->mvp.as_int = bsi->sv_mvp[2].as_int; | |
| 1118 | 1130 |
| 1119 step_param = bsi->sv_istep[i]; | 1131 step_param = bsi->sv_istep[i]; |
| 1120 } | 1132 } |
| 1121 | 1133 |
| 1122 // use previous block's result as next block's MV predictor. | 1134 // use previous block's result as next block's MV predictor. |
| 1123 if (segmentation == BLOCK_4X4 && i>0) | 1135 if (segmentation == BLOCK_4X4 && i>0) |
| 1124 { | 1136 { |
| 1125 bsi->mvp.as_int = x->e_mbd.block[i-1].bmi.mv.as_int; | 1137 bsi->mvp = &(x->e_mbd.block[i-1].bmi.mv.as_mv); |
| 1126 if (i==4 || i==8 || i==12) | 1138 if (i==4 || i==8 || i==12) bsi->mvp = &(x->e_mbd.block[i
-4].bmi.mv.as_mv); |
| 1127 bsi->mvp.as_int = x->e_mbd.block[i-4].bmi.mv.as_int; | |
| 1128 step_param = 2; | 1139 step_param = 2; |
| 1129 } | 1140 } |
| 1130 } | 1141 } |
| 1131 | 1142 |
| 1132 further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; | 1143 further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; |
| 1133 | 1144 |
| 1134 { | 1145 { |
| 1135 int sadpb = x->sadperbit4; | 1146 int sadpb = x->sadperbit4; |
| 1136 int_mv mvp_full; | |
| 1137 | |
| 1138 mvp_full.as_mv.row = bsi->mvp.as_mv.row >>3; | |
| 1139 mvp_full.as_mv.col = bsi->mvp.as_mv.col >>3; | |
| 1140 | 1147 |
| 1141 // find first label | 1148 // find first label |
| 1142 n = vp8_mbsplit_offset[segmentation][i]; | 1149 n = vp8_mbsplit_offset[segmentation][i]; |
| 1143 | 1150 |
| 1144 c = &x->block[n]; | 1151 c = &x->block[n]; |
| 1145 e = &x->e_mbd.block[n]; | 1152 e = &x->e_mbd.block[n]; |
| 1146 | 1153 |
| 1154 if (cpi->sf.search_method == HEX) |
| 1155 bestsme = vp8_hex_search(x, c, e, bsi->ref_mv, |
| 1156 &mode_mv[NEW4X4], step_param, s
adpb, &num00, v_fn_ptr, x->mvsadcost, x->mvcost, bsi->ref_mv); |
| 1157 |
| 1158 else |
| 1147 { | 1159 { |
| 1148 bestsme = cpi->diamond_search_sad(x, c, e, &mvp_full, | 1160 bestsme = cpi->diamond_search_sad(x, c, e, bsi->mvp, |
| 1149 &mode_mv[NEW4X4], step_param, | 1161 &mode_mv[NEW4X4], step
_param, |
| 1150 sadpb, &num00, v_fn_ptr, | 1162 sadpb / 2, &num00, v_f
n_ptr, x->mvsadcost, x->mvcost, bsi->ref_mv); |
| 1151 x->mvcost, bsi->ref_mv); | |
| 1152 | 1163 |
| 1153 n = num00; | 1164 n = num00; |
| 1154 num00 = 0; | 1165 num00 = 0; |
| 1155 | 1166 |
| 1156 while (n < further_steps) | 1167 while (n < further_steps) |
| 1157 { | 1168 { |
| 1158 n++; | 1169 n++; |
| 1159 | 1170 |
| 1160 if (num00) | 1171 if (num00) |
| 1161 num00--; | 1172 num00--; |
| 1162 else | 1173 else |
| 1163 { | 1174 { |
| 1164 thissme = cpi->diamond_search_sad(x, c, e, | 1175 thissme = cpi->diamond_search_sad(x, c, e, bsi->
mvp, |
| 1165 &mvp_full, &temp_mv, | 1176 &temp_mv, step
_param + n, |
| 1166 step_param + n, sadpb, | 1177 sadpb / 2, &nu
m00, v_fn_ptr, x->mvsadcost, x->mvcost, bsi->ref_mv); |
| 1167 &num00, v_fn_ptr, | |
| 1168 x->mvcost, bsi->ref_mv); | |
| 1169 | 1178 |
| 1170 if (thissme < bestsme) | 1179 if (thissme < bestsme) |
| 1171 { | 1180 { |
| 1172 bestsme = thissme; | 1181 bestsme = thissme; |
| 1173 mode_mv[NEW4X4].as_int = temp_mv.as_int; | 1182 mode_mv[NEW4X4].row = temp_mv.row; |
| 1183 mode_mv[NEW4X4].col = temp_mv.col; |
| 1174 } | 1184 } |
| 1175 } | 1185 } |
| 1176 } | 1186 } |
| 1177 } | 1187 } |
| 1178 | 1188 |
| 1179 sseshift = segmentation_to_sseshift[segmentation]; | 1189 sseshift = segmentation_to_sseshift[segmentation]; |
| 1180 | 1190 |
| 1181 // Should we do a full search (best quality only) | 1191 // Should we do a full search (best quality only) |
| 1182 if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) >
4000) | 1192 if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) >
4000) |
| 1183 { | 1193 { |
| 1184 /* Check if mvp_full is within the range. */ | 1194 thissme = cpi->full_search_sad(x, c, e, bsi->mvp, |
| 1185 vp8_clamp_mv(&mvp_full, x->mv_col_min, x->mv_col_max, x-
>mv_row_min, x->mv_row_max); | 1195 sadpb / 4, 16, v_fn_ptr,
x->mvcost, x->mvsadcost,bsi->ref_mv); |
| 1186 | |
| 1187 thissme = cpi->full_search_sad(x, c, e, &mvp_full, | |
| 1188 sadpb, 16, v_fn_ptr, | |
| 1189 x->mvcost, bsi->ref_mv); | |
| 1190 | 1196 |
| 1191 if (thissme < bestsme) | 1197 if (thissme < bestsme) |
| 1192 { | 1198 { |
| 1193 bestsme = thissme; | 1199 bestsme = thissme; |
| 1194 mode_mv[NEW4X4].as_int = e->bmi.mv.as_int; | 1200 mode_mv[NEW4X4] = e->bmi.mv.as_mv; |
| 1195 } | 1201 } |
| 1196 else | 1202 else |
| 1197 { | 1203 { |
| 1198 // The full search result is actually worse so re-in
state the previous best vector | 1204 // The full search result is actually worse so re-in
state the previous best vector |
| 1199 e->bmi.mv.as_int = mode_mv[NEW4X4].as_int; | 1205 e->bmi.mv.as_mv = mode_mv[NEW4X4]; |
| 1200 } | 1206 } |
| 1201 } | 1207 } |
| 1202 } | 1208 } |
| 1203 | 1209 |
| 1204 if (bestsme < INT_MAX) | 1210 if (bestsme < INT_MAX) |
| 1205 { | 1211 { |
| 1206 int distortion; | 1212 if (!cpi->common.full_pixel) |
| 1207 unsigned int sse; | 1213 cpi->find_fractional_mv_step(x, c, e, &mode_mv[NEW4X4], |
| 1208 cpi->find_fractional_mv_step(x, c, e, &mode_mv[NEW4X4], | 1214 bsi->ref_mv, x->errorperbit
/ 2, v_fn_ptr, x->mvcost); |
| 1209 bsi->ref_mv, x->errorperbit, v_fn_ptr, x->mvcost, | 1215 else |
| 1210 &distortion, &sse); | 1216 vp8_skip_fractional_mv_step(x, c, e, &mode_mv[NEW4X4], |
| 1211 | 1217 bsi->ref_mv, x->errorperbit,
v_fn_ptr, x->mvcost); |
| 1212 } | 1218 } |
| 1213 } /* NEW4X4 */ | 1219 } /* NEW4X4 */ |
| 1214 | 1220 |
| 1215 rate = labels2mode(x, labels, i, this_mode, &mode_mv[this_mode], | 1221 rate = labels2mode(x, labels, i, this_mode, &mode_mv[this_mode], |
| 1216 bsi->ref_mv, x->mvcost); | 1222 bsi->ref_mv, x->mvcost); |
| 1217 | 1223 |
| 1218 // Trap vectors that reach beyond the UMV borders | 1224 // Trap vectors that reach beyond the UMV borders |
| 1219 if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || ((mode_
mv[this_mode].as_mv.row >> 3) > x->mv_row_max) || | 1225 if (((mode_mv[this_mode].row >> 3) < x->mv_row_min) || ((mode_mv[thi
s_mode].row >> 3) > x->mv_row_max) || |
| 1220 ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_
mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) | 1226 ((mode_mv[this_mode].col >> 3) < x->mv_col_min) || ((mode_mv[thi
s_mode].col >> 3) > x->mv_col_max)) |
| 1221 { | 1227 { |
| 1222 continue; | 1228 continue; |
| 1223 } | 1229 } |
| 1224 | 1230 |
| 1225 distortion = vp8_encode_inter_mb_segment(x, labels, i, IF_RTCD(&cpi-
>rtcd.encodemb)) / 4; | 1231 distortion = vp8_encode_inter_mb_segment(x, labels, i, IF_RTCD(&cpi-
>rtcd.encodemb)) / 4; |
| 1226 | 1232 |
| 1227 labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s); | 1233 labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s); |
| 1228 rate += labelyrate; | 1234 rate += labelyrate; |
| 1229 | 1235 |
| 1230 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); | 1236 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1265 bsi->d = bd; | 1271 bsi->d = bd; |
| 1266 bsi->segment_yrate = segmentyrate; | 1272 bsi->segment_yrate = segmentyrate; |
| 1267 bsi->segment_rd = this_segment_rd; | 1273 bsi->segment_rd = this_segment_rd; |
| 1268 bsi->segment_num = segmentation; | 1274 bsi->segment_num = segmentation; |
| 1269 | 1275 |
| 1270 // store everything needed to come back to this!! | 1276 // store everything needed to come back to this!! |
| 1271 for (i = 0; i < 16; i++) | 1277 for (i = 0; i < 16; i++) |
| 1272 { | 1278 { |
| 1273 BLOCKD *bd = &x->e_mbd.block[i]; | 1279 BLOCKD *bd = &x->e_mbd.block[i]; |
| 1274 | 1280 |
| 1275 bsi->mvs[i].as_mv = x->partition_info->bmi[i].mv.as_mv; | 1281 bsi->mvs[i].as_mv = bd->bmi.mv.as_mv; |
| 1276 bsi->modes[i] = x->partition_info->bmi[i].mode; | 1282 bsi->modes[i] = bd->bmi.mode; |
| 1277 bsi->eobs[i] = bd->eob; | 1283 bsi->eobs[i] = bd->eob; |
| 1278 } | 1284 } |
| 1279 } | 1285 } |
| 1280 } | 1286 } |
| 1281 | 1287 |
| 1282 static __inline | 1288 static __inline |
| 1283 void vp8_cal_step_param(int sr, int *sp) | 1289 void vp8_cal_step_param(int sr, int *sp) |
| 1284 { | 1290 { |
| 1285 int step = 0; | 1291 int step = 0; |
| 1286 | 1292 |
| 1287 if (sr > MAX_FIRST_STEP) sr = MAX_FIRST_STEP; | 1293 if (sr > MAX_FIRST_STEP) sr = MAX_FIRST_STEP; |
| 1288 else if (sr < 1) sr = 1; | 1294 else if (sr < 1) sr = 1; |
| 1289 | 1295 |
| 1290 while (sr>>=1) | 1296 while (sr>>=1) |
| 1291 step++; | 1297 step++; |
| 1292 | 1298 |
| 1293 *sp = MAX_MVSEARCH_STEPS - 1 - step; | 1299 *sp = MAX_MVSEARCH_STEPS - 1 - step; |
| 1294 } | 1300 } |
| 1295 | 1301 |
| 1296 static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, | 1302 static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, |
| 1297 int_mv *best_ref_mv, int best_rd, | 1303 MV *best_ref_mv, int best_rd, |
| 1298 int *mdcounts, int *returntotrate, | 1304 int *mdcounts, int *returntotrate, |
| 1299 int *returnyrate, int *returndistorti
on, | 1305 int *returnyrate, int *returndistorti
on, |
| 1300 int mvthresh) | 1306 int mvthresh) |
| 1301 { | 1307 { |
| 1302 int i; | 1308 int i; |
| 1303 BEST_SEG_INFO bsi; | 1309 BEST_SEG_INFO bsi; |
| 1304 | 1310 |
| 1305 vpx_memset(&bsi, 0, sizeof(bsi)); | 1311 vpx_memset(&bsi, 0, sizeof(bsi)); |
| 1306 | 1312 |
| 1307 bsi.segment_rd = best_rd; | 1313 bsi.segment_rd = best_rd; |
| 1308 bsi.ref_mv = best_ref_mv; | 1314 bsi.ref_mv = best_ref_mv; |
| 1309 bsi.mvp.as_int = best_ref_mv->as_int; | 1315 bsi.mvp = best_ref_mv; |
| 1310 bsi.mvthresh = mvthresh; | 1316 bsi.mvthresh = mvthresh; |
| 1311 bsi.mdcounts = mdcounts; | 1317 bsi.mdcounts = mdcounts; |
| 1312 | 1318 |
| 1313 for(i = 0; i < 16; i++) | 1319 for(i = 0; i < 16; i++) |
| 1314 { | 1320 { |
| 1315 bsi.modes[i] = ZERO4X4; | 1321 bsi.modes[i] = ZERO4X4; |
| 1316 } | 1322 } |
| 1317 | 1323 |
| 1318 if(cpi->compressor_speed == 0) | 1324 if(cpi->compressor_speed == 0) |
| 1319 { | 1325 { |
| 1320 /* for now, we will keep the original segmentation order | 1326 /* for now, we will keep the original segmentation order |
| 1321 when in best quality mode */ | 1327 when in best quality mode */ |
| 1322 rd_check_segment(cpi, x, &bsi, BLOCK_16X8); | 1328 rd_check_segment(cpi, x, &bsi, BLOCK_16X8); |
| 1323 rd_check_segment(cpi, x, &bsi, BLOCK_8X16); | 1329 rd_check_segment(cpi, x, &bsi, BLOCK_8X16); |
| 1324 rd_check_segment(cpi, x, &bsi, BLOCK_8X8); | 1330 rd_check_segment(cpi, x, &bsi, BLOCK_8X8); |
| 1325 rd_check_segment(cpi, x, &bsi, BLOCK_4X4); | 1331 rd_check_segment(cpi, x, &bsi, BLOCK_4X4); |
| 1326 } | 1332 } |
| 1327 else | 1333 else |
| 1328 { | 1334 { |
| 1329 int sr; | 1335 int sr; |
| 1330 | 1336 |
| 1331 rd_check_segment(cpi, x, &bsi, BLOCK_8X8); | 1337 rd_check_segment(cpi, x, &bsi, BLOCK_8X8); |
| 1332 | 1338 |
| 1333 if (bsi.segment_rd < best_rd) | 1339 if (bsi.segment_rd < best_rd) |
| 1334 { | 1340 { |
| 1335 int col_min = (best_ref_mv->as_mv.col>>3) - MAX_FULL_PEL_VAL + ((bes
t_ref_mv->as_mv.col & 7)?1:0); | 1341 int col_min = (best_ref_mv->col - MAX_FULL_PEL_VAL) >>3; |
| 1336 int row_min = (best_ref_mv->as_mv.row>>3) - MAX_FULL_PEL_VAL + ((bes
t_ref_mv->as_mv.row & 7)?1:0); | 1342 int col_max = (best_ref_mv->col + MAX_FULL_PEL_VAL) >>3; |
| 1337 int col_max = (best_ref_mv->as_mv.col>>3) + MAX_FULL_PEL_VAL; | 1343 int row_min = (best_ref_mv->row - MAX_FULL_PEL_VAL) >>3; |
| 1338 int row_max = (best_ref_mv->as_mv.row>>3) + MAX_FULL_PEL_VAL; | 1344 int row_max = (best_ref_mv->row + MAX_FULL_PEL_VAL) >>3; |
| 1339 | 1345 |
| 1340 int tmp_col_min = x->mv_col_min; | 1346 int tmp_col_min = x->mv_col_min; |
| 1341 int tmp_col_max = x->mv_col_max; | 1347 int tmp_col_max = x->mv_col_max; |
| 1342 int tmp_row_min = x->mv_row_min; | 1348 int tmp_row_min = x->mv_row_min; |
| 1343 int tmp_row_max = x->mv_row_max; | 1349 int tmp_row_max = x->mv_row_max; |
| 1344 | 1350 |
| 1345 /* Get intersection of UMV window and valid MV window to reduce # of
checks in diamond search. */ | 1351 /* Get intersection of UMV window and valid MV window to reduce # of
checks in diamond search. */ |
| 1346 if (x->mv_col_min < col_min ) | 1352 if (x->mv_col_min < col_min ) |
| 1347 x->mv_col_min = col_min; | 1353 x->mv_col_min = col_min; |
| 1348 if (x->mv_col_max > col_max ) | 1354 if (x->mv_col_max > col_max ) |
| 1349 x->mv_col_max = col_max; | 1355 x->mv_col_max = col_max; |
| 1350 if (x->mv_row_min < row_min ) | 1356 if (x->mv_row_min < row_min ) |
| 1351 x->mv_row_min = row_min; | 1357 x->mv_row_min = row_min; |
| 1352 if (x->mv_row_max > row_max ) | 1358 if (x->mv_row_max > row_max ) |
| 1353 x->mv_row_max = row_max; | 1359 x->mv_row_max = row_max; |
| 1354 | 1360 |
| 1355 /* Get 8x8 result */ | 1361 /* Get 8x8 result */ |
| 1356 bsi.sv_mvp[0].as_int = bsi.mvs[0].as_int; | 1362 bsi.sv_mvp[0] = bsi.mvs[0].as_mv; |
| 1357 bsi.sv_mvp[1].as_int = bsi.mvs[2].as_int; | 1363 bsi.sv_mvp[1] = bsi.mvs[2].as_mv; |
| 1358 bsi.sv_mvp[2].as_int = bsi.mvs[8].as_int; | 1364 bsi.sv_mvp[2] = bsi.mvs[8].as_mv; |
| 1359 bsi.sv_mvp[3].as_int = bsi.mvs[10].as_int; | 1365 bsi.sv_mvp[3] = bsi.mvs[10].as_mv; |
| 1360 | 1366 |
| 1361 /* Use 8x8 result as 16x8/8x16's predictor MV. Adjust search range a
ccording to the closeness of 2 MV. */ | 1367 /* Use 8x8 result as 16x8/8x16's predictor MV. Adjust search range a
ccording to the closeness of 2 MV. */ |
| 1362 /* block 8X16 */ | 1368 /* block 8X16 */ |
| 1363 { | 1369 { |
| 1364 sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[2].as_mv.row
))>>3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[2].as_mv.col))>>3); | 1370 sr = MAXF((abs(bsi.sv_mvp[0].row - bsi.sv_mvp[2].row))>>3, (abs(
bsi.sv_mvp[0].col - bsi.sv_mvp[2].col))>>3); |
| 1365 vp8_cal_step_param(sr, &bsi.sv_istep[0]); | 1371 vp8_cal_step_param(sr, &bsi.sv_istep[0]); |
| 1366 | 1372 |
| 1367 sr = MAXF((abs(bsi.sv_mvp[1].as_mv.row - bsi.sv_mvp[3].as_mv.row
))>>3, (abs(bsi.sv_mvp[1].as_mv.col - bsi.sv_mvp[3].as_mv.col))>>3); | 1373 sr = MAXF((abs(bsi.sv_mvp[1].row - bsi.sv_mvp[3].row))>>3, (abs(
bsi.sv_mvp[1].col - bsi.sv_mvp[3].col))>>3); |
| 1368 vp8_cal_step_param(sr, &bsi.sv_istep[1]); | 1374 vp8_cal_step_param(sr, &bsi.sv_istep[1]); |
| 1369 | 1375 |
| 1370 rd_check_segment(cpi, x, &bsi, BLOCK_8X16); | 1376 rd_check_segment(cpi, x, &bsi, BLOCK_8X16); |
| 1371 } | 1377 } |
| 1372 | 1378 |
| 1373 /* block 16X8 */ | 1379 /* block 16X8 */ |
| 1374 { | 1380 { |
| 1375 sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[1].as_mv.row
))>>3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[1].as_mv.col))>>3); | 1381 sr = MAXF((abs(bsi.sv_mvp[0].row - bsi.sv_mvp[1].row))>>3, (abs(
bsi.sv_mvp[0].col - bsi.sv_mvp[1].col))>>3); |
| 1376 vp8_cal_step_param(sr, &bsi.sv_istep[0]); | 1382 vp8_cal_step_param(sr, &bsi.sv_istep[0]); |
| 1377 | 1383 |
| 1378 sr = MAXF((abs(bsi.sv_mvp[2].as_mv.row - bsi.sv_mvp[3].as_mv.row
))>>3, (abs(bsi.sv_mvp[2].as_mv.col - bsi.sv_mvp[3].as_mv.col))>>3); | 1384 sr = MAXF((abs(bsi.sv_mvp[2].row - bsi.sv_mvp[3].row))>>3, (abs(
bsi.sv_mvp[2].col - bsi.sv_mvp[3].col))>>3); |
| 1379 vp8_cal_step_param(sr, &bsi.sv_istep[1]); | 1385 vp8_cal_step_param(sr, &bsi.sv_istep[1]); |
| 1380 | 1386 |
| 1381 rd_check_segment(cpi, x, &bsi, BLOCK_16X8); | 1387 rd_check_segment(cpi, x, &bsi, BLOCK_16X8); |
| 1382 } | 1388 } |
| 1383 | 1389 |
| 1384 /* If 8x8 is better than 16x8/8x16, then do 4x4 search */ | 1390 /* If 8x8 is better than 16x8/8x16, then do 4x4 search */ |
| 1385 /* Not skip 4x4 if speed=0 (good quality) */ | 1391 /* Not skip 4x4 if speed=0 (good quality) */ |
| 1386 if (cpi->sf.no_skip_block4x4_search || bsi.segment_num == BLOCK_8X8)
/* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */ | 1392 if (cpi->sf.no_skip_block4x4_search || bsi.segment_num == BLOCK_8X8)
/* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */ |
| 1387 { | 1393 { |
| 1388 bsi.mvp.as_int = bsi.sv_mvp[0].as_int; | 1394 bsi.mvp = &bsi.sv_mvp[0]; |
| 1389 rd_check_segment(cpi, x, &bsi, BLOCK_4X4); | 1395 rd_check_segment(cpi, x, &bsi, BLOCK_4X4); |
| 1390 } | 1396 } |
| 1391 | 1397 |
| 1392 /* restore UMV window */ | 1398 /* restore UMV window */ |
| 1393 x->mv_col_min = tmp_col_min; | 1399 x->mv_col_min = tmp_col_min; |
| 1394 x->mv_col_max = tmp_col_max; | 1400 x->mv_col_max = tmp_col_max; |
| 1395 x->mv_row_min = tmp_row_min; | 1401 x->mv_row_min = tmp_row_min; |
| 1396 x->mv_row_max = tmp_row_max; | 1402 x->mv_row_max = tmp_row_max; |
| 1397 } | 1403 } |
| 1398 } | 1404 } |
| 1399 | 1405 |
| 1400 /* set it to the best */ | 1406 /* set it to the best */ |
| 1401 for (i = 0; i < 16; i++) | 1407 for (i = 0; i < 16; i++) |
| 1402 { | 1408 { |
| 1403 BLOCKD *bd = &x->e_mbd.block[i]; | 1409 BLOCKD *bd = &x->e_mbd.block[i]; |
| 1404 | 1410 |
| 1405 bd->bmi.mv.as_int = bsi.mvs[i].as_int; | 1411 bd->bmi.mv.as_mv = bsi.mvs[i].as_mv; |
| 1412 bd->bmi.mode = bsi.modes[i]; |
| 1406 bd->eob = bsi.eobs[i]; | 1413 bd->eob = bsi.eobs[i]; |
| 1407 } | 1414 } |
| 1408 | 1415 |
| 1409 *returntotrate = bsi.r; | 1416 *returntotrate = bsi.r; |
| 1410 *returndistortion = bsi.d; | 1417 *returndistortion = bsi.d; |
| 1411 *returnyrate = bsi.segment_yrate; | 1418 *returnyrate = bsi.segment_yrate; |
| 1412 | 1419 |
| 1413 /* save partitions */ | 1420 /* save partitions */ |
| 1414 x->e_mbd.mode_info_context->mbmi.partitioning = bsi.segment_num; | 1421 x->e_mbd.mode_info_context->mbmi.partitioning = bsi.segment_num; |
| 1415 x->partition_info->count = vp8_mbsplit_count[bsi.segment_num]; | 1422 x->partition_info->count = vp8_mbsplit_count[bsi.segment_num]; |
| 1416 | 1423 |
| 1417 for (i = 0; i < x->partition_info->count; i++) | 1424 for (i = 0; i < x->partition_info->count; i++) |
| 1418 { | 1425 { |
| 1419 int j; | 1426 int j; |
| 1420 | 1427 |
| 1421 j = vp8_mbsplit_offset[bsi.segment_num][i]; | 1428 j = vp8_mbsplit_offset[bsi.segment_num][i]; |
| 1422 | 1429 |
| 1423 x->partition_info->bmi[i].mode = bsi.modes[j]; | 1430 x->partition_info->bmi[i].mode = x->e_mbd.block[j].bmi.mode; |
| 1424 x->partition_info->bmi[i].mv.as_mv = bsi.mvs[j].as_mv; | 1431 x->partition_info->bmi[i].mv.as_mv = x->e_mbd.block[j].bmi.mv.as_mv; |
| 1425 } | 1432 } |
| 1426 /* | |
| 1427 * used to set x->e_mbd.mode_info_context->mbmi.mv.as_int | |
| 1428 */ | |
| 1429 x->partition_info->bmi[15].mv.as_int = bsi.mvs[15].as_int; | |
| 1430 | 1433 |
| 1431 return bsi.segment_rd; | 1434 return bsi.segment_rd; |
| 1432 } | 1435 } |
| 1436 #endif |
| 1433 | 1437 |
| 1434 static void insertsortmv(int arr[], int len) | 1438 static void swap(int *x,int *y) |
| 1435 { | 1439 { |
| 1436 int i, j, k; | 1440 int tmp; |
| 1437 | 1441 |
| 1438 for ( i = 1 ; i <= len-1 ; i++ ) | 1442 tmp = *x; |
| 1439 { | 1443 *x = *y; |
| 1440 for ( j = 0 ; j < i ; j++ ) | 1444 *y = tmp; |
| 1441 { | |
| 1442 if ( arr[j] > arr[i] ) | |
| 1443 { | |
| 1444 int temp; | |
| 1445 | |
| 1446 temp = arr[i]; | |
| 1447 | |
| 1448 for ( k = i; k >j; k--) | |
| 1449 arr[k] = arr[k - 1] ; | |
| 1450 | |
| 1451 arr[j] = temp ; | |
| 1452 } | |
| 1453 } | |
| 1454 } | |
| 1455 } | 1445 } |
| 1456 | 1446 |
| 1457 static void insertsortsad(int arr[],int idx[], int len) | 1447 static void quicksortmv(int arr[],int left, int right) |
| 1458 { | 1448 { |
| 1459 int i, j, k; | 1449 int lidx,ridx,pivot; |
| 1460 | 1450 |
| 1461 for ( i = 1 ; i <= len-1 ; i++ ) | 1451 lidx = left; |
| 1462 { | 1452 ridx = right; |
| 1463 for ( j = 0 ; j < i ; j++ ) | |
| 1464 { | |
| 1465 if ( arr[j] > arr[i] ) | |
| 1466 { | |
| 1467 int temp, tempi; | |
| 1468 | 1453 |
| 1469 temp = arr[i]; | 1454 if( left < right) |
| 1470 tempi = idx[i]; | 1455 { |
| 1456 pivot = (left + right)/2; |
| 1471 | 1457 |
| 1472 for ( k = i; k >j; k--) | 1458 while(lidx <=pivot && ridx >=pivot) |
| 1473 { | 1459 { |
| 1474 arr[k] = arr[k - 1] ; | 1460 while(arr[lidx] < arr[pivot] && lidx <= pivot) |
| 1475 idx[k] = idx[k - 1]; | 1461 lidx++; |
| 1476 } | 1462 while(arr[ridx] > arr[pivot] && ridx >= pivot) |
| 1463 ridx--; |
| 1464 swap(&arr[lidx], &arr[ridx]); |
| 1465 lidx++; |
| 1466 ridx--; |
| 1467 if(lidx-1 == pivot) |
| 1468 { |
| 1469 ridx++; |
| 1470 pivot = ridx; |
| 1471 } |
| 1472 else if(ridx+1 == pivot) |
| 1473 { |
| 1474 lidx--; |
| 1475 pivot = lidx; |
| 1476 } |
| 1477 } |
| 1478 quicksortmv(arr, left, pivot - 1); |
| 1479 quicksortmv(arr, pivot + 1, right); |
| 1480 } |
| 1481 } |
| 1477 | 1482 |
| 1478 arr[j] = temp ; | 1483 static void quicksortsad(int arr[],int idx[], int left, int right) |
| 1479 idx[j] = tempi; | 1484 { |
| 1480 } | 1485 int lidx,ridx,pivot; |
| 1481 } | 1486 |
| 1482 } | 1487 lidx = left; |
| 1488 ridx = right; |
| 1489 |
| 1490 if( left < right) |
| 1491 { |
| 1492 pivot = (left + right)/2; |
| 1493 |
| 1494 while(lidx <=pivot && ridx >=pivot) |
| 1495 { |
| 1496 while(arr[lidx] < arr[pivot] && lidx <= pivot) |
| 1497 lidx++; |
| 1498 while(arr[ridx] > arr[pivot] && ridx >= pivot) |
| 1499 ridx--; |
| 1500 swap(&arr[lidx], &arr[ridx]); |
| 1501 swap(&idx[lidx], &idx[ridx]); |
| 1502 lidx++; |
| 1503 ridx--; |
| 1504 if(lidx-1 == pivot) |
| 1505 { |
| 1506 ridx++; |
| 1507 pivot = ridx; |
| 1508 } |
| 1509 else if(ridx+1 == pivot) |
| 1510 { |
| 1511 lidx--; |
| 1512 pivot = lidx; |
| 1513 } |
| 1514 } |
| 1515 quicksortsad(arr, idx, left, pivot - 1); |
| 1516 quicksortsad(arr, idx, pivot + 1, right); |
| 1517 } |
| 1483 } | 1518 } |
| 1484 | 1519 |
| 1485 //The improved MV prediction | 1520 //The improved MV prediction |
| 1486 void vp8_mv_pred | 1521 void vp8_mv_pred |
| 1487 ( | 1522 ( |
| 1488 VP8_COMP *cpi, | 1523 VP8_COMP *cpi, |
| 1489 MACROBLOCKD *xd, | 1524 MACROBLOCKD *xd, |
| 1490 const MODE_INFO *here, | 1525 const MODE_INFO *here, |
| 1491 int_mv *mvp, | 1526 MV *mvp, |
| 1492 int refframe, | 1527 int refframe, |
| 1493 int *ref_frame_sign_bias, | 1528 int *ref_frame_sign_bias, |
| 1494 int *sr, | 1529 int *sr, |
| 1495 int near_sadidx[] | 1530 int near_sadidx[] |
| 1496 ) | 1531 ) |
| 1497 { | 1532 { |
| 1498 const MODE_INFO *above = here - xd->mode_info_stride; | 1533 const MODE_INFO *above = here - xd->mode_info_stride; |
| 1499 const MODE_INFO *left = here - 1; | 1534 const MODE_INFO *left = here - 1; |
| 1500 const MODE_INFO *aboveleft = above - 1; | 1535 const MODE_INFO *aboveleft = above - 1; |
| 1501 int_mv near_mvs[8]; | 1536 int_mv near_mvs[8]; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1608 } | 1643 } |
| 1609 | 1644 |
| 1610 if(!find) | 1645 if(!find) |
| 1611 { | 1646 { |
| 1612 for(i=0; i<vcnt; i++) | 1647 for(i=0; i<vcnt; i++) |
| 1613 { | 1648 { |
| 1614 mvx[i] = near_mvs[i].as_mv.row; | 1649 mvx[i] = near_mvs[i].as_mv.row; |
| 1615 mvy[i] = near_mvs[i].as_mv.col; | 1650 mvy[i] = near_mvs[i].as_mv.col; |
| 1616 } | 1651 } |
| 1617 | 1652 |
| 1618 insertsortmv(mvx, vcnt); | 1653 quicksortmv (mvx, 0, vcnt-1); |
| 1619 insertsortmv(mvy, vcnt); | 1654 quicksortmv (mvy, 0, vcnt-1); |
| 1620 mv.as_mv.row = mvx[vcnt/2]; | 1655 mv.as_mv.row = mvx[vcnt/2]; |
| 1621 mv.as_mv.col = mvy[vcnt/2]; | 1656 mv.as_mv.col = mvy[vcnt/2]; |
| 1622 | 1657 |
| 1623 find = 1; | 1658 find = 1; |
| 1624 //sr is set to 0 to allow calling function to decide the search rang
e. | 1659 //sr is set to 0 to allow calling function to decide the search rang
e. |
| 1625 *sr = 0; | 1660 *sr = 0; |
| 1626 } | 1661 } |
| 1627 } | 1662 } |
| 1628 | 1663 |
| 1629 /* Set up return values */ | 1664 /* Set up return values */ |
| 1630 mvp->as_int = mv.as_int; | 1665 *mvp = mv.as_mv; |
| 1631 vp8_clamp_mv2(mvp, xd); | 1666 vp8_clamp_mv(mvp, xd); |
| 1632 } | 1667 } |
| 1633 | 1668 |
| 1634 void vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x, int recon_yoffse
t, int near_sadidx[]) | 1669 void vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x, int recon_yoffse
t, int near_sadidx[]) |
| 1635 { | 1670 { |
| 1636 | 1671 |
| 1637 int near_sad[8] = {0}; // 0-cf above, 1-cf left, 2-cf aboveleft, 3-lf curren
t, 4-lf above, 5-lf left, 6-lf right, 7-lf below | 1672 int near_sad[8] = {0}; // 0-cf above, 1-cf left, 2-cf aboveleft, 3-lf curren
t, 4-lf above, 5-lf left, 6-lf right, 7-lf below |
| 1638 BLOCK *b = &x->block[0]; | |
| 1639 unsigned char *src_y_ptr = *(b->base_src); | |
| 1640 | 1673 |
| 1641 //calculate sad for current frame 3 nearby MBs. | 1674 //calculate sad for current frame 3 nearby MBs. |
| 1642 if( xd->mb_to_top_edge==0 && xd->mb_to_left_edge ==0) | 1675 if( xd->mb_to_top_edge==0 && xd->mb_to_left_edge ==0) |
| 1643 { | 1676 { |
| 1644 near_sad[0] = near_sad[1] = near_sad[2] = INT_MAX; | 1677 near_sad[0] = near_sad[1] = near_sad[2] = INT_MAX; |
| 1645 }else if(xd->mb_to_top_edge==0) | 1678 }else if(xd->mb_to_top_edge==0) |
| 1646 { //only has left MB for sad calculation. | 1679 { //only has left MB for sad calculation. |
| 1647 near_sad[0] = near_sad[2] = INT_MAX; | 1680 near_sad[0] = near_sad[2] = INT_MAX; |
| 1648 near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd-
>dst.y_buffer - 16,xd->dst.y_stride, 0x7fffffff); | 1681 near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
ide, xd->dst.y_buffer - 16,xd->dst.y_stride, 0x7fffffff); |
| 1649 }else if(xd->mb_to_left_edge ==0) | 1682 }else if(xd->mb_to_left_edge ==0) |
| 1650 { //only has left MB for sad calculation. | 1683 { //only has left MB for sad calculation. |
| 1651 near_sad[1] = near_sad[2] = INT_MAX; | 1684 near_sad[1] = near_sad[2] = INT_MAX; |
| 1652 near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd-
>dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, 0x7fffffff); | 1685 near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
ide, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, 0x7fffffff); |
| 1653 }else | 1686 }else |
| 1654 { | 1687 { |
| 1655 near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd-
>dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, 0x7fffffff); | 1688 near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
ide, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, 0x7fffffff); |
| 1656 near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd-
>dst.y_buffer - 16,xd->dst.y_stride, 0x7fffffff); | 1689 near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
ide, xd->dst.y_buffer - 16,xd->dst.y_stride, 0x7fffffff); |
| 1657 near_sad[2] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd-
>dst.y_buffer - xd->dst.y_stride *16 -16,xd->dst.y_stride, 0x7fffffff); | 1690 near_sad[2] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
ide, xd->dst.y_buffer - xd->dst.y_stride *16 -16,xd->dst.y_stride, 0x7fffffff); |
| 1658 } | 1691 } |
| 1659 | 1692 |
| 1660 if(cpi->common.last_frame_type != KEY_FRAME) | 1693 if(cpi->common.last_frame_type != KEY_FRAME) |
| 1661 { | 1694 { |
| 1662 //calculate sad for last frame 5 nearby MBs. | 1695 //calculate sad for last frame 5 nearby MBs. |
| 1663 unsigned char *pre_y_buffer = cpi->common.yv12_fb[cpi->common.lst_fb_idx
].y_buffer + recon_yoffset; | 1696 unsigned char *pre_y_buffer = cpi->common.yv12_fb[cpi->common.lst_fb_idx
].y_buffer + recon_yoffset; |
| 1664 int pre_y_stride = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_stride; | 1697 int pre_y_stride = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_stride; |
| 1665 | 1698 |
| 1666 if(xd->mb_to_top_edge==0) near_sad[4] = INT_MAX; | 1699 if(xd->mb_to_top_edge==0) near_sad[4] = INT_MAX; |
| 1667 if(xd->mb_to_left_edge ==0) near_sad[5] = INT_MAX; | 1700 if(xd->mb_to_left_edge ==0) near_sad[5] = INT_MAX; |
| 1668 if(xd->mb_to_right_edge ==0) near_sad[6] = INT_MAX; | 1701 if(xd->mb_to_right_edge ==0) near_sad[6] = INT_MAX; |
| 1669 if(xd->mb_to_bottom_edge==0) near_sad[7] = INT_MAX; | 1702 if(xd->mb_to_bottom_edge==0) near_sad[7] = INT_MAX; |
| 1670 | 1703 |
| 1671 if(near_sad[4] != INT_MAX) | 1704 if(near_sad[4] != INT_MAX) |
| 1672 near_sad[4] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride,
pre_y_buffer - pre_y_stride *16, pre_y_stride, 0x7fffffff); | 1705 near_sad[4] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y
_stride, pre_y_buffer - pre_y_stride *16, pre_y_stride, 0x7fffffff); |
| 1673 if(near_sad[5] != INT_MAX) | 1706 if(near_sad[5] != INT_MAX) |
| 1674 near_sad[5] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride,
pre_y_buffer - 16, pre_y_stride, 0x7fffffff); | 1707 near_sad[5] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y
_stride, pre_y_buffer - 16, pre_y_stride, 0x7fffffff); |
| 1675 near_sad[3] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre
_y_buffer, pre_y_stride, 0x7fffffff); | 1708 near_sad[3] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
ide, pre_y_buffer, pre_y_stride, 0x7fffffff); |
| 1676 if(near_sad[6] != INT_MAX) | 1709 if(near_sad[6] != INT_MAX) |
| 1677 near_sad[6] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride,
pre_y_buffer + 16, pre_y_stride, 0x7fffffff); | 1710 near_sad[6] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y
_stride, pre_y_buffer + 16, pre_y_stride, 0x7fffffff); |
| 1678 if(near_sad[7] != INT_MAX) | 1711 if(near_sad[7] != INT_MAX) |
| 1679 near_sad[7] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride,
pre_y_buffer + pre_y_stride *16, pre_y_stride, 0x7fffffff); | 1712 near_sad[7] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y
_stride, pre_y_buffer + pre_y_stride *16, pre_y_stride, 0x7fffffff); |
| 1680 } | 1713 } |
| 1681 | 1714 |
| 1682 if(cpi->common.last_frame_type != KEY_FRAME) | 1715 if(cpi->common.last_frame_type != KEY_FRAME) |
| 1683 { | 1716 { |
| 1684 insertsortsad(near_sad, near_sadidx, 8); | 1717 quicksortsad(near_sad, near_sadidx, 0, 7); |
| 1685 }else | 1718 }else |
| 1686 { | 1719 { |
| 1687 insertsortsad(near_sad, near_sadidx, 3); | 1720 quicksortsad(near_sad, near_sadidx, 0, 2); |
| 1688 } | 1721 } |
| 1689 } | 1722 } |
| 1690 | 1723 |
| 1691 static void rd_update_mvcount(VP8_COMP *cpi, MACROBLOCK *x, int_mv *best_ref_mv) | 1724 #if !(CONFIG_REALTIME_ONLY) |
| 1692 { | 1725 int vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int
recon_uvoffset, int *returnrate, int *returndistortion, int *returnintra) |
| 1693 if (x->e_mbd.mode_info_context->mbmi.mode == SPLITMV) | |
| 1694 { | |
| 1695 int i; | |
| 1696 | |
| 1697 for (i = 0; i < x->partition_info->count; i++) | |
| 1698 { | |
| 1699 if (x->partition_info->bmi[i].mode == NEW4X4) | |
| 1700 { | |
| 1701 cpi->MVcount[0][mv_max+((x->partition_info->bmi[i].mv.as_mv.row | |
| 1702 - best_ref_mv->as_mv.row) >> 1)]++; | |
| 1703 cpi->MVcount[1][mv_max+((x->partition_info->bmi[i].mv.as_mv.col | |
| 1704 - best_ref_mv->as_mv.col) >> 1)]++; | |
| 1705 } | |
| 1706 } | |
| 1707 } | |
| 1708 else if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV) | |
| 1709 { | |
| 1710 cpi->MVcount[0][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.row | |
| 1711 - best_ref_mv->as_mv.row) >> 1)]++; | |
| 1712 cpi->MVcount[1][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.col | |
| 1713 - best_ref_mv->as_mv.col) >> 1)]++; | |
| 1714 } | |
| 1715 } | |
| 1716 | |
| 1717 void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int
recon_uvoffset, int *returnrate, int *returndistortion, int *returnintra) | |
| 1718 { | 1726 { |
| 1719 BLOCK *b = &x->block[0]; | 1727 BLOCK *b = &x->block[0]; |
| 1720 BLOCKD *d = &x->e_mbd.block[0]; | 1728 BLOCKD *d = &x->e_mbd.block[0]; |
| 1721 MACROBLOCKD *xd = &x->e_mbd; | 1729 MACROBLOCKD *xd = &x->e_mbd; |
| 1722 union b_mode_info best_bmodes[16]; | 1730 B_MODE_INFO best_bmodes[16]; |
| 1723 MB_MODE_INFO best_mbmode; | 1731 MB_MODE_INFO best_mbmode; |
| 1724 PARTITION_INFO best_partition; | 1732 PARTITION_INFO best_partition; |
| 1725 int_mv best_ref_mv; | 1733 MV best_ref_mv; |
| 1726 int_mv mode_mv[MB_MODE_COUNT]; | 1734 MV mode_mv[MB_MODE_COUNT]; |
| 1727 MB_PREDICTION_MODE this_mode; | 1735 MB_PREDICTION_MODE this_mode; |
| 1728 int num00; | 1736 int num00; |
| 1729 int best_mode_index = 0; | 1737 int best_mode_index = 0; |
| 1730 | 1738 |
| 1731 int i; | 1739 int i; |
| 1732 int mode_index; | 1740 int mode_index; |
| 1733 int mdcounts[4]; | 1741 int mdcounts[4]; |
| 1734 int rate; | 1742 int rate; |
| 1735 int distortion; | 1743 int distortion; |
| 1736 int best_rd = INT_MAX; | 1744 int best_rd = INT_MAX; // 1 << 30; |
| 1737 int best_intra_rd = INT_MAX; | 1745 int ref_frame_cost[MAX_REF_FRAMES]; |
| 1738 int rate2, distortion2; | 1746 int rate2, distortion2; |
| 1739 int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly; | 1747 int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly; |
| 1740 int rate_y, UNINITIALIZED_IS_SAFE(rate_uv); | 1748 int rate_y, UNINITIALIZED_IS_SAFE(rate_uv); |
| 1741 int distortion_uv; | 1749 int distortion_uv; |
| 1742 int best_yrd = INT_MAX; | 1750 int best_yrd = INT_MAX; |
| 1743 | 1751 |
| 1744 //int all_rds[MAX_MODES]; // Experimental debug code. | 1752 //int all_rds[MAX_MODES]; // Experimental debug code. |
| 1745 //int all_rates[MAX_MODES]; | 1753 //int all_rates[MAX_MODES]; |
| 1746 //int all_dist[MAX_MODES]; | 1754 //int all_dist[MAX_MODES]; |
| 1747 //int intermodecost[MAX_MODES]; | 1755 //int intermodecost[MAX_MODES]; |
| 1748 | 1756 |
| 1749 MB_PREDICTION_MODE uv_intra_mode; | 1757 MB_PREDICTION_MODE uv_intra_mode; |
| 1750 int_mv mvp; | 1758 |
| 1759 int force_no_skip = 0; |
| 1760 |
| 1761 MV mvp; |
| 1751 int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7}; | 1762 int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7}; |
| 1752 int saddone=0; | 1763 int saddone=0; |
| 1753 int sr=0; //search range got from mv_pred(). It uses step_param levels. (
0-7) | 1764 int sr=0; //search range got from mv_pred(). It uses step_param levels. (
0-7) |
| 1754 | 1765 |
| 1755 int_mv frame_nearest_mv[4]; | 1766 MV frame_nearest_mv[4]; |
| 1756 int_mv frame_near_mv[4]; | 1767 MV frame_near_mv[4]; |
| 1757 int_mv frame_best_ref_mv[4]; | 1768 MV frame_best_ref_mv[4]; |
| 1758 int frame_mdcounts[4][4]; | 1769 int frame_mdcounts[4][4]; |
| 1759 int frame_lf_or_gf[4]; | 1770 int frame_lf_or_gf[4]; |
| 1760 unsigned char *y_buffer[4]; | 1771 unsigned char *y_buffer[4]; |
| 1761 unsigned char *u_buffer[4]; | 1772 unsigned char *u_buffer[4]; |
| 1762 unsigned char *v_buffer[4]; | 1773 unsigned char *v_buffer[4]; |
| 1763 | 1774 |
| 1764 vpx_memset(&best_mbmode, 0, sizeof(best_mbmode)); | 1775 vpx_memset(&best_mbmode, 0, sizeof(best_mbmode)); |
| 1765 vpx_memset(&best_bmodes, 0, sizeof(best_bmodes)); | |
| 1766 | 1776 |
| 1767 if (cpi->ref_frame_flags & VP8_LAST_FLAG) | 1777 if (cpi->ref_frame_flags & VP8_LAST_FLAG) |
| 1768 { | 1778 { |
| 1769 YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_i
dx]; | 1779 YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_i
dx]; |
| 1770 | 1780 |
| 1771 vp8_find_near_mvs(&x->e_mbd, x->e_mbd.mode_info_context, &frame_nearest_
mv[LAST_FRAME], &frame_near_mv[LAST_FRAME], | 1781 vp8_find_near_mvs(&x->e_mbd, x->e_mbd.mode_info_context, &frame_nearest_
mv[LAST_FRAME], &frame_near_mv[LAST_FRAME], |
| 1772 &frame_best_ref_mv[LAST_FRAME], frame_mdcounts[LAST_FR
AME], LAST_FRAME, cpi->common.ref_frame_sign_bias); | 1782 &frame_best_ref_mv[LAST_FRAME], frame_mdcounts[LAST_FR
AME], LAST_FRAME, cpi->common.ref_frame_sign_bias); |
| 1773 | 1783 |
| 1774 y_buffer[LAST_FRAME] = lst_yv12->y_buffer + recon_yoffset; | 1784 y_buffer[LAST_FRAME] = lst_yv12->y_buffer + recon_yoffset; |
| 1775 u_buffer[LAST_FRAME] = lst_yv12->u_buffer + recon_uvoffset; | 1785 u_buffer[LAST_FRAME] = lst_yv12->u_buffer + recon_uvoffset; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1804 v_buffer[ALTREF_FRAME] = alt_yv12->v_buffer + recon_uvoffset; | 1814 v_buffer[ALTREF_FRAME] = alt_yv12->v_buffer + recon_uvoffset; |
| 1805 | 1815 |
| 1806 frame_lf_or_gf[ALTREF_FRAME] = 1; | 1816 frame_lf_or_gf[ALTREF_FRAME] = 1; |
| 1807 } | 1817 } |
| 1808 | 1818 |
| 1809 *returnintra = INT_MAX; | 1819 *returnintra = INT_MAX; |
| 1810 cpi->mbs_tested_so_far++; // Count of the number of MBs tested so f
ar this frame | 1820 cpi->mbs_tested_so_far++; // Count of the number of MBs tested so f
ar this frame |
| 1811 | 1821 |
| 1812 x->skip = 0; | 1822 x->skip = 0; |
| 1813 | 1823 |
| 1824 ref_frame_cost[INTRA_FRAME] = vp8_cost_zero(cpi->prob_intra_coded); |
| 1825 |
| 1826 // Special case treatment when GF and ARF are not sensible options for refer
ence |
| 1827 if (cpi->ref_frame_flags == VP8_LAST_FLAG) |
| 1828 { |
| 1829 ref_frame_cost[LAST_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 1830 + vp8_cost_zero(255); |
| 1831 ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 1832 + vp8_cost_one(255) |
| 1833 + vp8_cost_zero(128); |
| 1834 ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 1835 + vp8_cost_one(255) |
| 1836 + vp8_cost_one(128); |
| 1837 } |
| 1838 else |
| 1839 { |
| 1840 ref_frame_cost[LAST_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 1841 + vp8_cost_zero(cpi->prob_last_coded); |
| 1842 ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 1843 + vp8_cost_one(cpi->prob_last_coded) |
| 1844 + vp8_cost_zero(cpi->prob_gf_coded); |
| 1845 ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(cpi->prob_intra_coded) |
| 1846 + vp8_cost_one(cpi->prob_last_coded) |
| 1847 + vp8_cost_one(cpi->prob_gf_coded); |
| 1848 } |
| 1849 |
| 1814 vpx_memset(mode_mv, 0, sizeof(mode_mv)); | 1850 vpx_memset(mode_mv, 0, sizeof(mode_mv)); |
| 1815 | 1851 |
| 1816 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; | 1852 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; |
| 1817 rd_pick_intra_mbuv_mode(cpi, x, &uv_intra_rate, &uv_intra_rate_tokenonly, &u
v_intra_distortion); | 1853 vp8_rd_pick_intra_mbuv_mode(cpi, x, &uv_intra_rate, &uv_intra_rate_tokenonly
, &uv_intra_distortion); |
| 1818 uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; | 1854 uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; |
| 1819 | 1855 |
| 1820 for (mode_index = 0; mode_index < MAX_MODES; mode_index++) | 1856 for (mode_index = 0; mode_index < MAX_MODES; mode_index++) |
| 1821 { | 1857 { |
| 1822 int this_rd = INT_MAX; | 1858 int this_rd = INT_MAX; |
| 1823 int lf_or_gf = 0; // Lat Frame (01) or gf/arf (1) | 1859 int lf_or_gf = 0; // Lat Frame (01) or gf/arf (1) |
| 1824 int disable_skip = 0; | 1860 int disable_skip = 0; |
| 1825 int other_cost = 0; | 1861 int other_cost = 0; |
| 1826 | 1862 |
| 1863 force_no_skip = 0; |
| 1864 |
| 1827 // Experimental debug code. | 1865 // Experimental debug code. |
| 1828 // Record of rd values recorded for this MB. -1 indicates not measured | 1866 // Record of rd values recorded for this MB. -1 indicates not measured |
| 1829 //all_rds[mode_index] = -1; | 1867 //all_rds[mode_index] = -1; |
| 1830 //all_rates[mode_index] = -1; | 1868 //all_rates[mode_index] = -1; |
| 1831 //all_dist[mode_index] = -1; | 1869 //all_dist[mode_index] = -1; |
| 1832 //intermodecost[mode_index] = -1; | 1870 //intermodecost[mode_index] = -1; |
| 1833 | 1871 |
| 1834 // Test best rd so far against threshold for trying this mode. | 1872 // Test best rd so far against threshold for trying this mode. |
| 1835 if (best_rd <= cpi->rd_threshes[mode_index]) | 1873 if (best_rd <= cpi->rd_threshes[mode_index]) |
| 1836 continue; | 1874 continue; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1860 x->e_mbd.pre.y_buffer = y_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; | 1898 x->e_mbd.pre.y_buffer = y_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; |
| 1861 x->e_mbd.pre.u_buffer = u_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; | 1899 x->e_mbd.pre.u_buffer = u_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; |
| 1862 x->e_mbd.pre.v_buffer = v_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; | 1900 x->e_mbd.pre.v_buffer = v_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; |
| 1863 mode_mv[NEARESTMV] = frame_nearest_mv[x->e_mbd.mode_info_context->mb
mi.ref_frame]; | 1901 mode_mv[NEARESTMV] = frame_nearest_mv[x->e_mbd.mode_info_context->mb
mi.ref_frame]; |
| 1864 mode_mv[NEARMV] = frame_near_mv[x->e_mbd.mode_info_context->mbmi.ref
_frame]; | 1902 mode_mv[NEARMV] = frame_near_mv[x->e_mbd.mode_info_context->mbmi.ref
_frame]; |
| 1865 best_ref_mv = frame_best_ref_mv[x->e_mbd.mode_info_context->mbmi.ref
_frame]; | 1903 best_ref_mv = frame_best_ref_mv[x->e_mbd.mode_info_context->mbmi.ref
_frame]; |
| 1866 vpx_memcpy(mdcounts, frame_mdcounts[x->e_mbd.mode_info_context->mbmi
.ref_frame], sizeof(mdcounts)); | 1904 vpx_memcpy(mdcounts, frame_mdcounts[x->e_mbd.mode_info_context->mbmi
.ref_frame], sizeof(mdcounts)); |
| 1867 lf_or_gf = frame_lf_or_gf[x->e_mbd.mode_info_context->mbmi.ref_frame
]; | 1905 lf_or_gf = frame_lf_or_gf[x->e_mbd.mode_info_context->mbmi.ref_frame
]; |
| 1868 } | 1906 } |
| 1869 | 1907 |
| 1908 if(x->e_mbd.mode_info_context->mbmi.mode == NEWMV) |
| 1909 { |
| 1910 if(!saddone) |
| 1911 { |
| 1912 vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] ); |
| 1913 saddone = 1; |
| 1914 } |
| 1915 |
| 1916 vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp, |
| 1917 x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.
ref_frame_sign_bias, &sr, &near_sadidx[0]); |
| 1918 |
| 1919 /* adjust mvp to make sure it is within MV range */ |
| 1920 if(mvp.row > best_ref_mv.row + MAX_FULL_PEL_VAL) |
| 1921 mvp.row = best_ref_mv.row + MAX_FULL_PEL_VAL; |
| 1922 else if(mvp.row < best_ref_mv.row - MAX_FULL_PEL_VAL) |
| 1923 mvp.row = best_ref_mv.row - MAX_FULL_PEL_VAL; |
| 1924 if(mvp.col > best_ref_mv.col + MAX_FULL_PEL_VAL) |
| 1925 mvp.col = best_ref_mv.col + MAX_FULL_PEL_VAL; |
| 1926 else if(mvp.col < best_ref_mv.col - MAX_FULL_PEL_VAL) |
| 1927 mvp.col = best_ref_mv.col - MAX_FULL_PEL_VAL; |
| 1928 } |
| 1929 |
| 1870 // Check to see if the testing frequency for this mode is at its max | 1930 // Check to see if the testing frequency for this mode is at its max |
| 1871 // If so then prevent it from being tested and increase the threshold fo
r its testing | 1931 // If so then prevent it from being tested and increase the threshold fo
r its testing |
| 1872 if (cpi->mode_test_hit_counts[mode_index] && (cpi->mode_check_freq[mode_
index] > 1)) | 1932 if (cpi->mode_test_hit_counts[mode_index] && (cpi->mode_check_freq[mode_
index] > 1)) |
| 1873 { | 1933 { |
| 1874 if (cpi->mbs_tested_so_far <= cpi->mode_check_freq[mode_index] * cp
i->mode_test_hit_counts[mode_index]) | 1934 if (cpi->mbs_tested_so_far <= cpi->mode_check_freq[mode_index] * cp
i->mode_test_hit_counts[mode_index]) |
| 1875 { | 1935 { |
| 1876 // Increase the threshold for coding this mode to make it less l
ikely to be chosen | 1936 // Increase the threshold for coding this mode to make it less l
ikely to be chosen |
| 1877 cpi->rd_thresh_mult[mode_index] += 4; | 1937 cpi->rd_thresh_mult[mode_index] += 4; |
| 1878 | 1938 |
| 1879 if (cpi->rd_thresh_mult[mode_index] > MAX_THRESHMULT) | 1939 if (cpi->rd_thresh_mult[mode_index] > MAX_THRESHMULT) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1911 vp8_update_zbin_extra(cpi, x); | 1971 vp8_update_zbin_extra(cpi, x); |
| 1912 } | 1972 } |
| 1913 | 1973 |
| 1914 switch (this_mode) | 1974 switch (this_mode) |
| 1915 { | 1975 { |
| 1916 case B_PRED: | 1976 case B_PRED: |
| 1917 { | 1977 { |
| 1918 int tmp_rd; | 1978 int tmp_rd; |
| 1919 | 1979 |
| 1920 // Note the rate value returned here includes the cost of coding the
BPRED mode : x->mbmode_cost[x->e_mbd.frame_type][BPRED]; | 1980 // Note the rate value returned here includes the cost of coding the
BPRED mode : x->mbmode_cost[x->e_mbd.frame_type][BPRED]; |
| 1921 tmp_rd = rd_pick_intra4x4mby_modes(cpi, x, &rate, &rate_y, &distorti
on, best_yrd); | 1981 tmp_rd = vp8_rd_pick_intra4x4mby_modes(cpi, x, &rate, &rate_y, &dist
ortion, best_yrd); |
| 1922 rate2 += rate; | 1982 rate2 += rate; |
| 1923 distortion2 += distortion; | 1983 distortion2 += distortion; |
| 1924 | 1984 |
| 1925 if(tmp_rd < best_yrd) | 1985 if(tmp_rd < best_yrd) |
| 1926 { | 1986 { |
| 1927 rate2 += uv_intra_rate; | 1987 rate2 += uv_intra_rate; |
| 1928 rate_uv = uv_intra_rate_tokenonly; | 1988 rate_uv = uv_intra_rate_tokenonly; |
| 1929 distortion2 += uv_intra_distortion; | 1989 distortion2 += uv_intra_distortion; |
| 1930 distortion_uv = uv_intra_distortion; | 1990 distortion_uv = uv_intra_distortion; |
| 1931 } | 1991 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1978 rate2 += rate_y; | 2038 rate2 += rate_y; |
| 1979 distortion2 += distortion; | 2039 distortion2 += distortion; |
| 1980 rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_cont
ext->mbmi.mode]; | 2040 rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_cont
ext->mbmi.mode]; |
| 1981 rate2 += uv_intra_rate; | 2041 rate2 += uv_intra_rate; |
| 1982 rate_uv = uv_intra_rate_tokenonly; | 2042 rate_uv = uv_intra_rate_tokenonly; |
| 1983 distortion2 += uv_intra_distortion; | 2043 distortion2 += uv_intra_distortion; |
| 1984 distortion_uv = uv_intra_distortion; | 2044 distortion_uv = uv_intra_distortion; |
| 1985 break; | 2045 break; |
| 1986 | 2046 |
| 1987 case NEWMV: | 2047 case NEWMV: |
| 1988 { | 2048 |
| 1989 int thissme; | 2049 // Decrement full search counter |
| 1990 int bestsme = INT_MAX; | 2050 if (cpi->check_freq[lf_or_gf] > 0) |
| 1991 int step_param = cpi->sf.first_step; | 2051 cpi->check_freq[lf_or_gf] --; |
| 1992 int further_steps; | 2052 |
| 1993 int n; | |
| 1994 int do_refine=1; /* If last step (1-away) of n-step search doesn't
pick the center point as the best match, | |
| 1995 we will do a final 1-away diamond refining sea
rch */ | |
| 1996 | |
| 1997 int sadpb = x->sadperbit16; | |
| 1998 int_mv mvp_full; | |
| 1999 | |
| 2000 int col_min = (best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best
_ref_mv.as_mv.col & 7)?1:0); | |
| 2001 int row_min = (best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best
_ref_mv.as_mv.row & 7)?1:0); | |
| 2002 int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL; | |
| 2003 int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL; | |
| 2004 | |
| 2005 int tmp_col_min = x->mv_col_min; | |
| 2006 int tmp_col_max = x->mv_col_max; | |
| 2007 int tmp_row_min = x->mv_row_min; | |
| 2008 int tmp_row_max = x->mv_row_max; | |
| 2009 | |
| 2010 if(!saddone) | |
| 2011 { | 2053 { |
| 2012 vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] ); | 2054 int thissme; |
| 2013 saddone = 1; | 2055 int bestsme = INT_MAX; |
| 2056 int step_param = cpi->sf.first_step; |
| 2057 int search_range; |
| 2058 int further_steps; |
| 2059 int n; |
| 2060 |
| 2061 int col_min = (best_ref_mv.col - MAX_FULL_PEL_VAL) >>3; |
| 2062 int col_max = (best_ref_mv.col + MAX_FULL_PEL_VAL) >>3; |
| 2063 int row_min = (best_ref_mv.row - MAX_FULL_PEL_VAL) >>3; |
| 2064 int row_max = (best_ref_mv.row + MAX_FULL_PEL_VAL) >>3; |
| 2065 |
| 2066 int tmp_col_min = x->mv_col_min; |
| 2067 int tmp_col_max = x->mv_col_max; |
| 2068 int tmp_row_min = x->mv_row_min; |
| 2069 int tmp_row_max = x->mv_row_max; |
| 2070 |
| 2071 // Get intersection of UMV window and valid MV window to reduce
# of checks in diamond search. |
| 2072 if (x->mv_col_min < col_min ) |
| 2073 x->mv_col_min = col_min; |
| 2074 if (x->mv_col_max > col_max ) |
| 2075 x->mv_col_max = col_max; |
| 2076 if (x->mv_row_min < row_min ) |
| 2077 x->mv_row_min = row_min; |
| 2078 if (x->mv_row_max > row_max ) |
| 2079 x->mv_row_max = row_max; |
| 2080 |
| 2081 //adjust search range according to sr from mv prediction |
| 2082 if(sr > step_param) |
| 2083 step_param = sr; |
| 2084 |
| 2085 // Work out how long a search we should do |
| 2086 search_range = MAXF(abs(best_ref_mv.col), abs(best_ref_mv.row))
>> 3; |
| 2087 |
| 2088 if (search_range >= x->vector_range) |
| 2089 x->vector_range = search_range; |
| 2090 else if (x->vector_range > cpi->sf.min_fs_radius) |
| 2091 x->vector_range--; |
| 2092 |
| 2093 // Initial step/diamond search |
| 2094 { |
| 2095 int sadpb = x->sadperbit16; |
| 2096 |
| 2097 if (cpi->sf.search_method == HEX) |
| 2098 { |
| 2099 bestsme = vp8_hex_search(x, b, d, &best_ref_mv, &d->bmi.
mv.as_mv, step_param, sadpb/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_16X16]
, x->mvsadcost, x->mvcost, &best_ref_mv); |
| 2100 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; |
| 2101 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; |
| 2102 } |
| 2103 else |
| 2104 { |
| 2105 bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi
.mv.as_mv, step_param, sadpb / 2/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_1
6X16], x->mvsadcost, x->mvcost, &best_ref_mv); //sadpb < 9 |
| 2106 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; |
| 2107 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; |
| 2108 |
| 2109 // Further step/diamond searches as necessary |
| 2110 n = 0; |
| 2111 further_steps = (cpi->sf.max_step_search_steps - 1) - st
ep_param; |
| 2112 |
| 2113 n = num00; |
| 2114 num00 = 0; |
| 2115 |
| 2116 while (n < further_steps) |
| 2117 { |
| 2118 n++; |
| 2119 |
| 2120 if (num00) |
| 2121 num00--; |
| 2122 else |
| 2123 { |
| 2124 thissme = cpi->diamond_search_sad(x, b, d, &mvp,
&d->bmi.mv.as_mv, step_param + n, sadpb / 4/*x->errorperbit*/, &num00, &cpi->fn
_ptr[BLOCK_16X16], x->mvsadcost, x->mvcost, &best_ref_mv); //sadpb = 9 |
| 2125 |
| 2126 if (thissme < bestsme) |
| 2127 { |
| 2128 bestsme = thissme; |
| 2129 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; |
| 2130 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; |
| 2131 } |
| 2132 else |
| 2133 { |
| 2134 d->bmi.mv.as_mv.row = mode_mv[NEWMV].row; |
| 2135 d->bmi.mv.as_mv.col = mode_mv[NEWMV].col; |
| 2136 } |
| 2137 } |
| 2138 } |
| 2139 } |
| 2140 |
| 2141 } |
| 2142 |
| 2143 // Should we do a full search |
| 2144 if (!cpi->check_freq[lf_or_gf] || cpi->do_full[lf_or_gf]) |
| 2145 { |
| 2146 int thissme; |
| 2147 int full_flag_thresh = 0; |
| 2148 MV full_mvp; |
| 2149 |
| 2150 full_mvp.row = d->bmi.mv.as_mv.row <<3; // use diamond se
arch result as full search staring point |
| 2151 full_mvp.col = d->bmi.mv.as_mv.col <<3; |
| 2152 |
| 2153 // Update x->vector_range based on best vector found in step
search |
| 2154 search_range = MAXF(abs((mvp.row>>3) - d->bmi.mv.as_mv.row),
abs((mvp.col>>3) - d->bmi.mv.as_mv.col)); |
| 2155 //search_range *= 1.4; //didn't improve PSNR |
| 2156 |
| 2157 if (search_range > x->vector_range) |
| 2158 x->vector_range = search_range; |
| 2159 else |
| 2160 search_range = x->vector_range; |
| 2161 |
| 2162 // Apply limits |
| 2163 search_range = (search_range > cpi->sf.max_fs_radius) ? cpi-
>sf.max_fs_radius : search_range; |
| 2164 |
| 2165 //add this to reduce full search range. |
| 2166 if(sr<=3 && search_range > 8) search_range = 8; |
| 2167 |
| 2168 { |
| 2169 int sadpb = x->sadperbit16 >> 2; |
| 2170 thissme = cpi->full_search_sad(x, b, d, &full_mvp, sadpb
, search_range, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, x->mvsadcost,&best_ref_mv)
; |
| 2171 } |
| 2172 |
| 2173 // Barrier threshold to initiating full search |
| 2174 // full_flag_thresh = 10 + (thissme >> 7); |
| 2175 if ((thissme + full_flag_thresh) < bestsme) |
| 2176 { |
| 2177 cpi->do_full[lf_or_gf] ++; |
| 2178 bestsme = thissme; |
| 2179 } |
| 2180 else if (thissme < bestsme) |
| 2181 bestsme = thissme; |
| 2182 else |
| 2183 { |
| 2184 cpi->do_full[lf_or_gf] = cpi->do_full[lf_or_gf] >> 1; |
| 2185 cpi->check_freq[lf_or_gf] = cpi->sf.full_freq[lf_or_gf]; |
| 2186 |
| 2187 // The full search result is actually worse so re-instat
e the previous best vector |
| 2188 d->bmi.mv.as_mv.row = mode_mv[NEWMV].row; |
| 2189 d->bmi.mv.as_mv.col = mode_mv[NEWMV].col; |
| 2190 } |
| 2191 } |
| 2192 |
| 2193 x->mv_col_min = tmp_col_min; |
| 2194 x->mv_col_max = tmp_col_max; |
| 2195 x->mv_row_min = tmp_row_min; |
| 2196 x->mv_row_max = tmp_row_max; |
| 2197 |
| 2198 if (bestsme < INT_MAX) |
| 2199 // cpi->find_fractional_mv_step(x,b,d,&d->bmi.mv.as_mv,&best
_ref_mv,x->errorperbit/2,cpi->fn_ptr.svf,cpi->fn_ptr.vf,x->mvcost); // normal m
vc=11 |
| 2200 cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv.as_mv, &bes
t_ref_mv, x->errorperbit / 4, &cpi->fn_ptr[BLOCK_16X16], x->mvcost); |
| 2201 |
| 2202 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; |
| 2203 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; |
| 2204 |
| 2205 // Add the new motion vector cost to our rolling cost variable |
| 2206 rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, x->mvcos
t, 96); |
| 2207 |
| 2014 } | 2208 } |
| 2015 | 2209 |
| 2016 vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp, | |
| 2017 x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.
ref_frame_sign_bias, &sr, &near_sadidx[0]); | |
| 2018 | |
| 2019 mvp_full.as_mv.col = mvp.as_mv.col>>3; | |
| 2020 mvp_full.as_mv.row = mvp.as_mv.row>>3; | |
| 2021 | |
| 2022 // Get intersection of UMV window and valid MV window to reduce # of
checks in diamond search. | |
| 2023 if (x->mv_col_min < col_min ) | |
| 2024 x->mv_col_min = col_min; | |
| 2025 if (x->mv_col_max > col_max ) | |
| 2026 x->mv_col_max = col_max; | |
| 2027 if (x->mv_row_min < row_min ) | |
| 2028 x->mv_row_min = row_min; | |
| 2029 if (x->mv_row_max > row_max ) | |
| 2030 x->mv_row_max = row_max; | |
| 2031 | |
| 2032 //adjust search range according to sr from mv prediction | |
| 2033 if(sr > step_param) | |
| 2034 step_param = sr; | |
| 2035 | |
| 2036 // Initial step/diamond search | |
| 2037 { | |
| 2038 bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv
, | |
| 2039 step_param, sadpb, &num00, | |
| 2040 &cpi->fn_ptr[BLOCK_16X16], | |
| 2041 x->mvcost, &best_ref_mv); | |
| 2042 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; | |
| 2043 | |
| 2044 // Further step/diamond searches as necessary | |
| 2045 n = 0; | |
| 2046 further_steps = (cpi->sf.max_step_search_steps - 1) - step_param
; | |
| 2047 | |
| 2048 n = num00; | |
| 2049 num00 = 0; | |
| 2050 | |
| 2051 /* If there won't be more n-step search, check to see if refinin
g search is needed. */ | |
| 2052 if (n > further_steps) | |
| 2053 do_refine = 0; | |
| 2054 | |
| 2055 while (n < further_steps) | |
| 2056 { | |
| 2057 n++; | |
| 2058 | |
| 2059 if (num00) | |
| 2060 num00--; | |
| 2061 else | |
| 2062 { | |
| 2063 thissme = cpi->diamond_search_sad(x, b, d, &mvp_full, | |
| 2064 &d->bmi.mv, step_param + n, sadpb, &num00, | |
| 2065 &cpi->fn_ptr[BLOCK_16X16], x->mvcost, | |
| 2066 &best_ref_mv); | |
| 2067 | |
| 2068 /* check to see if refining search is needed. */ | |
| 2069 if (num00 > (further_steps-n)) | |
| 2070 do_refine = 0; | |
| 2071 | |
| 2072 if (thissme < bestsme) | |
| 2073 { | |
| 2074 bestsme = thissme; | |
| 2075 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; | |
| 2076 } | |
| 2077 else | |
| 2078 { | |
| 2079 d->bmi.mv.as_int = mode_mv[NEWMV].as_int; | |
| 2080 } | |
| 2081 } | |
| 2082 } | |
| 2083 } | |
| 2084 | |
| 2085 /* final 1-away diamond refining search */ | |
| 2086 if (do_refine == 1) | |
| 2087 { | |
| 2088 int search_range; | |
| 2089 | |
| 2090 //It seems not a good way to set search_range. Need further inve
stigation. | |
| 2091 //search_range = MAXF(abs((mvp.row>>3) - d->bmi.mv.as_mv.row), a
bs((mvp.col>>3) - d->bmi.mv.as_mv.col)); | |
| 2092 search_range = 8; | |
| 2093 | |
| 2094 //thissme = cpi->full_search_sad(x, b, d, &d->bmi.mv.as_mv, sadp
b, search_range, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv); | |
| 2095 thissme = cpi->refining_search_sad(x, b, d, &d->bmi.mv, sadpb, | |
| 2096 search_range, &cpi->fn_ptr[BLOCK_16X16], | |
| 2097 x->mvcost, &best_ref_mv); | |
| 2098 | |
| 2099 if (thissme < bestsme) | |
| 2100 { | |
| 2101 bestsme = thissme; | |
| 2102 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; | |
| 2103 } | |
| 2104 else | |
| 2105 { | |
| 2106 d->bmi.mv.as_int = mode_mv[NEWMV].as_int; | |
| 2107 } | |
| 2108 } | |
| 2109 | |
| 2110 x->mv_col_min = tmp_col_min; | |
| 2111 x->mv_col_max = tmp_col_max; | |
| 2112 x->mv_row_min = tmp_row_min; | |
| 2113 x->mv_row_max = tmp_row_max; | |
| 2114 | |
| 2115 if (bestsme < INT_MAX) | |
| 2116 { | |
| 2117 int dis; /* TODO: use dis in distortion calculation later. */ | |
| 2118 unsigned int sse; | |
| 2119 cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, &best_ref_mv, | |
| 2120 x->errorperbit, | |
| 2121 &cpi->fn_ptr[BLOCK_16X16], | |
| 2122 x->mvcost, &dis, &sse); | |
| 2123 } | |
| 2124 | |
| 2125 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; | |
| 2126 | |
| 2127 // Add the new motion vector cost to our rolling cost variable | |
| 2128 rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, x->mvcost, 9
6); | |
| 2129 } | |
| 2130 | |
| 2131 case NEARESTMV: | 2210 case NEARESTMV: |
| 2132 case NEARMV: | 2211 case NEARMV: |
| 2212 |
| 2133 // Clip "next_nearest" so that it does not extend to far out of imag
e | 2213 // Clip "next_nearest" so that it does not extend to far out of imag
e |
| 2134 vp8_clamp_mv2(&mode_mv[this_mode], xd); | 2214 if (mode_mv[this_mode].col < (xd->mb_to_left_edge - LEFT_TOP_MARGIN)
) |
| 2215 mode_mv[this_mode].col = xd->mb_to_left_edge - LEFT_TOP_MARGIN; |
| 2216 else if (mode_mv[this_mode].col > xd->mb_to_right_edge + RIGHT_BOTTO
M_MARGIN) |
| 2217 mode_mv[this_mode].col = xd->mb_to_right_edge + RIGHT_BOTTOM_MAR
GIN; |
| 2218 |
| 2219 if (mode_mv[this_mode].row < (xd->mb_to_top_edge - LEFT_TOP_MARGIN)) |
| 2220 mode_mv[this_mode].row = xd->mb_to_top_edge - LEFT_TOP_MARGIN; |
| 2221 else if (mode_mv[this_mode].row > xd->mb_to_bottom_edge + RIGHT_BOTT
OM_MARGIN) |
| 2222 mode_mv[this_mode].row = xd->mb_to_bottom_edge + RIGHT_BOTTOM_MA
RGIN; |
| 2135 | 2223 |
| 2136 // Do not bother proceeding if the vector (from newmv,nearest or nea
r) is 0,0 as this should then be coded using the zeromv mode. | 2224 // Do not bother proceeding if the vector (from newmv,nearest or nea
r) is 0,0 as this should then be coded using the zeromv mode. |
| 2137 if (((this_mode == NEARMV) || (this_mode == NEARESTMV)) && (mode_mv[
this_mode].as_int == 0)) | 2225 if (((this_mode == NEARMV) || (this_mode == NEARESTMV)) && |
| 2226 ((mode_mv[this_mode].row == 0) && (mode_mv[this_mode].col == 0))
) |
| 2138 continue; | 2227 continue; |
| 2139 | 2228 |
| 2140 case ZEROMV: | 2229 case ZEROMV: |
| 2141 | 2230 |
| 2231 mv_selected: |
| 2232 |
| 2142 // Trap vectors that reach beyond the UMV borders | 2233 // Trap vectors that reach beyond the UMV borders |
| 2143 // Note that ALL New MV, Nearest MV Near MV and Zero MV code drops t
hrough to this point | 2234 // Note that ALL New MV, Nearest MV Near MV and Zero MV code drops t
hrough to this point |
| 2144 // because of the lack of break statements in the previous two cases
. | 2235 // because of the lack of break statements in the previous two cases
. |
| 2145 if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || ((mode_
mv[this_mode].as_mv.row >> 3) > x->mv_row_max) || | 2236 if (((mode_mv[this_mode].row >> 3) < x->mv_row_min) || ((mode_mv[thi
s_mode].row >> 3) > x->mv_row_max) || |
| 2146 ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_
mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) | 2237 ((mode_mv[this_mode].col >> 3) < x->mv_col_min) || ((mode_mv[thi
s_mode].col >> 3) > x->mv_col_max)) |
| 2147 continue; | 2238 continue; |
| 2148 | 2239 |
| 2149 vp8_set_mbmode_and_mvs(x, this_mode, &mode_mv[this_mode]); | 2240 vp8_set_mbmode_and_mvs(x, this_mode, &mode_mv[this_mode]); |
| 2150 vp8_build_inter16x16_predictors_mby(&x->e_mbd); | 2241 vp8_build_inter_predictors_mby(&x->e_mbd); |
| 2151 | 2242 |
| 2152 if (cpi->active_map_enabled && x->active_ptr[0] == 0) { | 2243 if (cpi->active_map_enabled && x->active_ptr[0] == 0) { |
| 2153 x->skip = 1; | 2244 x->skip = 1; |
| 2154 } | 2245 } |
| 2155 else if (x->encode_breakout) | 2246 else if (x->encode_breakout) |
| 2156 { | 2247 { |
| 2157 unsigned int sse; | 2248 int sum, sse; |
| 2158 unsigned int var; | |
| 2159 int threshold = (xd->block[0].dequant[1] | 2249 int threshold = (xd->block[0].dequant[1] |
| 2160 * xd->block[0].dequant[1] >>4); | 2250 * xd->block[0].dequant[1] >>4); |
| 2161 | 2251 |
| 2162 if(threshold < x->encode_breakout) | 2252 if(threshold < x->encode_breakout) |
| 2163 threshold = x->encode_breakout; | 2253 threshold = x->encode_breakout; |
| 2164 | 2254 |
| 2165 var = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16) | 2255 VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16var) |
| 2166 (*(b->base_src), b->src_stride, | 2256 (x->src.y_buffer, x->src.y_stride, |
| 2167 x->e_mbd.predictor, 16, &sse); | 2257 x->e_mbd.predictor, 16, (unsigned int *)(&sse), &sum); |
| 2168 | 2258 |
| 2169 if (sse < threshold) | 2259 if (sse < threshold) |
| 2170 { | 2260 { |
| 2171 unsigned int q2dc = xd->block[24].dequant[0]; | 2261 // Check u and v to make sure skip is ok |
| 2262 int sse2 = 0; |
| 2172 /* If theres is no codeable 2nd order dc | 2263 /* If theres is no codeable 2nd order dc |
| 2173 or a very small uniform pixel change change */ | 2264 or a very small uniform pixel change change */ |
| 2174 if ((sse - var < q2dc * q2dc >>4) || | 2265 if (abs(sum) < (xd->block[24].dequant[0]<<2)|| |
| 2175 (sse /2 > var && sse-var < 64)) | 2266 ((sum * sum>>8) > sse && abs(sum) <128)) |
| 2176 { | 2267 { |
| 2177 // Check u and v to make sure skip is ok | 2268 sse2 = VP8_UVSSE(x, IF_RTCD(&cpi->rtcd.variance)); |
| 2178 int sse2= VP8_UVSSE(x, IF_RTCD(&cpi->rtcd.variance)); | 2269 |
| 2179 if (sse2 * 2 < threshold) | 2270 if (sse2 * 2 < threshold) |
| 2180 { | 2271 { |
| 2181 x->skip = 1; | 2272 x->skip = 1; |
| 2182 distortion2 = sse + sse2; | 2273 distortion2 = sse + sse2; |
| 2183 rate2 = 500; | 2274 rate2 = 500; |
| 2184 | 2275 |
| 2185 /* for best_yrd calculation */ | 2276 /* for best_yrd calculation */ |
| 2186 rate_uv = 0; | 2277 rate_uv = 0; |
| 2187 distortion_uv = sse2; | 2278 distortion_uv = sse2; |
| 2188 | 2279 |
| 2189 disable_skip = 1; | 2280 disable_skip = 1; |
| 2190 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distort
ion2); | 2281 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, |
| 2282 distortion2); |
| 2191 | 2283 |
| 2192 break; | 2284 break; |
| 2193 } | 2285 } |
| 2194 } | 2286 } |
| 2195 } | 2287 } |
| 2196 } | 2288 } |
| 2197 | 2289 |
| 2198 | 2290 |
| 2199 //intermodecost[mode_index] = vp8_cost_mv_ref(this_mode, mdcounts);
// Experimental debug code | 2291 //intermodecost[mode_index] = vp8_cost_mv_ref(this_mode, mdcounts);
// Experimental debug code |
| 2200 | 2292 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2218 | 2310 |
| 2219 // Where skip is allowable add in the default per mb cost for the no ski
p case. | 2311 // Where skip is allowable add in the default per mb cost for the no ski
p case. |
| 2220 // where we then decide to skip we have to delete this and replace it wi
th the | 2312 // where we then decide to skip we have to delete this and replace it wi
th the |
| 2221 // cost of signallying a skip | 2313 // cost of signallying a skip |
| 2222 if (cpi->common.mb_no_coeff_skip) | 2314 if (cpi->common.mb_no_coeff_skip) |
| 2223 { | 2315 { |
| 2224 other_cost += vp8_cost_bit(cpi->prob_skip_false, 0); | 2316 other_cost += vp8_cost_bit(cpi->prob_skip_false, 0); |
| 2225 rate2 += other_cost; | 2317 rate2 += other_cost; |
| 2226 } | 2318 } |
| 2227 | 2319 |
| 2228 /* Estimate the reference frame signaling cost and add it | 2320 // Estimate the reference frame signaling cost and add it to the rolling
cost variable. |
| 2229 * to the rolling cost variable. | 2321 rate2 += ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; |
| 2230 */ | |
| 2231 rate2 += | |
| 2232 x->e_mbd.ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; | |
| 2233 | 2322 |
| 2234 if (!disable_skip) | 2323 if (!disable_skip) |
| 2235 { | 2324 { |
| 2236 // Test for the condition where skip block will be activated because
there are no non zero coefficients and make any necessary adjustment for rate | 2325 // Test for the condition where skip block will be activated because
there are no non zero coefficients and make any necessary adjustment for rate |
| 2237 if (cpi->common.mb_no_coeff_skip) | 2326 if (cpi->common.mb_no_coeff_skip) |
| 2238 { | 2327 { |
| 2239 int tteob; | 2328 int tteob; |
| 2240 | 2329 |
| 2241 tteob = 0; | 2330 tteob = 0; |
| 2242 | 2331 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2265 } | 2354 } |
| 2266 // Calculate the final RD estimate for this mode | 2355 // Calculate the final RD estimate for this mode |
| 2267 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); | 2356 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); |
| 2268 } | 2357 } |
| 2269 | 2358 |
| 2270 // Experimental debug code. | 2359 // Experimental debug code. |
| 2271 //all_rds[mode_index] = this_rd; | 2360 //all_rds[mode_index] = this_rd; |
| 2272 //all_rates[mode_index] = rate2; | 2361 //all_rates[mode_index] = rate2; |
| 2273 //all_dist[mode_index] = distortion2; | 2362 //all_dist[mode_index] = distortion2; |
| 2274 | 2363 |
| 2275 // Keep record of best intra distortion | 2364 if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) && (thi
s_rd < *returnintra)) |
| 2276 if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) && | |
| 2277 (this_rd < best_intra_rd) ) | |
| 2278 { | 2365 { |
| 2279 best_intra_rd = this_rd; | 2366 *returnintra = this_rd ; |
| 2280 *returnintra = distortion2 ; | |
| 2281 } | 2367 } |
| 2282 | 2368 |
| 2283 // Did this mode help.. i.i is it the new best mode | 2369 // Did this mode help.. i.i is it the new best mode |
| 2284 if (this_rd < best_rd || x->skip) | 2370 if (this_rd < best_rd || x->skip) |
| 2285 { | 2371 { |
| 2286 // Note index of best mode so far | 2372 // Note index of best mode so far |
| 2287 best_mode_index = mode_index; | 2373 best_mode_index = mode_index; |
| 2374 x->e_mbd.mode_info_context->mbmi.force_no_skip = force_no_skip; |
| 2288 | 2375 |
| 2289 if (this_mode <= B_PRED) | 2376 if (this_mode <= B_PRED) |
| 2290 { | 2377 { |
| 2291 x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode; | 2378 x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode; |
| 2292 /* required for left and above block mv */ | |
| 2293 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; | |
| 2294 } | 2379 } |
| 2295 | 2380 |
| 2296 other_cost += | 2381 other_cost += ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_fr
ame]; |
| 2297 x->e_mbd.ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; | |
| 2298 | 2382 |
| 2299 /* Calculate the final y RD estimate for this mode */ | 2383 /* Calculate the final y RD estimate for this mode */ |
| 2300 best_yrd = RDCOST(x->rdmult, x->rddiv, (rate2-rate_uv-other_cost), | 2384 best_yrd = RDCOST(x->rdmult, x->rddiv, (rate2-rate_uv-other_cost), |
| 2301 (distortion2-distortion_uv)); | 2385 (distortion2-distortion_uv)); |
| 2302 | 2386 |
| 2303 *returnrate = rate2; | 2387 *returnrate = rate2; |
| 2304 *returndistortion = distortion2; | 2388 *returndistortion = distortion2; |
| 2305 best_rd = this_rd; | 2389 best_rd = this_rd; |
| 2306 vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, sizeof(M
B_MODE_INFO)); | 2390 vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, sizeof(M
B_MODE_INFO)); |
| 2307 vpx_memcpy(&best_partition, x->partition_info, sizeof(PARTITION_INFO
)); | 2391 vpx_memcpy(&best_partition, x->partition_info, sizeof(PARTITION_INFO
)); |
| 2308 | 2392 |
| 2309 if ((this_mode == B_PRED) || (this_mode == SPLITMV)) | 2393 for (i = 0; i < 16; i++) |
| 2310 for (i = 0; i < 16; i++) | 2394 { |
| 2311 { | 2395 vpx_memcpy(&best_bmodes[i], &x->e_mbd.block[i].bmi, sizeof(B_MOD
E_INFO)); |
| 2312 best_bmodes[i] = x->e_mbd.block[i].bmi; | 2396 } |
| 2313 } | |
| 2314 | |
| 2315 | 2397 |
| 2316 // Testing this mode gave rise to an improvement in best error score
. Lower threshold a bit for next time | 2398 // Testing this mode gave rise to an improvement in best error score
. Lower threshold a bit for next time |
| 2317 cpi->rd_thresh_mult[mode_index] = (cpi->rd_thresh_mult[mode_index] >
= (MIN_THRESHMULT + 2)) ? cpi->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; | 2399 cpi->rd_thresh_mult[mode_index] = (cpi->rd_thresh_mult[mode_index] >
= (MIN_THRESHMULT + 2)) ? cpi->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; |
| 2318 cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index]
>> 7) * cpi->rd_thresh_mult[mode_index]; | 2400 cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index]
>> 7) * cpi->rd_thresh_mult[mode_index]; |
| 2319 } | 2401 } |
| 2320 | 2402 |
| 2321 // If the mode did not help improve the best error case then raise the t
hreshold for testing that mode next time around. | 2403 // If the mode did not help improve the best error case then raise the t
hreshold for testing that mode next time around. |
| 2322 else | 2404 else |
| 2323 { | 2405 { |
| 2324 cpi->rd_thresh_mult[mode_index] += 4; | 2406 cpi->rd_thresh_mult[mode_index] += 4; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2353 cpi->rd_thresh_mult[THR_NEWG] = (cpi->rd_thresh_mult[THR_NEWG] >= (M
IN_THRESHMULT+best_adjustment)) ? cpi->rd_thresh_mult[THR_NEWG]-best_adjustment:
MIN_THRESHMULT; | 2435 cpi->rd_thresh_mult[THR_NEWG] = (cpi->rd_thresh_mult[THR_NEWG] >= (M
IN_THRESHMULT+best_adjustment)) ? cpi->rd_thresh_mult[THR_NEWG]-best_adjustment:
MIN_THRESHMULT; |
| 2354 cpi->rd_threshes[THR_NEWG] = (cpi->rd_baseline_thresh[THR_NEWG] >> 7
) * cpi->rd_thresh_mult[THR_NEWG]; | 2436 cpi->rd_threshes[THR_NEWG] = (cpi->rd_baseline_thresh[THR_NEWG] >> 7
) * cpi->rd_thresh_mult[THR_NEWG]; |
| 2355 | 2437 |
| 2356 best_adjustment = 4; //(cpi->rd_thresh_mult[THR_NEWA] >> 4); | 2438 best_adjustment = 4; //(cpi->rd_thresh_mult[THR_NEWA] >> 4); |
| 2357 cpi->rd_thresh_mult[THR_NEWA] = (cpi->rd_thresh_mult[THR_NEWA] >= (M
IN_THRESHMULT+best_adjustment)) ? cpi->rd_thresh_mult[THR_NEWA]-best_adjustment:
MIN_THRESHMULT; | 2439 cpi->rd_thresh_mult[THR_NEWA] = (cpi->rd_thresh_mult[THR_NEWA] >= (M
IN_THRESHMULT+best_adjustment)) ? cpi->rd_thresh_mult[THR_NEWA]-best_adjustment:
MIN_THRESHMULT; |
| 2358 cpi->rd_threshes[THR_NEWA] = (cpi->rd_baseline_thresh[THR_NEWA] >> 7
) * cpi->rd_thresh_mult[THR_NEWA]; | 2440 cpi->rd_threshes[THR_NEWA] = (cpi->rd_baseline_thresh[THR_NEWA] >> 7
) * cpi->rd_thresh_mult[THR_NEWA]; |
| 2359 }*/ | 2441 }*/ |
| 2360 | 2442 |
| 2361 } | 2443 } |
| 2362 | 2444 |
| 2445 // If we have chosen new mv or split then decay the full search check count
more quickly. |
| 2446 if ((vp8_mode_order[best_mode_index] == NEWMV) || (vp8_mode_order[best_mode_
index] == SPLITMV)) |
| 2447 { |
| 2448 int lf_or_gf = (vp8_ref_frame_order[best_mode_index] == LAST_FRAME) ? 0
: 1; |
| 2449 |
| 2450 if (cpi->check_freq[lf_or_gf] && !cpi->do_full[lf_or_gf]) |
| 2451 { |
| 2452 cpi->check_freq[lf_or_gf] --; |
| 2453 } |
| 2454 } |
| 2455 |
| 2456 // Keep a record of best mode index that we chose |
| 2457 cpi->last_best_mode_index = best_mode_index; |
| 2458 |
| 2363 // Note how often each mode chosen as best | 2459 // Note how often each mode chosen as best |
| 2364 cpi->mode_chosen_counts[best_mode_index] ++; | 2460 cpi->mode_chosen_counts[best_mode_index] ++; |
| 2365 | 2461 |
| 2366 | 2462 |
| 2367 if (cpi->is_src_frame_alt_ref && | 2463 if (cpi->is_src_frame_alt_ref && (best_mbmode.mode != ZEROMV || best_mbmode.
ref_frame != ALTREF_FRAME)) |
| 2368 (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME)) | |
| 2369 { | 2464 { |
| 2370 x->e_mbd.mode_info_context->mbmi.mode = ZEROMV; | 2465 best_mbmode.mode = ZEROMV; |
| 2371 x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME; | 2466 best_mbmode.ref_frame = ALTREF_FRAME; |
| 2467 best_mbmode.mv.as_int = 0; |
| 2468 best_mbmode.uv_mode = 0; |
| 2469 best_mbmode.mb_skip_coeff = (cpi->common.mb_no_coeff_skip) ? 1 : 0; |
| 2470 best_mbmode.partitioning = 0; |
| 2471 best_mbmode.dc_diff = 0; |
| 2472 |
| 2473 vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MO
DE_INFO)); |
| 2474 vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO)); |
| 2475 |
| 2476 for (i = 0; i < 16; i++) |
| 2477 { |
| 2478 vpx_memset(&x->e_mbd.block[i].bmi, 0, sizeof(B_MODE_INFO)); |
| 2479 } |
| 2480 |
| 2372 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; | 2481 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; |
| 2373 x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; | |
| 2374 x->e_mbd.mode_info_context->mbmi.mb_skip_coeff = | |
| 2375 (cpi->common.mb_no_coeff_skip) ? 1 : 0; | |
| 2376 x->e_mbd.mode_info_context->mbmi.partitioning = 0; | |
| 2377 | 2482 |
| 2378 return; | 2483 return best_rd; |
| 2379 } | 2484 } |
| 2380 | 2485 |
| 2381 | 2486 |
| 2487 if(best_mbmode.mode <= B_PRED) |
| 2488 { |
| 2489 int i; |
| 2490 for (i = 0; i < 16; i++) |
| 2491 { |
| 2492 best_bmodes[i].mv.as_int = 0; |
| 2493 } |
| 2494 } |
| 2495 |
| 2382 // macroblock modes | 2496 // macroblock modes |
| 2383 vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_I
NFO)); | 2497 vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_I
NFO)); |
| 2498 vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO)); |
| 2384 | 2499 |
| 2385 if (best_mbmode.mode == B_PRED) | 2500 for (i = 0; i < 16; i++) |
| 2386 { | 2501 { |
| 2387 for (i = 0; i < 16; i++) | 2502 vpx_memcpy(&x->e_mbd.block[i].bmi, &best_bmodes[i], sizeof(B_MODE_INFO))
; |
| 2388 x->e_mbd.block[i].bmi.as_mode = best_bmodes[i].as_mode; | |
| 2389 } | 2503 } |
| 2390 | 2504 |
| 2391 if (best_mbmode.mode == SPLITMV) | 2505 x->e_mbd.mode_info_context->mbmi.mv.as_mv = x->e_mbd.block[15].bmi.mv.as_mv; |
| 2392 { | |
| 2393 for (i = 0; i < 16; i++) | |
| 2394 x->e_mbd.block[i].bmi.mv.as_int = best_bmodes[i].mv.as_int; | |
| 2395 | 2506 |
| 2396 vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO)); | 2507 return best_rd; |
| 2397 | |
| 2398 x->e_mbd.mode_info_context->mbmi.mv.as_int = | |
| 2399 x->partition_info->bmi[15].mv.as_int; | |
| 2400 } | |
| 2401 | |
| 2402 rd_update_mvcount(cpi, x, &frame_best_ref_mv[xd->mode_info_context->mbmi.ref
_frame]); | |
| 2403 | |
| 2404 } | 2508 } |
| 2405 | 2509 #endif |
| 2406 void vp8_rd_pick_intra_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate_) | |
| 2407 { | |
| 2408 int error4x4, error16x16; | |
| 2409 int rate4x4, rate16x16 = 0, rateuv; | |
| 2410 int dist4x4, dist16x16, distuv; | |
| 2411 int rate; | |
| 2412 int rate4x4_tokenonly = 0; | |
| 2413 int rate16x16_tokenonly = 0; | |
| 2414 int rateuv_tokenonly = 0; | |
| 2415 | |
| 2416 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; | |
| 2417 | |
| 2418 rd_pick_intra_mbuv_mode(cpi, x, &rateuv, &rateuv_tokenonly, &distuv); | |
| 2419 rate = rateuv; | |
| 2420 | |
| 2421 error16x16 = rd_pick_intra16x16mby_mode(cpi, x, | |
| 2422 &rate16x16, &rate16x16_tokenonly, | |
| 2423 &dist16x16); | |
| 2424 | |
| 2425 error4x4 = rd_pick_intra4x4mby_modes(cpi, x, | |
| 2426 &rate4x4, &rate4x4_tokenonly, | |
| 2427 &dist4x4, error16x16); | |
| 2428 | |
| 2429 if (error4x4 < error16x16) | |
| 2430 { | |
| 2431 x->e_mbd.mode_info_context->mbmi.mode = B_PRED; | |
| 2432 rate += rate4x4; | |
| 2433 } | |
| 2434 else | |
| 2435 { | |
| 2436 rate += rate16x16; | |
| 2437 } | |
| 2438 | |
| 2439 *rate_ = rate; | |
| 2440 } | |
| OLD | NEW |