Merge "Initial check-in for xml-based encoder capabilities retrieval - Changed the Java API as suggested - Treat /etc/media_profiles.xml as the default xml configurtion file"
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index 82dd2b5..f8bc7ab 100644
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -95,6 +95,7 @@
         kRequiresAllocateBufferOnOutputPorts = 32,
         kRequiresFlushBeforeShutdown         = 64,
         kDefersOutputBufferAllocation        = 128,
+        kDecoderLiesAboutNumberOfChannels    = 256,
     };
 
     struct BufferInfo {
diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.cpp b/media/libmediaplayerservice/MetadataRetrieverClient.cpp
index 162bebb..550b84d 100644
--- a/media/libmediaplayerservice/MetadataRetrieverClient.cpp
+++ b/media/libmediaplayerservice/MetadataRetrieverClient.cpp
@@ -28,7 +28,8 @@
 #include <string.h>
 #include <cutils/atomic.h>
 #include <cutils/properties.h>
-#include <binder/MemoryDealer.h>
+#include <binder/MemoryBase.h>
+#include <binder/MemoryHeapBase.h>
 #include <android_runtime/ActivityManager.h>
 #include <binder/IPCThreadState.h>
 #include <binder/IServiceManager.h>
@@ -62,8 +63,6 @@
 {
     LOGV("MetadataRetrieverClient constructor pid(%d)", pid);
     mPid = pid;
-    mThumbnailDealer = NULL;
-    mAlbumArtDealer = NULL;
     mThumbnail = NULL;
     mAlbumArt = NULL;
     mRetriever = NULL;
@@ -94,8 +93,6 @@
     LOGV("disconnect from pid %d", mPid);
     Mutex::Autolock lock(mLock);
     mRetriever.clear();
-    mThumbnailDealer.clear();
-    mAlbumArtDealer.clear();
     mThumbnail.clear();
     mAlbumArt.clear();
     mMode = METADATA_MODE_FRAME_CAPTURE_AND_METADATA_RETRIEVAL;
@@ -242,7 +239,6 @@
     LOGV("captureFrame");
     Mutex::Autolock lock(mLock);
     mThumbnail.clear();
-    mThumbnailDealer.clear();
     if (mRetriever == NULL) {
         LOGE("retriever is not initialized");
         return NULL;
@@ -253,16 +249,15 @@
         return NULL;
     }
     size_t size = sizeof(VideoFrame) + frame->mSize;
-    mThumbnailDealer = new MemoryDealer(size, "MetadataRetrieverClient");
-    if (mThumbnailDealer == NULL) {
+    sp<MemoryHeapBase> heap = new MemoryHeapBase(size, 0, "MetadataRetrieverClient");
+    if (heap == NULL) {
         LOGE("failed to create MemoryDealer");
         delete frame;
         return NULL;
     }
-    mThumbnail = mThumbnailDealer->allocate(size);
+    mThumbnail = new MemoryBase(heap, 0, size);
     if (mThumbnail == NULL) {
         LOGE("not enough memory for VideoFrame size=%u", size);
-        mThumbnailDealer.clear();
         delete frame;
         return NULL;
     }
@@ -283,7 +278,6 @@
     LOGV("extractAlbumArt");
     Mutex::Autolock lock(mLock);
     mAlbumArt.clear();
-    mAlbumArtDealer.clear();
     if (mRetriever == NULL) {
         LOGE("retriever is not initialized");
         return NULL;
@@ -294,16 +288,15 @@
         return NULL;
     }
     size_t size = sizeof(MediaAlbumArt) + albumArt->mSize;
-    mAlbumArtDealer = new MemoryDealer(size, "MetadataRetrieverClient");
-    if (mAlbumArtDealer == NULL) {
+    sp<MemoryHeapBase> heap = new MemoryHeapBase(size, 0, "MetadataRetrieverClient");
+    if (heap == NULL) {
         LOGE("failed to create MemoryDealer object");
         delete albumArt;
         return NULL;
     }
-    mAlbumArt = mAlbumArtDealer->allocate(size);
+    mAlbumArt = new MemoryBase(heap, 0, size);
     if (mAlbumArt == NULL) {
         LOGE("not enough memory for MediaAlbumArt size=%u", size);
-        mAlbumArtDealer.clear();
         delete albumArt;
         return NULL;
     }
diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.h b/media/libmediaplayerservice/MetadataRetrieverClient.h
index 8cb8ad1..4aab94f 100644
--- a/media/libmediaplayerservice/MetadataRetrieverClient.h
+++ b/media/libmediaplayerservice/MetadataRetrieverClient.h
@@ -63,8 +63,6 @@
     int                                    mMode;
 
     // Keep the shared memory copy of album art and capture frame (for thumbnail)
-    sp<MemoryDealer>                       mAlbumArtDealer;
-    sp<MemoryDealer>                       mThumbnailDealer;
     sp<IMemory>                            mAlbumArt;
     sp<IMemory>                            mThumbnail;
 };
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index e17fbb8..90bbdfe 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -290,6 +290,7 @@
     }
     if (!strcmp(componentName, "OMX.TI.MP3.decode")) {
         quirks |= kNeedsFlushBeforeDisable;
+        quirks |= kDecoderLiesAboutNumberOfChannels;
     }
     if (!strcmp(componentName, "OMX.TI.AAC.decode")) {
         quirks |= kNeedsFlushBeforeDisable;
@@ -2817,7 +2818,9 @@
 
                 if ((OMX_U32)numChannels != params.nChannels) {
                     LOGW("Codec outputs a different number of channels than "
-                         "the input stream contains.");
+                         "the input stream contains (contains %d channels, "
+                         "codec outputs %ld channels).",
+                         numChannels, params.nChannels);
                 }
 
                 mOutputFormat->setCString(
@@ -2825,8 +2828,12 @@
 
                 // 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);
+                // mono. If we know the codec lies about this information,
+                // use the actual number of channels instead.
+                mOutputFormat->setInt32(
+                        kKeyChannelCount,
+                        (mQuirks & kDecoderLiesAboutNumberOfChannels)
+                            ? numChannels : params.nChannels);
 
                 // The codec-reported sampleRate is not reliable...
                 mOutputFormat->setInt32(kKeySampleRate, sampleRate);
diff --git a/media/libstagefright/colorconversion/SoftwareRenderer.cpp b/media/libstagefright/colorconversion/SoftwareRenderer.cpp
index ef6ede0..ed91eea 100644
--- a/media/libstagefright/colorconversion/SoftwareRenderer.cpp
+++ b/media/libstagefright/colorconversion/SoftwareRenderer.cpp
@@ -20,6 +20,7 @@
 #include "../include/SoftwareRenderer.h"
 
 #include <binder/MemoryHeapBase.h>
+#include <binder/MemoryHeapPmem.h>
 #include <media/stagefright/MediaDebug.h>
 #include <ui/ISurface.h>
 
@@ -38,8 +39,16 @@
       mDecodedWidth(decodedWidth),
       mDecodedHeight(decodedHeight),
       mFrameSize(mDecodedWidth * mDecodedHeight * 2),  // RGB565
-      mMemoryHeap(new MemoryHeapBase(2 * mFrameSize)),
       mIndex(0) {
+    // TODO: How do I allocate physical memory on Droid?
+    mMemoryHeap = new MemoryHeapBase("/dev/pmem_adsp", 2 * mFrameSize);
+    if (mMemoryHeap->heapID() < 0) {
+        LOGI("Creating physical memory heap failed, reverting to regular heap.");
+        mMemoryHeap = new MemoryHeapBase(2 * mFrameSize);
+    } else {
+        mMemoryHeap = new MemoryHeapPmem(mMemoryHeap);
+    }
+
     CHECK(mISurface.get() != NULL);
     CHECK(mDecodedWidth > 0);
     CHECK(mDecodedHeight > 0);