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

Commit c2c0aabf authored by Dongwon Kang's avatar Dongwon Kang Committed by Android (Google) Code Review
Browse files

Merge "Revert "Remove IDataSource dependency from DataSource.""

parents 4c96b75c 6969da62
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <sys/types.h>
#include <media/stagefright/MediaErrors.h>
#include <media/DataSourceBase.h>
#include <media/IDataSource.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
#include <utils/threads.h>
@@ -35,6 +36,11 @@ class DataSource : public DataSourceBase, public virtual RefBase {
public:
    DataSource() {}

    // returns a pointer to IDataSource if it is wrapped.
    virtual sp<IDataSource> getIDataSource() const {
        return nullptr;
    }

protected:
    virtual ~DataSource() {}

+40 −22
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/DataSourceFactory.h>
#include <media/stagefright/FileSource.h>
#include <media/stagefright/InterfaceUtils.h>
#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaClock.h>
@@ -161,30 +162,15 @@ sp<MetaData> NuPlayer2::GenericSource2::getFileFormatMeta() const {

status_t NuPlayer2::GenericSource2::initFromDataSource() {
    sp<IMediaExtractor> extractor;
    CHECK(mDataSource != NULL || mFd != -1);
    CHECK(mDataSource != NULL);
    sp<DataSource> dataSource = mDataSource;
    const int fd = mFd;
    const int64_t offset = mOffset;
    const int64_t length = mLength;

    mLock.unlock();
    // This might take long time if data source is not reliable.
    if (dataSource != nullptr) {
        extractor = MediaExtractorFactory::Create(dataSource, NULL /* mime */);
    } else {
        extractor = MediaExtractorFactory::CreateFromFd(
                fd, offset, length, NULL /* mime */, &dataSource);
    }

    if (dataSource == nullptr) {
        ALOGE("initFromDataSource, failed to create data source!");
        mLock.lock();
        return UNKNOWN_ERROR;
    }
    extractor = MediaExtractorFactory::Create(dataSource, NULL);

    if (extractor == NULL) {
        ALOGE("initFromDataSource, cannot create extractor!");
        mLock.lock();
        return UNKNOWN_ERROR;
    }

@@ -193,13 +179,10 @@ status_t NuPlayer2::GenericSource2::initFromDataSource() {
    size_t numtracks = extractor->countTracks();
    if (numtracks == 0) {
        ALOGE("initFromDataSource, source has no track!");
        mLock.lock();
        return UNKNOWN_ERROR;
    }

    mLock.lock();
    mFd = -1;
    mDataSource = dataSource;
    mFileMeta = fileMeta;
    if (mFileMeta != NULL) {
        int64_t duration;
@@ -408,16 +391,51 @@ void NuPlayer2::GenericSource2::onPrepareAsync() {
            if (!mDisconnected) {
                mDataSource = dataSource;
            }
        } else {
            if (property_get_bool("media.stagefright.extractremote", true) &&
                    !FileSource::requiresDrm(mFd, mOffset, mLength, nullptr /* mime */)) {
                sp<IBinder> binder =
                        defaultServiceManager()->getService(String16("media.extractor"));
                if (binder != nullptr) {
                    ALOGD("FileSource remote");
                    sp<IMediaExtractorService> mediaExService(
                            interface_cast<IMediaExtractorService>(binder));
                    sp<IDataSource> source =
                            mediaExService->makeIDataSource(mFd, mOffset, mLength);
                    ALOGV("IDataSource(FileSource): %p %d %lld %lld",
                            source.get(), mFd, (long long)mOffset, (long long)mLength);
                    if (source.get() != nullptr) {
                        mDataSource = CreateDataSourceFromIDataSource(source);
                        if (mDataSource != nullptr) {
                            // Close the local file descriptor as it is not needed anymore.
                            close(mFd);
                            mFd = -1;
                        }
                    } else {
                        ALOGW("extractor service cannot make data source");
                    }
                } else {
                    ALOGW("extractor service not running");
                }
            }
            if (mDataSource == nullptr) {
                ALOGD("FileSource local");
                mDataSource = new FileSource(mFd, mOffset, mLength);
            }
            // TODO: close should always be done on mFd, see the lines following
            // CreateDataSourceFromIDataSource above,
            // and the FileSource constructor should dup the mFd argument as needed.
            mFd = -1;
        }

        if (mFd == -1 && mDataSource == NULL) {
        if (mDataSource == NULL) {
            ALOGE("Failed to create data source!");
            notifyPreparedAndCleanup(UNKNOWN_ERROR);
            return;
        }
    }

    if (mDataSource != nullptr && mDataSource->flags() & DataSource::kIsCachingDataSource) {
    if (mDataSource->flags() & DataSource::kIsCachingDataSource) {
        mCachedSource = static_cast<NuCachedSource2 *>(mDataSource.get());
    }

+41 −22
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <media/MediaBufferHolder.h>
#include <media/MediaExtractor.h>
#include <media/MediaSource.h>
#include <media/IMediaExtractorService.h>
#include <media/IMediaHTTPService.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
@@ -161,30 +162,15 @@ sp<MetaData> NuPlayer::GenericSource::getFileFormatMeta() const {

status_t NuPlayer::GenericSource::initFromDataSource() {
    sp<IMediaExtractor> extractor;
    CHECK(mDataSource != NULL || mFd != -1);
    CHECK(mDataSource != NULL);
    sp<DataSource> dataSource = mDataSource;
    const int fd = mFd;
    const int64_t offset = mOffset;
    const int64_t length = mLength;

    mLock.unlock();
    // This might take long time if data source is not reliable.
    if (dataSource != nullptr) {
        extractor = MediaExtractorFactory::Create(dataSource, NULL /* mime */);
    } else {
        extractor = MediaExtractorFactory::CreateFromFd(
                fd, offset, length, NULL /* mime */, &dataSource);
    }

    if (dataSource == nullptr) {
        ALOGE("initFromDataSource, failed to create data source!");
        mLock.lock();
        return UNKNOWN_ERROR;
    }
    extractor = MediaExtractorFactory::Create(dataSource, NULL);

    if (extractor == NULL) {
        ALOGE("initFromDataSource, cannot create extractor!");
        mLock.lock();
        return UNKNOWN_ERROR;
    }

@@ -193,13 +179,10 @@ status_t NuPlayer::GenericSource::initFromDataSource() {
    size_t numtracks = extractor->countTracks();
    if (numtracks == 0) {
        ALOGE("initFromDataSource, source has no track!");
        mLock.lock();
        return UNKNOWN_ERROR;
    }

    mLock.lock();
    mFd = -1;
    mDataSource = dataSource;
    mFileMeta = fileMeta;
    if (mFileMeta != NULL) {
        int64_t duration;
@@ -403,15 +386,51 @@ void NuPlayer::GenericSource::onPrepareAsync() {
            if (!mDisconnected) {
                mDataSource = dataSource;
            }
        } else {
            if (property_get_bool("media.stagefright.extractremote", true) &&
                    !FileSource::requiresDrm(mFd, mOffset, mLength, nullptr /* mime */)) {
                sp<IBinder> binder =
                        defaultServiceManager()->getService(String16("media.extractor"));
                if (binder != nullptr) {
                    ALOGD("FileSource remote");
                    sp<IMediaExtractorService> mediaExService(
                            interface_cast<IMediaExtractorService>(binder));
                    sp<IDataSource> source =
                            mediaExService->makeIDataSource(mFd, mOffset, mLength);
                    ALOGV("IDataSource(FileSource): %p %d %lld %lld",
                            source.get(), mFd, (long long)mOffset, (long long)mLength);
                    if (source.get() != nullptr) {
                        mDataSource = CreateDataSourceFromIDataSource(source);
                        if (mDataSource != nullptr) {
                            // Close the local file descriptor as it is not needed anymore.
                            close(mFd);
                            mFd = -1;
                        }
                    } else {
                        ALOGW("extractor service cannot make data source");
                    }
                } else {
                    ALOGW("extractor service not running");
                }
            }
        if (mFd == -1 && mDataSource == NULL) {
            if (mDataSource == nullptr) {
                ALOGD("FileSource local");
                mDataSource = new FileSource(mFd, mOffset, mLength);
            }
            // TODO: close should always be done on mFd, see the lines following
            // CreateDataSourceFromIDataSource above,
            // and the FileSource constructor should dup the mFd argument as needed.
            mFd = -1;
        }

        if (mDataSource == NULL) {
            ALOGE("Failed to create data source!");
            notifyPreparedAndCleanup(UNKNOWN_ERROR);
            return;
        }
    }

    if (mDataSource != nullptr && mDataSource->flags() & DataSource::kIsCachingDataSource) {
    if (mDataSource->flags() & DataSource::kIsCachingDataSource) {
        mCachedSource = static_cast<NuCachedSource2 *>(mDataSource.get());
    }

+8 −0
Original line number Diff line number Diff line
@@ -117,6 +117,10 @@ sp<DecryptHandle> CallbackDataSource::DrmInitialization(const char *mime) {
    return mIDataSource->DrmInitialization(mime);
}

sp<IDataSource> CallbackDataSource::getIDataSource() const {
    return mIDataSource;
}

TinyCacheSource::TinyCacheSource(const sp<DataSource>& source)
    : mSource(source), mCachedOffset(0), mCachedSize(0) {
    mName = String8::format("TinyCacheSource(%s)", mSource->toString().string());
@@ -194,4 +198,8 @@ sp<DecryptHandle> TinyCacheSource::DrmInitialization(const char *mime) {
    return mSource->DrmInitialization(mime);
}

sp<IDataSource> TinyCacheSource::getIDataSource() const {
    return mSource->getIDataSource();
}

} // namespace android
+1 −40
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@
#include <media/MediaAnalyticsItem.h>
#include <media/MediaExtractor.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/FileSource.h>
#include <media/stagefright/InterfaceUtils.h>
#include <media/stagefright/MediaExtractorFactory.h>
#include <media/IMediaExtractor.h>
@@ -40,7 +39,7 @@ namespace android {
// static
sp<IMediaExtractor> MediaExtractorFactory::Create(
        const sp<DataSource> &source, const char *mime) {
    ALOGV("MediaExtractorFactory::%s %s", __func__, mime);
    ALOGV("MediaExtractorFactory::Create %s", mime);

    if (!property_get_bool("media.stagefright.extractremote", true)) {
        // local extractor
@@ -64,44 +63,6 @@ sp<IMediaExtractor> MediaExtractorFactory::Create(
    return NULL;
}

// static
sp<IMediaExtractor> MediaExtractorFactory::CreateFromFd(
        int fd, int64_t offset, int64_t length, const char *mime, sp<DataSource> *out) {
    ALOGV("MediaExtractorFactory::%s %s", __func__, mime);

    if (property_get_bool("media.stagefright.extractremote", true)) {
        // remote extractor
        ALOGV("get service manager");
        sp<IBinder> binder = defaultServiceManager()->getService(String16("media.extractor"));

        if (binder != 0) {
            sp<IMediaExtractorService> mediaExService(
                    interface_cast<IMediaExtractorService>(binder));
            if (!FileSource::requiresDrm(fd, offset, length, nullptr /* mime */)) {
                ALOGD("FileSource remote");
                sp<IDataSource> remoteSource =
                    mediaExService->makeIDataSource(fd, offset, length);
                ALOGV("IDataSource(FileSource): %p %d %lld %lld",
                        remoteSource.get(), fd, (long long)offset, (long long)length);
                if (remoteSource.get() != nullptr) {
                    // replace the caller's local source with remote source.
                    *out = CreateDataSourceFromIDataSource(remoteSource);
                    return mediaExService->makeExtractor(remoteSource, mime);
                } else {
                    ALOGW("extractor service cannot make file source."
                            " falling back to local file source.");
                }
            }
            // Falls back.
        } else {
            ALOGE("extractor service not running");
            return nullptr;
        }
    }
    *out = new FileSource(fd, offset, length);
    return Create(*out, mime);
}

sp<IMediaExtractor> MediaExtractorFactory::CreateFromService(
        const sp<DataSource> &source, const char *mime) {

Loading