From 542843e429b51f06b7e9810c06e59418e8bde062 Mon Sep 17 00:00:00 2001 From: Ziemas Date: Tue, 29 Dec 2020 15:22:11 +0100 Subject: [PATCH] CSO: use zlib instead of libdeflate --- CMakeLists.txt | 1 - DobieStation/DobieStation.pro | 4 +- DobieStation/DobieStation.sln | 17 +------- DobieStation/application/application.pro | 11 ++---- DobieStation/common.props | 2 - src/core/CMakeLists.txt | 2 +- src/core/iop/cdvd/cso_reader.cpp | 50 +++++++++++++----------- src/core/iop/cdvd/cso_reader.hpp | 2 - 8 files changed, 36 insertions(+), 53 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0fa53cf3..3bf9a5e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,6 @@ set(THREADS_PREFER_PTHREAD_FLAG ON) # -pthreads on GNU-like compilers # Externals -add_subdirectory(ext/libdeflate) add_subdirectory(ext/zlib) add_subdirectory(ext/lzma) add_subdirectory(ext/libFLAC) diff --git a/DobieStation/DobieStation.pro b/DobieStation/DobieStation.pro index 48a7f3b9..49728492 100644 --- a/DobieStation/DobieStation.pro +++ b/DobieStation/DobieStation.pro @@ -1,8 +1,8 @@ TEMPLATE = subdirs -SUBDIRS = application libdeflate \ +SUBDIRS = application \ libFLAC \ libchdr \ lzma \ zlib -application.depends = libdeflate zlib libchdr lzma libFLAC +application.depends = zlib libchdr lzma libFLAC diff --git a/DobieStation/DobieStation.sln b/DobieStation/DobieStation.sln index fcdff8e3..c6abccde 100644 --- a/DobieStation/DobieStation.sln +++ b/DobieStation/DobieStation.sln @@ -11,11 +11,9 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Core", "..\src\core\Core.vcxproj", "{353E9072-F9AB-35F7-8AFF-FAC3EA8AFEE0}" ProjectSection(ProjectDependencies) = postProject {FD2E9030-8789-4679-8251-33E85E4B315F} = {FD2E9030-8789-4679-8251-33E85E4B315F} - {A77564F4-56BB-3D08-8126-3FD5FC44F217} = {A77564F4-56BB-3D08-8126-3FD5FC44F217} + {F2719732-B37A-4075-8C89-49CD5A38F2C4} = {F2719732-B37A-4075-8C89-49CD5A38F2C4} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libdeflate", "libdeflate\libdeflate.vcxproj", "{A77564F4-56BB-3D08-8126-3FD5FC44F217}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ThirdParty", "ThirdParty", "{A80C3A32-925E-454B-BA16-98D15D93AA2B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib\zlib.vcxproj", "{F2719732-B37A-4075-8C89-49CD5A38F2C4}" @@ -67,18 +65,6 @@ Global {353E9072-F9AB-35F7-8AFF-FAC3EA8AFEE0}.Release|x64.ActiveCfg = Release|x64 {353E9072-F9AB-35F7-8AFF-FAC3EA8AFEE0}.Release|x64.Build.0 = Release|x64 {353E9072-F9AB-35F7-8AFF-FAC3EA8AFEE0}.Release|x86.ActiveCfg = Release|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Debug|x64.ActiveCfg = Debug|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Debug|x64.Build.0 = Debug|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Debug|x86.ActiveCfg = Debug|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Devel|x64.ActiveCfg = Devel|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Devel|x64.Build.0 = Devel|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Devel|x86.ActiveCfg = Devel|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Release Optimized|x64.ActiveCfg = Release Optimized|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Release Optimized|x64.Build.0 = Release Optimized|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Release Optimized|x86.ActiveCfg = Release Optimized|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Release|x64.ActiveCfg = Release|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Release|x64.Build.0 = Release|x64 - {A77564F4-56BB-3D08-8126-3FD5FC44F217}.Release|x86.ActiveCfg = Release|x64 {F2719732-B37A-4075-8C89-49CD5A38F2C4}.Debug|x64.ActiveCfg = Debug|x64 {F2719732-B37A-4075-8C89-49CD5A38F2C4}.Debug|x64.Build.0 = Debug|x64 {F2719732-B37A-4075-8C89-49CD5A38F2C4}.Debug|x86.ActiveCfg = Debug|Win32 @@ -148,7 +134,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {A77564F4-56BB-3D08-8126-3FD5FC44F217} = {A80C3A32-925E-454B-BA16-98D15D93AA2B} {F2719732-B37A-4075-8C89-49CD5A38F2C4} = {A80C3A32-925E-454B-BA16-98D15D93AA2B} {3B1B7EDF-E913-45A2-9DC6-5486BA7E6960} = {A80C3A32-925E-454B-BA16-98D15D93AA2B} {12CAB131-CB23-464F-92F4-6773A10FC732} = {A80C3A32-925E-454B-BA16-98D15D93AA2B} diff --git a/DobieStation/application/application.pro b/DobieStation/application/application.pro index 57e0badc..e4a0d147 100644 --- a/DobieStation/application/application.pro +++ b/DobieStation/application/application.pro @@ -6,20 +6,17 @@ TARGET = ../DobieStation CONFIG += console c++14 CONFIG -= app_bundle -INCLUDEPATH += ../../ext/libdeflate \ +INCLUDEPATH += ../../ext/zlib/include \ ../../ext/libchdr/include -LIBS += -L../libdeflate \ - -L../libchdr \ +LIBS += -L../libchdr \ -L../lzma \ -L../libFLAC \ -L../zlib -win32:LIBS += -llibdeflate \ - -llibchdr \ +win32:LIBS += -llibchdr \ -llzma \ -llibFLAC \ -lzlib -else:LIBS += -ldeflate \ - -llibchdr \ +else:LIBS += -llibchdr \ -llzma \ -llibFLAC \ -lzlib diff --git a/DobieStation/common.props b/DobieStation/common.props index c6cf3972..e66d695d 100644 --- a/DobieStation/common.props +++ b/DobieStation/common.props @@ -30,7 +30,6 @@ $(UIDir);%(AdditionalIncludeDirectories) - $(ExtDir)\libdeflate;$(ExtDir)\libdeflate\common;%(AdditionalIncludeDirectories) $(ExtDir)\zlib\include;%(AdditionalIncludeDirectories) $(ExtDir)\lzma\include;%(AdditionalIncludeDirectories) $(ExtDir)\libFLAC\include;%(AdditionalIncludeDirectories) @@ -75,7 +74,6 @@ true true $(BinDir)\Core$(Postfix).lib;%(AdditionalDependencies) - $(BinDir)\libdeflate$(Postfix).lib;%(AdditionalDependencies) $(BinDir)\libchdr$(Postfix).lib;%(AdditionalDependencies) $(BinDir)\libFLAC$(Postfix).lib;%(AdditionalDependencies) $(BinDir)\lzma$(Postfix).lib;%(AdditionalDependencies) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index c9122583..7578bf80 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -180,5 +180,5 @@ add_library(${TARGET} ${SOURCES} ${HEADERS}) add_library(Dobie::Core ALIAS ${TARGET}) target_include_directories(${TARGET} PRIVATE ${CMAKE_SOURCE_DIR}/src) -target_link_libraries(${TARGET} Ext::libdeflate Threads::Threads libchdr) +target_link_libraries(${TARGET} Threads::Threads libchdr zlib) dobie_cxx_compile_options(${TARGET}) diff --git a/src/core/iop/cdvd/cso_reader.cpp b/src/core/iop/cdvd/cso_reader.cpp index 3c49a71c..aea13139 100644 --- a/src/core/iop/cdvd/cso_reader.cpp +++ b/src/core/iop/cdvd/cso_reader.cpp @@ -7,7 +7,7 @@ Based off reference by unknownbrackets: */ #include "cso_reader.hpp" -#include +#include #include #include @@ -47,8 +47,7 @@ CSO_Reader::CSO_Reader() : m_size(0), m_shift(0), m_blocksize(0), m_version(0), m_virtptr(0), m_indices(nullptr), m_framesize(0), m_curframe(0xFFFFFFFF), - m_frame(nullptr), m_readbuf(nullptr), - m_inflate(nullptr) {} + m_frame(nullptr), m_readbuf(nullptr) {} CSO_Reader::~CSO_Reader() { @@ -139,22 +138,41 @@ bool CSO_Reader::read_block_internal(uint32_t block) fprintf(stderr, "read error reading (compressed) block %d\n", block); return false; } - - size_t read; - auto res = libdeflate_deflate_decompress(m_inflate, m_readbuf, len, m_frame, m_framesize, &read); - if (res != LIBDEFLATE_SUCCESS) + + z_stream z; + z.zalloc = Z_NULL; + z.zfree = Z_NULL; + z.opaque = Z_NULL; + if (inflateInit2(&z, -15) != Z_OK) { - fprintf(stderr, "libdeflate error on block %d: %d\n", block, res); - m_curframe = 0xFFFFFFFF; + fprintf(stderr, "Unable to initialize inflate: %s\n", (z.msg) ? z.msg : "?"); return false; } - + + z.next_in = m_readbuf; + z.avail_in = len; + z.next_out = m_frame; + z.avail_out = m_framesize; + + auto res = inflate(&z, Z_FINISH); + if (res != Z_STREAM_END) + { + fprintf(stderr, "zlib error on block %d: %d, %s\n", block, res, (z.msg) ? z.msg: "?"); + m_curframe = 0xFFFFFFFF; + return false; + + } + + size_t read = z.total_out; + if (read < m_blocksize) { fprintf(stderr, "compressed sector %d decoded to less than the blocksize\n", block); m_curframe = 0xFFFFFFFF; return false; } + + inflateEnd(&z); } m_curframe = block; @@ -297,23 +315,11 @@ bool CSO_Reader::open(std::string name) m_frame = new uint8_t[m_framesize]; m_readbuf = new uint8_t[m_framesize]; - // setup libdeflate - m_inflate = libdeflate_alloc_decompressor(); - if (!m_inflate) - { - fprintf(stderr, "failed to allocate decompressor\n"); - close(); - return false; - } - return true; } void CSO_Reader::close() { - libdeflate_free_decompressor(m_inflate); - m_inflate = nullptr; - delete[] m_readbuf; m_readbuf = nullptr; diff --git a/src/core/iop/cdvd/cso_reader.hpp b/src/core/iop/cdvd/cso_reader.hpp index 4c0900cb..27fdb7b1 100644 --- a/src/core/iop/cdvd/cso_reader.hpp +++ b/src/core/iop/cdvd/cso_reader.hpp @@ -22,8 +22,6 @@ class CSO_Reader : public CDVD_Container uint8_t* m_frame; uint8_t* m_readbuf; - struct libdeflate_decompressor* m_inflate; - bool read_block_internal(uint32_t block); public: CSO_Reader();