Merge changes I7bef5694,Id38e2a52 into jb-mr1-dev

* changes:
  Camera2: Move preview callback processing to its own thread.
  Camera2: Move still capture processing to separate thread.
diff --git a/include/media/stagefright/AudioSource.h b/include/media/stagefright/AudioSource.h
index f5466e8..de7edf3 100644
--- a/include/media/stagefright/AudioSource.h
+++ b/include/media/stagefright/AudioSource.h
@@ -31,11 +31,12 @@
 class AudioRecord;
 
 struct AudioSource : public MediaSource, public MediaBufferObserver {
-    // Note that the "channels" parameter is _not_ the number of channels,
-    // but a bitmask of audio_channels_t constants.
+    // Note that the "channels" parameter _is_ the number of channels,
+    // _not_ a bitmask of audio_channels_t constants.
     AudioSource(
-            audio_source_t inputSource, uint32_t sampleRate,
-            uint32_t channels = AUDIO_CHANNEL_IN_MONO);
+            audio_source_t inputSource,
+            uint32_t sampleRate,
+            uint32_t channels = 1);
 
     status_t initCheck() const;
 
@@ -49,9 +50,15 @@
     virtual status_t read(
             MediaBuffer **buffer, const ReadOptions *options = NULL);
 
-    status_t dataCallbackTimestamp(const AudioRecord::Buffer& buffer, int64_t timeUs);
+    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();
 
@@ -87,6 +94,8 @@
 
     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/media/libstagefright/AudioSource.cpp b/media/libstagefright/AudioSource.cpp
index ed142a4..3248dbc 100644
--- a/media/libstagefright/AudioSource.cpp
+++ b/media/libstagefright/AudioSource.cpp
@@ -24,6 +24,7 @@
 #include <media/stagefright/MediaDefs.h>
 #include <media/stagefright/MetaData.h>
 #include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/ALooper.h>
 #include <cutils/properties.h>
 #include <stdlib.h>
 
@@ -33,7 +34,7 @@
     AudioSource *source = (AudioSource *) user;
     switch (event) {
         case AudioRecord::EVENT_MORE_DATA: {
-            source->dataCallbackTimestamp(*((AudioRecord::Buffer *) info), systemTime() / 1000);
+            source->dataCallback(*((AudioRecord::Buffer *) info));
             break;
         }
         case AudioRecord::EVENT_OVERRUN: {
@@ -53,7 +54,8 @@
       mSampleRate(sampleRate),
       mPrevSampleTimeUs(0),
       mNumFramesReceived(0),
-      mNumClientOwnedBuffers(0) {
+      mNumClientOwnedBuffers(0),
+      mUseLooperTime(false) {
 
     ALOGV("sampleRate: %d, channelCount: %d", sampleRate, channelCount);
     CHECK(channelCount == 1 || channelCount == 2);
@@ -100,6 +102,12 @@
     return mInitCheck;
 }
 
+void AudioSource::setUseLooperTime(bool useLooperTime) {
+    CHECK(!mStarted);
+
+    mUseLooperTime = useLooperTime;
+}
+
 status_t AudioSource::start(MetaData *params) {
     Mutex::Autolock autoLock(mLock);
     if (mStarted) {
@@ -271,8 +279,10 @@
     return;
 }
 
-status_t AudioSource::dataCallbackTimestamp(
-        const AudioRecord::Buffer& audioBuffer, int64_t timeUs) {
+status_t AudioSource::dataCallback(const AudioRecord::Buffer& audioBuffer) {
+    int64_t timeUs =
+        mUseLooperTime ? ALooper::GetNowUs() : (systemTime() / 1000ll);
+
     ALOGV("dataCallbackTimestamp: %lld us", timeUs);
     Mutex::Autolock autoLock(mLock);
     if (!mStarted) {
@@ -290,12 +300,15 @@
     if (mNumFramesReceived == 0 && mPrevSampleTimeUs == 0) {
         mInitialReadTimeUs = timeUs;
         // Initial delay
-        if (mStartTimeUs > 0) {
+        if (mUseLooperTime) {
+            mStartTimeUs = timeUs;
+        } else if (mStartTimeUs > 0) {
             mStartTimeUs = timeUs - mStartTimeUs;
         } else {
             // Assume latency is constant.
             mStartTimeUs += mRecord->latency() * 1000;
         }
+
         mPrevSampleTimeUs = mStartTimeUs;
     }
 
diff --git a/media/libstagefright/wifi-display/source/Converter.cpp b/media/libstagefright/wifi-display/source/Converter.cpp
index 655fbae..ee05e45 100644
--- a/media/libstagefright/wifi-display/source/Converter.cpp
+++ b/media/libstagefright/wifi-display/source/Converter.cpp
@@ -86,8 +86,8 @@
     if (isAudio) {
         mOutputFormat->setInt32("bitrate", 64000);      // 64 kBit/sec
     } else {
-        mOutputFormat->setInt32("bitrate", 3000000);    // 3Mbit/sec
-        mOutputFormat->setInt32("frame-rate", 30);
+        mOutputFormat->setInt32("bitrate", 5000000);    // 5Mbit/sec
+        mOutputFormat->setInt32("frame-rate", 60);
         mOutputFormat->setInt32("i-frame-interval", 3);  // Iframes every 3 secs
     }
 
diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
index 96c9222..c99a11e 100644
--- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp
+++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
@@ -32,6 +32,7 @@
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/AMessage.h>
 #include <media/stagefright/foundation/hexdump.h>
+#include <media/stagefright/AudioSource.h>
 #include <media/stagefright/DataSource.h>
 #include <media/stagefright/MediaDefs.h>
 #include <media/stagefright/MediaErrors.h>
@@ -132,8 +133,16 @@
       mNumSRsSent(0),
       mSendSRPending(false),
       mFirstPacketTimeUs(-1ll),
-      mHistoryLength(0) {
+      mHistoryLength(0)
+#if LOG_TRANSPORT_STREAM
+      ,mLogFile(NULL)
+#endif
+{
     mTSQueue->setRange(0, 12);
+
+#if LOG_TRANSPORT_STREAM
+    mLogFile = fopen("/system/etc/log.ts", "wb");
+#endif
 }
 
 status_t WifiDisplaySource::PlaybackSession::init(
@@ -215,6 +224,13 @@
 }
 
 WifiDisplaySource::PlaybackSession::~PlaybackSession() {
+#if LOG_TRANSPORT_STREAM
+    if (mLogFile != NULL) {
+        fclose(mLogFile);
+        mLogFile = NULL;
+    }
+#endif
+
     mTracks.clear();
 
     if (mCodecLooper != NULL) {
@@ -470,6 +486,12 @@
                                 true /* timeDiscontinuity */,
                                 lastTSPacket /* flush */);
                     }
+
+#if LOG_TRANSPORT_STREAM
+                    if (mLogFile != NULL) {
+                        fwrite(packets->data(), 1, packets->size(), mLogFile);
+                    }
+#endif
                 }
             } else if (what == Converter::kWhatEOS) {
                 CHECK_EQ(what, Converter::kWhatEOS);
@@ -603,7 +625,7 @@
     ssize_t index = mSerializer->addSource(source);
 #else
     ssize_t index = mSerializer->addSource(
-            new RepeaterSource(source, 30.0 /* rateHz */));
+            new RepeaterSource(source, 55.0 /* rateHz */));
 #endif
 
     CHECK_GE(index, 0);
@@ -628,6 +650,32 @@
     mTracks.add(index, new Track(converter));
 #endif
 
+#if 0
+    sp<AudioSource> audioSource = new AudioSource(
+            AUDIO_SOURCE_MIC,
+            48000 /* sampleRate */,
+            2 /* channelCount */);  // XXX AUDIO_CHANNEL_IN_STEREO?
+
+    CHECK_EQ((status_t)OK, audioSource->initCheck());
+
+    audioSource->setUseLooperTime(true);
+
+    index = mSerializer->addSource(audioSource);
+    CHECK_GE(index, 0);
+
+    sp<AMessage> audioFormat;
+    err = convertMetaDataToMessage(audioSource->getFormat(), &audioFormat);
+    CHECK_EQ(err, (status_t)OK);
+
+    sp<AMessage> audioNotify = new AMessage(kWhatConverterNotify, id());
+    audioNotify->setSize("trackIndex", index);
+
+    converter = new Converter(audioNotify, mCodecLooper, audioFormat);
+    looper()->registerHandler(converter);
+
+    mTracks.add(index, new Track(converter));
+#endif
+
     return OK;
 }
 
diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.h b/media/libstagefright/wifi-display/source/PlaybackSession.h
index d256fc4..a6c9f27 100644
--- a/media/libstagefright/wifi-display/source/PlaybackSession.h
+++ b/media/libstagefright/wifi-display/source/PlaybackSession.h
@@ -26,6 +26,8 @@
 struct Serializer;
 struct TSPacketizer;
 
+#define LOG_TRANSPORT_STREAM    0
+
 // Encapsulates the state of an RTP/RTCP session in the context of wifi
 // display.
 struct WifiDisplaySource::PlaybackSession : public AHandler {
@@ -111,6 +113,10 @@
     List<sp<ABuffer> > mHistory;
     size_t mHistoryLength;
 
+#if LOG_TRANSPORT_STREAM
+    FILE *mLogFile;
+#endif
+
     void onSendSR();
     void addSR(const sp<ABuffer> &buffer);
     void addSDES(const sp<ABuffer> &buffer);