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#ifndef THROTTLED_SOURCE_H_ 18c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 19c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber#define THROTTLED_SOURCE_H_ 20c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 21c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber#include <media/stagefright/DataSource.h> 22c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber#include <utils/threads.h> 23c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 24c282e3eee921453fc9188705b4879d6289b71f9cAndreas Hubernamespace android { 25c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 26c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huberstruct ThrottledSource : public DataSource { 27c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber ThrottledSource( 28c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber const sp<DataSource> &source, 29c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber int32_t bandwidthLimitBytesPerSecond); 30c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 31a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen // implementation of readAt() that sleeps to achieve the desired max throughput 32c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong virtual ssize_t readAt(off64_t offset, void *data, size_t size); 33c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 34a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen // returns an empty string to prevent callers from using the Uri to construct a new datasource 35a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen virtual String8 getUri() { 36a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen return String8(); 37a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen } 38a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen 39a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen // following methods all call through to the wrapped DataSource's methods 40a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen 41a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen status_t initCheck() const { 42a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen return mSource->initCheck(); 43a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen } 44a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen 45a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen virtual status_t getSize(off64_t *size) { 46a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen return mSource->getSize(size); 47a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen } 48a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen 49a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen virtual uint32_t flags() { 50a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen return mSource->flags(); 51a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen } 52a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen 53a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen virtual status_t reconnectAtOffset(off64_t offset) { 54a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen return mSource->reconnectAtOffset(offset); 55a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen } 56a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen 57a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen virtual sp<DecryptHandle> DrmInitialization(const char *mime = NULL) { 58a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen return mSource->DrmInitialization(mime); 59a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen } 60a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen 61a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen virtual void getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client) { 62a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen mSource->getDrmInfo(handle, client); 63a15ed9529e70caaf42aae78f9fe530abe38bcc1bMarco Nelissen }; 64c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 65bd9c9a80fd487b3e83861c32b388eac146f8a299Andreas Huber virtual String8 getMIMEType() const { 66bd9c9a80fd487b3e83861c32b388eac146f8a299Andreas Huber return mSource->getMIMEType(); 67bd9c9a80fd487b3e83861c32b388eac146f8a299Andreas Huber } 68bd9c9a80fd487b3e83861c32b388eac146f8a299Andreas Huber 69c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huberprivate: 70c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber Mutex mLock; 71c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 72c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber sp<DataSource> mSource; 73c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber int32_t mBandwidthLimitBytesPerSecond; 74c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber int64_t mStartTimeUs; 75c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber size_t mTotalTransferred; 76c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 77c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber ThrottledSource(const ThrottledSource &); 78c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber ThrottledSource &operator=(const ThrottledSource &); 79c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber}; 80c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 81c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber} // namespace android 82c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber 83c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber#endif // THROTTLED_SOURCE_H_ 84