diff options
Diffstat (limited to 'third_party/libaom/source/libaom/av1/encoder/encoder_utils.c')
-rw-r--r-- | third_party/libaom/source/libaom/av1/encoder/encoder_utils.c | 125 |
1 files changed, 67 insertions, 58 deletions
diff --git a/third_party/libaom/source/libaom/av1/encoder/encoder_utils.c b/third_party/libaom/source/libaom/av1/encoder/encoder_utils.c index 7a7e8505b4..557268f9d3 100644 --- a/third_party/libaom/source/libaom/av1/encoder/encoder_utils.c +++ b/third_party/libaom/source/libaom/av1/encoder/encoder_utils.c @@ -344,7 +344,7 @@ static void configure_static_seg_features(AV1_COMP *cpi) { seg->update_data = 1; qi_delta = av1_compute_qdelta(rc, rc->avg_q, rc->avg_q * 0.875, - cm->seq_params.bit_depth); + cm->seq_params->bit_depth); av1_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta - 2); av1_set_segdata(seg, 1, SEG_LVL_ALT_LF_Y_H, -2); av1_set_segdata(seg, 1, SEG_LVL_ALT_LF_Y_V, -2); @@ -459,13 +459,13 @@ void av1_apply_active_map(AV1_COMP *cpi) { #if !CONFIG_REALTIME_ONLY static void process_tpl_stats_frame(AV1_COMP *cpi) { - const GF_GROUP *const gf_group = &cpi->gf_group; + const GF_GROUP *const gf_group = &cpi->ppi->gf_group; AV1_COMMON *const cm = &cpi->common; - assert(IMPLIES(gf_group->size > 0, gf_group->index < gf_group->size)); + assert(IMPLIES(gf_group->size > 0, cpi->gf_frame_index < gf_group->size)); - const int tpl_idx = gf_group->index; - TplParams *const tpl_data = &cpi->tpl_data; + const int tpl_idx = cpi->gf_frame_index; + TplParams *const tpl_data = &cpi->ppi->tpl_data; TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx]; TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; @@ -497,22 +497,23 @@ static void process_tpl_stats_frame(AV1_COMP *cpi) { } else { aom_clear_system_state(); cpi->rd.r0 = (double)intra_cost_base / mc_dep_cost_base; - if (is_frame_tpl_eligible(gf_group, gf_group->index)) { - if (cpi->lap_enabled) { - double min_boost_factor = sqrt(cpi->rc.baseline_gf_interval); + if (is_frame_tpl_eligible(gf_group, cpi->gf_frame_index)) { + if (cpi->ppi->lap_enabled) { + double min_boost_factor = sqrt(cpi->ppi->p_rc.baseline_gf_interval); const int gfu_boost = get_gfu_boost_from_r0_lap( min_boost_factor, MAX_GFUBOOST_FACTOR, cpi->rd.r0, - cpi->rc.num_stats_required_for_gfu_boost); + cpi->ppi->p_rc.num_stats_required_for_gfu_boost); // printf("old boost %d new boost %d\n", cpi->rc.gfu_boost, // gfu_boost); - cpi->rc.gfu_boost = combine_prior_with_tpl_boost( - min_boost_factor, MAX_BOOST_COMBINE_FACTOR, cpi->rc.gfu_boost, - gfu_boost, cpi->rc.num_stats_used_for_gfu_boost); + cpi->ppi->p_rc.gfu_boost = combine_prior_with_tpl_boost( + min_boost_factor, MAX_BOOST_COMBINE_FACTOR, + cpi->ppi->p_rc.gfu_boost, gfu_boost, + cpi->ppi->p_rc.num_stats_used_for_gfu_boost); } else { const int gfu_boost = (int)(200.0 / cpi->rd.r0); - cpi->rc.gfu_boost = combine_prior_with_tpl_boost( + cpi->ppi->p_rc.gfu_boost = combine_prior_with_tpl_boost( MIN_BOOST_COMBINE_FACTOR, MAX_BOOST_COMBINE_FACTOR, - cpi->rc.gfu_boost, gfu_boost, cpi->rc.frames_to_key); + cpi->ppi->p_rc.gfu_boost, gfu_boost, cpi->rc.frames_to_key); } } aom_clear_system_state(); @@ -529,17 +530,17 @@ void av1_set_size_dependent_vars(AV1_COMP *cpi, int *q, int *bottom_index, av1_set_speed_features_framesize_dependent(cpi, cpi->speed); #if !CONFIG_REALTIME_ONLY - GF_GROUP *gf_group = &cpi->gf_group; + GF_GROUP *gf_group = &cpi->ppi->gf_group; if (cpi->oxcf.algo_cfg.enable_tpl_model && - is_frame_tpl_eligible(gf_group, gf_group->index)) { + is_frame_tpl_eligible(gf_group, cpi->gf_frame_index)) { process_tpl_stats_frame(cpi); av1_tpl_rdmult_setup(cpi); } #endif // Decide q and q bounds. - *q = av1_rc_pick_q_and_bounds(cpi, &cpi->rc, cm->width, cm->height, - cpi->gf_group.index, bottom_index, top_index); + *q = av1_rc_pick_q_and_bounds(cpi, cm->width, cm->height, cpi->gf_frame_index, + bottom_index, top_index); // Configure experimental use of segmentation for enhanced coding of // static regions if indicated. @@ -564,6 +565,23 @@ static void reset_film_grain_chroma_params(aom_film_grain_t *pars) { memset(pars->ar_coeffs_cb, 0, sizeof(pars->ar_coeffs_cb)); } +void av1_update_film_grain_parameters_seq(struct AV1_PRIMARY *ppi, + const AV1EncoderConfig *oxcf) { + SequenceHeader *const seq_params = &ppi->seq_params; + const TuneCfg *const tune_cfg = &oxcf->tune_cfg; + + if (tune_cfg->film_grain_test_vector || tune_cfg->film_grain_table_filename || + tune_cfg->content == AOM_CONTENT_FILM) { + seq_params->film_grain_params_present = 1; + } else { +#if CONFIG_DENOISE + seq_params->film_grain_params_present = (oxcf->noise_level > 0); +#else + seq_params->film_grain_params_present = 0; +#endif + } +} + void av1_update_film_grain_parameters(struct AV1_COMP *cpi, const AV1EncoderConfig *oxcf) { AV1_COMMON *const cm = &cpi->common; @@ -577,39 +595,30 @@ void av1_update_film_grain_parameters(struct AV1_COMP *cpi, } if (tune_cfg->film_grain_test_vector) { - cm->seq_params.film_grain_params_present = 1; if (cm->current_frame.frame_type == KEY_FRAME) { memcpy(&cm->film_grain_params, film_grain_test_vectors + tune_cfg->film_grain_test_vector - 1, sizeof(cm->film_grain_params)); if (oxcf->tool_cfg.enable_monochrome) reset_film_grain_chroma_params(&cm->film_grain_params); - cm->film_grain_params.bit_depth = cm->seq_params.bit_depth; - if (cm->seq_params.color_range == AOM_CR_FULL_RANGE) { + cm->film_grain_params.bit_depth = cm->seq_params->bit_depth; + if (cm->seq_params->color_range == AOM_CR_FULL_RANGE) { cm->film_grain_params.clip_to_restricted_range = 0; } } } else if (tune_cfg->film_grain_table_filename) { - cm->seq_params.film_grain_params_present = 1; - cpi->film_grain_table = aom_malloc(sizeof(*cpi->film_grain_table)); memset(cpi->film_grain_table, 0, sizeof(aom_film_grain_table_t)); aom_film_grain_table_read(cpi->film_grain_table, - tune_cfg->film_grain_table_filename, &cm->error); + tune_cfg->film_grain_table_filename, cm->error); } else if (tune_cfg->content == AOM_CONTENT_FILM) { - cm->seq_params.film_grain_params_present = 1; - cm->film_grain_params.bit_depth = cm->seq_params.bit_depth; + cm->film_grain_params.bit_depth = cm->seq_params->bit_depth; if (oxcf->tool_cfg.enable_monochrome) reset_film_grain_chroma_params(&cm->film_grain_params); - if (cm->seq_params.color_range == AOM_CR_FULL_RANGE) + if (cm->seq_params->color_range == AOM_CR_FULL_RANGE) cm->film_grain_params.clip_to_restricted_range = 0; } else { -#if CONFIG_DENOISE - cm->seq_params.film_grain_params_present = (cpi->oxcf.noise_level > 0); -#else - cm->seq_params.film_grain_params_present = 0; -#endif memset(&cm->film_grain_params, 0, sizeof(cm->film_grain_params)); } } @@ -643,7 +652,7 @@ void av1_scale_references(AV1_COMP *cpi, const InterpFilter filter, if (aom_yv12_realloc_with_new_border( &ref_fb->buf, AOM_BORDER_IN_PIXELS, cm->features.byte_alignment, num_planes) != 0) { - aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR, + aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR, "Failed to allocate frame buffer"); } } @@ -652,7 +661,7 @@ void av1_scale_references(AV1_COMP *cpi, const InterpFilter filter, if (new_fb == NULL) { const int new_fb_idx = get_free_fb(cm); if (new_fb_idx == INVALID_IDX) { - aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR, + aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR, "Unable to find free frame buffer"); } force_scaling = 1; @@ -663,30 +672,30 @@ void av1_scale_references(AV1_COMP *cpi, const InterpFilter filter, new_fb->buf.y_crop_height != cm->height) { if (aom_realloc_frame_buffer( &new_fb->buf, cm->width, cm->height, - cm->seq_params.subsampling_x, cm->seq_params.subsampling_y, - cm->seq_params.use_highbitdepth, AOM_BORDER_IN_PIXELS, + cm->seq_params->subsampling_x, cm->seq_params->subsampling_y, + cm->seq_params->use_highbitdepth, AOM_BORDER_IN_PIXELS, cm->features.byte_alignment, NULL, NULL, NULL, 0)) { if (force_scaling) { // Release the reference acquired in the get_free_fb() call above. --new_fb->ref_count; } - aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR, + aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR, "Failed to allocate frame buffer"); } #if CONFIG_AV1_HIGHBITDEPTH - if (use_optimized_scaler && cm->seq_params.bit_depth == AOM_BITS_8) + if (use_optimized_scaler && cm->seq_params->bit_depth == AOM_BITS_8) av1_resize_and_extend_frame(ref, &new_fb->buf, filter, phase, num_planes); else av1_resize_and_extend_frame_nonnormative( - ref, &new_fb->buf, (int)cm->seq_params.bit_depth, num_planes); + ref, &new_fb->buf, (int)cm->seq_params->bit_depth, num_planes); #else if (use_optimized_scaler) av1_resize_and_extend_frame(ref, &new_fb->buf, filter, phase, num_planes); else av1_resize_and_extend_frame_nonnormative( - ref, &new_fb->buf, (int)cm->seq_params.bit_depth, num_planes); + ref, &new_fb->buf, (int)cm->seq_params->bit_depth, num_planes); #endif cpi->scaled_ref_buf[ref_frame - 1] = new_fb; alloc_frame_mvs(cm, new_fb); @@ -704,10 +713,8 @@ void av1_scale_references(AV1_COMP *cpi, const InterpFilter filter, } } -BLOCK_SIZE av1_select_sb_size(const AV1_COMP *const cpi) { - const AV1_COMMON *const cm = &cpi->common; - const AV1EncoderConfig *const oxcf = &cpi->oxcf; - +BLOCK_SIZE av1_select_sb_size(const AV1EncoderConfig *const oxcf, int width, + int height, int number_spatial_layers) { if (oxcf->tool_cfg.superblock_size == AOM_SUPERBLOCK_SIZE_64X64) return BLOCK_64X64; if (oxcf->tool_cfg.superblock_size == AOM_SUPERBLOCK_SIZE_128X128) @@ -715,7 +722,7 @@ BLOCK_SIZE av1_select_sb_size(const AV1_COMP *const cpi) { assert(oxcf->tool_cfg.superblock_size == AOM_SUPERBLOCK_SIZE_DYNAMIC); - if (cpi->svc.number_spatial_layers > 1 || + if (number_spatial_layers > 1 || oxcf->resize_cfg.resize_mode != RESIZE_NONE) { // Use the configured size (top resolution) for spatial layers or // on resize. @@ -732,7 +739,7 @@ BLOCK_SIZE av1_select_sb_size(const AV1_COMP *const cpi) { // speed-feature. if (oxcf->superres_cfg.superres_mode == AOM_SUPERRES_NONE && oxcf->resize_cfg.resize_mode == RESIZE_NONE && oxcf->speed >= 1) { - return AOMMIN(cm->width, cm->height) > 480 ? BLOCK_128X128 : BLOCK_64X64; + return AOMMIN(width, height) > 480 ? BLOCK_128X128 : BLOCK_64X64; } return BLOCK_128X128; @@ -753,8 +760,10 @@ void av1_setup_frame(AV1_COMP *cpi) { if ((cm->current_frame.frame_type == KEY_FRAME && cm->show_frame) || frame_is_sframe(cm)) { - if (!cpi->seq_params_locked) { - set_sb_size(&cm->seq_params, av1_select_sb_size(cpi)); + if (!cpi->ppi->seq_params_locked) { + set_sb_size(cm->seq_params, + av1_select_sb_size(&cpi->oxcf, cm->width, cm->height, + cpi->svc.number_spatial_layers)); } } else { const RefCntBuffer *const primary_ref_buf = get_primary_ref_frame_buf(cm); @@ -959,7 +968,7 @@ void av1_determine_sc_tools_with_encoding(AV1_COMP *cpi, const int q_orig) { av1_set_speed_features_qindex_dependent(cpi, oxcf->speed); if (q_cfg->deltaq_mode != NO_DELTA_Q || q_cfg->enable_chroma_deltaq) av1_init_quantizer(&cpi->enc_quant_dequant_params, &cm->quant_params, - cm->seq_params.bit_depth); + cm->seq_params->bit_depth); av1_set_variance_partition_thresholds(cpi, q_for_screen_content_quick_run, 0); @@ -1005,13 +1014,13 @@ void av1_finalize_encoded_frame(AV1_COMP *const cpi) { AV1_COMMON *const cm = &cpi->common; CurrentFrame *const current_frame = &cm->current_frame; - if (!cm->seq_params.reduced_still_picture_hdr && + if (!cm->seq_params->reduced_still_picture_hdr && encode_show_existing_frame(cm)) { RefCntBuffer *const frame_to_show = cm->ref_frame_map[cpi->existing_fb_idx_to_show]; if (frame_to_show == NULL) { - aom_internal_error(&cm->error, AOM_CODEC_UNSUP_BITSTREAM, + aom_internal_error(cm->error, AOM_CODEC_UNSUP_BITSTREAM, "Buffer does not contain a reconstructed frame"); } assert(frame_to_show->ref_count > 0); @@ -1019,7 +1028,7 @@ void av1_finalize_encoded_frame(AV1_COMP *const cpi) { } if (!encode_show_existing_frame(cm) && - cm->seq_params.film_grain_params_present && + cm->seq_params->film_grain_params_present && (cm->show_frame || cm->showable_frame)) { // Copy the current frame's film grain params to the its corresponding // RefCntBuffer slot. @@ -1232,7 +1241,7 @@ static void save_extra_coding_context(AV1_COMP *cpi) { cc->lf = cm->lf; cc->cdef_info = cm->cdef_info; cc->rc = cpi->rc; - cc->mv_stats = cpi->mv_stats; + cc->mv_stats = cpi->ppi->mv_stats; } void av1_save_all_coding_context(AV1_COMP *cpi) { @@ -1301,11 +1310,11 @@ void av1_dump_filtered_recon_frames(AV1_COMP *cpi) { "show_frame=%d, show_existing_frame=%d, source_alt_ref_active=%d, " "refresh_alt_ref_frame=%d, " "y_stride=%4d, uv_stride=%4d, cm->width=%4d, cm->height=%4d\n\n", - current_frame->frame_number, cpi->gf_group.index, - cpi->gf_group.update_type[cpi->gf_group.index], current_frame->order_hint, - cm->show_frame, cm->show_existing_frame, cpi->rc.source_alt_ref_active, - cpi->refresh_frame.alt_ref_frame, recon_buf->y_stride, - recon_buf->uv_stride, cm->width, cm->height); + current_frame->frame_number, cpi->gf_frame_index, + cpi->ppi->gf_group.update_type[cpi->gf_frame_index], + current_frame->order_hint, cm->show_frame, cm->show_existing_frame, + cpi->rc.source_alt_ref_active, cpi->refresh_frame.alt_ref_frame, + recon_buf->y_stride, recon_buf->uv_stride, cm->width, cm->height); #if 0 int ref_frame; printf("get_ref_frame_map_idx: ["); |