AwesomePlayer now renders either remote (IOMXRenderer) or locally depending on what kind of decoder was instantiated. Split off color conversion code into its own shared library.
diff --git a/media/libmediaplayerservice/Android.mk b/media/libmediaplayerservice/Android.mk
index b8defde..5e59710 100644
--- a/media/libmediaplayerservice/Android.mk
+++ b/media/libmediaplayerservice/Android.mk
@@ -40,7 +40,8 @@
 	libmedia              \
 	libandroid_runtime    \
 	libstagefright        \
-	libstagefright_omx
+	libstagefright_omx    \
+	libstagefright_color_conversion
 
 ifneq ($(BUILD_WITHOUT_PV),true)
 LOCAL_SHARED_LIBRARIES += \
diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk
index d145542..fb75aef 100644
--- a/media/libstagefright/Android.mk
+++ b/media/libstagefright/Android.mk
@@ -63,7 +63,8 @@
 
 LOCAL_SHARED_LIBRARIES += \
         libstagefright_amrnb_common \
-        libstagefright_avc_common
+        libstagefright_avc_common \
+        libstagefright_color_conversion
 
 endif
 
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 570e431..2eec8de 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -19,6 +19,7 @@
 #include <utils/Log.h>
 
 #include "include/AwesomePlayer.h"
+#include "include/SoftwareRenderer.h"
 
 #include <binder/IPCThreadState.h>
 #include <media/stagefright/AudioPlayer.h>
@@ -30,7 +31,6 @@
 #include <media/stagefright/MediaSource.h>
 #include <media/stagefright/MetaData.h>
 #include <media/stagefright/OMXCodec.h>
-
 namespace android {
 
 struct AwesomeEvent : public TimedEventQueue::Event {
@@ -54,6 +54,55 @@
     AwesomeEvent &operator=(const AwesomeEvent &);
 };
 
+struct AwesomeRemoteRenderer : public AwesomeRenderer {
+    AwesomeRemoteRenderer(const sp<IOMXRenderer> &target)
+        : mTarget(target) {
+    }
+
+    virtual void render(MediaBuffer *buffer) {
+        void *id;
+        if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) {
+            mTarget->render((IOMX::buffer_id)id);
+        }
+    }
+
+private:
+    sp<IOMXRenderer> mTarget;
+
+    AwesomeRemoteRenderer(const AwesomeRemoteRenderer &);
+    AwesomeRemoteRenderer &operator=(const AwesomeRemoteRenderer &);
+};
+
+struct AwesomeLocalRenderer : public AwesomeRenderer {
+    AwesomeLocalRenderer(
+            OMX_COLOR_FORMATTYPE colorFormat,
+            const sp<ISurface> &surface,
+            size_t displayWidth, size_t displayHeight,
+            size_t decodedWidth, size_t decodedHeight)
+        : mTarget(new SoftwareRenderer(
+                    colorFormat, surface, displayWidth, displayHeight,
+                    decodedWidth, decodedHeight)) {
+    }
+
+    virtual void render(MediaBuffer *buffer) {
+        mTarget->render(
+                (const uint8_t *)buffer->data() + buffer->range_offset(),
+                buffer->range_length(), NULL);
+    }
+
+protected:
+    virtual ~AwesomeLocalRenderer() {
+        delete mTarget;
+        mTarget = NULL;
+    }
+
+private:
+    SoftwareRenderer *mTarget;
+
+    AwesomeLocalRenderer(const AwesomeLocalRenderer &);
+    AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
+};
+
 AwesomePlayer::AwesomePlayer()
     : mTimeSource(NULL),
       mAudioPlayer(NULL),
@@ -326,12 +375,25 @@
         // before creating a new one.
         IPCThreadState::self()->flushCommands();
 
-        mVideoRenderer =
-            mClient.interface()->createRenderer(
-                    mISurface, component,
-                    (OMX_COLOR_FORMATTYPE)format,
-                    decodedWidth, decodedHeight,
-                    mVideoWidth, mVideoHeight);
+        if (!strncmp("OMX.", component, 4)) {
+            // Our OMX codecs allocate buffers on the media_server side
+            // therefore they require a remote IOMXRenderer that knows how
+            // to display them.
+            mVideoRenderer = new AwesomeRemoteRenderer(
+                mClient.interface()->createRenderer(
+                        mISurface, component,
+                        (OMX_COLOR_FORMATTYPE)format,
+                        decodedWidth, decodedHeight,
+                        mVideoWidth, mVideoHeight));
+        } else {
+            // Other decoders are instantiated locally and as a consequence
+            // allocate their buffers in local address space.
+            mVideoRenderer = new AwesomeLocalRenderer(
+                (OMX_COLOR_FORMATTYPE)format,
+                mISurface,
+                mVideoWidth, mVideoHeight,
+                decodedWidth, decodedHeight);
+        }
     }
 }
 
@@ -612,10 +674,7 @@
         return;
     }
 
-    void *id;
-    if (mVideoBuffer->meta_data()->findPointer(kKeyBufferID, &id)) {
-        mVideoRenderer->render((IOMX::buffer_id)id);
-    }
+    mVideoRenderer->render(mVideoBuffer);
 
     if (mLastVideoBuffer) {
         mLastVideoBuffer->release();
diff --git a/media/libstagefright/colorconversion/Android.mk b/media/libstagefright/colorconversion/Android.mk
new file mode 100644
index 0000000..c08ce3a
--- /dev/null
+++ b/media/libstagefright/colorconversion/Android.mk
@@ -0,0 +1,22 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:=                     \
+        ColorConverter.cpp            \
+        SoftwareRenderer.cpp
+
+LOCAL_C_INCLUDES := \
+        $(TOP)/external/opencore/extern_libs_v2/khronos/openmax/include
+
+LOCAL_SHARED_LIBRARIES :=       \
+        libbinder               \
+        libmedia                \
+        libutils                \
+        libui                   \
+        libcutils
+
+LOCAL_PRELINK_MODULE:= false
+
+LOCAL_MODULE:= libstagefright_color_conversion
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/media/libstagefright/omx/ColorConverter.cpp b/media/libstagefright/colorconversion/ColorConverter.cpp
similarity index 100%
rename from media/libstagefright/omx/ColorConverter.cpp
rename to media/libstagefright/colorconversion/ColorConverter.cpp
diff --git a/media/libstagefright/omx/SoftwareRenderer.cpp b/media/libstagefright/colorconversion/SoftwareRenderer.cpp
similarity index 100%
rename from media/libstagefright/omx/SoftwareRenderer.cpp
rename to media/libstagefright/colorconversion/SoftwareRenderer.cpp
diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h
index 2727c3c..37b14eb 100644
--- a/media/libstagefright/include/AwesomePlayer.h
+++ b/media/libstagefright/include/AwesomePlayer.h
@@ -32,6 +32,16 @@
 struct AudioPlayer;
 struct TimeSource;
 
+struct AwesomeRenderer : public RefBase {
+    AwesomeRenderer() {}
+
+    virtual void render(MediaBuffer *buffer) = 0;
+
+private:
+    AwesomeRenderer(const AwesomeRenderer &);
+    AwesomeRenderer &operator=(const AwesomeRenderer &);
+};
+
 struct AwesomePlayer {
     AwesomePlayer();
     ~AwesomePlayer();
@@ -80,7 +90,7 @@
     TimeSource *mTimeSource;
 
     sp<MediaSource> mVideoSource;
-    sp<IOMXRenderer> mVideoRenderer;
+    sp<AwesomeRenderer> mVideoRenderer;
 
     sp<MediaSource> mAudioSource;
     AudioPlayer *mAudioPlayer;
diff --git a/media/libstagefright/omx/Android.mk b/media/libstagefright/omx/Android.mk
index 7dfab11..965852b 100644
--- a/media/libstagefright/omx/Android.mk
+++ b/media/libstagefright/omx/Android.mk
@@ -9,13 +9,11 @@
 LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
 
 LOCAL_SRC_FILES:=                     \
-        ColorConverter.cpp            \
 	OMX.cpp                       \
         OMXComponentBase.cpp          \
         OMXNodeInstance.cpp           \
         OMXMaster.cpp                 \
         OMXSoftwareCodecsPlugin.cpp   \
-        SoftwareRenderer.cpp
 
 ifneq ($(BUILD_WITHOUT_PV),true)
 LOCAL_SRC_FILES += \
@@ -29,7 +27,8 @@
         libmedia                \
         libutils                \
         libui                   \
-        libcutils
+        libcutils               \
+        libstagefright_color_conversion
 
 ifneq ($(BUILD_WITHOUT_PV),true)
 LOCAL_SHARED_LIBRARIES += \