Merge "stagefright: use MediaImage2" into nyc-dev am: 1c0de60e80
am: 112619b08c
* commit '112619b08cb7adb80fd163aafaf99a12c58502d9':
stagefright: use MediaImage2
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h
index 4489d37..4a7fc62 100644
--- a/include/media/stagefright/ACodec.h
+++ b/include/media/stagefright/ACodec.h
@@ -35,7 +35,7 @@
struct ABuffer;
struct MemoryDealer;
-struct DescribeColorFormatParams;
+struct DescribeColorFormat2Params;
struct ACodec : public AHierarchicalStateMachine, public CodecBase {
ACodec();
@@ -442,10 +442,10 @@
OMX_ERRORTYPE error = OMX_ErrorUndefined,
status_t internalError = UNKNOWN_ERROR);
- static bool describeDefaultColorFormat(DescribeColorFormatParams &describeParams);
+ static bool describeDefaultColorFormat(DescribeColorFormat2Params &describeParams);
static bool describeColorFormat(
const sp<IOMX> &omx, IOMX::node_id node,
- DescribeColorFormatParams &describeParams);
+ DescribeColorFormat2Params &describeParams);
status_t requestIDRFrame();
status_t setParameters(const sp<AMessage> ¶ms);
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index ee573f0..d0651f3 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -52,6 +52,7 @@
#include <OMX_AsString.h>
#include "include/avc_utils.h"
+#include "omx/OMXUtils.h"
namespace android {
@@ -101,15 +102,6 @@
}
}
-template<class T>
-static void InitOMXParams(T *params) {
- params->nSize = sizeof(T);
- params->nVersion.s.nVersionMajor = 1;
- params->nVersion.s.nVersionMinor = 0;
- params->nVersion.s.nRevision = 0;
- params->nVersion.s.nStep = 0;
-}
-
struct MessageList : public RefBase {
MessageList() {
}
@@ -3985,11 +3977,11 @@
}
// static
-bool ACodec::describeDefaultColorFormat(DescribeColorFormatParams ¶ms) {
- MediaImage &image = params.sMediaImage;
+bool ACodec::describeDefaultColorFormat(DescribeColorFormat2Params ¶ms) {
+ MediaImage2 &image = params.sMediaImage;
memset(&image, 0, sizeof(image));
- image.mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN;
+ image.mType = MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN;
image.mNumPlanes = 0;
const OMX_COLOR_FORMATTYPE fmt = params.eColorFormat;
@@ -4024,9 +4016,10 @@
}
// set-up YUV format
- image.mType = MediaImage::MEDIA_IMAGE_TYPE_YUV;
+ image.mType = MediaImage2::MEDIA_IMAGE_TYPE_YUV;
image.mNumPlanes = 3;
image.mBitDepth = 8;
+ image.mBitDepthAllocated = 8;
image.mPlane[image.Y].mOffset = 0;
image.mPlane[image.Y].mColInc = 1;
image.mPlane[image.Y].mRowInc = params.nStride;
@@ -4099,26 +4092,34 @@
// static
bool ACodec::describeColorFormat(
const sp<IOMX> &omx, IOMX::node_id node,
- DescribeColorFormatParams &describeParams)
+ DescribeColorFormat2Params &describeParams)
{
OMX_INDEXTYPE describeColorFormatIndex;
if (omx->getExtensionIndex(
node, "OMX.google.android.index.describeColorFormat",
- &describeColorFormatIndex) != OK ||
- omx->getParameter(
- node, describeColorFormatIndex,
- &describeParams, sizeof(describeParams)) != OK) {
- return describeDefaultColorFormat(describeParams);
+ &describeColorFormatIndex) == OK) {
+ DescribeColorFormatParams describeParamsV1(describeParams);
+ if (omx->getParameter(
+ node, describeColorFormatIndex,
+ &describeParamsV1, sizeof(describeParamsV1)) == OK) {
+ describeParams.initFromV1(describeParamsV1);
+ return describeParams.sMediaImage.mType != MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN;
+ }
+ } else if (omx->getExtensionIndex(
+ node, "OMX.google.android.index.describeColorFormat2", &describeColorFormatIndex) == OK
+ && omx->getParameter(
+ node, describeColorFormatIndex, &describeParams, sizeof(describeParams)) == OK) {
+ return describeParams.sMediaImage.mType != MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN;
}
- return describeParams.sMediaImage.mType !=
- MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN;
+
+ return describeDefaultColorFormat(describeParams);
}
// static
bool ACodec::isFlexibleColorFormat(
const sp<IOMX> &omx, IOMX::node_id node,
uint32_t colorFormat, bool usingNativeBuffers, OMX_U32 *flexibleEquivalent) {
- DescribeColorFormatParams describeParams;
+ DescribeColorFormat2Params describeParams;
InitOMXParams(&describeParams);
describeParams.eColorFormat = (OMX_COLOR_FORMATTYPE)colorFormat;
// reasonable dummy values
@@ -4134,11 +4135,11 @@
return false;
}
- const MediaImage &img = describeParams.sMediaImage;
- if (img.mType == MediaImage::MEDIA_IMAGE_TYPE_YUV) {
- if (img.mNumPlanes != 3 ||
- img.mPlane[img.Y].mHorizSubsampling != 1 ||
- img.mPlane[img.Y].mVertSubsampling != 1) {
+ const MediaImage2 &img = describeParams.sMediaImage;
+ if (img.mType == MediaImage2::MEDIA_IMAGE_TYPE_YUV) {
+ if (img.mNumPlanes != 3
+ || img.mPlane[img.Y].mHorizSubsampling != 1
+ || img.mPlane[img.Y].mVertSubsampling != 1) {
return false;
}
@@ -4188,7 +4189,7 @@
notify->setInt32("color-format", videoDef->eColorFormat);
if (mNativeWindow == NULL) {
- DescribeColorFormatParams describeParams;
+ DescribeColorFormat2Params describeParams;
InitOMXParams(&describeParams);
describeParams.eColorFormat = videoDef->eColorFormat;
describeParams.nFrameWidth = videoDef->nFrameWidth;
@@ -4204,12 +4205,13 @@
&describeParams.sMediaImage,
sizeof(describeParams.sMediaImage)));
- MediaImage *img = &describeParams.sMediaImage;
- ALOGV("[%s] MediaImage { F(%ux%u) @%u+%u+%u @%u+%u+%u @%u+%u+%u }",
- mComponentName.c_str(), img->mWidth, img->mHeight,
- img->mPlane[0].mOffset, img->mPlane[0].mColInc, img->mPlane[0].mRowInc,
- img->mPlane[1].mOffset, img->mPlane[1].mColInc, img->mPlane[1].mRowInc,
- img->mPlane[2].mOffset, img->mPlane[2].mColInc, img->mPlane[2].mRowInc);
+ MediaImage2 &img = describeParams.sMediaImage;
+ MediaImage2::PlaneInfo *plane = img.mPlane;
+ ALOGV("[%s] MediaImage { F(%ux%u) @%u+%d+%d @%u+%d+%d @%u+%d+%d }",
+ mComponentName.c_str(), img.mWidth, img.mHeight,
+ plane[0].mOffset, plane[0].mColInc, plane[0].mRowInc,
+ plane[1].mOffset, plane[1].mColInc, plane[1].mRowInc,
+ plane[2].mOffset, plane[2].mColInc, plane[2].mRowInc);
}
}
diff --git a/media/libstagefright/include/OMXNodeInstance.h b/media/libstagefright/include/OMXNodeInstance.h
index 732894c..b1cb91d 100644
--- a/media/libstagefright/include/OMXNodeInstance.h
+++ b/media/libstagefright/include/OMXNodeInstance.h
@@ -29,8 +29,6 @@
struct OMXMaster;
class GraphicBufferSource;
-status_t StatusFromOMXError(OMX_ERRORTYPE err);
-
struct OMXNodeInstance {
OMXNodeInstance(
OMX *owner, const sp<IOMXObserver> &observer, const char *name);
diff --git a/media/libstagefright/omx/Android.mk b/media/libstagefright/omx/Android.mk
index 804afe9..e4fbd81 100644
--- a/media/libstagefright/omx/Android.mk
+++ b/media/libstagefright/omx/Android.mk
@@ -7,6 +7,7 @@
OMX.cpp \
OMXMaster.cpp \
OMXNodeInstance.cpp \
+ OMXUtils.cpp \
SimpleSoftOMXComponent.cpp \
SoftOMXComponent.cpp \
SoftOMXPlugin.cpp \
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index 6be289b..970f6f5 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -31,6 +31,7 @@
#include <utils/threads.h>
#include "OMXMaster.h"
+#include "OMXUtils.h"
#include <OMX_AsString.h>
#include <OMX_Component.h>
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index 7380ab2..a5c7503 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -22,6 +22,7 @@
#include "../include/OMXNodeInstance.h"
#include "OMXMaster.h"
+#include "OMXUtils.h"
#include "GraphicBufferSource.h"
#include <OMX_Component.h>
@@ -89,16 +90,6 @@
// TRICKY: this is needed so formatting macros expand before substitution
#define WITH_STATS(fmt, ...) WITH_STATS_WRAPPER(fmt, ##__VA_ARGS__)
-template<class T>
-static void InitOMXParams(T *params) {
- memset(params, 0, sizeof(T));
- params->nSize = sizeof(T);
- params->nVersion.s.nVersionMajor = 1;
- params->nVersion.s.nVersionMinor = 0;
- params->nVersion.s.nRevision = 0;
- params->nVersion.s.nStep = 0;
-}
-
namespace android {
struct BufferMeta {
@@ -245,20 +236,6 @@
return mNodeID;
}
-status_t StatusFromOMXError(OMX_ERRORTYPE err) {
- switch (err) {
- case OMX_ErrorNone:
- return OK;
- case OMX_ErrorUnsupportedSetting:
- case OMX_ErrorUnsupportedIndex:
- return ERROR_UNSUPPORTED;
- case OMX_ErrorInsufficientResources:
- return NO_MEMORY;
- default:
- return UNKNOWN_ERROR;
- }
-}
-
status_t OMXNodeInstance::freeNode(OMXMaster *master) {
CLOG_LIFE(freeNode, "handle=%p", mHandle);
static int32_t kMaxNumIterations = 10;
diff --git a/media/libstagefright/omx/OMXUtils.cpp b/media/libstagefright/omx/OMXUtils.cpp
new file mode 100644
index 0000000..799696c
--- /dev/null
+++ b/media/libstagefright/omx/OMXUtils.cpp
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "OMXUtils"
+
+#include <string.h>
+
+#include <media/hardware/HardwareAPI.h>
+#include <media/stagefright/MediaErrors.h>
+#include "OMXUtils.h"
+
+namespace android {
+
+status_t StatusFromOMXError(OMX_ERRORTYPE err) {
+ switch (err) {
+ case OMX_ErrorNone:
+ return OK;
+ case OMX_ErrorUnsupportedSetting:
+ case OMX_ErrorUnsupportedIndex:
+ return ERROR_UNSUPPORTED; // this is a media specific error
+ case OMX_ErrorInsufficientResources:
+ return NO_MEMORY;
+ case OMX_ErrorInvalidComponentName:
+ case OMX_ErrorComponentNotFound:
+ return NAME_NOT_FOUND;
+ default:
+ return UNKNOWN_ERROR;
+ }
+}
+
+/**************************************************************************************************/
+
+DescribeColorFormatParams::DescribeColorFormatParams(const DescribeColorFormat2Params ¶ms) {
+ InitOMXParams(this);
+
+ eColorFormat = params.eColorFormat;
+ nFrameWidth = params.nFrameWidth;
+ nFrameHeight = params.nFrameHeight;
+ nStride = params.nStride;
+ nSliceHeight = params.nSliceHeight;
+ bUsingNativeBuffers = params.bUsingNativeBuffers;
+ // we don't copy media images as this conversion is only used pre-query
+};
+
+void DescribeColorFormat2Params::initFromV1(const DescribeColorFormatParams ¶ms) {
+ InitOMXParams(this);
+
+ eColorFormat = params.eColorFormat;
+ nFrameWidth = params.nFrameWidth;
+ nFrameHeight = params.nFrameHeight;
+ nStride = params.nStride;
+ nSliceHeight = params.nSliceHeight;
+ bUsingNativeBuffers = params.bUsingNativeBuffers;
+ sMediaImage.initFromV1(params.sMediaImage);
+};
+
+void MediaImage2::initFromV1(const MediaImage &image) {
+ memset(this, 0, sizeof(*this));
+
+ if (image.mType != MediaImage::MEDIA_IMAGE_TYPE_YUV) {
+ mType = MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN;
+ return;
+ }
+
+ for (size_t ix = 0; ix < image.mNumPlanes; ++ix) {
+ if (image.mPlane[ix].mHorizSubsampling > INT32_MAX
+ || image.mPlane[ix].mVertSubsampling > INT32_MAX) {
+ mType = MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN;
+ return;
+ }
+ }
+
+ mType = (MediaImage2::Type)image.mType;
+ mNumPlanes = image.mNumPlanes;
+ mWidth = image.mWidth;
+ mHeight = image.mHeight;
+ mBitDepth = image.mBitDepth;
+ mBitDepthAllocated = 8;
+ for (size_t ix = 0; ix < image.mNumPlanes; ++ix) {
+ mPlane[ix].mOffset = image.mPlane[ix].mOffset;
+ mPlane[ix].mColInc = image.mPlane[ix].mColInc;
+ mPlane[ix].mRowInc = image.mPlane[ix].mRowInc;
+ mPlane[ix].mHorizSubsampling = (int32_t)image.mPlane[ix].mHorizSubsampling;
+ mPlane[ix].mVertSubsampling = (int32_t)image.mPlane[ix].mVertSubsampling;
+ }
+}
+
+/**************************************************************************************************/
+
+} // namespace android
+
diff --git a/media/libstagefright/omx/OMXUtils.h b/media/libstagefright/omx/OMXUtils.h
new file mode 100644
index 0000000..0c5e537
--- /dev/null
+++ b/media/libstagefright/omx/OMXUtils.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef OMX_UTILS_H_
+#define OMX_UTILS_H_
+
+/***** DO NOT USE THIS INCLUDE!!! INTERAL ONLY!!! UNLESS YOU RESIDE IN media/libstagefright *****/
+
+// OMXUtils contains omx-specific utility functions for stagefright/omx library
+// TODO: move ACodec and OMXClient into this library
+
+namespace android {
+
+template<class T>
+static void InitOMXParams(T *params) {
+ memset(params, 0, sizeof(T));
+ params->nSize = sizeof(T);
+ params->nVersion.s.nVersionMajor = 1;
+ params->nVersion.s.nVersionMinor = 0;
+ params->nVersion.s.nRevision = 0;
+ params->nVersion.s.nStep = 0;
+}
+
+status_t StatusFromOMXError(OMX_ERRORTYPE err);
+
+} // namespace android
+
+#endif