shithub: libvpx

Download patch

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;