From af5dd7753e62353411cf0daf3b513c38818e9662 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Mon, 1 Oct 2012 16:03:44 -0700 Subject: ALooper::GetNowUs() now relies on systemTime instead of gettimeofday. Change-Id: Ia31eb0940b02581327a8bf51af6df135f9ab6de3 related-to-bug: 7266324 --- media/libstagefright/AudioSource.cpp | 17 +++-------------- media/libstagefright/ThrottledSource.cpp | 10 ++-------- media/libstagefright/TimeSource.cpp | 13 +++---------- media/libstagefright/TimedEventQueue.cpp | 15 ++++----------- media/libstagefright/foundation/ALooper.cpp | 5 +---- media/libstagefright/omx/tests/OMXHarness.cpp | 12 +++--------- media/libstagefright/rtsp/ARTPAssembler.cpp | 12 +++--------- .../libstagefright/wifi-display/source/MediaPuller.cpp | 11 ++++++++++- .../wifi-display/source/PlaybackSession.cpp | 7 +++---- 9 files changed, 32 insertions(+), 70 deletions(-) (limited to 'media') 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 +#include 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 &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 #include +#include #include 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 #include +#include namespace android { @@ -94,7 +95,7 @@ TimedEventQueue::event_id TimedEventQueue::postEventToBack( TimedEventQueue::event_id TimedEventQueue::postEventWithDelay( const sp &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::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 #include #include +#include #include #include #include @@ -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 *inputBuffers, Vector *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 #include +#include #include #include 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 &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 &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 &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 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 source = new SurfaceMediaSource(width(), height()); - sp videoSource = - new RepeaterSource(source, 24.0 /* rateHz */); + source->setUseAbsoluteTimestamps(); + + sp 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 */); } -- cgit v1.1