173dd808754c641fe798273d356ee38368715fa7bLajos Molnar/* 273dd808754c641fe798273d356ee38368715fa7bLajos Molnar * Copyright (C) 2016 The Android Open Source Project 373dd808754c641fe798273d356ee38368715fa7bLajos Molnar * 473dd808754c641fe798273d356ee38368715fa7bLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 573dd808754c641fe798273d356ee38368715fa7bLajos Molnar * you may not use this file except in compliance with the License. 673dd808754c641fe798273d356ee38368715fa7bLajos Molnar * You may obtain a copy of the License at 773dd808754c641fe798273d356ee38368715fa7bLajos Molnar * 873dd808754c641fe798273d356ee38368715fa7bLajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 973dd808754c641fe798273d356ee38368715fa7bLajos Molnar * 1073dd808754c641fe798273d356ee38368715fa7bLajos Molnar * Unless required by applicable law or agreed to in writing, software 1173dd808754c641fe798273d356ee38368715fa7bLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 1273dd808754c641fe798273d356ee38368715fa7bLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1373dd808754c641fe798273d356ee38368715fa7bLajos Molnar * See the License for the specific language governing permissions and 1473dd808754c641fe798273d356ee38368715fa7bLajos Molnar * limitations under the License. 1573dd808754c641fe798273d356ee38368715fa7bLajos Molnar */ 1673dd808754c641fe798273d356ee38368715fa7bLajos Molnar 1773dd808754c641fe798273d356ee38368715fa7bLajos Molnar//#define LOG_NDEBUG 0 1873dd808754c641fe798273d356ee38368715fa7bLajos Molnar#define LOG_TAG "OMXUtils" 1973dd808754c641fe798273d356ee38368715fa7bLajos Molnar 2073dd808754c641fe798273d356ee38368715fa7bLajos Molnar#include <string.h> 2173dd808754c641fe798273d356ee38368715fa7bLajos Molnar 22255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/OMXUtils.h> 231ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim#include <media/stagefright/foundation/ADebug.h> 241ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim#include <media/stagefright/foundation/AUtils.h> 25e7a8a637a019d67983bdc858ba5e879431619d5aDongwon Kang#include <media/stagefright/foundation/MediaDefs.h> 2673dd808754c641fe798273d356ee38368715fa7bLajos Molnar#include <media/stagefright/MediaErrors.h> 27255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/hardware/HardwareAPI.h> 28defb1b0b7e082621a10763d1bd7a4a01e280fdf0Mathias Agopian#include <system/graphics-base.h> 2973dd808754c641fe798273d356ee38368715fa7bLajos Molnar 3073dd808754c641fe798273d356ee38368715fa7bLajos Molnarnamespace android { 3173dd808754c641fe798273d356ee38368715fa7bLajos Molnar 3273dd808754c641fe798273d356ee38368715fa7bLajos Molnarstatus_t StatusFromOMXError(OMX_ERRORTYPE err) { 3373dd808754c641fe798273d356ee38368715fa7bLajos Molnar switch (err) { 3473dd808754c641fe798273d356ee38368715fa7bLajos Molnar case OMX_ErrorNone: 3573dd808754c641fe798273d356ee38368715fa7bLajos Molnar return OK; 3601c10f8cdcd58d1e7025f426a72e6e75ba5d7fc2Lajos Molnar case OMX_ErrorNoMore: 3701c10f8cdcd58d1e7025f426a72e6e75ba5d7fc2Lajos Molnar return NOT_ENOUGH_DATA; 3873dd808754c641fe798273d356ee38368715fa7bLajos Molnar case OMX_ErrorUnsupportedSetting: 3973dd808754c641fe798273d356ee38368715fa7bLajos Molnar case OMX_ErrorUnsupportedIndex: 4073dd808754c641fe798273d356ee38368715fa7bLajos Molnar return ERROR_UNSUPPORTED; // this is a media specific error 4101c10f8cdcd58d1e7025f426a72e6e75ba5d7fc2Lajos Molnar case OMX_ErrorBadParameter: 4201c10f8cdcd58d1e7025f426a72e6e75ba5d7fc2Lajos Molnar return BAD_VALUE; 4373dd808754c641fe798273d356ee38368715fa7bLajos Molnar case OMX_ErrorInsufficientResources: 4473dd808754c641fe798273d356ee38368715fa7bLajos Molnar return NO_MEMORY; 4573dd808754c641fe798273d356ee38368715fa7bLajos Molnar case OMX_ErrorInvalidComponentName: 4673dd808754c641fe798273d356ee38368715fa7bLajos Molnar case OMX_ErrorComponentNotFound: 4773dd808754c641fe798273d356ee38368715fa7bLajos Molnar return NAME_NOT_FOUND; 4873dd808754c641fe798273d356ee38368715fa7bLajos Molnar default: 4973dd808754c641fe798273d356ee38368715fa7bLajos Molnar return UNKNOWN_ERROR; 5073dd808754c641fe798273d356ee38368715fa7bLajos Molnar } 5173dd808754c641fe798273d356ee38368715fa7bLajos Molnar} 5273dd808754c641fe798273d356ee38368715fa7bLajos Molnar 5373dd808754c641fe798273d356ee38368715fa7bLajos Molnar/**************************************************************************************************/ 5473dd808754c641fe798273d356ee38368715fa7bLajos Molnar 5573dd808754c641fe798273d356ee38368715fa7bLajos MolnarDescribeColorFormatParams::DescribeColorFormatParams(const DescribeColorFormat2Params ¶ms) { 5673dd808754c641fe798273d356ee38368715fa7bLajos Molnar InitOMXParams(this); 5773dd808754c641fe798273d356ee38368715fa7bLajos Molnar 5873dd808754c641fe798273d356ee38368715fa7bLajos Molnar eColorFormat = params.eColorFormat; 5973dd808754c641fe798273d356ee38368715fa7bLajos Molnar nFrameWidth = params.nFrameWidth; 6073dd808754c641fe798273d356ee38368715fa7bLajos Molnar nFrameHeight = params.nFrameHeight; 6173dd808754c641fe798273d356ee38368715fa7bLajos Molnar nStride = params.nStride; 6273dd808754c641fe798273d356ee38368715fa7bLajos Molnar nSliceHeight = params.nSliceHeight; 6373dd808754c641fe798273d356ee38368715fa7bLajos Molnar bUsingNativeBuffers = params.bUsingNativeBuffers; 6473dd808754c641fe798273d356ee38368715fa7bLajos Molnar // we don't copy media images as this conversion is only used pre-query 6573dd808754c641fe798273d356ee38368715fa7bLajos Molnar}; 6673dd808754c641fe798273d356ee38368715fa7bLajos Molnar 6773dd808754c641fe798273d356ee38368715fa7bLajos Molnarvoid DescribeColorFormat2Params::initFromV1(const DescribeColorFormatParams ¶ms) { 6873dd808754c641fe798273d356ee38368715fa7bLajos Molnar InitOMXParams(this); 6973dd808754c641fe798273d356ee38368715fa7bLajos Molnar 7073dd808754c641fe798273d356ee38368715fa7bLajos Molnar eColorFormat = params.eColorFormat; 7173dd808754c641fe798273d356ee38368715fa7bLajos Molnar nFrameWidth = params.nFrameWidth; 7273dd808754c641fe798273d356ee38368715fa7bLajos Molnar nFrameHeight = params.nFrameHeight; 7373dd808754c641fe798273d356ee38368715fa7bLajos Molnar nStride = params.nStride; 7473dd808754c641fe798273d356ee38368715fa7bLajos Molnar nSliceHeight = params.nSliceHeight; 7573dd808754c641fe798273d356ee38368715fa7bLajos Molnar bUsingNativeBuffers = params.bUsingNativeBuffers; 7673dd808754c641fe798273d356ee38368715fa7bLajos Molnar sMediaImage.initFromV1(params.sMediaImage); 7773dd808754c641fe798273d356ee38368715fa7bLajos Molnar}; 7873dd808754c641fe798273d356ee38368715fa7bLajos Molnar 7973dd808754c641fe798273d356ee38368715fa7bLajos Molnarvoid MediaImage2::initFromV1(const MediaImage &image) { 8073dd808754c641fe798273d356ee38368715fa7bLajos Molnar memset(this, 0, sizeof(*this)); 8173dd808754c641fe798273d356ee38368715fa7bLajos Molnar 8273dd808754c641fe798273d356ee38368715fa7bLajos Molnar if (image.mType != MediaImage::MEDIA_IMAGE_TYPE_YUV) { 8373dd808754c641fe798273d356ee38368715fa7bLajos Molnar mType = MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN; 8473dd808754c641fe798273d356ee38368715fa7bLajos Molnar return; 8573dd808754c641fe798273d356ee38368715fa7bLajos Molnar } 8673dd808754c641fe798273d356ee38368715fa7bLajos Molnar 8773dd808754c641fe798273d356ee38368715fa7bLajos Molnar for (size_t ix = 0; ix < image.mNumPlanes; ++ix) { 8873dd808754c641fe798273d356ee38368715fa7bLajos Molnar if (image.mPlane[ix].mHorizSubsampling > INT32_MAX 8973dd808754c641fe798273d356ee38368715fa7bLajos Molnar || image.mPlane[ix].mVertSubsampling > INT32_MAX) { 9073dd808754c641fe798273d356ee38368715fa7bLajos Molnar mType = MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN; 9173dd808754c641fe798273d356ee38368715fa7bLajos Molnar return; 9273dd808754c641fe798273d356ee38368715fa7bLajos Molnar } 9373dd808754c641fe798273d356ee38368715fa7bLajos Molnar } 9473dd808754c641fe798273d356ee38368715fa7bLajos Molnar 9573dd808754c641fe798273d356ee38368715fa7bLajos Molnar mType = (MediaImage2::Type)image.mType; 9673dd808754c641fe798273d356ee38368715fa7bLajos Molnar mNumPlanes = image.mNumPlanes; 9773dd808754c641fe798273d356ee38368715fa7bLajos Molnar mWidth = image.mWidth; 9873dd808754c641fe798273d356ee38368715fa7bLajos Molnar mHeight = image.mHeight; 9973dd808754c641fe798273d356ee38368715fa7bLajos Molnar mBitDepth = image.mBitDepth; 10073dd808754c641fe798273d356ee38368715fa7bLajos Molnar mBitDepthAllocated = 8; 10173dd808754c641fe798273d356ee38368715fa7bLajos Molnar for (size_t ix = 0; ix < image.mNumPlanes; ++ix) { 10273dd808754c641fe798273d356ee38368715fa7bLajos Molnar mPlane[ix].mOffset = image.mPlane[ix].mOffset; 10373dd808754c641fe798273d356ee38368715fa7bLajos Molnar mPlane[ix].mColInc = image.mPlane[ix].mColInc; 10473dd808754c641fe798273d356ee38368715fa7bLajos Molnar mPlane[ix].mRowInc = image.mPlane[ix].mRowInc; 10573dd808754c641fe798273d356ee38368715fa7bLajos Molnar mPlane[ix].mHorizSubsampling = (int32_t)image.mPlane[ix].mHorizSubsampling; 10673dd808754c641fe798273d356ee38368715fa7bLajos Molnar mPlane[ix].mVertSubsampling = (int32_t)image.mPlane[ix].mVertSubsampling; 10773dd808754c641fe798273d356ee38368715fa7bLajos Molnar } 10873dd808754c641fe798273d356ee38368715fa7bLajos Molnar} 10973dd808754c641fe798273d356ee38368715fa7bLajos Molnar 11073dd808754c641fe798273d356ee38368715fa7bLajos Molnar/**************************************************************************************************/ 11173dd808754c641fe798273d356ee38368715fa7bLajos Molnar 1121ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kimconst char *GetComponentRole(bool isEncoder, const char *mime) { 1131ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim struct MimeToRole { 1141ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim const char *mime; 1151ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim const char *decoderRole; 1161ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim const char *encoderRole; 1171ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim }; 1181ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 1191ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim static const MimeToRole kMimeToRole[] = { 1201ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_MPEG, 1211ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.mp3", "audio_encoder.mp3" }, 1221ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I, 1231ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.mp1", "audio_encoder.mp1" }, 1241ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II, 1251ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.mp2", "audio_encoder.mp2" }, 1261ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_AMR_NB, 1271ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.amrnb", "audio_encoder.amrnb" }, 1281ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_AMR_WB, 1291ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.amrwb", "audio_encoder.amrwb" }, 1301ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_AAC, 1311ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.aac", "audio_encoder.aac" }, 1321ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_VORBIS, 1331ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.vorbis", "audio_encoder.vorbis" }, 1341ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_OPUS, 1351ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.opus", "audio_encoder.opus" }, 1361ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_G711_MLAW, 1371ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.g711mlaw", "audio_encoder.g711mlaw" }, 1381ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_G711_ALAW, 1391ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.g711alaw", "audio_encoder.g711alaw" }, 1401ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_VIDEO_AVC, 1411ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "video_decoder.avc", "video_encoder.avc" }, 1421ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_VIDEO_HEVC, 1431ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "video_decoder.hevc", "video_encoder.hevc" }, 1441ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_VIDEO_MPEG4, 1451ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "video_decoder.mpeg4", "video_encoder.mpeg4" }, 1461ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_VIDEO_H263, 1471ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "video_decoder.h263", "video_encoder.h263" }, 1481ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_VIDEO_VP8, 1491ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "video_decoder.vp8", "video_encoder.vp8" }, 1501ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_VIDEO_VP9, 1511ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "video_decoder.vp9", "video_encoder.vp9" }, 1521ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_RAW, 1531ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.raw", "audio_encoder.raw" }, 1541ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_VIDEO_DOLBY_VISION, 1551ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "video_decoder.dolby-vision", "video_encoder.dolby-vision" }, 1561ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_FLAC, 1571ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.flac", "audio_encoder.flac" }, 1581ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_MSGSM, 1591ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.gsm", "audio_encoder.gsm" }, 1601ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_VIDEO_MPEG2, 1611ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "video_decoder.mpeg2", "video_encoder.mpeg2" }, 1621ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_AC3, 1631ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.ac3", "audio_encoder.ac3" }, 1641ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim { MEDIA_MIMETYPE_AUDIO_EAC3, 1651ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim "audio_decoder.eac3", "audio_encoder.eac3" }, 166816e5eb2e9f9f18e001bbf7eab36654a1db2b168Chong Zhang { MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC, 167816e5eb2e9f9f18e001bbf7eab36654a1db2b168Chong Zhang "image_decoder.heic", "image_encoder.heic" }, 1681ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim }; 1691ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 1701ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim static const size_t kNumMimeToRole = 1711ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim sizeof(kMimeToRole) / sizeof(kMimeToRole[0]); 1721ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 1731ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim size_t i; 1741ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim for (i = 0; i < kNumMimeToRole; ++i) { 1751ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim if (!strcasecmp(mime, kMimeToRole[i].mime)) { 1761ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim break; 1771ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 1781ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 1791ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 1801ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim if (i == kNumMimeToRole) { 1811ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return NULL; 1821ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 1831ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 1841ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return isEncoder ? kMimeToRole[i].encoderRole 1851ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim : kMimeToRole[i].decoderRole; 1861ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim} 1871ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 188d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangstatus_t SetComponentRole(const sp<IOMXNode> &omxNode, const char *role) { 1891ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim OMX_PARAM_COMPONENTROLETYPE roleParams; 1901ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim InitOMXParams(&roleParams); 1911ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 1921ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim strncpy((char *)roleParams.cRole, 1931ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim role, OMX_MAX_STRINGNAME_SIZE - 1); 1941ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 1951ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 1961ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 197d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return omxNode->setParameter( 198d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang OMX_IndexParamStandardComponentRole, 1991ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim &roleParams, sizeof(roleParams)); 2001ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim} 2011ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2021ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kimbool DescribeDefaultColorFormat(DescribeColorFormat2Params ¶ms) { 2031ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim MediaImage2 &image = params.sMediaImage; 2041ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim memset(&image, 0, sizeof(image)); 2051ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2061ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mType = MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN; 2071ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mNumPlanes = 0; 2081ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2091ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim const OMX_COLOR_FORMATTYPE fmt = params.eColorFormat; 2101ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mWidth = params.nFrameWidth; 2111ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mHeight = params.nFrameHeight; 2121ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2131ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // only supporting YUV420 2141ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim if (fmt != OMX_COLOR_FormatYUV420Planar && 2151ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim fmt != OMX_COLOR_FormatYUV420PackedPlanar && 2161ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim fmt != OMX_COLOR_FormatYUV420SemiPlanar && 2171ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim fmt != OMX_COLOR_FormatYUV420PackedSemiPlanar && 2181ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim fmt != (OMX_COLOR_FORMATTYPE)HAL_PIXEL_FORMAT_YV12) { 2191ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim ALOGW("do not know color format 0x%x = %d", fmt, fmt); 2202d2a2967ce29281816b9ddb9434b3c0084e4ce52Chong Zhang if (fmt == OMX_COLOR_FormatYUV420Planar16) { 2212d2a2967ce29281816b9ddb9434b3c0084e4ce52Chong Zhang ALOGW("Cannot describe color format OMX_COLOR_FormatYUV420Planar16"); 2222d2a2967ce29281816b9ddb9434b3c0084e4ce52Chong Zhang } 2231ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return false; 2241ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 2251ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2261ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // TEMPORARY FIX for some vendors that advertise sliceHeight as 0 2271ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim if (params.nStride != 0 && params.nSliceHeight == 0) { 2281ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim ALOGW("using sliceHeight=%u instead of what codec advertised (=0)", 2291ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim params.nFrameHeight); 2301ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim params.nSliceHeight = params.nFrameHeight; 2311ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 2321ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2331ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // we need stride and slice-height to be non-zero and sensible. These values were chosen to 2341ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // prevent integer overflows further down the line, and do not indicate support for 2351ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // 32kx32k video. 2361ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim if (params.nStride == 0 || params.nSliceHeight == 0 2371ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim || params.nStride > 32768 || params.nSliceHeight > 32768) { 2381ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim ALOGW("cannot describe color format 0x%x = %d with stride=%u and sliceHeight=%u", 2391ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim fmt, fmt, params.nStride, params.nSliceHeight); 2401ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return false; 2411ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 2421ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2431ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // set-up YUV format 2441ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mType = MediaImage2::MEDIA_IMAGE_TYPE_YUV; 2451ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mNumPlanes = 3; 2461ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mBitDepth = 8; 2471ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mBitDepthAllocated = 8; 2481ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.Y].mOffset = 0; 2491ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.Y].mColInc = 1; 2501ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.Y].mRowInc = params.nStride; 2511ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.Y].mHorizSubsampling = 1; 2521ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.Y].mVertSubsampling = 1; 2531ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2541ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim switch ((int)fmt) { 2551ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim case HAL_PIXEL_FORMAT_YV12: 2561ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim if (params.bUsingNativeBuffers) { 2571ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim size_t ystride = align(params.nStride, 16); 2581ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim size_t cstride = align(params.nStride / 2, 16); 2591ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.Y].mRowInc = ystride; 2601ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2611ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mOffset = ystride * params.nSliceHeight; 2621ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mColInc = 1; 2631ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mRowInc = cstride; 2641ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mHorizSubsampling = 2; 2651ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mVertSubsampling = 2; 2661ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2671ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mOffset = image.mPlane[image.V].mOffset 2681ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim + (cstride * params.nSliceHeight / 2); 2691ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mColInc = 1; 2701ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mRowInc = cstride; 2711ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mHorizSubsampling = 2; 2721ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mVertSubsampling = 2; 2731ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim break; 2741ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } else { 2751ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // fall through as YV12 is used for YUV420Planar by some codecs 2761ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 2771ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2781ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim case OMX_COLOR_FormatYUV420Planar: 2791ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim case OMX_COLOR_FormatYUV420PackedPlanar: 2801ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 2811ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mColInc = 1; 2821ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mRowInc = params.nStride / 2; 2831ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mHorizSubsampling = 2; 2841ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mVertSubsampling = 2; 2851ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2861ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset 2871ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim + (params.nStride * params.nSliceHeight / 4); 2881ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mColInc = 1; 2891ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mRowInc = params.nStride / 2; 2901ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mHorizSubsampling = 2; 2911ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mVertSubsampling = 2; 2921ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim break; 2931ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 2941ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim case OMX_COLOR_FormatYUV420SemiPlanar: 2951ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // FIXME: NV21 for sw-encoder, NV12 for decoder and hw-encoder 2961ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim case OMX_COLOR_FormatYUV420PackedSemiPlanar: 2971ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // NV12 2981ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 2991ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mColInc = 2; 3001ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mRowInc = params.nStride; 3011ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mHorizSubsampling = 2; 3021ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.U].mVertSubsampling = 2; 3031ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 3041ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset + 1; 3051ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mColInc = 2; 3061ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mRowInc = params.nStride; 3071ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mHorizSubsampling = 2; 3081ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim image.mPlane[image.V].mVertSubsampling = 2; 3091ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim break; 3101ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 3111ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim default: 3121ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim TRESPASS(); 3131ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 3141ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return true; 3151ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim} 3161ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 3171ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kimbool DescribeColorFormat( 318d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang const sp<IOMXNode> &omxNode, 3191ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim DescribeColorFormat2Params &describeParams) 3201ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim{ 3211ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim OMX_INDEXTYPE describeColorFormatIndex; 322d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang if (omxNode->getExtensionIndex( 323d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang "OMX.google.android.index.describeColorFormat", 3241ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim &describeColorFormatIndex) == OK) { 3251ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim DescribeColorFormatParams describeParamsV1(describeParams); 326d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang if (omxNode->getParameter( 327d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang describeColorFormatIndex, 3281ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim &describeParamsV1, sizeof(describeParamsV1)) == OK) { 3291ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim describeParams.initFromV1(describeParamsV1); 3301ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return describeParams.sMediaImage.mType != MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN; 3311ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 332d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } else if (omxNode->getExtensionIndex( 333d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang "OMX.google.android.index.describeColorFormat2", &describeColorFormatIndex) == OK 334d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang && omxNode->getParameter( 335d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang describeColorFormatIndex, &describeParams, sizeof(describeParams)) == OK) { 3361ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return describeParams.sMediaImage.mType != MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN; 3371ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 3381ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 3391ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return DescribeDefaultColorFormat(describeParams); 3401ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim} 3411ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 3421ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim// static 3431ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kimbool IsFlexibleColorFormat( 344d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang const sp<IOMXNode> &omxNode, 3451ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim uint32_t colorFormat, bool usingNativeBuffers, OMX_U32 *flexibleEquivalent) { 3461ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim DescribeColorFormat2Params describeParams; 3471ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim InitOMXParams(&describeParams); 3481ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim describeParams.eColorFormat = (OMX_COLOR_FORMATTYPE)colorFormat; 3491ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // reasonable dummy values 3501ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim describeParams.nFrameWidth = 128; 3511ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim describeParams.nFrameHeight = 128; 3521ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim describeParams.nStride = 128; 3531ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim describeParams.nSliceHeight = 128; 3541ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim describeParams.bUsingNativeBuffers = (OMX_BOOL)usingNativeBuffers; 3551ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 3561ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim CHECK(flexibleEquivalent != NULL); 3571ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 358d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang if (!DescribeColorFormat(omxNode, describeParams)) { 3591ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return false; 3601ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 3611ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 3621ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim const MediaImage2 &img = describeParams.sMediaImage; 3631ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim if (img.mType == MediaImage2::MEDIA_IMAGE_TYPE_YUV) { 3641ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim if (img.mNumPlanes != 3 3651ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim || img.mPlane[img.Y].mHorizSubsampling != 1 3661ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim || img.mPlane[img.Y].mVertSubsampling != 1) { 3671ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return false; 3681ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 3691ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 3701ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // YUV 420 3711ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim if (img.mPlane[img.U].mHorizSubsampling == 2 3721ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim && img.mPlane[img.U].mVertSubsampling == 2 3731ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim && img.mPlane[img.V].mHorizSubsampling == 2 3741ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim && img.mPlane[img.V].mVertSubsampling == 2) { 3751ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim // possible flexible YUV420 format 3761ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim if (img.mBitDepth <= 8) { 3771ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim *flexibleEquivalent = OMX_COLOR_FormatYUV420Flexible; 3781ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return true; 3791ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 3801ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 3811ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim } 3821ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim return false; 3831ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim} 3841ad5b240bfd49aa918092dbdc18c1a24c5e6c3a4Wonsik Kim 38573dd808754c641fe798273d356ee38368715fa7bLajos Molnar} // namespace android 38673dd808754c641fe798273d356ee38368715fa7bLajos Molnar 387