diff options
Diffstat (limited to 'third_party/aom/av1/encoder/pickrst.c')
-rw-r--r-- | third_party/aom/av1/encoder/pickrst.c | 75 |
1 files changed, 40 insertions, 35 deletions
diff --git a/third_party/aom/av1/encoder/pickrst.c b/third_party/aom/av1/encoder/pickrst.c index 4a446d24e..fec68377a 100644 --- a/third_party/aom/av1/encoder/pickrst.c +++ b/third_party/aom/av1/encoder/pickrst.c @@ -437,8 +437,8 @@ static double search_sgrproj(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, int width, height, src_stride, dgd_stride; uint8_t *dgd_buffer, *src_buffer; if (plane == AOM_PLANE_Y) { - width = cm->width; - height = cm->height; + width = src->y_crop_width; + height = src->y_crop_height; src_buffer = src->y_buffer; src_stride = src->y_stride; dgd_buffer = dgd->y_buffer; @@ -478,7 +478,7 @@ static double search_sgrproj(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, (1 << plane)); // #bits when a tile is not restored bits = av1_cost_bit(RESTORE_NONE_SGRPROJ_PROB, 0); - cost_norestore = RDCOST_DBL(x->rdmult, x->rddiv, (bits >> 4), err); + cost_norestore = RDCOST_DBL(x->rdmult, (bits >> 4), err); best_tile_cost[tile_idx] = DBL_MAX; search_selfguided_restoration( dgd_buffer + v_start * dgd_stride + h_start, h_end - h_start, @@ -498,7 +498,7 @@ static double search_sgrproj(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, &ref_sgrproj_info) << AV1_PROB_COST_SHIFT; bits += av1_cost_bit(RESTORE_NONE_SGRPROJ_PROB, 1); - cost_sgrproj = RDCOST_DBL(x->rdmult, x->rddiv, (bits >> 4), err); + cost_sgrproj = RDCOST_DBL(x->rdmult, (bits >> 4), err); if (cost_sgrproj >= cost_norestore) { type[tile_idx] = RESTORE_NONE; } else { @@ -531,7 +531,7 @@ static double search_sgrproj(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, } err = try_restoration_frame(src, cpi, rsi, (1 << plane), partial_frame, dst_frame); - cost_sgrproj = RDCOST_DBL(x->rdmult, x->rddiv, (bits >> 4), err); + cost_sgrproj = RDCOST_DBL(x->rdmult, (bits >> 4), err); return cost_sgrproj; } @@ -985,8 +985,8 @@ static double search_wiener(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, int width, height, src_stride, dgd_stride; uint8_t *dgd_buffer, *src_buffer; if (plane == AOM_PLANE_Y) { - width = cm->width; - height = cm->height; + width = src->y_crop_width; + height = src->y_crop_height; src_buffer = src->y_buffer; src_stride = src->y_stride; dgd_buffer = dgd->y_buffer; @@ -1039,7 +1039,7 @@ static double search_wiener(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, (1 << plane)); // #bits when a tile is not restored bits = av1_cost_bit(RESTORE_NONE_WIENER_PROB, 0); - cost_norestore = RDCOST_DBL(x->rdmult, x->rddiv, (bits >> 4), err); + cost_norestore = RDCOST_DBL(x->rdmult, (bits >> 4), err); best_tile_cost[tile_idx] = DBL_MAX; av1_get_rest_tile_limits(tile_idx, 0, 0, nhtiles, nvtiles, tile_width, @@ -1081,7 +1081,7 @@ static double search_wiener(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, count_wiener_bits(&rsi[plane].wiener_info[tile_idx], &ref_wiener_info) << AV1_PROB_COST_SHIFT; bits += av1_cost_bit(RESTORE_NONE_WIENER_PROB, 1); - cost_wiener = RDCOST_DBL(x->rdmult, x->rddiv, (bits >> 4), err); + cost_wiener = RDCOST_DBL(x->rdmult, (bits >> 4), err); if (cost_wiener >= cost_norestore) { type[tile_idx] = RESTORE_NONE; } else { @@ -1114,7 +1114,7 @@ static double search_wiener(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, } err = try_restoration_frame(src, cpi, rsi, 1 << plane, partial_frame, dst_frame); - cost_wiener = RDCOST_DBL(x->rdmult, x->rddiv, (bits >> 4), err); + cost_wiener = RDCOST_DBL(x->rdmult, (bits >> 4), err); return cost_wiener; } @@ -1133,8 +1133,8 @@ static double search_norestore(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, int h_start, h_end, v_start, v_end; int width, height; if (plane == AOM_PLANE_Y) { - width = cm->width; - height = cm->height; + width = src->y_crop_width; + height = src->y_crop_height; } else { width = src->uv_crop_width; height = src->uv_crop_height; @@ -1160,13 +1160,14 @@ static double search_norestore(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, // RD cost associated with no restoration err = sse_restoration_frame(cm, src, cm->frame_to_show, (1 << plane)); bits = frame_level_restore_bits[RESTORE_NONE] << AV1_PROB_COST_SHIFT; - cost_norestore = RDCOST_DBL(x->rdmult, x->rddiv, (bits >> 4), err); + cost_norestore = RDCOST_DBL(x->rdmult, (bits >> 4), err); return cost_norestore; } static double search_switchable_restoration( - AV1_COMP *cpi, int partial_frame, int plane, RestorationInfo *rsi, - double *tile_cost[RESTORE_SWITCHABLE_TYPES]) { + const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, int partial_frame, int plane, + RestorationType *const restore_types[RESTORE_SWITCHABLE_TYPES], + double *const tile_cost[RESTORE_SWITCHABLE_TYPES], RestorationInfo *rsi) { AV1_COMMON *const cm = &cpi->common; MACROBLOCK *x = &cpi->td.mb; double cost_switchable = 0; @@ -1174,11 +1175,11 @@ static double search_switchable_restoration( RestorationType r; int width, height; if (plane == AOM_PLANE_Y) { - width = cm->width; - height = cm->height; + width = src->y_crop_width; + height = src->y_crop_height; } else { - width = ROUND_POWER_OF_TWO(cm->width, cm->subsampling_x); - height = ROUND_POWER_OF_TWO(cm->height, cm->subsampling_y); + width = src->uv_crop_width; + height = src->uv_crop_height; } const int ntiles = av1_get_rest_ntiles( width, height, cm->rst_info[plane].restoration_tilesize, NULL, NULL, NULL, @@ -1192,16 +1193,17 @@ static double search_switchable_restoration( rsi->frame_restoration_type = RESTORE_SWITCHABLE; bits = frame_level_restore_bits[rsi->frame_restoration_type] << AV1_PROB_COST_SHIFT; - cost_switchable = RDCOST_DBL(x->rdmult, x->rddiv, bits >> 4, 0); + cost_switchable = RDCOST_DBL(x->rdmult, bits >> 4, 0); for (tile_idx = 0; tile_idx < ntiles; ++tile_idx) { - double best_cost = RDCOST_DBL( - x->rdmult, x->rddiv, (cpi->switchable_restore_cost[RESTORE_NONE] >> 4), - tile_cost[RESTORE_NONE][tile_idx]); + double best_cost = + RDCOST_DBL(x->rdmult, (cpi->switchable_restore_cost[RESTORE_NONE] >> 4), + tile_cost[RESTORE_NONE][tile_idx]); rsi->restoration_type[tile_idx] = RESTORE_NONE; for (r = 1; r < RESTORE_SWITCHABLE_TYPES; r++) { if (force_restore_type != 0) if (r != force_restore_type) continue; int tilebits = 0; + if (restore_types[r][tile_idx] != r) continue; if (r == RESTORE_WIENER) tilebits += count_wiener_bits(&rsi->wiener_info[tile_idx], &ref_wiener_info); @@ -1210,8 +1212,8 @@ static double search_switchable_restoration( count_sgrproj_bits(&rsi->sgrproj_info[tile_idx], &ref_sgrproj_info); tilebits <<= AV1_PROB_COST_SHIFT; tilebits += cpi->switchable_restore_cost[r]; - double cost = RDCOST_DBL(x->rdmult, x->rddiv, tilebits >> 4, - tile_cost[r][tile_idx]); + double cost = + RDCOST_DBL(x->rdmult, tilebits >> 4, tile_cost[r][tile_idx]); if (cost < best_cost) { rsi->restoration_type[tile_idx] = r; @@ -1243,14 +1245,17 @@ void av1_pick_filter_restoration(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, RestorationType *restore_types[RESTORE_SWITCHABLE_TYPES]; double best_cost_restore; RestorationType r, best_restore; - - const int ntiles_y = av1_get_rest_ntiles(cm->width, cm->height, - cm->rst_info[0].restoration_tilesize, - NULL, NULL, NULL, NULL); + const int ywidth = src->y_crop_width; + const int yheight = src->y_crop_height; + const int uvwidth = src->uv_crop_width; + const int uvheight = src->uv_crop_height; + + const int ntiles_y = + av1_get_rest_ntiles(ywidth, yheight, cm->rst_info[0].restoration_tilesize, + NULL, NULL, NULL, NULL); const int ntiles_uv = av1_get_rest_ntiles( - ROUND_POWER_OF_TWO(cm->width, cm->subsampling_x), - ROUND_POWER_OF_TWO(cm->height, cm->subsampling_y), - cm->rst_info[1].restoration_tilesize, NULL, NULL, NULL, NULL); + uvwidth, uvheight, cm->rst_info[1].restoration_tilesize, NULL, NULL, NULL, + NULL); // Assume ntiles_uv is never larger that ntiles_y and so the same arrays work. for (r = 0; r < RESTORE_SWITCHABLE_TYPES; r++) { @@ -1270,9 +1275,9 @@ void av1_pick_filter_restoration(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi, tile_cost[r], &cpi->trial_frame_rst); } if (plane == AOM_PLANE_Y) - cost_restore[RESTORE_SWITCHABLE] = - search_switchable_restoration(cpi, method == LPF_PICK_FROM_SUBIMAGE, - plane, &cm->rst_info[plane], tile_cost); + cost_restore[RESTORE_SWITCHABLE] = search_switchable_restoration( + src, cpi, method == LPF_PICK_FROM_SUBIMAGE, plane, restore_types, + tile_cost, &cm->rst_info[plane]); else cost_restore[RESTORE_SWITCHABLE] = DBL_MAX; best_cost_restore = DBL_MAX; |