Merge "ALooper::GetNowUs() now relies on systemTime instead of gettimeofday." into jb-mr1-dev
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 @@
     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 @@
 
     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 @@
     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 @@
       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 @@
     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 @@
 }
 
 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 @@
     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 @@
 
     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::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 @@
 }
 
 // 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 @@
                 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 @@
                 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 @@
 
 // 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 @@
         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 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 @@
 
         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 @@
                     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 @@
     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::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 @@
             2 /* channelCount */);
 
     if (audioSource->initCheck() == OK) {
-        audioSource->setUseLooperTime(true);
-
         return addSource(
                 false /* isVideo */, audioSource, NULL /* numInputBuffers */);
     }