]> granicus.if.org Git - libvpx/commitdiff
Fix palette mode in multi-thread encoding setting
authorhui su <huisu@google.com>
Thu, 15 Oct 2015 03:18:18 +0000 (20:18 -0700)
committerhui su <huisu@google.com>
Thu, 15 Oct 2015 22:00:57 +0000 (15:00 -0700)
Fix a couple of memory related errors. Also fix thread test failures.

Change-Id: I0103995f832cecf1dd2380000321ac7204f0cfc0

vp10/decoder/decodeframe.c
vp10/encoder/bitstream.c
vp10/encoder/encoder.c
vp10/encoder/ethread.c
vp10/encoder/rdopt.c

index 2516ba07517273a5c61e639b548336daa3ecd482..cbc70abfabeebcebfa0c9fe4dd1be50dd3a3fc0c 100644 (file)
@@ -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);
index 6c380eb5567afeaad76a58d6c32f1a4f879b9803..ca9b17b803c0e35465dbdc1bd212df5fa8ebf49f 100644 (file)
@@ -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)
index 3105de30af9b4d7c2f005fca8986ad73db402eeb..f3d7877cf3e32f9e035195afea434bdaeead1f7f 100644 (file)
@@ -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);
index 0a6df3983f1db68e575189f72f42cb5a9042473c..e20d532c365bd8b43407fa34c321cd2a3eeb7550 100644 (file)
@@ -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
index 959b0f01ddb72446e128892eadc53793597e26a5..c9ad94557aef59f974638b2f79dbe4e56a0b4a09 100644 (file)
@@ -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;