Clear dangling frame buffer indexes.
Clear dangling frame buffer indexes in cm->next_ref_frame_map[] or
cm->new_fb_idx, after we have called decrease_ref_count() on a frame
buffer index or transferred the ownership of a frame buffer index to
another variable.
Also clear danging cm->cur_frame pointers.
Move the setting of cm->cur_frame->buf.corrupted from the error path of
frame_worker_hook() to the error paths of av1_receive_compressed_data().
BUG=aomedia:2266
Change-Id: Id1c9bb9563899d8c5cce0cc0ddee3aee8d5b666c
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c
index 60a8a5c..96fc077 100644
--- a/av1/av1_dx_iface.c
+++ b/av1/av1_dx_iface.c
@@ -357,7 +357,6 @@
if (result != 0) {
// Check decode result in serial decode.
- frame_worker_data->pbi->common.cur_frame->buf.corrupted = 1;
frame_worker_data->pbi->need_resync = 1;
}
return !result;
diff --git a/av1/decoder/decoder.c b/av1/decoder/decoder.c
index 8ac836f..c7625b5 100644
--- a/av1/decoder/decoder.c
+++ b/av1/decoder/decoder.c
@@ -322,20 +322,24 @@
BufferPool *const pool = cm->buffer_pool;
RefCntBuffer *const frame_bufs = cm->buffer_pool->frame_bufs;
+ cm->cur_frame->buf.corrupted = 1;
lock_buffer_pool(pool);
// Release all the reference buffers in cm->next_ref_frame_map if the worker
// thread is holding them.
if (pbi->hold_ref_buf) {
int ref_index;
for (ref_index = 0; ref_index < REF_FRAMES; ++ref_index) {
- const int new_idx = cm->next_ref_frame_map[ref_index];
- decrease_ref_count(new_idx, frame_bufs, pool);
+ const int idx = cm->next_ref_frame_map[ref_index];
+ decrease_ref_count(idx, frame_bufs, pool);
}
+ memset(&cm->next_ref_frame_map, -1, sizeof(cm->next_ref_frame_map));
pbi->hold_ref_buf = 0;
}
// Release current frame.
decrease_ref_count(cm->new_fb_idx, frame_bufs, pool);
unlock_buffer_pool(pool);
+ cm->new_fb_idx = INVALID_IDX;
+ cm->cur_frame = NULL;
}
// If any buffer updating is signaled it should be done here.
@@ -368,6 +372,7 @@
const int old_idx = cm->ref_frame_map[ref_index];
decrease_ref_count(old_idx, frame_bufs, pool);
cm->ref_frame_map[ref_index] = cm->next_ref_frame_map[ref_index];
+ cm->next_ref_frame_map[ref_index] = INVALID_IDX;
++ref_index;
}
@@ -378,6 +383,7 @@
const int old_idx = cm->ref_frame_map[ref_index];
decrease_ref_count(old_idx, frame_bufs, pool);
cm->ref_frame_map[ref_index] = cm->next_ref_frame_map[ref_index];
+ cm->next_ref_frame_map[ref_index] = INVALID_IDX;
}
}
@@ -388,8 +394,8 @@
if (pbi->num_output_frames >= MAX_NUM_SPATIAL_LAYERS) {
// We can't store the new frame anywhere, so drop it and return an
// error
+ cm->cur_frame->buf.corrupted = 1;
decrease_ref_count(cm->new_fb_idx, frame_bufs, pool);
- cm->cur_frame = NULL;
cm->error.error_code = AOM_CODEC_UNSUP_BITSTREAM;
} else {
pbi->output_frames[pbi->num_output_frames] = cur_frame;
@@ -408,7 +414,6 @@
}
} else {
decrease_ref_count(cm->new_fb_idx, frame_bufs, pool);
- cm->cur_frame = NULL;
}
unlock_buffer_pool(pool);
@@ -420,9 +425,10 @@
// Nothing was decoded, so just drop this frame buffer
lock_buffer_pool(pool);
decrease_ref_count(cm->new_fb_idx, frame_bufs, pool);
- cm->cur_frame = NULL;
unlock_buffer_pool(pool);
}
+ cm->new_fb_idx = INVALID_IDX;
+ cm->cur_frame = NULL;
if (!pbi->camera_frame_header_ready) {
pbi->hold_ref_buf = 0;
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index f03de63..d74edac 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -6600,9 +6600,9 @@
// previously held.
if (cm->new_fb_idx != INVALID_IDX) {
--pool->frame_bufs[cm->new_fb_idx].ref_count;
+ cm->cur_frame = NULL;
}
- cm->cur_frame = NULL;
cm->new_fb_idx = get_free_fb(cm);
if (cm->new_fb_idx == INVALID_IDX) return -1;
cm->cur_frame = &pool->frame_bufs[cm->new_fb_idx];
@@ -6788,6 +6788,7 @@
// held.
if (cm->new_fb_idx != INVALID_IDX) {
--pool->frame_bufs[cm->new_fb_idx].ref_count;
+ cm->cur_frame = NULL;
}
cm->new_fb_idx = get_free_fb(cm);