Video frames are about to be shared between the decoder, the data provider, the display sink, and Web painting code. Passing them by value keeps ownership tied to the old bitmap-shaped pipeline and makes later lifetime changes harder to reason about. Make VideoFrame ref-counted and return NonnullRefPtr from the decoder and media queues. This changes ownership only: a VideoFrame still wraps an ImmutableBitmap at this point, so playback behavior remains unchanged while later commits can move storage and painting independently.
31 lines
934 B
C++
31 lines
934 B
C++
/*
|
|
* Copyright (c) 2022, Gregory Bertilson <zaggy1024@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/ByteBuffer.h>
|
|
#include <AK/NonnullOwnPtr.h>
|
|
#include <AK/NonnullRefPtr.h>
|
|
#include <AK/Time.h>
|
|
#include <LibMedia/Color/CodingIndependentCodePoints.h>
|
|
|
|
#include "DecoderError.h"
|
|
|
|
namespace Media {
|
|
|
|
class VideoDecoder {
|
|
public:
|
|
virtual ~VideoDecoder() { }
|
|
|
|
virtual DecoderErrorOr<void> receive_coded_data(AK::Duration timestamp, AK::Duration duration, ReadonlyBytes coded_data) = 0;
|
|
DecoderErrorOr<void> receive_coded_data(AK::Duration timestamp, AK::Duration duration, ByteBuffer const& coded_data) { return receive_coded_data(timestamp, duration, coded_data.span()); }
|
|
virtual void signal_end_of_stream() = 0;
|
|
virtual DecoderErrorOr<NonnullRefPtr<VideoFrame>> get_decoded_frame(CodingIndependentCodePoints const& container_cicp) = 0;
|
|
|
|
virtual void flush() = 0;
|
|
};
|
|
|
|
}
|