From 0cbbe0149f381d44f923fef0d7a611e20c46edb2 Mon Sep 17 00:00:00 2001
From: Paulo Sergio Travaglia <pstglia@gmail.com>
Date: Sat, 28 Mar 2015 15:55:17 -0300
Subject: [PATCH] NETFLIX HACK: Includes some OMX extensions and disable some
 CHECK macro functions

When using native windows/gralloc buffers, some apps (like Netflix)
requires the use of some extension indexes. If they are not implemented,
CHECK macros makes app crash. For netflix itself, this are required:

- OMX_IndexParamEnableAndroidNativeBuffers ("OMX.google.android.index.enableAndroidNativeBuffers")
  Gets/Sets a flag indicating native windows/gralloc buffers will be used

- OMX_IndexParamNativeBufferUsage ("OMX.google.android.index.getAndroidNativeBufferUsage")
  Gets/Sets usage flags passed to gralloc when allocating a buffer

- OMX_IndexParamStoreMetaDataInBuffers ("OMX.google.android.index.storeMetaDataInBuffers")
  Gets/Sets bStoreMetaData flag

- OMX_IndexParamUseAndroidNativeBuffer ("OMX.google.android.index.useAndroidNativeBuffer")
- OMX_IndexParamUseAndroidNativeBuffer2 ("OMX.google.android.index.useAndroidNativeBuffer")
  Allocates a buffer

Note: OMX_IndexParamUseAndroidNativeBuffer2 allocs buffers using OMXNodeInstance::useGraphicBuffer2_l
(see frameworks/av/media/libstagefright/omx/OMXNodeInstance.cpp)

Some CHECK macros were commented out to avoid crashing.
---
 .../codecs/ffmpegdec/adec/SoftFFmpegAudio.cpp      |  12 ++-
 .../codecs/ffmpegdec/vdec/SoftFFmpegVideo.cpp      | 109 ++++++++++++++++++++-
 .../codecs/ffmpegdec/vdec/SoftFFmpegVideo.h        |  11 +++
 3 files changed, 128 insertions(+), 4 deletions(-)

diff --git a/libstagefright/codecs/ffmpegdec/adec/SoftFFmpegAudio.cpp b/libstagefright/codecs/ffmpegdec/adec/SoftFFmpegAudio.cpp
index d518691..fe95837 100644
--- a/libstagefright/codecs/ffmpegdec/adec/SoftFFmpegAudio.cpp
+++ b/libstagefright/codecs/ffmpegdec/adec/SoftFFmpegAudio.cpp
@@ -377,10 +377,16 @@ OMX_ERRORTYPE SoftFFmpegAudio::internalGetParameter(
             profile->eChannelMapping[0] = OMX_AUDIO_ChannelLF;
             profile->eChannelMapping[1] = OMX_AUDIO_ChannelRF;
 
-            CHECK(isConfigured());
+            //CHECK(isConfigured());
 
-            profile->nChannels = mAudioSrcChannels;
-            profile->nSamplingRate = mAudioSrcFreq;
+	    if ( mAudioSrcChannels != -1 ) {
+            	profile->nChannels = mAudioSrcChannels;
+            	profile->nSamplingRate = mAudioSrcFreq;
+	    }
+	    else {
+		profile->nChannels = 2;
+		profile->nSamplingRate = 44100;
+	    }
 
             //mCtx has been updated(adjustAudioParams)!
             ALOGV("get pcm params, nChannels:%lu, nSamplingRate:%lu",
diff --git a/libstagefright/codecs/ffmpegdec/vdec/SoftFFmpegVideo.cpp b/libstagefright/codecs/ffmpegdec/vdec/SoftFFmpegVideo.cpp
index 92b904d..765442e 100644
--- a/libstagefright/codecs/ffmpegdec/vdec/SoftFFmpegVideo.cpp
+++ b/libstagefright/codecs/ffmpegdec/vdec/SoftFFmpegVideo.cpp
@@ -29,6 +29,12 @@
 
 static int decoder_reorder_pts = -1;
 
+#define OMX_IndexParamEnableAndroidNativeBuffers ((OMX_INDEXTYPE)(OMX_IndexMax - 1))
+#define OMX_IndexParamNativeBufferUsage          ((OMX_INDEXTYPE)(OMX_IndexMax - 2))
+#define OMX_IndexParamStoreMetaDataInBuffers     ((OMX_INDEXTYPE)(OMX_IndexMax - 3))
+#define OMX_IndexParamUseAndroidNativeBuffer     ((OMX_INDEXTYPE)(OMX_IndexMax - 4))
+#define OMX_IndexParamUseAndroidNativeBuffer2    ((OMX_INDEXTYPE)(OMX_IndexMax - 5))
+
 namespace android {
 
 template<class T>
@@ -223,7 +229,13 @@ void SoftFFmpegVideo::initPorts() {
     def.format.video.xFramerate = 0;
     def.format.video.bFlagErrorConcealment = OMX_FALSE;
     def.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
-    def.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
+
+    // Forcing HAL_PIXEL_FORMAT_YV12 (const value 0x32315659) in place of OMX_COLOR_FormatYUV420Planar
+    // Based on: https://android.googlesource.com/platform/frameworks/av/+/a361483%5E!/
+    // def.format.video.eColorFormat = (OMX_COLOR_FORMATTYPE) 0x32315659;
+    //def.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
+    def.format.video.eColorFormat =  OMX_COLOR_Format32bitBGRA8888;
+
     def.format.video.pNativeWindow = NULL;
 
     def.nBufferSize =
@@ -403,10 +415,63 @@ void SoftFFmpegVideo::getInputFormat(uint32_t mode,
     formatParams->xFramerate = 0;
 }
 
+
+
+OMX_ERRORTYPE SoftFFmpegVideo::getExtensionIndex(
+        const char *name, OMX_INDEXTYPE *index) {
+
+	OMX_STRING pName = (OMX_STRING)name;
+
+	if(!strcmp(pName, "OMX.google.android.index.enableAndroidNativeBuffers"))
+		*index = OMX_IndexParamEnableAndroidNativeBuffers;
+	else if(!strcmp(pName, "OMX.google.android.index.getAndroidNativeBufferUsage"))
+		*index = OMX_IndexParamNativeBufferUsage;
+	else if(!strcmp(pName, "OMX.google.android.index.storeMetaDataInBuffers"))
+		*index = OMX_IndexParamStoreMetaDataInBuffers;
+	else if(!strcmp(pName, "OMX.google.android.index.useAndroidNativeBuffer"))
+		*index = OMX_IndexParamUseAndroidNativeBuffer;
+	else if(!strcmp(pName, "OMX.google.android.index.useAndroidNativeBuffer2"))
+		*index = OMX_IndexParamUseAndroidNativeBuffer2;
+	else
+		return OMX_ErrorUndefined;
+
+	return OMX_ErrorNone;
+}
+
 OMX_ERRORTYPE SoftFFmpegVideo::internalGetParameter(
         OMX_INDEXTYPE index, OMX_PTR params) {
     //ALOGV("internalGetParameter index:0x%x", index);
     switch (index) {
+	case OMX_IndexParamEnableAndroidNativeBuffers:
+	{
+		EnableAndroidNativeBuffersParams *formatParams = (EnableAndroidNativeBuffersParams*)params;
+		if(formatParams->nPortIndex != 1)
+			return OMX_ErrorUnsupportedIndex;
+		formatParams->enable = bEnableNativeBuffers;
+
+		return OMX_ErrorNone;
+	}
+
+	case OMX_IndexParamNativeBufferUsage:
+	{
+		GetAndroidNativeBufferUsageParams *formatParams = (GetAndroidNativeBufferUsageParams*)params;
+		if(formatParams->nPortIndex != 1)
+			return OMX_ErrorUnsupportedIndex;
+		formatParams->nUsage = 0x933;
+
+		return OMX_ErrorNone;
+	}
+
+	case OMX_IndexParamStoreMetaDataInBuffers:
+	{
+		StoreMetaDataInBuffersParams *formatParams = (StoreMetaDataInBuffersParams*)params;
+		if(formatParams->nPortIndex != 1)
+			return OMX_ErrorUnsupportedIndex;
+		formatParams->bStoreMetaData = bStoreMetaData;
+
+		return OMX_ErrorNone;
+	}
+
         case OMX_IndexParamVideoPortFormat:
         {
             OMX_VIDEO_PARAM_PORTFORMATTYPE *formatParams =
@@ -569,6 +634,48 @@ OMX_ERRORTYPE SoftFFmpegVideo::internalSetParameter(
         OMX_INDEXTYPE index, const OMX_PTR params) {
     //ALOGV("internalSetParameter index:0x%x", index);
     switch (index) {
+	case OMX_IndexParamEnableAndroidNativeBuffers:
+	{
+		EnableAndroidNativeBuffersParams *formatParams = (EnableAndroidNativeBuffersParams*)params;
+		if(formatParams->nPortIndex != 1)
+			return OMX_ErrorUnsupportedIndex;
+		bEnableNativeBuffers = formatParams->enable;
+		ALOGI("PST DEBUG - Inside internalSetParameter - formatParams->nPortIndex = %d, bEnableNativeBuffers = %d", formatParams->nPortIndex, bEnableNativeBuffers );
+
+		return OMX_ErrorNone;
+	}
+
+	case OMX_IndexParamNativeBufferUsage:
+	{
+		GetAndroidNativeBufferUsageParams *formatParams = (GetAndroidNativeBufferUsageParams*)params;
+		if(formatParams->nPortIndex != 1)
+			return OMX_ErrorUnsupportedIndex;
+		nNativeBuffersUsage = formatParams->nUsage;
+		ALOGI("PST DEBUG - Inside internalSetParameter - formatParams->nPortIndex = %d, nNativeBuffersUsage = %d", formatParams->nPortIndex, nNativeBuffersUsage );
+
+		return OMX_ErrorNone;
+	}
+
+	case OMX_IndexParamStoreMetaDataInBuffers:
+	{
+		StoreMetaDataInBuffersParams *formatParams = (StoreMetaDataInBuffersParams*)params;
+		if(formatParams->nPortIndex != 1)
+			return OMX_ErrorUnsupportedIndex;
+		bStoreMetaData = formatParams->bStoreMetaData;
+
+		return OMX_ErrorNone;
+	}
+
+	case OMX_IndexParamUseAndroidNativeBuffer:
+	{
+		UseAndroidNativeBufferParams *formatParams = (UseAndroidNativeBufferParams*)params;
+		ALOGI("PST DEBUG - Inside internalSetParameter (OMX_IndexParamUseAndroidNativeBuffer) - formatParams->nPortIndex = %d", formatParams->nPortIndex );
+		if(formatParams->nPortIndex != 1)
+			return OMX_ErrorUnsupportedIndex;
+		return  OMX_ErrorNone;
+	}
+
+
         case OMX_IndexParamStandardComponentRole:
         {
             const OMX_PARAM_COMPONENTROLETYPE *roleParams =
diff --git a/libstagefright/codecs/ffmpegdec/vdec/SoftFFmpegVideo.h b/libstagefright/codecs/ffmpegdec/vdec/SoftFFmpegVideo.h
index 6c28769..6df2a84 100644
--- a/libstagefright/codecs/ffmpegdec/vdec/SoftFFmpegVideo.h
+++ b/libstagefright/codecs/ffmpegdec/vdec/SoftFFmpegVideo.h
@@ -22,6 +22,9 @@
 
 #include "utils/ffmpeg_utils.h"
 
+#include <media/hardware/OMXPluginBase.h>
+#include <media/hardware/HardwareAPI.h>
+
 namespace android {
 
 struct SoftFFmpegVideo : public SimpleSoftOMXComponent {
@@ -33,6 +36,9 @@ struct SoftFFmpegVideo : public SimpleSoftOMXComponent {
 protected:
     virtual ~SoftFFmpegVideo();
 
+    virtual OMX_ERRORTYPE getExtensionIndex(
+            const char *name, OMX_INDEXTYPE *index);
+
     virtual OMX_ERRORTYPE internalGetParameter(
             OMX_INDEXTYPE index, OMX_PTR params);
 
@@ -130,6 +136,11 @@ private:
     void     updatePortDefinitions();
 
     DISALLOW_EVIL_CONSTRUCTORS(SoftFFmpegVideo);
+
+    OMX_BOOL bEnableNativeBuffers;
+    OMX_U32 nNativeBuffersUsage;
+    OMX_BOOL bStoreMetaData;
+
 };
 
 }  // namespace android
-- 
1.7.12.1

