OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2014 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2014 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 |
11 #include <assert.h> | 11 #include <assert.h> |
12 #include <limits.h> | 12 #include <limits.h> |
13 #include <math.h> | 13 #include <math.h> |
14 #include <stdio.h> | 14 #include <stdio.h> |
15 | 15 |
16 #include "./vp9_rtcd.h" | 16 #include "./vp9_rtcd.h" |
17 #include "./vpx_dsp_rtcd.h" | 17 #include "./vpx_dsp_rtcd.h" |
18 | 18 |
| 19 #include "vpx_dsp/vpx_dsp_common.h" |
19 #include "vpx_mem/vpx_mem.h" | 20 #include "vpx_mem/vpx_mem.h" |
20 #include "vpx_ports/mem.h" | 21 #include "vpx_ports/mem.h" |
21 | 22 |
22 #include "vp9/common/vp9_blockd.h" | 23 #include "vp9/common/vp9_blockd.h" |
23 #include "vp9/common/vp9_common.h" | 24 #include "vp9/common/vp9_common.h" |
24 #include "vp9/common/vp9_mvref_common.h" | 25 #include "vp9/common/vp9_mvref_common.h" |
25 #include "vp9/common/vp9_pred_common.h" | 26 #include "vp9/common/vp9_pred_common.h" |
26 #include "vp9/common/vp9_reconinter.h" | 27 #include "vp9/common/vp9_reconinter.h" |
27 #include "vp9/common/vp9_reconintra.h" | 28 #include "vp9/common/vp9_reconintra.h" |
28 #include "vp9/common/vp9_scan.h" | 29 #include "vp9/common/vp9_scan.h" |
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 } | 681 } |
681 } | 682 } |
682 | 683 |
683 if (*skippable == 0) { | 684 if (*skippable == 0) { |
684 *rate <<= 10; | 685 *rate <<= 10; |
685 *rate += (eob_cost << 8); | 686 *rate += (eob_cost << 8); |
686 } | 687 } |
687 } | 688 } |
688 #endif | 689 #endif |
689 | 690 |
690 static void model_rd_for_sb_uv(VP9_COMP *cpi, BLOCK_SIZE bsize, | 691 static void model_rd_for_sb_uv(VP9_COMP *cpi, BLOCK_SIZE plane_bsize, |
691 MACROBLOCK *x, MACROBLOCKD *xd, | 692 MACROBLOCK *x, MACROBLOCKD *xd, |
692 int *out_rate_sum, int64_t *out_dist_sum, | 693 int *out_rate_sum, int64_t *out_dist_sum, |
693 unsigned int *var_y, unsigned int *sse_y) { | 694 unsigned int *var_y, unsigned int *sse_y, |
| 695 int start_plane, int stop_plane) { |
694 // Note our transform coeffs are 8 times an orthogonal transform. | 696 // Note our transform coeffs are 8 times an orthogonal transform. |
695 // Hence quantizer step is also 8 times. To get effective quantizer | 697 // Hence quantizer step is also 8 times. To get effective quantizer |
696 // we need to divide by 8 before sending to modeling function. | 698 // we need to divide by 8 before sending to modeling function. |
697 unsigned int sse; | 699 unsigned int sse; |
698 int rate; | 700 int rate; |
699 int64_t dist; | 701 int64_t dist; |
700 int i; | 702 int i; |
701 | 703 |
702 *out_rate_sum = 0; | 704 *out_rate_sum = 0; |
703 *out_dist_sum = 0; | 705 *out_dist_sum = 0; |
704 | 706 |
705 for (i = 1; i <= 2; ++i) { | 707 for (i = start_plane; i <= stop_plane; ++i) { |
706 struct macroblock_plane *const p = &x->plane[i]; | 708 struct macroblock_plane *const p = &x->plane[i]; |
707 struct macroblockd_plane *const pd = &xd->plane[i]; | 709 struct macroblockd_plane *const pd = &xd->plane[i]; |
708 const uint32_t dc_quant = pd->dequant[0]; | 710 const uint32_t dc_quant = pd->dequant[0]; |
709 const uint32_t ac_quant = pd->dequant[1]; | 711 const uint32_t ac_quant = pd->dequant[1]; |
710 const BLOCK_SIZE bs = get_plane_block_size(bsize, pd); | 712 const BLOCK_SIZE bs = plane_bsize; |
711 unsigned int var; | 713 unsigned int var; |
712 | 714 |
713 if (!x->color_sensitivity[i - 1]) | 715 if (!x->color_sensitivity[i - 1]) |
714 continue; | 716 continue; |
715 | 717 |
716 var = cpi->fn_ptr[bs].vf(p->src.buf, p->src.stride, | 718 var = cpi->fn_ptr[bs].vf(p->src.buf, p->src.stride, |
717 pd->dst.buf, pd->dst.stride, &sse); | 719 pd->dst.buf, pd->dst.stride, &sse); |
718 *var_y += var; | 720 *var_y += var; |
719 *sse_y += sse; | 721 *sse_y += sse; |
720 | 722 |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
885 struct macroblock_plane *const p = &x->plane[0]; | 887 struct macroblock_plane *const p = &x->plane[0]; |
886 struct macroblockd_plane *const pd = &xd->plane[0]; | 888 struct macroblockd_plane *const pd = &xd->plane[0]; |
887 const BLOCK_SIZE bsize_tx = txsize_to_bsize[tx_size]; | 889 const BLOCK_SIZE bsize_tx = txsize_to_bsize[tx_size]; |
888 uint8_t *const src_buf_base = p->src.buf; | 890 uint8_t *const src_buf_base = p->src.buf; |
889 uint8_t *const dst_buf_base = pd->dst.buf; | 891 uint8_t *const dst_buf_base = pd->dst.buf; |
890 const int src_stride = p->src.stride; | 892 const int src_stride = p->src.stride; |
891 const int dst_stride = pd->dst.stride; | 893 const int dst_stride = pd->dst.stride; |
892 int i, j; | 894 int i, j; |
893 int rate; | 895 int rate; |
894 int64_t dist; | 896 int64_t dist; |
895 int64_t this_sse = INT64_MAX; | |
896 int is_skippable; | |
897 | 897 |
898 txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); | 898 txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); |
899 assert(plane == 0); | |
900 (void) plane; | |
901 | 899 |
902 p->src.buf = &src_buf_base[4 * (j * src_stride + i)]; | 900 p->src.buf = &src_buf_base[4 * (j * src_stride + i)]; |
903 pd->dst.buf = &dst_buf_base[4 * (j * dst_stride + i)]; | 901 pd->dst.buf = &dst_buf_base[4 * (j * dst_stride + i)]; |
904 // Use source buffer as an approximation for the fully reconstructed buffer. | 902 // Use source buffer as an approximation for the fully reconstructed buffer. |
905 vp9_predict_intra_block(xd, b_width_log2_lookup[plane_bsize], | 903 vp9_predict_intra_block(xd, b_width_log2_lookup[plane_bsize], |
906 tx_size, args->mode, | 904 tx_size, args->mode, |
907 x->skip_encode ? p->src.buf : pd->dst.buf, | 905 x->skip_encode ? p->src.buf : pd->dst.buf, |
908 x->skip_encode ? src_stride : dst_stride, | 906 x->skip_encode ? src_stride : dst_stride, |
909 pd->dst.buf, dst_stride, | 907 pd->dst.buf, dst_stride, |
910 i, j, 0); | 908 i, j, plane); |
911 | 909 |
912 // TODO(jingning): This needs further refactoring. | 910 if (plane == 0) { |
913 block_yrd(cpi, x, &rate, &dist, &is_skippable, &this_sse, 0, | 911 int64_t this_sse = INT64_MAX; |
914 bsize_tx, VPXMIN(tx_size, TX_16X16)); | 912 int is_skippable; |
915 x->skip_txfm[0] = is_skippable; | 913 // TODO(jingning): This needs further refactoring. |
916 rate += vp9_cost_bit(vp9_get_skip_prob(&cpi->common, xd), is_skippable); | 914 block_yrd(cpi, x, &rate, &dist, &is_skippable, &this_sse, 0, |
| 915 bsize_tx, VPXMIN(tx_size, TX_16X16)); |
| 916 x->skip_txfm[0] = is_skippable; |
| 917 // TODO(jingning): Skip is signalled per prediciton block not per tx block. |
| 918 rate += vp9_cost_bit(vp9_get_skip_prob(&cpi->common, xd), is_skippable); |
| 919 } else { |
| 920 unsigned int var, sse; |
| 921 model_rd_for_sb_uv(cpi, plane_bsize, x, xd, &rate, &dist, &var, &sse, |
| 922 plane, plane); |
| 923 } |
917 | 924 |
918 p->src.buf = src_buf_base; | 925 p->src.buf = src_buf_base; |
919 pd->dst.buf = dst_buf_base; | 926 pd->dst.buf = dst_buf_base; |
920 args->rate += rate; | 927 args->rate += rate; |
921 args->dist += dist; | 928 args->dist += dist; |
922 } | 929 } |
923 | 930 |
924 static const THR_MODES mode_idx[MAX_REF_FRAMES - 1][4] = { | 931 static const THR_MODES mode_idx[MAX_REF_FRAMES - 1][4] = { |
925 {THR_DC, THR_V_PRED, THR_H_PRED, THR_TM}, | 932 {THR_DC, THR_V_PRED, THR_H_PRED, THR_TM}, |
926 {THR_NEARESTMV, THR_NEARMV, THR_ZEROMV, THR_NEWMV}, | 933 {THR_NEARESTMV, THR_NEARMV, THR_ZEROMV, THR_NEWMV}, |
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1435 } | 1442 } |
1436 } else { | 1443 } else { |
1437 this_rdc.rate += cm->interp_filter == SWITCHABLE ? | 1444 this_rdc.rate += cm->interp_filter == SWITCHABLE ? |
1438 vp9_get_switchable_rate(cpi, xd) : 0; | 1445 vp9_get_switchable_rate(cpi, xd) : 0; |
1439 this_rdc.rate += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1); | 1446 this_rdc.rate += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1); |
1440 } | 1447 } |
1441 | 1448 |
1442 if (x->color_sensitivity[0] || x->color_sensitivity[1]) { | 1449 if (x->color_sensitivity[0] || x->color_sensitivity[1]) { |
1443 int uv_rate = 0; | 1450 int uv_rate = 0; |
1444 int64_t uv_dist = 0; | 1451 int64_t uv_dist = 0; |
| 1452 const BLOCK_SIZE uv_bsize = get_plane_block_size(bsize, &xd->plane[1]); |
1445 if (x->color_sensitivity[0]) | 1453 if (x->color_sensitivity[0]) |
1446 vp9_build_inter_predictors_sbp(xd, mi_row, mi_col, bsize, 1); | 1454 vp9_build_inter_predictors_sbp(xd, mi_row, mi_col, bsize, 1); |
1447 if (x->color_sensitivity[1]) | 1455 if (x->color_sensitivity[1]) |
1448 vp9_build_inter_predictors_sbp(xd, mi_row, mi_col, bsize, 2); | 1456 vp9_build_inter_predictors_sbp(xd, mi_row, mi_col, bsize, 2); |
1449 model_rd_for_sb_uv(cpi, bsize, x, xd, &uv_rate, &uv_dist, | 1457 model_rd_for_sb_uv(cpi, uv_bsize, x, xd, &uv_rate, &uv_dist, |
1450 &var_y, &sse_y); | 1458 &var_y, &sse_y, 1, 2); |
1451 this_rdc.rate += uv_rate; | 1459 this_rdc.rate += uv_rate; |
1452 this_rdc.dist += uv_dist; | 1460 this_rdc.dist += uv_dist; |
1453 } | 1461 } |
1454 | 1462 |
1455 this_rdc.rate += rate_mv; | 1463 this_rdc.rate += rate_mv; |
1456 this_rdc.rate += | 1464 this_rdc.rate += |
1457 cpi->inter_mode_cost[x->mbmi_ext->mode_context[ref_frame]][INTER_OFFSET( | 1465 cpi->inter_mode_cost[x->mbmi_ext->mode_context[ref_frame]][INTER_OFFSET( |
1458 this_mode)]; | 1466 this_mode)]; |
1459 this_rdc.rate += ref_frame_cost[ref_frame]; | 1467 this_rdc.rate += ref_frame_cost[ref_frame]; |
1460 this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv, this_rdc.rate, this_rdc.dist); | 1468 this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv, this_rdc.rate, this_rdc.dist); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1563 continue; | 1571 continue; |
1564 | 1572 |
1565 mbmi->mode = this_mode; | 1573 mbmi->mode = this_mode; |
1566 mbmi->ref_frame[0] = INTRA_FRAME; | 1574 mbmi->ref_frame[0] = INTRA_FRAME; |
1567 args.mode = this_mode; | 1575 args.mode = this_mode; |
1568 args.rate = 0; | 1576 args.rate = 0; |
1569 args.dist = 0; | 1577 args.dist = 0; |
1570 mbmi->tx_size = intra_tx_size; | 1578 mbmi->tx_size = intra_tx_size; |
1571 vp9_foreach_transformed_block_in_plane(xd, bsize, 0, | 1579 vp9_foreach_transformed_block_in_plane(xd, bsize, 0, |
1572 estimate_block_intra, &args); | 1580 estimate_block_intra, &args); |
| 1581 // Inter and intra RD will mismatch in scale for non-screen content. |
| 1582 if (cpi->oxcf.content == VP9E_CONTENT_SCREEN) { |
| 1583 if (x->color_sensitivity[0]) |
| 1584 vp9_foreach_transformed_block_in_plane(xd, bsize, 1, |
| 1585 estimate_block_intra, &args); |
| 1586 if (x->color_sensitivity[1]) |
| 1587 vp9_foreach_transformed_block_in_plane(xd, bsize, 2, |
| 1588 estimate_block_intra, &args); |
| 1589 } |
1573 this_rdc.rate = args.rate; | 1590 this_rdc.rate = args.rate; |
1574 this_rdc.dist = args.dist; | 1591 this_rdc.dist = args.dist; |
1575 this_rdc.rate += cpi->mbmode_cost[this_mode]; | 1592 this_rdc.rate += cpi->mbmode_cost[this_mode]; |
1576 this_rdc.rate += ref_frame_cost[INTRA_FRAME]; | 1593 this_rdc.rate += ref_frame_cost[INTRA_FRAME]; |
1577 this_rdc.rate += intra_cost_penalty; | 1594 this_rdc.rate += intra_cost_penalty; |
1578 this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv, | 1595 this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv, |
1579 this_rdc.rate, this_rdc.dist); | 1596 this_rdc.rate, this_rdc.dist); |
1580 | 1597 |
1581 if (this_rdc.rdcost < best_rdc.rdcost) { | 1598 if (this_rdc.rdcost < best_rdc.rdcost) { |
1582 best_rdc = this_rdc; | 1599 best_rdc = this_rdc; |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1908 } | 1925 } |
1909 } | 1926 } |
1910 mbmi->mode = xd->mi[0]->bmi[3].as_mode; | 1927 mbmi->mode = xd->mi[0]->bmi[3].as_mode; |
1911 ctx->mic = *(xd->mi[0]); | 1928 ctx->mic = *(xd->mi[0]); |
1912 ctx->mbmi_ext = *x->mbmi_ext; | 1929 ctx->mbmi_ext = *x->mbmi_ext; |
1913 ctx->skip_txfm[0] = SKIP_TXFM_NONE; | 1930 ctx->skip_txfm[0] = SKIP_TXFM_NONE; |
1914 ctx->skip = 0; | 1931 ctx->skip = 0; |
1915 // Dummy assignment for speed -5. No effect in speed -6. | 1932 // Dummy assignment for speed -5. No effect in speed -6. |
1916 rd_cost->rdcost = best_rd; | 1933 rd_cost->rdcost = best_rd; |
1917 } | 1934 } |
OLD | NEW |