ThrottledSource.cpp revision a15ed9529e70caaf42aae78f9fe530abe38bcc1b
1bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber/*
2bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *
4bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * you may not use this file except in compliance with the License.
6bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * You may obtain a copy of the License at
7bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *
8bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *
10bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * See the License for the specific language governing permissions and
14bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * limitations under the License.
15bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber */
16bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/ThrottledSource.h"
18bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
19bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/foundation/ADebug.h>
20bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/foundation/ALooper.h>
211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
22bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android {
23bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
24bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberThrottledSource::ThrottledSource(
25fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        const sp<DataSource> &source,
26bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int32_t bandwidthLimitBytesPerSecond)
275d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    : mSource(source),
28bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber      mBandwidthLimitBytesPerSecond(bandwidthLimitBytesPerSecond),
29dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang      mStartTimeUs(-1),
30bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber      mTotalTransferred(0) {
31bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    CHECK(mBandwidthLimitBytesPerSecond > 0);
32bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
3366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
347b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberssize_t ThrottledSource::readAt(off64_t offset, void *data, size_t size) {
35bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
36bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
37bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    ssize_t n = mSource->readAt(offset, data, size);
380a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
391173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    if (n <= 0) {
40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return n;
41cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    }
42cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
43cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    mTotalTransferred += n;
44dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
45dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    int64_t nowUs = ALooper::GetNowUs();
46bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
477a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    if (mStartTimeUs < 0) {
48681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mStartTimeUs = nowUs;
497a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
50733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
51733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    // How long would it have taken to transfer everything we ever
52733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    // transferred given the limited bandwidth.
53733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    int64_t durationUs =
54733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        mTotalTransferred * 1000000ll / mBandwidthLimitBytesPerSecond;
55733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
56733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    int64_t whenUs = mStartTimeUs + durationUs;
57733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
58733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    if (whenUs > nowUs) {
59733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        usleep(whenUs - nowUs);
60bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
61bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return n;
62bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
63bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
640726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
65bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}  // namespace android
665561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber
675561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber