decoder_get_frame() should use output frame index. decoder_get_frame() should use pbi->output_frame_index[*index], not cm->new_fb_idx. After decoding an output frame, if the remaining input data are valid OBUs but don't contain a frame, cm->new_fb_idx will be released and not copied to the pbi->output_frame_index[] array. Tested: ./test_libaom --gtest_filter=*InvalidFileTest* ./test_libaom --gtest_filter=*ExternalFrameBuffer* ./test_libaom --gtest_filter=*TestVectorTest* BUG=chromium:906381 Change-Id: Id20f8d25fe8809445d917c6822a0edd9a132483a
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c index 534e780..2b8ed7b 100644 --- a/av1/av1_dx_iface.c +++ b/av1/av1_dx_iface.c
@@ -708,7 +708,8 @@ AV1Decoder *const pbi = frame_worker_data->pbi; AV1_COMMON *const cm = &pbi->common; RefCntBuffer *const frame_bufs = cm->buffer_pool->frame_bufs; - ctx->last_show_frame = cm->new_fb_idx; + const int buf_idx = pbi->output_frame_index[*index]; + ctx->last_show_frame = buf_idx; if (ctx->need_resync) return NULL; yuvconfig2image(&ctx->img, sd, frame_worker_data->user_priv); @@ -757,7 +758,7 @@ AOMMIN(cm->tile_width, cm->mi_cols - mi_col) * MI_SIZE; } - ctx->img.fb_priv = frame_bufs[cm->new_fb_idx].raw_frame_buffer.priv; + ctx->img.fb_priv = frame_bufs[buf_idx].raw_frame_buffer.priv; img = &ctx->img; img->temporal_id = cm->temporal_layer_id; img->spatial_id = cm->spatial_layer_id;
diff --git a/test/invalid_file_test.cc b/test/invalid_file_test.cc index 75dd832..6b7ecc7 100644 --- a/test/invalid_file_test.cc +++ b/test/invalid_file_test.cc
@@ -44,6 +44,11 @@ << "Result file open failed. Filename: " << res_file_name; } + virtual void DecompressedFrameHook(const aom_image_t &img, + const unsigned int /*frame_number*/) { + EXPECT_NE(img.fb_priv, nullptr); + } + virtual bool HandleDecodeResult( const aom_codec_err_t res_dec, const libaom_test::CompressedVideoSource &video, @@ -108,6 +113,7 @@ const DecodeParam kAV1InvalidFileTests[] = { { 1, "invalid-bug-1814.ivf" }, + { 1, "invalid-chromium-906381.ivf" }, { 1, "invalid-oss-fuzz-9288.ivf" }, { 4, "invalid-oss-fuzz-9463.ivf" }, { 1, "invalid-oss-fuzz-9482.ivf" },
diff --git a/test/test-data.sha1 b/test/test-data.sha1 index 9247858..5b3e2b4 100644 --- a/test/test-data.sha1 +++ b/test/test-data.sha1
@@ -2,6 +2,8 @@ b87815bf86020c592ccc7a846ba2e28ec8043902 *hantro_odd.yuv 26b7f64399b84db4b4c9c915d743ec5c2619d4b9 *invalid-bug-1814.ivf d3964f9dad9f60363c81b688324d95b4ec7c8038 *invalid-bug-1814.ivf.res +09aa07e5325b3bb5462182eb30b8ecc914630740 *invalid-chromium-906381.ivf +09d2af8dd22201dd8d48e5dcfcaed281ff9422c7 *invalid-chromium-906381.ivf.res fa06784f23751d8c37be94160fb821e855199af4 *invalid-oss-fuzz-10061.ivf b055f06b9a95aaa5697fa26497b592a47843a7c8 *invalid-oss-fuzz-10061.ivf.res c9e06c4c7fb7d69fd635a1f606a5e478d60e99cf *invalid-oss-fuzz-10117-mc-buf-use-highbd.ivf
diff --git a/test/test_data_util.cmake b/test/test_data_util.cmake index 629b7bf..c029fad 100644 --- a/test/test_data_util.cmake +++ b/test/test_data_util.cmake
@@ -508,6 +508,8 @@ "av1-1-b8-22-svc-L2T2.ivf.md5" "invalid-bug-1814.ivf" "invalid-bug-1814.ivf.res" + "invalid-chromium-906381.ivf" + "invalid-chromium-906381.ivf.res" "invalid-oss-fuzz-10061.ivf" "invalid-oss-fuzz-10061.ivf.res" "invalid-oss-fuzz-10117-mc-buf-use-highbd.ivf"