This commit is contained in:
2026-08-15 21:48:23 +08:00
parent 26bbc29a16
commit 023250c0fc
45 changed files with 457 additions and 415 deletions
+18 -5
View File
@@ -9,22 +9,35 @@ void write_u32_le(char* target, std::uint32_t value) {
target[2] = static_cast<char>((value >> 16U) & 0xffU);
target[3] = static_cast<char>((value >> 24U) & 0xffU);
}
void write_u64_le(char* target, std::uint64_t value) {
write_u32_le(target, static_cast<std::uint32_t>(value));
write_u32_le(target + 4, static_cast<std::uint32_t>(value >> 32U));
}
std::string encode_rgba8_pixel_frame(const std::byte* data, std::uint32_t width, std::uint32_t height, std::uint32_t stride) {
if (data == nullptr || width == 0 || height == 0 || stride < width * 4U)
}
std::string make_rgba8_pixel_frame(std::uint32_t width, std::uint32_t height, std::uint64_t sequence) {
if (width == 0 || height == 0)
return {};
const std::size_t row_size = static_cast<std::size_t>(width) * 4U;
if (static_cast<std::size_t>(height) > (std::numeric_limits<std::size_t>::max() - pixel_frame_header_size) / row_size)
return {};
const std::size_t pixel_bytes = row_size * height;
std::string frame(pixel_frame_header_size + pixel_bytes, '\0');
std::string frame(pixel_frame_header_size + row_size * height, '\0');
frame[0] = 'R';
frame[1] = 'V';
frame[2] = 'P';
frame[3] = '1';
frame[3] = '2';
write_u32_le(frame.data() + 4, width);
write_u32_le(frame.data() + 8, height);
write_u32_le(frame.data() + 12, static_cast<std::uint32_t>(row_size));
write_u64_le(frame.data() + 16, sequence);
return frame;
}
std::string encode_rgba8_pixel_frame(const std::byte* data, std::uint32_t width, std::uint32_t height, std::uint32_t stride, std::uint64_t sequence) {
if (data == nullptr || stride < width * 4U)
return {};
std::string frame = make_rgba8_pixel_frame(width, height, sequence);
if (frame.empty())
return {};
const std::size_t row_size = static_cast<std::size_t>(width) * 4U;
char* output = frame.data() + pixel_frame_header_size;
for (std::uint32_t y = 0; y < height; ++y) {
const auto* row = data + static_cast<std::size_t>(y) * stride;
+3 -2
View File
@@ -3,6 +3,7 @@
#include <cstdint>
#include <string>
namespace renderive::web {
inline constexpr std::size_t pixel_frame_header_size = 16;
[[nodiscard]] std::string encode_rgba8_pixel_frame(const std::byte* data, std::uint32_t width, std::uint32_t height, std::uint32_t stride);
inline constexpr std::size_t pixel_frame_header_size = 24;
[[nodiscard]] std::string make_rgba8_pixel_frame(std::uint32_t width, std::uint32_t height, std::uint64_t sequence);
[[nodiscard]] std::string encode_rgba8_pixel_frame(const std::byte* data, std::uint32_t width, std::uint32_t height, std::uint32_t stride, std::uint64_t sequence);
}