| /* | 
 |  * 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; | 
 | } |