| Index: source/libvpx/vp9/encoder/vp9_encoder.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_encoder.c (revision 290053)
|
| +++ source/libvpx/vp9/encoder/vp9_encoder.c (working copy)
|
| @@ -65,9 +65,6 @@
|
| #ifdef OUTPUT_YUV_DENOISED
|
| FILE *yuv_denoised_file = NULL;
|
| #endif
|
| -#ifdef OUTPUT_YUV_SRC
|
| -FILE *yuv_file;
|
| -#endif
|
| #ifdef OUTPUT_YUV_REC
|
| FILE *yuv_rec_file;
|
| #endif
|
| @@ -131,7 +128,8 @@
|
| }
|
|
|
| if (cm->frame_type == KEY_FRAME) {
|
| - cpi->refresh_golden_frame = 1;
|
| + if (!is_spatial_svc(cpi))
|
| + cpi->refresh_golden_frame = 1;
|
| cpi->refresh_alt_ref_frame = 1;
|
| } else {
|
| cm->fc = cm->frame_contexts[cm->frame_context_idx];
|
| @@ -476,7 +474,7 @@
|
| vp9_init_context_buffers(cm);
|
| init_macroblockd(cm, xd);
|
|
|
| - if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) {
|
| + if (is_spatial_svc(cpi)) {
|
| if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer,
|
| cm->width, cm->height,
|
| cm->subsampling_x, cm->subsampling_y,
|
| @@ -487,7 +485,7 @@
|
| }
|
|
|
| void vp9_new_framerate(VP9_COMP *cpi, double framerate) {
|
| - cpi->oxcf.framerate = framerate < 0.1 ? 30 : framerate;
|
| + cpi->framerate = framerate < 0.1 ? 30 : framerate;
|
| vp9_rc_update_framerate(cpi);
|
| }
|
|
|
| @@ -520,9 +518,11 @@
|
| VP9_COMMON *const cm = &cpi->common;
|
|
|
| cpi->oxcf = *oxcf;
|
| + cpi->framerate = oxcf->init_framerate;
|
|
|
| cm->profile = oxcf->profile;
|
| cm->bit_depth = oxcf->bit_depth;
|
| + cm->color_space = UNKNOWN;
|
|
|
| cm->width = oxcf->width;
|
| cm->height = oxcf->height;
|
| @@ -551,23 +551,6 @@
|
| set_tile_limits(cpi);
|
| }
|
|
|
| -static int get_pass(MODE mode) {
|
| - switch (mode) {
|
| - case REALTIME:
|
| - case ONE_PASS_GOOD:
|
| - case ONE_PASS_BEST:
|
| - return 0;
|
| -
|
| - case TWO_PASS_FIRST:
|
| - return 1;
|
| -
|
| - case TWO_PASS_SECOND_GOOD:
|
| - case TWO_PASS_SECOND_BEST:
|
| - return 2;
|
| - }
|
| - return -1;
|
| -}
|
| -
|
| void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
|
| VP9_COMMON *const cm = &cpi->common;
|
| RATE_CONTROL *const rc = &cpi->rc;
|
| @@ -582,7 +565,6 @@
|
| assert(cm->bit_depth > BITS_8);
|
|
|
| cpi->oxcf = *oxcf;
|
| - cpi->pass = get_pass(cpi->oxcf.mode);
|
|
|
| rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
|
|
|
| @@ -630,7 +612,7 @@
|
| rc->buffer_level = MIN(rc->buffer_level, rc->maximum_buffer_size);
|
|
|
| // Set up frame rate and related parameters rate control values.
|
| - vp9_new_framerate(cpi, cpi->oxcf.framerate);
|
| + vp9_new_framerate(cpi, cpi->framerate);
|
|
|
| // Set absolute upper and lower quality limits
|
| rc->worst_quality = cpi->oxcf.worst_allowed_q;
|
| @@ -652,7 +634,7 @@
|
|
|
| if ((cpi->svc.number_temporal_layers > 1 &&
|
| cpi->oxcf.rc_mode == VPX_CBR) ||
|
| - (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) {
|
| + (cpi->svc.number_spatial_layers > 1 && cpi->oxcf.pass == 2)) {
|
| vp9_update_layer_context_change_config(cpi,
|
| (int)cpi->oxcf.target_bandwidth);
|
| }
|
| @@ -671,7 +653,7 @@
|
| cpi->ext_refresh_frame_flags_pending = 0;
|
| cpi->ext_refresh_frame_context_pending = 0;
|
|
|
| -#if CONFIG_DENOISING
|
| +#if CONFIG_VP9_TEMPORAL_DENOISING
|
| if (cpi->oxcf.noise_sensitivity > 0) {
|
| vp9_denoiser_alloc(&(cpi->denoiser), cm->width, cm->height,
|
| cm->subsampling_x, cm->subsampling_y,
|
| @@ -746,7 +728,7 @@
|
| cpi->use_svc = 0;
|
|
|
| init_config(cpi, oxcf);
|
| - vp9_rc_init(&cpi->oxcf, cpi->pass, &cpi->rc);
|
| + vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc);
|
|
|
| cm->current_video_frame = 0;
|
|
|
| @@ -798,7 +780,7 @@
|
| // pending further tuning and testing. The code is left in place here
|
| // as a place holder in regard to the required paths.
|
| cpi->multi_arf_last_grp_enabled = 0;
|
| - if (cpi->pass == 2) {
|
| + if (oxcf->pass == 2) {
|
| if (cpi->use_svc) {
|
| cpi->multi_arf_allowed = 0;
|
| cpi->multi_arf_enabled = 0;
|
| @@ -865,14 +847,11 @@
|
| cpi->mb.nmvsadcost_hp[1] = &cpi->mb.nmvsadcosts_hp[1][MV_MAX];
|
| cal_nmvsadcosts_hp(cpi->mb.nmvsadcost_hp);
|
|
|
| -#if CONFIG_DENOISING
|
| +#if CONFIG_VP9_TEMPORAL_DENOISING
|
| #ifdef OUTPUT_YUV_DENOISED
|
| yuv_denoised_file = fopen("denoised.yuv", "ab");
|
| #endif
|
| #endif
|
| -#ifdef OUTPUT_YUV_SRC
|
| - yuv_file = fopen("bd.yuv", "ab");
|
| -#endif
|
| #ifdef OUTPUT_YUV_REC
|
| yuv_rec_file = fopen("rec.yuv", "wb");
|
| #endif
|
| @@ -886,9 +865,9 @@
|
|
|
| cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
|
|
|
| - if (cpi->pass == 1) {
|
| + if (oxcf->pass == 1) {
|
| vp9_init_first_pass(cpi);
|
| - } else if (cpi->pass == 2) {
|
| + } else if (oxcf->pass == 2) {
|
| const size_t packet_sz = sizeof(FIRSTPASS_STATS);
|
| const int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
|
|
|
| @@ -1034,10 +1013,6 @@
|
| vp9_sub_pixel_avg_variance4x4,
|
| vp9_sad4x4x3, vp9_sad4x4x8, vp9_sad4x4x4d)
|
|
|
| - cpi->full_search_sad = vp9_full_search_sad;
|
| - cpi->diamond_search_sad = vp9_diamond_search_sad;
|
| - cpi->refining_search_sad = vp9_refining_search_sad;
|
| -
|
| /* vp9_init_quantizer() is first called here. Add check in
|
| * vp9_frame_init_quantizer() so that vp9_init_quantizer is only
|
| * called later when needed. This will avoid unnecessary calls of
|
| @@ -1064,7 +1039,7 @@
|
| vp9_clear_system_state();
|
|
|
| // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count);
|
| - if (cpi->pass != 1) {
|
| + if (cpi->oxcf.pass != 1) {
|
| FILE *f = fopen("opsnr.stt", "a");
|
| double time_encoded = (cpi->last_end_time_stamp_seen
|
| - cpi->first_time_stamp_ever) / 10000000.000;
|
| @@ -1119,7 +1094,7 @@
|
| #endif
|
| }
|
|
|
| -#if CONFIG_DENOISING
|
| +#if CONFIG_VP9_TEMPORAL_DENOISING
|
| if (cpi->oxcf.noise_sensitivity > 0) {
|
| vp9_denoiser_free(&(cpi->denoiser));
|
| }
|
| @@ -1143,14 +1118,11 @@
|
| vp9_remove_common(&cpi->common);
|
| vpx_free(cpi);
|
|
|
| -#if CONFIG_DENOISING
|
| +#if CONFIG_VP9_TEMPORAL_DENOISING
|
| #ifdef OUTPUT_YUV_DENOISED
|
| fclose(yuv_denoised_file);
|
| #endif
|
| #endif
|
| -#ifdef OUTPUT_YUV_SRC
|
| - fclose(yuv_file);
|
| -#endif
|
| #ifdef OUTPUT_YUV_REC
|
| fclose(yuv_rec_file);
|
| #endif
|
| @@ -1301,16 +1273,6 @@
|
| }
|
| }
|
|
|
| -int vp9_get_reference_enc(VP9_COMP *cpi, int index, YV12_BUFFER_CONFIG **fb) {
|
| - VP9_COMMON *cm = &cpi->common;
|
| -
|
| - if (index < 0 || index >= REF_FRAMES)
|
| - return -1;
|
| -
|
| - *fb = &cm->frame_bufs[cm->ref_frame_map[index]].buf;
|
| - return 0;
|
| -}
|
| -
|
| int vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
|
| YV12_BUFFER_CONFIG *sd) {
|
| YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
|
| @@ -1328,36 +1290,7 @@
|
| return 0;
|
| }
|
|
|
| -
|
| -#if defined(OUTPUT_YUV_SRC)
|
| -void vp9_write_yuv_frame(YV12_BUFFER_CONFIG *s, FILE *f) {
|
| - uint8_t *src = s->y_buffer;
|
| - int h = s->y_height;
|
| -
|
| - do {
|
| - fwrite(src, s->y_width, 1, f);
|
| - src += s->y_stride;
|
| - } while (--h);
|
| -
|
| - src = s->u_buffer;
|
| - h = s->uv_height;
|
| -
|
| - do {
|
| - fwrite(src, s->uv_width, 1, f);
|
| - src += s->uv_stride;
|
| - } while (--h);
|
| -
|
| - src = s->v_buffer;
|
| - h = s->uv_height;
|
| -
|
| - do {
|
| - fwrite(src, s->uv_width, 1, f);
|
| - src += s->uv_stride;
|
| - } while (--h);
|
| -}
|
| -#endif
|
| -
|
| -#if CONFIG_DENOISING
|
| +#if CONFIG_VP9_TEMPORAL_DENOISING
|
| #if defined(OUTPUT_YUV_DENOISED)
|
| // The denoiser buffer is allocated as a YUV 440 buffer. This function writes it
|
| // as YUV 420. We simply use the top-left pixels of the UV buffers, since we do
|
| @@ -1563,17 +1496,15 @@
|
| &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx);
|
| ref_cnt_fb(cm->frame_bufs,
|
| &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx);
|
| - } else if (!cpi->multi_arf_allowed && cpi->refresh_golden_frame &&
|
| - cpi->rc.is_src_frame_alt_ref && !cpi->use_svc) {
|
| - /* Preserve the previously existing golden frame and update the frame in
|
| - * the alt ref slot instead. This is highly specific to the current use of
|
| - * alt-ref as a forward reference, and this needs to be generalized as
|
| - * other uses are implemented (like RTC/temporal scaling)
|
| - *
|
| - * The update to the buffer in the alt ref slot was signaled in
|
| - * vp9_pack_bitstream(), now swap the buffer pointers so that it's treated
|
| - * as the golden frame next time.
|
| - */
|
| + } else if (vp9_preserve_existing_gf(cpi)) {
|
| + // We have decided to preserve the previously existing golden frame as our
|
| + // new ARF frame. However, in the short term in function
|
| + // vp9_bitstream.c::get_refresh_mask() we left it in the GF slot and, if
|
| + // we're updating the GF with the current decoded frame, we save it to the
|
| + // ARF slot instead.
|
| + // We now have to update the ARF with the current frame and swap gld_fb_idx
|
| + // and alt_fb_idx so that, overall, we've stored the old GF in the new ARF
|
| + // slot and, if we're updating the GF, the current frame becomes the new GF.
|
| int tmp;
|
|
|
| ref_cnt_fb(cm->frame_bufs,
|
| @@ -1582,10 +1513,15 @@
|
| tmp = cpi->alt_fb_idx;
|
| cpi->alt_fb_idx = cpi->gld_fb_idx;
|
| cpi->gld_fb_idx = tmp;
|
| +
|
| + if (is_spatial_svc(cpi)) {
|
| + cpi->svc.layer_context[0].gold_ref_idx = cpi->gld_fb_idx;
|
| + cpi->svc.layer_context[0].alt_ref_idx = cpi->alt_fb_idx;
|
| + }
|
| } else { /* For non key/golden frames */
|
| if (cpi->refresh_alt_ref_frame) {
|
| int arf_idx = cpi->alt_fb_idx;
|
| - if ((cpi->pass == 2) && cpi->multi_arf_allowed) {
|
| + if ((cpi->oxcf.pass == 2) && cpi->multi_arf_allowed) {
|
| const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
|
| arf_idx = gf_group->arf_update_idx[gf_group->index];
|
| }
|
| @@ -1604,7 +1540,7 @@
|
| ref_cnt_fb(cm->frame_bufs,
|
| &cm->ref_frame_map[cpi->lst_fb_idx], cm->new_fb_idx);
|
| }
|
| -#if CONFIG_DENOISING
|
| +#if CONFIG_VP9_TEMPORAL_DENOISING
|
| if (cpi->oxcf.noise_sensitivity > 0) {
|
| vp9_denoiser_update_frame_info(&cpi->denoiser,
|
| *cpi->Source,
|
| @@ -1724,8 +1660,8 @@
|
| cpi->rc.total_actual_bits, cm->base_qindex,
|
| vp9_convert_qindex_to_q(cm->base_qindex),
|
| (double)vp9_dc_quant(cm->base_qindex, 0) / 4.0,
|
| + vp9_convert_qindex_to_q(cpi->twopass.active_worst_quality),
|
| cpi->rc.avg_q,
|
| - vp9_convert_qindex_to_q(cpi->rc.ni_av_qi),
|
| vp9_convert_qindex_to_q(cpi->oxcf.cq_level),
|
| cpi->refresh_last_frame, cpi->refresh_golden_frame,
|
| cpi->refresh_alt_ref_frame, cm->frame_type, cpi->rc.gfu_boost,
|
| @@ -2001,7 +1937,8 @@
|
| if (cpi->gold_is_last)
|
| cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
|
|
|
| - if (cpi->rc.frames_till_gf_update_due == INT_MAX)
|
| + if (cpi->rc.frames_till_gf_update_due == INT_MAX &&
|
| + !is_spatial_svc(cpi))
|
| cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
|
|
|
| if (cpi->alt_is_last)
|
| @@ -2047,9 +1984,7 @@
|
| // according to the variance
|
|
|
| SVC *const svc = &cpi->svc;
|
| - const int is_spatial_svc = (svc->number_spatial_layers > 1) &&
|
| - (svc->number_temporal_layers == 1);
|
| - TWO_PASS *const twopass = is_spatial_svc ?
|
| + TWO_PASS *const twopass = is_spatial_svc(cpi) ?
|
| &svc->layer_context[svc->spatial_layer_id].twopass
|
| : &cpi->twopass;
|
|
|
| @@ -2067,7 +2002,7 @@
|
| VP9_COMMON *const cm = &cpi->common;
|
| int arf_sign_bias;
|
|
|
| - if ((cpi->pass == 2) && cpi->multi_arf_allowed) {
|
| + if ((cpi->oxcf.pass == 2) && cpi->multi_arf_allowed) {
|
| const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
|
| arf_sign_bias = cpi->rc.source_alt_ref_active &&
|
| (!cpi->refresh_alt_ref_frame ||
|
| @@ -2155,9 +2090,7 @@
|
| (cpi->oxcf.frame_parallel_decoding_mode != 0);
|
|
|
| // By default, encoder assumes decoder can use prev_mi.
|
| - cm->coding_use_prev_mi = 1;
|
| if (cm->error_resilient_mode) {
|
| - cm->coding_use_prev_mi = 0;
|
| cm->frame_parallel_decoding_mode = 1;
|
| cm->reset_frame_context = 0;
|
| cm->refresh_frame_context = 0;
|
| @@ -2171,19 +2104,19 @@
|
| // static regions if indicated.
|
| // Only allowed in second pass of two pass (as requires lagged coding)
|
| // and if the relevant speed feature flag is set.
|
| - if (cpi->pass == 2 && cpi->sf.static_segmentation)
|
| + if (cpi->oxcf.pass == 2 && cpi->sf.static_segmentation)
|
| configure_static_seg_features(cpi);
|
|
|
| // Check if the current frame is skippable for the partition search in the
|
| // second pass according to the first pass stats
|
| - if (cpi->pass == 2 &&
|
| - (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) {
|
| + if (cpi->oxcf.pass == 2 &&
|
| + (!cpi->use_svc || is_spatial_svc(cpi))) {
|
| configure_skippable_frame(cpi);
|
| }
|
|
|
| // For 1 pass CBR, check if we are dropping this frame.
|
| // Never drop on key frame.
|
| - if (cpi->pass == 0 &&
|
| + if (cpi->oxcf.pass == 0 &&
|
| cpi->oxcf.rc_mode == VPX_CBR &&
|
| cm->frame_type != KEY_FRAME) {
|
| if (vp9_rc_drop_frame(cpi)) {
|
| @@ -2220,10 +2153,6 @@
|
| }
|
| #endif
|
|
|
| -#ifdef OUTPUT_YUV_SRC
|
| - vp9_write_yuv_frame(cpi->Source, yuv_file);
|
| -#endif
|
| -
|
| set_speed_features(cpi);
|
|
|
| // Decide q and q bounds.
|
| @@ -2241,7 +2170,7 @@
|
| encode_with_recode_loop(cpi, size, dest, q, bottom_index, top_index);
|
| }
|
|
|
| -#if CONFIG_DENOISING
|
| +#if CONFIG_VP9_TEMPORAL_DENOISING
|
| #ifdef OUTPUT_YUV_DENOISED
|
| if (cpi->oxcf.noise_sensitivity > 0) {
|
| vp9_write_yuv_frame_420(&cpi->denoiser.running_avg_y[INTRA_FRAME],
|
| @@ -2429,7 +2358,7 @@
|
| vpx_usec_timer_start(&timer);
|
|
|
| #if CONFIG_SPATIAL_SVC
|
| - if (cpi->use_svc && cpi->svc.number_temporal_layers == 1)
|
| + if (is_spatial_svc(cpi))
|
| res = vp9_svc_lookahead_push(cpi, cpi->lookahead, sd, time_stamp, end_time,
|
| frame_flags);
|
| else
|
| @@ -2441,11 +2370,18 @@
|
| vpx_usec_timer_mark(&timer);
|
| cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
|
|
|
| - if (cm->profile == PROFILE_0 && (subsampling_x != 1 || subsampling_y != 1)) {
|
| + if ((cm->profile == PROFILE_0 || cm->profile == PROFILE_2) &&
|
| + (subsampling_x != 1 || subsampling_y != 1)) {
|
| vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
|
| - "Non-4:2:0 color space requires profile >= 1");
|
| + "Non-4:2:0 color space requires profile 1 or 3");
|
| res = -1;
|
| }
|
| + if ((cm->profile == PROFILE_1 || cm->profile == PROFILE_3) &&
|
| + (subsampling_x == 1 && subsampling_y == 1)) {
|
| + vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
|
| + "4:2:0 color space requires profile 0 or 2");
|
| + res = -1;
|
| + }
|
|
|
| return res;
|
| }
|
| @@ -2465,17 +2401,18 @@
|
| }
|
|
|
| void adjust_frame_rate(VP9_COMP *cpi) {
|
| + const struct lookahead_entry *const source = cpi->source;
|
| int64_t this_duration;
|
| int step = 0;
|
|
|
| - if (cpi->source->ts_start == cpi->first_time_stamp_ever) {
|
| - this_duration = cpi->source->ts_end - cpi->source->ts_start;
|
| + if (source->ts_start == cpi->first_time_stamp_ever) {
|
| + this_duration = source->ts_end - source->ts_start;
|
| step = 1;
|
| } else {
|
| int64_t last_duration = cpi->last_end_time_stamp_seen
|
| - cpi->last_time_stamp_seen;
|
|
|
| - this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
|
| + this_duration = source->ts_end - cpi->last_end_time_stamp_seen;
|
|
|
| // do a step update if the duration changes by 10%
|
| if (last_duration)
|
| @@ -2489,17 +2426,17 @@
|
| // Average this frame's rate into the last second's average
|
| // frame rate. If we haven't seen 1 second yet, then average
|
| // over the whole interval seen.
|
| - const double interval = MIN((double)(cpi->source->ts_end
|
| + const double interval = MIN((double)(source->ts_end
|
| - cpi->first_time_stamp_ever), 10000000.0);
|
| - double avg_duration = 10000000.0 / cpi->oxcf.framerate;
|
| + double avg_duration = 10000000.0 / cpi->framerate;
|
| avg_duration *= (interval - avg_duration + this_duration);
|
| avg_duration /= interval;
|
|
|
| vp9_new_framerate(cpi, 10000000.0 / avg_duration);
|
| }
|
| }
|
| - cpi->last_time_stamp_seen = cpi->source->ts_start;
|
| - cpi->last_end_time_stamp_seen = cpi->source->ts_end;
|
| + cpi->last_time_stamp_seen = source->ts_start;
|
| + cpi->last_end_time_stamp_seen = source->ts_end;
|
| }
|
|
|
| // Returns 0 if this is not an alt ref else the offset of the source frame
|
| @@ -2508,7 +2445,7 @@
|
| RATE_CONTROL *const rc = &cpi->rc;
|
| int arf_src_index = 0;
|
| if (is_altref_enabled(cpi)) {
|
| - if (cpi->pass == 2) {
|
| + if (cpi->oxcf.pass == 2) {
|
| const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
|
| if (gf_group->update_type[gf_group->index] == ARF_UPDATE) {
|
| arf_src_index = gf_group->arf_src_offset[gf_group->index];
|
| @@ -2523,7 +2460,7 @@
|
| static void check_src_altref(VP9_COMP *cpi) {
|
| RATE_CONTROL *const rc = &cpi->rc;
|
|
|
| - if (cpi->pass == 2) {
|
| + if (cpi->oxcf.pass == 2) {
|
| const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
|
| rc->is_src_frame_alt_ref =
|
| (gf_group->update_type[gf_group->index] == OVERLAY_UPDATE);
|
| @@ -2545,6 +2482,7 @@
|
| int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags,
|
| size_t *size, uint8_t *dest,
|
| int64_t *time_stamp, int64_t *time_end, int flush) {
|
| + const VP9EncoderConfig *const oxcf = &cpi->oxcf;
|
| VP9_COMMON *const cm = &cpi->common;
|
| MACROBLOCKD *const xd = &cpi->mb.e_mbd;
|
| RATE_CONTROL *const rc = &cpi->rc;
|
| @@ -2552,14 +2490,8 @@
|
| YV12_BUFFER_CONFIG *force_src_buffer = NULL;
|
| MV_REFERENCE_FRAME ref_frame;
|
| int arf_src_index;
|
| - const int is_spatial_svc = cpi->use_svc &&
|
| - (cpi->svc.number_temporal_layers == 1) &&
|
| - (cpi->svc.number_spatial_layers > 1);
|
|
|
| - if (!cpi)
|
| - return -1;
|
| -
|
| - if (is_spatial_svc && cpi->pass == 2) {
|
| + if (is_spatial_svc(cpi) && oxcf->pass == 2) {
|
| #if CONFIG_SPATIAL_SVC
|
| vp9_svc_lookahead_peek(cpi, cpi->lookahead, 0, 1);
|
| #endif
|
| @@ -2586,7 +2518,7 @@
|
| assert(arf_src_index <= rc->frames_to_key);
|
|
|
| #if CONFIG_SPATIAL_SVC
|
| - if (is_spatial_svc)
|
| + if (is_spatial_svc(cpi))
|
| cpi->source = vp9_svc_lookahead_peek(cpi, cpi->lookahead,
|
| arf_src_index, 0);
|
| else
|
| @@ -2596,11 +2528,11 @@
|
| cpi->alt_ref_source = cpi->source;
|
|
|
| #if CONFIG_SPATIAL_SVC
|
| - if (is_spatial_svc && cpi->svc.spatial_layer_id > 0) {
|
| + if (is_spatial_svc(cpi) && cpi->svc.spatial_layer_id > 0) {
|
| int i;
|
| // Reference a hidden frame from a lower layer
|
| for (i = cpi->svc.spatial_layer_id - 1; i >= 0; --i) {
|
| - if (cpi->oxcf.ss_play_alternate[i]) {
|
| + if (oxcf->ss_play_alternate[i]) {
|
| cpi->gld_fb_idx = cpi->svc.layer_context[i].alt_ref_idx;
|
| break;
|
| }
|
| @@ -2609,7 +2541,7 @@
|
| cpi->svc.layer_context[cpi->svc.spatial_layer_id].has_alt_frame = 1;
|
| #endif
|
|
|
| - if (cpi->oxcf.arnr_max_frames > 0) {
|
| + if (oxcf->arnr_max_frames > 0) {
|
| // Produce the filtered ARF frame.
|
| vp9_temporal_filter(cpi, arf_src_index);
|
| vp9_extend_frame_borders(&cpi->alt_ref_buffer);
|
| @@ -2631,7 +2563,7 @@
|
| // Get last frame source.
|
| if (cm->current_video_frame > 0) {
|
| #if CONFIG_SPATIAL_SVC
|
| - if (is_spatial_svc)
|
| + if (is_spatial_svc(cpi))
|
| cpi->last_source = vp9_svc_lookahead_peek(cpi, cpi->lookahead, -1, 0);
|
| else
|
| #endif
|
| @@ -2642,7 +2574,7 @@
|
|
|
| // Read in the source frame.
|
| #if CONFIG_SPATIAL_SVC
|
| - if (is_spatial_svc)
|
| + if (is_spatial_svc(cpi))
|
| cpi->source = vp9_svc_lookahead_pop(cpi, cpi->lookahead, flush);
|
| else
|
| #endif
|
| @@ -2660,11 +2592,8 @@
|
| cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer
|
| : &cpi->source->img;
|
|
|
| - if (cpi->last_source != NULL) {
|
| - cpi->unscaled_last_source = &cpi->last_source->img;
|
| - } else {
|
| - cpi->unscaled_last_source = NULL;
|
| - }
|
| + cpi->unscaled_last_source = cpi->last_source != NULL ?
|
| + &cpi->last_source->img : NULL;
|
|
|
| *time_stamp = cpi->source->ts_start;
|
| *time_end = cpi->source->ts_end;
|
| @@ -2673,7 +2602,7 @@
|
|
|
| } else {
|
| *size = 0;
|
| - if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) {
|
| + if (flush && oxcf->pass == 1 && !cpi->twopass.first_pass_done) {
|
| vp9_end_first_pass(cpi); /* get last stats packet */
|
| cpi->twopass.first_pass_done = 1;
|
| }
|
| @@ -2694,7 +2623,7 @@
|
| }
|
|
|
| if (cpi->svc.number_temporal_layers > 1 &&
|
| - cpi->oxcf.rc_mode == VPX_CBR) {
|
| + oxcf->rc_mode == VPX_CBR) {
|
| vp9_update_temporal_layer_framerate(cpi);
|
| vp9_restore_layer_context(cpi);
|
| }
|
| @@ -2711,7 +2640,7 @@
|
| if (!cpi->use_svc && cpi->multi_arf_allowed) {
|
| if (cm->frame_type == KEY_FRAME) {
|
| init_buffer_indices(cpi);
|
| - } else if (cpi->pass == 2) {
|
| + } else if (oxcf->pass == 2) {
|
| const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
|
| cpi->alt_fb_idx = gf_group->arf_ref_idx[gf_group->index];
|
| }
|
| @@ -2719,13 +2648,13 @@
|
|
|
| cpi->frame_flags = *frame_flags;
|
|
|
| - if (cpi->pass == 2 &&
|
| + if (oxcf->pass == 2 &&
|
| cm->current_video_frame == 0 &&
|
| - cpi->oxcf.allow_spatial_resampling &&
|
| - cpi->oxcf.rc_mode == VPX_VBR) {
|
| + oxcf->allow_spatial_resampling &&
|
| + oxcf->rc_mode == VPX_VBR) {
|
| // Internal scaling is triggered on the first frame.
|
| - vp9_set_size_literal(cpi, cpi->oxcf.scaled_frame_width,
|
| - cpi->oxcf.scaled_frame_height);
|
| + vp9_set_size_literal(cpi, oxcf->scaled_frame_width,
|
| + oxcf->scaled_frame_height);
|
| }
|
|
|
| // Reset the frame pointers to the current frame size
|
| @@ -2753,18 +2682,18 @@
|
|
|
| set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
|
|
|
| - if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
| + if (oxcf->aq_mode == VARIANCE_AQ) {
|
| vp9_vaq_init();
|
| }
|
|
|
| - if (cpi->pass == 1 &&
|
| - (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) {
|
| - const int lossless = is_lossless_requested(&cpi->oxcf);
|
| + if (oxcf->pass == 1 &&
|
| + (!cpi->use_svc || is_spatial_svc(cpi))) {
|
| + const int lossless = is_lossless_requested(oxcf);
|
| cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4;
|
| cpi->mb.itxm_add = lossless ? vp9_iwht4x4_add : vp9_idct4x4_add;
|
| vp9_first_pass(cpi);
|
| - } else if (cpi->pass == 2 &&
|
| - (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) {
|
| + } else if (oxcf->pass == 2 &&
|
| + (!cpi->use_svc || is_spatial_svc(cpi))) {
|
| Pass2Encode(cpi, size, dest, frame_flags);
|
| } else if (cpi->use_svc) {
|
| SvcEncode(cpi, size, dest, frame_flags);
|
| @@ -2787,20 +2716,20 @@
|
|
|
| // Save layer specific state.
|
| if ((cpi->svc.number_temporal_layers > 1 &&
|
| - cpi->oxcf.rc_mode == VPX_CBR) ||
|
| - (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) {
|
| + oxcf->rc_mode == VPX_CBR) ||
|
| + (cpi->svc.number_spatial_layers > 1 && oxcf->pass == 2)) {
|
| vp9_save_layer_context(cpi);
|
| }
|
|
|
| vpx_usec_timer_mark(&cmptimer);
|
| cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
|
|
|
| - if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
|
| + if (cpi->b_calculate_psnr && oxcf->pass != 1 && cm->show_frame)
|
| generate_psnr_packet(cpi);
|
|
|
| #if CONFIG_INTERNAL_STATS
|
|
|
| - if (cpi->pass != 1) {
|
| + if (oxcf->pass != 1) {
|
| cpi->bytes += (int)(*size);
|
|
|
| if (cm->show_frame) {
|
|
|