summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-06-01 13:38:13 -0700
committerAndreas Huber <andih@google.com>2010-06-01 13:41:16 -0700
commitc282e3eee921453fc9188705b4879d6289b71f9c (patch)
tree104a2900e82b373939b771264cbe2932eca07225 /media
parentba0fab325cd8379378a2c8ad14dd1c44bf2760f3 (diff)
downloadframeworks_av-c282e3eee921453fc9188705b4879d6289b71f9c.zip
frameworks_av-c282e3eee921453fc9188705b4879d6289b71f9c.tar.gz
frameworks_av-c282e3eee921453fc9188705b4879d6289b71f9c.tar.bz2
A debugging DataSource artifically limiting the available bandwidth.
Change-Id: I4ca75337a52599d211ea066fd94e649748df052d
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/Android.mk1
-rw-r--r--media/libstagefright/ThrottledSource.cpp84
-rw-r--r--media/libstagefright/include/ThrottledSource.h52
3 files changed, 137 insertions, 0 deletions
diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk
index 8d15013..f00fad8 100644
--- a/media/libstagefright/Android.mk
+++ b/media/libstagefright/Android.mk
@@ -40,6 +40,7 @@ LOCAL_SRC_FILES += \
ShoutcastSource.cpp \
StagefrightMediaScanner.cpp \
StagefrightMetadataRetriever.cpp \
+ ThrottledSource.cpp \
TimeSource.cpp \
TimedEventQueue.cpp \
WAVExtractor.cpp \
diff --git a/media/libstagefright/ThrottledSource.cpp b/media/libstagefright/ThrottledSource.cpp
new file mode 100644
index 0000000..4711f7c
--- /dev/null
+++ b/media/libstagefright/ThrottledSource.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "include/ThrottledSource.h"
+
+#include <media/stagefright/MediaDebug.h>
+
+namespace android {
+
+static int64_t getNowUs() {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+
+ return (int64_t)tv.tv_usec + tv.tv_sec * 1000000ll;
+}
+
+ThrottledSource::ThrottledSource(
+ const sp<DataSource> &source,
+ int32_t bandwidthLimitBytesPerSecond)
+ : mSource(source),
+ mBandwidthLimitBytesPerSecond(bandwidthLimitBytesPerSecond),
+ mStartTimeUs(-1),
+ mTotalTransferred(0) {
+ CHECK(mBandwidthLimitBytesPerSecond > 0);
+}
+
+status_t ThrottledSource::initCheck() const {
+ return mSource->initCheck();
+}
+
+ssize_t ThrottledSource::readAt(off_t offset, void *data, size_t size) {
+ Mutex::Autolock autoLock(mLock);
+
+ ssize_t n = mSource->readAt(offset, data, size);
+
+ if (n <= 0) {
+ return n;
+ }
+
+ mTotalTransferred += n;
+
+ int64_t nowUs = getNowUs();
+
+ if (mStartTimeUs < 0) {
+ mStartTimeUs = nowUs;
+ }
+
+ // How long would it have taken to transfer everything we ever
+ // transferred given the limited bandwidth.
+ int64_t durationUs =
+ mTotalTransferred * 1000000ll / mBandwidthLimitBytesPerSecond;
+
+ int64_t whenUs = mStartTimeUs + durationUs;
+
+ if (whenUs > nowUs) {
+ usleep(whenUs - nowUs);
+ }
+
+ return n;
+}
+
+status_t ThrottledSource::getSize(off_t *size) {
+ return mSource->getSize(size);
+}
+
+uint32_t ThrottledSource::flags() {
+ return mSource->flags();
+}
+
+} // namespace android
+
diff --git a/media/libstagefright/include/ThrottledSource.h b/media/libstagefright/include/ThrottledSource.h
new file mode 100644
index 0000000..88164b3
--- /dev/null
+++ b/media/libstagefright/include/ThrottledSource.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef THROTTLED_SOURCE_H_
+
+#define THROTTLED_SOURCE_H_
+
+#include <media/stagefright/DataSource.h>
+#include <utils/threads.h>
+
+namespace android {
+
+struct ThrottledSource : public DataSource {
+ ThrottledSource(
+ const sp<DataSource> &source,
+ int32_t bandwidthLimitBytesPerSecond);
+
+ virtual status_t initCheck() const;
+
+ virtual ssize_t readAt(off_t offset, void *data, size_t size);
+
+ virtual status_t getSize(off_t *size);
+ virtual uint32_t flags();
+
+private:
+ Mutex mLock;
+
+ sp<DataSource> mSource;
+ int32_t mBandwidthLimitBytesPerSecond;
+ int64_t mStartTimeUs;
+ size_t mTotalTransferred;
+
+ ThrottledSource(const ThrottledSource &);
+ ThrottledSource &operator=(const ThrottledSource &);
+};
+
+} // namespace android
+
+#endif // THROTTLED_SOURCE_H_