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:
parent
9198105dbb
commit
c0ef5b2b7c
@ -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, ...);
|
||||
|
@ -92,6 +92,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
|
||||
EncoderPlugin.cpp
|
||||
MediaExtractor.cpp
|
||||
MediaPlugin.cpp
|
||||
MediaStreamer.cpp
|
||||
MediaWriter.cpp
|
||||
PluginManager.cpp
|
||||
ReaderPlugin.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<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();
|
||||
|
@ -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",
|
||||
|
Loading…
x
Reference in New Issue
Block a user