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

Commit 6969da62 authored by Dongwon Kang's avatar Dongwon Kang
Browse files

Revert "Remove IDataSource dependency from DataSource."

This reverts commit 51467425.

The original change Iaba6d9be is no longer needed since we
separated out DataSourceBase from DataSource. Now, DataSource
may have a method relying on a class from libmedia, IDataSource.

Test: checked the correct wrapping path with 'dumpsys media.extractor'
Bug: 72869975

Change-Id: Ib0d5ca863fa70a4a96f97b3377c209e1f288f443
parent 405b3c70
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