From 693e17b56cc2deb2bbb53799dd992b5fb3da2c75 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Mon, 23 Mar 2026 22:12:01 -0500 Subject: [PATCH] Cleaner fix --- src/core/libraries/videodec/videodec2.cpp | 43 ++++++--------- src/core/libraries/videodec/videodec2_avc.h | 53 ------------------- .../libraries/videodec/videodec2_impl.cpp | 50 ++++++----------- src/core/libraries/videodec/videodec2_impl.h | 1 - 4 files changed, 30 insertions(+), 117 deletions(-) diff --git a/src/core/libraries/videodec/videodec2.cpp b/src/core/libraries/videodec/videodec2.cpp index 121818f39..07055966f 100644 --- a/src/core/libraries/videodec/videodec2.cpp +++ b/src/core/libraries/videodec/videodec2.cpp @@ -203,36 +203,23 @@ s32 PS4_SYSV_ABI sceVideodec2GetPictureInfo(const OrbisVideodec2OutputInfo* outp LOG_ERROR(Lib_Vdec2, "No picture info available"); return ORBIS_OK; } + if (gPictureInfos.empty()) { + LOG_ERROR(Lib_Vdec2, "No picture info available"); + return ORBIS_OK; + } - // If the game uses the older Videodec2 structs, we need to accomodate that. - if (outputInfo->thisSize != sizeof(OrbisVideodec2OutputInfo)) { - if (gLegacyPictureInfos.empty()) { - LOG_ERROR(Lib_Vdec2, "No picture info available"); - return ORBIS_OK; - } - if (p1stPictureInfoOut) { - OrbisVideodec2LegacyAvcPictureInfo* picInfo = - static_cast(p1stPictureInfoOut); - if (picInfo->thisSize != sizeof(OrbisVideodec2LegacyAvcPictureInfo)) { - LOG_ERROR(Lib_Vdec2, "Invalid struct size"); - return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE; - } - *picInfo = gLegacyPictureInfos.back(); - } - } else { - if (gPictureInfos.empty()) { - LOG_ERROR(Lib_Vdec2, "No picture info available"); - return ORBIS_OK; - } - if (p1stPictureInfoOut) { - OrbisVideodec2AvcPictureInfo* picInfo = - static_cast(p1stPictureInfoOut); - if (picInfo->thisSize != sizeof(OrbisVideodec2AvcPictureInfo)) { - LOG_ERROR(Lib_Vdec2, "Invalid struct size"); - return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE; - } - *picInfo = gPictureInfos.back(); + if (p1stPictureInfoOut) { + // Copy enough data to check thisSize. + u64 picture_size = 0; + memcpy(&picture_size, p1stPictureInfoOut, sizeof(u64)); + if ((picture_size | 0x10) != sizeof(OrbisVideodec2AvcPictureInfo)) { + LOG_ERROR(Lib_Vdec2, "Invalid struct size"); + return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE; } + // Copy the requested picture data to the output. + memcpy(p1stPictureInfoOut, &gPictureInfos.back(), picture_size); + // Correct the outputted picture struct size. + memcpy(p1stPictureInfoOut, &picture_size, sizeof(u64)); } if (outputInfo->pictureCount > 1) { diff --git a/src/core/libraries/videodec/videodec2_avc.h b/src/core/libraries/videodec/videodec2_avc.h index dcf6ae007..cd14fe227 100644 --- a/src/core/libraries/videodec/videodec2_avc.h +++ b/src/core/libraries/videodec/videodec2_avc.h @@ -74,57 +74,4 @@ struct OrbisVideodec2AvcPictureInfo { }; static_assert(sizeof(OrbisVideodec2AvcPictureInfo) == 0x78); -// An older version of the OrbisVideodec2AvcPictureInfo struct -// Keeping this is needed for compatiblity with older games. -struct OrbisVideodec2LegacyAvcPictureInfo { - u64 thisSize; - - bool isValid; - - u64 ptsData; - u64 dtsData; - u64 attachedData; - - u8 idrPictureflag; - - u8 profile_idc; - u8 level_idc; - u32 pic_width_in_mbs_minus1; - u32 pic_height_in_map_units_minus1; - u8 frame_mbs_only_flag; - - u8 frame_cropping_flag; - u32 frameCropLeftOffset; - u32 frameCropRightOffset; - u32 frameCropTopOffset; - u32 frameCropBottomOffset; - - u8 aspect_ratio_info_present_flag; - u8 aspect_ratio_idc; - u16 sar_width; - u16 sar_height; - - u8 video_signal_type_present_flag; - u8 video_format; - u8 video_full_range_flag; - u8 colour_description_present_flag; - u8 colour_primaries; - u8 transfer_characteristics; - u8 matrix_coefficients; - - u8 timing_info_present_flag; - u32 num_units_in_tick; - u32 time_scale; - u8 fixed_frame_rate_flag; - - u8 bitstream_restriction_flag; - u8 max_dec_frame_buffering; - - u8 pic_struct_present_flag; - u8 pic_struct; - u8 field_pic_flag; - u8 bottom_field_flag; -}; -static_assert(sizeof(OrbisVideodec2LegacyAvcPictureInfo) == 0x68); - } // namespace Libraries::Videodec2 \ No newline at end of file diff --git a/src/core/libraries/videodec/videodec2_impl.cpp b/src/core/libraries/videodec/videodec2_impl.cpp index 08a7f8f00..e1ef5d587 100644 --- a/src/core/libraries/videodec/videodec2_impl.cpp +++ b/src/core/libraries/videodec/videodec2_impl.cpp @@ -12,7 +12,6 @@ namespace Libraries::Videodec2 { std::vector gPictureInfos; -std::vector gLegacyPictureInfos; static inline void CopyNV12Data(u8* dst, const AVFrame& src) { if (src.width == src.linesize[0]) { @@ -132,46 +131,27 @@ s32 VdecDecoder::Decode(const OrbisVideodec2InputData& inputData, outputInfo.isErrorFrame = false; outputInfo.pictureCount = 1; // TODO: 2 pictures for interlaced video - // For proper compatibility with older games, check the inputted OutputInfo struct size. + // Only set framePitchInBytes if the game uses the newer struct version. if (outputInfo.thisSize == sizeof(OrbisVideodec2OutputInfo)) { - // framePitchInBytes only exists in the newer struct. - outputInfo.framePitchInBytes = frame->width; - if (outputInfo.isValid) { - OrbisVideodec2AvcPictureInfo pictureInfo = {}; + outputInfo.framePitchInBytes = frame->linesize[0]; + } - pictureInfo.thisSize = sizeof(OrbisVideodec2AvcPictureInfo); - pictureInfo.isValid = true; + if (outputInfo.isValid) { + OrbisVideodec2AvcPictureInfo pictureInfo = {}; - pictureInfo.ptsData = inputData.ptsData; - pictureInfo.dtsData = inputData.dtsData; - pictureInfo.attachedData = inputData.attachedData; + pictureInfo.thisSize = sizeof(OrbisVideodec2AvcPictureInfo); + pictureInfo.isValid = true; - pictureInfo.frameCropLeftOffset = frame->crop_left; - pictureInfo.frameCropRightOffset = frame->crop_right; - pictureInfo.frameCropTopOffset = frame->crop_top; - pictureInfo.frameCropBottomOffset = frame->crop_bottom; + pictureInfo.ptsData = inputData.ptsData; + pictureInfo.dtsData = inputData.dtsData; + pictureInfo.attachedData = inputData.attachedData; - gPictureInfos.push_back(pictureInfo); - } - } else { - if (outputInfo.isValid) { - // If the game uses the older struct versions, we need to use it too. - OrbisVideodec2LegacyAvcPictureInfo pictureInfo = {}; + pictureInfo.frameCropLeftOffset = frame->crop_left; + pictureInfo.frameCropRightOffset = frame->crop_right; + pictureInfo.frameCropTopOffset = frame->crop_top; + pictureInfo.frameCropBottomOffset = frame->crop_bottom; - pictureInfo.thisSize = sizeof(OrbisVideodec2LegacyAvcPictureInfo); - pictureInfo.isValid = true; - - pictureInfo.ptsData = inputData.ptsData; - pictureInfo.dtsData = inputData.dtsData; - pictureInfo.attachedData = inputData.attachedData; - - pictureInfo.frameCropLeftOffset = frame->crop_left; - pictureInfo.frameCropRightOffset = frame->crop_right; - pictureInfo.frameCropTopOffset = frame->crop_top; - pictureInfo.frameCropBottomOffset = frame->crop_bottom; - - gLegacyPictureInfos.push_back(pictureInfo); - } + gPictureInfos.push_back(pictureInfo); } } diff --git a/src/core/libraries/videodec/videodec2_impl.h b/src/core/libraries/videodec/videodec2_impl.h index da16b3baa..382eab221 100644 --- a/src/core/libraries/videodec/videodec2_impl.h +++ b/src/core/libraries/videodec/videodec2_impl.h @@ -16,7 +16,6 @@ extern "C" { namespace Libraries::Videodec2 { extern std::vector gPictureInfos; -extern std::vector gLegacyPictureInfos; class VdecDecoder { public: