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 19f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h> 20af5dd7753e62353411cf0daf3b513c38818e9662Andreas Huber#include <media/stagefright/foundation/ALooper.h> 21c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 22c282e3eee921453fc9188705b4879d6289b71f9cAndreas Hubernamespace android { 23c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 24c282e3eee921453fc9188705b4879d6289b71f9cAndreas HuberThrottledSource::ThrottledSource( 25c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber const sp<DataSource> &source, 26c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber int32_t bandwidthLimitBytesPerSecond) 27c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber : mSource(source), 28c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mBandwidthLimitBytesPerSecond(bandwidthLimitBytesPerSecond), 29c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mStartTimeUs(-1), 30c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mTotalTransferred(0) { 31c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber CHECK(mBandwidthLimitBytesPerSecond > 0); 32c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber} 33c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 34c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongssize_t ThrottledSource::readAt(off64_t offset, void *data, size_t size) { 35c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber Mutex::Autolock autoLock(mLock); 36c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 37c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber ssize_t n = mSource->readAt(offset, data, size); 38c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 39c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber if (n <= 0) { 40c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber return n; 41c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber } 42c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 43c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mTotalTransferred += n; 44c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 45af5dd7753e62353411cf0daf3b513c38818e9662Andreas Huber int64_t nowUs = ALooper::GetNowUs(); 46c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 47c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber if (mStartTimeUs < 0) { 48c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mStartTimeUs = nowUs; 49c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber } 50c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 51c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber // How long would it have taken to transfer everything we ever 52c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber // transferred given the limited bandwidth. 53c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber int64_t durationUs = 54c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber mTotalTransferred * 1000000ll / mBandwidthLimitBytesPerSecond; 55c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 56c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber int64_t whenUs = mStartTimeUs + durationUs; 57c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 58c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber if (whenUs > nowUs) { 59c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber usleep(whenUs - nowUs); 60c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber } 61c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber return n; 62c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber} 63c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 64c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 65c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber} // namespace android 66c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 67