Assert the ref_cnt_fb() call won't leak raw buffer
The decoder always calls decrease_ref_count() to decrement a frame
buffer's ref_count. The only exception is this ref_cnt_fb() call, which
decrements the ref_count directly.
decrease_ref_count() takes care of calling release_fb_cb(), so this
ref_cnt_fb() call may potentially leak a raw frame buffer. There are two
ways to address this.
1. Replace the ref_cnt_fb() call with equivalent code that calls
decrease_ref_count().
2. Verify that this ref_cnt_fb() call won't leak reference.
This CL does the latter. It adds assertions to verify that the current
cm->new_fb_idx has not yet allocated a raw frame buffer and therfore the
ref_cnt_fb() call won't leak a raw frame buffer.
BUG=aomedia:2179
Change-Id: I538b2344c8f964d057f913c73a357af8cc3a4c82
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 2c8389d..2e96b60 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -4841,6 +4841,14 @@
"Buffer %d does not contain a decoded frame",
frame_to_show);
}
+ // cm->new_fb_idx should be the return value of the get_free_fb() call
+ // in av1_receive_compressed_data(), and generate_next_ref_frame_map()
+ // has not been called, so ref_count should still be 1.
+ assert(frame_bufs[cm->new_fb_idx].ref_count == 1);
+ // ref_cnt_fb() decrements ref_count directly rather than call
+ // decrease_ref_count(). If frame_bufs[cm->new_fb_idx].raw_frame_buffer
+ // has already been allocated, it will not be released by ref_cnt_fb()!
+ assert(!frame_bufs[cm->new_fb_idx].raw_frame_buffer.data);
ref_cnt_fb(frame_bufs, &cm->new_fb_idx, frame_to_show);
cm->reset_decoder_state =
frame_bufs[frame_to_show].frame_type == KEY_FRAME;