OLD | NEW |
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 #include <limits.h> | 11 #include <limits.h> |
12 #include <math.h> | 12 #include <math.h> |
13 #include <stdio.h> | 13 #include <stdio.h> |
14 | 14 |
| 15 #include "./vpx_dsp_rtcd.h" |
15 #include "./vpx_scale_rtcd.h" | 16 #include "./vpx_scale_rtcd.h" |
16 | 17 |
17 #include "vpx_mem/vpx_mem.h" | 18 #include "vpx_mem/vpx_mem.h" |
| 19 #include "vpx_ports/mem.h" |
18 #include "vpx_scale/vpx_scale.h" | 20 #include "vpx_scale/vpx_scale.h" |
19 #include "vpx_scale/yv12config.h" | 21 #include "vpx_scale/yv12config.h" |
20 | 22 |
21 #include "vp9/common/vp9_entropymv.h" | 23 #include "vp9/common/vp9_entropymv.h" |
22 #include "vp9/common/vp9_quant_common.h" | 24 #include "vp9/common/vp9_quant_common.h" |
23 #include "vp9/common/vp9_reconinter.h" // vp9_setup_dst_planes() | 25 #include "vp9/common/vp9_reconinter.h" // vp9_setup_dst_planes() |
24 #include "vp9/common/vp9_systemdependent.h" | 26 #include "vp9/common/vp9_systemdependent.h" |
25 #include "vp9/encoder/vp9_aq_variance.h" | 27 #include "vp9/encoder/vp9_aq_variance.h" |
26 #include "vp9/encoder/vp9_block.h" | 28 #include "vp9/encoder/vp9_block.h" |
27 #include "vp9/encoder/vp9_encodeframe.h" | 29 #include "vp9/encoder/vp9_encodeframe.h" |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 cpi->output_pkt_list); | 261 cpi->output_pkt_list); |
260 } | 262 } |
261 } else { | 263 } else { |
262 output_stats(&cpi->twopass.total_stats, cpi->output_pkt_list); | 264 output_stats(&cpi->twopass.total_stats, cpi->output_pkt_list); |
263 } | 265 } |
264 } | 266 } |
265 | 267 |
266 static vp9_variance_fn_t get_block_variance_fn(BLOCK_SIZE bsize) { | 268 static vp9_variance_fn_t get_block_variance_fn(BLOCK_SIZE bsize) { |
267 switch (bsize) { | 269 switch (bsize) { |
268 case BLOCK_8X8: | 270 case BLOCK_8X8: |
269 return vp9_mse8x8; | 271 return vpx_mse8x8; |
270 case BLOCK_16X8: | 272 case BLOCK_16X8: |
271 return vp9_mse16x8; | 273 return vpx_mse16x8; |
272 case BLOCK_8X16: | 274 case BLOCK_8X16: |
273 return vp9_mse8x16; | 275 return vpx_mse8x16; |
274 default: | 276 default: |
275 return vp9_mse16x16; | 277 return vpx_mse16x16; |
276 } | 278 } |
277 } | 279 } |
278 | 280 |
279 static unsigned int get_prediction_error(BLOCK_SIZE bsize, | 281 static unsigned int get_prediction_error(BLOCK_SIZE bsize, |
280 const struct buf_2d *src, | 282 const struct buf_2d *src, |
281 const struct buf_2d *ref) { | 283 const struct buf_2d *ref) { |
282 unsigned int sse; | 284 unsigned int sse; |
283 const vp9_variance_fn_t fn = get_block_variance_fn(bsize); | 285 const vp9_variance_fn_t fn = get_block_variance_fn(bsize); |
284 fn(src->buf, src->stride, ref->buf, ref->stride, &sse); | 286 fn(src->buf, src->stride, ref->buf, ref->stride, &sse); |
285 return sse; | 287 return sse; |
286 } | 288 } |
287 | 289 |
288 #if CONFIG_VP9_HIGHBITDEPTH | 290 #if CONFIG_VP9_HIGHBITDEPTH |
289 static vp9_variance_fn_t highbd_get_block_variance_fn(BLOCK_SIZE bsize, | 291 static vp9_variance_fn_t highbd_get_block_variance_fn(BLOCK_SIZE bsize, |
290 int bd) { | 292 int bd) { |
291 switch (bd) { | 293 switch (bd) { |
292 default: | 294 default: |
293 switch (bsize) { | 295 switch (bsize) { |
294 case BLOCK_8X8: | 296 case BLOCK_8X8: |
295 return vp9_highbd_mse8x8; | 297 return vpx_highbd_8_mse8x8; |
296 case BLOCK_16X8: | 298 case BLOCK_16X8: |
297 return vp9_highbd_mse16x8; | 299 return vpx_highbd_8_mse16x8; |
298 case BLOCK_8X16: | 300 case BLOCK_8X16: |
299 return vp9_highbd_mse8x16; | 301 return vpx_highbd_8_mse8x16; |
300 default: | 302 default: |
301 return vp9_highbd_mse16x16; | 303 return vpx_highbd_8_mse16x16; |
302 } | 304 } |
303 break; | 305 break; |
304 case 10: | 306 case 10: |
305 switch (bsize) { | 307 switch (bsize) { |
306 case BLOCK_8X8: | 308 case BLOCK_8X8: |
307 return vp9_highbd_10_mse8x8; | 309 return vpx_highbd_10_mse8x8; |
308 case BLOCK_16X8: | 310 case BLOCK_16X8: |
309 return vp9_highbd_10_mse16x8; | 311 return vpx_highbd_10_mse16x8; |
310 case BLOCK_8X16: | 312 case BLOCK_8X16: |
311 return vp9_highbd_10_mse8x16; | 313 return vpx_highbd_10_mse8x16; |
312 default: | 314 default: |
313 return vp9_highbd_10_mse16x16; | 315 return vpx_highbd_10_mse16x16; |
314 } | 316 } |
315 break; | 317 break; |
316 case 12: | 318 case 12: |
317 switch (bsize) { | 319 switch (bsize) { |
318 case BLOCK_8X8: | 320 case BLOCK_8X8: |
319 return vp9_highbd_12_mse8x8; | 321 return vpx_highbd_12_mse8x8; |
320 case BLOCK_16X8: | 322 case BLOCK_16X8: |
321 return vp9_highbd_12_mse16x8; | 323 return vpx_highbd_12_mse16x8; |
322 case BLOCK_8X16: | 324 case BLOCK_8X16: |
323 return vp9_highbd_12_mse8x16; | 325 return vpx_highbd_12_mse8x16; |
324 default: | 326 default: |
325 return vp9_highbd_12_mse16x16; | 327 return vpx_highbd_12_mse16x16; |
326 } | 328 } |
327 break; | 329 break; |
328 } | 330 } |
329 } | 331 } |
330 | 332 |
331 static unsigned int highbd_get_prediction_error(BLOCK_SIZE bsize, | 333 static unsigned int highbd_get_prediction_error(BLOCK_SIZE bsize, |
332 const struct buf_2d *src, | 334 const struct buf_2d *src, |
333 const struct buf_2d *ref, | 335 const struct buf_2d *ref, |
334 int bd) { | 336 int bd) { |
335 unsigned int sse; | 337 unsigned int sse; |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 mb_row << 1, num_8x8_blocks_high_lookup[bsize], | 628 mb_row << 1, num_8x8_blocks_high_lookup[bsize], |
627 mb_col << 1, num_8x8_blocks_wide_lookup[bsize], | 629 mb_col << 1, num_8x8_blocks_wide_lookup[bsize], |
628 cm->mi_rows, cm->mi_cols); | 630 cm->mi_rows, cm->mi_cols); |
629 | 631 |
630 // Do intra 16x16 prediction. | 632 // Do intra 16x16 prediction. |
631 x->skip_encode = 0; | 633 x->skip_encode = 0; |
632 xd->mi[0]->mbmi.mode = DC_PRED; | 634 xd->mi[0]->mbmi.mode = DC_PRED; |
633 xd->mi[0]->mbmi.tx_size = use_dc_pred ? | 635 xd->mi[0]->mbmi.tx_size = use_dc_pred ? |
634 (bsize >= BLOCK_16X16 ? TX_16X16 : TX_8X8) : TX_4X4; | 636 (bsize >= BLOCK_16X16 ? TX_16X16 : TX_8X8) : TX_4X4; |
635 vp9_encode_intra_block_plane(x, bsize, 0); | 637 vp9_encode_intra_block_plane(x, bsize, 0); |
636 this_error = vp9_get_mb_ss(x->plane[0].src_diff); | 638 this_error = vpx_get_mb_ss(x->plane[0].src_diff); |
637 #if CONFIG_VP9_HIGHBITDEPTH | 639 #if CONFIG_VP9_HIGHBITDEPTH |
638 if (cm->use_highbitdepth) { | 640 if (cm->use_highbitdepth) { |
639 switch (cm->bit_depth) { | 641 switch (cm->bit_depth) { |
640 case VPX_BITS_8: | 642 case VPX_BITS_8: |
641 break; | 643 break; |
642 case VPX_BITS_10: | 644 case VPX_BITS_10: |
643 this_error >>= 4; | 645 this_error >>= 4; |
644 break; | 646 break; |
645 case VPX_BITS_12: | 647 case VPX_BITS_12: |
646 this_error >>= 8; | 648 this_error >>= 8; |
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1239 oxcf->two_pass_vbrmin_section) / 100; | 1241 oxcf->two_pass_vbrmin_section) / 100; |
1240 twopass->modified_error_max = (avg_error * | 1242 twopass->modified_error_max = (avg_error * |
1241 oxcf->two_pass_vbrmax_section) / 100; | 1243 oxcf->two_pass_vbrmax_section) / 100; |
1242 while (s < twopass->stats_in_end) { | 1244 while (s < twopass->stats_in_end) { |
1243 modified_error_total += calculate_modified_err(twopass, oxcf, s); | 1245 modified_error_total += calculate_modified_err(twopass, oxcf, s); |
1244 ++s; | 1246 ++s; |
1245 } | 1247 } |
1246 twopass->modified_error_left = modified_error_total; | 1248 twopass->modified_error_left = modified_error_total; |
1247 } | 1249 } |
1248 | 1250 |
1249 // Reset the vbr bits off target counter | 1251 // Reset the vbr bits off target counters |
1250 cpi->rc.vbr_bits_off_target = 0; | 1252 cpi->rc.vbr_bits_off_target = 0; |
| 1253 cpi->rc.vbr_bits_off_target_fast = 0; |
1251 | 1254 |
1252 cpi->rc.rate_error_estimate = 0; | 1255 cpi->rc.rate_error_estimate = 0; |
1253 | 1256 |
1254 // Static sequence monitor variables. | 1257 // Static sequence monitor variables. |
1255 twopass->kf_zeromotion_pct = 100; | 1258 twopass->kf_zeromotion_pct = 100; |
1256 twopass->last_kfgroup_zeromotion_pct = 100; | 1259 twopass->last_kfgroup_zeromotion_pct = 100; |
1257 | 1260 |
1258 if (oxcf->resize_mode != RESIZE_NONE) { | 1261 if (oxcf->resize_mode != RESIZE_NONE) { |
1259 vp9_init_subsampling(cpi); | 1262 vp9_init_subsampling(cpi); |
1260 } | 1263 } |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1688 gf_group->arf_update_idx[frame_index] = arf_buffer_indices[1]; | 1691 gf_group->arf_update_idx[frame_index] = arf_buffer_indices[1]; |
1689 gf_group->arf_ref_idx[frame_index] = arf_buffer_indices[0]; | 1692 gf_group->arf_ref_idx[frame_index] = arf_buffer_indices[0]; |
1690 ++frame_index; | 1693 ++frame_index; |
1691 } | 1694 } |
1692 } | 1695 } |
1693 | 1696 |
1694 // Define middle frame | 1697 // Define middle frame |
1695 mid_frame_idx = frame_index + (rc->baseline_gf_interval >> 1) - 1; | 1698 mid_frame_idx = frame_index + (rc->baseline_gf_interval >> 1) - 1; |
1696 | 1699 |
1697 // Allocate bits to the other frames in the group. | 1700 // Allocate bits to the other frames in the group. |
1698 for (i = 0; i < rc->baseline_gf_interval - 1; ++i) { | 1701 for (i = 0; i < rc->baseline_gf_interval - rc->source_alt_ref_pending; ++i) { |
1699 int arf_idx = 0; | 1702 int arf_idx = 0; |
1700 if (EOF == input_stats(twopass, &frame_stats)) | 1703 if (EOF == input_stats(twopass, &frame_stats)) |
1701 break; | 1704 break; |
1702 | 1705 |
1703 if (has_temporal_layers && frame_index == alt_frame_index) { | 1706 if (has_temporal_layers && frame_index == alt_frame_index) { |
1704 ++frame_index; | 1707 ++frame_index; |
1705 } | 1708 } |
1706 | 1709 |
1707 modified_err = calculate_modified_err(twopass, oxcf, &frame_stats); | 1710 modified_err = calculate_modified_err(twopass, oxcf, &frame_stats); |
1708 | 1711 |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1926 | 1929 |
1927 *this_frame = next_frame; | 1930 *this_frame = next_frame; |
1928 old_boost_score = boost_score; | 1931 old_boost_score = boost_score; |
1929 } | 1932 } |
1930 | 1933 |
1931 twopass->gf_zeromotion_pct = (int)(zero_motion_accumulator * 1000.0); | 1934 twopass->gf_zeromotion_pct = (int)(zero_motion_accumulator * 1000.0); |
1932 | 1935 |
1933 // Was the group length constrained by the requirement for a new KF? | 1936 // Was the group length constrained by the requirement for a new KF? |
1934 rc->constrained_gf_group = (i >= rc->frames_to_key) ? 1 : 0; | 1937 rc->constrained_gf_group = (i >= rc->frames_to_key) ? 1 : 0; |
1935 | 1938 |
| 1939 // Should we use the alternate reference frame. |
| 1940 if (allow_alt_ref && |
| 1941 (i < cpi->oxcf.lag_in_frames) && |
| 1942 (i >= rc->min_gf_interval)) { |
| 1943 // Calculate the boost for alt ref. |
| 1944 rc->gfu_boost = calc_arf_boost(cpi, 0, (i - 1), (i - 1), &f_boost, |
| 1945 &b_boost); |
| 1946 rc->source_alt_ref_pending = 1; |
| 1947 |
| 1948 // Test to see if multi arf is appropriate. |
| 1949 cpi->multi_arf_enabled = |
| 1950 (cpi->multi_arf_allowed && (rc->baseline_gf_interval >= 6) && |
| 1951 (zero_motion_accumulator < 0.995)) ? 1 : 0; |
| 1952 } else { |
| 1953 rc->gfu_boost = MAX((int)boost_score, MIN_ARF_GF_BOOST); |
| 1954 rc->source_alt_ref_pending = 0; |
| 1955 } |
| 1956 |
1936 // Set the interval until the next gf. | 1957 // Set the interval until the next gf. |
1937 if (is_key_frame || rc->source_alt_ref_active) | 1958 if (is_key_frame || rc->source_alt_ref_pending) |
1938 rc->baseline_gf_interval = i - 1; | 1959 rc->baseline_gf_interval = i - 1; |
1939 else | 1960 else |
1940 rc->baseline_gf_interval = i; | 1961 rc->baseline_gf_interval = i; |
1941 | 1962 |
1942 // Only encode alt reference frame in temporal base layer. So | 1963 // Only encode alt reference frame in temporal base layer. So |
1943 // baseline_gf_interval should be multiple of a temporal layer group | 1964 // baseline_gf_interval should be multiple of a temporal layer group |
1944 // (typically the frame distance between two base layer frames) | 1965 // (typically the frame distance between two base layer frames) |
1945 if (is_two_pass_svc(cpi) && cpi->svc.number_temporal_layers > 1) { | 1966 if (is_two_pass_svc(cpi) && cpi->svc.number_temporal_layers > 1) { |
1946 int count = (1 << (cpi->svc.number_temporal_layers - 1)) - 1; | 1967 int count = (1 << (cpi->svc.number_temporal_layers - 1)) - 1; |
1947 int new_gf_interval = (rc->baseline_gf_interval + count) & (~count); | 1968 int new_gf_interval = (rc->baseline_gf_interval + count) & (~count); |
1948 int j; | 1969 int j; |
1949 for (j = 0; j < new_gf_interval - rc->baseline_gf_interval; ++j) { | 1970 for (j = 0; j < new_gf_interval - rc->baseline_gf_interval; ++j) { |
1950 if (EOF == input_stats(twopass, this_frame)) | 1971 if (EOF == input_stats(twopass, this_frame)) |
1951 break; | 1972 break; |
1952 gf_group_err += calculate_modified_err(twopass, oxcf, this_frame); | 1973 gf_group_err += calculate_modified_err(twopass, oxcf, this_frame); |
1953 #if GROUP_ADAPTIVE_MAXQ | 1974 #if GROUP_ADAPTIVE_MAXQ |
1954 gf_group_raw_error += this_frame->coded_error; | 1975 gf_group_raw_error += this_frame->coded_error; |
1955 #endif | 1976 #endif |
1956 } | 1977 } |
1957 rc->baseline_gf_interval = new_gf_interval; | 1978 rc->baseline_gf_interval = new_gf_interval; |
1958 } | 1979 } |
1959 | 1980 |
1960 rc->frames_till_gf_update_due = rc->baseline_gf_interval; | 1981 rc->frames_till_gf_update_due = rc->baseline_gf_interval; |
1961 | 1982 |
1962 // Should we use the alternate reference frame. | |
1963 if (allow_alt_ref && | |
1964 (i < cpi->oxcf.lag_in_frames) && | |
1965 (i >= rc->min_gf_interval)) { | |
1966 // Calculate the boost for alt ref. | |
1967 rc->gfu_boost = calc_arf_boost(cpi, 0, (i - 1), (i - 1), &f_boost, | |
1968 &b_boost); | |
1969 rc->source_alt_ref_pending = 1; | |
1970 | |
1971 // Test to see if multi arf is appropriate. | |
1972 cpi->multi_arf_enabled = | |
1973 (cpi->multi_arf_allowed && (rc->baseline_gf_interval >= 6) && | |
1974 (zero_motion_accumulator < 0.995)) ? 1 : 0; | |
1975 } else { | |
1976 rc->gfu_boost = MAX((int)boost_score, MIN_ARF_GF_BOOST); | |
1977 rc->source_alt_ref_pending = 0; | |
1978 } | |
1979 | |
1980 // Reset the file position. | 1983 // Reset the file position. |
1981 reset_fpf_position(twopass, start_pos); | 1984 reset_fpf_position(twopass, start_pos); |
1982 | 1985 |
1983 // Calculate the bits to be allocated to the gf/arf group as a whole | 1986 // Calculate the bits to be allocated to the gf/arf group as a whole |
1984 gf_group_bits = calculate_total_gf_group_bits(cpi, gf_group_err); | 1987 gf_group_bits = calculate_total_gf_group_bits(cpi, gf_group_err); |
1985 | 1988 |
1986 #if GROUP_ADAPTIVE_MAXQ | 1989 #if GROUP_ADAPTIVE_MAXQ |
1987 // Calculate an estimate of the maxq needed for the group. | 1990 // Calculate an estimate of the maxq needed for the group. |
1988 // We are more agressive about correcting for sections | 1991 // We are more agressive about correcting for sections |
1989 // where there could be significant overshoot than for easier | 1992 // where there could be significant overshoot than for easier |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2406 // sizes. | 2409 // sizes. |
2407 twopass->modified_error_left -= kf_group_err; | 2410 twopass->modified_error_left -= kf_group_err; |
2408 | 2411 |
2409 if (oxcf->resize_mode == RESIZE_DYNAMIC) { | 2412 if (oxcf->resize_mode == RESIZE_DYNAMIC) { |
2410 // Default to normal-sized frame on keyframes. | 2413 // Default to normal-sized frame on keyframes. |
2411 cpi->rc.next_frame_size_selector = UNSCALED; | 2414 cpi->rc.next_frame_size_selector = UNSCALED; |
2412 } | 2415 } |
2413 } | 2416 } |
2414 | 2417 |
2415 // Define the reference buffers that will be updated post encode. | 2418 // Define the reference buffers that will be updated post encode. |
2416 void configure_buffer_updates(VP9_COMP *cpi) { | 2419 static void configure_buffer_updates(VP9_COMP *cpi) { |
2417 TWO_PASS *const twopass = &cpi->twopass; | 2420 TWO_PASS *const twopass = &cpi->twopass; |
2418 | 2421 |
2419 cpi->rc.is_src_frame_alt_ref = 0; | 2422 cpi->rc.is_src_frame_alt_ref = 0; |
2420 switch (twopass->gf_group.update_type[twopass->gf_group.index]) { | 2423 switch (twopass->gf_group.update_type[twopass->gf_group.index]) { |
2421 case KF_UPDATE: | 2424 case KF_UPDATE: |
2422 cpi->refresh_last_frame = 1; | 2425 cpi->refresh_last_frame = 1; |
2423 cpi->refresh_golden_frame = 1; | 2426 cpi->refresh_golden_frame = 1; |
2424 cpi->refresh_alt_ref_frame = 1; | 2427 cpi->refresh_alt_ref_frame = 1; |
2425 break; | 2428 break; |
2426 case LF_UPDATE: | 2429 case LF_UPDATE: |
(...skipping 26 matching lines...) Expand all Loading... |
2453 cpi->refresh_last_frame = 0; | 2456 cpi->refresh_last_frame = 0; |
2454 cpi->refresh_golden_frame = 0; | 2457 cpi->refresh_golden_frame = 0; |
2455 } | 2458 } |
2456 if (cpi->svc.layer_context[cpi->svc.spatial_layer_id].gold_ref_idx < 0) | 2459 if (cpi->svc.layer_context[cpi->svc.spatial_layer_id].gold_ref_idx < 0) |
2457 cpi->refresh_golden_frame = 0; | 2460 cpi->refresh_golden_frame = 0; |
2458 if (cpi->alt_ref_source == NULL) | 2461 if (cpi->alt_ref_source == NULL) |
2459 cpi->refresh_alt_ref_frame = 0; | 2462 cpi->refresh_alt_ref_frame = 0; |
2460 } | 2463 } |
2461 } | 2464 } |
2462 | 2465 |
2463 int is_skippable_frame(const VP9_COMP *cpi) { | 2466 static int is_skippable_frame(const VP9_COMP *cpi) { |
2464 // If the current frame does not have non-zero motion vector detected in the | 2467 // If the current frame does not have non-zero motion vector detected in the |
2465 // first pass, and so do its previous and forward frames, then this frame | 2468 // first pass, and so do its previous and forward frames, then this frame |
2466 // can be skipped for partition check, and the partition size is assigned | 2469 // can be skipped for partition check, and the partition size is assigned |
2467 // according to the variance | 2470 // according to the variance |
2468 const SVC *const svc = &cpi->svc; | 2471 const SVC *const svc = &cpi->svc; |
2469 const TWO_PASS *const twopass = is_two_pass_svc(cpi) ? | 2472 const TWO_PASS *const twopass = is_two_pass_svc(cpi) ? |
2470 &svc->layer_context[svc->spatial_layer_id].twopass : &cpi->twopass; | 2473 &svc->layer_context[svc->spatial_layer_id].twopass : &cpi->twopass; |
2471 | 2474 |
2472 return (!frame_is_intra_only(&cpi->common) && | 2475 return (!frame_is_intra_only(&cpi->common) && |
2473 twopass->stats_in - 2 > twopass->stats_in_start && | 2476 twopass->stats_in - 2 > twopass->stats_in_start && |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2573 cm->frame_type = INTER_FRAME; | 2576 cm->frame_type = INTER_FRAME; |
2574 } | 2577 } |
2575 | 2578 |
2576 if (lc != NULL) { | 2579 if (lc != NULL) { |
2577 if (cpi->svc.spatial_layer_id == 0) { | 2580 if (cpi->svc.spatial_layer_id == 0) { |
2578 lc->is_key_frame = (cm->frame_type == KEY_FRAME); | 2581 lc->is_key_frame = (cm->frame_type == KEY_FRAME); |
2579 if (lc->is_key_frame) { | 2582 if (lc->is_key_frame) { |
2580 cpi->ref_frame_flags &= | 2583 cpi->ref_frame_flags &= |
2581 (~VP9_LAST_FLAG & ~VP9_GOLD_FLAG & ~VP9_ALT_FLAG); | 2584 (~VP9_LAST_FLAG & ~VP9_GOLD_FLAG & ~VP9_ALT_FLAG); |
2582 lc->frames_from_key_frame = 0; | 2585 lc->frames_from_key_frame = 0; |
2583 // Reset the empty frame resolution since we have a key frame. | 2586 // Encode an intra only empty frame since we have a key frame. |
2584 cpi->svc.empty_frame_width = cm->width; | 2587 cpi->svc.encode_intra_empty_frame = 1; |
2585 cpi->svc.empty_frame_height = cm->height; | |
2586 } | 2588 } |
2587 } else { | 2589 } else { |
2588 cm->frame_type = INTER_FRAME; | 2590 cm->frame_type = INTER_FRAME; |
2589 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; | 2591 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; |
2590 | 2592 |
2591 if (lc->is_key_frame) { | 2593 if (lc->is_key_frame) { |
2592 cpi->ref_frame_flags &= (~VP9_LAST_FLAG); | 2594 cpi->ref_frame_flags &= (~VP9_LAST_FLAG); |
2593 lc->frames_from_key_frame = 0; | 2595 lc->frames_from_key_frame = 0; |
2594 } | 2596 } |
2595 } | 2597 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2642 twopass->mb_av_energy = | 2644 twopass->mb_av_energy = |
2643 log(((this_frame.intra_error * 256.0) / num_mbs) + 1.0); | 2645 log(((this_frame.intra_error * 256.0) / num_mbs) + 1.0); |
2644 } | 2646 } |
2645 | 2647 |
2646 // Update the total stats remaining structure. | 2648 // Update the total stats remaining structure. |
2647 subtract_stats(&twopass->total_left_stats, &this_frame); | 2649 subtract_stats(&twopass->total_left_stats, &this_frame); |
2648 } | 2650 } |
2649 | 2651 |
2650 #define MINQ_ADJ_LIMIT 48 | 2652 #define MINQ_ADJ_LIMIT 48 |
2651 #define MINQ_ADJ_LIMIT_CQ 20 | 2653 #define MINQ_ADJ_LIMIT_CQ 20 |
| 2654 #define HIGH_UNDERSHOOT_RATIO 2 |
2652 void vp9_twopass_postencode_update(VP9_COMP *cpi) { | 2655 void vp9_twopass_postencode_update(VP9_COMP *cpi) { |
2653 TWO_PASS *const twopass = &cpi->twopass; | 2656 TWO_PASS *const twopass = &cpi->twopass; |
2654 RATE_CONTROL *const rc = &cpi->rc; | 2657 RATE_CONTROL *const rc = &cpi->rc; |
2655 const int bits_used = rc->base_frame_target; | 2658 const int bits_used = rc->base_frame_target; |
2656 | 2659 |
2657 // VBR correction is done through rc->vbr_bits_off_target. Based on the | 2660 // VBR correction is done through rc->vbr_bits_off_target. Based on the |
2658 // sign of this value, a limited % adjustment is made to the target rate | 2661 // sign of this value, a limited % adjustment is made to the target rate |
2659 // of subsequent frames, to try and push it back towards 0. This method | 2662 // of subsequent frames, to try and push it back towards 0. This method |
2660 // is designed to prevent extreme behaviour at the end of a clip | 2663 // is designed to prevent extreme behaviour at the end of a clip |
2661 // or group of frames. | 2664 // or group of frames. |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2708 | 2711 |
2709 // Unwind undershoot or overshoot adjustment. | 2712 // Unwind undershoot or overshoot adjustment. |
2710 if (rc->rolling_target_bits < rc->rolling_actual_bits) | 2713 if (rc->rolling_target_bits < rc->rolling_actual_bits) |
2711 --twopass->extend_minq; | 2714 --twopass->extend_minq; |
2712 else if (rc->rolling_target_bits > rc->rolling_actual_bits) | 2715 else if (rc->rolling_target_bits > rc->rolling_actual_bits) |
2713 --twopass->extend_maxq; | 2716 --twopass->extend_maxq; |
2714 } | 2717 } |
2715 | 2718 |
2716 twopass->extend_minq = clamp(twopass->extend_minq, 0, minq_adj_limit); | 2719 twopass->extend_minq = clamp(twopass->extend_minq, 0, minq_adj_limit); |
2717 twopass->extend_maxq = clamp(twopass->extend_maxq, 0, maxq_adj_limit); | 2720 twopass->extend_maxq = clamp(twopass->extend_maxq, 0, maxq_adj_limit); |
| 2721 |
| 2722 // If there is a big and undexpected undershoot then feed the extra |
| 2723 // bits back in quickly. One situation where this may happen is if a |
| 2724 // frame is unexpectedly almost perfectly predicted by the ARF or GF |
| 2725 // but not very well predcited by the previous frame. |
| 2726 if (!frame_is_kf_gf_arf(cpi) && !cpi->rc.is_src_frame_alt_ref) { |
| 2727 int fast_extra_thresh = rc->base_frame_target / HIGH_UNDERSHOOT_RATIO; |
| 2728 if (rc->projected_frame_size < fast_extra_thresh) { |
| 2729 rc->vbr_bits_off_target_fast += |
| 2730 fast_extra_thresh - rc->projected_frame_size; |
| 2731 rc->vbr_bits_off_target_fast = |
| 2732 MIN(rc->vbr_bits_off_target_fast, (4 * rc->avg_frame_bandwidth)); |
| 2733 |
| 2734 // Fast adaptation of minQ if necessary to use up the extra bits. |
| 2735 if (rc->avg_frame_bandwidth) { |
| 2736 twopass->extend_minq_fast = |
| 2737 (int)(rc->vbr_bits_off_target_fast * 8 / rc->avg_frame_bandwidth); |
| 2738 } |
| 2739 twopass->extend_minq_fast = MIN(twopass->extend_minq_fast, |
| 2740 minq_adj_limit - twopass->extend_minq); |
| 2741 } else if (rc->vbr_bits_off_target_fast) { |
| 2742 twopass->extend_minq_fast = MIN(twopass->extend_minq_fast, |
| 2743 minq_adj_limit - twopass->extend_minq); |
| 2744 } else { |
| 2745 twopass->extend_minq_fast = 0; |
| 2746 } |
| 2747 } |
2718 } | 2748 } |
2719 } | 2749 } |
OLD | NEW |