diff --git a/include/dwarfs/block_compressor.h b/include/dwarfs/block_compressor.h index 4a69e82f..5bd28f8c 100644 --- a/include/dwarfs/block_compressor.h +++ b/include/dwarfs/block_compressor.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -128,6 +129,8 @@ class block_decompressor { compression_type type() const { return impl_->type(); } + std::optional metadata() const { return impl_->metadata(); } + static std::vector decompress(compression_type type, const uint8_t* data, size_t size) { std::vector 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 metadata() const = 0; virtual compression_type type() const = 0; }; diff --git a/src/dwarfs/compression/brotli.cpp b/src/dwarfs/compression/brotli.cpp index 8f677ddd..83d9fa45 100644 --- a/src/dwarfs/compression/brotli.cpp +++ b/src/dwarfs/compression/brotli.cpp @@ -127,6 +127,8 @@ class brotli_block_decompressor final : public block_decompressor::impl { compression_type type() const override { return compression_type::BROTLI; } + std::optional metadata() const override { return std::nullopt; } + bool decompress_frame(size_t frame_size) override { size_t pos = decompressed_.size(); diff --git a/src/dwarfs/compression/flac.cpp b/src/dwarfs/compression/flac.cpp index 08d793d4..c1ada95a 100644 --- a/src/dwarfs/compression/flac.cpp +++ b/src/dwarfs/compression/flac.cpp @@ -425,6 +425,21 @@ class flac_block_decompressor final : public block_decompressor::impl { compression_type type() const override { return compression_type::FLAC; } + std::optional 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(); diff --git a/src/dwarfs/compression/lz4.cpp b/src/dwarfs/compression/lz4.cpp index 4117452b..e131029f 100644 --- a/src/dwarfs/compression/lz4.cpp +++ b/src/dwarfs/compression/lz4.cpp @@ -125,6 +125,8 @@ class lz4_block_decompressor final : public block_decompressor::impl { compression_type type() const override { return compression_type::LZ4; } + std::optional metadata() const override { return std::nullopt; } + bool decompress_frame(size_t) override { if (!error_.empty()) { DWARFS_THROW(runtime_error, error_); diff --git a/src/dwarfs/compression/lzma.cpp b/src/dwarfs/compression/lzma.cpp index 56728d92..a3260ef2 100644 --- a/src/dwarfs/compression/lzma.cpp +++ b/src/dwarfs/compression/lzma.cpp @@ -224,6 +224,8 @@ class lzma_block_decompressor final : public block_decompressor::impl { compression_type type() const override { return compression_type::LZMA; } + std::optional metadata() const override { return std::nullopt; } + bool decompress_frame(size_t frame_size) override { if (!error_.empty()) { DWARFS_THROW(runtime_error, error_); diff --git a/src/dwarfs/compression/null.cpp b/src/dwarfs/compression/null.cpp index 39aae0da..d9bed9b7 100644 --- a/src/dwarfs/compression/null.cpp +++ b/src/dwarfs/compression/null.cpp @@ -81,6 +81,8 @@ class null_block_decompressor final : public block_decompressor::impl { compression_type type() const override { return compression_type::NONE; } + std::optional 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(); diff --git a/src/dwarfs/compression/zstd.cpp b/src/dwarfs/compression/zstd.cpp index 89220319..f9dd3560 100644 --- a/src/dwarfs/compression/zstd.cpp +++ b/src/dwarfs/compression/zstd.cpp @@ -145,6 +145,8 @@ class zstd_block_decompressor final : public block_decompressor::impl { compression_type type() const override { return compression_type::ZSTD; } + std::optional metadata() const override { return std::nullopt; } + bool decompress_frame(size_t /*frame_size*/) override { if (!error_.empty()) { DWARFS_THROW(runtime_error, error_);