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

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

Issue 668403002: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 2 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
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_rd.h ('k') | source/libvpx/vp9/encoder/vp9_rdopt.h » ('j') | 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 26 matching lines...) Expand all
37 #include "vp9/encoder/vp9_rd.h" 37 #include "vp9/encoder/vp9_rd.h"
38 #include "vp9/encoder/vp9_tokenize.h" 38 #include "vp9/encoder/vp9_tokenize.h"
39 #include "vp9/encoder/vp9_variance.h" 39 #include "vp9/encoder/vp9_variance.h"
40 40
41 #define RD_THRESH_POW 1.25 41 #define RD_THRESH_POW 1.25
42 #define RD_MULT_EPB_RATIO 64 42 #define RD_MULT_EPB_RATIO 64
43 43
44 // Factor to weigh the rate for switchable interp filters. 44 // Factor to weigh the rate for switchable interp filters.
45 #define SWITCHABLE_INTERP_RATE_FACTOR 1 45 #define SWITCHABLE_INTERP_RATE_FACTOR 1
46 46
47 void vp9_rd_cost_reset(RD_COST *rd_cost) {
48 rd_cost->rate = INT_MAX;
49 rd_cost->dist = INT64_MAX;
50 rd_cost->rdcost = INT64_MAX;
51 }
52
53 void vp9_rd_cost_init(RD_COST *rd_cost) {
54 rd_cost->rate = 0;
55 rd_cost->dist = 0;
56 rd_cost->rdcost = 0;
57 }
58
47 // The baseline rd thresholds for breaking out of the rd loop for 59 // The baseline rd thresholds for breaking out of the rd loop for
48 // certain modes are assumed to be based on 8x8 blocks. 60 // certain modes are assumed to be based on 8x8 blocks.
49 // This table is used to correct for block size. 61 // This table is used to correct for block size.
50 // The factors here are << 2 (2 = x0.5, 32 = x8 etc). 62 // The factors here are << 2 (2 = x0.5, 32 = x8 etc).
51 static const uint8_t rd_thresh_block_size_factor[BLOCK_SIZES] = { 63 static const uint8_t rd_thresh_block_size_factor[BLOCK_SIZES] = {
52 2, 3, 3, 4, 6, 6, 8, 12, 12, 16, 24, 24, 32 64 2, 3, 3, 4, 6, 6, 8, 12, 12, 16, 24, 24, 32
53 }; 65 };
54 66
55 static void fill_mode_costs(VP9_COMP *cpi) { 67 static void fill_mode_costs(VP9_COMP *cpi) {
56 const FRAME_CONTEXT *const fc = &cpi->common.fc; 68 const FRAME_CONTEXT *const fc = &cpi->common.fc;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 141
130 static const int rd_boost_factor[16] = { 142 static const int rd_boost_factor[16] = {
131 64, 32, 32, 32, 24, 16, 12, 12, 143 64, 32, 32, 32, 24, 16, 12, 12,
132 8, 8, 4, 4, 2, 2, 1, 0 144 8, 8, 4, 4, 2, 2, 1, 0
133 }; 145 };
134 static const int rd_frame_type_factor[FRAME_UPDATE_TYPES] = { 146 static const int rd_frame_type_factor[FRAME_UPDATE_TYPES] = {
135 128, 144, 128, 128, 144 147 128, 144, 128, 128, 144
136 }; 148 };
137 149
138 int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex) { 150 int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex) {
139 const int q = vp9_dc_quant(qindex, 0, cpi->common.bit_depth); 151 const int64_t q = vp9_dc_quant(qindex, 0, cpi->common.bit_depth);
140 #if CONFIG_VP9_HIGHBITDEPTH 152 #if CONFIG_VP9_HIGHBITDEPTH
141 int rdmult = 0; 153 int64_t rdmult = 0;
142 switch (cpi->common.bit_depth) { 154 switch (cpi->common.bit_depth) {
143 case VPX_BITS_8: 155 case VPX_BITS_8:
144 rdmult = 88 * q * q / 24; 156 rdmult = 88 * q * q / 24;
145 break; 157 break;
146 case VPX_BITS_10: 158 case VPX_BITS_10:
147 rdmult = ROUND_POWER_OF_TWO(88 * q * q / 24, 4); 159 rdmult = ROUND_POWER_OF_TWO(88 * q * q / 24, 4);
148 break; 160 break;
149 case VPX_BITS_12: 161 case VPX_BITS_12:
150 rdmult = ROUND_POWER_OF_TWO(88 * q * q / 24, 8); 162 rdmult = ROUND_POWER_OF_TWO(88 * q * q / 24, 8);
151 break; 163 break;
152 default: 164 default:
153 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); 165 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
154 return -1; 166 return -1;
155 } 167 }
156 #else 168 #else
157 int rdmult = 88 * q * q / 24; 169 int64_t rdmult = 88 * q * q / 24;
158 #endif 170 #endif // CONFIG_VP9_HIGHBITDEPTH
159 if (cpi->oxcf.pass == 2 && (cpi->common.frame_type != KEY_FRAME)) { 171 if (cpi->oxcf.pass == 2 && (cpi->common.frame_type != KEY_FRAME)) {
160 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; 172 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
161 const FRAME_UPDATE_TYPE frame_type = gf_group->update_type[gf_group->index]; 173 const FRAME_UPDATE_TYPE frame_type = gf_group->update_type[gf_group->index];
162 const int boost_index = MIN(15, (cpi->rc.gfu_boost / 100)); 174 const int boost_index = MIN(15, (cpi->rc.gfu_boost / 100));
163 175
164 rdmult = (rdmult * rd_frame_type_factor[frame_type]) >> 7; 176 rdmult = (rdmult * rd_frame_type_factor[frame_type]) >> 7;
165 rdmult += ((rdmult * rd_boost_factor[boost_index]) >> 7); 177 rdmult += ((rdmult * rd_boost_factor[boost_index]) >> 7);
166 } 178 }
167 return rdmult; 179 return (int)rdmult;
168 } 180 }
169 181
170 static int compute_rd_thresh_factor(int qindex, vpx_bit_depth_t bit_depth) { 182 static int compute_rd_thresh_factor(int qindex, vpx_bit_depth_t bit_depth) {
171 double q; 183 double q;
172 #if CONFIG_VP9_HIGHBITDEPTH 184 #if CONFIG_VP9_HIGHBITDEPTH
173 switch (bit_depth) { 185 switch (bit_depth) {
174 case VPX_BITS_8: 186 case VPX_BITS_8:
175 q = vp9_dc_quant(qindex, 0, VPX_BITS_8) / 4.0; 187 q = vp9_dc_quant(qindex, 0, VPX_BITS_8) / 4.0;
176 break; 188 break;
177 case VPX_BITS_10: 189 case VPX_BITS_10:
178 q = vp9_dc_quant(qindex, 0, VPX_BITS_10) / 16.0; 190 q = vp9_dc_quant(qindex, 0, VPX_BITS_10) / 16.0;
179 break; 191 break;
180 case VPX_BITS_12: 192 case VPX_BITS_12:
181 q = vp9_dc_quant(qindex, 0, VPX_BITS_12) / 64.0; 193 q = vp9_dc_quant(qindex, 0, VPX_BITS_12) / 64.0;
182 break; 194 break;
183 default: 195 default:
184 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); 196 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
185 return -1; 197 return -1;
186 } 198 }
187 #else 199 #else
188 (void) bit_depth; 200 (void) bit_depth;
189 q = vp9_dc_quant(qindex, 0, VPX_BITS_8) / 4.0; 201 q = vp9_dc_quant(qindex, 0, VPX_BITS_8) / 4.0;
190 #endif 202 #endif // CONFIG_VP9_HIGHBITDEPTH
191 // TODO(debargha): Adjust the function below. 203 // TODO(debargha): Adjust the function below.
192 return MAX((int)(pow(q, RD_THRESH_POW) * 5.12), 8); 204 return MAX((int)(pow(q, RD_THRESH_POW) * 5.12), 8);
193 } 205 }
194 206
195 void vp9_initialize_me_consts(VP9_COMP *cpi, int qindex) { 207 void vp9_initialize_me_consts(VP9_COMP *cpi, int qindex) {
196 #if CONFIG_VP9_HIGHBITDEPTH 208 #if CONFIG_VP9_HIGHBITDEPTH
197 switch (cpi->common.bit_depth) { 209 switch (cpi->common.bit_depth) {
198 case VPX_BITS_8: 210 case VPX_BITS_8:
199 cpi->mb.sadperbit16 = sad_per_bit16lut_8[qindex]; 211 cpi->mb.sadperbit16 = sad_per_bit16lut_8[qindex];
200 cpi->mb.sadperbit4 = sad_per_bit4lut_8[qindex]; 212 cpi->mb.sadperbit4 = sad_per_bit4lut_8[qindex];
201 break; 213 break;
202 case VPX_BITS_10: 214 case VPX_BITS_10:
203 cpi->mb.sadperbit16 = sad_per_bit16lut_10[qindex]; 215 cpi->mb.sadperbit16 = sad_per_bit16lut_10[qindex];
204 cpi->mb.sadperbit4 = sad_per_bit4lut_10[qindex]; 216 cpi->mb.sadperbit4 = sad_per_bit4lut_10[qindex];
205 break; 217 break;
206 case VPX_BITS_12: 218 case VPX_BITS_12:
207 cpi->mb.sadperbit16 = sad_per_bit16lut_12[qindex]; 219 cpi->mb.sadperbit16 = sad_per_bit16lut_12[qindex];
208 cpi->mb.sadperbit4 = sad_per_bit4lut_12[qindex]; 220 cpi->mb.sadperbit4 = sad_per_bit4lut_12[qindex];
209 break; 221 break;
210 default: 222 default:
211 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); 223 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
212 } 224 }
213 #else 225 #else
214 cpi->mb.sadperbit16 = sad_per_bit16lut_8[qindex]; 226 cpi->mb.sadperbit16 = sad_per_bit16lut_8[qindex];
215 cpi->mb.sadperbit4 = sad_per_bit4lut_8[qindex]; 227 cpi->mb.sadperbit4 = sad_per_bit4lut_8[qindex];
216 #endif 228 #endif // CONFIG_VP9_HIGHBITDEPTH
217 } 229 }
218 230
219 static void set_block_thresholds(const VP9_COMMON *cm, RD_OPT *rd) { 231 static void set_block_thresholds(const VP9_COMMON *cm, RD_OPT *rd) {
220 int i, bsize, segment_id; 232 int i, bsize, segment_id;
221 233
222 for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) { 234 for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) {
223 const int qindex = 235 const int qindex =
224 clamp(vp9_get_qindex(&cm->seg, segment_id, cm->base_qindex) + 236 clamp(vp9_get_qindex(&cm->seg, segment_id, cm->base_qindex) +
225 cm->y_dc_delta_q, 0, MAXQ); 237 cm->y_dc_delta_q, 0, MAXQ);
226 const int q = compute_rd_thresh_factor(qindex, cm->bit_depth); 238 const int q = compute_rd_thresh_factor(qindex, cm->bit_depth);
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 rd->thresh_mult_sub8x8[THR_ALTR] += 2500; 603 rd->thresh_mult_sub8x8[THR_ALTR] += 2500;
592 rd->thresh_mult_sub8x8[THR_INTRA] += 2500; 604 rd->thresh_mult_sub8x8[THR_INTRA] += 2500;
593 rd->thresh_mult_sub8x8[THR_COMP_LA] += 4500; 605 rd->thresh_mult_sub8x8[THR_COMP_LA] += 4500;
594 rd->thresh_mult_sub8x8[THR_COMP_GA] += 4500; 606 rd->thresh_mult_sub8x8[THR_COMP_GA] += 4500;
595 607
596 // Check for masked out split cases. 608 // Check for masked out split cases.
597 for (i = 0; i < MAX_REFS; ++i) 609 for (i = 0; i < MAX_REFS; ++i)
598 if (sf->disable_split_mask & (1 << i)) 610 if (sf->disable_split_mask & (1 << i))
599 rd->thresh_mult_sub8x8[i] = INT_MAX; 611 rd->thresh_mult_sub8x8[i] = INT_MAX;
600 } 612 }
613
614 int vp9_get_intra_cost_penalty(int qindex, int qdelta,
615 vpx_bit_depth_t bit_depth) {
616 const int q = vp9_dc_quant(qindex, qdelta, bit_depth);
617 #if CONFIG_VP9_HIGHBITDEPTH
618 switch (bit_depth) {
619 case VPX_BITS_8:
620 return 20 * q;
621 case VPX_BITS_10:
622 return 5 * q;
623 case VPX_BITS_12:
624 return ROUND_POWER_OF_TWO(5 * q, 2);
625 default:
626 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
627 return -1;
628 }
629 #else
630 return 20 * q;
631 #endif // CONFIG_VP9_HIGHBITDEPTH
632 }
633
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_rd.h ('k') | source/libvpx/vp9/encoder/vp9_rdopt.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698