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

Commit 0afbc2c3 authored by Chong Zhang's avatar Chong Zhang Committed by Android (Google) Code Review
Browse files

Merge "delay data source creation for GenericSource prepare time" into lmp-dev

parents 229d2426 bf9b95d7
Loading
Loading
Loading
Loading
+65 −15
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@

#include "AnotherPacketSource.h"

#include <media/IMediaHTTPService.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -47,33 +48,48 @@ NuPlayer::GenericSource::GenericSource(
      mIsWidevine(false),
      mUIDValid(uidValid),
      mUID(uid) {
    resetDataSource();
    DataSource::RegisterDefaultSniffers();
}

status_t NuPlayer::GenericSource::init(
void NuPlayer::GenericSource::resetDataSource() {
    mHTTPService.clear();
    mUri.clear();
    mUriHeaders.clear();
    mFd = -1;
    mOffset = 0;
    mLength = 0;
}

status_t NuPlayer::GenericSource::setDataSource(
        const sp<IMediaHTTPService> &httpService,
        const char *url,
        const KeyedVector<String8, String8> *headers) {
    mIsWidevine = !strncasecmp(url, "widevine://", 11);

    AString sniffedMIME;
    resetDataSource();

    sp<DataSource> dataSource =
        DataSource::CreateFromURI(httpService, url, headers, &sniffedMIME);
    mHTTPService = httpService;
    mUri = url;

    if (dataSource == NULL) {
        return UNKNOWN_ERROR;
    if (headers) {
        mUriHeaders = *headers;
    }

    return initFromDataSource(
            dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str());
    // delay data source creation to prepareAsync() to avoid blocking
    // the calling thread in setDataSource for any significant time.
    return OK;
}

status_t NuPlayer::GenericSource::init(
status_t NuPlayer::GenericSource::setDataSource(
        int fd, int64_t offset, int64_t length) {
    sp<DataSource> dataSource = new FileSource(dup(fd), offset, length);
    resetDataSource();

    mFd = dup(fd);
    mOffset = offset;
    mLength = length;

    return initFromDataSource(dataSource, NULL);
    // delay data source creation to prepareAsync() to avoid blocking
    // the calling thread in setDataSource for any significant time.
    return OK;
}

status_t NuPlayer::GenericSource::initFromDataSource(
@@ -143,7 +159,8 @@ status_t NuPlayer::GenericSource::initFromDataSource(

                // check if the source requires secure buffers
                int32_t secure;
                if (meta->findInt32(kKeyRequiresSecureBuffers, &secure) && secure) {
                if (meta->findInt32(kKeyRequiresSecureBuffers, &secure)
                        && secure) {
                    mIsWidevine = true;
                    if (mUIDValid) {
                        extractor->setUID(mUID);
@@ -166,7 +183,8 @@ status_t NuPlayer::GenericSource::initFromDataSource(
    return OK;
}

status_t NuPlayer::GenericSource::setBuffers(bool audio, Vector<MediaBuffer *> &buffers) {
status_t NuPlayer::GenericSource::setBuffers(
        bool audio, Vector<MediaBuffer *> &buffers) {
    if (mIsWidevine && !audio) {
        return mVideoTrack.mSource->setBuffers(buffers);
    }
@@ -177,6 +195,38 @@ NuPlayer::GenericSource::~GenericSource() {
}

void NuPlayer::GenericSource::prepareAsync() {
    // delayed data source creation
    AString sniffedMIME;
    sp<DataSource> dataSource;

    if (!mUri.empty()) {
        mIsWidevine = !strncasecmp(mUri.c_str(), "widevine://", 11);

        dataSource = DataSource::CreateFromURI(
               mHTTPService, mUri.c_str(), &mUriHeaders, &sniffedMIME);
    } else {
        // set to false first, if the extractor
        // comes back as secure, set it to true then.
        mIsWidevine = false;

        dataSource = new FileSource(mFd, mOffset, mLength);
    }

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

    status_t err = initFromDataSource(
            dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str());

    if (err != OK) {
        ALOGE("Failed to init from data source!");
        notifyPrepared(err);
        return;
    }

    if (mVideoTrack.mSource != NULL) {
        sp<MetaData> meta = mVideoTrack.mSource->getFormat();

+11 −2
Original line number Diff line number Diff line
@@ -30,18 +30,19 @@ namespace android {
struct AnotherPacketSource;
struct ARTSPController;
struct DataSource;
struct IMediaHTTPService;
struct MediaSource;
class MediaBuffer;

struct NuPlayer::GenericSource : public NuPlayer::Source {
    GenericSource(const sp<AMessage> &notify, bool uidValid, uid_t uid);

    status_t init(
    status_t setDataSource(
            const sp<IMediaHTTPService> &httpService,
            const char *url,
            const KeyedVector<String8, String8> *headers);

    status_t init(int fd, int64_t offset, int64_t length);
    status_t setDataSource(int fd, int64_t offset, int64_t length);

    virtual void prepareAsync();

@@ -96,6 +97,14 @@ private:
    bool mIsWidevine;
    bool mUIDValid;
    uid_t mUID;
    sp<IMediaHTTPService> mHTTPService;
    AString mUri;
    KeyedVector<String8, String8> mUriHeaders;
    int mFd;
    int64_t mOffset;
    int64_t mLength;

    void resetDataSource();

    status_t initFromDataSource(
            const sp<DataSource> &dataSource,
+4 −4
Original line number Diff line number Diff line
@@ -232,12 +232,12 @@ void NuPlayer::setDataSourceAsync(
        // The correct flags will be updated in Source::kWhatFlagsChanged
        // handler when  GenericSource is prepared.

        status_t err = genericSource->init(httpService, url, headers);
        status_t err = genericSource->setDataSource(httpService, url, headers);

        if (err == OK) {
            source = genericSource;
        } else {
            ALOGE("Failed to initialize generic source!");
            ALOGE("Failed to set data source!");
        }
    }
    msg->setObject("source", source);
@@ -252,10 +252,10 @@ void NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) {
    sp<GenericSource> source =
            new GenericSource(notify, mUIDValid, mUID);

    status_t err = source->init(fd, offset, length);
    status_t err = source->setDataSource(fd, offset, length);

    if (err != OK) {
        ALOGE("Failed to initialize generic source!");
        ALOGE("Failed to set data source!");
        source = NULL;
    }