From 7be8d2df6c1c224a96b75d8f2ed66df7cbd0bb48 Mon Sep 17 00:00:00 2001 From: Jerome Jiang Date: Tue, 8 Jan 2019 10:51:54 -0800 Subject: [PATCH] vp8 dec: Add flag to bring up threads. Instead of creating a new decoder instance when restarting all threads after they were shut down, re-create threads on the new flag. BUG=webm:1577 Change-Id: I6272ecaa1b586afdaa5ed8d6eab80aff8f5eb673 --- test/invalid_file_test.cc | 4 ++-- test/test-data.mk | 8 ++++---- test/test-data.sha1 | 8 ++++---- vp8/decoder/decodeframe.c | 1 + vp8/decoder/onyxd_if.c | 4 ++-- vp8/decoder/onyxd_int.h | 6 ++++++ vp8/vp8_dx_iface.c | 43 ++++++++++++++++++++++++++++++++++----- 7 files changed, 57 insertions(+), 17 deletions(-) diff --git a/test/invalid_file_test.cc b/test/invalid_file_test.cc index a92612af4..8eed05eb4 100644 --- a/test/invalid_file_test.cc +++ b/test/invalid_file_test.cc @@ -123,9 +123,9 @@ TEST_P(InvalidFileTest, ReturnCode) { RunTest(); } #if CONFIG_VP8_DECODER const DecodeParam kVP8InvalidFileTests[] = { - { 1, "invalid-bug-1443-v2.ivf" }, + { 1, "invalid-bug-1443.ivf" }, { 1, "invalid-token-partition.ivf" }, - { 1, "invalid-vp80-00-comprehensive-s17661_r01-05_b6-.v2.ivf" }, + { 1, "invalid-vp80-00-comprehensive-s17661_r01-05_b6-.ivf" }, }; VP8_INSTANTIATE_TEST_CASE(InvalidFileTest, diff --git a/test/test-data.mk b/test/test-data.mk index 49edc3087..88f3c658f 100644 --- a/test/test-data.mk +++ b/test/test-data.mk @@ -734,14 +734,14 @@ LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp93-2-20-12bit-yuv444.webm.md5 endif # CONFIG_VP9_HIGHBITDEPTH # Invalid files for testing libvpx error checking. -LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-bug-1443-v2.ivf -LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-bug-1443-v2.ivf.res +LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-bug-1443.ivf +LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-bug-1443.ivf.res LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-token-partition.ivf LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-token-partition.ivf.res LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-018.ivf.2kf_0x6.ivf LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-018.ivf.2kf_0x6.ivf.res -LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-s17661_r01-05_b6-.v2.ivf -LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-s17661_r01-05_b6-.v2.ivf.res +LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-s17661_r01-05_b6-.ivf +LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-s17661_r01-05_b6-.ivf.res LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-01-v3.webm LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-01-v3.webm.res LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-02-v2.webm diff --git a/test/test-data.sha1 b/test/test-data.sha1 index 2e279e191..cfe4df40d 100644 --- a/test/test-data.sha1 +++ b/test/test-data.sha1 @@ -850,14 +850,14 @@ a000d568431d07379dd5a8ec066061c07e560b47 *invalid-vp90-2-00-quantizer-63.ivf.kf_ 6fa3d3ac306a3d9ce1d610b78441dc00d2c2d4b9 *tos_vp8.webm e402cbbf9e550ae017a1e9f1f73931c1d18474e8 *invalid-crbug-667044.webm d3964f9dad9f60363c81b688324d95b4ec7c8038 *invalid-crbug-667044.webm.res -fd9df7f3f6992af1d7a9dde975c9a0d6f28c053d *invalid-bug-1443-v2.ivf -3198c7af55a7d50173ce3c369c0cf2d9cdfface6 *invalid-bug-1443-v2.ivf.res +fd9df7f3f6992af1d7a9dde975c9a0d6f28c053d *invalid-bug-1443.ivf +fd3020fa6e9ca5966206738654c97dec313b0a95 *invalid-bug-1443.ivf.res 1a0e405606939f2febab1a21b30c37cb8f2c8cb1 *invalid-token-partition.ivf 90a8a95e7024f015b87f5483a65036609b3d1b74 *invalid-token-partition.ivf.res 17696cd21e875f1d6e5d418cbf89feab02c8850a *vp90-2-22-svc_1280x720_1.webm e2f9e1e47a791b4e939a9bdc50bf7a25b3761f77 *vp90-2-22-svc_1280x720_1.webm.md5 -a0fbbbc5dd50fd452096f4455a58c1a8c9f66697 *invalid-vp80-00-comprehensive-s17661_r01-05_b6-.v2.ivf -591715fc7ea37dbda0397f45eee9d530f7f4f8ce *invalid-vp80-00-comprehensive-s17661_r01-05_b6-.v2.ivf.res +a0fbbbc5dd50fd452096f4455a58c1a8c9f66697 *invalid-vp80-00-comprehensive-s17661_r01-05_b6-.ivf +a61774cf03fc584bd9f0904fc145253bb8ea6c4c *invalid-vp80-00-comprehensive-s17661_r01-05_b6-.ivf.res 894fae3afee0290546590823974203ab4b8abd95 *crbug-1539.rawfile f1026c03efd5da21b381c8eb21f0d64e6d7e4ba3 *invalid-crbug-1558.ivf eb198c25f861c3fe2cbd310de11eb96843019345 *invalid-crbug-1558.ivf.res diff --git a/vp8/decoder/decodeframe.c b/vp8/decoder/decodeframe.c index 617abf77c..650d1d040 100644 --- a/vp8/decoder/decodeframe.c +++ b/vp8/decoder/decodeframe.c @@ -1222,6 +1222,7 @@ int vp8_decode_frame(VP8D_COMP *pbi) { unsigned int thread; if (vp8mt_decode_mb_rows(pbi, xd)) { vp8_decoder_remove_threads(pbi); + pbi->restart_threads = 1; vpx_internal_error(&pbi->common.error, VPX_CODEC_CORRUPT_FRAME, NULL); } vp8_yv12_extend_frame_borders(yv12_fb_new); diff --git a/vp8/decoder/onyxd_if.c b/vp8/decoder/onyxd_if.c index e7e1cfc94..c6fb51d0c 100644 --- a/vp8/decoder/onyxd_if.c +++ b/vp8/decoder/onyxd_if.c @@ -16,6 +16,7 @@ #include "onyxd_int.h" #include "vpx_mem/vpx_mem.h" #include "vp8/common/alloccommon.h" +#include "vp8/common/common.h" #include "vp8/common/loopfilter.h" #include "vp8/common/swapyv12buffer.h" #include "vp8/common/threading.h" @@ -428,7 +429,6 @@ int vp8dx_references_buffer(VP8_COMMON *oci, int ref_frame) { } int vp8_create_decoder_instances(struct frame_buffers *fb, VP8D_CONFIG *oxcf) { - if (fb->pbi[0]) remove_decompressor(fb->pbi[0]); /* decoder instance for single thread mode */ fb->pbi[0] = create_decompressor(oxcf); if (!fb->pbi[0]) return VPX_CODEC_ERROR; @@ -436,7 +436,7 @@ int vp8_create_decoder_instances(struct frame_buffers *fb, VP8D_CONFIG *oxcf) { #if CONFIG_MULTITHREAD if (setjmp(fb->pbi[0]->common.error.jmp)) { vp8_remove_decoder_instances(fb); - memset(fb->pbi, 0, sizeof(fb->pbi)); + vp8_zero(fb->pbi); vpx_clear_system_state(); return VPX_CODEC_ERROR; } diff --git a/vp8/decoder/onyxd_int.h b/vp8/decoder/onyxd_int.h index 5e1687d1a..75286e430 100644 --- a/vp8/decoder/onyxd_int.h +++ b/vp8/decoder/onyxd_int.h @@ -118,6 +118,12 @@ typedef struct VP8D_COMP { vpx_decrypt_cb decrypt_cb; void *decrypt_state; +#if CONFIG_MULTITHREAD + // Restart threads on next frame if set to 1. + // This is set when error happens in multithreaded decoding and all threads + // are shut down. + int restart_threads; +#endif } VP8D_COMP; void vp8cx_init_de_quantizer(VP8D_COMP *pbi); diff --git a/vp8/vp8_dx_iface.c b/vp8/vp8_dx_iface.c index a72d80505..7db77195b 100644 --- a/vp8/vp8_dx_iface.c +++ b/vp8/vp8_dx_iface.c @@ -45,6 +45,12 @@ struct vpx_codec_alg_priv { vpx_codec_dec_cfg_t cfg; vp8_stream_info_t si; int decoder_init; +#if CONFIG_MULTITHREAD + // Restart threads on next frame if set to 1. + // This is set when error happens in multithreaded decoding and all threads + // are shut down. + int restart_threads; +#endif int postproc_cfg_set; vp8_postproc_cfg_t postproc_cfg; vpx_decrypt_cb decrypt_cb; @@ -268,7 +274,7 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, const uint8_t *data, unsigned int data_sz, void *user_priv, long deadline) { volatile vpx_codec_err_t res; - unsigned int resolution_change = 0; + volatile unsigned int resolution_change = 0; unsigned int w, h; if (!ctx->fragments.enabled && (data == NULL && data_sz == 0)) { @@ -298,6 +304,27 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, if ((ctx->si.h != h) || (ctx->si.w != w)) resolution_change = 1; +#if CONFIG_MULTITHREAD + if (!res && ctx->restart_threads) { + struct frame_buffers *fb = &ctx->yv12_frame_buffers; + VP8D_COMP *pbi = ctx->yv12_frame_buffers.pbi[0]; + VP8_COMMON *const pc = &pbi->common; + if (setjmp(pbi->common.error.jmp)) { + vp8_remove_decoder_instances(fb); + vp8_zero(fb->pbi); + vpx_clear_system_state(); + return VPX_CODEC_ERROR; + } + pbi->common.error.setjmp = 1; + pbi->max_threads = ctx->cfg.threads; + vp8_decoder_create_threads(pbi); + if (vpx_atomic_load_acquire(&pbi->b_multithreaded_rd)) { + vp8mt_alloc_temp_buffers(pbi, pc->Width, pc->mb_rows); + } + ctx->restart_threads = 0; + pbi->common.error.setjmp = 0; + } +#endif /* Initialize the decoder instance on the first frame*/ if (!res && !ctx->decoder_init) { VP8D_CONFIG oxcf; @@ -439,9 +466,13 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, pc->fb_idx_ref_cnt[pc->new_fb_idx]--; } pc->error.setjmp = 0; - ctx->si.w = 0; - ctx->si.h = 0; - ctx->decoder_init = 0; +#if CONFIG_MULTITHREAD + if (pbi->restart_threads) { + ctx->si.w = 0; + ctx->si.h = 0; + ctx->restart_threads = 1; + } +#endif res = update_error_state(ctx, &pbi->common.error); return res; } @@ -450,7 +481,9 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, /* update the pbi fragment data */ pbi->fragments = ctx->fragments; - +#if CONFIG_MULTITHREAD + pbi->restart_threads = 0; +#endif ctx->user_priv = user_priv; if (vp8dx_receive_compressed_data(pbi, data_sz, data, deadline)) { res = update_error_state(ctx, &pbi->common.error); -- 2.40.0