summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2010-08-05 15:10:03 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-08-05 15:10:03 -0700
commitaf799e10a29e2ffbe09f9cead0c583221e8b2d0d (patch)
treed6bf48c064c0587be750152a12321059da6293b9 /media
parentc5f0c714dc4225cd2ec305d5ddd297964a3dd3dc (diff)
parent299766cdbf93fba14634e364b177b7f4d5811453 (diff)
downloadframeworks_av-af799e10a29e2ffbe09f9cead0c583221e8b2d0d.zip
frameworks_av-af799e10a29e2ffbe09f9cead0c583221e8b2d0d.tar.gz
frameworks_av-af799e10a29e2ffbe09f9cead0c583221e8b2d0d.tar.bz2
Merge "Use the target color format from the camera source if possible" into gingerbread
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/OMXCodec.cpp65
1 files changed, 61 insertions, 4 deletions
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index d19fbe5..4f3bffd 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -762,6 +762,65 @@ static size_t getFrameSize(
}
}
+status_t OMXCodec::findTargetColorFormat(
+ const sp<MetaData>& meta, OMX_COLOR_FORMATTYPE *colorFormat) {
+ LOGV("findTargetColorFormat");
+ CHECK(mIsEncoder);
+
+ *colorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+ int32_t targetColorFormat;
+ if (meta->findInt32(kKeyColorFormat, &targetColorFormat)) {
+ *colorFormat = (OMX_COLOR_FORMATTYPE) targetColorFormat;
+ } else {
+ if (!strcasecmp("OMX.TI.Video.encoder", mComponentName)) {
+ *colorFormat = OMX_COLOR_FormatYCbYCr;
+ }
+ }
+
+ // Check whether the target color format is supported.
+ return isColorFormatSupported(*colorFormat, kPortIndexInput);
+}
+
+status_t OMXCodec::isColorFormatSupported(
+ OMX_COLOR_FORMATTYPE colorFormat, int portIndex) {
+ LOGV("isColorFormatSupported: %d", static_cast<int>(colorFormat));
+
+ // Enumerate all the color formats supported by
+ // the omx component to see whether the given
+ // color format is supported.
+ OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat;
+ InitOMXParams(&portFormat);
+ portFormat.nPortIndex = portIndex;
+ OMX_U32 index = 0;
+ portFormat.nIndex = index;
+ while (true) {
+ if (OMX_ErrorNone != mOMX->getParameter(
+ mNode, OMX_IndexParamVideoPortFormat,
+ &portFormat, sizeof(portFormat))) {
+
+ return UNKNOWN_ERROR;
+ }
+ // Make sure that omx component does not overwrite
+ // the incremented index (bug 2897413).
+ CHECK_EQ(index, portFormat.nIndex);
+ if ((portFormat.eColorFormat == colorFormat)) {
+ LOGV("Found supported color format: %d", portFormat.eColorFormat);
+ return OK; // colorFormat is supported!
+ }
+ ++index;
+ portFormat.nIndex = index;
+
+ // OMX Spec defines less than 50 color formats
+ // 1000 is more than enough for us to tell whether the omx
+ // component in question is buggy or not.
+ if (index >= 1000) {
+ LOGE("More than %ld color formats are supported???", index);
+ break;
+ }
+ }
+ return UNKNOWN_ERROR;
+}
+
void OMXCodec::setVideoInputFormat(
const char *mime, const sp<MetaData>& meta) {
@@ -787,10 +846,8 @@ void OMXCodec::setVideoInputFormat(
CHECK(!"Should not be here. Not a supported video mime type.");
}
- OMX_COLOR_FORMATTYPE colorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
- if (!strcasecmp("OMX.TI.Video.encoder", mComponentName)) {
- colorFormat = OMX_COLOR_FormatYCbYCr;
- }
+ OMX_COLOR_FORMATTYPE colorFormat;
+ CHECK_EQ(OK, findTargetColorFormat(meta, &colorFormat));
status_t err;
OMX_PARAM_PORTDEFINITIONTYPE def;