Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79b0c24b authored by Dongwon Kang's avatar Dongwon Kang
Browse files

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
parent 1f728389
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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");
+1 −1
Original line number Original line Diff line number Diff line
@@ -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);


+1 −1
Original line number Original line Diff line number Diff line
@@ -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");
+26 −12
Original line number Original line Diff line number Diff line
@@ -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
+13 −4
Original line number Original line Diff line number Diff line
@@ -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
Loading