| /* |
| * Copyright (c) 2018, Alliance for Open Media. All rights reserved |
| * |
| * This source code is subject to the terms of the BSD 2 Clause License and |
| * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
| * was not distributed with this source code in the LICENSE file, you can |
| * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
| * Media Patent License 1.0 was not distributed with this source code in the |
| * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
| */ |
| |
| #include <assert.h> |
| |
| #include "av1/encoder/encoder.h" |
| #include "av1/encoder/ethread.h" |
| #include "av1/encoder/av1_multi_thread.h" |
| |
| void av1_row_mt_mem_alloc(AV1_COMP *cpi, int max_sb_rows) { |
| struct AV1Common *cm = &cpi->common; |
| MultiThreadHandle *multi_thread_ctxt = &cpi->multi_thread_ctxt; |
| int tile_row, tile_col; |
| const int tile_cols = cm->tile_cols; |
| const int tile_rows = cm->tile_rows; |
| |
| multi_thread_ctxt->allocated_tile_cols = tile_cols; |
| multi_thread_ctxt->allocated_tile_rows = tile_rows; |
| multi_thread_ctxt->allocated_sb_rows = max_sb_rows; |
| |
| // Allocate memory for row based multi-threading |
| for (tile_row = 0; tile_row < multi_thread_ctxt->allocated_tile_rows; |
| tile_row++) { |
| for (tile_col = 0; tile_col < multi_thread_ctxt->allocated_tile_cols; |
| tile_col++) { |
| TileDataEnc *this_tile = |
| &cpi->tile_data[tile_row * multi_thread_ctxt->allocated_tile_cols + |
| tile_col]; |
| av1_row_mt_sync_mem_alloc(&this_tile->row_mt_sync, cm, max_sb_rows); |
| if (cpi->oxcf.cdf_update_mode) |
| CHECK_MEM_ERROR( |
| cm, this_tile->row_ctx, |
| (FRAME_CONTEXT *)aom_memalign( |
| 16, |
| AOMMAX(1, (av1_get_sb_cols_in_tile(cm, this_tile->tile_info) - |
| 1)) * |
| sizeof(*this_tile->row_ctx))); |
| } |
| } |
| } |
| |
| void av1_row_mt_mem_dealloc(AV1_COMP *cpi) { |
| MultiThreadHandle *multi_thread_ctxt = &cpi->multi_thread_ctxt; |
| int tile_col; |
| int tile_row; |
| |
| // Free row based multi-threading sync memory |
| for (tile_row = 0; tile_row < multi_thread_ctxt->allocated_tile_rows; |
| tile_row++) { |
| for (tile_col = 0; tile_col < multi_thread_ctxt->allocated_tile_cols; |
| tile_col++) { |
| TileDataEnc *this_tile = |
| &cpi->tile_data[tile_row * multi_thread_ctxt->allocated_tile_cols + |
| tile_col]; |
| av1_row_mt_sync_mem_dealloc(&this_tile->row_mt_sync); |
| if (cpi->oxcf.cdf_update_mode) aom_free(this_tile->row_ctx); |
| } |
| } |
| multi_thread_ctxt->allocated_sb_rows = 0; |
| multi_thread_ctxt->allocated_tile_cols = 0; |
| multi_thread_ctxt->allocated_tile_rows = 0; |
| } |