Merge change 23539 into eclair

* changes:
  Squashed commit of the following:
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index 29cdf21..5b0e0b4 100644
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -136,7 +136,7 @@
     void clearCodecSpecificData();
 
     void setAMRFormat();
-    void setAACFormat();
+    void setAACFormat(int32_t numChannels, int32_t sampleRate);
 
     status_t setVideoPortFormatType(
             OMX_U32 portIndex,
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 3a065ae..7c8defc 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -302,7 +302,11 @@
         codec->setAMRFormat();
     }
     if (!createEncoder && !strcasecmp("audio/mp4a-latm", mime)) {
-        codec->setAACFormat();
+        int32_t numChannels, sampleRate;
+        CHECK(meta->findInt32(kKeyChannelCount, &numChannels));
+        CHECK(meta->findInt32(kKeySampleRate, &sampleRate));
+
+        codec->setAACFormat(numChannels, sampleRate);
     }
     if (!strncasecmp(mime, "video/", 6)) {
         int32_t width, height;
@@ -1321,10 +1325,6 @@
         return;
     }
 
-    // We're going to temporarily give up the lock while reading data
-    // from the source. A certain client unfortunately chose to have the
-    // thread supplying input data and reading output data be the same...
-
     MediaBuffer *srcBuffer;
     status_t err;
     if (mSeekTimeUs >= 0) {
@@ -1332,13 +1332,10 @@
         options.setSeekTo(mSeekTimeUs);
         mSeekTimeUs = -1;
 
-        mLock.unlock();
         err = mSource->read(&srcBuffer, &options);
     } else {
-        mLock.unlock();
         err = mSource->read(&srcBuffer);
     }
-    mLock.lock();
 
     OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME;
     OMX_TICKS timestamp = 0;
@@ -1496,20 +1493,22 @@
     }
 }
 
-void OMXCodec::setAACFormat() {
-    OMX_AUDIO_PARAM_AACPROFILETYPE def;
-    def.nSize = sizeof(def);
-    def.nVersion.s.nVersionMajor = 1;
-    def.nVersion.s.nVersionMinor = 1;
-    def.nPortIndex = kPortIndexInput;
+void OMXCodec::setAACFormat(int32_t numChannels, int32_t sampleRate) {
+    OMX_AUDIO_PARAM_AACPROFILETYPE profile;
+    profile.nSize = sizeof(profile);
+    profile.nVersion.s.nVersionMajor = 1;
+    profile.nVersion.s.nVersionMinor = 1;
+    profile.nPortIndex = kPortIndexInput;
 
     status_t err =
-        mOMX->get_parameter(mNode, OMX_IndexParamAudioAac, &def, sizeof(def));
+        mOMX->get_parameter(mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile));
     CHECK_EQ(err, OK);
 
-    def.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS;
+    profile.nChannels = numChannels;
+    profile.nSampleRate = sampleRate;
+    profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS;
 
-    err = mOMX->set_parameter(mNode, OMX_IndexParamAudioAac, &def, sizeof(def));
+    err = mOMX->set_parameter(mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile));
     CHECK_EQ(err, OK);
 }
 
@@ -2123,8 +2122,19 @@
             inputFormat->findInt32(kKeyChannelCount, &numChannels);
             inputFormat->findInt32(kKeySampleRate, &sampleRate);
 
+            if ((OMX_U32)numChannels != params.nChannels) {
+                LOGW("Codec outputs a different number of channels than "
+                     "the input stream contains.");
+            }
+
             mOutputFormat->setCString(kKeyMIMEType, "audio/raw");
-            mOutputFormat->setInt32(kKeyChannelCount, numChannels);
+
+            // Use the codec-advertised number of channels, as some
+            // codecs appear to output stereo even if the input data is
+            // mono.
+            mOutputFormat->setInt32(kKeyChannelCount, params.nChannels);
+
+            // The codec-reported sampleRate is not reliable...
             mOutputFormat->setInt32(kKeySampleRate, sampleRate);
             break;
         }