diff options
Diffstat (limited to 'src/codecs/include/codec.hpp')
| -rw-r--r-- | src/codecs/include/codec.hpp | 60 |
1 files changed, 35 insertions, 25 deletions
diff --git a/src/codecs/include/codec.hpp b/src/codecs/include/codec.hpp index 31c67e13..4b5ab47f 100644 --- a/src/codecs/include/codec.hpp +++ b/src/codecs/include/codec.hpp @@ -21,48 +21,58 @@ namespace codecs { +/* + * Common interface to be implemented by all audio decoders. + */ class ICodec { public: virtual ~ICodec() {} + /* Errors that may be returned by codecs. */ + enum class Error { + // Indicates that more data is required before this codec can finish its + // operation. E.g. the input buffer ends with a truncated frame. + kOutOfInput, + // Indicates that the data within the input buffer is fatally malformed. + kMalformedData, + + kInternalError, + }; + + /* + * Alias for more readable return types. All codec methods, success or + * failure, should also return the number of bytes they consumed. + */ + template <typename T> + using Result = std::pair<std::size_t, cpp::result<T, Error>>; + struct OutputFormat { uint8_t num_channels; uint8_t bits_per_sample; uint32_t sample_rate_hz; }; - virtual auto GetOutputFormat() -> std::optional<OutputFormat> = 0; - - enum ProcessingError { MALFORMED_DATA }; - - virtual auto SetInput(cpp::span<const std::byte> input) -> void = 0; - /* - * Returns the codec's next read position within the input buffer. If the - * codec is out of usable data, but there is still some data left in the - * stream, that data should be prepended to the next input buffer. + * Decodes metadata or headers from the given input stream, and returns the + * format for the samples that will be decoded from it. */ - virtual auto GetInputPosition() -> std::size_t = 0; + virtual auto BeginStream(cpp::span<const std::byte> input) + -> Result<OutputFormat> = 0; - /* - * Read one frame (or equivalent discrete chunk) from the input, and - * synthesize output samples for it. - * - * Returns true if we are out of usable data from the input stream, or false - * otherwise. - */ - virtual auto ProcessNextFrame() -> cpp::result<bool, ProcessingError> = 0; + struct OutputInfo { + std::size_t bytes_written; + bool is_finished_writing; + }; /* * Writes PCM samples to the given output buffer. - * - * Returns the number of bytes that were written, and true if all of the - * samples synthesized from the last call to `ProcessNextFrame` have been - * written. If this returns false, then this method should be called again - * after flushing the output buffer. */ - virtual auto WriteOutputSamples(cpp::span<std::byte> output) - -> std::pair<std::size_t, bool> = 0; + virtual auto ContinueStream(cpp::span<const std::byte> input, + cpp::span<std::byte> output) + -> Result<OutputInfo> = 0; + + virtual auto SeekStream(cpp::span<const std::byte> input, + std::size_t target_sample) -> Result<void> = 0; }; auto CreateCodecForType(StreamType type) -> std::optional<ICodec*>; |
