From aaf6f6215fc6cf9996895f663b847e01667f9d57 Mon Sep 17 00:00:00 2001 From: hui su Date: Wed, 14 Oct 2015 20:18:18 -0700 Subject: [PATCH] Fix palette mode in multi-thread encoding setting Fix a couple of memory related errors. Also fix thread test failures. Change-Id: I0103995f832cecf1dd2380000321ac7204f0cfc0 --- vp10/decoder/decodeframe.c | 2 +- vp10/encoder/bitstream.c | 2 +- vp10/encoder/encoder.c | 4 ++-- vp10/encoder/ethread.c | 14 +++++++------- vp10/encoder/rdopt.c | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/vp10/decoder/decodeframe.c b/vp10/decoder/decodeframe.c index 2516ba075..cbc70abfa 100644 --- a/vp10/decoder/decodeframe.c +++ b/vp10/decoder/decodeframe.c @@ -1933,7 +1933,7 @@ static size_t read_uncompressed_header(VP10Decoder *pbi, memset(&cm->ref_frame_map, -1, sizeof(cm->ref_frame_map)); pbi->need_resync = 0; } - if (cm->current_video_frame == 0) + if (frame_is_intra_only(cm)) cm->allow_screen_content_tools = vpx_rb_read_bit(rb); } else { cm->intra_only = cm->show_frame ? 0 : vpx_rb_read_bit(rb); diff --git a/vp10/encoder/bitstream.c b/vp10/encoder/bitstream.c index 6c380eb55..ca9b17b80 100644 --- a/vp10/encoder/bitstream.c +++ b/vp10/encoder/bitstream.c @@ -1217,7 +1217,7 @@ static void write_uncompressed_header(VP10_COMP *cpi, write_sync_code(wb); write_bitdepth_colorspace_sampling(cm, wb); write_frame_size(cm, wb); - if (cm->current_video_frame == 0) + if (frame_is_intra_only(cm)) vpx_wb_write_bit(wb, cm->allow_screen_content_tools); } else { if (!cm->show_frame) diff --git a/vp10/encoder/encoder.c b/vp10/encoder/encoder.c index 3105de30a..f3d7877cf 100644 --- a/vp10/encoder/encoder.c +++ b/vp10/encoder/encoder.c @@ -1945,11 +1945,11 @@ void vp10_remove_compressor(VP10_COMP *cpi) { // Deallocate allocated thread data. if (t < cpi->num_workers - 1) { + if (cpi->common.allow_screen_content_tools) + vpx_free(thread_data->td->mb.palette_buffer); vpx_free(thread_data->td->counts); vp10_free_pc_tree(thread_data->td); vpx_free(thread_data->td); - if (cpi->common.allow_screen_content_tools) - vpx_free(thread_data->td->mb.palette_buffer); } } vpx_free(cpi->tile_thr_data); diff --git a/vp10/encoder/ethread.c b/vp10/encoder/ethread.c index 0a6df3983..e20d532c3 100644 --- a/vp10/encoder/ethread.c +++ b/vp10/encoder/ethread.c @@ -96,13 +96,6 @@ void vp10_encode_tiles_mt(VP10_COMP *cpi) { CHECK_MEM_ERROR(cm, thread_data->td->counts, vpx_calloc(1, sizeof(*thread_data->td->counts))); - // Allocate buffers used by palette coding mode. - if (cpi->common.allow_screen_content_tools) { - MACROBLOCK *x = &thread_data->td->mb; - CHECK_MEM_ERROR(cm, x->palette_buffer, - vpx_memalign(16, sizeof(*x->palette_buffer))); - } - // Create threads if (!winterface->reset(worker)) vpx_internal_error(&cm->error, VPX_CODEC_ERROR, @@ -135,6 +128,13 @@ void vp10_encode_tiles_mt(VP10_COMP *cpi) { memcpy(thread_data->td->counts, &cpi->common.counts, sizeof(cpi->common.counts)); } + + // Allocate buffers used by palette coding mode. + if (cpi->common.allow_screen_content_tools && i < num_workers - 1) { + MACROBLOCK *x = &thread_data->td->mb; + CHECK_MEM_ERROR(cm, x->palette_buffer, + vpx_memalign(16, sizeof(*x->palette_buffer))); + } } // Encode a frame diff --git a/vp10/encoder/rdopt.c b/vp10/encoder/rdopt.c index 959b0f01d..c9ad94557 100644 --- a/vp10/encoder/rdopt.c +++ b/vp10/encoder/rdopt.c @@ -1204,8 +1204,8 @@ static int64_t rd_pick_intra_sby_mode(VP10_COMP *cpi, MACROBLOCK *x, TX_SIZE best_tx = TX_4X4; int *bmode_costs; PALETTE_MODE_INFO palette_mode_info; - uint8_t *best_palette_color_map = cpi->common.allow_screen_content_tools ? - x->palette_buffer->best_palette_color_map : NULL; + uint8_t *best_palette_color_map = cpi->common.allow_screen_content_tools ? + x->palette_buffer->best_palette_color_map : NULL; int rows = 4 * num_4x4_blocks_high_lookup[bsize]; int cols = 4 * num_4x4_blocks_wide_lookup[bsize]; int palette_ctx = 0; -- 2.40.0