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

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

Issue 1067873002: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 years, 8 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
« no previous file with comments | « source/libvpx/vp9/common/vp9_rtcd_defs.pl ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1522 matching lines...) Expand 10 before | Expand all | Expand 10 after
1533 } 1533 }
1534 return 1; 1534 return 1;
1535 } 1535 }
1536 1536
1537 static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x, 1537 static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
1538 BLOCK_SIZE bsize, 1538 BLOCK_SIZE bsize,
1539 int_mv *frame_mv, 1539 int_mv *frame_mv,
1540 int mi_row, int mi_col, 1540 int mi_row, int mi_col,
1541 int_mv single_newmv[MAX_REF_FRAMES], 1541 int_mv single_newmv[MAX_REF_FRAMES],
1542 int *rate_mv) { 1542 int *rate_mv) {
1543 const VP9_COMMON *const cm = &cpi->common;
1543 const int pw = 4 * num_4x4_blocks_wide_lookup[bsize]; 1544 const int pw = 4 * num_4x4_blocks_wide_lookup[bsize];
1544 const int ph = 4 * num_4x4_blocks_high_lookup[bsize]; 1545 const int ph = 4 * num_4x4_blocks_high_lookup[bsize];
1545 MACROBLOCKD *xd = &x->e_mbd; 1546 MACROBLOCKD *xd = &x->e_mbd;
1546 MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi; 1547 MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi;
1547 const int refs[2] = {mbmi->ref_frame[0], 1548 const int refs[2] = {mbmi->ref_frame[0],
1548 mbmi->ref_frame[1] < 0 ? 0 : mbmi->ref_frame[1]}; 1549 mbmi->ref_frame[1] < 0 ? 0 : mbmi->ref_frame[1]};
1549 int_mv ref_mv[2]; 1550 int_mv ref_mv[2];
1550 int ite, ref; 1551 int ite, ref;
1551 // Prediction buffer from second frame. 1552 // Prediction buffer from second frame.
1552 #if CONFIG_VP9_HIGHBITDEPTH 1553 #if CONFIG_VP9_HIGHBITDEPTH
1553 uint8_t *second_pred; 1554 uint8_t *second_pred;
1554 uint8_t *second_pred_alloc; 1555 uint8_t *second_pred_alloc;
1555 #else 1556 #else
1556 uint8_t *second_pred = vpx_memalign(16, pw * ph * sizeof(uint8_t)); 1557 uint8_t *second_pred = vpx_memalign(16, pw * ph * sizeof(uint8_t));
1557 #endif // CONFIG_VP9_HIGHBITDEPTH 1558 #endif // CONFIG_VP9_HIGHBITDEPTH
1558 const InterpKernel *kernel = vp9_get_interp_kernel(mbmi->interp_filter); 1559 const InterpKernel *kernel = vp9_get_interp_kernel(mbmi->interp_filter);
1560 struct scale_factors sf;
1559 1561
1560 // Do joint motion search in compound mode to get more accurate mv. 1562 // Do joint motion search in compound mode to get more accurate mv.
1561 struct buf_2d backup_yv12[2][MAX_MB_PLANE]; 1563 struct buf_2d backup_yv12[2][MAX_MB_PLANE];
1562 int last_besterr[2] = {INT_MAX, INT_MAX}; 1564 int last_besterr[2] = {INT_MAX, INT_MAX};
1563 const YV12_BUFFER_CONFIG *const scaled_ref_frame[2] = { 1565 const YV12_BUFFER_CONFIG *const scaled_ref_frame[2] = {
1564 vp9_get_scaled_ref_frame(cpi, mbmi->ref_frame[0]), 1566 vp9_get_scaled_ref_frame(cpi, mbmi->ref_frame[0]),
1565 vp9_get_scaled_ref_frame(cpi, mbmi->ref_frame[1]) 1567 vp9_get_scaled_ref_frame(cpi, mbmi->ref_frame[1])
1566 }; 1568 };
1567 #if CONFIG_VP9_HIGHBITDEPTH 1569 #if CONFIG_VP9_HIGHBITDEPTH
1568 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 1570 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
(...skipping 15 matching lines...) Expand all
1584 // motion search code to be used without additional modifications. 1586 // motion search code to be used without additional modifications.
1585 for (i = 0; i < MAX_MB_PLANE; i++) 1587 for (i = 0; i < MAX_MB_PLANE; i++)
1586 backup_yv12[ref][i] = xd->plane[i].pre[ref]; 1588 backup_yv12[ref][i] = xd->plane[i].pre[ref];
1587 vp9_setup_pre_planes(xd, ref, scaled_ref_frame[ref], mi_row, mi_col, 1589 vp9_setup_pre_planes(xd, ref, scaled_ref_frame[ref], mi_row, mi_col,
1588 NULL); 1590 NULL);
1589 } 1591 }
1590 1592
1591 frame_mv[refs[ref]].as_int = single_newmv[refs[ref]].as_int; 1593 frame_mv[refs[ref]].as_int = single_newmv[refs[ref]].as_int;
1592 } 1594 }
1593 1595
1596 // Since we have scaled the reference frames to match the size of the current
1597 // frame we must use a unit scaling factor during mode selection.
1598 #if CONFIG_VP9_HIGHBITDEPTH
1599 vp9_setup_scale_factors_for_frame(&sf, cm->width, cm->height,
1600 cm->width, cm->height,
1601 cm->use_highbitdepth);
1602 #else
1603 vp9_setup_scale_factors_for_frame(&sf, cm->width, cm->height,
1604 cm->width, cm->height);
1605 #endif // CONFIG_VP9_HIGHBITDEPTH
1606
1594 // Allow joint search multiple times iteratively for each reference frame 1607 // Allow joint search multiple times iteratively for each reference frame
1595 // and break out of the search loop if it couldn't find a better mv. 1608 // and break out of the search loop if it couldn't find a better mv.
1596 for (ite = 0; ite < 4; ite++) { 1609 for (ite = 0; ite < 4; ite++) {
1597 struct buf_2d ref_yv12[2]; 1610 struct buf_2d ref_yv12[2];
1598 int bestsme = INT_MAX; 1611 int bestsme = INT_MAX;
1599 int sadpb = x->sadperbit16; 1612 int sadpb = x->sadperbit16;
1600 MV tmp_mv; 1613 MV tmp_mv;
1601 int search_range = 3; 1614 int search_range = 3;
1602 1615
1603 int tmp_col_min = x->mv_col_min; 1616 int tmp_col_min = x->mv_col_min;
1604 int tmp_col_max = x->mv_col_max; 1617 int tmp_col_max = x->mv_col_max;
1605 int tmp_row_min = x->mv_row_min; 1618 int tmp_row_min = x->mv_row_min;
1606 int tmp_row_max = x->mv_row_max; 1619 int tmp_row_max = x->mv_row_max;
1607 int id = ite % 2; // Even iterations search in the first reference frame, 1620 int id = ite % 2; // Even iterations search in the first reference frame,
1608 // odd iterations search in the second. The predictor 1621 // odd iterations search in the second. The predictor
1609 // found for the 'other' reference frame is factored in. 1622 // found for the 'other' reference frame is factored in.
1610 1623
1611 // Initialized here because of compiler problem in Visual Studio. 1624 // Initialized here because of compiler problem in Visual Studio.
1612 ref_yv12[0] = xd->plane[0].pre[0]; 1625 ref_yv12[0] = xd->plane[0].pre[0];
1613 ref_yv12[1] = xd->plane[0].pre[1]; 1626 ref_yv12[1] = xd->plane[0].pre[1];
1614 1627
1615 // Get the prediction block from the 'other' reference frame. 1628 // Get the prediction block from the 'other' reference frame.
1616 #if CONFIG_VP9_HIGHBITDEPTH 1629 #if CONFIG_VP9_HIGHBITDEPTH
1617 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 1630 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
1618 vp9_highbd_build_inter_predictor(ref_yv12[!id].buf, 1631 vp9_highbd_build_inter_predictor(ref_yv12[!id].buf,
1619 ref_yv12[!id].stride, 1632 ref_yv12[!id].stride,
1620 second_pred, pw, 1633 second_pred, pw,
1621 &frame_mv[refs[!id]].as_mv, 1634 &frame_mv[refs[!id]].as_mv,
1622 &xd->block_refs[!id]->sf, 1635 &sf, pw, ph, 0,
1623 pw, ph, 0,
1624 kernel, MV_PRECISION_Q3, 1636 kernel, MV_PRECISION_Q3,
1625 mi_col * MI_SIZE, mi_row * MI_SIZE, 1637 mi_col * MI_SIZE, mi_row * MI_SIZE,
1626 xd->bd); 1638 xd->bd);
1627 } else { 1639 } else {
1628 vp9_build_inter_predictor(ref_yv12[!id].buf, 1640 vp9_build_inter_predictor(ref_yv12[!id].buf,
1629 ref_yv12[!id].stride, 1641 ref_yv12[!id].stride,
1630 second_pred, pw, 1642 second_pred, pw,
1631 &frame_mv[refs[!id]].as_mv, 1643 &frame_mv[refs[!id]].as_mv,
1632 &xd->block_refs[!id]->sf, 1644 &sf, pw, ph, 0,
1633 pw, ph, 0,
1634 kernel, MV_PRECISION_Q3, 1645 kernel, MV_PRECISION_Q3,
1635 mi_col * MI_SIZE, mi_row * MI_SIZE); 1646 mi_col * MI_SIZE, mi_row * MI_SIZE);
1636 } 1647 }
1637 #else 1648 #else
1638 vp9_build_inter_predictor(ref_yv12[!id].buf, 1649 vp9_build_inter_predictor(ref_yv12[!id].buf,
1639 ref_yv12[!id].stride, 1650 ref_yv12[!id].stride,
1640 second_pred, pw, 1651 second_pred, pw,
1641 &frame_mv[refs[!id]].as_mv, 1652 &frame_mv[refs[!id]].as_mv,
1642 &xd->block_refs[!id]->sf, 1653 &sf, pw, ph, 0,
1643 pw, ph, 0,
1644 kernel, MV_PRECISION_Q3, 1654 kernel, MV_PRECISION_Q3,
1645 mi_col * MI_SIZE, mi_row * MI_SIZE); 1655 mi_col * MI_SIZE, mi_row * MI_SIZE);
1646 #endif // CONFIG_VP9_HIGHBITDEPTH 1656 #endif // CONFIG_VP9_HIGHBITDEPTH
1647 1657
1648 // Do compound motion search on the current reference frame. 1658 // Do compound motion search on the current reference frame.
1649 if (id) 1659 if (id)
1650 xd->plane[0].pre[0] = ref_yv12[id]; 1660 xd->plane[0].pre[0] = ref_yv12[id];
1651 vp9_set_mv_search_range(x, &ref_mv[id].as_mv); 1661 vp9_set_mv_search_range(x, &ref_mv[id].as_mv);
1652 1662
1653 // Use the mv result from the single mode as mv predictor. 1663 // Use the mv result from the single mode as mv predictor.
(...skipping 2577 matching lines...) Expand 10 before | Expand all | Expand 10 after
4231 } 4241 }
4232 if (cm->interp_filter == SWITCHABLE) 4242 if (cm->interp_filter == SWITCHABLE)
4233 assert(best_filter_diff[SWITCHABLE_FILTERS] == 0); 4243 assert(best_filter_diff[SWITCHABLE_FILTERS] == 0);
4234 } else { 4244 } else {
4235 vp9_zero(best_filter_diff); 4245 vp9_zero(best_filter_diff);
4236 } 4246 }
4237 4247
4238 store_coding_context(x, ctx, best_ref_index, 4248 store_coding_context(x, ctx, best_ref_index,
4239 best_pred_diff, best_tx_diff, best_filter_diff, 0); 4249 best_pred_diff, best_tx_diff, best_filter_diff, 0);
4240 } 4250 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/common/vp9_rtcd_defs.pl ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698