| Index: source/libvpx/vp9/encoder/vp9_encoder.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_encoder.c (revision 292072)
|
| +++ source/libvpx/vp9/encoder/vp9_encoder.c (working copy)
|
| @@ -330,7 +330,8 @@
|
| seg->update_map = 1;
|
| seg->update_data = 1;
|
|
|
| - qi_delta = vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 0.875);
|
| + qi_delta = vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 0.875,
|
| + cm->bit_depth);
|
| vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta - 2);
|
| vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
|
|
|
| @@ -351,7 +352,8 @@
|
| seg->update_data = 1;
|
| seg->abs_delta = SEGMENT_DELTADATA;
|
|
|
| - qi_delta = vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 1.125);
|
| + qi_delta = vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 1.125,
|
| + cm->bit_depth);
|
| vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta + 2);
|
| vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
|
|
|
| @@ -411,15 +413,15 @@
|
|
|
| static void update_reference_segmentation_map(VP9_COMP *cpi) {
|
| VP9_COMMON *const cm = &cpi->common;
|
| - MODE_INFO **mi_8x8_ptr = cm->mi_grid_visible;
|
| + MODE_INFO *mi_8x8_ptr = cm->mi;
|
| uint8_t *cache_ptr = cm->last_frame_seg_map;
|
| int row, col;
|
|
|
| for (row = 0; row < cm->mi_rows; row++) {
|
| - MODE_INFO **mi_8x8 = mi_8x8_ptr;
|
| + MODE_INFO *mi_8x8 = mi_8x8_ptr;
|
| uint8_t *cache = cache_ptr;
|
| for (col = 0; col < cm->mi_cols; col++, mi_8x8++, cache++)
|
| - cache[0] = mi_8x8[0]->mbmi.segment_id;
|
| + cache[0] = mi_8x8[0].src_mi->mbmi.segment_id;
|
| mi_8x8_ptr += cm->mi_stride;
|
| cache_ptr += cm->mi_cols;
|
| }
|
| @@ -556,6 +558,9 @@
|
|
|
| cm->profile = oxcf->profile;
|
| cm->bit_depth = oxcf->bit_depth;
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| + cm->use_highbitdepth = oxcf->use_highbitdepth;
|
| +#endif
|
| cm->color_space = UNKNOWN;
|
|
|
| cm->width = oxcf->width;
|
| @@ -613,6 +618,11 @@
|
| assert(cm->bit_depth > VPX_BITS_8);
|
|
|
| cpi->oxcf = *oxcf;
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| + if (cpi->oxcf.use_highbitdepth) {
|
| + cpi->mb.e_mbd.bd = (int)cm->bit_depth;
|
| + }
|
| +#endif
|
|
|
| rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
|
|
|
| @@ -981,8 +991,10 @@
|
|
|
| // Default rd threshold factors for mode selection
|
| for (i = 0; i < BLOCK_SIZES; ++i) {
|
| - for (j = 0; j < MAX_MODES; ++j)
|
| + for (j = 0; j < MAX_MODES; ++j) {
|
| cpi->rd.thresh_freq_fact[i][j] = 32;
|
| + cpi->rd.mode_map[i][j] = j;
|
| + }
|
| }
|
|
|
| #define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SDX3F, SDX8F, SDX4DF)\
|
| @@ -1272,7 +1284,10 @@
|
| pkt.data.psnr.psnr[i] = psnr.psnr[i];
|
| }
|
| pkt.kind = VPX_CODEC_PSNR_PKT;
|
| - vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
|
| + if (is_two_pass_svc(cpi))
|
| + cpi->svc.layer_context[cpi->svc.spatial_layer_id].psnr_pkt = pkt.data.psnr;
|
| + else
|
| + vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
|
| }
|
|
|
| int vp9_use_as_reference(VP9_COMP *cpi, int ref_frame_flags) {
|
| @@ -2233,9 +2248,11 @@
|
| #endif
|
|
|
| #if CONFIG_INTERNAL_STATS
|
| - int i;
|
| - for (i = 0; i < MAX_MODES; ++i)
|
| - cpi->mode_chosen_counts[i] = 0;
|
| + {
|
| + int i;
|
| + for (i = 0; i < MAX_MODES; ++i)
|
| + cpi->mode_chosen_counts[i] = 0;
|
| + }
|
| #endif
|
|
|
| vp9_set_speed_features(cpi);
|
| @@ -2384,10 +2401,7 @@
|
| static void Pass2Encode(VP9_COMP *cpi, size_t *size,
|
| uint8_t *dest, unsigned int *frame_flags) {
|
| cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
|
| -
|
| - vp9_rc_get_second_pass_params(cpi);
|
| encode_frame_to_data_rate(cpi, size, dest, frame_flags);
|
| -
|
| vp9_twopass_postencode_update(cpi);
|
| }
|
|
|
| @@ -2434,15 +2448,7 @@
|
|
|
| vpx_usec_timer_start(&timer);
|
|
|
| -#if CONFIG_SPATIAL_SVC
|
| - if (is_two_pass_svc(cpi))
|
| - res = vp9_svc_lookahead_push(cpi, cpi->lookahead, sd, time_stamp, end_time,
|
| - frame_flags);
|
| - else
|
| -#endif
|
| - res = vp9_lookahead_push(cpi->lookahead,
|
| - sd, time_stamp, end_time, frame_flags);
|
| - if (res)
|
| + if (vp9_lookahead_push(cpi->lookahead, sd, time_stamp, end_time, frame_flags))
|
| res = -1;
|
| vpx_usec_timer_mark(&timer);
|
| cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
|
| @@ -2571,11 +2577,12 @@
|
| MV_REFERENCE_FRAME ref_frame;
|
| int arf_src_index;
|
|
|
| - if (is_two_pass_svc(cpi) && oxcf->pass == 2) {
|
| + if (is_two_pass_svc(cpi)) {
|
| #if CONFIG_SPATIAL_SVC
|
| - vp9_svc_lookahead_peek(cpi, cpi->lookahead, 0, 1);
|
| + vp9_svc_start_frame(cpi);
|
| #endif
|
| - vp9_restore_layer_context(cpi);
|
| + if (oxcf->pass == 2)
|
| + vp9_restore_layer_context(cpi);
|
| }
|
|
|
| vpx_usec_timer_start(&cmptimer);
|
| @@ -2594,13 +2601,7 @@
|
| if (arf_src_index) {
|
| assert(arf_src_index <= rc->frames_to_key);
|
|
|
| -#if CONFIG_SPATIAL_SVC
|
| - if (is_two_pass_svc(cpi))
|
| - source = vp9_svc_lookahead_peek(cpi, cpi->lookahead, arf_src_index, 0);
|
| - else
|
| -#endif
|
| - source = vp9_lookahead_peek(cpi->lookahead, arf_src_index);
|
| - if (source != NULL) {
|
| + if ((source = vp9_lookahead_peek(cpi->lookahead, arf_src_index)) != NULL) {
|
| cpi->alt_ref_source = source;
|
|
|
| #if CONFIG_SPATIAL_SVC
|
| @@ -2638,13 +2639,7 @@
|
| if (!source) {
|
| // Get last frame source.
|
| if (cm->current_video_frame > 0) {
|
| -#if CONFIG_SPATIAL_SVC
|
| - if (is_two_pass_svc(cpi))
|
| - last_source = vp9_svc_lookahead_peek(cpi, cpi->lookahead, -1, 0);
|
| - else
|
| -#endif
|
| - last_source = vp9_lookahead_peek(cpi->lookahead, -1);
|
| - if (last_source == NULL)
|
| + if ((last_source = vp9_lookahead_peek(cpi->lookahead, -1)) == NULL)
|
| return -1;
|
| }
|
|
|
| @@ -2711,6 +2706,12 @@
|
| cm->frame_bufs[cm->new_fb_idx].ref_count--;
|
| cm->new_fb_idx = get_free_fb(cm);
|
|
|
| + // For two pass encodes analyse the first pass stats and determine
|
| + // the bit allocation and other parameters for this frame / group of frames.
|
| + if ((oxcf->pass == 2) && (!cpi->use_svc || is_two_pass_svc(cpi))) {
|
| + vp9_rc_get_second_pass_params(cpi);
|
| + }
|
| +
|
| if (!cpi->use_svc && cpi->multi_arf_allowed) {
|
| if (cm->frame_type == KEY_FRAME) {
|
| init_buffer_indices(cpi);
|
| @@ -2749,10 +2750,17 @@
|
| RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1];
|
| ref_buf->buf = buf;
|
| ref_buf->idx = idx;
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| vp9_setup_scale_factors_for_frame(&ref_buf->sf,
|
| buf->y_crop_width, buf->y_crop_height,
|
| + cm->width, cm->height,
|
| + (buf->flags & YV12_FLAG_HIGHBITDEPTH) ?
|
| + 1 : 0);
|
| +#else
|
| + vp9_setup_scale_factors_for_frame(&ref_buf->sf,
|
| + buf->y_crop_width, buf->y_crop_height,
|
| cm->width, cm->height);
|
| -
|
| +#endif
|
| if (vp9_is_scaled(&ref_buf->sf))
|
| vp9_extend_frame_borders(buf);
|
| }
|
| @@ -2766,7 +2774,16 @@
|
| if (oxcf->pass == 1 &&
|
| (!cpi->use_svc || is_two_pass_svc(cpi))) {
|
| const int lossless = is_lossless_requested(oxcf);
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| + if (cpi->oxcf.use_highbitdepth)
|
| + cpi->mb.fwd_txm4x4 = lossless ? vp9_high_fwht4x4 : vp9_high_fdct4x4;
|
| + else
|
| + cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4;
|
| + cpi->mb.high_itxm_add = lossless ? vp9_high_iwht4x4_add :
|
| + vp9_high_idct4x4_add;
|
| +#else
|
| cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4;
|
| +#endif
|
| cpi->mb.itxm_add = lossless ? vp9_iwht4x4_add : vp9_idct4x4_add;
|
| vp9_first_pass(cpi, source);
|
| } else if (oxcf->pass == 2 &&
|
| @@ -2882,6 +2899,12 @@
|
| }
|
|
|
| #endif
|
| +
|
| + if (is_two_pass_svc(cpi) && cm->show_frame) {
|
| + ++cpi->svc.spatial_layer_to_encode;
|
| + if (cpi->svc.spatial_layer_to_encode >= cpi->svc.number_spatial_layers)
|
| + cpi->svc.spatial_layer_to_encode = 0;
|
| + }
|
| return 0;
|
| }
|
|
|
|
|