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
34c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huberstatus_t ThrottledSource::initCheck() const {
35c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    return mSource->initCheck();
36c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber}
37c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
38c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongssize_t ThrottledSource::readAt(off64_t offset, void *data, size_t size) {
39c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    Mutex::Autolock autoLock(mLock);
40c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
41c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    ssize_t n = mSource->readAt(offset, data, size);
42c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
43c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    if (n <= 0) {
44c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber        return n;
45c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    }
46c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
47c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    mTotalTransferred += n;
48c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
49af5dd7753e62353411cf0daf3b513c38818e9662Andreas Huber    int64_t nowUs = ALooper::GetNowUs();
50c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
51c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    if (mStartTimeUs < 0) {
52c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber        mStartTimeUs = nowUs;
53c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    }
54c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
55c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    // How long would it have taken to transfer everything we ever
56c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    // transferred given the limited bandwidth.
57c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    int64_t durationUs =
58c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber        mTotalTransferred * 1000000ll / mBandwidthLimitBytesPerSecond;
59c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
60c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    int64_t whenUs = mStartTimeUs + durationUs;
61c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
62c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    if (whenUs > nowUs) {
63c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber        usleep(whenUs - nowUs);
64c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    }
65c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
66c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    return n;
67c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber}
68c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
69c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongstatus_t ThrottledSource::getSize(off64_t *size) {
70c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    return mSource->getSize(size);
71c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber}
72c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
73c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huberuint32_t ThrottledSource::flags() {
74c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber    return mSource->flags();
75c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber}
76c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
77c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber}  // namespace android
78c282e3eee921453fc9188705b4879d6289b71f9cAndreas Huber
79