Palette: avoid memory leak with encoder buffers

For multi-thread encoding, previously the encoder buffers are
allocated at every frame, but only freed at the end of encoding,
causing memory leaks.

Change-Id: Id0e9d7fba8330e82be9cec1d42b7d4b017b8d772
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 322fa27..021ca1c 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -2633,7 +2633,7 @@
     if (t < cpi->num_workers - 1) {
 #if CONFIG_PALETTE
       if (cpi->common.allow_screen_content_tools)
-        aom_free(thread_data->td->mb.palette_buffer);
+        aom_free(thread_data->td->palette_buffer);
 #endif  // CONFIG_PALETTE
       aom_free(thread_data->td->counts);
       av1_free_pc_tree(thread_data->td);
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 40668df..bac468f 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -324,6 +324,10 @@
 
   VAR_TREE *var_tree;
   VAR_TREE *var_root[MAX_MIB_SIZE_LOG2 - MIN_MIB_SIZE_LOG2 + 1];
+
+#if CONFIG_PALETTE
+  PALETTE_BUFFER *palette_buffer;
+#endif  // CONFIG_PALETTE
 } ThreadData;
 
 struct EncWorkerData;
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c
index 34f0b95..deef423 100644
--- a/av1/encoder/ethread.c
+++ b/av1/encoder/ethread.c
@@ -101,6 +101,15 @@
         CHECK_MEM_ERROR(cm, thread_data->td->counts,
                         aom_calloc(1, sizeof(*thread_data->td->counts)));
 
+#if CONFIG_PALETTE
+        // Allocate buffers used by palette coding mode.
+        if (cpi->common.allow_screen_content_tools) {
+          CHECK_MEM_ERROR(
+              cm, thread_data->td->palette_buffer,
+              aom_memalign(16, sizeof(*thread_data->td->palette_buffer)));
+        }
+#endif  // CONFIG_PALETTE
+
         // Create threads
         if (!winterface->reset(worker))
           aom_internal_error(&cm->error, AOM_CODEC_ERROR,
@@ -134,12 +143,8 @@
     }
 
 #if CONFIG_PALETTE
-    // 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,
-                      aom_memalign(16, sizeof(*x->palette_buffer)));
-    }
+    if (cpi->common.allow_screen_content_tools && i < num_workers - 1)
+      thread_data->td->mb.palette_buffer = thread_data->td->palette_buffer;
 #endif  // CONFIG_PALETTE
   }