From 4887378ce74c27f837fe1939ad5917b221736fac Mon Sep 17 00:00:00 2001 From: ayumi Date: Tue, 22 Jul 2025 09:27:29 +0200 Subject: Preliminary ALAC support --- src/codecs/include/alac.hpp | 91 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/codecs/include/alac.hpp (limited to 'src/codecs/include/alac.hpp') diff --git a/src/codecs/include/alac.hpp b/src/codecs/include/alac.hpp new file mode 100644 index 00000000..a0dcd1f2 --- /dev/null +++ b/src/codecs/include/alac.hpp @@ -0,0 +1,91 @@ +/* + * Copyright 2025 ayumi + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +extern "C" { + #include "decomp.h" +} +#include "sample.hpp" + +#include "codec.hpp" + +namespace codecs { + +class AlacDecoder : public ICodec { + public: + AlacDecoder(); + ~AlacDecoder(); + + auto OpenStream(std::shared_ptr input, uint32_t offset) + -> cpp::result override; + auto DecodeTo(std::span destination) + -> cpp::result override; + + AlacDecoder(const AlacDecoder&) = delete; + AlacDecoder& operator=(const AlacDecoder&) = delete; + + private: + auto readBoxHeader() + -> cpp::result>, ICodec::Error>; + auto readFullBoxHeader() -> std::tuple; + auto readFtyp(uint64_t size) -> cpp::result; + void readFree(uint64_t size); + auto readStsd() -> cpp::result; + auto readStts() -> cpp::result; + auto readStsc() -> cpp::result; + auto readStsz() -> cpp::result; + auto readStco() -> cpp::result; + auto readCo64() -> cpp::result; + auto readBox() -> cpp::result; + auto readContainer(uint64_t size) -> cpp::result; + auto getFrameDuration(uint32_t frame) -> cpp::result; + auto getFrameSize(uint32_t frame) -> uint32_t; + auto getTotalSamples() -> uint64_t; + auto getTotalFrames() -> uint32_t; + auto getTotalFrameSize() -> uint64_t; + auto frameToOffset(uint32_t frame) + -> cpp::result, ICodec::Error>; + auto getChunkMixMaxFrames(uint32_t chunk) + -> cpp::result, ICodec::Error>; + auto sampleToFrame(uint64_t sample) + -> cpp::result, ICodec::Error>; + auto UnpackFrame(uint32_t offset) -> cpp::result; + + std::shared_ptr input_; + alac_file alac_; + uint8_t bitdepth_; + uint8_t channels_; + uint16_t sampleRate_; + uint16_t index_; + + std::vector> stts_; + std::vector> stsc_; + std::variant> stsz_; + std::vector stco_; + + bool hasStts_ = false; + bool hasStsc_ = false; + bool hasStsz_ = false; + bool hasStco_ = false; + + uint32_t chunk_; + uint32_t frame_; + std::vector in_; + std::vector out_; + size_t outSize_; + size_t outOff_; +}; + +} // namespace codecs -- cgit v1.2.3