diff --git a/src/core/memory/SharedMemory.cpp b/src/core/memory/SharedMemory.cpp index 8fcf816..0be9dd1 100644 --- a/src/core/memory/SharedMemory.cpp +++ b/src/core/memory/SharedMemory.cpp @@ -2,11 +2,13 @@ #include "RandomUtils.h" +#ifdef __linux__ #include #include #include #include #include +#endif void SharedMemory::allocate(const std::string& namePrefix, std::size_t size) { @@ -17,6 +19,7 @@ void SharedMemory::allocate(const std::string& namePrefix, std::size_t size) return; } +#ifdef __linux__ int ret{-1}; do { ret = ftruncate(mFileDescriptor, size); @@ -27,6 +30,7 @@ void SharedMemory::allocate(const std::string& namePrefix, std::size_t size) close(mFileDescriptor); mIsValid = false; } +#endif } int SharedMemory::getFileDescriptor() const @@ -41,6 +45,7 @@ bool SharedMemory::isValid() const void SharedMemory::createFile(const std::string& namePrefix) { +#ifdef __linux__ unsigned retries = 100; do { const auto name = getRandomName(namePrefix); @@ -55,6 +60,7 @@ void SharedMemory::createFile(const std::string& namePrefix) break; } } while (retries > 0 && errno == EEXIST); +#endif } std::string SharedMemory::getRandomName(const std::string& namePrefix) const diff --git a/src/image/CMakeLists.txt b/src/image/CMakeLists.txt index 01381c9..e886c12 100644 --- a/src/image/CMakeLists.txt +++ b/src/image/CMakeLists.txt @@ -1,22 +1,37 @@ list(APPEND image_HEADERS Image.h PngWriter.h + PngWriterBasic.h + PngWriterImpl.h ) list(APPEND image_LIB_INCLUDES Image.cpp PngWriter.cpp + PngWriterBasic.cpp PngReader.cpp ) +list(APPEND image_LIBS core) + +find_package(PNG QUIET) +if(PNG_FOUND) +list(APPEND image_LIBS PNG::PNG) +list(APPEND image_LIB_INCLUDES + PngWriterLibPng.cpp + ) +target_compile_definitions(image PRIVATE HAS_LIBPNG) +else() +message(STATUS "LIBRARY CHECK: libPNG not found - disabling libPNG based image i/o.") +endif() + add_library(image SHARED ${image_LIB_INCLUDES} ${image_HEADERS}) target_include_directories(image PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}" ) -set_target_properties( image PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON ) +set_target_properties( image PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON ) -find_package(PNG REQUIRED) -target_link_libraries( image PUBLIC PNG::PNG core) +target_link_libraries( image PUBLIC ${image_LIBS}) set_property(TARGET image PROPERTY FOLDER src) diff --git a/src/image/PngReader.cpp b/src/image/PngReader.cpp index 122a783..61843b9 100644 --- a/src/image/PngReader.cpp +++ b/src/image/PngReader.cpp @@ -4,6 +4,7 @@ #include "Image.h" #include +#include PngReader::~PngReader() { diff --git a/src/image/PngWriter.cpp b/src/image/PngWriter.cpp index 5650573..1b4c041 100644 --- a/src/image/PngWriter.cpp +++ b/src/image/PngWriter.cpp @@ -2,9 +2,23 @@ #include "Image.h" +#ifdef HAS_LIBPNG #include +#include "PngWriterLibPng.h" +#else +#include "PngWriterBasic.h" +#endif #include +PngWriter::PngWriter() +{ +#ifdef HAS_LIBPNG + mImpl = std::make_unique(); +#else + mImpl = std::make_unique(); +#endif +} + std::unique_ptr PngWriter::Create() { return std::make_unique(); @@ -12,63 +26,64 @@ std::unique_ptr PngWriter::Create() void PngWriter::SetPath(const std::string& path) { - mPath = path; + mImpl->setPath(path); } void PngWriter::Write(const std::unique_ptr& image) const { - auto fp = fopen(mPath.c_str(), "wb"); + mImpl->write(image); + //auto fp = fopen(mPath.c_str(), "wb"); - auto png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); - auto info_ptr = png_create_info_struct(png_ptr); + //auto png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); + //auto info_ptr = png_create_info_struct(png_ptr); - if (setjmp(png_jmpbuf(png_ptr))) - { - return; - } - png_init_io(png_ptr, fp); + //if (setjmp(png_jmpbuf(png_ptr))) + //{ + // return; + //} + //png_init_io(png_ptr, fp); - if (setjmp(png_jmpbuf(png_ptr))) - { - return; - } - auto color_type = PNG_COLOR_TYPE_RGB; - png_set_IHDR(png_ptr, info_ptr, image->GetWidth(), image->GetHeight(), - image->GetBitDepth(), color_type, PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + //if (setjmp(png_jmpbuf(png_ptr))) + //{ + // return; + //} + //auto color_type = PNG_COLOR_TYPE_RGB; + //png_set_IHDR(png_ptr, info_ptr, image->GetWidth(), image->GetHeight(), + // image->GetBitDepth(), color_type, PNG_INTERLACE_NONE, + // PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - png_write_info(png_ptr, info_ptr); + //png_write_info(png_ptr, info_ptr); - if (setjmp(png_jmpbuf(png_ptr))) - { - return; - } + //if (setjmp(png_jmpbuf(png_ptr))) + //{ + // return; + //} - png_bytep* row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * image->GetHeight()); - auto row_size = image->GetBytesPerRow(); - for(unsigned jdx=0;jdxGetHeight();jdx++) - { - row_pointers[jdx]=(png_byte*)malloc(sizeof(png_byte)*row_size); - for(unsigned idx=0;idxGetByte(idx, jdx); - } - } - png_write_image(png_ptr, row_pointers); - if (setjmp(png_jmpbuf(png_ptr))) - { - return; - } + //png_bytep* row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * image->GetHeight()); + //auto row_size = image->GetBytesPerRow(); + //for(unsigned jdx=0;jdxGetHeight();jdx++) + //{ + // row_pointers[jdx]=(png_byte*)malloc(sizeof(png_byte)*row_size); + // for(unsigned idx=0;idxGetByte(idx, jdx); + // } + //} + //png_write_image(png_ptr, row_pointers); + //if (setjmp(png_jmpbuf(png_ptr))) + //{ + // return; + //} - png_write_end(png_ptr, nullptr); + //png_write_end(png_ptr, nullptr); - for (unsigned y=0; yGetHeight(); y++) - { - free(row_pointers[y]); - } - free(row_pointers); + //for (unsigned y=0; yGetHeight(); y++) + //{ + // free(row_pointers[y]); + //} + //free(row_pointers); - fclose(fp); - return; + //fclose(fp); + //return; } diff --git a/src/image/PngWriter.h b/src/image/PngWriter.h index a31752d..b99a587 100644 --- a/src/image/PngWriter.h +++ b/src/image/PngWriter.h @@ -4,10 +4,13 @@ #include class Image; +class PngWriterImpl; class PngWriter { public: + PngWriter(); + static std::unique_ptr Create(); void SetPath(const std::string& path); @@ -15,8 +18,8 @@ public: void Write(const std::unique_ptr& image) const; private: + std::unique_ptr mImpl; - std::string mPath; }; using PngWriterPtr = std::unique_ptr; diff --git a/src/image/PngWriterBasic.cpp b/src/image/PngWriterBasic.cpp new file mode 100644 index 0000000..003c642 --- /dev/null +++ b/src/image/PngWriterBasic.cpp @@ -0,0 +1,11 @@ +#include "PngWriterBasic.h" + +void PngWriterBasic::setPath(const std::string& path) +{ + +} + +void PngWriterBasic::write(const std::unique_ptr& image) const +{ + +} \ No newline at end of file diff --git a/src/image/PngWriterBasic.h b/src/image/PngWriterBasic.h new file mode 100644 index 0000000..a883555 --- /dev/null +++ b/src/image/PngWriterBasic.h @@ -0,0 +1,14 @@ +#pragma once + +#include "PngWriterImpl.h" + +class PngWriterBasic : public PngWriterImpl +{ +public: + void setPath(const std::string& path) override; + + void write(const std::unique_ptr& image) const override; + +private: + std::string mPath; +}; \ No newline at end of file diff --git a/src/image/PngWriterImpl.h b/src/image/PngWriterImpl.h new file mode 100644 index 0000000..2efc2da --- /dev/null +++ b/src/image/PngWriterImpl.h @@ -0,0 +1,14 @@ +#pragma once + +#include +#include + +class Image; + +class PngWriterImpl +{ +public: + virtual void setPath(const std::string& path) = 0; + + virtual void write(const std::unique_ptr& image) const = 0; +}; \ No newline at end of file diff --git a/src/image/PngWriterLibPng.cpp b/src/image/PngWriterLibPng.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/image/PngWriterLibPng.h b/src/image/PngWriterLibPng.h new file mode 100644 index 0000000..e69de29 diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index d1683d0..97949c2 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -15,8 +15,12 @@ target_include_directories(video PUBLIC ) set_target_properties( video PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON ) -find_package(PkgConfig REQUIRED) -pkg_check_modules(LIBAV REQUIRED IMPORTED_TARGET +list(APPEND video_LIBS image) + +find_package(PkgConfig QUIET) + +if(PkgConfig) +pkg_check_modules(LIBAV IMPORTED_TARGET libavdevice libavfilter libavformat @@ -24,7 +28,13 @@ pkg_check_modules(LIBAV REQUIRED IMPORTED_TARGET libswresample libswscale libavutil -) -target_link_libraries( video PUBLIC image PkgConfig::LIBAV) +) +list(APPEND video_LIBS PkgConfig::LIBAV) +else() +message(STATUS "LIBRARY CHECK: PkgConfig not found - disabling ffmpeg based video i/o.") +endif() -set_property(TARGET image PROPERTY FOLDER src) \ No newline at end of file +target_link_libraries( video PUBLIC ${video_LIBS}) + + +set_property(TARGET video PROPERTY FOLDER src) \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 26143b9..e3e0bc0 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -48,7 +48,7 @@ list(APPEND TestNames TestXmlParser) find_package(PkgConfig) -pkg_check_modules(DBUS REQUIRED dbus-1) +pkg_check_modules(DBUS dbus-1) include_directories(${DBUS_INCLUDE_DIRS}) link_directories(${DBUS_LIBRARY_DIRS})