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

Commit 61955937 authored by Steve Kondik's avatar Steve Kondik
Browse files

nuplayer: Add cached lookup of track duration

 * After a seek in an HTTP source (such as Play Music), the duration
   ends up as zero due to multiple pending fetches.
 * This has a nasty side effect of breaking audio effects connected
   to the global mix (visualizer) after an offload fallback as the
   deep buffer stream wasn't selected either.
 * Cache the last known good duration and use it if the extractor
   isn't able to get it.

Change-Id: I65f60323959455ec1ce45ae88b821d4227eeb14d
parent 918ae2c0
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -598,9 +598,8 @@ void NuPlayer::GenericSource::notifyBufferingUpdate(int percentage,
    msg->post();
}

void NuPlayer::GenericSource::onPollBuffering() {
status_t NuPlayer::GenericSource::getCachedDuration(int64_t *cachedDurationUs) {
    status_t finalStatus = UNKNOWN_ERROR;
    int64_t cachedDurationUs = 0ll;

    if (mCachedSource != NULL) {
        size_t cachedDataRemaining =
@@ -615,14 +614,28 @@ void NuPlayer::GenericSource::onPollBuffering() {
                bitrate = mBitrate;
            }
            if (bitrate > 0) {
                cachedDurationUs = cachedDataRemaining * 8000000ll / bitrate;
                *cachedDurationUs = cachedDataRemaining * 8000000ll / bitrate;
            }
        }
    } else if (mWVMExtractor != NULL) {
        cachedDurationUs
        *cachedDurationUs
            = mWVMExtractor->getCachedDurationUs(&finalStatus);
    }

    if (*cachedDurationUs > 0) {
        mCachedDurationUs = *cachedDurationUs;
    } else {
        *cachedDurationUs = mCachedDurationUs;
    }

    ALOGV("getCachedDuration = %lld", *cachedDurationUs);
    return finalStatus;
}

void NuPlayer::GenericSource::onPollBuffering() {
    int64_t cachedDurationUs = 0ll;
    status_t finalStatus = getCachedDuration(&cachedDurationUs);

    if (finalStatus == ERROR_END_OF_STREAM) {
        notifyBufferingUpdate(100, 0);
        cancelPollBuffering();
+3 −0
Original line number Diff line number Diff line
@@ -75,6 +75,8 @@ struct NuPlayer::GenericSource : public NuPlayer::Source {
    virtual status_t suspend();
    virtual status_t resumeFromSuspended();

    virtual status_t getCachedDuration(int64_t *durationUs);

protected:
    virtual ~GenericSource();

@@ -117,6 +119,7 @@ private:
    int32_t mFetchSubtitleDataGeneration;
    int32_t mFetchTimedTextDataGeneration;
    int64_t mDurationUs;
    int64_t mCachedDurationUs;
    bool mAudioIsVorbis;
    bool mIsWidevine;
    bool mUIDValid;
+8 −2
Original line number Diff line number Diff line
@@ -638,7 +638,14 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                }
            }

            int64_t duration = 0ll;
            sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);
            if (audioMeta.get() && (
                        !audioMeta->findInt64(kKeyDuration, &duration) || duration == 0)) {
                mSource->getCachedDuration(&duration);
                audioMeta->setInt64(kKeyDuration, duration);
            }

            if (!(ExtendedUtils::isRAWFormat(audioMeta) &&
                        ExtendedUtils::isPcmOffloadEnabled())) {
                mSource->start();
@@ -1229,7 +1236,7 @@ void NuPlayer::openAudioSink(const sp<AMessage> &format, bool offloadOnly) {
    int64_t durationUs;
    bool hasVideo = (mVideoDecoder != NULL);

    if (mSource->getDuration(&durationUs) == OK &&
    if (mSource->getCachedDuration(&durationUs) == OK &&
            durationUs > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) {
        flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
    } else {
@@ -1237,7 +1244,6 @@ void NuPlayer::openAudioSink(const sp<AMessage> &format, bool offloadOnly) {
    }

    sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);

#ifdef ENABLE_AV_ENHANCEMENTS
    if (mOffloadDecodedPCM && audioMeta != NULL) {
        sp<MetaData> audioPCMMeta = ExtendedUtils::createPCMMetaFromSource(audioMeta);
+4 −0
Original line number Diff line number Diff line
@@ -124,6 +124,10 @@ struct NuPlayer::Source : public AHandler {
        return INVALID_OPERATION;
    }

    virtual status_t getCachedDuration(int64_t *durationUs) {
        return getDuration(durationUs);
    }

protected:
    virtual ~Source() {}