ChromiumHTTPDataSource.cpp revision b5ce361d19e69fe156f7188c9ee0f4734b259874
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; 821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (headers != NULL) { 841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mHeaders = *headers; 851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } else { 861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mHeaders.clear(); 871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = CONNECTING; 901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mContentSize = -1; 911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCurrentOffset = offset; 921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateConnection(mURI.c_str(), &mHeaders, offset); 941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber while (mState == CONNECTING) { 961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.wait(mLock); 971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mState == CONNECTED ? OK : mIOResult; 1001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onConnectionEstablished(int64_t contentSize) { 1031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = CONNECTED; 1051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mContentSize = (contentSize < 0) ? -1 : contentSize + mCurrentOffset; 1061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 1071156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onConnectionFailed(status_t err) { 1101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = DISCONNECTED; 1121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 1131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mURI.clear(); 1151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mIOResult = err; 1171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber clearDRMState_l(); 1191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::disconnect() { 1221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber disconnect_l(); 1241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::disconnect_l() { 1271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState == DISCONNECTED) { 1281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return; 1291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = DISCONNECTING; 1321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mIOResult = -EINTR; 1331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateDisconnect(); 1351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber while (mState == DISCONNECTING) { 1371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.wait(mLock); 1381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber CHECK_EQ((int)mState, (int)DISCONNECTED); 1411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::initCheck() const { 1441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mState == CONNECTED ? OK : NO_INIT; 1471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberssize_t ChromiumHTTPDataSource::readAt(off64_t offset, void *data, size_t size) { 1501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState != CONNECTED) { 1531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return ERROR_NOT_CONNECTED; 1541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (offset != mCurrentOffset) { 1571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber AString tmp = mURI; 1581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber KeyedVector<String8, String8> tmpHeaders = mHeaders; 1591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber disconnect_l(); 1611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber status_t err = connect_l(tmp.c_str(), &tmpHeaders, offset); 1631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1641156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (err != OK) { 1651156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return err; 1661156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = READING; 1701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber int64_t startTimeUs = ALooper::GetNowUs(); 1721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateRead(data, size); 1741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber while (mState == READING) { 1761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.wait(mLock); 1771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1791156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mIOResult < OK) { 1801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mIOResult; 1811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState == CONNECTED) { 1841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber int64_t delayUs = ALooper::GetNowUs() - startTimeUs; 1851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber // The read operation was successful, mIOResult contains 1871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber // the number of bytes read. 1881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber addBandwidthMeasurement_l(mIOResult, delayUs); 1891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCurrentOffset += mIOResult; 1911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mIOResult; 1921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return ERROR_IO; 1951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onReadCompleted(ssize_t size) { 1981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mIOResult = size; 2011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState == READING) { 2031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = CONNECTED; 2041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 2051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2071156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::getSize(off64_t *size) { 2091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mContentSize < 0) { 2121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return ERROR_UNSUPPORTED; 2131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *size = mContentSize; 2161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return OK; 2181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberuint32_t ChromiumHTTPDataSource::flags() { 2211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return kWantsPrefetching; 2221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber// static 2251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::InitiateRead( 2261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber ChromiumHTTPDataSource *me, void *data, size_t size) { 2271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber me->initiateRead(data, size); 2281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::initiateRead(void *data, size_t size) { 2311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateRead(data, size); 2321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onDisconnectComplete() { 2351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber CHECK_EQ((int)mState, (int)DISCONNECTING); 2371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = DISCONNECTED; 2391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mURI.clear(); 2401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 2421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber clearDRMState_l(); 2441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::addBandwidthMeasurement_l( 2471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber size_t numBytes, int64_t delayUs) { 2481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber BandwidthEntry entry; 2491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber entry.mDelayUs = delayUs; 2501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber entry.mNumBytes = numBytes; 2511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mTotalTransferTimeUs += delayUs; 2521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mTotalTransferBytes += numBytes; 2531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mBandwidthHistory.push_back(entry); 2551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (++mNumBandwidthHistoryItems > 100) { 2561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber BandwidthEntry *entry = &*mBandwidthHistory.begin(); 2571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mTotalTransferTimeUs -= entry->mDelayUs; 2581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mTotalTransferBytes -= entry->mNumBytes; 2591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mBandwidthHistory.erase(mBandwidthHistory.begin()); 2601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber --mNumBandwidthHistoryItems; 2611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2641156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberbool ChromiumHTTPDataSource::estimateBandwidth(int32_t *bandwidth_bps) { 2651156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2661156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mNumBandwidthHistoryItems < 2) { 2681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return false; 2691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *bandwidth_bps = ((double)mTotalTransferBytes * 8E6 / mTotalTransferTimeUs); 2721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return true; 2741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 276b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangsp<DecryptHandle> ChromiumHTTPDataSource::DrmInitialization() { 2771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2791156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDrmManagerClient == NULL) { 2801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient = new DrmManagerClient(); 2811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDrmManagerClient == NULL) { 2841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return NULL; 2851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDecryptHandle == NULL) { 2881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber /* Note if redirect occurs, mUri is the redirect uri instead of the 2891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * original one 2901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber */ 2911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDecryptHandle = mDrmManagerClient->openDecryptSession( 2921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber String8(mURI.c_str())); 2931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDecryptHandle == NULL) { 2961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber delete mDrmManagerClient; 2971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient = NULL; 2981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 3001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mDecryptHandle; 3011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 3021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 3031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::getDrmInfo( 304b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang sp<DecryptHandle> &handle, DrmManagerClient **client) { 3051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 3061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 307b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang handle = mDecryptHandle; 3081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *client = mDrmManagerClient; 3091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 3101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 3111156dc913a5ba7b2bc86489468d4914430f03d14Andreas HuberString8 ChromiumHTTPDataSource::getUri() { 3121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 3131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 3141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return String8(mURI.c_str()); 3151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 3161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 3171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::clearDRMState_l() { 3181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDecryptHandle != NULL) { 3191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber // To release mDecryptHandle 3201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber CHECK(mDrmManagerClient); 3211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient->closeDecryptSession(mDecryptHandle); 3221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDecryptHandle = NULL; 3231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 3241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 3251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 3261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} // namespace android 3271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 328