Skip to content

Commit 523e7e2

Browse files
Zaggy1024gmta
authored andcommitted
LibMedia: Make Demuxer atomically ref-counted
We'll need to share the demuxer between multiple decoder providers, and those will hold references to the demuxer from their own decoder threads.
1 parent 27742ef commit 523e7e2

File tree

7 files changed

+21
-20
lines changed

7 files changed

+21
-20
lines changed

Libraries/LibMedia/Containers/Matroska/MatroskaDemuxer.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,19 @@
1313

1414
namespace Media::Matroska {
1515

16-
DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> MatroskaDemuxer::from_file(StringView filename)
16+
DecoderErrorOr<NonnullRefPtr<MatroskaDemuxer>> MatroskaDemuxer::from_file(StringView filename)
1717
{
18-
return make<MatroskaDemuxer>(TRY(Reader::from_file(filename)));
18+
return make_ref_counted<MatroskaDemuxer>(TRY(Reader::from_file(filename)));
1919
}
2020

21-
DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> MatroskaDemuxer::from_mapped_file(NonnullOwnPtr<Core::MappedFile> mapped_file)
21+
DecoderErrorOr<NonnullRefPtr<MatroskaDemuxer>> MatroskaDemuxer::from_mapped_file(NonnullOwnPtr<Core::MappedFile> mapped_file)
2222
{
23-
return make<MatroskaDemuxer>(TRY(Reader::from_mapped_file(move(mapped_file))));
23+
return make_ref_counted<MatroskaDemuxer>(TRY(Reader::from_mapped_file(move(mapped_file))));
2424
}
2525

26-
DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> MatroskaDemuxer::from_data(ReadonlyBytes data)
26+
DecoderErrorOr<NonnullRefPtr<MatroskaDemuxer>> MatroskaDemuxer::from_data(ReadonlyBytes data)
2727
{
28-
return make<MatroskaDemuxer>(TRY(Reader::from_data(data)));
28+
return make_ref_counted<MatroskaDemuxer>(TRY(Reader::from_data(data)));
2929
}
3030

3131
static TrackEntry::TrackType matroska_track_type_from_track_type(TrackType type)

Libraries/LibMedia/Containers/Matroska/MatroskaDemuxer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ class MatroskaDemuxer final : public Demuxer {
1717
public:
1818
// FIXME: We should instead accept some abstract data streaming type so that the demuxer
1919
// can work with non-contiguous data.
20-
static DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> from_file(StringView filename);
21-
static DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> from_mapped_file(NonnullOwnPtr<Core::MappedFile> mapped_file);
20+
static DecoderErrorOr<NonnullRefPtr<MatroskaDemuxer>> from_file(StringView filename);
21+
static DecoderErrorOr<NonnullRefPtr<MatroskaDemuxer>> from_mapped_file(NonnullOwnPtr<Core::MappedFile> mapped_file);
2222

23-
static DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> from_data(ReadonlyBytes data);
23+
static DecoderErrorOr<NonnullRefPtr<MatroskaDemuxer>> from_data(ReadonlyBytes data);
2424

2525
MatroskaDemuxer(Reader&& reader)
2626
: m_reader(move(reader))

Libraries/LibMedia/Demuxer.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
/*
2-
* Copyright (c) 2022, Gregory Bertilson <zaggy1024@gmail.com>
2+
* Copyright (c) 2022-2025, Gregory Bertilson <gregory@ladybird.org>
33
*
44
* SPDX-License-Identifier: BSD-2-Clause
55
*/
66

77
#pragma once
88

9+
#include <AK/AtomicRefCounted.h>
910
#include <AK/NonnullOwnPtr.h>
1011
#include <LibCore/EventReceiver.h>
1112

@@ -16,7 +17,7 @@
1617

1718
namespace Media {
1819

19-
class Demuxer {
20+
class Demuxer : public AtomicRefCounted<Demuxer> {
2021
public:
2122
virtual ~Demuxer() = default;
2223

Libraries/LibMedia/FFmpeg/FFmpegDemuxer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ FFmpegDemuxer::~FFmpegDemuxer()
2828
avformat_close_input(&m_format_context);
2929
}
3030

31-
ErrorOr<NonnullOwnPtr<FFmpegDemuxer>> FFmpegDemuxer::create(NonnullOwnPtr<SeekableStream> stream)
31+
ErrorOr<NonnullRefPtr<FFmpegDemuxer>> FFmpegDemuxer::create(NonnullOwnPtr<SeekableStream> stream)
3232
{
3333
auto io_context = TRY(Media::FFmpeg::FFmpegIOContext::create(*stream));
34-
auto demuxer = make<FFmpegDemuxer>(move(stream), move(io_context));
34+
auto demuxer = make_ref_counted<FFmpegDemuxer>(move(stream), move(io_context));
3535

3636
// Open the container
3737
demuxer->m_format_context = avformat_alloc_context();

Libraries/LibMedia/FFmpeg/FFmpegDemuxer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace Media::FFmpeg {
2020

2121
class FFmpegDemuxer : public Demuxer {
2222
public:
23-
static ErrorOr<NonnullOwnPtr<FFmpegDemuxer>> create(NonnullOwnPtr<SeekableStream> stream);
23+
static ErrorOr<NonnullRefPtr<FFmpegDemuxer>> create(NonnullOwnPtr<SeekableStream> stream);
2424

2525
FFmpegDemuxer(NonnullOwnPtr<SeekableStream> stream, NonnullOwnPtr<Media::FFmpeg::FFmpegIOContext>);
2626
virtual ~FFmpegDemuxer() override;

Libraries/LibMedia/PlaybackManager.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::from_stream(Nonn
4141
return create(demuxer_or_error.release_value());
4242
}
4343

44-
PlaybackManager::PlaybackManager(NonnullOwnPtr<Demuxer>& demuxer, Track video_track, NonnullOwnPtr<VideoDecoder>&& decoder, VideoFrameQueue&& frame_queue)
45-
: m_demuxer(move(demuxer))
44+
PlaybackManager::PlaybackManager(NonnullRefPtr<Demuxer> const& demuxer, Track video_track, NonnullOwnPtr<VideoDecoder>&& decoder, VideoFrameQueue&& frame_queue)
45+
: m_demuxer(demuxer)
4646
, m_selected_video_track(video_track)
4747
, m_frame_queue(move(frame_queue))
4848
, m_decoder(move(decoder))
@@ -696,7 +696,7 @@ class PlaybackManager::StoppedStateHandler : public PlaybackManager::PlaybackSta
696696
PlaybackState get_state() const override { return PlaybackState::Stopped; }
697697
};
698698

699-
DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::create(NonnullOwnPtr<Demuxer> demuxer)
699+
DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::create(NonnullRefPtr<Demuxer> const& demuxer)
700700
{
701701
auto optional_track = TRY(demuxer->get_preferred_track_for_type(TrackType::Video));
702702
if (!optional_track.has_value()) {

Libraries/LibMedia/PlaybackManager.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class MEDIA_API PlaybackManager {
114114
static DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> from_data(ReadonlyBytes data);
115115
static DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> from_stream(NonnullOwnPtr<SeekableStream> stream);
116116

117-
PlaybackManager(NonnullOwnPtr<Demuxer>& demuxer, Track video_track, NonnullOwnPtr<VideoDecoder>&& decoder, VideoFrameQueue&& frame_queue);
117+
PlaybackManager(NonnullRefPtr<Demuxer> const& demuxer, Track video_track, NonnullOwnPtr<VideoDecoder>&& decoder, VideoFrameQueue&& frame_queue);
118118
~PlaybackManager();
119119

120120
void resume_playback();
@@ -153,7 +153,7 @@ class MEDIA_API PlaybackManager {
153153
class SeekingStateHandler;
154154
class StoppedStateHandler;
155155

156-
static DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> create(NonnullOwnPtr<Demuxer> demuxer);
156+
static DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> create(NonnullRefPtr<Demuxer> const& demuxer);
157157

158158
void timer_callback();
159159
// This must be called with m_demuxer_mutex locked!
@@ -173,7 +173,7 @@ class MEDIA_API PlaybackManager {
173173

174174
AK::Duration m_last_present_in_media_time = AK::Duration::zero();
175175

176-
NonnullOwnPtr<Demuxer> m_demuxer;
176+
NonnullRefPtr<Demuxer> m_demuxer;
177177
Threading::Mutex m_decoder_mutex;
178178
Track m_selected_video_track;
179179

0 commit comments

Comments
 (0)