From c0ef5b2b7cfd8ca76f2f93e5f3e5dc054834730c Mon Sep 17 00:00:00 2001 From: Dario Casalinuovo Date: Thu, 4 May 2017 14:00:06 +0200 Subject: [PATCH] MediaFile: Little refactor to use the MediaStreamer class * This clarify the ownership of the source when using the experimental API. * The extractor/writer are simplified and don't have to care about adapters. * MediaStreamer is able to provide a generic BAdapterIO that is suitable also for different uses than the codecs API itself. --- headers/os/media/MediaFile.h | 8 +++-- src/kits/media/Jamfile | 1 + src/kits/media/MediaFile.cpp | 52 ++++++++++++++++++++++++-------- src/kits/media/PluginManager.cpp | 11 ++++++- 4 files changed, 56 insertions(+), 16 deletions(-) diff --git a/headers/os/media/MediaFile.h b/headers/os/media/MediaFile.h index 355e20d617..9b105d8eb0 100644 --- a/headers/os/media/MediaFile.h +++ b/headers/os/media/MediaFile.h @@ -16,6 +16,7 @@ namespace BPrivate { namespace media { class MediaExtractor; + class MediaStreamer; class MediaWriter; } class _AddonManager; @@ -172,6 +173,8 @@ private: int32 fWriterID; media_file_format fMFI; + BPrivate::media::MediaStreamer* fStreamer; + bool fFileClosed; bool fDeleteSource; bool _reserved_was_fUnused[2]; @@ -186,6 +189,8 @@ private: const BUrl* url, const media_file_format* fileFormat, int32 flags); + void _InitStreamer(const BUrl& url, + BDataIO** adapter); BMediaFile(); BMediaFile(const BMediaFile&); @@ -193,10 +198,9 @@ private: BDataIO* fSource; - // FBC data and virtuals - uint32 _reserved_BMediaFile_[32]; + uint32 _reserved_BMediaFile_[31]; virtual status_t _Reserved_BMediaFile_0(int32 arg, ...); virtual status_t _Reserved_BMediaFile_1(int32 arg, ...); diff --git a/src/kits/media/Jamfile b/src/kits/media/Jamfile index d89aebf8e1..fce76596ce 100644 --- a/src/kits/media/Jamfile +++ b/src/kits/media/Jamfile @@ -92,6 +92,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { EncoderPlugin.cpp MediaExtractor.cpp MediaPlugin.cpp + MediaStreamer.cpp MediaWriter.cpp PluginManager.cpp ReaderPlugin.cpp diff --git a/src/kits/media/MediaFile.cpp b/src/kits/media/MediaFile.cpp index 12592bd197..ba81c5f6a1 100644 --- a/src/kits/media/MediaFile.cpp +++ b/src/kits/media/MediaFile.cpp @@ -18,6 +18,7 @@ #include "debug.h" #include "MediaExtractor.h" +#include "MediaStreamer.h" #include "MediaWriter.h" @@ -450,6 +451,7 @@ BMediaFile::_Init() fTrackNum = 0; fTrackList = NULL; fExtractor = NULL; + fStreamer = NULL; fWriter = NULL; fWriterID = 0; fErr = B_OK; @@ -474,6 +476,7 @@ BMediaFile::_UnInit() fSource = NULL; fDeleteSource = false; } + // Deleting the extractor or writer can cause unloading of the plugins. // The source must be deleted before that, because it can come from a // plugin (for example the http_streamer) @@ -481,6 +484,8 @@ BMediaFile::_UnInit() fExtractor = NULL; delete fWriter; fWriter = NULL; + delete fStreamer; + fStreamer = NULL; } @@ -494,20 +499,21 @@ BMediaFile::_InitReader(BDataIO* source, const BUrl* url, int32 flags) return; } - if (source != NULL) { - if (BFile* file = dynamic_cast(source)) { - fErr = file->InitCheck(); - if (fErr != B_OK) - return; - } - fExtractor = new(std::nothrow) MediaExtractor(source, flags); - } else - fExtractor = new(std::nothrow) MediaExtractor(*url, flags); + if (source == NULL) + _InitStreamer(*url, &source); + else if (BFile* file = dynamic_cast(source)) + fErr = file->InitCheck(); + + if (fErr != B_OK) + return; + + fExtractor = new(std::nothrow) MediaExtractor(source, flags); if (fExtractor == NULL) fErr = B_NO_MEMORY; else fErr = fExtractor->InitCheck(); + if (fErr != B_OK) return; @@ -543,10 +549,13 @@ BMediaFile::_InitWriter(BDataIO* target, const BUrl* url, fMFI = *fileFormat; - if (target != NULL) - fWriter = new(std::nothrow) MediaWriter(target, fMFI); - else - fWriter = new(std::nothrow) MediaWriter(*url, fMFI); + if (target == NULL) { + _InitStreamer(*url, &target); + if (fErr != B_OK) + return; + } + + fWriter = new(std::nothrow) MediaWriter(target, fMFI); if (fWriter == NULL) fErr = B_NO_MEMORY; @@ -561,6 +570,23 @@ BMediaFile::_InitWriter(BDataIO* target, const BUrl* url, } +void +BMediaFile::_InitStreamer(const BUrl& url, BDataIO** adapter) +{ + if (fStreamer != NULL) + delete fStreamer; + + TRACE(url.UrlString()); + + fStreamer = new(std::nothrow) MediaStreamer(url); + if (fStreamer == NULL) { + fErr = B_NO_MEMORY; + return; + } + + fErr = fStreamer->CreateAdapter(adapter); +} + /* //unimplemented BMediaFile::BMediaFile(); diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp index 8a2edd66f3..c7fa5cf1ea 100644 --- a/src/kits/media/PluginManager.cpp +++ b/src/kits/media/PluginManager.cpp @@ -137,6 +137,11 @@ public: delete fDataIOAdapter; } + status_t InitCheck() const + { + return fErr; + } + // BMediaIO interface virtual void GetFlags(int32* flags) const @@ -231,11 +236,15 @@ PluginManager::CreateReader(Reader** reader, int32* streamCount, BMediaIOWrapper* buffered_source = new BMediaIOWrapper(source); ObjectDeleter ioDeleter(buffered_source); + status_t ret = buffered_source->InitCheck(); + if (ret != B_OK) + return ret; + // get list of available readers from the server entry_ref refs[MAX_READERS]; int32 count; - status_t ret = AddOnManager::GetInstance()->GetReaders(refs, &count, + ret = AddOnManager::GetInstance()->GetReaders(refs, &count, MAX_READERS); if (ret != B_OK) { printf("PluginManager::CreateReader: can't get list of readers: %s\n",