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 &params) {
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 &params) {
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 &params) {
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