From ee3a302cf235d7872d4620e3ebfa64978552ad1a Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 12 Apr 2022 19:54:07 +0200 Subject: [PATCH] cellVdecDecodeAu: add codec type check --- rpcs3/Emu/Cell/Modules/cellVdec.cpp | 14 +++++++------- rpcs3/Emu/Cell/Modules/cellVdec.h | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index 95701e6cd9..a784626d95 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -1023,17 +1023,17 @@ error_code cellVdecDecodeAu(u32 handle, CellVdecDecodeMode mode, vm::cptr CELL_VDEC_DEC_MODE_PB_SKIP) + if (mode < 0 || mode > (CELL_VDEC_DEC_MODE_B_SKIP | CELL_VDEC_DEC_MODE_PB_SKIP)) { return { CELL_VDEC_ERROR_ARG, fmt::format("mode=%d", +mode) }; } - // TODO: - //if ((mode == (CELL_VDEC_DEC_MODE_B_SKIP | CELL_VDEC_DEC_MODE_PB_SKIP) && something != 3) || - // (mode == CELL_VDEC_DEC_MODE_PB_SKIP && something != 1)) - //{ - // return CELL_VDEC_ERROR_ARG; - //} + // TODO: what does the 3 stand for ? + if ((mode == CELL_VDEC_CODEC_TYPE_MAX && vdec->type != 3) || + (mode == CELL_VDEC_DEC_MODE_PB_SKIP && vdec->type != CELL_VDEC_CODEC_TYPE_AVC)) + { + return { CELL_VDEC_ERROR_ARG, fmt::format("mode=%d, type=%d", +mode, vdec->type) }; + } if (!vdec->au_count.try_inc(4)) { diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.h b/rpcs3/Emu/Cell/Modules/cellVdec.h index 1aef31fcbf..07b588106f 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.h +++ b/rpcs3/Emu/Cell/Modules/cellVdec.h @@ -17,6 +17,7 @@ enum CellVdecCodecType : s32 CELL_VDEC_CODEC_TYPE_MPEG2 = 0, CELL_VDEC_CODEC_TYPE_AVC = 1, CELL_VDEC_CODEC_TYPE_DIVX = 5, + CELL_VDEC_CODEC_TYPE_MAX }; // Callback Messages