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.
35 lines
1 KiB
C++
35 lines
1 KiB
C++
/*
|
|
* Copyright (c) 2024, Gregory Bertilson <zaggy1024@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibMedia/CodecID.h>
|
|
#include <LibMedia/Export.h>
|
|
#include <LibMedia/VideoDecoder.h>
|
|
|
|
#include "FFmpegForward.h"
|
|
|
|
namespace Media::FFmpeg {
|
|
|
|
class MEDIA_API FFmpegVideoDecoder final : public VideoDecoder {
|
|
public:
|
|
static DecoderErrorOr<NonnullOwnPtr<FFmpegVideoDecoder>> try_create(CodecID, ReadonlyBytes codec_initialization_data);
|
|
FFmpegVideoDecoder(AVCodecContext* codec_context, AVPacket* packet, AVFrame* frame);
|
|
virtual ~FFmpegVideoDecoder() override;
|
|
|
|
virtual DecoderErrorOr<void> receive_coded_data(AK::Duration timestamp, AK::Duration duration, ReadonlyBytes coded_data) override;
|
|
virtual void signal_end_of_stream() override;
|
|
virtual DecoderErrorOr<NonnullRefPtr<VideoFrame>> get_decoded_frame(CodingIndependentCodePoints const& container_cicp) override;
|
|
|
|
virtual void flush() override;
|
|
|
|
private:
|
|
AVCodecContext* m_codec_context;
|
|
AVPacket* m_packet;
|
|
AVFrame* m_frame;
|
|
};
|
|
|
|
}
|