#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,
#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"
}
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;
#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;
}
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;
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)) {
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;
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;
}
/* 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);