SourcePP
Several modern C++20 libraries for sanely parsing Valve's formats.
Loading...
Searching...
No Matches
PSFrames.cpp
Go to the documentation of this file.
1// ReSharper disable CppRedundantQualifier
2
3#include <vtfpp/PSFrames.h>
4
5#include <BufferStream.h>
6#include <sourcepp/FS.h>
8#include <vtfpp/ImagePixel.h>
9
10using namespace sourcepp;
11using namespace vtfpp;
12
13PSFrames::PSFrames(std::vector<std::byte>&& psFramesData) {
14 this->data = std::move(psFramesData);
15 BufferStreamReadOnly stream{this->data};
16 stream
17 .read(this->frameCount)
18 .read(this->fps)
19 .skip<uint32_t>(3) // unknown
20 .read(this->width)
21 .read(this->height)
22 .skip<uint8_t>() // probably channel bit width
23 .skip<uint16_t>(); // probably uncompressed pixel width
24}
25
26PSFrames::PSFrames(std::span<const std::byte> psFramesData)
27 : PSFrames(std::vector<std::byte>{psFramesData.begin(), psFramesData.end()}) {}
28
29PSFrames::PSFrames(const std::filesystem::path& psFramesPath)
30 : PSFrames(fs::readFileBuffer(psFramesPath)) {}
31
32uint32_t PSFrames::getFrameCount() const {
33 return this->frameCount;
34}
35
36uint32_t PSFrames::getFPS() const {
37 return this->fps;
38}
39
40uint16_t PSFrames::getWidth() const {
41 return this->width;
42}
43
44uint16_t PSFrames::getHeight() const {
45 return this->height;
46}
47
48std::vector<std::byte> PSFrames::getImageDataAs(ImageFormat newFormat, uint32_t frame) const {
50}
51
52std::vector<std::byte> PSFrames::getImageDataAsBGR888(uint32_t frame) const {
53 BufferStreamReadOnly stream{this->data.data(), this->data.size()};
54 const auto palette = stream.seek(PSFrames::getFrameOffset(frame)).read_bytes(256 * sizeof(ImagePixel::BGR888));
55 const std::span palettePixelData{reinterpret_cast<const ImagePixel::BGR888*>(palette.data()), 256};
56
57 std::vector<std::byte> out;
58 out.resize(this->width * this->height * sizeof(ImagePixel::BGR888));
59 BufferStream outStream{out};
60 for (uint32_t i = 0; i < this->width * this->height; i++) {
61 outStream << palettePixelData[stream.read<uint8_t>()];
62 }
63 return out;
64}
65
66uint32_t PSFrames::getFrameOffset(uint32_t frame) const {
67 static constexpr auto headerSize = sizeof(uint32_t) * 5 + sizeof(uint16_t) * 3 + sizeof(uint8_t);
68 static constexpr auto sampleSize = 19; // I'm assuming this is an audio sample, it's not for alignment
69 return headerSize + (this->getFramePaletteAndImageSize() + sampleSize) * frame;
70}
71
73 return 256 * sizeof(ImagePixel::BGR888) + this->width * this->height;
74}
uint32_t getFPS() const
Definition PSFrames.cpp:36
uint32_t getFrameCount() const
Definition PSFrames.cpp:32
uint32_t getFrameOffset(uint32_t frame) const
Definition PSFrames.cpp:66
std::vector< std::byte > data
Definition PSFrames.h:42
uint32_t fps
Definition PSFrames.h:38
std::vector< std::byte > getImageDataAsBGR888(uint32_t frame) const
Definition PSFrames.cpp:52
uint16_t width
Definition PSFrames.h:39
uint16_t getHeight() const
Definition PSFrames.cpp:44
uint16_t getWidth() const
Definition PSFrames.cpp:40
std::vector< std::byte > getImageDataAs(ImageFormat newFormat, uint32_t frame) const
Definition PSFrames.cpp:48
uint16_t height
Definition PSFrames.h:40
PSFrames(std::vector< std::byte > &&psFramesData)
Definition PSFrames.cpp:13
uint32_t frameCount
Definition PSFrames.h:37
uint32_t getFramePaletteAndImageSize() const
Definition PSFrames.cpp:72
std::vector< std::byte > convertImageDataToFormat(std::span< const std::byte > imageData, ImageFormat oldFormat, ImageFormat newFormat, uint16_t width, uint16_t height, float quality=DEFAULT_COMPRESSED_QUALITY)
Converts an image from one format to another.
Definition HOT.h:11