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