/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
//#define LOG_NDEBUG 0
#define LOG_TAG "PlayerServuceDataSourceFactory"


#include <datasource/PlayerServiceDataSourceFactory.h>
#include <datasource/PlayerServiceFileSource.h>
#include <datasource/PlayerServiceMediaHTTP.h>
#include <media/MediaHTTPConnection.h>
#include <media/MediaHTTPService.h>

namespace android {

// static
sp<PlayerServiceDataSourceFactory> PlayerServiceDataSourceFactory::sInstance;
// static
Mutex PlayerServiceDataSourceFactory::sInstanceLock;

// static
sp<PlayerServiceDataSourceFactory> PlayerServiceDataSourceFactory::getInstance() {
    Mutex::Autolock l(sInstanceLock);
    if (!sInstance) {
        sInstance = new PlayerServiceDataSourceFactory();
    }
    return sInstance;
}

sp<DataSource> PlayerServiceDataSourceFactory::CreateMediaHTTP(
        const sp<MediaHTTPService> &httpService) {
    if (httpService == NULL) {
        return NULL;
    }

    sp<MediaHTTPConnection> conn = httpService->makeHTTPConnection();
    if (conn == NULL) {
        ALOGE("Failed to make http connection from http service!");
        return NULL;
    } else {
        return new PlayerServiceMediaHTTP(conn);
    }
}

sp<DataSource> PlayerServiceDataSourceFactory::CreateFileSource(const char *uri) {
    return new PlayerServiceFileSource(uri);
}

}  // namespace android
