Fix fuzz issues relevant to cdef_row_mt
This CL fixes the cdef_row_mt structure memory allocation
if frame height is modified at run time. In such cases, the
structure is freed and reallocated for modified frame height.
BUG=aomedia:3031
BUG=oss-fuzz:33470
BUG=oss-fuzz:33480
BUG=oss-fuzz:33505
Change-Id: I434263cb44402d540c3c10ed7dc3c4c471365eae
diff --git a/av1/common/alloccommon.c b/av1/common/alloccommon.c
index 30ef7e3..5c91efc 100644
--- a/av1/common/alloccommon.c
+++ b/av1/common/alloccommon.c
@@ -62,12 +62,28 @@
}
}
+static INLINE void free_cdef_row_sync(AV1CdefRowSync **cdef_row_mt,
+ const int num_mi_rows) {
+ if (*cdef_row_mt == NULL) return;
+#if CONFIG_MULTITHREAD
+ for (int row_idx = 0; row_idx < num_mi_rows; row_idx++) {
+ pthread_mutex_destroy((*cdef_row_mt)[row_idx].row_mutex_);
+ pthread_cond_destroy((*cdef_row_mt)[row_idx].row_cond_);
+ aom_free((*cdef_row_mt)[row_idx].row_mutex_);
+ aom_free((*cdef_row_mt)[row_idx].row_cond_);
+ }
+#else
+ (void)num_mi_rows;
+#endif // CONFIG_MULTITHREAD
+ aom_free(*cdef_row_mt);
+ *cdef_row_mt = NULL;
+}
+
void av1_free_cdef_buffers(AV1_COMMON *const cm,
AV1CdefWorkerData **cdef_worker,
AV1CdefSync *cdef_sync, int num_workers) {
CdefInfo *cdef_info = &cm->cdef_info;
const int num_mi_rows = cdef_info->allocated_mi_rows;
- AV1CdefRowSync **cdef_row_mt = &cdef_sync->cdef_row_mt;
for (int plane = 0; plane < MAX_MB_PLANE; plane++) {
aom_free(cdef_info->linebuf[plane]);
@@ -85,21 +101,7 @@
aom_free(*cdef_worker);
*cdef_worker = NULL;
}
-
- if (*cdef_row_mt != NULL) {
-#if CONFIG_MULTITHREAD
- for (int row_idx = 0; row_idx < num_mi_rows; row_idx++) {
- pthread_mutex_destroy((*cdef_row_mt)[row_idx].row_mutex_);
- pthread_cond_destroy((*cdef_row_mt)[row_idx].row_cond_);
- aom_free((*cdef_row_mt)[row_idx].row_mutex_);
- aom_free((*cdef_row_mt)[row_idx].row_cond_);
- }
-#else
- (void)num_mi_rows;
-#endif // CONFIG_MULTITHREAD
- aom_free(*cdef_row_mt);
- *cdef_row_mt = NULL;
- }
+ free_cdef_row_sync(&cdef_sync->cdef_row_mt, num_mi_rows);
}
static INLINE void alloc_cdef_bufs(AV1_COMMON *const cm, uint16_t **colbuf,
@@ -120,6 +122,28 @@
}
}
+static INLINE void alloc_cdef_row_sync(AV1_COMMON *const cm,
+ AV1CdefRowSync **cdef_row_mt,
+ const int num_mi_rows) {
+ if (*cdef_row_mt != NULL) return;
+
+ CHECK_MEM_ERROR(cm, *cdef_row_mt,
+ aom_malloc(sizeof(**cdef_row_mt) * num_mi_rows));
+#if CONFIG_MULTITHREAD
+ for (int row_idx = 0; row_idx < num_mi_rows; row_idx++) {
+ CHECK_MEM_ERROR(cm, (*cdef_row_mt)[row_idx].row_mutex_,
+ aom_malloc(sizeof(*(*cdef_row_mt)[row_idx].row_mutex_)));
+ pthread_mutex_init((*cdef_row_mt)[row_idx].row_mutex_, NULL);
+
+ CHECK_MEM_ERROR(cm, (*cdef_row_mt)[row_idx].row_cond_,
+ aom_malloc(sizeof(*(*cdef_row_mt)[row_idx].row_cond_)));
+ pthread_cond_init((*cdef_row_mt)[row_idx].row_cond_, NULL);
+
+ (*cdef_row_mt)[row_idx].is_row_done = 0;
+ }
+#endif // CONFIG_MULTITHREAD
+}
+
void av1_alloc_cdef_buffers(AV1_COMMON *const cm,
AV1CdefWorkerData **cdef_worker,
AV1CdefSync *cdef_sync, int num_workers) {
@@ -127,7 +151,6 @@
const int luma_stride =
ALIGN_POWER_OF_TWO(cm->mi_params.mi_cols << MI_SIZE_LOG2, 4);
CdefInfo *cdef_info = &cm->cdef_info;
- AV1CdefRowSync **cdef_row_mt = &cdef_sync->cdef_row_mt;
// Check for configuration change
const int is_sub_sampling_changed =
(cdef_info->allocated_subsampling_x != cm->seq_params.subsampling_x ||
@@ -153,9 +176,12 @@
// TODO(vishnu): Simplify the below conditional logic based on linebuf_size.
if (is_frame_scaled || is_sub_sampling_changed || is_cdef_flag_changed ||
is_large_scale_tile_changed || is_num_planes_changed ||
- is_num_workers_changed)
+ is_num_workers_changed) {
av1_free_cdef_buffers(cm, cdef_worker, cdef_sync,
cdef_info->allocated_num_workers);
+ } else if (cdef_info->allocated_mi_rows != num_mi_rows) {
+ free_cdef_row_sync(&cdef_sync->cdef_row_mt, cdef_info->allocated_mi_rows);
+ }
// Store configuration to check change in configuration
cdef_info->allocated_mi_cols = cm->mi_params.mi_cols;
@@ -195,23 +221,8 @@
num_planes);
}
- if (*cdef_row_mt == NULL) {
- CHECK_MEM_ERROR(cm, *cdef_row_mt,
- aom_malloc(sizeof(**cdef_row_mt) * num_mi_rows));
-#if CONFIG_MULTITHREAD
- for (int row_idx = 0; row_idx < num_mi_rows; row_idx++) {
- CHECK_MEM_ERROR(cm, (*cdef_row_mt)[row_idx].row_mutex_,
- aom_malloc(sizeof(*(*cdef_row_mt)[row_idx].row_mutex_)));
- pthread_mutex_init((*cdef_row_mt)[row_idx].row_mutex_, NULL);
-
- CHECK_MEM_ERROR(cm, (*cdef_row_mt)[row_idx].row_cond_,
- aom_malloc(sizeof(*(*cdef_row_mt)[row_idx].row_cond_)));
- pthread_cond_init((*cdef_row_mt)[row_idx].row_cond_, NULL);
-
- (*cdef_row_mt)[row_idx].is_row_done = 0;
- }
-#endif // CONFIG_MULTITHREAD
- }
+ alloc_cdef_row_sync(cm, &cdef_sync->cdef_row_mt,
+ cdef_info->allocated_mi_rows);
}
#if !CONFIG_REALTIME_ONLY