/* * Copyright (c) 2023, Gregory Bertilson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include namespace Gfx::ISOBMFF { class BoxStream final : public Stream { public: explicit BoxStream(Stream& stream, size_t size) : m_stream(stream) , m_data_left(size) { } virtual bool is_eof() const override { return m_stream.is_eof() || remaining() == 0; } virtual bool is_open() const override { return m_stream.is_open(); } virtual void close() override { m_stream.close(); } virtual ErrorOr read_some(Bytes bytes) override { auto read_bytes = TRY(m_stream.read_some(bytes)); m_data_left -= min(read_bytes.size(), m_data_left); return read_bytes; } virtual ErrorOr write_some(ReadonlyBytes) override { VERIFY_NOT_REACHED(); } virtual ErrorOr write_until_depleted(ReadonlyBytes) override { VERIFY_NOT_REACHED(); } size_t remaining() const { return m_data_left; } ErrorOr discard_remaining() { return discard(remaining()); } private: Stream& m_stream; size_t m_data_left; }; }