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
}