stagefright: untangle metadata-mode handling
- specify requested metadata mode from producers to OMX
- (pass requested metadata in IOMX::storeMetadataInBuffers)
- use correct logic for native handle source
- use native handle source for encoded meta buffers
Bug: 22775369
Change-Id: I58b03acd3e9a5367d5010d7f87b7af5cae23362c
diff --git a/cmds/stagefright/Android.mk b/cmds/stagefright/Android.mk
index e5fbba0..9e15a81 100644
--- a/cmds/stagefright/Android.mk
+++ b/cmds/stagefright/Android.mk
@@ -39,7 +39,8 @@
LOCAL_C_INCLUDES:= \
frameworks/av/media/libstagefright \
- $(TOP)/frameworks/native/include/media/openmax
+ $(TOP)/frameworks/native/include/media/openmax \
+ $(TOP)/frameworks/native/include/media/hardware
LOCAL_CFLAGS += -Wno-multichar -Werror -Wall
LOCAL_CLANG := true
@@ -63,7 +64,8 @@
LOCAL_C_INCLUDES:= \
frameworks/av/media/libstagefright \
- $(TOP)/frameworks/native/include/media/openmax
+ $(TOP)/frameworks/native/include/media/openmax \
+ $(TOP)/frameworks/native/include/media/hardware
LOCAL_CFLAGS += -Wno-multichar -Werror -Wall
LOCAL_CLANG := true
diff --git a/include/media/IOMX.h b/include/media/IOMX.h
index 8caf72d..673c56a 100644
--- a/include/media/IOMX.h
+++ b/include/media/IOMX.h
@@ -276,17 +276,18 @@
OMX_U32 mLevel;
};
-} // namespace android
-
-inline static const char *asString(android::MetadataBufferType i, const char *def = "??") {
+inline static const char *asString(MetadataBufferType i, const char *def = "??") {
using namespace android;
switch (i) {
case kMetadataBufferTypeCameraSource: return "CameraSource";
case kMetadataBufferTypeGrallocSource: return "GrallocSource";
case kMetadataBufferTypeANWBuffer: return "ANWBuffer";
+ case kMetadataBufferTypeNativeHandleSource: return "NativeHandleSource";
case kMetadataBufferTypeInvalid: return "Invalid";
default: return def;
}
}
+} // namespace android
+
#endif // ANDROID_IOMX_H_
diff --git a/include/media/stagefright/CameraSource.h b/include/media/stagefright/CameraSource.h
index 399f363..c2e75a6 100644
--- a/include/media/stagefright/CameraSource.h
+++ b/include/media/stagefright/CameraSource.h
@@ -28,6 +28,7 @@
#include <utils/List.h>
#include <utils/RefBase.h>
#include <utils/String16.h>
+#include <MetadataBufferType.h>
namespace android {
@@ -118,11 +119,11 @@
* Tell whether this camera source stores meta data or real YUV
* frame data in video buffers.
*
- * @return true if meta data is stored in the video
- * buffers; false if real YUV data is stored in
+ * @return a valid type if meta data is stored in the video
+ * buffers; kMetadataBufferTypeInvalid if real YUV data is stored in
* the video buffers.
*/
- bool isMetaDataStoredInVideoBuffers() const;
+ MetadataBufferType metaDataStoredInVideoBuffers() const;
virtual void signalBufferReturned(MediaBuffer* buffer);
diff --git a/include/media/stagefright/MediaCodecSource.h b/include/media/stagefright/MediaCodecSource.h
index 035e8ae..cc62786 100644
--- a/include/media/stagefright/MediaCodecSource.h
+++ b/include/media/stagefright/MediaCodecSource.h
@@ -37,7 +37,6 @@
public MediaBufferObserver {
enum FlagBits {
FLAG_USE_SURFACE_INPUT = 1,
- FLAG_USE_METADATA_INPUT = 2,
FLAG_PREFER_SOFTWARE_CODEC = 4, // used for testing only
};
diff --git a/include/media/stagefright/SurfaceMediaSource.h b/include/media/stagefright/SurfaceMediaSource.h
index 2177c00..ca3a3bf 100644
--- a/include/media/stagefright/SurfaceMediaSource.h
+++ b/include/media/stagefright/SurfaceMediaSource.h
@@ -25,6 +25,8 @@
#include <media/stagefright/MediaSource.h>
#include <media/stagefright/MediaBuffer.h>
+#include <MetadataBufferType.h>
+
#include "foundation/ABase.h"
namespace android {
@@ -109,9 +111,9 @@
void dump(String8& result, const char* prefix, char* buffer,
size_t SIZE) const;
- // isMetaDataStoredInVideoBuffers tells the encoder whether we will
- // pass metadata through the buffers. Currently, it is force set to true
- bool isMetaDataStoredInVideoBuffers() const;
+ // metaDataStoredInVideoBuffers tells the encoder what kind of metadata
+ // is passed through the buffers. Currently, it is set to ANWBuffer
+ MetadataBufferType metaDataStoredInVideoBuffers() const;
sp<IGraphicBufferProducer> getProducer() const { return mProducer; }
@@ -234,6 +236,9 @@
Condition mMediaBuffersAvailableCondition;
+ // Allocate and return a new MediaBuffer and pass the ANW buffer as metadata into it.
+ void passMetadataBuffer_l(MediaBuffer **buffer, ANativeWindowBuffer *bufferHandle) const;
+
// Avoid copying and equating and default constructor
DISALLOW_EVIL_CONSTRUCTORS(SurfaceMediaSource);
};
diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp
index 9b3ef30..884f905 100644
--- a/media/libmedia/IOMX.cpp
+++ b/media/libmedia/IOMX.cpp
@@ -436,7 +436,9 @@
data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
data.writeInt32((int32_t)node);
data.writeInt32(port_index);
- data.writeInt32((uint32_t)enable);
+ data.writeInt32((int32_t)enable);
+ data.writeInt32(type == NULL ? kMetadataBufferTypeANWBuffer : *type);
+
remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
// read type even storeMetaDataInBuffers failed
@@ -1040,7 +1042,7 @@
OMX_U32 port_index = data.readInt32();
OMX_BOOL enable = (OMX_BOOL)data.readInt32();
- MetadataBufferType type = kMetadataBufferTypeInvalid;
+ MetadataBufferType type = (MetadataBufferType)data.readInt32();
status_t err = storeMetaDataInBuffers(node, port_index, enable, &type);
reply->writeInt32(type);
diff --git a/media/libmediaplayerservice/Android.mk b/media/libmediaplayerservice/Android.mk
index 68860d2..8d86366 100644
--- a/media/libmediaplayerservice/Android.mk
+++ b/media/libmediaplayerservice/Android.mk
@@ -51,6 +51,7 @@
$(TOP)/frameworks/av/include/media \
$(TOP)/frameworks/av/include/camera \
$(TOP)/frameworks/native/include/media/openmax \
+ $(TOP)/frameworks/native/include/media/hardware \
$(TOP)/external/tremolo/Tremolo \
libcore/include \
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 3f7367f..6114af8 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -1474,8 +1474,8 @@
CHECK(mFrameRate != -1);
- mIsMetaDataStoredInVideoBuffers =
- (*cameraSource)->isMetaDataStoredInVideoBuffers();
+ mMetaDataStoredInVideoBuffers =
+ (*cameraSource)->metaDataStoredInVideoBuffers();
return OK;
}
@@ -1565,11 +1565,11 @@
format->setFloat("operating-rate", mCaptureFps);
}
- uint32_t flags = 0;
- if (mIsMetaDataStoredInVideoBuffers) {
- flags |= MediaCodecSource::FLAG_USE_METADATA_INPUT;
+ if (mMetaDataStoredInVideoBuffers != kMetadataBufferTypeInvalid) {
+ format->setInt32("android._input-metadata-buffer-type", mMetaDataStoredInVideoBuffers);
}
+ uint32_t flags = 0;
if (cameraSource == NULL) {
flags |= MediaCodecSource::FLAG_USE_SURFACE_INPUT;
} else {
@@ -1866,7 +1866,7 @@
mCaptureFps = 0.0f;
mTimeBetweenCaptureUs = -1;
mCameraSourceTimeLapse = NULL;
- mIsMetaDataStoredInVideoBuffers = false;
+ mMetaDataStoredInVideoBuffers = kMetadataBufferTypeInvalid;
mEncoderProfiles = MediaProfiles::getInstance();
mRotationDegrees = 0;
mLatitudex10000 = -3600000;
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index a73197f..d7f43bc 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -24,6 +24,8 @@
#include <system/audio.h>
+#include <MetadataBufferType.h>
+
namespace android {
class Camera;
@@ -121,7 +123,7 @@
String8 mParams;
- bool mIsMetaDataStoredInVideoBuffers;
+ MetadataBufferType mMetaDataStoredInVideoBuffers;
MediaProfiles *mEncoderProfiles;
int64_t mPauseStartTimeUs;
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index b2b0879..0b0eece 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -793,10 +793,10 @@
MetadataBufferType type =
portIndex == kPortIndexOutput ? mOutputMetadataType : mInputMetadataType;
size_t bufSize = def.nBufferSize;
- if (type == kMetadataBufferTypeGrallocSource) {
- bufSize = sizeof(VideoGrallocMetadata);
- } else if (type == kMetadataBufferTypeANWBuffer) {
+ if (type == kMetadataBufferTypeANWBuffer) {
bufSize = sizeof(VideoNativeMetadata);
+ } else if (type == kMetadataBufferTypeNativeHandleSource) {
+ bufSize = sizeof(VideoNativeHandleMetadata);
}
// If using gralloc or native source input metadata buffers, allocate largest
@@ -804,7 +804,7 @@
// may require gralloc source. For camera source, allocate at least enough
// size for native metadata buffers.
size_t allottedSize = bufSize;
- if (portIndex == kPortIndexInput && type >= kMetadataBufferTypeGrallocSource) {
+ if (portIndex == kPortIndexInput && type == kMetadataBufferTypeANWBuffer) {
bufSize = max(sizeof(VideoGrallocMetadata), sizeof(VideoNativeMetadata));
} else if (portIndex == kPortIndexInput && type == kMetadataBufferTypeCameraSource) {
bufSize = max(bufSize, sizeof(VideoNativeMetadata));
@@ -1725,19 +1725,20 @@
int32_t storeMeta;
if (encoder
- && msg->findInt32("store-metadata-in-buffers", &storeMeta)
- && storeMeta != 0) {
- err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE, &mInputMetadataType);
+ && msg->findInt32("android._input-metadata-buffer-type", &storeMeta)
+ && storeMeta != kMetadataBufferTypeInvalid) {
+ mInputMetadataType = (MetadataBufferType)storeMeta;
+ err = mOMX->storeMetaDataInBuffers(
+ mNode, kPortIndexInput, OMX_TRUE, &mInputMetadataType);
if (err != OK) {
ALOGE("[%s] storeMetaDataInBuffers (input) failed w/ err %d",
mComponentName.c_str(), err);
return err;
- }
- // For this specific case we could be using camera source even if storeMetaDataInBuffers
- // returns Gralloc source. Pretend that we are; this will force us to use nBufferSize.
- if (mInputMetadataType == kMetadataBufferTypeGrallocSource) {
- mInputMetadataType = kMetadataBufferTypeCameraSource;
+ } else if (storeMeta == kMetadataBufferTypeANWBuffer
+ && mInputMetadataType == kMetadataBufferTypeGrallocSource) {
+ // IOMX translates ANWBuffers to gralloc source already.
+ mInputMetadataType = (MetadataBufferType)storeMeta;
}
uint32_t usageBits;
@@ -1783,9 +1784,10 @@
mIsVideo = video;
if (encoder && video) {
OMX_BOOL enable = (OMX_BOOL) (prependSPSPPS
- && msg->findInt32("store-metadata-in-buffers-output", &storeMeta)
+ && msg->findInt32("android._store-metadata-in-buffers-output", &storeMeta)
&& storeMeta != 0);
+ mOutputMetadataType = kMetadataBufferTypeNativeHandleSource;
err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, enable, &mOutputMetadataType);
if (err != OK) {
ALOGE("[%s] storeMetaDataInBuffers (output) failed w/ err %d",
@@ -1914,6 +1916,7 @@
}
// Always try to enable dynamic output buffers on native surface
+ mOutputMetadataType = kMetadataBufferTypeANWBuffer;
err = mOMX->storeMetaDataInBuffers(
mNode, kPortIndexOutput, OMX_TRUE, &mOutputMetadataType);
if (err != OK) {
@@ -5959,18 +5962,15 @@
if (mCodec->usingMetadataOnEncoderOutput()) {
native_handle_t *handle = NULL;
- VideoGrallocMetadata &grallocMeta = *(VideoGrallocMetadata *)info->mData->data();
- VideoNativeMetadata &nativeMeta = *(VideoNativeMetadata *)info->mData->data();
- if (info->mData->size() >= sizeof(grallocMeta)
- && grallocMeta.eType == kMetadataBufferTypeGrallocSource) {
- handle = (native_handle_t *)(uintptr_t)grallocMeta.pHandle;
- } else if (info->mData->size() >= sizeof(nativeMeta)
- && nativeMeta.eType == kMetadataBufferTypeANWBuffer) {
+ VideoNativeHandleMetadata &nativeMeta =
+ *(VideoNativeHandleMetadata *)info->mData->data();
+ if (info->mData->size() >= sizeof(nativeMeta)
+ && nativeMeta.eType == kMetadataBufferTypeNativeHandleSource) {
#ifdef OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS
- // ANativeWindowBuffer is only valid on 32-bit/mediaserver process
+ // handle is only valid on 32-bit/mediaserver process
handle = NULL;
#else
- handle = (native_handle_t *)nativeMeta.pBuffer->handle;
+ handle = (native_handle_t *)nativeMeta.pHandle;
#endif
}
info->mData->meta()->setPointer("handle", handle);
@@ -6657,8 +6657,14 @@
sp<IGraphicBufferProducer> bufferProducer;
if (err == OK) {
+ mCodec->mInputMetadataType = kMetadataBufferTypeANWBuffer;
err = mCodec->mOMX->createInputSurface(
- mCodec->mNode, kPortIndexInput, dataSpace, &bufferProducer, &mCodec->mInputMetadataType);
+ mCodec->mNode, kPortIndexInput, dataSpace, &bufferProducer,
+ &mCodec->mInputMetadataType);
+ // framework uses ANW buffers internally instead of gralloc handles
+ if (mCodec->mInputMetadataType == kMetadataBufferTypeGrallocSource) {
+ mCodec->mInputMetadataType = kMetadataBufferTypeANWBuffer;
+ }
}
if (err == OK) {
@@ -6697,9 +6703,14 @@
notify->setMessage("output-format", mCodec->mOutputFormat);
if (err == OK) {
+ mCodec->mInputMetadataType = kMetadataBufferTypeANWBuffer;
err = mCodec->mOMX->setInputSurface(
mCodec->mNode, kPortIndexInput, surface->getBufferConsumer(),
&mCodec->mInputMetadataType);
+ // framework uses ANW buffers internally instead of gralloc handles
+ if (mCodec->mInputMetadataType == kMetadataBufferTypeGrallocSource) {
+ mCodec->mInputMetadataType = kMetadataBufferTypeANWBuffer;
+ }
}
if (err == OK) {
diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp
index 8e9db93..e087249 100644
--- a/media/libstagefright/CameraSource.cpp
+++ b/media/libstagefright/CameraSource.cpp
@@ -1244,13 +1244,19 @@
mFrameAvailableCondition.signal();
}
-bool CameraSource::isMetaDataStoredInVideoBuffers() const {
- ALOGV("isMetaDataStoredInVideoBuffers");
+MetadataBufferType CameraSource::metaDataStoredInVideoBuffers() const {
+ ALOGV("metaDataStoredInVideoBuffers");
// Output buffers will contain metadata if camera sends us buffer in metadata mode or via
// buffer queue.
- return (mVideoBufferMode == hardware::ICamera::VIDEO_BUFFER_MODE_DATA_CALLBACK_METADATA ||
- mVideoBufferMode == hardware::ICamera::VIDEO_BUFFER_MODE_BUFFER_QUEUE);
+ switch (mVideoBufferMode) {
+ case hardware::ICamera::VIDEO_BUFFER_MODE_DATA_CALLBACK_METADATA:
+ return kMetadataBufferTypeNativeHandleSource;
+ case hardware::ICamera::VIDEO_BUFFER_MODE_BUFFER_QUEUE:
+ return kMetadataBufferTypeANWBuffer;
+ default:
+ return kMetadataBufferTypeInvalid;
+ }
}
CameraSource::ProxyListener::ProxyListener(const sp<CameraSource>& source) {
diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp
index 90c56f4..0aafa6b 100644
--- a/media/libstagefright/MediaCodecSource.cpp
+++ b/media/libstagefright/MediaCodecSource.cpp
@@ -449,10 +449,6 @@
mCodecLooper->setName("codec_looper");
mCodecLooper->start();
- if (mFlags & FLAG_USE_METADATA_INPUT) {
- mOutputFormat->setInt32("store-metadata-in-buffers", 1);
- }
-
if (mFlags & FLAG_USE_SURFACE_INPUT) {
mOutputFormat->setInt32("create-input-buffers-suspended", 1);
}
diff --git a/media/libstagefright/SurfaceMediaSource.cpp b/media/libstagefright/SurfaceMediaSource.cpp
index e4bf67a..15ff569 100644
--- a/media/libstagefright/SurfaceMediaSource.cpp
+++ b/media/libstagefright/SurfaceMediaSource.cpp
@@ -23,6 +23,7 @@
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MetaData.h>
#include <OMX_IVCommon.h>
+#include <media/hardware/HardwareAPI.h>
#include <media/hardware/MetadataBufferType.h>
#include <ui/GraphicBuffer.h>
@@ -126,9 +127,9 @@
return OK;
}
-bool SurfaceMediaSource::isMetaDataStoredInVideoBuffers() const {
+MetadataBufferType SurfaceMediaSource::metaDataStoredInVideoBuffers() const {
ALOGV("isMetaDataStoredInVideoBuffers");
- return true;
+ return kMetadataBufferTypeANWBuffer;
}
int32_t SurfaceMediaSource::getFrameRate( ) const {
@@ -250,29 +251,19 @@
}
// Pass the data to the MediaBuffer. Pass in only the metadata
-// The metadata passed consists of two parts:
-// 1. First, there is an integer indicating that it is a GRAlloc
-// source (kMetadataBufferTypeGrallocSource)
-// 2. This is followed by the buffer_handle_t that is a handle to the
-// GRalloc buffer. The encoder needs to interpret this GRalloc handle
-// and encode the frames.
-// --------------------------------------------------------------
-// | kMetadataBufferTypeGrallocSource | sizeof(buffer_handle_t) |
-// --------------------------------------------------------------
// Note: Call only when you have the lock
-static void passMetadataBuffer(MediaBuffer **buffer,
- buffer_handle_t bufferHandle) {
- *buffer = new MediaBuffer(4 + sizeof(buffer_handle_t));
- char *data = (char *)(*buffer)->data();
+void SurfaceMediaSource::passMetadataBuffer_l(MediaBuffer **buffer,
+ ANativeWindowBuffer *bufferHandle) const {
+ *buffer = new MediaBuffer(sizeof(VideoNativeMetadata));
+ VideoNativeMetadata *data = (VideoNativeMetadata *)(*buffer)->data();
if (data == NULL) {
ALOGE("Cannot allocate memory for metadata buffer!");
return;
}
- OMX_U32 type = kMetadataBufferTypeGrallocSource;
- memcpy(data, &type, 4);
- memcpy(data + 4, &bufferHandle, sizeof(buffer_handle_t));
-
- ALOGV("handle = %p, , offset = %zu, length = %zu",
+ data->eType = metaDataStoredInVideoBuffers();
+ data->pBuffer = bufferHandle;
+ data->nFenceFd = -1;
+ ALOGV("handle = %p, offset = %zu, length = %zu",
bufferHandle, (*buffer)->range_length(), (*buffer)->range_offset());
}
@@ -361,7 +352,7 @@
mNumFramesEncoded++;
// Pass the data to the MediaBuffer. Pass in only the metadata
- passMetadataBuffer(buffer, mSlots[mCurrentSlot].mGraphicBuffer->handle);
+ passMetadataBuffer_l(buffer, mSlots[mCurrentSlot].mGraphicBuffer->getNativeBuffer());
(*buffer)->setObserver(this);
(*buffer)->add_ref();
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index 862a614..3a020ac 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -529,6 +529,9 @@
OMX_U32 portIndex, OMX_BOOL enable, MetadataBufferType *type) {
if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) {
android_errorWriteLog(0x534e4554, "26324358");
+ if (type != NULL) {
+ *type = kMetadataBufferTypeInvalid;
+ }
return BAD_VALUE;
}
@@ -539,26 +542,32 @@
OMX_STRING nativeBufferName = const_cast<OMX_STRING>(
"OMX.google.android.index.storeANWBufferInMetadata");
MetadataBufferType negotiatedType;
+ MetadataBufferType requestedType = type != NULL ? *type : kMetadataBufferTypeANWBuffer;
StoreMetaDataInBuffersParams params;
InitOMXParams(¶ms);
params.nPortIndex = portIndex;
params.bStoreMetaData = enable;
- OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, nativeBufferName, &index);
+ OMX_ERRORTYPE err =
+ requestedType == kMetadataBufferTypeANWBuffer
+ ? OMX_GetExtensionIndex(mHandle, nativeBufferName, &index)
+ : OMX_ErrorUnsupportedIndex;
OMX_ERRORTYPE xerr = err;
if (err == OMX_ErrorNone) {
err = OMX_SetParameter(mHandle, index, ¶ms);
if (err == OMX_ErrorNone) {
name = nativeBufferName; // set name for debugging
- negotiatedType = kMetadataBufferTypeANWBuffer;
+ negotiatedType = requestedType;
}
}
if (err != OMX_ErrorNone) {
err = OMX_GetExtensionIndex(mHandle, name, &index);
xerr = err;
if (err == OMX_ErrorNone) {
- negotiatedType = kMetadataBufferTypeGrallocSource;
+ negotiatedType =
+ requestedType == kMetadataBufferTypeANWBuffer
+ ? kMetadataBufferTypeGrallocSource : requestedType;
err = OMX_SetParameter(mHandle, index, ¶ms);
}
}
@@ -580,8 +589,9 @@
}
mMetadataType[portIndex] = negotiatedType;
}
- CLOG_CONFIG(storeMetaDataInBuffers, "%s:%u negotiated %s:%d",
- portString(portIndex), portIndex, asString(negotiatedType), negotiatedType);
+ CLOG_CONFIG(storeMetaDataInBuffers, "%s:%u %srequested %s:%d negotiated %s:%d",
+ portString(portIndex), portIndex, enable ? "" : "UN",
+ asString(requestedType), requestedType, asString(negotiatedType), negotiatedType);
if (type != NULL) {
*type = negotiatedType;
@@ -927,6 +937,9 @@
}
// Input buffers will hold meta-data (ANativeWindowBuffer references).
+ if (type != NULL) {
+ *type = kMetadataBufferTypeANWBuffer;
+ }
err = storeMetaDataInBuffers_l(portIndex, OMX_TRUE, type);
if (err != OK) {
return err;
diff --git a/media/libstagefright/tests/Android.mk b/media/libstagefright/tests/Android.mk
index 111e6c5..d1c9d36 100644
--- a/media/libstagefright/tests/Android.mk
+++ b/media/libstagefright/tests/Android.mk
@@ -30,6 +30,7 @@
frameworks/av/media/libstagefright \
frameworks/av/media/libstagefright/include \
$(TOP)/frameworks/native/include/media/openmax \
+ $(TOP)/frameworks/native/include/media/hardware \
LOCAL_CFLAGS += -Werror -Wall
LOCAL_CLANG := true
diff --git a/media/libstagefright/wifi-display/Android.mk b/media/libstagefright/wifi-display/Android.mk
index 5bd6e5c..ae4ac90 100644
--- a/media/libstagefright/wifi-display/Android.mk
+++ b/media/libstagefright/wifi-display/Android.mk
@@ -17,6 +17,7 @@
LOCAL_C_INCLUDES:= \
$(TOP)/frameworks/av/media/libstagefright \
$(TOP)/frameworks/native/include/media/openmax \
+ $(TOP)/frameworks/native/include/media/hardware \
$(TOP)/frameworks/av/media/libstagefright/mpeg2ts \
LOCAL_SHARED_LIBRARIES:= \
diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
index 3ecb52b..3587cb9 100644
--- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp
+++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
@@ -948,8 +948,9 @@
if (isVideo) {
format->setString("mime", MEDIA_MIMETYPE_VIDEO_AVC);
- format->setInt32("store-metadata-in-buffers", true);
- format->setInt32("store-metadata-in-buffers-output", (mHDCP != NULL)
+ format->setInt32(
+ "android._input-metadata-buffer-type", kMetadataBufferTypeANWBuffer);
+ format->setInt32("android._store-metadata-in-buffers-output", (mHDCP != NULL)
&& (mHDCP->getCaps() & HDCPModule::HDCP_CAPS_ENCRYPT_NATIVE));
format->setInt32(
"color-format", OMX_COLOR_FormatAndroidOpaque);