summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-10-01 16:03:44 -0700
committerAndreas Huber <andih@google.com>2012-10-01 16:03:44 -0700
commitfa0e033ab5a0ab5d96e90c9f6d4d53bedc74514b (patch)
tree36a07a0e8484abeb2d8ec882833c6aef8aa7f231
parent90689fda75c343ab9328ced63e58f45eabaa33cc (diff)
downloadframeworks_av-fa0e033ab5a0ab5d96e90c9f6d4d53bedc74514b.zip
frameworks_av-fa0e033ab5a0ab5d96e90c9f6d4d53bedc74514b.tar.gz
frameworks_av-fa0e033ab5a0ab5d96e90c9f6d4d53bedc74514b.tar.bz2
ALooper::GetNowUs() now relies on systemTime instead of gettimeofday.
Change-Id: Ia31eb0940b02581327a8bf51af6df135f9ab6de3 related-to-bug: 7266324
-rw-r--r--include/media/stagefright/AudioSource.h8
-rw-r--r--include/media/stagefright/TimeSource.h2
-rw-r--r--media/libstagefright/AudioSource.cpp17
-rw-r--r--media/libstagefright/ThrottledSource.cpp10
-rw-r--r--media/libstagefright/TimeSource.cpp13
-rw-r--r--media/libstagefright/TimedEventQueue.cpp15
-rw-r--r--media/libstagefright/foundation/ALooper.cpp5
-rw-r--r--media/libstagefright/omx/tests/OMXHarness.cpp12
-rw-r--r--media/libstagefright/rtsp/ARTPAssembler.cpp12
-rw-r--r--media/libstagefright/wifi-display/source/MediaPuller.cpp11
-rw-r--r--media/libstagefright/wifi-display/source/PlaybackSession.cpp7
11 files changed, 32 insertions, 80 deletions
diff --git a/include/media/stagefright/AudioSource.h b/include/media/stagefright/AudioSource.h
index de7edf3..99f3c3b 100644
--- a/include/media/stagefright/AudioSource.h
+++ b/include/media/stagefright/AudioSource.h
@@ -53,12 +53,6 @@ struct AudioSource : public MediaSource, public MediaBufferObserver {
status_t dataCallback(const AudioRecord::Buffer& buffer);
virtual void signalBufferReturned(MediaBuffer *buffer);
- // If useLooperTime == true, buffers will carry absolute timestamps
- // as returned by ALooper::GetNowUs(), otherwise systemTime() is used
- // and buffers contain timestamps relative to start time.
- // The default is to _not_ use looper time.
- void setUseLooperTime(bool useLooperTime);
-
protected:
virtual ~AudioSource();
@@ -94,8 +88,6 @@ private:
List<MediaBuffer * > mBuffersReceived;
- bool mUseLooperTime;
-
void trackMaxAmplitude(int16_t *data, int nSamples);
// This is used to raise the volume from mute to the
diff --git a/include/media/stagefright/TimeSource.h b/include/media/stagefright/TimeSource.h
index 443673d..8f11e14 100644
--- a/include/media/stagefright/TimeSource.h
+++ b/include/media/stagefright/TimeSource.h
@@ -41,8 +41,6 @@ public:
virtual int64_t getRealTimeUs();
private:
- static int64_t GetSystemTimeUs();
-
int64_t mStartTimeUs;
};
diff --git a/media/libstagefright/AudioSource.cpp b/media/libstagefright/AudioSource.cpp
index 3248dbc..861aebe 100644
--- a/media/libstagefright/AudioSource.cpp
+++ b/media/libstagefright/AudioSource.cpp
@@ -54,9 +54,7 @@ AudioSource::AudioSource(
mSampleRate(sampleRate),
mPrevSampleTimeUs(0),
mNumFramesReceived(0),
- mNumClientOwnedBuffers(0),
- mUseLooperTime(false) {
-
+ mNumClientOwnedBuffers(0) {
ALOGV("sampleRate: %d, channelCount: %d", sampleRate, channelCount);
CHECK(channelCount == 1 || channelCount == 2);
@@ -102,12 +100,6 @@ status_t AudioSource::initCheck() const {
return mInitCheck;
}
-void AudioSource::setUseLooperTime(bool useLooperTime) {
- CHECK(!mStarted);
-
- mUseLooperTime = useLooperTime;
-}
-
status_t AudioSource::start(MetaData *params) {
Mutex::Autolock autoLock(mLock);
if (mStarted) {
@@ -280,8 +272,7 @@ void AudioSource::signalBufferReturned(MediaBuffer *buffer) {
}
status_t AudioSource::dataCallback(const AudioRecord::Buffer& audioBuffer) {
- int64_t timeUs =
- mUseLooperTime ? ALooper::GetNowUs() : (systemTime() / 1000ll);
+ int64_t timeUs = systemTime() / 1000ll;
ALOGV("dataCallbackTimestamp: %lld us", timeUs);
Mutex::Autolock autoLock(mLock);
@@ -300,9 +291,7 @@ status_t AudioSource::dataCallback(const AudioRecord::Buffer& audioBuffer) {
if (mNumFramesReceived == 0 && mPrevSampleTimeUs == 0) {
mInitialReadTimeUs = timeUs;
// Initial delay
- if (mUseLooperTime) {
- mStartTimeUs = timeUs;
- } else if (mStartTimeUs > 0) {
+ if (mStartTimeUs > 0) {
mStartTimeUs = timeUs - mStartTimeUs;
} else {
// Assume latency is constant.
diff --git a/media/libstagefright/ThrottledSource.cpp b/media/libstagefright/ThrottledSource.cpp
index b1fcafd..348a9d3 100644
--- a/media/libstagefright/ThrottledSource.cpp
+++ b/media/libstagefright/ThrottledSource.cpp
@@ -17,16 +17,10 @@
#include "include/ThrottledSource.h"
#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/ALooper.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)
@@ -52,7 +46,7 @@ ssize_t ThrottledSource::readAt(off64_t offset, void *data, size_t size) {
mTotalTransferred += n;
- int64_t nowUs = getNowUs();
+ int64_t nowUs = ALooper::GetNowUs();
if (mStartTimeUs < 0) {
mStartTimeUs = nowUs;
diff --git a/media/libstagefright/TimeSource.cpp b/media/libstagefright/TimeSource.cpp
index d987fbf..041980f 100644
--- a/media/libstagefright/TimeSource.cpp
+++ b/media/libstagefright/TimeSource.cpp
@@ -17,24 +17,17 @@
#include <stddef.h>
#include <sys/time.h>
+#include <media/stagefright/foundation/ALooper.h>
#include <media/stagefright/TimeSource.h>
namespace android {
SystemTimeSource::SystemTimeSource()
- : mStartTimeUs(GetSystemTimeUs()) {
+ : mStartTimeUs(ALooper::GetNowUs()) {
}
int64_t SystemTimeSource::getRealTimeUs() {
- return GetSystemTimeUs() - mStartTimeUs;
-}
-
-// static
-int64_t SystemTimeSource::GetSystemTimeUs() {
- struct timeval tv;
- gettimeofday(&tv, NULL);
-
- return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
+ return ALooper::GetNowUs() - mStartTimeUs;
}
} // namespace android
diff --git a/media/libstagefright/TimedEventQueue.cpp b/media/libstagefright/TimedEventQueue.cpp
index 9df15eb..7e9c4bf 100644
--- a/media/libstagefright/TimedEventQueue.cpp
+++ b/media/libstagefright/TimedEventQueue.cpp
@@ -30,6 +30,7 @@
#include <sys/time.h>
#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/ALooper.h>
namespace android {
@@ -94,7 +95,7 @@ TimedEventQueue::event_id TimedEventQueue::postEventToBack(
TimedEventQueue::event_id TimedEventQueue::postEventWithDelay(
const sp<Event> &event, int64_t delay_us) {
CHECK(delay_us >= 0);
- return postTimedEvent(event, getRealTimeUs() + delay_us);
+ return postTimedEvent(event, ALooper::GetNowUs() + delay_us);
}
TimedEventQueue::event_id TimedEventQueue::postTimedEvent(
@@ -179,14 +180,6 @@ void TimedEventQueue::cancelEvents(
}
// static
-int64_t TimedEventQueue::getRealTimeUs() {
- struct timeval tv;
- gettimeofday(&tv, NULL);
-
- return (int64_t)tv.tv_sec * 1000000ll + tv.tv_usec;
-}
-
-// static
void *TimedEventQueue::ThreadWrapper(void *me) {
androidSetThreadPriority(0, ANDROID_PRIORITY_FOREGROUND);
@@ -225,7 +218,7 @@ void TimedEventQueue::threadEntry() {
List<QueueItem>::iterator it = mQueue.begin();
eventID = (*it).event->eventID();
- now_us = getRealTimeUs();
+ now_us = ALooper::GetNowUs();
int64_t when_us = (*it).realtime_us;
int64_t delay_us;
@@ -258,7 +251,7 @@ void TimedEventQueue::threadEntry() {
if (!timeoutCapped && err == -ETIMEDOUT) {
// We finally hit the time this event is supposed to
// trigger.
- now_us = getRealTimeUs();
+ now_us = ALooper::GetNowUs();
break;
}
}
diff --git a/media/libstagefright/foundation/ALooper.cpp b/media/libstagefright/foundation/ALooper.cpp
index a5b316d..22777a2 100644
--- a/media/libstagefright/foundation/ALooper.cpp
+++ b/media/libstagefright/foundation/ALooper.cpp
@@ -63,10 +63,7 @@ private:
// static
int64_t ALooper::GetNowUs() {
- struct timeval tv;
- gettimeofday(&tv, NULL);
-
- return (int64_t)tv.tv_sec * 1000000ll + tv.tv_usec;
+ return systemTime(SYSTEM_TIME_MONOTONIC) / 1000ll;
}
ALooper::ALooper()
diff --git a/media/libstagefright/omx/tests/OMXHarness.cpp b/media/libstagefright/omx/tests/OMXHarness.cpp
index 4b369ed..6cca8da 100644
--- a/media/libstagefright/omx/tests/OMXHarness.cpp
+++ b/media/libstagefright/omx/tests/OMXHarness.cpp
@@ -27,6 +27,7 @@
#include <binder/MemoryDealer.h>
#include <media/IMediaPlayerService.h>
#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/ALooper.h>
#include <media/stagefright/DataSource.h>
#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaDefs.h>
@@ -40,13 +41,6 @@
namespace android {
-static int64_t getNowUs() {
- struct timeval tv;
- gettimeofday(&tv, NULL);
-
- return (int64_t)tv.tv_usec + tv.tv_sec * 1000000;
-}
-
Harness::Harness()
: mInitCheck(NO_INIT) {
mInitCheck = initOMX();
@@ -126,7 +120,7 @@ status_t Harness::dequeueMessageForNodeIgnoringBuffers(
Vector<Buffer> *inputBuffers,
Vector<Buffer> *outputBuffers,
omx_message *msg, int64_t timeoutUs) {
- int64_t finishBy = getNowUs() + timeoutUs;
+ int64_t finishBy = ALooper::GetNowUs() + timeoutUs;
for (;;) {
Mutex::Autolock autoLock(mLock);
@@ -150,7 +144,7 @@ status_t Harness::dequeueMessageForNodeIgnoringBuffers(
status_t err = (timeoutUs < 0)
? mMessageAddedCondition.wait(mLock)
: mMessageAddedCondition.waitRelative(
- mLock, (finishBy - getNowUs()) * 1000);
+ mLock, (finishBy - ALooper::GetNowUs()) * 1000);
if (err == TIMED_OUT) {
return err;
diff --git a/media/libstagefright/rtsp/ARTPAssembler.cpp b/media/libstagefright/rtsp/ARTPAssembler.cpp
index 1844bc5..c7a65c2 100644
--- a/media/libstagefright/rtsp/ARTPAssembler.cpp
+++ b/media/libstagefright/rtsp/ARTPAssembler.cpp
@@ -18,19 +18,13 @@
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/ALooper.h>
#include <media/stagefright/foundation/AMessage.h>
#include <stdint.h>
namespace android {
-static int64_t getNowUs() {
- struct timeval tv;
- gettimeofday(&tv, NULL);
-
- return (int64_t)tv.tv_usec + tv.tv_sec * 1000000ll;
-}
-
ARTPAssembler::ARTPAssembler()
: mFirstFailureTimeUs(-1) {
}
@@ -42,7 +36,7 @@ void ARTPAssembler::onPacketReceived(const sp<ARTPSource> &source) {
if (status == WRONG_SEQUENCE_NUMBER) {
if (mFirstFailureTimeUs >= 0) {
- if (getNowUs() - mFirstFailureTimeUs > 10000ll) {
+ if (ALooper::GetNowUs() - mFirstFailureTimeUs > 10000ll) {
mFirstFailureTimeUs = -1;
// LOG(VERBOSE) << "waited too long for packet.";
@@ -50,7 +44,7 @@ void ARTPAssembler::onPacketReceived(const sp<ARTPSource> &source) {
continue;
}
} else {
- mFirstFailureTimeUs = getNowUs();
+ mFirstFailureTimeUs = ALooper::GetNowUs();
}
break;
} else {
diff --git a/media/libstagefright/wifi-display/source/MediaPuller.cpp b/media/libstagefright/wifi-display/source/MediaPuller.cpp
index 82ae001..ab69c4a 100644
--- a/media/libstagefright/wifi-display/source/MediaPuller.cpp
+++ b/media/libstagefright/wifi-display/source/MediaPuller.cpp
@@ -75,7 +75,16 @@ void MediaPuller::onMessageReceived(const sp<AMessage> &msg) {
switch (msg->what()) {
case kWhatStart:
{
- status_t err = mSource->start();
+ status_t err;
+ if (mIsAudio) {
+ // This atrocity causes AudioSource to deliver absolute
+ // systemTime() based timestamps (off by 1 us).
+ sp<MetaData> params = new MetaData;
+ params->setInt64(kKeyTime, 1ll);
+ err = mSource->start(params.get());
+ } else {
+ err = mSource->start();
+ }
if (err == OK) {
schedulePull();
diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
index 9c065b2..7fce133 100644
--- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp
+++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
@@ -883,8 +883,9 @@ status_t WifiDisplaySource::PlaybackSession::addSource(
status_t WifiDisplaySource::PlaybackSession::addVideoSource() {
sp<SurfaceMediaSource> source = new SurfaceMediaSource(width(), height());
- sp<MediaSource> videoSource =
- new RepeaterSource(source, 24.0 /* rateHz */);
+ source->setUseAbsoluteTimestamps();
+
+ sp<MediaSource> videoSource = new RepeaterSource(source, 24.0f);
size_t numInputBuffers;
status_t err = addSource(true /* isVideo */, videoSource, &numInputBuffers);
@@ -908,8 +909,6 @@ status_t WifiDisplaySource::PlaybackSession::addAudioSource() {
2 /* channelCount */);
if (audioSource->initCheck() == OK) {
- audioSource->setUseLooperTime(true);
-
return addSource(
false /* isVideo */, audioSource, NULL /* numInputBuffers */);
}