am 1441bdfc: Merge "Use the target color format from the camera source if possible" into gingerbread

Merge commit '1441bdfc19d6998607adf1347ed8dafc102908c9' into gingerbread-plus-aosp

* commit '1441bdfc19d6998607adf1347ed8dafc102908c9':
  Use the target color format from the camera source if possible
This commit is contained in:
James Dong
2010-08-05 15:18:16 -07:00
committed by Android Git Automerger
2 changed files with 66 additions and 4 deletions

View File

@@ -181,6 +181,11 @@ private:
status_t setupH263EncoderParameters(const sp<MetaData>& meta);
status_t setupMPEG4EncoderParameters(const sp<MetaData>& meta);
status_t setupAVCEncoderParameters(const sp<MetaData>& meta);
status_t findTargetColorFormat(
const sp<MetaData>& meta, OMX_COLOR_FORMATTYPE *colorFormat);
status_t isColorFormatSupported(
OMX_COLOR_FORMATTYPE colorFormat, int portIndex);
// If profile/level is set in the meta data, its value in the meta
// data will be used; otherwise, the default value will be used.

View File

@@ -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;