ChromiumHTTPDataSource.cpp revision 6511c9755c3a3360ba869772600c7aae048a7ffc
11156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber/*
21156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Copyright (C) 2011 The Android Open Source Project
31156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *
41156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
51156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * you may not use this file except in compliance with the License.
61156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * You may obtain a copy of the License at
71156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *
81156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
91156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *
101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Unless required by applicable law or agreed to in writing, software
111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * See the License for the specific language governing permissions and
141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * limitations under the License.
151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber */
161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber//#define LOG_NDEBUG 0
181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#define LOG_TAG "ChromiumHTTPDataSource"
191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include <media/stagefright/foundation/ADebug.h>
201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include "include/ChromiumHTTPDataSource.h"
221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include <media/stagefright/foundation/ALooper.h>
241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include <media/stagefright/MediaErrors.h>
251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include "support.h"
271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubernamespace android {
291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
301156dc913a5ba7b2bc86489468d4914430f03d14Andreas HuberChromiumHTTPDataSource::ChromiumHTTPDataSource(uint32_t flags)
311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    : mFlags(flags),
321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber      mState(DISCONNECTED),
331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber      mDelegate(new SfDelegate),
341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber      mCurrentOffset(0),
351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber      mIOResult(OK),
361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber      mContentSize(-1),
371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber      mNumBandwidthHistoryItems(0),
381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber      mTotalTransferTimeUs(0),
391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber      mTotalTransferBytes(0),
401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber      mDecryptHandle(NULL),
411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber      mDrmManagerClient(NULL) {
421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mDelegate->setOwner(this);
431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
451156dc913a5ba7b2bc86489468d4914430f03d14Andreas HuberChromiumHTTPDataSource::~ChromiumHTTPDataSource() {
461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    disconnect();
471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    delete mDelegate;
491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mDelegate = NULL;
501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mDrmManagerClient != NULL) {
521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        delete mDrmManagerClient;
531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mDrmManagerClient = NULL;
541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::connect(
581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        const char *uri,
591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        const KeyedVector<String8, String8> *headers,
601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        off64_t offset) {
611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return connect_l(uri, headers, offset);
641156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
651156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
661156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::connect_l(
671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        const char *uri,
681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        const KeyedVector<String8, String8> *headers,
691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        off64_t offset) {
701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mState != DISCONNECTED) {
711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        disconnect_l();
721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (!(mFlags & kFlagIncognito)) {
751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "connect to %s @%lld", uri, offset);
761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    } else {
771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        LOG_PRI(ANDROID_LOG_INFO, LOG_TAG,
781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                "connect to <URL suppressed> @%lld", offset);
791156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mURI = uri;
826511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    mContentType = String8("application/octet-stream");
831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (headers != NULL) {
851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mHeaders = *headers;
861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    } else {
871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mHeaders.clear();
881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = CONNECTING;
911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mContentSize = -1;
921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mCurrentOffset = offset;
931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mDelegate->initiateConnection(mURI.c_str(), &mHeaders, offset);
951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    while (mState == CONNECTING) {
971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mCondition.wait(mLock);
981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return mState == CONNECTED ? OK : mIOResult;
1011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1036511c9755c3a3360ba869772600c7aae048a7ffcAndreas Hubervoid ChromiumHTTPDataSource::onConnectionEstablished(
1046511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber        int64_t contentSize, const char *contentType) {
1051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
1061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = CONNECTED;
1071156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mContentSize = (contentSize < 0) ? -1 : contentSize + mCurrentOffset;
1086511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    mContentType = String8(contentType);
1091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mCondition.broadcast();
1101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onConnectionFailed(status_t err) {
1131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
1141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = DISCONNECTED;
1151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mCondition.broadcast();
1161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mURI.clear();
1181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mIOResult = err;
1201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    clearDRMState_l();
1221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::disconnect() {
1251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
1261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    disconnect_l();
1271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::disconnect_l() {
1301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mState == DISCONNECTED) {
1311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return;
1321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = DISCONNECTING;
1351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mIOResult = -EINTR;
1361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mDelegate->initiateDisconnect();
1381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    while (mState == DISCONNECTING) {
1401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mCondition.wait(mLock);
1411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    CHECK_EQ((int)mState, (int)DISCONNECTED);
1441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::initCheck() const {
1471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
1481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return mState == CONNECTED ? OK : NO_INIT;
1501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberssize_t ChromiumHTTPDataSource::readAt(off64_t offset, void *data, size_t size) {
1531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
1541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mState != CONNECTED) {
1561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return ERROR_NOT_CONNECTED;
1571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (offset != mCurrentOffset) {
1601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        AString tmp = mURI;
1611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        KeyedVector<String8, String8> tmpHeaders = mHeaders;
1621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        disconnect_l();
1641156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1651156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        status_t err = connect_l(tmp.c_str(), &tmpHeaders, offset);
1661156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        if (err != OK) {
1681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber            return err;
1691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        }
1701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = READING;
1731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    int64_t startTimeUs = ALooper::GetNowUs();
1751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mDelegate->initiateRead(data, size);
1771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    while (mState == READING) {
1791156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mCondition.wait(mLock);
1801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mIOResult < OK) {
1831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return mIOResult;
1841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mState == CONNECTED) {
1871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        int64_t delayUs = ALooper::GetNowUs() - startTimeUs;
1881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        // The read operation was successful, mIOResult contains
1901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        // the number of bytes read.
1911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        addBandwidthMeasurement_l(mIOResult, delayUs);
1921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mCurrentOffset += mIOResult;
1941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return mIOResult;
1951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return ERROR_IO;
1981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onReadCompleted(ssize_t size) {
2011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
2021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mIOResult = size;
2041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mState == READING) {
2061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mState = CONNECTED;
2071156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mCondition.broadcast();
2081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::getSize(off64_t *size) {
2121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
2131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mContentSize < 0) {
2151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return ERROR_UNSUPPORTED;
2161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    *size = mContentSize;
2191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return OK;
2211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberuint32_t ChromiumHTTPDataSource::flags() {
2241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return kWantsPrefetching;
2251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber// static
2281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::InitiateRead(
2291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        ChromiumHTTPDataSource *me, void *data, size_t size) {
2301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    me->initiateRead(data, size);
2311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::initiateRead(void *data, size_t size) {
2341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mDelegate->initiateRead(data, size);
2351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onDisconnectComplete() {
2381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
2391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    CHECK_EQ((int)mState, (int)DISCONNECTING);
2401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = DISCONNECTED;
2421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mURI.clear();
2431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mCondition.broadcast();
2451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    clearDRMState_l();
2471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::addBandwidthMeasurement_l(
2501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        size_t numBytes, int64_t delayUs) {
2511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    BandwidthEntry entry;
2521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    entry.mDelayUs = delayUs;
2531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    entry.mNumBytes = numBytes;
2541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mTotalTransferTimeUs += delayUs;
2551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mTotalTransferBytes += numBytes;
2561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mBandwidthHistory.push_back(entry);
2581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (++mNumBandwidthHistoryItems > 100) {
2591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        BandwidthEntry *entry = &*mBandwidthHistory.begin();
2601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mTotalTransferTimeUs -= entry->mDelayUs;
2611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mTotalTransferBytes -= entry->mNumBytes;
2621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mBandwidthHistory.erase(mBandwidthHistory.begin());
2631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        --mNumBandwidthHistoryItems;
2641156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2651156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2661156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberbool ChromiumHTTPDataSource::estimateBandwidth(int32_t *bandwidth_bps) {
2681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
2691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mNumBandwidthHistoryItems < 2) {
2711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return false;
2721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    *bandwidth_bps = ((double)mTotalTransferBytes * 8E6 / mTotalTransferTimeUs);
2751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return true;
2771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
279b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangsp<DecryptHandle> ChromiumHTTPDataSource::DrmInitialization() {
2801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
2811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mDrmManagerClient == NULL) {
2831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mDrmManagerClient = new DrmManagerClient();
2841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mDrmManagerClient == NULL) {
2871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return NULL;
2881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mDecryptHandle == NULL) {
2911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        /* Note if redirect occurs, mUri is the redirect uri instead of the
2921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber         * original one
2931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber         */
2941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mDecryptHandle = mDrmManagerClient->openDecryptSession(
2951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                String8(mURI.c_str()));
2961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mDecryptHandle == NULL) {
2991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        delete mDrmManagerClient;
3001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mDrmManagerClient = NULL;
3011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
3021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
3031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return mDecryptHandle;
3041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
3051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
3061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::getDrmInfo(
307b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang        sp<DecryptHandle> &handle, DrmManagerClient **client) {
3081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
3091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
310b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang    handle = mDecryptHandle;
3111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    *client = mDrmManagerClient;
3121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
3131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
3141156dc913a5ba7b2bc86489468d4914430f03d14Andreas HuberString8 ChromiumHTTPDataSource::getUri() {
3151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
3161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
3171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return String8(mURI.c_str());
3181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
3191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
3206511c9755c3a3360ba869772600c7aae048a7ffcAndreas HuberString8 ChromiumHTTPDataSource::getMIMEType() const {
3216511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    Mutex::Autolock autoLock(mLock);
3226511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
3236511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    return mContentType;
3246511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber}
3256511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
3261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::clearDRMState_l() {
3271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mDecryptHandle != NULL) {
3281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        // To release mDecryptHandle
3291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        CHECK(mDrmManagerClient);
3301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mDrmManagerClient->closeDecryptSession(mDecryptHandle);
3311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mDecryptHandle = NULL;
3321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
3331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
3341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
3351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}  // namespace android
3361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
337