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

Commit 8258879f authored by Andreas Huber's avatar Andreas Huber Committed by Android (Google) Code Review
Browse files

Merge "Better support for HTTP streaming media content, fixes to the way...

Merge "Better support for HTTP streaming media content, fixes to the way HTTPDataSource streams the data, prefetcher implementation."
parents 89e02edf b9e63830
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ public:

    virtual ssize_t readAt(off_t offset, void *data, size_t size);

    virtual uint32_t flags();

protected:
    virtual ~CachingDataSource();

+8 −0
Original line number Diff line number Diff line
@@ -31,6 +31,10 @@ class String8;

class DataSource : public RefBase {
public:
    enum Flags {
        kWantsPrefetching = 1,
    };

    static sp<DataSource> CreateFromURI(const char *uri);

    DataSource() {}
@@ -45,6 +49,10 @@ public:
    // May return ERROR_UNSUPPORTED.
    virtual status_t getSize(off_t *size);

    virtual uint32_t flags() {
        return 0;
    }

    ////////////////////////////////////////////////////////////////////////////

    bool sniff(String8 *mimeType, float *confidence);
+6 −0
Original line number Diff line number Diff line
@@ -33,6 +33,10 @@ public:

    virtual ssize_t readAt(off_t offset, void *data, size_t size);

    virtual uint32_t flags() {
        return kWantsPrefetching;
    }

protected:
    virtual ~HTTPDataSource();

@@ -52,6 +56,8 @@ private:

    status_t mInitCheck;

    ssize_t sendRangeRequest(size_t offset);

    HTTPDataSource(const HTTPDataSource &);
    HTTPDataSource &operator=(const HTTPDataSource &);
};
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ LOCAL_SRC_FILES += \
        MPEG4Extractor.cpp        \
        MPEG4Writer.cpp           \
        MediaExtractor.cpp        \
        Prefetcher.cpp            \
        SampleIterator.cpp        \
        SampleTable.cpp           \
        ShoutcastSource.cpp       \
+75 −9
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <utils/Log.h>

#include "include/AwesomePlayer.h"
#include "include/Prefetcher.h"
#include "include/SoftwareRenderer.h"

#include <binder/IPCThreadState.h>
@@ -118,6 +119,8 @@ AwesomePlayer::AwesomePlayer()
    mVideoEventPending = false;
    mStreamDoneEvent = new AwesomeEvent(this, 1);
    mStreamDoneEventPending = false;
    mBufferingEvent = new AwesomeEvent(this, 2);
    mBufferingEventPending = false;

    mQueue.start();

@@ -132,11 +135,16 @@ AwesomePlayer::~AwesomePlayer() {
    mClient.disconnect();
}

void AwesomePlayer::cancelPlayerEvents() {
void AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) {
    mQueue.cancelEvent(mVideoEvent->eventID());
    mVideoEventPending = false;
    mQueue.cancelEvent(mStreamDoneEvent->eventID());
    mStreamDoneEventPending = false;

    if (!keepBufferingGoing) {
        mQueue.cancelEvent(mBufferingEvent->eventID());
        mBufferingEventPending = false;
    }
}

void AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) {
@@ -149,12 +157,22 @@ status_t AwesomePlayer::setDataSource(const char *uri) {

    reset_l();

    sp<MediaExtractor> extractor = MediaExtractor::CreateFromURI(uri);
    sp<DataSource> dataSource = DataSource::CreateFromURI(uri);

    if (dataSource == NULL) {
        return UNKNOWN_ERROR;
    }

    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);

    if (extractor == NULL) {
        return UNKNOWN_ERROR;
    }

    if (dataSource->flags() & DataSource::kWantsPrefetching) {
        mPrefetcher = new Prefetcher;
    }

    return setDataSource_l(extractor);
}

@@ -182,8 +200,6 @@ status_t AwesomePlayer::setDataSource(
}

status_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) {
    reset_l();

    bool haveAudio = false;
    bool haveVideo = false;
    for (size_t i = 0; i < extractor->countTracks(); ++i) {
@@ -253,6 +269,8 @@ void AwesomePlayer::reset_l() {

    mSeeking = false;
    mSeekTimeUs = 0;

    mPrefetcher.clear();
}

// static
@@ -278,16 +296,38 @@ void AwesomePlayer::AudioNotify(void *_me, int what) {
    }
}

void AwesomePlayer::notifyListener_l(int msg) {
void AwesomePlayer::notifyListener_l(int msg, int ext1) {
    if (mListener != NULL) {
        sp<MediaPlayerBase> listener = mListener.promote();

        if (listener != NULL) {
            listener->sendEvent(msg);
            listener->sendEvent(msg, ext1);
        }
    }
}

void AwesomePlayer::onBufferingUpdate() {
    Mutex::Autolock autoLock(mLock);
    mBufferingEventPending = false;

    if (mDurationUs >= 0) {
        int64_t cachedDurationUs = mPrefetcher->getCachedDurationUs();
        int64_t positionUs = 0;
        if (mVideoRenderer != NULL) {
            positionUs = mVideoTimeUs;
        } else if (mAudioPlayer != NULL) {
            positionUs = mAudioPlayer->getMediaTimeUs();
        }

        cachedDurationUs += positionUs;

        double percentage = (double)cachedDurationUs / mDurationUs;
        notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage * 100.0);

        postBufferingEvent_l();
    }
}

void AwesomePlayer::onStreamDone() {
    // Posted whenever any stream finishes playing.

@@ -361,6 +401,8 @@ status_t AwesomePlayer::play() {
        seekAudioIfNecessary_l();
    }

    postBufferingEvent_l();

    return OK;
}

@@ -414,7 +456,7 @@ status_t AwesomePlayer::pause_l() {
        return OK;
    }

    cancelPlayerEvents();
    cancelPlayerEvents(true /* keepBufferingGoing */);

    if (mAudioPlayer != NULL) {
        mAudioPlayer->pause();
@@ -518,11 +560,15 @@ status_t AwesomePlayer::getVideoDimensions(
    return OK;
}

status_t AwesomePlayer::setAudioSource(const sp<MediaSource> &source) {
status_t AwesomePlayer::setAudioSource(sp<MediaSource> source) {
    if (source == NULL) {
        return UNKNOWN_ERROR;
    }

    if (mPrefetcher != NULL) {
        source = mPrefetcher->addSource(source);
    }

    sp<MetaData> meta = source->getFormat();

    const char *mime;
@@ -549,11 +595,15 @@ status_t AwesomePlayer::setAudioSource(const sp<MediaSource> &source) {
    return mAudioSource != NULL ? OK : UNKNOWN_ERROR;
}

status_t AwesomePlayer::setVideoSource(const sp<MediaSource> &source) {
status_t AwesomePlayer::setVideoSource(sp<MediaSource> source) {
    if (source == NULL) {
        return UNKNOWN_ERROR;
    }

    if (mPrefetcher != NULL) {
        source = mPrefetcher->addSource(source);
    }

    mVideoSource = OMXCodec::Create(
            mClient.interface(), source->getFormat(),
            false, // createEncoder
@@ -580,9 +630,13 @@ void AwesomePlayer::onEvent(int32_t code) {
    if (code == 1) {
        onStreamDone();
        return;
    } else if (code == 2) {
        onBufferingUpdate();
        return;
    }

    Mutex::Autolock autoLock(mLock);

    mVideoEventPending = false;

    if (mSeeking) {
@@ -718,5 +772,17 @@ void AwesomePlayer::postStreamDoneEvent_l() {
    mQueue.postEvent(mStreamDoneEvent);
}

void AwesomePlayer::postBufferingEvent_l() {
    if (mPrefetcher == NULL) {
        return;
    }

    if (mBufferingEventPending) {
        return;
    }
    mBufferingEventPending = true;
    mQueue.postEventWithDelay(mBufferingEvent, 1000000ll);
}

}  // namespace android
Loading