ThrottledSource.cpp revision c282e3eee921453fc9188705b4879d6289b71f9c
1c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber/* 2c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * Copyright (C) 2010 The Android Open Source Project 3c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * 4c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * you may not use this file except in compliance with the License. 6c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * You may obtain a copy of the License at 7c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * 8c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * 10c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * Unless required by applicable law or agreed to in writing, software 11c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * See the License for the specific language governing permissions and 14c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber * limitations under the License. 15c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber */ 16c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 17c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber#include "include/ThrottledSource.h" 18c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 19c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber#include <media/stagefright/MediaDebug.h> 20c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 21c282e3eee921453fc9188705b4879d6289b71f9cAndreas Hubernamespace android { 22c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 23c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huberstatic int64_t getNowUs() { 24c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber struct timeval tv; 25c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber gettimeofday(&tv, NULL); 26c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 27c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber return (int64_t)tv.tv_usec + tv.tv_sec * 1000000ll; 28c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber} 29c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 30c282e3eee921453fc9188705b4879d6289b71f9cAndreas HuberThrottledSource::ThrottledSource( 31c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber const sp<DataSource> &source, 32c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber int32_t bandwidthLimitBytesPerSecond) 33c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber : mSource(source), 34c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mBandwidthLimitBytesPerSecond(bandwidthLimitBytesPerSecond), 35c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mStartTimeUs(-1), 36c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mTotalTransferred(0) { 37c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber CHECK(mBandwidthLimitBytesPerSecond > 0); 38c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber} 39c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 40c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huberstatus_t ThrottledSource::initCheck() const { 41c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber return mSource->initCheck(); 42c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber} 43c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 44c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huberssize_t ThrottledSource::readAt(off_t offset, void *data, size_t size) { 45c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber Mutex::Autolock autoLock(mLock); 46c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 47c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber ssize_t n = mSource->readAt(offset, data, size); 48c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 49c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber if (n <= 0) { 50c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber return n; 51c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber } 52c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 53c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mTotalTransferred += n; 54c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 55c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber int64_t nowUs = getNowUs(); 56c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 57c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber if (mStartTimeUs < 0) { 58c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mStartTimeUs = nowUs; 59c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber } 60c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 61c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber // How long would it have taken to transfer everything we ever 62c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber // transferred given the limited bandwidth. 63c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber int64_t durationUs = 64c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mTotalTransferred * 1000000ll / mBandwidthLimitBytesPerSecond; 65c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 66c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber int64_t whenUs = mStartTimeUs + durationUs; 67c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 68c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber if (whenUs > nowUs) { 69c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber usleep(whenUs - nowUs); 70c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber } 71c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 72c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber return n; 73c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber} 74c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 75c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huberstatus_t ThrottledSource::getSize(off_t *size) { 76c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber return mSource->getSize(size); 77c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber} 78c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 79c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huberuint32_t ThrottledSource::flags() { 80c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber return mSource->flags(); 81c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber} 82c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 83c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber} // namespace android 84c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 85