Commit ff3ae42d authored by James Zern's avatar James Zern
Browse files

vp9: store TileWorkerData allocations separately

move them from VP9Worker::data[12] to allow the structure to be reused a
bit more naturally by the multi-threaded loopfilter.

Change-Id: I31b49c9e93ca744fd7f6d6ed8696671188fb2c1d
parent 2c133152
...@@ -1065,14 +1065,19 @@ static const uint8_t *decode_tiles_mt(VP9Decoder *pbi, ...@@ -1065,14 +1065,19 @@ static const uint8_t *decode_tiles_mt(VP9Decoder *pbi,
// use num_threads - 1 workers. // use num_threads - 1 workers.
CHECK_MEM_ERROR(cm, pbi->tile_workers, CHECK_MEM_ERROR(cm, pbi->tile_workers,
vpx_malloc(num_threads * sizeof(*pbi->tile_workers))); vpx_malloc(num_threads * sizeof(*pbi->tile_workers)));
// Ensure tile data offsets will be properly aligned. This may fail on
// platforms without DECLARE_ALIGNED().
assert((sizeof(*pbi->tile_worker_data) % 16) == 0);
CHECK_MEM_ERROR(cm, pbi->tile_worker_data,
vpx_memalign(32, num_threads *
sizeof(*pbi->tile_worker_data)));
CHECK_MEM_ERROR(cm, pbi->tile_worker_info,
vpx_malloc(num_threads * sizeof(*pbi->tile_worker_info)));
for (i = 0; i < num_threads; ++i) { for (i = 0; i < num_threads; ++i) {
VP9Worker *const worker = &pbi->tile_workers[i]; VP9Worker *const worker = &pbi->tile_workers[i];
++pbi->num_tile_workers; ++pbi->num_tile_workers;
winterface->init(worker); winterface->init(worker);
CHECK_MEM_ERROR(cm, worker->data1,
vpx_memalign(32, sizeof(TileWorkerData)));
CHECK_MEM_ERROR(cm, worker->data2, vpx_malloc(sizeof(TileInfo)));
if (i < num_threads - 1 && !winterface->reset(worker)) { if (i < num_threads - 1 && !winterface->reset(worker)) {
vpx_internal_error(&cm->error, VPX_CODEC_ERROR, vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
"Tile decoder thread creation failed"); "Tile decoder thread creation failed");
...@@ -1082,8 +1087,11 @@ static const uint8_t *decode_tiles_mt(VP9Decoder *pbi, ...@@ -1082,8 +1087,11 @@ static const uint8_t *decode_tiles_mt(VP9Decoder *pbi,
// Reset tile decoding hook // Reset tile decoding hook
for (n = 0; n < num_workers; ++n) { for (n = 0; n < num_workers; ++n) {
winterface->sync(&pbi->tile_workers[n]); VP9Worker *const worker = &pbi->tile_workers[n];
pbi->tile_workers[n].hook = (VP9WorkerHook)tile_worker_hook; winterface->sync(worker);
worker->hook = (VP9WorkerHook)tile_worker_hook;
worker->data1 = &pbi->tile_worker_data[n];
worker->data2 = &pbi->tile_worker_info[n];
} }
// Note: this memset assumes above_context[0], [1] and [2] // Note: this memset assumes above_context[0], [1] and [2]
......
...@@ -94,9 +94,9 @@ void vp9_decoder_remove(VP9Decoder *pbi) { ...@@ -94,9 +94,9 @@ void vp9_decoder_remove(VP9Decoder *pbi) {
for (i = 0; i < pbi->num_tile_workers; ++i) { for (i = 0; i < pbi->num_tile_workers; ++i) {
VP9Worker *const worker = &pbi->tile_workers[i]; VP9Worker *const worker = &pbi->tile_workers[i];
vp9_get_worker_interface()->end(worker); vp9_get_worker_interface()->end(worker);
vpx_free(worker->data1);
vpx_free(worker->data2);
} }
vpx_free(pbi->tile_worker_data);
vpx_free(pbi->tile_worker_info);
vpx_free(pbi->tile_workers); vpx_free(pbi->tile_workers);
if (pbi->num_tile_workers > 0) { if (pbi->num_tile_workers > 0) {
......
...@@ -46,6 +46,8 @@ typedef struct VP9Decoder { ...@@ -46,6 +46,8 @@ typedef struct VP9Decoder {
VP9Worker lf_worker; VP9Worker lf_worker;
VP9Worker *tile_workers; VP9Worker *tile_workers;
TileWorkerData *tile_worker_data;
TileInfo *tile_worker_info;
int num_tile_workers; int num_tile_workers;
TileData *tile_data; TileData *tile_data;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment