OMXCodec.cpp revision 2f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728c
1693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber/* 2693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * 4693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * you may not use this file except in compliance with the License. 6693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * You may obtain a copy of the License at 7693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * 8693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * 10693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * Unless required by applicable law or agreed to in writing, software 11693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * See the License for the specific language governing permissions and 14693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber * limitations under the License. 15693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber */ 16693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 17693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber//#define LOG_NDEBUG 0 18693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#define LOG_TAG "OMXCodec" 19693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <utils/Log.h> 20693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 21693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <binder/IServiceManager.h> 22693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <binder/MemoryDealer.h> 23693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <binder/ProcessState.h> 24693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/IMediaPlayerService.h> 25693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/ESDS.h> 26693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MediaBuffer.h> 27693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MediaBufferGroup.h> 28693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MediaDebug.h> 29693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MediaExtractor.h> 30693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MetaData.h> 31693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MmapSource.h> 32693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/OMXCodec.h> 33bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber#include <media/stagefright/Utils.h> 34693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <utils/Vector.h> 35693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 36693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <OMX_Audio.h> 37693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <OMX_Component.h> 38693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 39693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubernamespace android { 40693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 41693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstruct CodecInfo { 42693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime; 43693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *codec; 44693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}; 45693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 46693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const CodecInfo kDecoderInfo[] = { 47693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "image/jpeg", "OMX.TI.JPEG.decode" }, 48693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/mpeg", "OMX.TI.MP3.decode" }, 49693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/mpeg", "OMX.PV.mp3dec" }, 50693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/3gpp", "OMX.TI.AMR.decode" }, 51693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/3gpp", "OMX.PV.amrdec" }, 52456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber { "audio/amr-wb", "OMX.TI.WBAMR.decode" }, 53f75978f63a25e79c683e96611f95cb5cd49efd3dAndreas Huber { "audio/amr-wb", "OMX.PV.amrdec" }, 54693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/mp4a-latm", "OMX.TI.AAC.decode" }, 55693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/mp4a-latm", "OMX.PV.aacdec" }, 56693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.qcom.video.decoder.mpeg4" }, 57693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.TI.Video.Decoder" }, 58693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.PV.mpeg4dec" }, 59693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.qcom.video.decoder.h263" }, 60693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.TI.Video.Decoder" }, 61693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.PV.h263dec" }, 62693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/avc", "OMX.qcom.video.decoder.avc" }, 63693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/avc", "OMX.TI.Video.Decoder" }, 64693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/avc", "OMX.PV.avcdec" }, 65693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}; 66693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 67693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const CodecInfo kEncoderInfo[] = { 68693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/3gpp", "OMX.TI.AMR.encode" }, 69693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/3gpp", "OMX.PV.amrencnb" }, 70456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber { "audio/amr-wb", "OMX.TI.WBAMR.encode" }, 71693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/mp4a-latm", "OMX.TI.AAC.encode" }, 72693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/mp4a-latm", "OMX.PV.aacenc" }, 73693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.qcom.video.encoder.mpeg4" }, 74693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.TI.Video.encoder" }, 75693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.PV.mpeg4enc" }, 76693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.qcom.video.encoder.h263" }, 77693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.TI.Video.encoder" }, 78693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.PV.h263enc" }, 79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/avc", "OMX.TI.Video.encoder" }, 80693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/avc", "OMX.PV.avcenc" }, 81693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}; 82693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 837a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber#define CODEC_LOGV(x, ...) LOGV("[%s] "x, mComponentName, ##__VA_ARGS__) 847a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 85693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstruct OMXCodecObserver : public BnOMXObserver { 86693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMXCodecObserver(const wp<OMXCodec> &target) 87693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber : mTarget(target) { 88693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 89693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 90693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // from IOMXObserver 91693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual void on_message(const omx_message &msg) { 92693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<OMXCodec> codec = mTarget.promote(); 93693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 94693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (codec.get() != NULL) { 95693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->on_message(msg); 96693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 97693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 98693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 99693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprotected: 100693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual ~OMXCodecObserver() {} 101693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 102693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprivate: 103693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber wp<OMXCodec> mTarget; 104693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 105693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMXCodecObserver(const OMXCodecObserver &); 106693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMXCodecObserver &operator=(const OMXCodecObserver &); 107693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}; 108693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 109693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *GetCodec(const CodecInfo *info, size_t numInfos, 110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, int index) { 111693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(index >= 0); 112693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for(size_t i = 0; i < numInfos; ++i) { 113693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcasecmp(mime, info[i].mime)) { 114693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (index == 0) { 115693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return info[i].codec; 116693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 117693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 118693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber --index; 119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 121693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 122693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return NULL; 123693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 124693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 125bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huberenum { 126bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileBaseline = 0x42, 127bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileMain = 0x4d, 128bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileExtended = 0x58, 129bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh = 0x64, 130bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh10 = 0x6e, 131bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh422 = 0x7a, 132bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh444 = 0xf4, 133bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileCAVLC444Intra = 0x2c 134bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber}; 135bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 136bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huberstatic const char *AVCProfileToString(uint8_t profile) { 137bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber switch (profile) { 138bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileBaseline: 139bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "Baseline"; 140bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileMain: 141bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "Main"; 142bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileExtended: 143bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "Extended"; 144bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh: 145bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High"; 146bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh10: 147bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High 10"; 148bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh422: 149bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High 422"; 150bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh444: 151bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High 444"; 152bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileCAVLC444Intra: 153bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "CAVLC 444 Intra"; 154bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber default: return "Unknown"; 155bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber } 156bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber} 157bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 1587a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Hubertemplate<class T> 1597a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huberstatic void InitOMXParams(T *params) { 1607a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber params->nSize = sizeof(T); 1617a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber params->nVersion.s.nVersionMajor = 1; 1627a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber params->nVersion.s.nVersionMinor = 0; 1637a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber params->nVersion.s.nRevision = 0; 1647a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber params->nVersion.s.nStep = 0; 1657a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber} 1667a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber// static 168693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersp<OMXCodec> OMXCodec::Create( 169693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<IOMX> &omx, 170693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<MetaData> &meta, bool createEncoder, 171693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<MediaSource> &source) { 172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime; 173693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool success = meta->findCString(kKeyMIMEType, &mime); 174693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(success); 175693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *componentName = NULL; 177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::node_id node = 0; 178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (int index = 0;; ++index) { 179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (createEncoder) { 180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber componentName = GetCodec( 181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kEncoderInfo, sizeof(kEncoderInfo) / sizeof(kEncoderInfo[0]), 182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mime, index); 183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber componentName = GetCodec( 185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kDecoderInfo, sizeof(kDecoderInfo) / sizeof(kDecoderInfo[0]), 186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mime, index); 187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 189693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!componentName) { 190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return NULL; 191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("Attempting to allocate OMX node '%s'", componentName); 194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = omx->allocate_node(componentName, &node); 196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err == OK) { 197b7802d9ee9c9dbb471ae4f010bd67ba1aaa9f264Andreas Huber LOGI("Successfully allocated OMX node '%s'", componentName); 198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber uint32_t quirks = 0; 203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(componentName, "OMX.PV.avcdec")) { 204dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber quirks |= kWantsNALFragments; 205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(componentName, "OMX.TI.MP3.decode")) { 207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kNeedsFlushBeforeDisable; 208693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 209693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(componentName, "OMX.TI.AAC.decode")) { 210693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kNeedsFlushBeforeDisable; 2111beb760d920561679862ded945a04e370368c7f7Andreas Huber quirks |= kRequiresFlushCompleteEmulation; 2128297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 2138297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber // The following is currently necessary for proper shutdown 2148297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber // behaviour, but NOT enabled by default in order to make the 2158297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber // bug reproducible... 2168297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber // quirks |= kRequiresFlushBeforeShutdown; 217693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 218693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strncmp(componentName, "OMX.qcom.video.encoder.", 23)) { 219693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kRequiresLoadedToIdleAfterAllocation; 220693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kRequiresAllocateBufferOnInputPorts; 221693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 222b7802d9ee9c9dbb471ae4f010bd67ba1aaa9f264Andreas Huber if (!strncmp(componentName, "OMX.qcom.video.decoder.", 23)) { 223b7802d9ee9c9dbb471ae4f010bd67ba1aaa9f264Andreas Huber // XXX Required on P....on only. 224b7802d9ee9c9dbb471ae4f010bd67ba1aaa9f264Andreas Huber quirks |= kRequiresAllocateBufferOnOutputPorts; 225b7802d9ee9c9dbb471ae4f010bd67ba1aaa9f264Andreas Huber } 226693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 227693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<OMXCodec> codec = new OMXCodec( 228693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber omx, node, quirks, createEncoder, mime, componentName, 229693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber source); 230693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 231693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber uint32_t type; 232693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const void *data; 233693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t size; 234693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (meta->findData(kKeyESDS, &type, &data, &size)) { 235693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ESDS esds((const char *)data, size); 236693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(esds.InitCheck(), OK); 237693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 238693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const void *codec_specific_data; 239693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t codec_specific_data_size; 240693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber esds.getCodecSpecificInfo( 241693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &codec_specific_data, &codec_specific_data_size); 242693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 243693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("found codec-specific data of size %d\n", 244693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec_specific_data_size); 245693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 246693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->addCodecSpecificData( 247693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec_specific_data, codec_specific_data_size); 248693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (meta->findData(kKeyAVCC, &type, &data, &size)) { 249693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("found avcc of size %d\n", size); 250693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 251bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // Parse the AVCDecoderConfigurationRecord 252bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 253bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber const uint8_t *ptr = (const uint8_t *)data; 254bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 255bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 7); 256bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK_EQ(ptr[0], 1); // configurationVersion == 1 257bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber uint8_t profile = ptr[1]; 258bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber uint8_t level = ptr[3]; 259bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 260bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK((ptr[4] >> 2) == 0x3f); // reserved 261bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 262bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t lengthSize = 1 + (ptr[4] & 3); 263bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 264bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // commented out check below as H264_QVGA_500_NO_AUDIO.3gp 265bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // violates it... 266bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // CHECK((ptr[5] >> 5) == 7); // reserved 267bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 268bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t numSeqParameterSets = ptr[5] & 31; 269bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 270bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ptr += 6; 271693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size -= 6; 272bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 273bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber for (size_t i = 0; i < numSeqParameterSets; ++i) { 274bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 2); 275bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t length = U16_AT(ptr); 276693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 277693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ptr += 2; 278693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size -= 2; 279693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 280bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= length); 281bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 282bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber codec->addCodecSpecificData(ptr, length); 283bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 284bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ptr += length; 285bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size -= length; 286bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber } 287bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 288bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 1); 289bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t numPictureParameterSets = *ptr; 290bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ++ptr; 291bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber --size; 292bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 293bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber for (size_t i = 0; i < numPictureParameterSets; ++i) { 294bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 2); 295bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t length = U16_AT(ptr); 296bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 297bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ptr += 2; 298bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size -= 2; 299693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 300693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(size >= length); 301693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 302693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->addCodecSpecificData(ptr, length); 303693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 304693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ptr += length; 305693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size -= length; 306bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber } 307693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 308bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber LOGI("AVC profile = %d (%s), level = %d", 309bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber (int)profile, AVCProfileToString(profile), (int)level / 10); 310693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 311bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber if (!strcmp(componentName, "OMX.TI.Video.Decoder") 312bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber && (profile != kAVCProfileBaseline || level > 39)) { 313bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // This stream exceeds the decoder's capabilities. 314bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 315bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber LOGE("Profile and/or level exceed the decoder's capabilities."); 316bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return NULL; 317693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 318693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 319693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 320693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcasecmp("audio/3gpp", mime)) { 321693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setAMRFormat(); 322693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 323456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber if (!strcasecmp("audio/amr-wb", mime)) { 324456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber codec->setAMRWBFormat(); 325456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber } 326e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (!strcasecmp("audio/mp4a-latm", mime)) { 32737940eefcba982836b579fe1ffec6cada72b0974Andreas Huber int32_t numChannels, sampleRate; 32837940eefcba982836b579fe1ffec6cada72b0974Andreas Huber CHECK(meta->findInt32(kKeyChannelCount, &numChannels)); 32937940eefcba982836b579fe1ffec6cada72b0974Andreas Huber CHECK(meta->findInt32(kKeySampleRate, &sampleRate)); 33037940eefcba982836b579fe1ffec6cada72b0974Andreas Huber 33137940eefcba982836b579fe1ffec6cada72b0974Andreas Huber codec->setAACFormat(numChannels, sampleRate); 332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strncasecmp(mime, "video/", 6)) { 334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t width, height; 335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool success = meta->findInt32(kKeyWidth, &width); 336693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber success = success && meta->findInt32(kKeyHeight, &height); 3377530e9c708275c273c134c36c68179f511c1940eAndreas Huber CHECK(success); 338693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 339693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (createEncoder) { 340693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setVideoInputFormat(mime, width, height); 341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setVideoOutputFormat(mime, width, height); 343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 345693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcasecmp(mime, "image/jpeg") 346693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && !strcmp(componentName, "OMX.TI.JPEG.decode")) { 347693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE format = 348693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_Format32bitARGB8888; 349693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // OMX_COLOR_FormatYUV420PackedPlanar; 350693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // OMX_COLOR_FormatCbYCrY; 351693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // OMX_COLOR_FormatYUV411Planar; 352693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 353693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t width, height; 354693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool success = meta->findInt32(kKeyWidth, &width); 355693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber success = success && meta->findInt32(kKeyHeight, &height); 3567530e9c708275c273c134c36c68179f511c1940eAndreas Huber 3577530e9c708275c273c134c36c68179f511c1940eAndreas Huber int32_t compressedSize; 3587530e9c708275c273c134c36c68179f511c1940eAndreas Huber success = success && meta->findInt32( 359e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber kKeyMaxInputSize, &compressedSize); 3607530e9c708275c273c134c36c68179f511c1940eAndreas Huber 3617530e9c708275c273c134c36c68179f511c1940eAndreas Huber CHECK(success); 3627530e9c708275c273c134c36c68179f511c1940eAndreas Huber CHECK(compressedSize > 0); 363693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 364693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setImageOutputFormat(format, width, height); 3657530e9c708275c273c134c36c68179f511c1940eAndreas Huber codec->setJPEGInputFormat(width, height, (OMX_U32)compressedSize); 366693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 367693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 368e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber int32_t maxInputSize; 369e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (createEncoder && meta->findInt32(kKeyMaxInputSize, &maxInputSize)) { 370e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber codec->setMinBufferSize(kPortIndexInput, (OMX_U32)maxInputSize); 371e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 372e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 373e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (!strcmp(componentName, "OMX.TI.AMR.encode") 374e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber || !strcmp(componentName, "OMX.TI.WBAMR.encode")) { 375e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber codec->setMinBufferSize(kPortIndexOutput, 8192); // XXX 376e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 377e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 378693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->initOutputFormat(meta); 379693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 380693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return codec; 381693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 382693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 383e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Hubervoid OMXCodec::setMinBufferSize(OMX_U32 portIndex, OMX_U32 size) { 384e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 3857a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 386e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber def.nPortIndex = portIndex; 387e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 388e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber status_t err = mOMX->get_parameter( 389e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 390e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(err, OK); 391e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 392e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (def.nBufferSize < size) { 393e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber def.nBufferSize = size; 394e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 395e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 396e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 397e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber err = mOMX->set_parameter( 398e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 399e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(err, OK); 400e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber} 401e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 402693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::setVideoPortFormatType( 403693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex, 404693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 405693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE colorFormat) { 406693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 4077a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&format); 408693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nPortIndex = portIndex; 409693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nIndex = 0; 410693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool found = false; 411693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 412693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 index = 0; 413693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (;;) { 414693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nIndex = index; 415693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 416693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 417693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 418693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 419693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 420693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 421693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 422693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 423693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // The following assertion is violated by TI's video decoder. 4247530e9c708275c273c134c36c68179f511c1940eAndreas Huber // CHECK_EQ(format.nIndex, index); 425693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 426693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1 427693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGI("portIndex: %ld, index: %ld, eCompressionFormat=%d eColorFormat=%d", 428693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber portIndex, 429693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber index, format.eCompressionFormat, format.eColorFormat); 430693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 431693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 432693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp("OMX.TI.Video.encoder", mComponentName)) { 433693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexInput 434693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && colorFormat == format.eColorFormat) { 435693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // eCompressionFormat does not seem right. 436693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber found = true; 437693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 438693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 439693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexOutput 440693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && compressionFormat == format.eCompressionFormat) { 441693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // eColorFormat does not seem right. 442693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber found = true; 443693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 444693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 445693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 446693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 447693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (format.eCompressionFormat == compressionFormat 448693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && format.eColorFormat == colorFormat) { 449693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber found = true; 450693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 451693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 452693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 453693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++index; 454693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 455693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 456693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!found) { 457693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return UNKNOWN_ERROR; 458693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 459693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 460693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGI("found a match."); 461693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->set_parameter( 462693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 463693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 464693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 465693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 466693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 467693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 468693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setVideoInputFormat( 469693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, OMX_U32 width, OMX_U32 height) { 470693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGI("setVideoInputFormat width=%ld, height=%ld", width, height); 471693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 472693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused; 473693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcasecmp("video/avc", mime)) { 474693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingAVC; 475693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (!strcasecmp("video/mp4v-es", mime)) { 476693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingMPEG4; 477693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (!strcasecmp("video/3gpp", mime)) { 478693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingH263; 479693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 480693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("Not a supported video mime type: %s", mime); 481693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Should not be here. Not a supported video mime type."); 482693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 483693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 484693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE colorFormat = 485693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 0 ? OMX_COLOR_FormatYCbYCr : OMX_COLOR_FormatCbYCrY; 486693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 487693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strncmp("OMX.qcom.video.encoder.", mComponentName, 23)) { 488693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 489693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 490693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 491693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setVideoPortFormatType( 492693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kPortIndexInput, OMX_VIDEO_CodingUnused, 493693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormat); 494693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 495693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setVideoPortFormatType( 496693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused); 497693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 498693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 4997a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 500693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 501693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 5027a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 5037a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 504693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 505693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 506693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 507693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 508693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 509693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 510693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 511693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 512693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 513693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eCompressionFormat = compressionFormat; 514693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 515693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 516693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 517693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 518693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 519693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 520693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber //////////////////////////////////////////////////////////////////////////// 521693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 5227a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 523693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 524693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 525693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->get_parameter( 526693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 527693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 528693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 529693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = (width * height * 2); // (width * height * 3) / 2; 5307a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber LOGI("Setting nBufferSize = %ld", def.nBufferSize); 531693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 532693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 533693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 534693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 535693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 536693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eCompressionFormat = OMX_VIDEO_CodingUnused; 537693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eColorFormat = colorFormat; 538693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 539693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 540693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 541693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 542693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 543693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 544693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setVideoOutputFormat( 545693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, OMX_U32 width, OMX_U32 height) { 546693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGI("setVideoOutputFormat width=%ld, height=%ld", width, height); 547693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 548693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused; 549693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcasecmp("video/avc", mime)) { 550693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingAVC; 551693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (!strcasecmp("video/mp4v-es", mime)) { 552693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingMPEG4; 553693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (!strcasecmp("video/3gpp", mime)) { 554693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingH263; 555693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 556693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("Not a supported video mime type: %s", mime); 557693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Should not be here. Not a supported video mime type."); 558693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 559693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 560693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setVideoPortFormatType( 561693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused); 562693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 563693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1 564693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 565693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 5667a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&format); 567693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nPortIndex = kPortIndexOutput; 568693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nIndex = 0; 569693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 570693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 571693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 572693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 573693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 574693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(format.eCompressionFormat, OMX_VIDEO_CodingUnused); 575693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 576693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const int OMX_QCOM_COLOR_FormatYVU420SemiPlanar = 0x7FA30C00; 577693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 578693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(format.eColorFormat == OMX_COLOR_FormatYUV420Planar 579693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || format.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar 580693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || format.eColorFormat == OMX_COLOR_FormatCbYCrY 581693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || format.eColorFormat == OMX_QCOM_COLOR_FormatYVU420SemiPlanar); 582693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 583693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 584693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 585693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 586693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 587693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 588693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 589693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 590693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 5917a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 592693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 593693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 5947a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 5957a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 596693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 597693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 598693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 599693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 600693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 601693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1 602693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // XXX Need a (much) better heuristic to compute input buffer sizes. 603693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const size_t X = 64 * 1024; 604693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (def.nBufferSize < X) { 605693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = X; 606693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 607693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 608693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 609693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 610693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 611693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 612693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 613693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 614693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 615693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 616693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 617693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 618693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 619693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 620693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber //////////////////////////////////////////////////////////////////////////// 621693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 6227a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 623693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 624693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 625693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->get_parameter( 626693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 627693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 628693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 629693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 630693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 0 631693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = 632693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber (((width + 15) & -16) * ((height + 15) & -16) * 3) / 2; // YUV420 633693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 634693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 635693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 636693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 637693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 638693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 639693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 640693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 641693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 642693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 643693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 644693d271e62a3726689ff68f4505ba49228eb94b2Andreas HuberOMXCodec::OMXCodec( 645693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<IOMX> &omx, IOMX::node_id node, uint32_t quirks, 646bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber bool isEncoder, 647693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, 648693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *componentName, 649693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<MediaSource> &source) 650693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber : mOMX(omx), 651693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode(node), 652693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mQuirks(quirks), 653693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mIsEncoder(isEncoder), 654693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mMIME(strdup(mime)), 655693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mComponentName(strdup(componentName)), 656693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSource(source), 657693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificDataIndex(0), 658693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mState(LOADED), 659284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber mInitialBufferSubmit(true), 660693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS(false), 661693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData(false), 662693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs(-1) { 663693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexInput] = ENABLED; 664693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexOutput] = ENABLED; 665693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 666693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mObserver = new OMXCodecObserver(this); 667693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->observe_node(mNode, mObserver); 6687a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 6697a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber setComponentRole(); 6707a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber} 6717a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 6727a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Hubervoid OMXCodec::setComponentRole() { 6737a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber struct MimeToRole { 6747a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber const char *mime; 6757a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber const char *decoderRole; 6767a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber const char *encoderRole; 6777a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber }; 6787a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 6797a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber static const MimeToRole kMimeToRole[] = { 6807a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber { "audio/mpeg", "audio_decoder.mp3", "audio_encoder.mp3" }, 6817a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber { "audio/3gpp", "audio_decoder.amrnb", "audio_encoder.amrnb" }, 682456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber { "audio/amr-wb", "audio_decoder.amrwb", "audio_encoder.amrwb" }, 6837a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber { "audio/mp4a-latm", "audio_decoder.aac", "audio_encoder.aac" }, 6847a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber { "video/avc", "video_decoder.avc", "video_encoder.avc" }, 6857a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber { "video/mp4v-es", "video_decoder.mpeg4", "video_encoder.mpeg4" }, 6867a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber { "video/3gpp", "video_decoder.h263", "video_encoder.h263" }, 6877a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber }; 6887a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 6897a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber static const size_t kNumMimeToRole = 6907a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber sizeof(kMimeToRole) / sizeof(kMimeToRole[0]); 6917a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 6927a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber size_t i; 6937a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber for (i = 0; i < kNumMimeToRole; ++i) { 6947a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber if (!strcasecmp(mMIME, kMimeToRole[i].mime)) { 6957a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber break; 6967a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber } 6977a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber } 6987a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 6997a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber if (i == kNumMimeToRole) { 7007a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber return; 7017a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber } 7027a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 7037a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber const char *role = 7047a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber mIsEncoder ? kMimeToRole[i].encoderRole 7057a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber : kMimeToRole[i].decoderRole; 7067a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 7077a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber if (role != NULL) { 7087a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Setting component role '%s'.", role); 7097a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 7107a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber OMX_PARAM_COMPONENTROLETYPE roleParams; 7117a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&roleParams); 7127a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 7137a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber strncpy((char *)roleParams.cRole, 7147a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber role, OMX_MAX_STRINGNAME_SIZE - 1); 7157a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 7167a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 7177a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 7187a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber status_t err = mOMX->set_parameter( 7197a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber mNode, OMX_IndexParamStandardComponentRole, 7207a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber &roleParams, sizeof(roleParams)); 7217a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 7227a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber if (err != OK) { 7237a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber LOGW("Failed to set standard component role '%s'.", role); 7247a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber } 7257a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber } 726693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 727693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 728693d271e62a3726689ff68f4505ba49228eb94b2Andreas HuberOMXCodec::~OMXCodec() { 729dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber CHECK(mState == LOADED || mState == ERROR); 730693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 731693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->observe_node(mNode, NULL); 732693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 733693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 734693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->free_node(mNode); 735693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 736693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 737693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode = NULL; 738693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(DEAD); 739693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 740693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber clearCodecSpecificData(); 741693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 742693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(mComponentName); 743693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mComponentName = NULL; 744bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 745693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(mMIME); 746693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mMIME = NULL; 747693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 748693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 749693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::init() { 750284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // mLock is held. 751693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 752693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, LOADED); 753693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 754693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err; 755693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!(mQuirks & kRequiresLoadedToIdleAfterAllocation)) { 756693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->send_command(mNode, OMX_CommandStateSet, OMX_StateIdle); 757693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 758693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(LOADED_TO_IDLE); 759693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 760693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 761693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = allocateBuffers(); 762693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 763693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 764693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mQuirks & kRequiresLoadedToIdleAfterAllocation) { 765693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->send_command(mNode, OMX_CommandStateSet, OMX_StateIdle); 766693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 767693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 768693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(LOADED_TO_IDLE); 769693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 770693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 771693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (mState != EXECUTING && mState != ERROR) { 772693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.wait(mLock); 773693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 774693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 775693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return mState == ERROR ? UNKNOWN_ERROR : OK; 776693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 777693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 778693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber// static 779693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberbool OMXCodec::isIntermediateState(State state) { 780693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return state == LOADED_TO_IDLE 781693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == IDLE_TO_EXECUTING 782693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == EXECUTING_TO_IDLE 783693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == IDLE_TO_LOADED 784693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == RECONFIGURING; 785693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 786693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 787693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::allocateBuffers() { 788693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = allocateBuffersOnPort(kPortIndexInput); 789693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 790693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 791693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 792693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 793693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 794693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return allocateBuffersOnPort(kPortIndexOutput); 795693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 796693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 797693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) { 798693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 7997a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 800693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = portIndex; 801693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 802693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 803693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 804693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 805693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 806693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 807693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 808693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 8097530e9c708275c273c134c36c68179f511c1940eAndreas Huber size_t totalSize = def.nBufferCountActual * def.nBufferSize; 8107530e9c708275c273c134c36c68179f511c1940eAndreas Huber mDealer[portIndex] = new MemoryDealer(totalSize); 8117530e9c708275c273c134c36c68179f511c1940eAndreas Huber 812693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { 8137530e9c708275c273c134c36c68179f511c1940eAndreas Huber sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize); 814693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mem.get() != NULL); 815693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 816693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::buffer_id buffer; 817693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexInput 818693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && (mQuirks & kRequiresAllocateBufferOnInputPorts)) { 819693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->allocate_buffer_with_backup( 820693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, portIndex, mem, &buffer); 821ea7d15629752256f6ea1d5c6ea796e59aefd030fAndreas Huber } else if (portIndex == kPortIndexOutput 822ea7d15629752256f6ea1d5c6ea796e59aefd030fAndreas Huber && (mQuirks & kRequiresAllocateBufferOnOutputPorts)) { 823ea7d15629752256f6ea1d5c6ea796e59aefd030fAndreas Huber err = mOMX->allocate_buffer( 824ea7d15629752256f6ea1d5c6ea796e59aefd030fAndreas Huber mNode, portIndex, def.nBufferSize, &buffer); 825693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 826693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->use_buffer(mNode, portIndex, mem, &buffer); 827693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 828693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 829693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 830693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("allocate_buffer_with_backup failed"); 831693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 832693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 833693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 834693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo info; 835693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mBuffer = buffer; 836693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mOwnedByComponent = false; 837693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMem = mem; 838693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMediaBuffer = NULL; 839693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 840693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexOutput) { 841693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMediaBuffer = new MediaBuffer(mem->pointer(), mem->size()); 842693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMediaBuffer->setObserver(this); 843693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 844693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 845693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[portIndex].push(info); 846693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 8477a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("allocated buffer %p on %s port", buffer, 848693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber portIndex == kPortIndexInput ? "input" : "output"); 849693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 850693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 851693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber dumpPortStatus(portIndex); 852693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 853693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 854693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 855693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 856693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::on_message(const omx_message &msg) { 857693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 858693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 859693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (msg.type) { 860693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case omx_message::EVENT: 861693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 862693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onEvent( 863693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.event_data.event, msg.u.event_data.data1, 864693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.event_data.data2); 865693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 866693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 867693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 868693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 869693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 870693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 871693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer; 872693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 8737a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("EMPTY_BUFFER_DONE(buffer: %p)", buffer); 874693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 875693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput]; 876693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t i = 0; 877693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (i < buffers->size() && (*buffers)[i].mBuffer != buffer) { 878693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++i; 879693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 880693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 881693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(i < buffers->size()); 882693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!(*buffers)[i].mOwnedByComponent) { 883693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGW("We already own input buffer %p, yet received " 884693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "an EMPTY_BUFFER_DONE.", buffer); 885693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 886693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 887693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->editItemAt(i).mOwnedByComponent = false; 888693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 889693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mPortStatus[kPortIndexInput] == DISABLING) { 8907a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Port is disabled, freeing buffer %p", buffer); 891693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 892693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 893693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->free_buffer(mNode, kPortIndexInput, buffer); 894693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 895693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 896693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->removeAt(i); 897693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (mPortStatus[kPortIndexInput] != SHUTTING_DOWN) { 898693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[kPortIndexInput], ENABLED); 899693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffer(&buffers->editItemAt(i)); 900693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 901693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 902693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 903693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 904693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 905693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case omx_message::FILL_BUFFER_DONE: 906693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 907693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer; 908693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 flags = msg.u.extended_buffer_data.flags; 909693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 9107a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("FILL_BUFFER_DONE(buffer: %p, size: %ld, flags: 0x%08lx)", 911693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer, 912693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.range_length, 913693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber flags); 914693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 9157a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("FILL_BUFFER_DONE(timestamp: %lld us (%.2f secs))", 916693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.timestamp, 917693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.timestamp / 1E6); 918693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 919693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 920693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t i = 0; 921693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (i < buffers->size() && (*buffers)[i].mBuffer != buffer) { 922693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++i; 923693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 924693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 925693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(i < buffers->size()); 926693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &buffers->editItemAt(i); 927693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 928693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!info->mOwnedByComponent) { 929693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGW("We already own output buffer %p, yet received " 930693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "a FILL_BUFFER_DONE.", buffer); 931693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 932693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 933693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mOwnedByComponent = false; 934693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 935693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mPortStatus[kPortIndexOutput] == DISABLING) { 9367a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Port is disabled, freeing buffer %p", buffer); 937693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 938693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 939693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->free_buffer(mNode, kPortIndexOutput, buffer); 940693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 941693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 942693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->removeAt(i); 943355edcea2f15c0f619c1e1d0f4fa433b0d38098fAndreas Huber } else if (mPortStatus[kPortIndexOutput] == ENABLED 944355edcea2f15c0f619c1e1d0f4fa433b0d38098fAndreas Huber && (flags & OMX_BUFFERFLAG_EOS)) { 9457a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("No more output data."); 946693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = true; 947693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.signal(); 948693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (mPortStatus[kPortIndexOutput] != SHUTTING_DOWN) { 949693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[kPortIndexOutput], ENABLED); 950bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 951693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaBuffer *buffer = info->mMediaBuffer; 952693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 953693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->set_range( 954693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.range_offset, 955693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.range_length); 956693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 957693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->clear(); 958693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 959693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setInt32( 960693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyTimeUnits, 961693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber (msg.u.extended_buffer_data.timestamp + 500) / 1000); 962693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 963693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setInt32( 964693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyTimeScale, 1000); 965693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 966693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (msg.u.extended_buffer_data.flags & OMX_BUFFERFLAG_SYNCFRAME) { 967693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setInt32(kKeyIsSyncFrame, true); 968693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 969693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 970693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setPointer( 971693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyPlatformPrivate, 972693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.platform_private); 973693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 974693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setPointer( 975693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyBufferID, 976693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.buffer); 977693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 978693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.push_back(i); 979693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.signal(); 980693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 981693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 982693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 983693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 984693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 985693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 986693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 987693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 988693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 989693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 990693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 991693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 992693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 993693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 994693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (event) { 995693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventCmdComplete: 996693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 997693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onCmdComplete((OMX_COMMANDTYPE)data1, data2); 998693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 999693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1000693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1001693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventError: 1002693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1003693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("ERROR(%ld, %ld)", data1, data2); 1004693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1005693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(ERROR); 1006693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1007693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1008693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1009693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventPortSettingsChanged: 1010693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1011693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onPortSettingsChanged(data1); 1012693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1013693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1014693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1015693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventBufferFlag: 1016693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 10177a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("EVENT_BUFFER_FLAG(%ld)", data1); 1018693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1019693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (data1 == kPortIndexOutput) { 1020693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = true; 1021693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1022693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1023693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1024693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1025693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1026693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 10277a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("EVENT(%d, %ld, %ld)", event, data1, data2); 1028693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1029693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1030693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1031693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1032693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1033693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data) { 1034693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (cmd) { 1035693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandStateSet: 1036693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1037693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onStateChange((OMX_STATETYPE)data); 1038693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1039693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1040693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1041693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandPortDisable: 1042693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1043693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex = data; 10447a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("PORT_DISABLED(%ld)", portIndex); 1045693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1046693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1047693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], DISABLING); 1048693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortBuffers[portIndex].size(), 0); 1049693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1050693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = DISABLED; 1051693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1052693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == RECONFIGURING) { 1053693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 1054693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1055693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber enablePortAsync(portIndex); 1056693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1057693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = allocateBuffersOnPort(portIndex); 1058693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1059693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1060693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1061693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1062693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1063693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandPortEnable: 1064693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1065693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex = data; 10667a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("PORT_ENABLED(%ld)", portIndex); 1067693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1068693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1069693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], ENABLING); 1070693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1071693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = ENABLED; 1072693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1073693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == RECONFIGURING) { 1074693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 1075693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1076693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(EXECUTING); 1077693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1078693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffers(); 1079693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1080693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1081693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1082693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1083693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandFlush: 1084693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1085693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex = data; 1086693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 10877a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("FLUSH_DONE(%ld)", portIndex); 1088693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1089693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], SHUTTING_DOWN); 1090693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = ENABLED; 1091693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1092693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(countBuffersWeOwn(mPortBuffers[portIndex]), 1093693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[portIndex].size()); 1094693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1095693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == RECONFIGURING) { 1096693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 1097693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1098693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber disablePortAsync(portIndex); 10998297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } else if (mState == EXECUTING_TO_IDLE) { 11008297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber if (mPortStatus[kPortIndexInput] == ENABLED 11018297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber && mPortStatus[kPortIndexOutput] == ENABLED) { 11027a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Finished flushing both ports, now completing " 11038297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber "transition from EXECUTING to IDLE."); 11048297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 11058297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber mPortStatus[kPortIndexInput] = SHUTTING_DOWN; 11068297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber mPortStatus[kPortIndexOutput] = SHUTTING_DOWN; 11078297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 11088297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber status_t err = 11098297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber mOMX->send_command(mNode, OMX_CommandStateSet, OMX_StateIdle); 11108297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber CHECK_EQ(err, OK); 11118297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } 1112693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1113693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // We're flushing both ports in preparation for seeking. 1114693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1115693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mPortStatus[kPortIndexInput] == ENABLED 1116693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && mPortStatus[kPortIndexOutput] == ENABLED) { 11177a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Finished flushing both ports, now continuing from" 1118693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber " seek-time."); 1119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffers(); 1121693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffers(); 1122693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1123693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1124693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1125693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1126693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1127693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1128693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1129693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 11307a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("CMD_COMPLETE(%d, %ld)", cmd, data); 1131693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1132693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1133693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1134693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1135693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1136693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onStateChange(OMX_STATETYPE newState) { 1137693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (newState) { 1138693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_StateIdle: 1139693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 11407a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Now Idle."); 1141693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == LOADED_TO_IDLE) { 1142693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->send_command( 1143693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_CommandStateSet, OMX_StateExecuting); 1144693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1145693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1146693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1147693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(IDLE_TO_EXECUTING); 1148693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1149693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING_TO_IDLE); 1150693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1151693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ( 1152693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber countBuffersWeOwn(mPortBuffers[kPortIndexInput]), 1153693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[kPortIndexInput].size()); 1154693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1155693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ( 1156693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber countBuffersWeOwn(mPortBuffers[kPortIndexOutput]), 1157693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[kPortIndexOutput].size()); 1158693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1159693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->send_command( 1160693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_CommandStateSet, OMX_StateLoaded); 1161693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1162693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1163693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1164693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = freeBuffersOnPort(kPortIndexInput); 1165693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1166693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = freeBuffersOnPort(kPortIndexOutput); 1168693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1169693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1170693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexInput] = ENABLED; 1171693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexOutput] = ENABLED; 1172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1173693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(IDLE_TO_LOADED); 1174693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1175693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_StateExecuting: 1179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, IDLE_TO_EXECUTING); 1181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 11827a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Now Executing."); 1183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(EXECUTING); 1185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1186284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // Buffers will be submitted to the component in the first 1187284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // call to OMXCodec::read as mInitialBufferSubmit is true at 1188284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // this point. This ensures that this on_message call returns, 1189284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // releases the lock and ::init can notice the state change and 1190284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // itself return. 1191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_StateLoaded: 1195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, IDLE_TO_LOADED); 1197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 11987a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Now Loaded."); 1199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(LOADED); 1201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1208693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1209693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1210693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1211693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1212693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber// static 1213693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersize_t OMXCodec::countBuffersWeOwn(const Vector<BufferInfo> &buffers) { 1214693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t n = 0; 1215693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers.size(); ++i) { 1216693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!buffers[i].mOwnedByComponent) { 1217693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++n; 1218693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1219693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1220693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1221693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return n; 1222693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1223693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1224693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::freeBuffersOnPort( 1225693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex, bool onlyThoseWeOwn) { 1226693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 1227693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1228693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t stickyErr = OK; 1229693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1230693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = buffers->size(); i-- > 0;) { 1231693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &buffers->editItemAt(i); 1232693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1233693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (onlyThoseWeOwn && info->mOwnedByComponent) { 1234693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber continue; 1235693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1236693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1237693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mOwnedByComponent, false); 1238693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1239693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1240693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->free_buffer(mNode, portIndex, info->mBuffer); 1241693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1242693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 1243693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber stickyErr = err; 1244693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1245693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1246693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (info->mMediaBuffer != NULL) { 1247693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMediaBuffer->setObserver(NULL); 1248693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1249693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // Make sure nobody but us owns this buffer at this point. 1250693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mMediaBuffer->refcount(), 0); 1251693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1252693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMediaBuffer->release(); 1253693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1254693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1255693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->removeAt(i); 1256693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1257693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1258693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(onlyThoseWeOwn || buffers->isEmpty()); 1259693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1260693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return stickyErr; 1261693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1262693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1263693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onPortSettingsChanged(OMX_U32 portIndex) { 12647a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("PORT_SETTINGS_CHANGED(%ld)", portIndex); 1265693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1266693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING); 1267693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 1268693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(RECONFIGURING); 1269693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1270693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mQuirks & kNeedsFlushBeforeDisable) { 12711beb760d920561679862ded945a04e370368c7f7Andreas Huber if (!flushPortAsync(portIndex)) { 12721beb760d920561679862ded945a04e370368c7f7Andreas Huber onCmdComplete(OMX_CommandFlush, portIndex); 12731beb760d920561679862ded945a04e370368c7f7Andreas Huber } 1274693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1275693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber disablePortAsync(portIndex); 1276693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1277693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1278693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 12791beb760d920561679862ded945a04e370368c7f7Andreas Huberbool OMXCodec::flushPortAsync(OMX_U32 portIndex) { 12808297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING 12818297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber || mState == EXECUTING_TO_IDLE); 1282693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 12837a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("flushPortAsync(%ld): we own %d out of %d buffers already.", 12841beb760d920561679862ded945a04e370368c7f7Andreas Huber portIndex, countBuffersWeOwn(mPortBuffers[portIndex]), 12851beb760d920561679862ded945a04e370368c7f7Andreas Huber mPortBuffers[portIndex].size()); 12861beb760d920561679862ded945a04e370368c7f7Andreas Huber 1287693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], ENABLED); 1288693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = SHUTTING_DOWN; 1289693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 12901beb760d920561679862ded945a04e370368c7f7Andreas Huber if ((mQuirks & kRequiresFlushCompleteEmulation) 12911beb760d920561679862ded945a04e370368c7f7Andreas Huber && countBuffersWeOwn(mPortBuffers[portIndex]) 12921beb760d920561679862ded945a04e370368c7f7Andreas Huber == mPortBuffers[portIndex].size()) { 12931beb760d920561679862ded945a04e370368c7f7Andreas Huber // No flush is necessary and this component fails to send a 12941beb760d920561679862ded945a04e370368c7f7Andreas Huber // flush-complete event in this case. 12951beb760d920561679862ded945a04e370368c7f7Andreas Huber 12961beb760d920561679862ded945a04e370368c7f7Andreas Huber return false; 12971beb760d920561679862ded945a04e370368c7f7Andreas Huber } 12981beb760d920561679862ded945a04e370368c7f7Andreas Huber 1299693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1300693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->send_command(mNode, OMX_CommandFlush, portIndex); 1301693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 13021beb760d920561679862ded945a04e370368c7f7Andreas Huber 13031beb760d920561679862ded945a04e370368c7f7Andreas Huber return true; 1304693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1305693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1306693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::disablePortAsync(OMX_U32 portIndex) { 1307693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1308693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1309693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], ENABLED); 1310693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = DISABLING; 1311693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1312693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1313693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->send_command(mNode, OMX_CommandPortDisable, portIndex); 1314693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1315693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1316693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber freeBuffersOnPort(portIndex, true); 1317693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1318693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1319693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::enablePortAsync(OMX_U32 portIndex) { 1320693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1321693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1322693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], DISABLED); 1323693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = ENABLING; 1324693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1325693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1326693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->send_command(mNode, OMX_CommandPortEnable, portIndex); 1327693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1328693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1329693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1330693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::fillOutputBuffers() { 1331693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING); 1332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 1334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffer(&buffers->editItemAt(i)); 1336693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1337693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1338693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1339693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::drainInputBuffers() { 1340450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput]; 1343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffer(&buffers->editItemAt(i)); 1345693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1346693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1347693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1348693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::drainInputBuffer(BufferInfo *info) { 1349693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mOwnedByComponent, false); 1350693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1351693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mSignalledEOS) { 1352693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1353693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1354693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1355693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mCodecSpecificDataIndex < mCodecSpecificData.size()) { 1356693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const CodecSpecificData *specific = 1357693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificData[mCodecSpecificDataIndex]; 1358693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1359693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t size = specific->mSize; 1360693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1361dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber if (!strcasecmp("video/avc", mMIME) 1362dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber && !(mQuirks & kWantsNALFragments)) { 1363693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const uint8_t kNALStartCode[4] = 1364693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 0x00, 0x00, 0x00, 0x01 }; 1365693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1366693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(info->mMem->size() >= specific->mSize + 4); 1367693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1368693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size += 4; 1369693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1370693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(info->mMem->pointer(), kNALStartCode, 4); 1371693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy((uint8_t *)info->mMem->pointer() + 4, 1372693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber specific->mData, specific->mSize); 1373693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1374693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(info->mMem->size() >= specific->mSize); 1375693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(info->mMem->pointer(), specific->mData, specific->mSize); 1376693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1377693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1378693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->empty_buffer( 1379693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, info->mBuffer, 0, size, 1380693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_BUFFERFLAG_ENDOFFRAME | OMX_BUFFERFLAG_CODECCONFIG, 1381693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 0); 1382693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1383693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mOwnedByComponent = true; 1384693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1385693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++mCodecSpecificDataIndex; 1386693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1387693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1388693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1389693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaBuffer *srcBuffer; 1390693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err; 1391693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mSeekTimeUs >= 0) { 1392693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaSource::ReadOptions options; 1393693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber options.setSeekTo(mSeekTimeUs); 1394693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs = -1; 1395693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1396693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mSource->read(&srcBuffer, &options); 1397693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1398693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mSource->read(&srcBuffer); 1399693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1400693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1401693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME; 1402693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_TICKS timestamp = 0; 1403693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t srcLength = 0; 1404693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1405693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 14067a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("signalling end of input stream."); 1407693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber flags |= OMX_BUFFERFLAG_EOS; 1408693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1409693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS = true; 1410693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1411693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcLength = srcBuffer->range_length(); 1412693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1413693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (info->mMem->size() < srcLength) { 1414693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("info->mMem->size() = %d, srcLength = %d", 1415693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMem->size(), srcLength); 1416693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1417693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(info->mMem->size() >= srcLength); 1418693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(info->mMem->pointer(), 1419693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber (const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(), 1420693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcLength); 1421693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1422693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t units, scale; 1423693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (srcBuffer->meta_data()->findInt32(kKeyTimeUnits, &units) 1424693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && srcBuffer->meta_data()->findInt32(kKeyTimeScale, &scale)) { 1425693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber timestamp = ((OMX_TICKS)units * 1000000) / scale; 1426693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 14277a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Calling empty_buffer on buffer %p (length %d)", 1428693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mBuffer, srcLength); 14297a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Calling empty_buffer with timestamp %lld us (%.2f secs)", 1430693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber timestamp, timestamp / 1E6); 1431693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1432693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1433693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1434693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->empty_buffer( 1435693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, info->mBuffer, 0, srcLength, 1436693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber flags, timestamp); 1437693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1438693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mOwnedByComponent = true; 1439693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1440693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (srcBuffer != NULL) { 1441693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcBuffer->release(); 1442693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcBuffer = NULL; 1443693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1444693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1445693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1446693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::fillOutputBuffer(BufferInfo *info) { 1447693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mOwnedByComponent, false); 1448693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 14491beb760d920561679862ded945a04e370368c7f7Andreas Huber if (mNoMoreOutputData) { 14507a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("There is no more output data available, not " 14511beb760d920561679862ded945a04e370368c7f7Andreas Huber "calling fillOutputBuffer"); 14521beb760d920561679862ded945a04e370368c7f7Andreas Huber return; 14531beb760d920561679862ded945a04e370368c7f7Andreas Huber } 14541beb760d920561679862ded945a04e370368c7f7Andreas Huber 14557a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Calling fill_buffer on buffer %p", info->mBuffer); 1456693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->fill_buffer(mNode, info->mBuffer); 1457693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1458693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mOwnedByComponent = true; 1459693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1460693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1461693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::drainInputBuffer(IOMX::buffer_id buffer) { 1462693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput]; 1463693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1464693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if ((*buffers)[i].mBuffer == buffer) { 1465693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffer(&buffers->editItemAt(i)); 1466693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1467693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1468693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1469693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1470693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1471693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1472693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1473693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::fillOutputBuffer(IOMX::buffer_id buffer) { 1474693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 1475693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1476693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if ((*buffers)[i].mBuffer == buffer) { 1477693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffer(&buffers->editItemAt(i)); 1478693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1479693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1480693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1481693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1482693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1483693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1484693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1485693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setState(State newState) { 1486693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mState = newState; 1487693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.signal(); 1488693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1489693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // This may cause some spurious wakeups but is necessary to 1490693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // unblock the reader if we enter ERROR state. 1491693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.signal(); 1492693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1493693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1494e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Hubervoid OMXCodec::setRawAudioFormat( 1495e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) { 1496e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber OMX_AUDIO_PARAM_PCMMODETYPE pcmParams; 14977a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&pcmParams); 1498e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.nPortIndex = portIndex; 1499e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1500e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber status_t err = mOMX->get_parameter( 1501e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1502e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1503e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(err, OK); 1504e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1505e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.nChannels = numChannels; 1506e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.eNumData = OMX_NumericalDataSigned; 1507e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.bInterleaved = OMX_TRUE; 1508e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.nBitPerSample = 16; 1509e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.nSamplingRate = sampleRate; 1510e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear; 1511e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1512e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (numChannels == 1) { 1513e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelCF; 1514e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } else { 1515e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(numChannels, 2); 1516e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1517e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelLF; 1518e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.eChannelMapping[1] = OMX_AUDIO_ChannelRF; 1519e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 1520e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1521e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber err = mOMX->set_parameter( 1522e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1523e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1524e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(err, OK); 1525e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber} 1526e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1527693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setAMRFormat() { 1528693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!mIsEncoder) { 1529693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 15307a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 1531693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 1532693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1533693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1534693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->get_parameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1535693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1536693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1537693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1538693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 1539693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.eAMRBandMode = OMX_AUDIO_AMRBandModeNB0; 1540693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1541693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1542693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1543693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1544693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1545693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber //////////////////////// 1546693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1547693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mIsEncoder) { 1548693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> format = mSource->getFormat(); 1549693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t sampleRate; 1550693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t numChannels; 1551693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(format->findInt32(kKeySampleRate, &sampleRate)); 1552456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber CHECK(format->findInt32(kKeyChannelCount, &numChannels)); 1553456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1554456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber setRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1555456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber } 1556456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber} 1557456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1558456db75516efc889e1ee4e5e16021e77c03b0941Andreas Hubervoid OMXCodec::setAMRWBFormat() { 1559456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber if (!mIsEncoder) { 1560456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 1561456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber InitOMXParams(&def); 1562456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber def.nPortIndex = kPortIndexInput; 1563456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1564456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber status_t err = 1565456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber mOMX->get_parameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1566456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1567456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber CHECK_EQ(err, OK); 1568456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1569456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 1570456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber def.eAMRBandMode = OMX_AUDIO_AMRBandModeWB0; 1571456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1572456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber err = mOMX->set_parameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1573456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber CHECK_EQ(err, OK); 1574456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber } 1575456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1576456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber //////////////////////// 1577456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1578456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber if (mIsEncoder) { 1579456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber sp<MetaData> format = mSource->getFormat(); 1580456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber int32_t sampleRate; 1581456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber int32_t numChannels; 1582456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber CHECK(format->findInt32(kKeySampleRate, &sampleRate)); 1583693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(format->findInt32(kKeyChannelCount, &numChannels)); 1584693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1585e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber setRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1586e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 1587e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber} 1588693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1589e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Hubervoid OMXCodec::setAACFormat(int32_t numChannels, int32_t sampleRate) { 1590e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (mIsEncoder) { 1591e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber setRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1592e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } else { 1593e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 15947a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&profile); 1595e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber profile.nPortIndex = kPortIndexInput; 1596693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1597e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber status_t err = mOMX->get_parameter( 1598e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 1599693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1600693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1601e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber profile.nChannels = numChannels; 1602e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber profile.nSampleRate = sampleRate; 1603e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS; 1604693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1605693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 1606e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 1607693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1608693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1609693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1610693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1611693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setImageOutputFormat( 1612693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height) { 16137a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("setImageOutputFormat(%ld, %ld)", width, height); 1614693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1615693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 0 1616693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE index; 1617693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_extension_index( 1618693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, "OMX.TI.JPEG.decode.Config.OutputColorFormat", &index); 1619693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1620693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1621693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_config(mNode, index, &format, sizeof(format)); 1622693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1623693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 1624693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1625693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 16267a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 1627693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 1628693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1629693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 1630693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1631693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1632693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1633693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainImage); 1634693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1635693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; 1636bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 1637693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingUnused); 1638693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->eColorFormat = format; 1639693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameWidth = width; 1640693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameHeight = height; 1641693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1642693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (format) { 1643693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_FormatYUV420PackedPlanar: 1644693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_FormatYUV411Planar: 1645693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1646693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = (width * height * 3) / 2; 1647693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1648693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1649693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1650693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_FormatCbYCrY: 1651693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1652693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = width * height * 2; 1653693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1654693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1655693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1656693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_Format32bitARGB8888: 1657693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1658693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = width * height * 4; 1659693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1660693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1661693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1662195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber case OMX_COLOR_Format16bitARGB4444: 1663195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber case OMX_COLOR_Format16bitARGB1555: 1664195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber case OMX_COLOR_Format16bitRGB565: 1665195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber case OMX_COLOR_Format16bitBGR565: 1666195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber { 1667195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber def.nBufferSize = width * height * 2; 1668195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber break; 1669195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber } 1670195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber 1671693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1672693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Should not be here. Unknown color format."); 1673693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1674693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1675693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 16767530e9c708275c273c134c36c68179f511c1940eAndreas Huber def.nBufferCountActual = def.nBufferCountMin; 16777530e9c708275c273c134c36c68179f511c1940eAndreas Huber 1678693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 1679693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1680693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 16817530e9c708275c273c134c36c68179f511c1940eAndreas Huber} 1682693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 16837530e9c708275c273c134c36c68179f511c1940eAndreas Hubervoid OMXCodec::setJPEGInputFormat( 16847530e9c708275c273c134c36c68179f511c1940eAndreas Huber OMX_U32 width, OMX_U32 height, OMX_U32 compressedSize) { 16857530e9c708275c273c134c36c68179f511c1940eAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 16867a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 1687693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 1688693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 16897530e9c708275c273c134c36c68179f511c1940eAndreas Huber status_t err = mOMX->get_parameter( 1690693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1691693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1692693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 16937530e9c708275c273c134c36c68179f511c1940eAndreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainImage); 16947530e9c708275c273c134c36c68179f511c1940eAndreas Huber OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; 16957530e9c708275c273c134c36c68179f511c1940eAndreas Huber 1696693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingJPEG); 1697693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameWidth = width; 1698693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameHeight = height; 1699693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 17007530e9c708275c273c134c36c68179f511c1940eAndreas Huber def.nBufferSize = compressedSize; 1701693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferCountActual = def.nBufferCountMin; 1702693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1703693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 1704693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1705693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1706693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1707693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1708693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::addCodecSpecificData(const void *data, size_t size) { 1709693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CodecSpecificData *specific = 1710693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber (CodecSpecificData *)malloc(sizeof(CodecSpecificData) + size - 1); 1711693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1712693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber specific->mSize = size; 1713693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(specific->mData, data, size); 1714693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1715693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificData.push(specific); 1716693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1717693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1718693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::clearCodecSpecificData() { 1719693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < mCodecSpecificData.size(); ++i) { 1720693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(mCodecSpecificData.editItemAt(i)); 1721693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1722693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificData.clear(); 1723693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificDataIndex = 0; 1724693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1725693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1726693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::start(MetaData *) { 1727284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber Mutex::Autolock autoLock(mLock); 1728284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber 1729693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState != LOADED) { 1730693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return UNKNOWN_ERROR; 1731693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1732bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 1733693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> params = new MetaData; 1734dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber if (mQuirks & kWantsNALFragments) { 1735dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber params->setInt32(kKeyWantsNALFragments, true); 1736693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1737693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mSource->start(params.get()); 1738693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1739693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 1740693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 1741693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1742693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1743693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificDataIndex = 0; 1744284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber mInitialBufferSubmit = true; 1745693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS = false; 1746693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = false; 1747693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs = -1; 1748693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.clear(); 1749693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1750693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return init(); 1751693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1752693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1753693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::stop() { 17547a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("stop"); 1755693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1756693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 1757693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1758693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (isIntermediateState(mState)) { 1759693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.wait(mLock); 1760693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1761693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1762693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (mState) { 1763693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case LOADED: 1764693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case ERROR: 1765693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1766693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1767693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case EXECUTING: 1768693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1769693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(EXECUTING_TO_IDLE); 1770693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 17718297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber if (mQuirks & kRequiresFlushBeforeShutdown) { 17727a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("This component requires a flush before transitioning " 17738297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber "from EXECUTING to IDLE..."); 17748297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 17758297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber bool emulateInputFlushCompletion = 17768297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber !flushPortAsync(kPortIndexInput); 17778297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 17788297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber bool emulateOutputFlushCompletion = 17798297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber !flushPortAsync(kPortIndexOutput); 1780693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 17818297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber if (emulateInputFlushCompletion) { 17828297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber onCmdComplete(OMX_CommandFlush, kPortIndexInput); 17838297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } 17848297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 17858297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber if (emulateOutputFlushCompletion) { 17868297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber onCmdComplete(OMX_CommandFlush, kPortIndexOutput); 17878297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } 17888297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } else { 17898297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber mPortStatus[kPortIndexInput] = SHUTTING_DOWN; 17908297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber mPortStatus[kPortIndexOutput] = SHUTTING_DOWN; 17918297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 17928297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber status_t err = 17938297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber mOMX->send_command(mNode, OMX_CommandStateSet, OMX_StateIdle); 17948297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber CHECK_EQ(err, OK); 17958297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } 1796693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1797693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (mState != LOADED && mState != ERROR) { 1798693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.wait(mLock); 1799693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1800693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1801693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1802693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1803693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1804693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1805693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1806693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1807693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1808693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1809693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1810693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1811693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSource->stop(); 1812693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1813693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 1814693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1815693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1816693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersp<MetaData> OMXCodec::getFormat() { 1817693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return mOutputFormat; 1818693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1819693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1820693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::read( 1821693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaBuffer **buffer, const ReadOptions *options) { 1822693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *buffer = NULL; 1823693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1824693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 1825693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1826450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber if (mState != EXECUTING && mState != RECONFIGURING) { 1827450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber return UNKNOWN_ERROR; 1828450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber } 1829450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber 1830284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber if (mInitialBufferSubmit) { 1831284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber mInitialBufferSubmit = false; 1832284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber 1833284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber drainInputBuffers(); 1834284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber 1835450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber if (mState == EXECUTING) { 1836450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber // Otherwise mState == RECONFIGURING and this code will trigger 1837450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber // after the output port is reenabled. 1838450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber fillOutputBuffers(); 1839450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber } 1840693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1841693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1842693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t seekTimeUs; 1843693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (options && options->getSeekTo(&seekTimeUs)) { 18447a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("seeking to %lld us (%.2f secs)", seekTimeUs, seekTimeUs / 1E6); 1845693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1846693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS = false; 1847693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = false; 1848693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1849693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(seekTimeUs >= 0); 1850693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs = seekTimeUs; 1851693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1852693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.clear(); 1853693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1854693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING); 1855693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 18561beb760d920561679862ded945a04e370368c7f7Andreas Huber bool emulateInputFlushCompletion = !flushPortAsync(kPortIndexInput); 18571beb760d920561679862ded945a04e370368c7f7Andreas Huber bool emulateOutputFlushCompletion = !flushPortAsync(kPortIndexOutput); 18581beb760d920561679862ded945a04e370368c7f7Andreas Huber 18591beb760d920561679862ded945a04e370368c7f7Andreas Huber if (emulateInputFlushCompletion) { 18601beb760d920561679862ded945a04e370368c7f7Andreas Huber onCmdComplete(OMX_CommandFlush, kPortIndexInput); 18611beb760d920561679862ded945a04e370368c7f7Andreas Huber } 18621beb760d920561679862ded945a04e370368c7f7Andreas Huber 18631beb760d920561679862ded945a04e370368c7f7Andreas Huber if (emulateOutputFlushCompletion) { 18641beb760d920561679862ded945a04e370368c7f7Andreas Huber onCmdComplete(OMX_CommandFlush, kPortIndexOutput); 18651beb760d920561679862ded945a04e370368c7f7Andreas Huber } 1866693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1867693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1868693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (mState != ERROR && !mNoMoreOutputData && mFilledBuffers.empty()) { 1869693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.wait(mLock); 1870693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1871693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1872693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == ERROR) { 1873693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return UNKNOWN_ERROR; 1874693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1875693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1876693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mFilledBuffers.empty()) { 1877693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return ERROR_END_OF_STREAM; 1878693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1879693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1880693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t index = *mFilledBuffers.begin(); 1881693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.erase(mFilledBuffers.begin()); 1882693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1883693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index); 1884693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMediaBuffer->add_ref(); 1885693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *buffer = info->mMediaBuffer; 1886693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1887693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 1888693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1889693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1890693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::signalBufferReturned(MediaBuffer *buffer) { 1891693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 1892693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1893693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 1894693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1895693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &buffers->editItemAt(i); 1896693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1897693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (info->mMediaBuffer == buffer) { 1898693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[kPortIndexOutput], ENABLED); 1899693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffer(info); 1900693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1901693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1902693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1903693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1904693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1905693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1906693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1907693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *imageCompressionFormatString(OMX_IMAGE_CODINGTYPE type) { 1908693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 1909693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingUnused", 1910693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingAutoDetect", 1911693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingJPEG", 1912693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingJPEG2K", 1913693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingEXIF", 1914693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingTIFF", 1915693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingGIF", 1916693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingPNG", 1917693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingLZW", 1918693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingBMP", 1919693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 1920693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1921693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 1922693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1923693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 1924693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 1925693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1926693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 1927693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1928693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1929693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1930693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *colorFormatString(OMX_COLOR_FORMATTYPE type) { 1931693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 1932693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatUnused", 1933693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatMonochrome", 1934693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format8bitRGB332", 1935693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format12bitRGB444", 1936693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitARGB4444", 1937693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitARGB1555", 1938693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitRGB565", 1939693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitBGR565", 1940693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format18bitRGB666", 1941693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format18bitARGB1665", 1942bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_Format19bitARGB1666", 1943693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24bitRGB888", 1944693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24bitBGR888", 1945693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24bitARGB1887", 1946693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format25bitARGB1888", 1947693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format32bitBGRA8888", 1948693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format32bitARGB8888", 1949693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV411Planar", 1950693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV411PackedPlanar", 1951693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420Planar", 1952693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420PackedPlanar", 1953693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420SemiPlanar", 1954693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422Planar", 1955693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422PackedPlanar", 1956693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422SemiPlanar", 1957693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYCbYCr", 1958693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYCrYCb", 1959693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatCbYCrY", 1960693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatCrYCbY", 1961693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV444Interleaved", 1962693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatRawBayer8bit", 1963693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatRawBayer10bit", 1964693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatRawBayer8bitcompressed", 1965bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL2", 1966bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL4", 1967bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL8", 1968bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL16", 1969bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL24", 1970693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatL32", 1971693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420PackedSemiPlanar", 1972693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422PackedSemiPlanar", 1973693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format18BitBGR666", 1974693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24BitARGB6666", 1975693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24BitABGR6666", 1976693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 1977693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1978693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 1979693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1980693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const int OMX_QCOM_COLOR_FormatYVU420SemiPlanar = 0x7FA30C00; 1981693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1982693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type == OMX_QCOM_COLOR_FormatYVU420SemiPlanar) { 1983693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "OMX_QCOM_COLOR_FormatYVU420SemiPlanar"; 1984693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (type < 0 || (size_t)type >= numNames) { 1985693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 1986693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1987693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 1988693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1989693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1990693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1991693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *videoCompressionFormatString(OMX_VIDEO_CODINGTYPE type) { 1992693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 1993693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingUnused", 1994693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingAutoDetect", 1995693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingMPEG2", 1996693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingH263", 1997693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingMPEG4", 1998693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingWMV", 1999693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingRV", 2000693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingAVC", 2001693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingMJPEG", 2002693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 2003693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2004693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 2005693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2006693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 2007693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 2008693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2009693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 2010693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2011693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2012693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2013693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *audioCodingTypeString(OMX_AUDIO_CODINGTYPE type) { 2014693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 2015693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingUnused", 2016693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingAutoDetect", 2017693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPCM", 2018693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingADPCM", 2019693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingAMR", 2020693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingGSMFR", 2021693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingGSMEFR", 2022693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingGSMHR", 2023693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPDCFR", 2024693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPDCEFR", 2025693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPDCHR", 2026693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingTDMAFR", 2027693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingTDMAEFR", 2028693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingQCELP8", 2029693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingQCELP13", 2030693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingEVRC", 2031693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingSMV", 2032693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG711", 2033693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG723", 2034693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG726", 2035693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG729", 2036693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingAAC", 2037693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingMP3", 2038693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingSBC", 2039693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingVORBIS", 2040693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingWMA", 2041693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingRA", 2042693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingMIDI", 2043693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 2044693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2045693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 2046693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2047693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 2048693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 2049693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2050693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 2051693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2052693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2053693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2054693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *audioPCMModeString(OMX_AUDIO_PCMMODETYPE type) { 2055693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 2056693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_PCMModeLinear", 2057693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_PCMModeALaw", 2058693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_PCMModeMULaw", 2059693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 2060693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2061693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 2062693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2063693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 2064693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 2065693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2066693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 2067693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2068693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2069693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 20702f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huberstatic const char *amrBandModeString(OMX_AUDIO_AMRBANDMODETYPE type) { 20712f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber static const char *kNames[] = { 20722f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeUnused", 20732f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB0", 20742f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB1", 20752f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB2", 20762f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB3", 20772f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB4", 20782f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB5", 20792f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB6", 20802f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB7", 20812f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB0", 20822f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB1", 20832f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB2", 20842f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB3", 20852f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB4", 20862f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB5", 20872f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB6", 20882f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB7", 20892f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB8", 20902f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber }; 20912f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 20922f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 20932f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 20942f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber if (type < 0 || (size_t)type >= numNames) { 20952f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber return "UNKNOWN"; 20962f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } else { 20972f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber return kNames[type]; 20982f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } 20992f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber} 21002f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 21012f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huberstatic const char *amrFrameFormatString(OMX_AUDIO_AMRFRAMEFORMATTYPE type) { 21022f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber static const char *kNames[] = { 21032f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatConformance", 21042f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatIF1", 21052f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatIF2", 21062f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatFSF", 21072f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatRTPPayload", 21082f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatITU", 21092f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber }; 21102f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 21112f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 21122f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 21132f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber if (type < 0 || (size_t)type >= numNames) { 21142f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber return "UNKNOWN"; 21152f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } else { 21162f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber return kNames[type]; 21172f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } 21182f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber} 2119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::dumpPortStatus(OMX_U32 portIndex) { 2121693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 21227a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 2123693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = portIndex; 2124693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2125693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 2126693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2127693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 2128693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2129693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("%s Port = {\n", portIndex == kPortIndexInput ? "Input" : "Output"); 2130693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2131693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK((portIndex == kPortIndexInput && def.eDir == OMX_DirInput) 2132693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || (portIndex == kPortIndexOutput && def.eDir == OMX_DirOutput)); 2133693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2134693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBufferCountActual = %ld\n", def.nBufferCountActual); 2135693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBufferCountMin = %ld\n", def.nBufferCountMin); 2136693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBufferSize = %ld\n", def.nBufferSize); 2137693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2138693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (def.eDomain) { 2139693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainImage: 2140693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2141693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; 2142693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2143693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 2144693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Image\n"); 2145693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameWidth = %ld\n", imageDef->nFrameWidth); 2146693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameHeight = %ld\n", imageDef->nFrameHeight); 2147693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nStride = %ld\n", imageDef->nStride); 2148693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2149693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eCompressionFormat = %s\n", 2150693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageCompressionFormatString(imageDef->eCompressionFormat)); 2151693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2152693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eColorFormat = %s\n", 2153693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormatString(imageDef->eColorFormat)); 2154693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2155693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2156693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2157693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2158693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainVideo: 2159693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2160693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *videoDef = &def.format.video; 2161693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2162693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 2163693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Video\n"); 2164693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameWidth = %ld\n", videoDef->nFrameWidth); 2165693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameHeight = %ld\n", videoDef->nFrameHeight); 2166693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nStride = %ld\n", videoDef->nStride); 2167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2168693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eCompressionFormat = %s\n", 2169693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber videoCompressionFormatString(videoDef->eCompressionFormat)); 2170693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2171693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eColorFormat = %s\n", 2172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormatString(videoDef->eColorFormat)); 2173693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2174693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2175693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainAudio: 2178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audioDef = &def.format.audio; 2180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 2182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Audio\n"); 2183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eEncoding = %s\n", 2184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber audioCodingTypeString(audioDef->eEncoding)); 2185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (audioDef->eEncoding == OMX_AUDIO_CodingPCM) { 2187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 21887a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(¶ms); 2189693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.nPortIndex = portIndex; 2190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->get_parameter( 2192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamAudioPcm, ¶ms, sizeof(params)); 2193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 2194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nSamplingRate = %ld\n", params.nSamplingRate); 2196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nChannels = %ld\n", params.nChannels); 2197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" bInterleaved = %d\n", params.bInterleaved); 2198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBitPerSample = %ld\n", params.nBitPerSample); 2199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eNumData = %s\n", 2201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.eNumData == OMX_NumericalDataSigned 2202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ? "signed" : "unsigned"); 2203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" ePCMMode = %s\n", audioPCMModeString(params.ePCMMode)); 22052f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } else if (audioDef->eEncoding == OMX_AUDIO_CodingAMR) { 22062f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber OMX_AUDIO_PARAM_AMRTYPE amr; 22072f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber InitOMXParams(&amr); 22082f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber amr.nPortIndex = portIndex; 22092f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 22102f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber err = mOMX->get_parameter( 22112f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mNode, OMX_IndexParamAudioAmr, &amr, sizeof(amr)); 22122f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber CHECK_EQ(err, OK); 22132f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 22142f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber printf(" nChannels = %ld\n", amr.nChannels); 22152f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber printf(" eAMRBandMode = %s\n", 22162f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber amrBandModeString(amr.eAMRBandMode)); 22172f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber printf(" eAMRFrameFormat = %s\n", 22182f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber amrFrameFormatString(amr.eAMRFrameFormat)); 2219693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2220693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2221693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2222693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2223693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2224693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 2225693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2226693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Unknown\n"); 2227693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2228693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2229693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2230693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2231693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("}\n"); 2232693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2233693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2234693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::initOutputFormat(const sp<MetaData> &inputFormat) { 2235693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat = new MetaData; 2236693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyDecoderComponent, mComponentName); 2237693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2238693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 22397a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 2240693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 2241693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2242693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 2243693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2244693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 2245693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2246693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (def.eDomain) { 2247693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainImage: 2248693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2249693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; 2250693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingUnused); 2251693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2252693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyMIMEType, "image/raw"); 2253693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyColorFormat, imageDef->eColorFormat); 2254693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyWidth, imageDef->nFrameWidth); 2255693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyHeight, imageDef->nFrameHeight); 2256693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2257693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2258693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2259693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainAudio: 2260693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2261693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audio_def = &def.format.audio; 2262693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2263e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (audio_def->eEncoding == OMX_AUDIO_CodingPCM) { 2264e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 22657a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(¶ms); 2266e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber params.nPortIndex = kPortIndexOutput; 2267693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2268e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber err = mOMX->get_parameter( 2269e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamAudioPcm, ¶ms, sizeof(params)); 2270e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(err, OK); 2271693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2272e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(params.eNumData, OMX_NumericalDataSigned); 2273e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(params.nBitPerSample, 16); 2274e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(params.ePCMMode, OMX_AUDIO_PCMModeLinear); 2275693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2276e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber int32_t numChannels, sampleRate; 2277e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber inputFormat->findInt32(kKeyChannelCount, &numChannels); 2278e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber inputFormat->findInt32(kKeySampleRate, &sampleRate); 2279693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2280e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if ((OMX_U32)numChannels != params.nChannels) { 2281e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber LOGW("Codec outputs a different number of channels than " 2282e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber "the input stream contains."); 2283e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 228437940eefcba982836b579fe1ffec6cada72b0974Andreas Huber 2285e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mOutputFormat->setCString(kKeyMIMEType, "audio/raw"); 228637940eefcba982836b579fe1ffec6cada72b0974Andreas Huber 2287e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber // Use the codec-advertised number of channels, as some 2288e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber // codecs appear to output stereo even if the input data is 2289e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber // mono. 2290e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mOutputFormat->setInt32(kKeyChannelCount, params.nChannels); 229137940eefcba982836b579fe1ffec6cada72b0974Andreas Huber 2292e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber // The codec-reported sampleRate is not reliable... 2293e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mOutputFormat->setInt32(kKeySampleRate, sampleRate); 2294e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } else if (audio_def->eEncoding == OMX_AUDIO_CodingAMR) { 22952f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber OMX_AUDIO_PARAM_AMRTYPE amr; 22962f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber InitOMXParams(&amr); 22972f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber amr.nPortIndex = kPortIndexOutput; 22982f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 22992f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber err = mOMX->get_parameter( 23002f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mNode, OMX_IndexParamAudioAmr, &amr, sizeof(amr)); 23012f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber CHECK_EQ(err, OK); 23022f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 23032f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber CHECK_EQ(amr.nChannels, 1); 23042f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mOutputFormat->setInt32(kKeyChannelCount, 1); 23052f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 23062f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber if (amr.eAMRBandMode >= OMX_AUDIO_AMRBandModeNB0 23072f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber && amr.eAMRBandMode <= OMX_AUDIO_AMRBandModeNB7) { 23082f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mOutputFormat->setCString(kKeyMIMEType, "audio/3gpp"); 23092f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mOutputFormat->setInt32(kKeySampleRate, 8000); 23102f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } else if (amr.eAMRBandMode >= OMX_AUDIO_AMRBandModeWB0 23112f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber && amr.eAMRBandMode <= OMX_AUDIO_AMRBandModeWB8) { 23122f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mOutputFormat->setCString(kKeyMIMEType, "audio/amr-wb"); 23132f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mOutputFormat->setInt32(kKeySampleRate, 16000); 23142f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } else { 23152f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber CHECK(!"Unknown AMR band mode."); 23162f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } 2317e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } else if (audio_def->eEncoding == OMX_AUDIO_CodingAAC) { 2318e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mOutputFormat->setCString(kKeyMIMEType, "audio/mp4a-latm"); 2319e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } else { 2320e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK(!"Should not be here. Unknown audio encoding."); 2321e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 2322693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2323693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2324693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2325693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainVideo: 2326693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2327693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 2328693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2329693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (video_def->eCompressionFormat == OMX_VIDEO_CodingUnused) { 2330693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyMIMEType, "video/raw"); 2331693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingMPEG4) { 2332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyMIMEType, "video/mp4v-es"); 2333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingH263) { 2334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyMIMEType, "video/3gpp"); 2335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingAVC) { 2336693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyMIMEType, "video/avc"); 2337693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2338693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Unknown compression format."); 2339693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2340693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(mComponentName, "OMX.PV.avcdec")) { 2342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // This component appears to be lying to me. 2343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32( 2344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyWidth, (video_def->nFrameWidth + 15) & -16); 2345693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32( 2346693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyHeight, (video_def->nFrameHeight + 15) & -16); 2347693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2348693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyWidth, video_def->nFrameWidth); 2349693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyHeight, video_def->nFrameHeight); 2350693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2351693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2352693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyColorFormat, video_def->eColorFormat); 2353693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2354693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2355693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2356693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 2357693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2358693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here, neither audio nor video."); 2359693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2360693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2361693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2362693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2363693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2364693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} // namespace android 2365