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

Commit 8d1caa02 authored by Lajos Molnar's avatar Lajos Molnar Committed by Android Git Automerger
Browse files

am 49ea1337: Merge changes I787e1c05,I72d3a5e1,I0a5cc65f,I75fc2a25,I2c2be08d, ... into klp-dev

* commit '49ea1337':
  LiveSession: Use the actual, possibly redirected url as base in the M3U
  M3UParser: Skip query strings when looking for the last slash in a URL
  ChromiumHTTPDataSource: Keep track of the redirected URL
  Initial HLS seamless switch implementation.
  NuPlayer side support for seamless format switch.
  LiveSession refactor
  PlaylistFetcher: Add support for block-by-block decryption.
  LiveSession: Add support for block-by-block fetchFile.
parents 04352de2 49ea1337
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -1011,7 +1011,14 @@ status_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
                                    &NuPlayer::performScanSources));
                    }

                    flushDecoder(audio, formatChange);
                    sp<AMessage> newFormat = mSource->getFormat(audio);
                    sp<Decoder> &decoder = audio ? mAudioDecoder : mVideoDecoder;
                    if (formatChange && !decoder->supportsSeamlessFormatChange(newFormat)) {
                        flushDecoder(audio, /* needShutdown = */ true);
                    } else {
                        flushDecoder(audio, /* needShutdown = */ false);
                        err = OK;
                    }
                } else {
                    // This stream is unaffected by the discontinuity

+61 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ void NuPlayer::Decoder::configure(const sp<AMessage> &format) {
    // queue.
    bool needDedicatedLooper = !strncasecmp(mime.c_str(), "video/", 6);

    mFormat = format;
    mCodec = new ACodec;

    if (needDedicatedLooper && mCodecLooper == NULL) {
@@ -147,5 +148,65 @@ void NuPlayer::Decoder::initiateShutdown() {
    }
}

bool NuPlayer::Decoder::supportsSeamlessAudioFormatChange(const sp<AMessage> &targetFormat) const {
    if (targetFormat == NULL) {
        return true;
    }

    AString mime;
    if (!targetFormat->findString("mime", &mime)) {
        return false;
    }

    if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_AUDIO_AAC)) {
        // field-by-field comparison
        const char * keys[] = { "channel-count", "sample-rate", "is-adts" };
        for (unsigned int i = 0; i < sizeof(keys) / sizeof(keys[0]); i++) {
            int32_t oldVal, newVal;
            if (!mFormat->findInt32(keys[i], &oldVal) || !targetFormat->findInt32(keys[i], &newVal)
                    || oldVal != newVal) {
                return false;
            }
        }

        sp<ABuffer> oldBuf, newBuf;
        if (mFormat->findBuffer("csd-0", &oldBuf) && targetFormat->findBuffer("csd-0", &newBuf)) {
            if (oldBuf->size() != newBuf->size()) {
                return false;
            }
            return !memcmp(oldBuf->data(), newBuf->data(), oldBuf->size());
        }
    }
    return false;
}

bool NuPlayer::Decoder::supportsSeamlessFormatChange(const sp<AMessage> &targetFormat) const {
    if (mFormat == NULL) {
        return false;
    }

    if (targetFormat == NULL) {
        return true;
    }

    AString oldMime, newMime;
    if (!mFormat->findString("mime", &oldMime)
            || !targetFormat->findString("mime", &newMime)
            || !(oldMime == newMime)) {
        return false;
    }

    bool audio = !strncasecmp(oldMime.c_str(), "audio/", strlen("audio/"));
    bool seamless;
    if (audio) {
        seamless = supportsSeamlessAudioFormatChange(targetFormat);
    } else {
        seamless = mCodec != NULL && mCodec->isConfiguredForAdaptivePlayback();
    }

    ALOGV("%s seamless support for %s", seamless ? "yes" : "no", oldMime.c_str());
    return seamless;
}

}  // namespace android
+5 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ struct NuPlayer::Decoder : public AHandler {
    void signalResume();
    void initiateShutdown();

    bool supportsSeamlessFormatChange(const sp<AMessage> &to) const;

protected:
    virtual ~Decoder();

@@ -49,6 +51,7 @@ private:
    sp<AMessage> mNotify;
    sp<NativeWindowWrapper> mNativeWindow;

    sp<AMessage> mFormat;
    sp<ACodec> mCodec;
    sp<ALooper> mCodecLooper;

@@ -59,6 +62,8 @@ private:

    void onFillThisBuffer(const sp<AMessage> &msg);

    bool supportsSeamlessAudioFormatChange(const sp<AMessage> &targetFormat) const;

    DISALLOW_EVIL_CONSTRUCTORS(Decoder);
};

+5 −0
Original line number Diff line number Diff line
@@ -108,6 +108,11 @@ status_t ChromiumHTTPDataSource::connect_l(
    return mState == CONNECTED ? OK : mIOResult;
}

void ChromiumHTTPDataSource::onRedirect(const char *url) {
    Mutex::Autolock autoLock(mLock);
    mURI = url;
}

void ChromiumHTTPDataSource::onConnectionEstablished(
        int64_t contentSize, const char *contentType) {
    Mutex::Autolock autoLock(mLock);
+1 −0
Original line number Diff line number Diff line
@@ -269,6 +269,7 @@ bool SfDelegate::getUID(uid_t *uid) const {
void SfDelegate::OnReceivedRedirect(
            net::URLRequest *request, const GURL &new_url, bool *defer_redirect) {
    MY_LOGV("OnReceivedRedirect");
    mOwner->onRedirect(new_url.spec().c_str());
}

void SfDelegate::OnAuthRequired(
Loading