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
9using namespace sourcepp;
10using namespace vtfpp;
11
12PSFrames::PSFrames(std::vector<std::byte>&& psFramesData) {
13 this->data = std::move(psFramesData);
14 BufferStreamReadOnly stream{this->data};
15 stream
16 .read(this->frameCount)
17 .read(this->fps)
18 .skip<uint32_t>(3) // unknown
19 .read(this->width)
20 .read(this->height)
21 .skip<uint8_t>() // probably channel bit width
22 .skip<uint16_t>(); // probably uncompressed pixel width
23}
24
25PSFrames::PSFrames(std::span<const std::byte> psFramesData)
26 : PSFrames(std::vector<std::byte>{psFramesData.begin(), psFramesData.end()}) {}
27
28PSFrames::PSFrames(const std::filesystem::path& psFramesPath)
29 : PSFrames(fs::readFileBuffer(psFramesPath)) {}
30
31uint32_t PSFrames::getFrameCount() const {
32 return this->frameCount;
33}
34
35uint32_t PSFrames::getFPS() const {
36 return this->fps;
37}
38
39uint16_t PSFrames::getWidth() const {
40 return this->width;
41}
42
43uint16_t PSFrames::getHeight() const {
44 return this->height;
45}
46
47std::vector<std::byte> PSFrames::getImageDataAs(ImageFormat newFormat, uint32_t frame) const {
49}
50
51std::vector<std::byte> PSFrames::getImageDataAsBGR888(uint32_t frame) const {
52 BufferStreamReadOnly stream{this->data.data(), this->data.size()};
53 const auto palette = stream.seek(PSFrames::getFrameOffset(frame)).read_bytes(256 * sizeof(ImagePixel::BGR888));
54 const std::span palettePixelData{reinterpret_cast<const ImagePixel::BGR888*>(palette.data()), 256};
55
56 std::vector<std::byte> out;
57 out.resize(this->width * this->height * sizeof(ImagePixel::BGR888));
58 BufferStream outStream{out};
59 for (uint32_t i = 0; i < this->width * this->height; i++) {
60 outStream << palettePixelData[stream.read<uint8_t>()];
61 }
62 return out;
63}
64
65uint32_t PSFrames::getFrameOffset(uint32_t frame) const {
66 static constexpr auto headerSize = sizeof(uint32_t) * 5 + sizeof(uint16_t) * 3 + sizeof(uint8_t);
67 static constexpr auto sampleSize = 19; // I'm assuming this is an audio sample, it's not for alignment
68 return headerSize + (this->getFramePaletteAndImageSize() + sampleSize) * frame;
69}
70
72 return 256 * sizeof(ImagePixel::BGR888) + this->width * this->height;
73}
uint32_t getFPS() const
Definition PSFrames.cpp:35
uint32_t getFrameCount() const
Definition PSFrames.cpp:31
uint32_t getFrameOffset(uint32_t frame) const
Definition PSFrames.cpp:65
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:51
uint16_t width
Definition PSFrames.h:39
uint16_t getHeight() const
Definition PSFrames.cpp:43
uint16_t getWidth() const
Definition PSFrames.cpp:39
std::vector< std::byte > getImageDataAs(ImageFormat newFormat, uint32_t frame) const
Definition PSFrames.cpp:47
uint16_t height
Definition PSFrames.h:40
PSFrames(std::vector< std::byte > &&psFramesData)
Definition PSFrames.cpp:12
uint32_t frameCount
Definition PSFrames.h:37
uint32_t getFramePaletteAndImageSize() const
Definition PSFrames.cpp:71
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