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.
This commit is contained in:
Dario Casalinuovo 2017-05-04 14:00:06 +02:00
parent 9198105dbb
commit c0ef5b2b7c
4 changed files with 56 additions and 16 deletions

View File

@ -16,6 +16,7 @@
namespace BPrivate { namespace BPrivate {
namespace media { namespace media {
class MediaExtractor; class MediaExtractor;
class MediaStreamer;
class MediaWriter; class MediaWriter;
} }
class _AddonManager; class _AddonManager;
@ -172,6 +173,8 @@ private:
int32 fWriterID; int32 fWriterID;
media_file_format fMFI; media_file_format fMFI;
BPrivate::media::MediaStreamer* fStreamer;
bool fFileClosed; bool fFileClosed;
bool fDeleteSource; bool fDeleteSource;
bool _reserved_was_fUnused[2]; bool _reserved_was_fUnused[2];
@ -186,6 +189,8 @@ private:
const BUrl* url, const BUrl* url,
const media_file_format* fileFormat, const media_file_format* fileFormat,
int32 flags); int32 flags);
void _InitStreamer(const BUrl& url,
BDataIO** adapter);
BMediaFile(); BMediaFile();
BMediaFile(const BMediaFile&); BMediaFile(const BMediaFile&);
@ -193,10 +198,9 @@ private:
BDataIO* fSource; BDataIO* fSource;
// FBC data and virtuals // 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_0(int32 arg, ...);
virtual status_t _Reserved_BMediaFile_1(int32 arg, ...); virtual status_t _Reserved_BMediaFile_1(int32 arg, ...);

View File

@ -92,6 +92,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
EncoderPlugin.cpp EncoderPlugin.cpp
MediaExtractor.cpp MediaExtractor.cpp
MediaPlugin.cpp MediaPlugin.cpp
MediaStreamer.cpp
MediaWriter.cpp MediaWriter.cpp
PluginManager.cpp PluginManager.cpp
ReaderPlugin.cpp ReaderPlugin.cpp

View File

@ -18,6 +18,7 @@
#include "debug.h" #include "debug.h"
#include "MediaExtractor.h" #include "MediaExtractor.h"
#include "MediaStreamer.h"
#include "MediaWriter.h" #include "MediaWriter.h"
@ -450,6 +451,7 @@ BMediaFile::_Init()
fTrackNum = 0; fTrackNum = 0;
fTrackList = NULL; fTrackList = NULL;
fExtractor = NULL; fExtractor = NULL;
fStreamer = NULL;
fWriter = NULL; fWriter = NULL;
fWriterID = 0; fWriterID = 0;
fErr = B_OK; fErr = B_OK;
@ -474,6 +476,7 @@ BMediaFile::_UnInit()
fSource = NULL; fSource = NULL;
fDeleteSource = false; fDeleteSource = false;
} }
// Deleting the extractor or writer can cause unloading of the plugins. // Deleting the extractor or writer can cause unloading of the plugins.
// The source must be deleted before that, because it can come from a // The source must be deleted before that, because it can come from a
// plugin (for example the http_streamer) // plugin (for example the http_streamer)
@ -481,6 +484,8 @@ BMediaFile::_UnInit()
fExtractor = NULL; fExtractor = NULL;
delete fWriter; delete fWriter;
fWriter = NULL; fWriter = NULL;
delete fStreamer;
fStreamer = NULL;
} }
@ -494,20 +499,21 @@ BMediaFile::_InitReader(BDataIO* source, const BUrl* url, int32 flags)
return; return;
} }
if (source != NULL) { if (source == NULL)
if (BFile* file = dynamic_cast<BFile*>(source)) { _InitStreamer(*url, &source);
fErr = file->InitCheck(); else if (BFile* file = dynamic_cast<BFile*>(source))
if (fErr != B_OK) fErr = file->InitCheck();
return;
} if (fErr != B_OK)
fExtractor = new(std::nothrow) MediaExtractor(source, flags); return;
} else
fExtractor = new(std::nothrow) MediaExtractor(*url, flags); fExtractor = new(std::nothrow) MediaExtractor(source, flags);
if (fExtractor == NULL) if (fExtractor == NULL)
fErr = B_NO_MEMORY; fErr = B_NO_MEMORY;
else else
fErr = fExtractor->InitCheck(); fErr = fExtractor->InitCheck();
if (fErr != B_OK) if (fErr != B_OK)
return; return;
@ -543,10 +549,13 @@ BMediaFile::_InitWriter(BDataIO* target, const BUrl* url,
fMFI = *fileFormat; fMFI = *fileFormat;
if (target != NULL) if (target == NULL) {
fWriter = new(std::nothrow) MediaWriter(target, fMFI); _InitStreamer(*url, &target);
else if (fErr != B_OK)
fWriter = new(std::nothrow) MediaWriter(*url, fMFI); return;
}
fWriter = new(std::nothrow) MediaWriter(target, fMFI);
if (fWriter == NULL) if (fWriter == NULL)
fErr = B_NO_MEMORY; 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 //unimplemented
BMediaFile::BMediaFile(); BMediaFile::BMediaFile();

View File

@ -137,6 +137,11 @@ public:
delete fDataIOAdapter; delete fDataIOAdapter;
} }
status_t InitCheck() const
{
return fErr;
}
// BMediaIO interface // BMediaIO interface
virtual void GetFlags(int32* flags) const virtual void GetFlags(int32* flags) const
@ -231,11 +236,15 @@ PluginManager::CreateReader(Reader** reader, int32* streamCount,
BMediaIOWrapper* buffered_source = new BMediaIOWrapper(source); BMediaIOWrapper* buffered_source = new BMediaIOWrapper(source);
ObjectDeleter<BMediaIOWrapper> ioDeleter(buffered_source); ObjectDeleter<BMediaIOWrapper> ioDeleter(buffered_source);
status_t ret = buffered_source->InitCheck();
if (ret != B_OK)
return ret;
// get list of available readers from the server // get list of available readers from the server
entry_ref refs[MAX_READERS]; entry_ref refs[MAX_READERS];
int32 count; int32 count;
status_t ret = AddOnManager::GetInstance()->GetReaders(refs, &count, ret = AddOnManager::GetInstance()->GetReaders(refs, &count,
MAX_READERS); MAX_READERS);
if (ret != B_OK) { if (ret != B_OK) {
printf("PluginManager::CreateReader: can't get list of readers: %s\n", printf("PluginManager::CreateReader: can't get list of readers: %s\n",