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

Side by Side Diff: source/libvpx/vp8/encoder/rdopt.c

Issue 11555023: libvpx: Add VP9 decoder. (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 8 years 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
11 11
12 #include <stdio.h> 12 #include <stdio.h>
13 #include <math.h> 13 #include <math.h>
14 #include <limits.h> 14 #include <limits.h>
15 #include <assert.h> 15 #include <assert.h>
16 #include "vpx_config.h" 16 #include "vpx_config.h"
17 #include "vpx_rtcd.h" 17 #include "vp8_rtcd.h"
18 #include "vp8/common/pragmas.h" 18 #include "vp8/common/pragmas.h"
19 #include "tokenize.h" 19 #include "tokenize.h"
20 #include "treewriter.h" 20 #include "treewriter.h"
21 #include "onyx_int.h" 21 #include "onyx_int.h"
22 #include "modecosts.h" 22 #include "modecosts.h"
23 #include "encodeintra.h" 23 #include "encodeintra.h"
24 #include "pickinter.h" 24 #include "pickinter.h"
25 #include "vp8/common/entropymode.h" 25 #include "vp8/common/entropymode.h"
26 #include "vp8/common/reconinter.h" 26 #include "vp8/common/reconinter.h"
27 #include "vp8/common/reconintra4x4.h" 27 #include "vp8/common/reconintra4x4.h"
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 static void copy_predictor(unsigned char *dst, const unsigned char *predictor) 618 static void copy_predictor(unsigned char *dst, const unsigned char *predictor)
619 { 619 {
620 const unsigned int *p = (const unsigned int *)predictor; 620 const unsigned int *p = (const unsigned int *)predictor;
621 unsigned int *d = (unsigned int *)dst; 621 unsigned int *d = (unsigned int *)dst;
622 d[0] = p[0]; 622 d[0] = p[0];
623 d[4] = p[4]; 623 d[4] = p[4];
624 d[8] = p[8]; 624 d[8] = p[8];
625 d[12] = p[12]; 625 d[12] = p[12];
626 } 626 }
627 static int rd_pick_intra4x4block( 627 static int rd_pick_intra4x4block(
628 VP8_COMP *cpi,
628 MACROBLOCK *x, 629 MACROBLOCK *x,
629 BLOCK *be, 630 BLOCK *be,
630 BLOCKD *b, 631 BLOCKD *b,
631 B_PREDICTION_MODE *best_mode, 632 B_PREDICTION_MODE *best_mode,
632 const int *bmode_costs, 633 const int *bmode_costs,
633 ENTROPY_CONTEXT *a, 634 ENTROPY_CONTEXT *a,
634 ENTROPY_CONTEXT *l, 635 ENTROPY_CONTEXT *l,
635 636
636 int *bestrate, 637 int *bestrate,
637 int *bestratey, 638 int *bestratey,
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 vpx_memcpy(best_dqcoeff, b->dqcoeff, 32); 694 vpx_memcpy(best_dqcoeff, b->dqcoeff, 32);
694 } 695 }
695 } 696 }
696 b->bmi.as_mode = *best_mode; 697 b->bmi.as_mode = *best_mode;
697 698
698 vp8_short_idct4x4llm(best_dqcoeff, best_predictor, 16, dst, dst_stride); 699 vp8_short_idct4x4llm(best_dqcoeff, best_predictor, 16, dst, dst_stride);
699 700
700 return best_rd; 701 return best_rd;
701 } 702 }
702 703
703 static int rd_pick_intra4x4mby_modes(MACROBLOCK *mb, int *Rate, 704 static int rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate,
704 int *rate_y, int *Distortion, int best_rd) 705 int *rate_y, int *Distortion, int best_rd)
705 { 706 {
706 MACROBLOCKD *const xd = &mb->e_mbd; 707 MACROBLOCKD *const xd = &mb->e_mbd;
707 int i; 708 int i;
708 int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; 709 int cost = mb->mbmode_cost [xd->frame_type] [B_PRED];
709 int distortion = 0; 710 int distortion = 0;
710 int tot_rate_y = 0; 711 int tot_rate_y = 0;
711 int64_t total_rd = 0; 712 int64_t total_rd = 0;
712 ENTROPY_CONTEXT_PLANES t_above, t_left; 713 ENTROPY_CONTEXT_PLANES t_above, t_left;
713 ENTROPY_CONTEXT *ta; 714 ENTROPY_CONTEXT *ta;
(...skipping 19 matching lines...) Expand all
733 734
734 if (mb->e_mbd.frame_type == KEY_FRAME) 735 if (mb->e_mbd.frame_type == KEY_FRAME)
735 { 736 {
736 const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); 737 const B_PREDICTION_MODE A = above_block_mode(mic, i, mis);
737 const B_PREDICTION_MODE L = left_block_mode(mic, i); 738 const B_PREDICTION_MODE L = left_block_mode(mic, i);
738 739
739 bmode_costs = mb->bmode_costs[A][L]; 740 bmode_costs = mb->bmode_costs[A][L];
740 } 741 }
741 742
742 total_rd += rd_pick_intra4x4block( 743 total_rd += rd_pick_intra4x4block(
743 mb, mb->block + i, xd->block + i, &best_mode, bmode_costs, 744 cpi, mb, mb->block + i, xd->block + i, &best_mode, bmode_costs,
744 ta + vp8_block2above[i], 745 ta + vp8_block2above[i],
745 tl + vp8_block2left[i], &r, &ry, &d); 746 tl + vp8_block2left[i], &r, &ry, &d);
746 747
747 cost += r; 748 cost += r;
748 distortion += d; 749 distortion += d;
749 tot_rate_y += ry; 750 tot_rate_y += ry;
750 751
751 mic->bmi[i].as_mode = best_mode; 752 mic->bmi[i].as_mode = best_mode;
752 753
753 if(total_rd >= (int64_t)best_rd) 754 if(total_rd >= (int64_t)best_rd)
754 break; 755 break;
755 } 756 }
756 757
757 if(total_rd >= (int64_t)best_rd) 758 if(total_rd >= (int64_t)best_rd)
758 return INT_MAX; 759 return INT_MAX;
759 760
760 *Rate = cost; 761 *Rate = cost;
761 *rate_y = tot_rate_y; 762 *rate_y = tot_rate_y;
762 *Distortion = distortion; 763 *Distortion = distortion;
763 764
764 return RDCOST(mb->rdmult, mb->rddiv, cost, distortion); 765 return RDCOST(mb->rdmult, mb->rddiv, cost, distortion);
765 } 766 }
766 767
767 768
768 static int rd_pick_intra16x16mby_mode(MACROBLOCK *x, 769 static int rd_pick_intra16x16mby_mode(VP8_COMP *cpi,
770 MACROBLOCK *x,
769 int *Rate, 771 int *Rate,
770 int *rate_y, 772 int *rate_y,
771 int *Distortion) 773 int *Distortion)
772 { 774 {
773 MB_PREDICTION_MODE mode; 775 MB_PREDICTION_MODE mode;
774 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); 776 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected);
775 int rate, ratey; 777 int rate, ratey;
776 int distortion; 778 int distortion;
777 int best_rd = INT_MAX; 779 int best_rd = INT_MAX;
778 int this_rd; 780 int this_rd;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 862
861 vp8_transform_mbuv(x); 863 vp8_transform_mbuv(x);
862 vp8_quantize_mbuv(x); 864 vp8_quantize_mbuv(x);
863 865
864 *rate = rd_cost_mbuv(x); 866 *rate = rd_cost_mbuv(x);
865 *distortion = vp8_mbuverror(x) / 4; 867 *distortion = vp8_mbuverror(x) / 4;
866 868
867 return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); 869 return RDCOST(x->rdmult, x->rddiv, *rate, *distortion);
868 } 870 }
869 871
870 static void rd_pick_intra_mbuv_mode(MACROBLOCK *x, int *rate, 872 static void rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *rate_tokenonly, int *distortion)
871 int *rate_tokenonly, int *distortion)
872 { 873 {
873 MB_PREDICTION_MODE mode; 874 MB_PREDICTION_MODE mode;
874 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); 875 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected);
875 int best_rd = INT_MAX; 876 int best_rd = INT_MAX;
876 int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r); 877 int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r);
877 int rate_to; 878 int rate_to;
878 MACROBLOCKD *xd = &x->e_mbd; 879 MACROBLOCKD *xd = &x->e_mbd;
879 880
880 for (mode = DC_PRED; mode <= TM_PRED; mode++) 881 for (mode = DC_PRED; mode <= TM_PRED; mode++)
881 { 882 {
(...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after
1731 static void rd_update_mvcount(VP8_COMP *cpi, MACROBLOCK *x, int_mv *best_ref_mv) 1732 static void rd_update_mvcount(VP8_COMP *cpi, MACROBLOCK *x, int_mv *best_ref_mv)
1732 { 1733 {
1733 if (x->e_mbd.mode_info_context->mbmi.mode == SPLITMV) 1734 if (x->e_mbd.mode_info_context->mbmi.mode == SPLITMV)
1734 { 1735 {
1735 int i; 1736 int i;
1736 1737
1737 for (i = 0; i < x->partition_info->count; i++) 1738 for (i = 0; i < x->partition_info->count; i++)
1738 { 1739 {
1739 if (x->partition_info->bmi[i].mode == NEW4X4) 1740 if (x->partition_info->bmi[i].mode == NEW4X4)
1740 { 1741 {
1741 x->MVcount[0][mv_max+((x->partition_info->bmi[i].mv.as_mv.row 1742 cpi->MVcount[0][mv_max+((x->partition_info->bmi[i].mv.as_mv.row
1742 - best_ref_mv->as_mv.row) >> 1)]++; 1743 - best_ref_mv->as_mv.row) >> 1)]++;
1743 x->MVcount[1][mv_max+((x->partition_info->bmi[i].mv.as_mv.col 1744 cpi->MVcount[1][mv_max+((x->partition_info->bmi[i].mv.as_mv.col
1744 - best_ref_mv->as_mv.col) >> 1)]++; 1745 - best_ref_mv->as_mv.col) >> 1)]++;
1745 } 1746 }
1746 } 1747 }
1747 } 1748 }
1748 else if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV) 1749 else if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV)
1749 { 1750 {
1750 x->MVcount[0][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.row 1751 cpi->MVcount[0][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.row
1751 - best_ref_mv->as_mv.row) >> 1)]++; 1752 - best_ref_mv->as_mv.row) >> 1)]++;
1752 x->MVcount[1][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.col 1753 cpi->MVcount[1][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.col
1753 - best_ref_mv->as_mv.col) >> 1)]++; 1754 - best_ref_mv->as_mv.col) >> 1)]++;
1754 } 1755 }
1755 } 1756 }
1756 1757
1757 static int evaluate_inter_mode_rd(int mdcounts[4], 1758 static int evaluate_inter_mode_rd(int mdcounts[4],
1758 RATE_DISTORTION* rd, 1759 RATE_DISTORTION* rd,
1759 int* disable_skip, 1760 int* disable_skip,
1760 VP8_COMP *cpi, MACROBLOCK *x) 1761 VP8_COMP *cpi, MACROBLOCK *x)
1761 { 1762 {
1762 MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode; 1763 MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode;
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
2112 cpi->zbin_mode_boost = 0; 2113 cpi->zbin_mode_boost = 0;
2113 else 2114 else
2114 cpi->zbin_mode_boost = MV_ZBIN_BOOST; 2115 cpi->zbin_mode_boost = MV_ZBIN_BOOST;
2115 } 2116 }
2116 2117
2117 vp8_update_zbin_extra(cpi, x); 2118 vp8_update_zbin_extra(cpi, x);
2118 } 2119 }
2119 2120
2120 if(!uv_intra_done && this_ref_frame == INTRA_FRAME) 2121 if(!uv_intra_done && this_ref_frame == INTRA_FRAME)
2121 { 2122 {
2122 rd_pick_intra_mbuv_mode(x, &uv_intra_rate, 2123 rd_pick_intra_mbuv_mode(cpi, x, &uv_intra_rate,
2123 &uv_intra_rate_tokenonly, 2124 &uv_intra_rate_tokenonly,
2124 &uv_intra_distortion); 2125 &uv_intra_distortion);
2125 uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; 2126 uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode;
2126 2127
2127 /* 2128 /*
2128 * Total of the eobs is used later to further adjust rate2. Since uv 2129 * Total of the eobs is used later to further adjust rate2. Since uv
2129 * block's intra eobs will be overwritten when we check inter modes, 2130 * block's intra eobs will be overwritten when we check inter modes,
2130 * we need to save uv_intra_tteob here. 2131 * we need to save uv_intra_tteob here.
2131 */ 2132 */
2132 for (i = 16; i < 24; i++) 2133 for (i = 16; i < 24; i++)
2133 uv_intra_tteob += x->e_mbd.eobs[i]; 2134 uv_intra_tteob += x->e_mbd.eobs[i];
2134 2135
2135 uv_intra_done = 1; 2136 uv_intra_done = 1;
2136 } 2137 }
2137 2138
2138 switch (this_mode) 2139 switch (this_mode)
2139 { 2140 {
2140 case B_PRED: 2141 case B_PRED:
2141 { 2142 {
2142 int tmp_rd; 2143 int tmp_rd;
2143 2144
2144 /* Note the rate value returned here includes the cost of 2145 /* Note the rate value returned here includes the cost of
2145 * coding the BPRED mode: x->mbmode_cost[x->e_mbd.frame_type][BPRED] 2146 * coding the BPRED mode: x->mbmode_cost[x->e_mbd.frame_type][BPRED]
2146 */ 2147 */
2147 int distortion; 2148 int distortion;
2148 tmp_rd = rd_pick_intra4x4mby_modes(x, &rate, &rd.rate_y, &distortion , best_mode.yrd); 2149 tmp_rd = rd_pick_intra4x4mby_modes(cpi, x, &rate, &rd.rate_y, &disto rtion, best_mode.yrd);
2149 rd.rate2 += rate; 2150 rd.rate2 += rate;
2150 rd.distortion2 += distortion; 2151 rd.distortion2 += distortion;
2151 2152
2152 if(tmp_rd < best_mode.yrd) 2153 if(tmp_rd < best_mode.yrd)
2153 { 2154 {
2154 rd.rate2 += uv_intra_rate; 2155 rd.rate2 += uv_intra_rate;
2155 rd.rate_uv = uv_intra_rate_tokenonly; 2156 rd.rate_uv = uv_intra_rate_tokenonly;
2156 rd.distortion2 += uv_intra_distortion; 2157 rd.distortion2 += uv_intra_distortion;
2157 rd.distortion_uv = uv_intra_distortion; 2158 rd.distortion_uv = uv_intra_distortion;
2158 } 2159 }
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
2587 x->partition_info->bmi[15].mv.as_int; 2588 x->partition_info->bmi[15].mv.as_int;
2588 } 2589 }
2589 2590
2590 if (sign_bias 2591 if (sign_bias
2591 != cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame ]) 2592 != cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame ])
2592 best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int; 2593 best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int;
2593 2594
2594 rd_update_mvcount(cpi, x, &best_ref_mv); 2595 rd_update_mvcount(cpi, x, &best_ref_mv);
2595 } 2596 }
2596 2597
2597 void vp8_rd_pick_intra_mode(MACROBLOCK *x, int *rate_) 2598 void vp8_rd_pick_intra_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate_)
2598 { 2599 {
2599 int error4x4, error16x16; 2600 int error4x4, error16x16;
2600 int rate4x4, rate16x16 = 0, rateuv; 2601 int rate4x4, rate16x16 = 0, rateuv;
2601 int dist4x4, dist16x16, distuv; 2602 int dist4x4, dist16x16, distuv;
2602 int rate; 2603 int rate;
2603 int rate4x4_tokenonly = 0; 2604 int rate4x4_tokenonly = 0;
2604 int rate16x16_tokenonly = 0; 2605 int rate16x16_tokenonly = 0;
2605 int rateuv_tokenonly = 0; 2606 int rateuv_tokenonly = 0;
2606 2607
2607 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; 2608 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
2608 2609
2609 rd_pick_intra_mbuv_mode(x, &rateuv, &rateuv_tokenonly, &distuv); 2610 rd_pick_intra_mbuv_mode(cpi, x, &rateuv, &rateuv_tokenonly, &distuv);
2610 rate = rateuv; 2611 rate = rateuv;
2611 2612
2612 error16x16 = rd_pick_intra16x16mby_mode(x, &rate16x16, &rate16x16_tokenonly, 2613 error16x16 = rd_pick_intra16x16mby_mode(cpi, x,
2614 &rate16x16, &rate16x16_tokenonly,
2613 &dist16x16); 2615 &dist16x16);
2614 2616
2615 error4x4 = rd_pick_intra4x4mby_modes(x, &rate4x4, &rate4x4_tokenonly, 2617 error4x4 = rd_pick_intra4x4mby_modes(cpi, x,
2618 &rate4x4, &rate4x4_tokenonly,
2616 &dist4x4, error16x16); 2619 &dist4x4, error16x16);
2617 2620
2618 if (error4x4 < error16x16) 2621 if (error4x4 < error16x16)
2619 { 2622 {
2620 x->e_mbd.mode_info_context->mbmi.mode = B_PRED; 2623 x->e_mbd.mode_info_context->mbmi.mode = B_PRED;
2621 rate += rate4x4; 2624 rate += rate4x4;
2622 } 2625 }
2623 else 2626 else
2624 { 2627 {
2625 rate += rate16x16; 2628 rate += rate16x16;
2626 } 2629 }
2627 2630
2628 *rate_ = rate; 2631 *rate_ = rate;
2629 } 2632 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698