/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "ArPlaybackReader.hpp" #if __has_include("turbojpeg.h") #include namespace OpenVulkano::AR::Playback { ColorImg ArPlaybackReader::ReadColorImage() { ColorImg img; auto file = m_archiveColor.GetNextFile(); long unsigned int jpegSize = file->second.Size(); unsigned char* compressedImage = reinterpret_cast(file->second.Data()); int jpegSubsamp; tjhandle jpegDecompressor = tjInitDecompress(); tjDecompressHeader2(jpegDecompressor, compressedImage, jpegSize, &img.cols, &img.rows, &jpegSubsamp); img.channels = 4; img.dataPtr = std::shared_ptr(new uint8_t[img.cols * img.rows * img.channels]); img.data = img.dataPtr.get(); //TODO is it better to not map to rgb? to keep the same pipeline as on device tjDecompress2(jpegDecompressor, compressedImage, jpegSize, img.data, img.cols, 0/*pitch*/, img.rows, TJPF_RGBA, TJFLAG_FASTDCT); tjDestroy(jpegDecompressor); //auto buff = new uint8_t[img.cols * img.rows * 3]; //YuvUtils::NV12FromChromaPlanes(buff, img.data + (img.cols * img.rows), img.cols * img.rows / 4); m_imgReadSize += 1000 + file.value().first.size; return img; } } #else #define STB_IMAGE_IMPLEMENTATION #include namespace OpenVulkano::AR::Playback { ColorImg ArPlaybackReader::ReadColorImage() { ColorImg img; auto file = m_archiveColor.GetNextFile(); img.dataPtr = std::shared_ptr( stbi_load_from_memory(reinterpret_cast(file->second.Data()), file->second.Size(), &img.cols, &img.rows, &img.channels, 3), &stbi_image_free); img.data = img.dataPtr.get(); m_imgReadSize += 1000 + file.value().first.size; return img; } } #endif