mirror of
https://github.com/mhx/dwarfs.git
synced 2025-08-04 02:06:22 -04:00
feat: add interface to retrieve metadata from block decompressor
This commit is contained in:
parent
ce3972f0b4
commit
a2e44d13d5
@ -25,6 +25,7 @@
|
||||
#include <cstdio>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <span>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
@ -128,6 +129,8 @@ class block_decompressor {
|
||||
|
||||
compression_type type() const { return impl_->type(); }
|
||||
|
||||
std::optional<std::string> metadata() const { return impl_->metadata(); }
|
||||
|
||||
static std::vector<uint8_t>
|
||||
decompress(compression_type type, const uint8_t* data, size_t size) {
|
||||
std::vector<uint8_t> target;
|
||||
@ -142,6 +145,7 @@ class block_decompressor {
|
||||
|
||||
virtual bool decompress_frame(size_t frame_size) = 0;
|
||||
virtual size_t uncompressed_size() const = 0;
|
||||
virtual std::optional<std::string> metadata() const = 0;
|
||||
|
||||
virtual compression_type type() const = 0;
|
||||
};
|
||||
|
@ -127,6 +127,8 @@ class brotli_block_decompressor final : public block_decompressor::impl {
|
||||
|
||||
compression_type type() const override { return compression_type::BROTLI; }
|
||||
|
||||
std::optional<std::string> metadata() const override { return std::nullopt; }
|
||||
|
||||
bool decompress_frame(size_t frame_size) override {
|
||||
size_t pos = decompressed_.size();
|
||||
|
||||
|
@ -425,6 +425,21 @@ class flac_block_decompressor final : public block_decompressor::impl {
|
||||
|
||||
compression_type type() const override { return compression_type::FLAC; }
|
||||
|
||||
std::optional<std::string> metadata() const override {
|
||||
auto const flags = header_.flags().value();
|
||||
folly::dynamic meta = folly::dynamic::object
|
||||
// clang-format off
|
||||
("endianness", flags & kFlagBigEndian ? "big" : "little")
|
||||
("signedness", flags & kFlagSigned ? "signed" : "unsigned")
|
||||
("padding", flags & kFlagLsbPadding ? "lsb" : "msb")
|
||||
("bytes_per_sample", (flags & kBytesPerSampleMask) + 1)
|
||||
("bits_per_sample", header_.bits_per_sample().value())
|
||||
("number_of_channels", header_.num_channels().value())
|
||||
; // clang-format on
|
||||
|
||||
return folly::toJson(meta);
|
||||
}
|
||||
|
||||
bool decompress_frame(size_t frame_size) override {
|
||||
size_t pos = decompressed_.size();
|
||||
|
||||
|
@ -125,6 +125,8 @@ class lz4_block_decompressor final : public block_decompressor::impl {
|
||||
|
||||
compression_type type() const override { return compression_type::LZ4; }
|
||||
|
||||
std::optional<std::string> metadata() const override { return std::nullopt; }
|
||||
|
||||
bool decompress_frame(size_t) override {
|
||||
if (!error_.empty()) {
|
||||
DWARFS_THROW(runtime_error, error_);
|
||||
|
@ -224,6 +224,8 @@ class lzma_block_decompressor final : public block_decompressor::impl {
|
||||
|
||||
compression_type type() const override { return compression_type::LZMA; }
|
||||
|
||||
std::optional<std::string> metadata() const override { return std::nullopt; }
|
||||
|
||||
bool decompress_frame(size_t frame_size) override {
|
||||
if (!error_.empty()) {
|
||||
DWARFS_THROW(runtime_error, error_);
|
||||
|
@ -81,6 +81,8 @@ class null_block_decompressor final : public block_decompressor::impl {
|
||||
|
||||
compression_type type() const override { return compression_type::NONE; }
|
||||
|
||||
std::optional<std::string> metadata() const override { return std::nullopt; }
|
||||
|
||||
bool decompress_frame(size_t frame_size) override {
|
||||
if (decompressed_.size() + frame_size > uncompressed_size_) {
|
||||
frame_size = uncompressed_size_ - decompressed_.size();
|
||||
|
@ -145,6 +145,8 @@ class zstd_block_decompressor final : public block_decompressor::impl {
|
||||
|
||||
compression_type type() const override { return compression_type::ZSTD; }
|
||||
|
||||
std::optional<std::string> metadata() const override { return std::nullopt; }
|
||||
|
||||
bool decompress_frame(size_t /*frame_size*/) override {
|
||||
if (!error_.empty()) {
|
||||
DWARFS_THROW(runtime_error, error_);
|
||||
|
Loading…
x
Reference in New Issue
Block a user