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 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, ...);
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
@ -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",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user