ref: aaf6f6215fc6cf9996895f663b847e01667f9d57
parent: a5d74843ebf7fdffa537ee4881a2bc7b5715e3b3
author: hui su <[email protected]>
date: Wed Oct 14 16:18:18 EDT 2015
Fix palette mode in multi-thread encoding setting Fix a couple of memory related errors. Also fix thread test failures. Change-Id: I0103995f832cecf1dd2380000321ac7204f0cfc0
--- a/vp10/decoder/decodeframe.c
+++ b/vp10/decoder/decodeframe.c
@@ -1933,7 +1933,7 @@
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);
--- a/vp10/encoder/bitstream.c
+++ b/vp10/encoder/bitstream.c
@@ -1217,7 +1217,7 @@
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)
--- a/vp10/encoder/encoder.c
+++ b/vp10/encoder/encoder.c
@@ -1945,11 +1945,11 @@
// 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);
--- a/vp10/encoder/ethread.c
+++ b/vp10/encoder/ethread.c
@@ -96,13 +96,6 @@
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,
@@ -134,6 +127,13 @@
if (thread_data->td->counts != &cpi->common.counts) {
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)));
}
}
--- a/vp10/encoder/rdopt.c
+++ b/vp10/encoder/rdopt.c
@@ -1204,8 +1204,8 @@
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;