Make DataSourceFactory singletone

This is preparation for having a subclass of DataSourceFactory which
is only used in mediaserver process with OMA (forward-lock) use case.

Test: build
Bug: 142567168
Change-Id: I2a1ab3d1ae89f657a84376d9a95d4e814b545b4f
gugelfrei
Dongwon Kang 5 years ago
parent 1f72838954
commit 79b0c24b58

@ -1084,7 +1084,7 @@ int main(int argc, char **argv) {
const char *filename = argv[k]; const char *filename = argv[k];
sp<DataSource> dataSource = sp<DataSource> dataSource =
DataSourceFactory::CreateFromURI(NULL /* httpService */, filename); DataSourceFactory::getInstance()->CreateFromURI(NULL /* httpService */, filename);
if (strncasecmp(filename, "sine:", 5) && dataSource == NULL) { if (strncasecmp(filename, "sine:", 5) && dataSource == NULL) {
fprintf(stderr, "Unable to create data source.\n"); fprintf(stderr, "Unable to create data source.\n");

@ -164,7 +164,7 @@ MyConvertingStreamSource::MyConvertingStreamSource(const char *filename)
: mCurrentBufferIndex(-1), : mCurrentBufferIndex(-1),
mCurrentBufferOffset(0) { mCurrentBufferOffset(0) {
sp<DataSource> dataSource = sp<DataSource> dataSource =
DataSourceFactory::CreateFromURI(NULL /* httpService */, filename); DataSourceFactory::getInstance()->CreateFromURI(NULL /* httpService */, filename);
CHECK(dataSource != NULL); CHECK(dataSource != NULL);

@ -418,7 +418,7 @@ int main(int argc, char **argv) {
const char *filename = argv[k]; const char *filename = argv[k];
sp<DataSource> dataSource = sp<DataSource> dataSource =
DataSourceFactory::CreateFromURI(nullptr /* httpService */, filename); DataSourceFactory::getInstance()->CreateFromURI(nullptr /* httpService */, filename);
if (strncasecmp(filename, "sine:", 5) && dataSource == nullptr) { if (strncasecmp(filename, "sine:", 5) && dataSource == nullptr) {
fprintf(stderr, "Unable to create data source.\n"); fprintf(stderr, "Unable to create data source.\n");

@ -30,6 +30,19 @@
namespace android { namespace android {
// static // static
sp<DataSourceFactory> DataSourceFactory::sInstance;
// static
Mutex DataSourceFactory::sInstanceLock;
// static
sp<DataSourceFactory> DataSourceFactory::getInstance() {
Mutex::Autolock l(sInstanceLock);
if (!sInstance) {
sInstance = new DataSourceFactory();
}
return sInstance;
}
sp<DataSource> DataSourceFactory::CreateFromURI( sp<DataSource> DataSourceFactory::CreateFromURI(
const sp<MediaHTTPService> &httpService, const sp<MediaHTTPService> &httpService,
const char *uri, const char *uri,
@ -42,20 +55,16 @@ sp<DataSource> DataSourceFactory::CreateFromURI(
sp<DataSource> source; sp<DataSource> source;
if (!strncasecmp("file://", uri, 7)) { if (!strncasecmp("file://", uri, 7)) {
source = new FileSource(uri + 7); source = CreateFileSource(uri + 7);
} else if (!strncasecmp("http://", uri, 7) || !strncasecmp("https://", uri, 8)) { } else if (!strncasecmp("http://", uri, 7) || !strncasecmp("https://", uri, 8)) {
if (httpService == NULL) { if (httpService == NULL) {
ALOGE("Invalid http service!"); ALOGE("Invalid http service!");
return NULL; return NULL;
} }
if (httpSource == NULL) { sp<HTTPBase> mediaHTTP = httpSource;
sp<MediaHTTPConnection> conn = httpService->makeHTTPConnection(); if (mediaHTTP == NULL) {
if (conn == NULL) { mediaHTTP = static_cast<HTTPBase *>(CreateMediaHTTP(httpService).get());
ALOGE("Failed to make http connection from http service!");
return NULL;
}
httpSource = new MediaHTTP(conn);
} }
String8 cacheConfig; String8 cacheConfig;
@ -69,24 +78,24 @@ sp<DataSource> DataSourceFactory::CreateFromURI(
&disconnectAtHighwatermark); &disconnectAtHighwatermark);
} }
if (httpSource->connect(uri, &nonCacheSpecificHeaders) != OK) { if (mediaHTTP->connect(uri, &nonCacheSpecificHeaders) != OK) {
ALOGE("Failed to connect http source!"); ALOGE("Failed to connect http source!");
return NULL; return NULL;
} }
if (contentType != NULL) { if (contentType != NULL) {
*contentType = httpSource->getMIMEType(); *contentType = mediaHTTP->getMIMEType();
} }
source = NuCachedSource2::Create( source = NuCachedSource2::Create(
httpSource, mediaHTTP,
cacheConfig.isEmpty() ? NULL : cacheConfig.string(), cacheConfig.isEmpty() ? NULL : cacheConfig.string(),
disconnectAtHighwatermark); disconnectAtHighwatermark);
} else if (!strncasecmp("data:", uri, 5)) { } else if (!strncasecmp("data:", uri, 5)) {
source = DataURISource::Create(uri); source = DataURISource::Create(uri);
} else { } else {
// Assume it's a filename. // Assume it's a filename.
source = new FileSource(uri); source = CreateFileSource(uri);
} }
if (source == NULL || source->initCheck() != OK) { if (source == NULL || source->initCheck() != OK) {
@ -108,10 +117,15 @@ sp<DataSource> DataSourceFactory::CreateMediaHTTP(const sp<MediaHTTPService> &ht
sp<MediaHTTPConnection> conn = httpService->makeHTTPConnection(); sp<MediaHTTPConnection> conn = httpService->makeHTTPConnection();
if (conn == NULL) { if (conn == NULL) {
ALOGE("Failed to make http connection from http service!");
return NULL; return NULL;
} else { } else {
return new MediaHTTP(conn); return new MediaHTTP(conn);
} }
} }
sp<DataSource> DataSourceFactory::CreateFileSource(const char *uri) {
return new FileSource(uri);
}
} // namespace android } // namespace android

@ -29,17 +29,26 @@ struct MediaHTTPService;
class String8; class String8;
struct HTTPBase; struct HTTPBase;
class DataSourceFactory { class DataSourceFactory : public RefBase {
public: public:
static sp<DataSource> CreateFromURI( static sp<DataSourceFactory> getInstance();
sp<DataSource> CreateFromURI(
const sp<MediaHTTPService> &httpService, const sp<MediaHTTPService> &httpService,
const char *uri, const char *uri,
const KeyedVector<String8, String8> *headers = NULL, const KeyedVector<String8, String8> *headers = NULL,
String8 *contentType = NULL, String8 *contentType = NULL,
HTTPBase *httpSource = NULL); HTTPBase *httpSource = NULL);
static sp<DataSource> CreateMediaHTTP(const sp<MediaHTTPService> &httpService); virtual sp<DataSource> CreateMediaHTTP(const sp<MediaHTTPService> &httpService);
static sp<DataSource> CreateFromFd(int fd, int64_t offset, int64_t length); sp<DataSource> CreateFromFd(int fd, int64_t offset, int64_t length);
protected:
virtual sp<DataSource> CreateFileSource(const char *uri);
private:
static sp<DataSourceFactory> sInstance;
static Mutex sInstanceLock;
DataSourceFactory() {};
}; };
} // namespace android } // namespace android

@ -385,7 +385,7 @@ void NuPlayer::GenericSource::onPrepareAsync() {
if (!strncasecmp("http://", uri, 7) || !strncasecmp("https://", uri, 8)) { if (!strncasecmp("http://", uri, 7) || !strncasecmp("https://", uri, 8)) {
sp<DataSource> httpSource; sp<DataSource> httpSource;
mDisconnectLock.unlock(); mDisconnectLock.unlock();
httpSource = DataSourceFactory::CreateMediaHTTP(mHTTPService); httpSource = DataSourceFactory::getInstance()->CreateMediaHTTP(mHTTPService);
if (httpSource == NULL) { if (httpSource == NULL) {
ALOGE("Failed to create http source!"); ALOGE("Failed to create http source!");
notifyPreparedAndCleanup(UNKNOWN_ERROR); notifyPreparedAndCleanup(UNKNOWN_ERROR);
@ -401,7 +401,7 @@ void NuPlayer::GenericSource::onPrepareAsync() {
mLock.unlock(); mLock.unlock();
mDisconnectLock.unlock(); mDisconnectLock.unlock();
// This might take long time if connection has some issue. // This might take long time if connection has some issue.
sp<DataSource> dataSource = DataSourceFactory::CreateFromURI( sp<DataSource> dataSource = DataSourceFactory::getInstance()->CreateFromURI(
mHTTPService, uri, &mUriHeaders, &contentType, mHTTPService, uri, &mUriHeaders, &contentType,
static_cast<HTTPBase *>(mHttpSource.get())); static_cast<HTTPBase *>(mHttpSource.get()));
mDisconnectLock.lock(); mDisconnectLock.lock();

@ -82,7 +82,7 @@ status_t NuMediaExtractor::setDataSource(
} }
sp<DataSource> dataSource = sp<DataSource> dataSource =
DataSourceFactory::CreateFromURI(httpService, path, headers); DataSourceFactory::getInstance()->CreateFromURI(httpService, path, headers);
if (dataSource == NULL) { if (dataSource == NULL) {
return -ENOENT; return -ENOENT;

@ -63,7 +63,7 @@ status_t StagefrightMetadataRetriever::setDataSource(
ALOGV("setDataSource(%s)", uri); ALOGV("setDataSource(%s)", uri);
clearMetadata(); clearMetadata();
mSource = DataSourceFactory::CreateFromURI(httpService, uri, headers); mSource = DataSourceFactory::getInstance()->CreateFromURI(httpService, uri, headers);
if (mSource == NULL) { if (mSource == NULL) {
ALOGE("Unable to create data source for '%s'.", uri); ALOGE("Unable to create data source for '%s'.", uri);

@ -278,7 +278,7 @@ private:
static sp<IMediaExtractor> CreateExtractorFromURI(const char *uri) { static sp<IMediaExtractor> CreateExtractorFromURI(const char *uri) {
sp<DataSource> source = sp<DataSource> source =
DataSourceFactory::CreateFromURI(NULL /* httpService */, uri); DataSourceFactory::getInstance()->CreateFromURI(NULL /* httpService */, uri);
if (source == NULL) { if (source == NULL) {
return NULL; return NULL;

@ -202,7 +202,7 @@ AMediaDataSource* AMediaDataSource_newUri(
headers.add(key8, value8); headers.add(key8, value8);
} }
sp<DataSource> source = DataSourceFactory::CreateFromURI(service, uri, &headers); sp<DataSource> source = DataSourceFactory::getInstance()->CreateFromURI(service, uri, &headers);
if (source == NULL) { if (source == NULL) {
ALOGE("AMediaDataSource_newUri source is null"); ALOGE("AMediaDataSource_newUri source is null");
return NULL; return NULL;

@ -55,7 +55,7 @@ sp<IMediaExtractor> MediaExtractorService::makeExtractor(
sp<IDataSource> MediaExtractorService::makeIDataSource(int fd, int64_t offset, int64_t length) sp<IDataSource> MediaExtractorService::makeIDataSource(int fd, int64_t offset, int64_t length)
{ {
sp<DataSource> source = DataSourceFactory::CreateFromFd(fd, offset, length); sp<DataSource> source = DataSourceFactory::getInstance()->CreateFromFd(fd, offset, length);
return CreateIDataSourceFromDataSource(source); return CreateIDataSourceFromDataSource(source);
} }

Loading…
Cancel
Save