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 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, ...);

View File

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

View File

@ -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<BFile*>(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<BFile*>(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();

View File

@ -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<BMediaIOWrapper> 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",