浏览代码

LibVideo: Add `PlaybackManager::from_mapped_file`

This allows us to create a PlaybackManager from a file which has already
been mapped, instead of passing a file name.

This means that anyone who uses `PlaybackManager` can now use LibFSAC :)
Caoimhe 2 年之前
父节点
当前提交
465fa3460f

+ 5 - 0
Userland/Libraries/LibVideo/Containers/Matroska/MatroskaDemuxer.cpp

@@ -14,6 +14,11 @@ DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> MatroskaDemuxer::from_file(String
     return make<MatroskaDemuxer>(TRY(Reader::from_file(filename)));
 }
 
+DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> MatroskaDemuxer::from_mapped_file(NonnullRefPtr<Core::MappedFile> mapped_file)
+{
+    return make<MatroskaDemuxer>(TRY(Reader::from_mapped_file(move(mapped_file))));
+}
+
 DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> MatroskaDemuxer::from_data(ReadonlyBytes data)
 {
     return make<MatroskaDemuxer>(TRY(Reader::from_data(data)));

+ 2 - 0
Userland/Libraries/LibVideo/Containers/Matroska/MatroskaDemuxer.h

@@ -18,6 +18,8 @@ public:
     // FIXME: We should instead accept some abstract data streaming type so that the demuxer
     //        can work with non-contiguous data.
     static DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> from_file(StringView filename);
+    static DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> from_mapped_file(NonnullRefPtr<Core::MappedFile> mapped_file);
+
     static DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> from_data(ReadonlyBytes data);
 
     MatroskaDemuxer(Reader&& reader)

+ 6 - 1
Userland/Libraries/LibVideo/Containers/Matroska/Reader.cpp

@@ -81,8 +81,13 @@ constexpr u32 CUE_REFERENCE_ID = 0xDB;
 DecoderErrorOr<Reader> Reader::from_file(StringView path)
 {
     auto mapped_file = DECODER_TRY(DecoderErrorCategory::IO, Core::MappedFile::map(path));
+    return from_mapped_file(mapped_file);
+}
+
+DecoderErrorOr<Reader> Reader::from_mapped_file(NonnullRefPtr<Core::MappedFile> mapped_file)
+{
     auto reader = TRY(from_data(mapped_file->bytes()));
-    reader.m_mapped_file = mapped_file;
+    reader.m_mapped_file = move(mapped_file);
     return reader;
 }
 

+ 2 - 0
Userland/Libraries/LibVideo/Containers/Matroska/Reader.h

@@ -25,6 +25,8 @@ public:
     typedef Function<DecoderErrorOr<IterationDecision>(TrackEntry const&)> TrackEntryCallback;
 
     static DecoderErrorOr<Reader> from_file(StringView path);
+    static DecoderErrorOr<Reader> from_mapped_file(NonnullRefPtr<Core::MappedFile> mapped_file);
+
     static DecoderErrorOr<Reader> from_data(ReadonlyBytes data);
 
     EBMLHeader const& header() const { return m_header.value(); }

+ 6 - 0
Userland/Libraries/LibVideo/PlaybackManager.cpp

@@ -31,6 +31,12 @@ DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::from_file(String
     return create_with_demuxer(move(demuxer));
 }
 
+DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::from_mapped_file(NonnullRefPtr<Core::MappedFile> mapped_file)
+{
+    auto demuxer = TRY(Matroska::MatroskaDemuxer::from_mapped_file(move(mapped_file)));
+    return create_with_demuxer(move(demuxer));
+}
+
 DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::from_data(ReadonlyBytes data)
 {
     auto demuxer = TRY(Matroska::MatroskaDemuxer::from_data(data));

+ 2 - 0
Userland/Libraries/LibVideo/PlaybackManager.h

@@ -101,6 +101,8 @@ public:
     static constexpr SeekMode DEFAULT_SEEK_MODE = SeekMode::Accurate;
 
     static DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> from_file(StringView file);
+    static DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> from_mapped_file(NonnullRefPtr<Core::MappedFile> file);
+
     static DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> from_data(ReadonlyBytes data);
 
     PlaybackManager(NonnullOwnPtr<Demuxer>& demuxer, Track video_track, NonnullOwnPtr<VideoDecoder>&& decoder);