Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(576)

Side by Side Diff: source/libvpx/vp9/encoder/vp9_temporal_filter.c

Issue 592203002: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 26 matching lines...) Expand all
37 int uv_block_width, 37 int uv_block_width,
38 int uv_block_height, 38 int uv_block_height,
39 int mv_row, 39 int mv_row,
40 int mv_col, 40 int mv_col,
41 uint8_t *pred, 41 uint8_t *pred,
42 struct scale_factors *scale, 42 struct scale_factors *scale,
43 int x, int y) { 43 int x, int y) {
44 const int which_mv = 0; 44 const int which_mv = 0;
45 const MV mv = { mv_row, mv_col }; 45 const MV mv = { mv_row, mv_col };
46 const InterpKernel *const kernel = 46 const InterpKernel *const kernel =
47 vp9_get_interp_kernel(xd->mi[0]->mbmi.interp_filter); 47 vp9_get_interp_kernel(xd->mi[0].src_mi->mbmi.interp_filter);
48 48
49 enum mv_precision mv_precision_uv; 49 enum mv_precision mv_precision_uv;
50 int uv_stride; 50 int uv_stride;
51 if (uv_block_width == 8) { 51 if (uv_block_width == 8) {
52 uv_stride = (stride + 1) >> 1; 52 uv_stride = (stride + 1) >> 1;
53 mv_precision_uv = MV_PRECISION_Q4; 53 mv_precision_uv = MV_PRECISION_Q4;
54 } else { 54 } else {
55 uv_stride = stride; 55 uv_stride = stride;
56 mv_precision_uv = MV_PRECISION_Q3; 56 mv_precision_uv = MV_PRECISION_Q3;
57 } 57 }
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 const MV_SPEED_FEATURES *const mv_sf = &cpi->sf.mv; 142 const MV_SPEED_FEATURES *const mv_sf = &cpi->sf.mv;
143 int step_param; 143 int step_param;
144 int sadpb = x->sadperbit16; 144 int sadpb = x->sadperbit16;
145 int bestsme = INT_MAX; 145 int bestsme = INT_MAX;
146 int distortion; 146 int distortion;
147 unsigned int sse; 147 unsigned int sse;
148 int sad_list[5]; 148 int sad_list[5];
149 149
150 MV best_ref_mv1 = {0, 0}; 150 MV best_ref_mv1 = {0, 0};
151 MV best_ref_mv1_full; /* full-pixel value of best_ref_mv1 */ 151 MV best_ref_mv1_full; /* full-pixel value of best_ref_mv1 */
152 MV *ref_mv = &x->e_mbd.mi[0]->bmi[0].as_mv[0].as_mv; 152 MV *ref_mv = &x->e_mbd.mi[0].src_mi->bmi[0].as_mv[0].as_mv;
153 153
154 // Save input state 154 // Save input state
155 struct buf_2d src = x->plane[0].src; 155 struct buf_2d src = x->plane[0].src;
156 struct buf_2d pre = xd->plane[0].pre[0]; 156 struct buf_2d pre = xd->plane[0].pre[0];
157 157
158 best_ref_mv1_full.col = best_ref_mv1.col >> 3; 158 best_ref_mv1_full.col = best_ref_mv1.col >> 3;
159 best_ref_mv1_full.row = best_ref_mv1.row >> 3; 159 best_ref_mv1_full.row = best_ref_mv1.row >> 3;
160 160
161 // Setup frame pointers 161 // Setup frame pointers
162 x->plane[0].src.buf = arf_frame_buf; 162 x->plane[0].src.buf = arf_frame_buf;
(...skipping 30 matching lines...) Expand all
193 static void temporal_filter_iterate_c(VP9_COMP *cpi, 193 static void temporal_filter_iterate_c(VP9_COMP *cpi,
194 YV12_BUFFER_CONFIG **frames, 194 YV12_BUFFER_CONFIG **frames,
195 int frame_count, 195 int frame_count,
196 int alt_ref_index, 196 int alt_ref_index,
197 int strength, 197 int strength,
198 struct scale_factors *scale) { 198 struct scale_factors *scale) {
199 int byte; 199 int byte;
200 int frame; 200 int frame;
201 int mb_col, mb_row; 201 int mb_col, mb_row;
202 unsigned int filter_weight; 202 unsigned int filter_weight;
203 int mb_cols = cpi->common.mb_cols; 203 int mb_cols = (frames[alt_ref_index]->y_crop_width + 15) >> 4;
204 int mb_rows = cpi->common.mb_rows; 204 int mb_rows = (frames[alt_ref_index]->y_crop_height + 15) >> 4;
205 int mb_y_offset = 0; 205 int mb_y_offset = 0;
206 int mb_uv_offset = 0; 206 int mb_uv_offset = 0;
207 DECLARE_ALIGNED_ARRAY(16, unsigned int, accumulator, 16 * 16 * 3); 207 DECLARE_ALIGNED_ARRAY(16, unsigned int, accumulator, 16 * 16 * 3);
208 DECLARE_ALIGNED_ARRAY(16, uint16_t, count, 16 * 16 * 3); 208 DECLARE_ALIGNED_ARRAY(16, uint16_t, count, 16 * 16 * 3);
209 MACROBLOCKD *mbd = &cpi->mb.e_mbd; 209 MACROBLOCKD *mbd = &cpi->mb.e_mbd;
210 YV12_BUFFER_CONFIG *f = frames[alt_ref_index]; 210 YV12_BUFFER_CONFIG *f = frames[alt_ref_index];
211 uint8_t *dst1, *dst2; 211 uint8_t *dst1, *dst2;
212 DECLARE_ALIGNED_ARRAY(16, uint8_t, predictor, 16 * 16 * 3); 212 DECLARE_ALIGNED_ARRAY(16, uint8_t, predictor, 16 * 16 * 3);
213 const int mb_uv_height = 16 >> mbd->plane[1].subsampling_y; 213 const int mb_uv_height = 16 >> mbd->plane[1].subsampling_y;
214 const int mb_uv_width = 16 >> mbd->plane[1].subsampling_x; 214 const int mb_uv_width = 16 >> mbd->plane[1].subsampling_x;
(...skipping 11 matching lines...) Expand all
226 // A 6/8 tap filter is used for motion search. This requires 2 pixels 226 // A 6/8 tap filter is used for motion search. This requires 2 pixels
227 // before and 3 pixels after. So the largest Y mv on a border would 227 // before and 3 pixels after. So the largest Y mv on a border would
228 // then be 16 - VP9_INTERP_EXTEND. The UV blocks are half the size of the 228 // then be 16 - VP9_INTERP_EXTEND. The UV blocks are half the size of the
229 // Y and therefore only extended by 8. The largest mv that a UV block 229 // Y and therefore only extended by 8. The largest mv that a UV block
230 // can support is 8 - VP9_INTERP_EXTEND. A UV mv is half of a Y mv. 230 // can support is 8 - VP9_INTERP_EXTEND. A UV mv is half of a Y mv.
231 // (16 - VP9_INTERP_EXTEND) >> 1 which is greater than 231 // (16 - VP9_INTERP_EXTEND) >> 1 which is greater than
232 // 8 - VP9_INTERP_EXTEND. 232 // 8 - VP9_INTERP_EXTEND.
233 // To keep the mv in play for both Y and UV planes the max that it 233 // To keep the mv in play for both Y and UV planes the max that it
234 // can be on a border is therefore 16 - (2*VP9_INTERP_EXTEND+1). 234 // can be on a border is therefore 16 - (2*VP9_INTERP_EXTEND+1).
235 cpi->mb.mv_row_min = -((mb_row * 16) + (17 - 2 * VP9_INTERP_EXTEND)); 235 cpi->mb.mv_row_min = -((mb_row * 16) + (17 - 2 * VP9_INTERP_EXTEND));
236 cpi->mb.mv_row_max = ((cpi->common.mb_rows - 1 - mb_row) * 16) 236 cpi->mb.mv_row_max = ((mb_rows - 1 - mb_row) * 16)
237 + (17 - 2 * VP9_INTERP_EXTEND); 237 + (17 - 2 * VP9_INTERP_EXTEND);
238 238
239 for (mb_col = 0; mb_col < mb_cols; mb_col++) { 239 for (mb_col = 0; mb_col < mb_cols; mb_col++) {
240 int i, j, k; 240 int i, j, k;
241 int stride; 241 int stride;
242 242
243 vpx_memset(accumulator, 0, 16 * 16 * 3 * sizeof(accumulator[0])); 243 vpx_memset(accumulator, 0, 16 * 16 * 3 * sizeof(accumulator[0]));
244 vpx_memset(count, 0, 16 * 16 * 3 * sizeof(count[0])); 244 vpx_memset(count, 0, 16 * 16 * 3 * sizeof(count[0]));
245 245
246 cpi->mb.mv_col_min = -((mb_col * 16) + (17 - 2 * VP9_INTERP_EXTEND)); 246 cpi->mb.mv_col_min = -((mb_col * 16) + (17 - 2 * VP9_INTERP_EXTEND));
247 cpi->mb.mv_col_max = ((cpi->common.mb_cols - 1 - mb_col) * 16) 247 cpi->mb.mv_col_max = ((mb_cols - 1 - mb_col) * 16)
248 + (17 - 2 * VP9_INTERP_EXTEND); 248 + (17 - 2 * VP9_INTERP_EXTEND);
249 249
250 for (frame = 0; frame < frame_count; frame++) { 250 for (frame = 0; frame < frame_count; frame++) {
251 const int thresh_low = 10000; 251 const int thresh_low = 10000;
252 const int thresh_high = 20000; 252 const int thresh_high = 20000;
253 253
254 if (frames[frame] == NULL) 254 if (frames[frame] == NULL)
255 continue; 255 continue;
256 256
257 mbd->mi[0]->bmi[0].as_mv[0].as_mv.row = 0; 257 mbd->mi[0].src_mi->bmi[0].as_mv[0].as_mv.row = 0;
258 mbd->mi[0]->bmi[0].as_mv[0].as_mv.col = 0; 258 mbd->mi[0].src_mi->bmi[0].as_mv[0].as_mv.col = 0;
259 259
260 if (frame == alt_ref_index) { 260 if (frame == alt_ref_index) {
261 filter_weight = 2; 261 filter_weight = 2;
262 } else { 262 } else {
263 // Find best match in this frame by MC 263 // Find best match in this frame by MC
264 int err = temporal_filter_find_matching_mb_c(cpi, 264 int err = temporal_filter_find_matching_mb_c(cpi,
265 frames[alt_ref_index]->y_buffer + mb_y_offset, 265 frames[alt_ref_index]->y_buffer + mb_y_offset,
266 frames[frame]->y_buffer + mb_y_offset, 266 frames[frame]->y_buffer + mb_y_offset,
267 frames[frame]->y_stride); 267 frames[frame]->y_stride);
268 268
269 // Assign higher weight to matching MB if it's error 269 // Assign higher weight to matching MB if it's error
270 // score is lower. If not applying MC default behavior 270 // score is lower. If not applying MC default behavior
271 // is to weight all MBs equal. 271 // is to weight all MBs equal.
272 filter_weight = err < thresh_low 272 filter_weight = err < thresh_low
273 ? 2 : err < thresh_high ? 1 : 0; 273 ? 2 : err < thresh_high ? 1 : 0;
274 } 274 }
275 275
276 if (filter_weight != 0) { 276 if (filter_weight != 0) {
277 // Construct the predictors 277 // Construct the predictors
278 temporal_filter_predictors_mb_c(mbd, 278 temporal_filter_predictors_mb_c(mbd,
279 frames[frame]->y_buffer + mb_y_offset, 279 frames[frame]->y_buffer + mb_y_offset,
280 frames[frame]->u_buffer + mb_uv_offset, 280 frames[frame]->u_buffer + mb_uv_offset,
281 frames[frame]->v_buffer + mb_uv_offset, 281 frames[frame]->v_buffer + mb_uv_offset,
282 frames[frame]->y_stride, 282 frames[frame]->y_stride,
283 mb_uv_width, mb_uv_height, 283 mb_uv_width, mb_uv_height,
284 mbd->mi[0]->bmi[0].as_mv[0].as_mv.row, 284 mbd->mi[0].src_mi->bmi[0].as_mv[0].as_mv.row,
285 mbd->mi[0]->bmi[0].as_mv[0].as_mv.col, 285 mbd->mi[0].src_mi->bmi[0].as_mv[0].as_mv.col,
286 predictor, scale, 286 predictor, scale,
287 mb_col * 16, mb_row * 16); 287 mb_col * 16, mb_row * 16);
288 288
289 // Apply the filter (YUV) 289 // Apply the filter (YUV)
290 vp9_temporal_filter_apply(f->y_buffer + mb_y_offset, f->y_stride, 290 vp9_temporal_filter_apply(f->y_buffer + mb_y_offset, f->y_stride,
291 predictor, 16, 16, 291 predictor, 16, 16,
292 strength, filter_weight, 292 strength, filter_weight,
293 accumulator, count); 293 accumulator, count);
294 vp9_temporal_filter_apply(f->u_buffer + mb_uv_offset, f->uv_stride, 294 vp9_temporal_filter_apply(f->u_buffer + mb_uv_offset, f->uv_stride,
295 predictor + 256, 295 predictor + 256,
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 // than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff. 382 // than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff.
383 if (frames_bwd < distance) 383 if (frames_bwd < distance)
384 frames_bwd += (oxcf->arnr_max_frames + 1) & 0x1; 384 frames_bwd += (oxcf->arnr_max_frames + 1) & 0x1;
385 385
386 // Set the baseline active filter size. 386 // Set the baseline active filter size.
387 frames = frames_bwd + 1 + frames_fwd; 387 frames = frames_bwd + 1 + frames_fwd;
388 388
389 // Adjust the strength based on active max q. 389 // Adjust the strength based on active max q.
390 if (cpi->common.current_video_frame > 1) 390 if (cpi->common.current_video_frame > 1)
391 q = ((int)vp9_convert_qindex_to_q( 391 q = ((int)vp9_convert_qindex_to_q(
392 cpi->rc.avg_frame_qindex[INTER_FRAME])); 392 cpi->rc.avg_frame_qindex[INTER_FRAME], cpi->common.bit_depth));
393 else 393 else
394 q = ((int)vp9_convert_qindex_to_q( 394 q = ((int)vp9_convert_qindex_to_q(
395 cpi->rc.avg_frame_qindex[KEY_FRAME])); 395 cpi->rc.avg_frame_qindex[KEY_FRAME], cpi->common.bit_depth));
396 if (q > 16) { 396 if (q > 16) {
397 strength = oxcf->arnr_strength; 397 strength = oxcf->arnr_strength;
398 } else { 398 } else {
399 strength = oxcf->arnr_strength - ((16 - q) / 2); 399 strength = oxcf->arnr_strength - ((16 - q) / 2);
400 if (strength < 0) 400 if (strength < 0)
401 strength = 0; 401 strength = 0;
402 } 402 }
403 403
404 // Adjust number of frames in filter and strength based on gf boost level. 404 // Adjust number of frames in filter and strength based on gf boost level.
405 if (frames > group_boost / 150) { 405 if (frames > group_boost / 150) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 struct lookahead_entry *buf = vp9_lookahead_peek(cpi->lookahead, 447 struct lookahead_entry *buf = vp9_lookahead_peek(cpi->lookahead,
448 which_buffer); 448 which_buffer);
449 frames[frames_to_blur - 1 - frame] = &buf->img; 449 frames[frames_to_blur - 1 - frame] = &buf->img;
450 } 450 }
451 451
452 // Setup scaling factors. Scaling on each of the arnr frames is not supported 452 // Setup scaling factors. Scaling on each of the arnr frames is not supported
453 if (is_two_pass_svc(cpi)) { 453 if (is_two_pass_svc(cpi)) {
454 // In spatial svc the scaling factors might be less then 1/2. So we will use 454 // In spatial svc the scaling factors might be less then 1/2. So we will use
455 // non-normative scaling. 455 // non-normative scaling.
456 int frame_used = 0; 456 int frame_used = 0;
457 #if CONFIG_VP9_HIGHBITDEPTH
458 vp9_setup_scale_factors_for_frame(&sf,
459 get_frame_new_buffer(cm)->y_crop_width,
460 get_frame_new_buffer(cm)->y_crop_height,
461 get_frame_new_buffer(cm)->y_crop_width,
462 get_frame_new_buffer(cm)->y_crop_height,
463 cm->use_highbitdepth);
464 #else
457 vp9_setup_scale_factors_for_frame(&sf, 465 vp9_setup_scale_factors_for_frame(&sf,
458 get_frame_new_buffer(cm)->y_crop_width, 466 get_frame_new_buffer(cm)->y_crop_width,
459 get_frame_new_buffer(cm)->y_crop_height, 467 get_frame_new_buffer(cm)->y_crop_height,
460 get_frame_new_buffer(cm)->y_crop_width, 468 get_frame_new_buffer(cm)->y_crop_width,
461 get_frame_new_buffer(cm)->y_crop_height); 469 get_frame_new_buffer(cm)->y_crop_height);
462 470 #endif
463 for (frame = 0; frame < frames_to_blur; ++frame) { 471 for (frame = 0; frame < frames_to_blur; ++frame) {
464 if (cm->mi_cols * MI_SIZE != frames[frame]->y_width || 472 if (cm->mi_cols * MI_SIZE != frames[frame]->y_width ||
465 cm->mi_rows * MI_SIZE != frames[frame]->y_height) { 473 cm->mi_rows * MI_SIZE != frames[frame]->y_height) {
466 if (vp9_realloc_frame_buffer(&cpi->svc.scaled_frames[frame_used], 474 if (vp9_realloc_frame_buffer(&cpi->svc.scaled_frames[frame_used],
467 cm->width, cm->height, 475 cm->width, cm->height,
468 cm->subsampling_x, cm->subsampling_y, 476 cm->subsampling_x, cm->subsampling_y,
469 #if CONFIG_VP9_HIGHBITDEPTH 477 #if CONFIG_VP9_HIGHBITDEPTH
470 cm->use_highbitdepth, 478 cm->use_highbitdepth,
471 #endif 479 #endif
472 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, 480 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL,
473 NULL)) 481 NULL))
474 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 482 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
475 "Failed to reallocate alt_ref_buffer"); 483 "Failed to reallocate alt_ref_buffer");
476 484
477 frames[frame] = vp9_scale_if_required(cm, frames[frame], 485 frames[frame] = vp9_scale_if_required(cm, frames[frame],
478 &cpi->svc.scaled_frames[frame_used]); 486 &cpi->svc.scaled_frames[frame_used]);
479 ++frame_used; 487 ++frame_used;
480 } 488 }
481 } 489 }
482 } else { 490 } else {
491 // ARF is produced at the native frame size and resized when coded.
492 #if CONFIG_VP9_HIGHBITDEPTH
483 vp9_setup_scale_factors_for_frame(&sf, 493 vp9_setup_scale_factors_for_frame(&sf,
484 get_frame_new_buffer(cm)->y_crop_width, 494 frames[0]->y_crop_width,
485 get_frame_new_buffer(cm)->y_crop_height, 495 frames[0]->y_crop_height,
486 cm->width, cm->height); 496 frames[0]->y_crop_width,
497 frames[0]->y_crop_height,
498 cm->use_highbitdepth);
499 #else
500 vp9_setup_scale_factors_for_frame(&sf,
501 frames[0]->y_crop_width,
502 frames[0]->y_crop_height,
503 frames[0]->y_crop_width,
504 frames[0]->y_crop_height);
505 #endif
487 } 506 }
488 507
489 temporal_filter_iterate_c(cpi, frames, frames_to_blur, 508 temporal_filter_iterate_c(cpi, frames, frames_to_blur,
490 frames_to_blur_backward, strength, &sf); 509 frames_to_blur_backward, strength, &sf);
491 } 510 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_svc_layercontext.c ('k') | source/libvpx/vp9/encoder/vp9_tokenize.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698