/* * Copyright 2023 jacqueline * * SPDX-License-Identifier: GPL-3.0-only */ #pragma once #include #include #include #include #include #include #include "ivorbisfile.h" #include "ogg/ogg.h" #include "opus.h" #include "sample.hpp" #include "span.hpp" #include "codec.hpp" namespace codecs { class TremorVorbisDecoder : public ICodec { public: TremorVorbisDecoder(); ~TremorVorbisDecoder(); /* * Returns the output format for the next frame in the stream. MP3 streams * may represent multiple distinct tracks, with different bitrates, and so we * handle the stream only on a frame-by-frame basis. */ auto BeginStream(cpp::span) -> Result override; /* * Writes samples for the current frame. */ auto ContinueStream(cpp::span input, cpp::span output) -> Result override; auto SeekStream(cpp::span input, std::size_t target_sample) -> Result override; auto ReadCallback() -> cpp::span; auto AfterReadCallback(size_t bytes_read) -> void; private: OggVorbis_File vorbis_; cpp::span input_; size_t pos_in_input_; }; } // namespace codecs