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];
sp<DataSource> dataSource =
DataSourceFactory::CreateFromURI(NULL /* httpService */, filename);
DataSourceFactory::getInstance()->CreateFromURI(NULL /* httpService */, filename);
if (strncasecmp(filename, "sine:", 5) && dataSource == NULL) {
fprintf(stderr, "Unable to create data source.\n");

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

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

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

@ -29,17 +29,26 @@ struct MediaHTTPService;
class String8;
struct HTTPBase;
class DataSourceFactory {
class DataSourceFactory : public RefBase {
public:
static sp<DataSource> CreateFromURI(
static sp<DataSourceFactory> getInstance();
sp<DataSource> CreateFromURI(
const sp<MediaHTTPService> &httpService,
const char *uri,
const KeyedVector<String8, String8> *headers = NULL,
String8 *contentType = NULL,
HTTPBase *httpSource = NULL);
static sp<DataSource> CreateMediaHTTP(const sp<MediaHTTPService> &httpService);
static sp<DataSource> CreateFromFd(int fd, int64_t offset, int64_t length);
virtual sp<DataSource> CreateMediaHTTP(const sp<MediaHTTPService> &httpService);
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

@ -385,7 +385,7 @@ void NuPlayer::GenericSource::onPrepareAsync() {
if (!strncasecmp("http://", uri, 7) || !strncasecmp("https://", uri, 8)) {
sp<DataSource> httpSource;
mDisconnectLock.unlock();
httpSource = DataSourceFactory::CreateMediaHTTP(mHTTPService);
httpSource = DataSourceFactory::getInstance()->CreateMediaHTTP(mHTTPService);
if (httpSource == NULL) {
ALOGE("Failed to create http source!");
notifyPreparedAndCleanup(UNKNOWN_ERROR);
@ -401,7 +401,7 @@ void NuPlayer::GenericSource::onPrepareAsync() {
mLock.unlock();
mDisconnectLock.unlock();
// 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,
static_cast<HTTPBase *>(mHttpSource.get()));
mDisconnectLock.lock();

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

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

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

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

@ -55,7 +55,7 @@ sp<IMediaExtractor> MediaExtractorService::makeExtractor(
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);
}

Loading…
Cancel
Save