OMXCodec.cpp revision bde3caae211e215e4bbfef1a267f8d680efa4764
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" }, 52693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/mp4a-latm", "OMX.TI.AAC.decode" }, 53693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/mp4a-latm", "OMX.PV.aacdec" }, 54693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.qcom.video.decoder.mpeg4" }, 55693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.TI.Video.Decoder" }, 56693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.PV.mpeg4dec" }, 57693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.qcom.video.decoder.h263" }, 58693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.TI.Video.Decoder" }, 59693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.PV.h263dec" }, 60693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/avc", "OMX.qcom.video.decoder.avc" }, 61693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/avc", "OMX.TI.Video.Decoder" }, 62693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/avc", "OMX.PV.avcdec" }, 63693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}; 64693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 65693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const CodecInfo kEncoderInfo[] = { 66693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/3gpp", "OMX.TI.AMR.encode" }, 67693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/3gpp", "OMX.PV.amrencnb" }, 68693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/mp4a-latm", "OMX.TI.AAC.encode" }, 69693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "audio/mp4a-latm", "OMX.PV.aacenc" }, 70693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.qcom.video.encoder.mpeg4" }, 71693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.TI.Video.encoder" }, 72693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/mp4v-es", "OMX.PV.mpeg4enc" }, 73693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.qcom.video.encoder.h263" }, 74693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.TI.Video.encoder" }, 75693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/3gpp", "OMX.PV.h263enc" }, 76693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/avc", "OMX.TI.Video.encoder" }, 77693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { "video/avc", "OMX.PV.avcenc" }, 78693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}; 79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 80693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstruct OMXCodecObserver : public BnOMXObserver { 81693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMXCodecObserver(const wp<OMXCodec> &target) 82693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber : mTarget(target) { 83693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 84693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 85693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // from IOMXObserver 86693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual void on_message(const omx_message &msg) { 87693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<OMXCodec> codec = mTarget.promote(); 88693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 89693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (codec.get() != NULL) { 90693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->on_message(msg); 91693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 92693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 93693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 94693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprotected: 95693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual ~OMXCodecObserver() {} 96693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 97693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprivate: 98693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber wp<OMXCodec> mTarget; 99693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 100693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMXCodecObserver(const OMXCodecObserver &); 101693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMXCodecObserver &operator=(const OMXCodecObserver &); 102693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}; 103693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 104693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *GetCodec(const CodecInfo *info, size_t numInfos, 105693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, int index) { 106693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(index >= 0); 107693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for(size_t i = 0; i < numInfos; ++i) { 108693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcasecmp(mime, info[i].mime)) { 109693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (index == 0) { 110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return info[i].codec; 111693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 112693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 113693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber --index; 114693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 115693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 116693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 117693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return NULL; 118693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 120bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huberenum { 121bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileBaseline = 0x42, 122bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileMain = 0x4d, 123bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileExtended = 0x58, 124bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh = 0x64, 125bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh10 = 0x6e, 126bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh422 = 0x7a, 127bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh444 = 0xf4, 128bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileCAVLC444Intra = 0x2c 129bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber}; 130bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 131bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huberstatic const char *AVCProfileToString(uint8_t profile) { 132bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber switch (profile) { 133bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileBaseline: 134bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "Baseline"; 135bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileMain: 136bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "Main"; 137bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileExtended: 138bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "Extended"; 139bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh: 140bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High"; 141bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh10: 142bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High 10"; 143bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh422: 144bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High 422"; 145bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh444: 146bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High 444"; 147bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileCAVLC444Intra: 148bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "CAVLC 444 Intra"; 149bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber default: return "Unknown"; 150bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber } 151bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber} 152bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 153693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber// static 154693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersp<OMXCodec> OMXCodec::Create( 155693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<IOMX> &omx, 156693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<MetaData> &meta, bool createEncoder, 157693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<MediaSource> &source) { 158693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime; 159693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool success = meta->findCString(kKeyMIMEType, &mime); 160693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(success); 161693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 162693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *componentName = NULL; 163693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::node_id node = 0; 164693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (int index = 0;; ++index) { 165693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (createEncoder) { 166693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber componentName = GetCodec( 167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kEncoderInfo, sizeof(kEncoderInfo) / sizeof(kEncoderInfo[0]), 168693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mime, index); 169693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 170693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber componentName = GetCodec( 171693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kDecoderInfo, sizeof(kDecoderInfo) / sizeof(kDecoderInfo[0]), 172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mime, index); 173693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 174693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 175693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!componentName) { 176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return NULL; 177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("Attempting to allocate OMX node '%s'", componentName); 180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = omx->allocate_node(componentName, &node); 182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err == OK) { 183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber uint32_t quirks = 0; 188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(componentName, "OMX.PV.avcdec")) { 189dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber quirks |= kWantsNALFragments; 190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(componentName, "OMX.TI.MP3.decode")) { 192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kNeedsFlushBeforeDisable; 193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(componentName, "OMX.TI.AAC.decode")) { 195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kNeedsFlushBeforeDisable; 196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strncmp(componentName, "OMX.qcom.video.encoder.", 23)) { 198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kRequiresLoadedToIdleAfterAllocation; 199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kRequiresAllocateBufferOnInputPorts; 200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<OMXCodec> codec = new OMXCodec( 203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber omx, node, quirks, createEncoder, mime, componentName, 204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber source); 205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber uint32_t type; 207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const void *data; 208693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t size; 209693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (meta->findData(kKeyESDS, &type, &data, &size)) { 210693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ESDS esds((const char *)data, size); 211693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(esds.InitCheck(), OK); 212693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 213693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const void *codec_specific_data; 214693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t codec_specific_data_size; 215693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber esds.getCodecSpecificInfo( 216693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &codec_specific_data, &codec_specific_data_size); 217693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 218693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("found codec-specific data of size %d\n", 219693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec_specific_data_size); 220693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 221693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->addCodecSpecificData( 222693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec_specific_data, codec_specific_data_size); 223693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (meta->findData(kKeyAVCC, &type, &data, &size)) { 224693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("found avcc of size %d\n", size); 225693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 226bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // Parse the AVCDecoderConfigurationRecord 227bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 228bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber const uint8_t *ptr = (const uint8_t *)data; 229bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 230bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 7); 231bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK_EQ(ptr[0], 1); // configurationVersion == 1 232bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber uint8_t profile = ptr[1]; 233bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber uint8_t level = ptr[3]; 234bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 235bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK((ptr[4] >> 2) == 0x3f); // reserved 236bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 237bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t lengthSize = 1 + (ptr[4] & 3); 238bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 239bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // commented out check below as H264_QVGA_500_NO_AUDIO.3gp 240bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // violates it... 241bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // CHECK((ptr[5] >> 5) == 7); // reserved 242bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 243bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t numSeqParameterSets = ptr[5] & 31; 244bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 245bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ptr += 6; 246693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size -= 6; 247bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 248bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber for (size_t i = 0; i < numSeqParameterSets; ++i) { 249bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 2); 250bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t length = U16_AT(ptr); 251693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 252693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ptr += 2; 253693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size -= 2; 254693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 255bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= length); 256bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 257bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber codec->addCodecSpecificData(ptr, length); 258bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 259bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ptr += length; 260bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size -= length; 261bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber } 262bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 263bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 1); 264bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t numPictureParameterSets = *ptr; 265bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ++ptr; 266bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber --size; 267bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 268bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber for (size_t i = 0; i < numPictureParameterSets; ++i) { 269bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 2); 270bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t length = U16_AT(ptr); 271bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 272bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ptr += 2; 273bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size -= 2; 274693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 275693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(size >= length); 276693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 277693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->addCodecSpecificData(ptr, length); 278693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 279693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ptr += length; 280693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size -= length; 281bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber } 282693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 283bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber LOGI("AVC profile = %d (%s), level = %d", 284bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber (int)profile, AVCProfileToString(profile), (int)level / 10); 285693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 286bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber if (!strcmp(componentName, "OMX.TI.Video.Decoder") 287bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber && (profile != kAVCProfileBaseline || level > 39)) { 288bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // This stream exceeds the decoder's capabilities. 289bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 290bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber LOGE("Profile and/or level exceed the decoder's capabilities."); 291bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return NULL; 292693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 293693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 294693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 295693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcasecmp("audio/3gpp", mime)) { 296693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setAMRFormat(); 297693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 298693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!createEncoder && !strcasecmp("audio/mp4a-latm", mime)) { 299693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setAACFormat(); 300693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 301693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strncasecmp(mime, "video/", 6)) { 302693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t width, height; 303693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool success = meta->findInt32(kKeyWidth, &width); 304693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber success = success && meta->findInt32(kKeyHeight, &height); 305693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber assert(success); 306693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 307693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (createEncoder) { 308693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setVideoInputFormat(mime, width, height); 309693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 310693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setVideoOutputFormat(mime, width, height); 311693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 312693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 313693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcasecmp(mime, "image/jpeg") 314693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && !strcmp(componentName, "OMX.TI.JPEG.decode")) { 315693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE format = 316693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_Format32bitARGB8888; 317693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // OMX_COLOR_FormatYUV420PackedPlanar; 318693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // OMX_COLOR_FormatCbYCrY; 319693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // OMX_COLOR_FormatYUV411Planar; 320693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 321693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t width, height; 322693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool success = meta->findInt32(kKeyWidth, &width); 323693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber success = success && meta->findInt32(kKeyHeight, &height); 324693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber assert(success); 325693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 326693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setImageOutputFormat(format, width, height); 327693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 328693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 329693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->initOutputFormat(meta); 330693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 331693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return codec; 332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::setVideoPortFormatType( 335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex, 336693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 337693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE colorFormat) { 338693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 339693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nSize = sizeof(format); 340693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nVersion.s.nVersionMajor = 1; 341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nVersion.s.nVersionMinor = 1; 342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nPortIndex = portIndex; 343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nIndex = 0; 344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool found = false; 345693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 346693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 index = 0; 347693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (;;) { 348693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nIndex = index; 349693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 350693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 351693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 352693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 353693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 354693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 355693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 356693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 357693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // The following assertion is violated by TI's video decoder. 358693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // assert(format.nIndex == index); 359693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 360693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1 361693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGI("portIndex: %ld, index: %ld, eCompressionFormat=%d eColorFormat=%d", 362693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber portIndex, 363693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber index, format.eCompressionFormat, format.eColorFormat); 364693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 365693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 366693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp("OMX.TI.Video.encoder", mComponentName)) { 367693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexInput 368693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && colorFormat == format.eColorFormat) { 369693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // eCompressionFormat does not seem right. 370693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber found = true; 371693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 372693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 373693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexOutput 374693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && compressionFormat == format.eCompressionFormat) { 375693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // eColorFormat does not seem right. 376693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber found = true; 377693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 378693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 379693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 380693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 381693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (format.eCompressionFormat == compressionFormat 382693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && format.eColorFormat == colorFormat) { 383693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber found = true; 384693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 385693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 386693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 387693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++index; 388693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 389693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 390693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!found) { 391693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return UNKNOWN_ERROR; 392693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 393693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 394693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGI("found a match."); 395693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->set_parameter( 396693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 397693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 398693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 399693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 400693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 401693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 402693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setVideoInputFormat( 403693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, OMX_U32 width, OMX_U32 height) { 404693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGI("setVideoInputFormat width=%ld, height=%ld", width, height); 405693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 406693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused; 407693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcasecmp("video/avc", mime)) { 408693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingAVC; 409693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (!strcasecmp("video/mp4v-es", mime)) { 410693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingMPEG4; 411693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (!strcasecmp("video/3gpp", mime)) { 412693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingH263; 413693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 414693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("Not a supported video mime type: %s", mime); 415693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Should not be here. Not a supported video mime type."); 416693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 417693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 418693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE colorFormat = 419693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 0 ? OMX_COLOR_FormatYCbYCr : OMX_COLOR_FormatCbYCrY; 420693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 421693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strncmp("OMX.qcom.video.encoder.", mComponentName, 23)) { 422693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 423693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 424693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 425693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setVideoPortFormatType( 426693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kPortIndexInput, OMX_VIDEO_CodingUnused, 427693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormat); 428693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 429693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setVideoPortFormatType( 430693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused); 431693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 432693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 433693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 434693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 435693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nSize = sizeof(def); 436693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMajor = 1; 437693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMinor = 1; 438693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 439693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 440693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 441693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 442693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 443693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 444693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 445693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 446693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 447693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 448693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 449693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eCompressionFormat = compressionFormat; 450693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 451693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 452693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 453693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 454693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 455693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 456693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber //////////////////////////////////////////////////////////////////////////// 457693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 458693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nSize = sizeof(def); 459693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMajor = 1; 460693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMinor = 1; 461693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 462693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 463693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->get_parameter( 464693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 465693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 466693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 467693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = (width * height * 2); // (width * height * 3) / 2; 468693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGI("setting nBufferSize = %ld", def.nBufferSize); 469693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 470693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 471693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 472693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 473693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 474693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eCompressionFormat = OMX_VIDEO_CodingUnused; 475693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eColorFormat = colorFormat; 476693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 477693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 478693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 479693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 480693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 481693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 482693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setVideoOutputFormat( 483693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, OMX_U32 width, OMX_U32 height) { 484693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGI("setVideoOutputFormat width=%ld, height=%ld", width, height); 485693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 486693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // Enabling this code appears to be the right thing(tm), but,... 487693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // the TI decoder then loses the ability to output YUV420 and only outputs 488693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // YCbYCr (16bit) 489693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp("OMX.TI.Video.Decoder", mComponentName) 490693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && !strcasecmp("video/avc", mime)) { 491693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_COMPONENTROLETYPE role; 492693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber role.nSize = sizeof(role); 493693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber role.nVersion.s.nVersionMajor = 1; 494693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber role.nVersion.s.nVersionMinor = 1; 495693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber strncpy((char *)role.cRole, "video_decoder.avc", 496693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_MAX_STRINGNAME_SIZE - 1); 497693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber role.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 498693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 499693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->set_parameter( 500693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamStandardComponentRole, 501693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &role, sizeof(role)); 502693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 503693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 504693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 505693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused; 506693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcasecmp("video/avc", mime)) { 507693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingAVC; 508693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (!strcasecmp("video/mp4v-es", mime)) { 509693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingMPEG4; 510693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (!strcasecmp("video/3gpp", mime)) { 511693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingH263; 512693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 513693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("Not a supported video mime type: %s", mime); 514693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Should not be here. Not a supported video mime type."); 515693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 516693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 517693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setVideoPortFormatType( 518693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused); 519693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 520693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1 521693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 522693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 523693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nSize = sizeof(format); 524693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nVersion.s.nVersionMajor = 1; 525693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nVersion.s.nVersionMinor = 1; 526693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nPortIndex = kPortIndexOutput; 527693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nIndex = 0; 528693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 529693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 530693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 531693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 532693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 533693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(format.eCompressionFormat, OMX_VIDEO_CodingUnused); 534693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 535693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const int OMX_QCOM_COLOR_FormatYVU420SemiPlanar = 0x7FA30C00; 536693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 537693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(format.eColorFormat == OMX_COLOR_FormatYUV420Planar 538693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || format.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar 539693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || format.eColorFormat == OMX_COLOR_FormatCbYCrY 540693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || format.eColorFormat == OMX_QCOM_COLOR_FormatYVU420SemiPlanar); 541693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 542693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 543693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 544693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 545693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 546693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 547693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 548693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 549693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 550693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 551693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 552693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nSize = sizeof(def); 553693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMajor = 1; 554693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMinor = 1; 555693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 556693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 557693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 558693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 559693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 560693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 561693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 562693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1 563693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // XXX Need a (much) better heuristic to compute input buffer sizes. 564693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const size_t X = 64 * 1024; 565693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (def.nBufferSize < X) { 566693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = X; 567693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 568693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 569693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 570693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 571693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 572693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 573693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 574693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 575693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 576693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 577693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 578693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 579693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 580693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 581693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber //////////////////////////////////////////////////////////////////////////// 582693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 583693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nSize = sizeof(def); 584693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMajor = 1; 585693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMinor = 1; 586693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 587693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 588693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->get_parameter( 589693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 590693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 591693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 592693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 593693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 0 594693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = 595693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber (((width + 15) & -16) * ((height + 15) & -16) * 3) / 2; // YUV420 596693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 597693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 598693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 599693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 600693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 601693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 602693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 603693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 604693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 605693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 606693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 607693d271e62a3726689ff68f4505ba49228eb94b2Andreas HuberOMXCodec::OMXCodec( 608693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<IOMX> &omx, IOMX::node_id node, uint32_t quirks, 609bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber bool isEncoder, 610693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, 611693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *componentName, 612693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<MediaSource> &source) 613693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber : mOMX(omx), 614693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode(node), 615693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mQuirks(quirks), 616693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mIsEncoder(isEncoder), 617693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mMIME(strdup(mime)), 618693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mComponentName(strdup(componentName)), 619693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSource(source), 620693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificDataIndex(0), 621693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mDealer(new MemoryDealer(5 * 1024 * 1024)), 622693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mState(LOADED), 623693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS(false), 624693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData(false), 625693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs(-1) { 626693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexInput] = ENABLED; 627693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexOutput] = ENABLED; 628693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 629693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mObserver = new OMXCodecObserver(this); 630693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->observe_node(mNode, mObserver); 631693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 632693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 633693d271e62a3726689ff68f4505ba49228eb94b2Andreas HuberOMXCodec::~OMXCodec() { 634dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber CHECK(mState == LOADED || mState == ERROR); 635693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 636693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->observe_node(mNode, NULL); 637693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 638693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 639693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->free_node(mNode); 640693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 641693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 642693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode = NULL; 643693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(DEAD); 644693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 645693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber clearCodecSpecificData(); 646693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 647693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(mComponentName); 648693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mComponentName = NULL; 649bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 650693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(mMIME); 651693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mMIME = NULL; 652693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 653693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 654693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::init() { 655693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 656693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 657693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, LOADED); 658693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 659693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err; 660693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!(mQuirks & kRequiresLoadedToIdleAfterAllocation)) { 661693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->send_command(mNode, OMX_CommandStateSet, OMX_StateIdle); 662693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 663693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 664693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(LOADED_TO_IDLE); 665693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 666693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 667693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = allocateBuffers(); 668693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 669693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 670693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mQuirks & kRequiresLoadedToIdleAfterAllocation) { 671693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->send_command(mNode, OMX_CommandStateSet, OMX_StateIdle); 672693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 673693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 674693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(LOADED_TO_IDLE); 675693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 676693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 677693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (mState != EXECUTING && mState != ERROR) { 678693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.wait(mLock); 679693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 680693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 681693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return mState == ERROR ? UNKNOWN_ERROR : OK; 682693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 683693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 684693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber// static 685693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberbool OMXCodec::isIntermediateState(State state) { 686693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return state == LOADED_TO_IDLE 687693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == IDLE_TO_EXECUTING 688693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == EXECUTING_TO_IDLE 689693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == IDLE_TO_LOADED 690693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == RECONFIGURING; 691693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 692693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 693693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::allocateBuffers() { 694693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = allocateBuffersOnPort(kPortIndexInput); 695693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 696693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 697693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 698693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 699693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 700693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return allocateBuffersOnPort(kPortIndexOutput); 701693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 702693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 703693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) { 704693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 705693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nSize = sizeof(def); 706693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMajor = 1; 707693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMinor = 1; 708693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nRevision = 0; 709693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nStep = 0; 710693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = portIndex; 711693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 712693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 713693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 714693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 715693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 716693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 717693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 718693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 719693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { 720693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<IMemory> mem = mDealer->allocate(def.nBufferSize); 721693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mem.get() != NULL); 722693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 723693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::buffer_id buffer; 724693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexInput 725693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && (mQuirks & kRequiresAllocateBufferOnInputPorts)) { 726693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->allocate_buffer_with_backup( 727693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, portIndex, mem, &buffer); 728693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 729693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->use_buffer(mNode, portIndex, mem, &buffer); 730693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 731693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 732693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 733693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("allocate_buffer_with_backup failed"); 734693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 735693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 736693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 737693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo info; 738693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mBuffer = buffer; 739693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mOwnedByComponent = false; 740693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMem = mem; 741693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMediaBuffer = NULL; 742693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 743693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexOutput) { 744693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMediaBuffer = new MediaBuffer(mem->pointer(), mem->size()); 745693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMediaBuffer->setObserver(this); 746693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 747693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 748693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[portIndex].push(info); 749693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 750693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("allocated buffer %p on %s port", buffer, 751693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber portIndex == kPortIndexInput ? "input" : "output"); 752693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 753693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 754693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber dumpPortStatus(portIndex); 755693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 756693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 757693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 758693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 759693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::on_message(const omx_message &msg) { 760693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 761693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 762693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (msg.type) { 763693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case omx_message::EVENT: 764693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 765693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onEvent( 766693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.event_data.event, msg.u.event_data.data1, 767693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.event_data.data2); 768693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 769693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 770693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 771693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 772693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 773693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 774693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer; 775693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 776693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("EMPTY_BUFFER_DONE(buffer: %p)", buffer); 777693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 778693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput]; 779693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t i = 0; 780693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (i < buffers->size() && (*buffers)[i].mBuffer != buffer) { 781693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++i; 782693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 783693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 784693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(i < buffers->size()); 785693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!(*buffers)[i].mOwnedByComponent) { 786693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGW("We already own input buffer %p, yet received " 787693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "an EMPTY_BUFFER_DONE.", buffer); 788693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 789693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 790693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->editItemAt(i).mOwnedByComponent = false; 791693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 792693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mPortStatus[kPortIndexInput] == DISABLING) { 793693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("Port is disabled, freeing buffer %p", buffer); 794693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 795693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 796693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->free_buffer(mNode, kPortIndexInput, buffer); 797693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 798693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 799693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->removeAt(i); 800693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (mPortStatus[kPortIndexInput] != SHUTTING_DOWN) { 801693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[kPortIndexInput], ENABLED); 802693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffer(&buffers->editItemAt(i)); 803693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 804693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 805693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 806693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 807693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 808693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case omx_message::FILL_BUFFER_DONE: 809693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 810693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer; 811693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 flags = msg.u.extended_buffer_data.flags; 812693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 813693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("FILL_BUFFER_DONE(buffer: %p, size: %ld, flags: 0x%08lx)", 814693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer, 815693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.range_length, 816693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber flags); 817693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 818693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("FILL_BUFFER_DONE(timestamp: %lld us (%.2f secs))", 819693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.timestamp, 820693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.timestamp / 1E6); 821693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 822693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 823693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t i = 0; 824693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (i < buffers->size() && (*buffers)[i].mBuffer != buffer) { 825693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++i; 826693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 827693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 828693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(i < buffers->size()); 829693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &buffers->editItemAt(i); 830693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 831693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!info->mOwnedByComponent) { 832693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGW("We already own output buffer %p, yet received " 833693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "a FILL_BUFFER_DONE.", buffer); 834693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 835693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 836693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mOwnedByComponent = false; 837693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 838693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mPortStatus[kPortIndexOutput] == DISABLING) { 839693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("Port is disabled, freeing buffer %p", buffer); 840693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 841693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 842693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->free_buffer(mNode, kPortIndexOutput, buffer); 843693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 844693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 845693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->removeAt(i); 846693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (flags & OMX_BUFFERFLAG_EOS) { 847693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("No more output data."); 848693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = true; 849693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.signal(); 850693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (mPortStatus[kPortIndexOutput] != SHUTTING_DOWN) { 851693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[kPortIndexOutput], ENABLED); 852bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 853693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaBuffer *buffer = info->mMediaBuffer; 854693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 855693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->set_range( 856693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.range_offset, 857693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.range_length); 858693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 859693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->clear(); 860693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 861693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setInt32( 862693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyTimeUnits, 863693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber (msg.u.extended_buffer_data.timestamp + 500) / 1000); 864693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 865693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setInt32( 866693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyTimeScale, 1000); 867693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 868693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (msg.u.extended_buffer_data.flags & OMX_BUFFERFLAG_SYNCFRAME) { 869693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setInt32(kKeyIsSyncFrame, true); 870693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 871693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 872693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setPointer( 873693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyPlatformPrivate, 874693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.platform_private); 875693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 876693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setPointer( 877693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyBufferID, 878693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.buffer); 879693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 880693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.push_back(i); 881693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.signal(); 882693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 883693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 884693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 885693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 886693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 887693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 888693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 889693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 890693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 891693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 892693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 893693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 894693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 895693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 896693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (event) { 897693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventCmdComplete: 898693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 899693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onCmdComplete((OMX_COMMANDTYPE)data1, data2); 900693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 901693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 902693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 903693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventError: 904693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 905693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("ERROR(%ld, %ld)", data1, data2); 906693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 907693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(ERROR); 908693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 909693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 910693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 911693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventPortSettingsChanged: 912693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 913693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onPortSettingsChanged(data1); 914693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 915693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 916693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 917693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventBufferFlag: 918693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 919693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("EVENT_BUFFER_FLAG(%ld)", data1); 920693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 921693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (data1 == kPortIndexOutput) { 922693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = true; 923693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 924693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 925693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 926693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 927693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 928693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 929693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("EVENT(%d, %ld, %ld)", event, data1, data2); 930693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 931693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 932693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 933693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 934693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 935693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data) { 936693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (cmd) { 937693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandStateSet: 938693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 939693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onStateChange((OMX_STATETYPE)data); 940693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 941693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 942693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 943693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandPortDisable: 944693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 945693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex = data; 946693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("PORT_DISABLED(%ld)", portIndex); 947693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 948693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 949693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], DISABLING); 950693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortBuffers[portIndex].size(), 0); 951693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 952693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = DISABLED; 953693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 954693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == RECONFIGURING) { 955693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 956693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 957693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber enablePortAsync(portIndex); 958693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 959693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = allocateBuffersOnPort(portIndex); 960693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 961693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 962693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 963693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 964693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 965693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandPortEnable: 966693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 967693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex = data; 968693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("PORT_ENABLED(%ld)", portIndex); 969693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 970693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 971693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], ENABLING); 972693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 973693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = ENABLED; 974693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 975693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == RECONFIGURING) { 976693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 977693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 978693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(EXECUTING); 979693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 980693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffers(); 981693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 982693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 983693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 984693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 985693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandFlush: 986693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 987693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex = data; 988693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 989693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("FLUSH_DONE(%ld)", portIndex); 990693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 991693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], SHUTTING_DOWN); 992693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = ENABLED; 993693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 994693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(countBuffersWeOwn(mPortBuffers[portIndex]), 995693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[portIndex].size()); 996693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 997693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == RECONFIGURING) { 998693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 999693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1000693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber disablePortAsync(portIndex); 1001693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1002693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // We're flushing both ports in preparation for seeking. 1003693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1004693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mPortStatus[kPortIndexInput] == ENABLED 1005693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && mPortStatus[kPortIndexOutput] == ENABLED) { 1006693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("Finished flushing both ports, now continuing from" 1007693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber " seek-time."); 1008693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1009693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffers(); 1010693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffers(); 1011693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1012693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1013693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1014693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1015693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1016693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1017693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1018693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1019693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("CMD_COMPLETE(%d, %ld)", cmd, data); 1020693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1021693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1022693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1023693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1024693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1025693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onStateChange(OMX_STATETYPE newState) { 1026693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (newState) { 1027693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_StateIdle: 1028693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1029693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("Now Idle."); 1030693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == LOADED_TO_IDLE) { 1031693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->send_command( 1032693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_CommandStateSet, OMX_StateExecuting); 1033693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1034693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1035693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1036693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(IDLE_TO_EXECUTING); 1037693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1038693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING_TO_IDLE); 1039693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1040693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ( 1041693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber countBuffersWeOwn(mPortBuffers[kPortIndexInput]), 1042693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[kPortIndexInput].size()); 1043693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1044693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ( 1045693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber countBuffersWeOwn(mPortBuffers[kPortIndexOutput]), 1046693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[kPortIndexOutput].size()); 1047693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1048693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->send_command( 1049693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_CommandStateSet, OMX_StateLoaded); 1050693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1051693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1052693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1053693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = freeBuffersOnPort(kPortIndexInput); 1054693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1055693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1056693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = freeBuffersOnPort(kPortIndexOutput); 1057693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1058693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1059693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexInput] = ENABLED; 1060693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexOutput] = ENABLED; 1061693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1062693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(IDLE_TO_LOADED); 1063693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1064693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1065693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1066693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1067693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_StateExecuting: 1068693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1069693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, IDLE_TO_EXECUTING); 1070693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1071693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("Now Executing."); 1072693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1073693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(EXECUTING); 1074693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1075693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffers(); 1076693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffers(); 1077693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1078693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1079693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1080693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_StateLoaded: 1081693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1082693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, IDLE_TO_LOADED); 1083693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1084693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("Now Loaded."); 1085693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1086693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(LOADED); 1087693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1088693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1089693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1090693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1091693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1092693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1093693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1094693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1095693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1096693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1097693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1098693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber// static 1099693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersize_t OMXCodec::countBuffersWeOwn(const Vector<BufferInfo> &buffers) { 1100693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t n = 0; 1101693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers.size(); ++i) { 1102693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!buffers[i].mOwnedByComponent) { 1103693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++n; 1104693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1105693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1106693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1107693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return n; 1108693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1109693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::freeBuffersOnPort( 1111693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex, bool onlyThoseWeOwn) { 1112693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 1113693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1114693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t stickyErr = OK; 1115693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1116693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = buffers->size(); i-- > 0;) { 1117693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &buffers->editItemAt(i); 1118693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (onlyThoseWeOwn && info->mOwnedByComponent) { 1120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber continue; 1121693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1122693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1123693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mOwnedByComponent, false); 1124693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1125693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1126693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->free_buffer(mNode, portIndex, info->mBuffer); 1127693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1128693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 1129693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber stickyErr = err; 1130693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1131693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1132693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (info->mMediaBuffer != NULL) { 1133693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMediaBuffer->setObserver(NULL); 1134693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1135693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // Make sure nobody but us owns this buffer at this point. 1136693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mMediaBuffer->refcount(), 0); 1137693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1138693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMediaBuffer->release(); 1139693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1140693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1141693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->removeAt(i); 1142693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1143693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1144693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(onlyThoseWeOwn || buffers->isEmpty()); 1145693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1146693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return stickyErr; 1147693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1148693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1149693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onPortSettingsChanged(OMX_U32 portIndex) { 1150693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("PORT_SETTINGS_CHANGED(%ld)", portIndex); 1151693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1152693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING); 1153693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 1154693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(RECONFIGURING); 1155693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1156693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mQuirks & kNeedsFlushBeforeDisable) { 1157693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber flushPortAsync(portIndex); 1158693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1159693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber disablePortAsync(portIndex); 1160693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1161693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1162693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1163693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::flushPortAsync(OMX_U32 portIndex) { 1164693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1165693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1166693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], ENABLED); 1167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = SHUTTING_DOWN; 1168693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1169693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1170693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->send_command(mNode, OMX_CommandFlush, portIndex); 1171693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1173693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1174693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::disablePortAsync(OMX_U32 portIndex) { 1175693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], ENABLED); 1178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = DISABLING; 1179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->send_command(mNode, OMX_CommandPortDisable, portIndex); 1182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber freeBuffersOnPort(portIndex, true); 1185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::enablePortAsync(OMX_U32 portIndex) { 1188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1189693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], DISABLED); 1191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = ENABLING; 1192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->send_command(mNode, OMX_CommandPortEnable, portIndex); 1195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::fillOutputBuffers() { 1199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING); 1200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 1202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffer(&buffers->editItemAt(i)); 1204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::drainInputBuffers() { 1208693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING); 1209693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1210693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput]; 1211693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1212693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffer(&buffers->editItemAt(i)); 1213693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1214693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1215693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1216693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::drainInputBuffer(BufferInfo *info) { 1217693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mOwnedByComponent, false); 1218693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1219693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mSignalledEOS) { 1220693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1221693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1222693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1223693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mCodecSpecificDataIndex < mCodecSpecificData.size()) { 1224693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const CodecSpecificData *specific = 1225693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificData[mCodecSpecificDataIndex]; 1226693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1227693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t size = specific->mSize; 1228693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1229dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber if (!strcasecmp("video/avc", mMIME) 1230dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber && !(mQuirks & kWantsNALFragments)) { 1231693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const uint8_t kNALStartCode[4] = 1232693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 0x00, 0x00, 0x00, 0x01 }; 1233693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1234693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(info->mMem->size() >= specific->mSize + 4); 1235693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1236693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size += 4; 1237693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1238693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(info->mMem->pointer(), kNALStartCode, 4); 1239693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy((uint8_t *)info->mMem->pointer() + 4, 1240693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber specific->mData, specific->mSize); 1241693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1242693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(info->mMem->size() >= specific->mSize); 1243693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(info->mMem->pointer(), specific->mData, specific->mSize); 1244693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1245693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1246693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->empty_buffer( 1247693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, info->mBuffer, 0, size, 1248693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_BUFFERFLAG_ENDOFFRAME | OMX_BUFFERFLAG_CODECCONFIG, 1249693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 0); 1250693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1251693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mOwnedByComponent = true; 1252693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1253693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++mCodecSpecificDataIndex; 1254693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1255693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1256693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1257693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaBuffer *srcBuffer; 1258693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err; 1259693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mSeekTimeUs >= 0) { 1260693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaSource::ReadOptions options; 1261693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber options.setSeekTo(mSeekTimeUs); 1262693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs = -1; 1263693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1264693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mSource->read(&srcBuffer, &options); 1265693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1266693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mSource->read(&srcBuffer); 1267693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1268693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1269693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME; 1270693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_TICKS timestamp = 0; 1271693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t srcLength = 0; 1272693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1273693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 1274693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("signalling end of input stream."); 1275693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber flags |= OMX_BUFFERFLAG_EOS; 1276693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1277693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS = true; 1278693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1279693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcLength = srcBuffer->range_length(); 1280693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1281693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (info->mMem->size() < srcLength) { 1282693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("info->mMem->size() = %d, srcLength = %d", 1283693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMem->size(), srcLength); 1284693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1285693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(info->mMem->size() >= srcLength); 1286693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(info->mMem->pointer(), 1287693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber (const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(), 1288693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcLength); 1289693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1290693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t units, scale; 1291693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (srcBuffer->meta_data()->findInt32(kKeyTimeUnits, &units) 1292693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && srcBuffer->meta_data()->findInt32(kKeyTimeScale, &scale)) { 1293693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber timestamp = ((OMX_TICKS)units * 1000000) / scale; 1294693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1295693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("Calling empty_buffer on buffer %p (length %d)", 1296693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mBuffer, srcLength); 1297693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("Calling empty_buffer with timestamp %lld us (%.2f secs)", 1298693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber timestamp, timestamp / 1E6); 1299693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1300693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1301693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1302693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->empty_buffer( 1303693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, info->mBuffer, 0, srcLength, 1304693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber flags, timestamp); 1305693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1306693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mOwnedByComponent = true; 1307693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1308693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (srcBuffer != NULL) { 1309693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcBuffer->release(); 1310693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcBuffer = NULL; 1311693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1312693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1313693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1314693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::fillOutputBuffer(BufferInfo *info) { 1315693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mOwnedByComponent, false); 1316693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1317693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("Calling fill_buffer on buffer %p", info->mBuffer); 1318693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->fill_buffer(mNode, info->mBuffer); 1319693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1320693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mOwnedByComponent = true; 1321693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1322693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1323693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::drainInputBuffer(IOMX::buffer_id buffer) { 1324693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput]; 1325693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1326693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if ((*buffers)[i].mBuffer == buffer) { 1327693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffer(&buffers->editItemAt(i)); 1328693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1329693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1330693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1331693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::fillOutputBuffer(IOMX::buffer_id buffer) { 1336693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 1337693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1338693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if ((*buffers)[i].mBuffer == buffer) { 1339693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffer(&buffers->editItemAt(i)); 1340693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1345693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1346693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1347693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setState(State newState) { 1348693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mState = newState; 1349693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.signal(); 1350693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1351693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // This may cause some spurious wakeups but is necessary to 1352693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // unblock the reader if we enter ERROR state. 1353693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.signal(); 1354693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1355693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1356693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setAMRFormat() { 1357693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!mIsEncoder) { 1358693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 1359693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nSize = sizeof(def); 1360693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMajor = 1; 1361693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMinor = 1; 1362693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 1363693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1364693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1365693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->get_parameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1366693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1367693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1368693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1369693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 1370693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.eAMRBandMode = OMX_AUDIO_AMRBandModeNB0; 1371693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1372693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1373693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1374693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1375693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1376693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber //////////////////////// 1377693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1378693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mIsEncoder) { 1379693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> format = mSource->getFormat(); 1380693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t sampleRate; 1381693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t numChannels; 1382693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(format->findInt32(kKeySampleRate, &sampleRate)); 1383693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(format->findInt32(kKeyChannelCount, &numChannels)); 1384693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1385693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE pcmParams; 1386693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.nSize = sizeof(pcmParams); 1387693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.nVersion.s.nVersionMajor = 1; 1388693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.nVersion.s.nVersionMinor = 1; 1389693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.nPortIndex = kPortIndexInput; 1390693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1391693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 1392693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1393693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1394693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1395693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1396693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.nChannels = numChannels; 1397693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.eNumData = OMX_NumericalDataSigned; 1398693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.bInterleaved = OMX_TRUE; 1399693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.nBitPerSample = 16; 1400693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.nSamplingRate = sampleRate; 1401693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear; 1402693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1403693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (numChannels == 1) { 1404693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelCF; 1405693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1406693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(numChannels, 2); 1407693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1408693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelLF; 1409693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber pcmParams.eChannelMapping[1] = OMX_AUDIO_ChannelRF; 1410693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1411693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1412693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 1413693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1414693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1415693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1416693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1417693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1418693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1419693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setAACFormat() { 1420693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE def; 1421693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nSize = sizeof(def); 1422693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMajor = 1; 1423693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMinor = 1; 1424693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 1425693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1426693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1427693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->get_parameter(mNode, OMX_IndexParamAudioAac, &def, sizeof(def)); 1428693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1429693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1430693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS; 1431693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1432693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter(mNode, OMX_IndexParamAudioAac, &def, sizeof(def)); 1433693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1434693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1435693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1436693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setImageOutputFormat( 1437693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height) { 1438693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("setImageOutputFormat(%ld, %ld)", width, height); 1439693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1440693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 0 1441693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE index; 1442693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_extension_index( 1443693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, "OMX.TI.JPEG.decode.Config.OutputColorFormat", &index); 1444693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1445693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1446693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_config(mNode, index, &format, sizeof(format)); 1447693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1448693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 1449693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1450693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1451693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nSize = sizeof(def); 1452693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMajor = 1; 1453693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMinor = 1; 1454693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 1455693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1456693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 1457693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1458693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1459693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1460693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainImage); 1461693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1462693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; 1463bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 1464693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingUnused); 1465693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->eColorFormat = format; 1466693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameWidth = width; 1467693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameHeight = height; 1468693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1469693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (format) { 1470693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_FormatYUV420PackedPlanar: 1471693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_FormatYUV411Planar: 1472693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1473693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = (width * height * 3) / 2; 1474693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1475693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1476693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1477693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_FormatCbYCrY: 1478693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1479693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = width * height * 2; 1480693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1481693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1482693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1483693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_Format32bitARGB8888: 1484693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1485693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = width * height * 4; 1486693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1487693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1488693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1489693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1490693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Should not be here. Unknown color format."); 1491693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1492693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1493693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1494693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 1495693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1496693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1497693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1498693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber //// 1499693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1500693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 1501693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1502693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->get_parameter( 1503693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1504693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1505693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1506693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingJPEG); 1507693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameWidth = width; 1508693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameHeight = height; 1509693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1510693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = 128 * 1024; 1511693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferCountActual = def.nBufferCountMin; 1512693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1513693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_parameter( 1514693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1515693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1516693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1517693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1518693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::addCodecSpecificData(const void *data, size_t size) { 1519693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CodecSpecificData *specific = 1520693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber (CodecSpecificData *)malloc(sizeof(CodecSpecificData) + size - 1); 1521693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1522693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber specific->mSize = size; 1523693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(specific->mData, data, size); 1524693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1525693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificData.push(specific); 1526693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1527693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1528693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::clearCodecSpecificData() { 1529693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < mCodecSpecificData.size(); ++i) { 1530693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(mCodecSpecificData.editItemAt(i)); 1531693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1532693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificData.clear(); 1533693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificDataIndex = 0; 1534693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1535693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1536693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::start(MetaData *) { 1537693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState != LOADED) { 1538693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return UNKNOWN_ERROR; 1539693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1540bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 1541693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> params = new MetaData; 1542dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber if (mQuirks & kWantsNALFragments) { 1543dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber params->setInt32(kKeyWantsNALFragments, true); 1544693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1545693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mSource->start(params.get()); 1546693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1547693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 1548693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 1549693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1550693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1551693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificDataIndex = 0; 1552693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS = false; 1553693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = false; 1554693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs = -1; 1555693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.clear(); 1556693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1557693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return init(); 1558693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1559693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1560693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::stop() { 1561693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGI("stop"); 1562693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1563693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 1564693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1565693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (isIntermediateState(mState)) { 1566693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.wait(mLock); 1567693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1568693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1569693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (mState) { 1570693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case LOADED: 1571693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case ERROR: 1572693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1573693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1574693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case EXECUTING: 1575693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1576693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(EXECUTING_TO_IDLE); 1577693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1578693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexInput] = SHUTTING_DOWN; 1579693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexOutput] = SHUTTING_DOWN; 1580693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1581693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1582693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOMX->send_command(mNode, OMX_CommandStateSet, OMX_StateIdle); 1583693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1584693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1585693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (mState != LOADED && mState != ERROR) { 1586693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.wait(mLock); 1587693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1588693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1589693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1590693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1591693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1592693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1593693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1594693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1595693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1596693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1597693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1598693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1599693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSource->stop(); 1600693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1601693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 1602693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1603693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1604693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersp<MetaData> OMXCodec::getFormat() { 1605693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return mOutputFormat; 1606693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1607693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1608693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::read( 1609693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaBuffer **buffer, const ReadOptions *options) { 1610693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *buffer = NULL; 1611693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1612693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 1613693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1614693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState != EXECUTING && mState != RECONFIGURING) { 1615693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return UNKNOWN_ERROR; 1616693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1617693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1618693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t seekTimeUs; 1619693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (options && options->getSeekTo(&seekTimeUs)) { 1620693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGV("seeking to %lld us (%.2f secs)", seekTimeUs, seekTimeUs / 1E6); 1621693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1622693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS = false; 1623693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = false; 1624693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1625693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(seekTimeUs >= 0); 1626693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs = seekTimeUs; 1627693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1628693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.clear(); 1629693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1630693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING); 1631693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1632693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber flushPortAsync(kPortIndexInput); 1633693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber flushPortAsync(kPortIndexOutput); 1634693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1635693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1636693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (mState != ERROR && !mNoMoreOutputData && mFilledBuffers.empty()) { 1637693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.wait(mLock); 1638693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1639693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1640693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == ERROR) { 1641693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return UNKNOWN_ERROR; 1642693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1643693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1644693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mFilledBuffers.empty()) { 1645693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return ERROR_END_OF_STREAM; 1646693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1647693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1648693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t index = *mFilledBuffers.begin(); 1649693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.erase(mFilledBuffers.begin()); 1650693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1651693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index); 1652693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMediaBuffer->add_ref(); 1653693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *buffer = info->mMediaBuffer; 1654693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1655693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 1656693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1657693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1658693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::signalBufferReturned(MediaBuffer *buffer) { 1659693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 1660693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1661693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 1662693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1663693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &buffers->editItemAt(i); 1664693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1665693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (info->mMediaBuffer == buffer) { 1666693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[kPortIndexOutput], ENABLED); 1667693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffer(info); 1668693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1669693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1670693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1671693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1672693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1673693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1674693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1675693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *imageCompressionFormatString(OMX_IMAGE_CODINGTYPE type) { 1676693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 1677693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingUnused", 1678693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingAutoDetect", 1679693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingJPEG", 1680693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingJPEG2K", 1681693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingEXIF", 1682693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingTIFF", 1683693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingGIF", 1684693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingPNG", 1685693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingLZW", 1686693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingBMP", 1687693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 1688693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1689693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 1690693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1691693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 1692693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 1693693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1694693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 1695693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1696693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1697693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1698693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *colorFormatString(OMX_COLOR_FORMATTYPE type) { 1699693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 1700693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatUnused", 1701693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatMonochrome", 1702693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format8bitRGB332", 1703693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format12bitRGB444", 1704693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitARGB4444", 1705693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitARGB1555", 1706693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitRGB565", 1707693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitBGR565", 1708693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format18bitRGB666", 1709693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format18bitARGB1665", 1710bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_Format19bitARGB1666", 1711693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24bitRGB888", 1712693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24bitBGR888", 1713693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24bitARGB1887", 1714693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format25bitARGB1888", 1715693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format32bitBGRA8888", 1716693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format32bitARGB8888", 1717693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV411Planar", 1718693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV411PackedPlanar", 1719693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420Planar", 1720693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420PackedPlanar", 1721693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420SemiPlanar", 1722693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422Planar", 1723693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422PackedPlanar", 1724693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422SemiPlanar", 1725693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYCbYCr", 1726693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYCrYCb", 1727693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatCbYCrY", 1728693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatCrYCbY", 1729693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV444Interleaved", 1730693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatRawBayer8bit", 1731693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatRawBayer10bit", 1732693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatRawBayer8bitcompressed", 1733bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL2", 1734bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL4", 1735bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL8", 1736bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL16", 1737bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL24", 1738693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatL32", 1739693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420PackedSemiPlanar", 1740693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422PackedSemiPlanar", 1741693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format18BitBGR666", 1742693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24BitARGB6666", 1743693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24BitABGR6666", 1744693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 1745693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1746693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 1747693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1748693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const int OMX_QCOM_COLOR_FormatYVU420SemiPlanar = 0x7FA30C00; 1749693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1750693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type == OMX_QCOM_COLOR_FormatYVU420SemiPlanar) { 1751693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "OMX_QCOM_COLOR_FormatYVU420SemiPlanar"; 1752693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (type < 0 || (size_t)type >= numNames) { 1753693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 1754693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1755693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 1756693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1757693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1758693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1759693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *videoCompressionFormatString(OMX_VIDEO_CODINGTYPE type) { 1760693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 1761693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingUnused", 1762693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingAutoDetect", 1763693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingMPEG2", 1764693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingH263", 1765693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingMPEG4", 1766693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingWMV", 1767693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingRV", 1768693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingAVC", 1769693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingMJPEG", 1770693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 1771693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1772693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 1773693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1774693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 1775693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 1776693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1777693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 1778693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1779693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1780693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1781693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *audioCodingTypeString(OMX_AUDIO_CODINGTYPE type) { 1782693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 1783693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingUnused", 1784693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingAutoDetect", 1785693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPCM", 1786693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingADPCM", 1787693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingAMR", 1788693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingGSMFR", 1789693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingGSMEFR", 1790693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingGSMHR", 1791693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPDCFR", 1792693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPDCEFR", 1793693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPDCHR", 1794693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingTDMAFR", 1795693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingTDMAEFR", 1796693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingQCELP8", 1797693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingQCELP13", 1798693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingEVRC", 1799693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingSMV", 1800693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG711", 1801693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG723", 1802693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG726", 1803693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG729", 1804693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingAAC", 1805693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingMP3", 1806693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingSBC", 1807693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingVORBIS", 1808693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingWMA", 1809693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingRA", 1810693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingMIDI", 1811693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 1812693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1813693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 1814693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1815693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 1816693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 1817693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1818693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 1819693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1820693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1821693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1822693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *audioPCMModeString(OMX_AUDIO_PCMMODETYPE type) { 1823693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 1824693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_PCMModeLinear", 1825693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_PCMModeALaw", 1826693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_PCMModeMULaw", 1827693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 1828693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1829693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 1830693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1831693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 1832693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 1833693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1834693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 1835693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1836693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1837693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1838693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1839693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::dumpPortStatus(OMX_U32 portIndex) { 1840693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1841693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nSize = sizeof(def); 1842693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMajor = 1; 1843693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMinor = 1; 1844693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = portIndex; 1845693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1846693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 1847693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1848693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1849693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1850693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("%s Port = {\n", portIndex == kPortIndexInput ? "Input" : "Output"); 1851693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1852693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK((portIndex == kPortIndexInput && def.eDir == OMX_DirInput) 1853693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || (portIndex == kPortIndexOutput && def.eDir == OMX_DirOutput)); 1854693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1855693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBufferCountActual = %ld\n", def.nBufferCountActual); 1856693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBufferCountMin = %ld\n", def.nBufferCountMin); 1857693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBufferSize = %ld\n", def.nBufferSize); 1858693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1859693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (def.eDomain) { 1860693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainImage: 1861693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1862693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; 1863693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1864693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 1865693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Image\n"); 1866693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameWidth = %ld\n", imageDef->nFrameWidth); 1867693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameHeight = %ld\n", imageDef->nFrameHeight); 1868693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nStride = %ld\n", imageDef->nStride); 1869693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1870693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eCompressionFormat = %s\n", 1871693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageCompressionFormatString(imageDef->eCompressionFormat)); 1872693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1873693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eColorFormat = %s\n", 1874693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormatString(imageDef->eColorFormat)); 1875693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1876693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1877693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1878693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1879693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainVideo: 1880693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1881693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *videoDef = &def.format.video; 1882693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1883693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 1884693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Video\n"); 1885693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameWidth = %ld\n", videoDef->nFrameWidth); 1886693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameHeight = %ld\n", videoDef->nFrameHeight); 1887693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nStride = %ld\n", videoDef->nStride); 1888693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1889693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eCompressionFormat = %s\n", 1890693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber videoCompressionFormatString(videoDef->eCompressionFormat)); 1891693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1892693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eColorFormat = %s\n", 1893693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormatString(videoDef->eColorFormat)); 1894693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1895693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1896693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1897693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1898693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainAudio: 1899693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1900693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audioDef = &def.format.audio; 1901693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1902693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 1903693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Audio\n"); 1904693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eEncoding = %s\n", 1905693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber audioCodingTypeString(audioDef->eEncoding)); 1906693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1907693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (audioDef->eEncoding == OMX_AUDIO_CodingPCM) { 1908693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 1909693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.nSize = sizeof(params); 1910693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.nVersion.s.nVersionMajor = 1; 1911693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.nVersion.s.nVersionMinor = 1; 1912693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.nPortIndex = portIndex; 1913693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1914693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->get_parameter( 1915693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamAudioPcm, ¶ms, sizeof(params)); 1916693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1917693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1918693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nSamplingRate = %ld\n", params.nSamplingRate); 1919693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nChannels = %ld\n", params.nChannels); 1920693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" bInterleaved = %d\n", params.bInterleaved); 1921693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBitPerSample = %ld\n", params.nBitPerSample); 1922693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1923693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eNumData = %s\n", 1924693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.eNumData == OMX_NumericalDataSigned 1925693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ? "signed" : "unsigned"); 1926693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1927693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" ePCMMode = %s\n", audioPCMModeString(params.ePCMMode)); 1928693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1929693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1930693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1931693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1932693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1933693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1934693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1935693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Unknown\n"); 1936693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1937693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1938693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1939693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1940693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("}\n"); 1941693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1942693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1943693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::initOutputFormat(const sp<MetaData> &inputFormat) { 1944693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat = new MetaData; 1945693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyDecoderComponent, mComponentName); 1946693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1947693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1948693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nSize = sizeof(def); 1949693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMajor = 1; 1950693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nVersion.s.nVersionMinor = 1; 1951693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 1952693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1953693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_parameter( 1954693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1955693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1956693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1957693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (def.eDomain) { 1958693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainImage: 1959693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1960693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; 1961693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingUnused); 1962693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1963693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyMIMEType, "image/raw"); 1964693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyColorFormat, imageDef->eColorFormat); 1965693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyWidth, imageDef->nFrameWidth); 1966693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyHeight, imageDef->nFrameHeight); 1967693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1968693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1969693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1970693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainAudio: 1971693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1972693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audio_def = &def.format.audio; 1973693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1974693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(audio_def->eEncoding, OMX_AUDIO_CodingPCM); 1975693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1976693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 1977693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.nSize = sizeof(params); 1978693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.nVersion.s.nVersionMajor = 1; 1979693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.nVersion.s.nVersionMinor = 1; 1980693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.nPortIndex = kPortIndexOutput; 1981693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1982693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->get_parameter( 1983693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamAudioPcm, ¶ms, sizeof(params)); 1984693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1985693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1986693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(params.eNumData, OMX_NumericalDataSigned); 1987693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(params.nBitPerSample, 16); 1988693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(params.ePCMMode, OMX_AUDIO_PCMModeLinear); 1989693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1990693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t numChannels, sampleRate; 1991693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber inputFormat->findInt32(kKeyChannelCount, &numChannels); 1992693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber inputFormat->findInt32(kKeySampleRate, &sampleRate); 1993693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1994693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyMIMEType, "audio/raw"); 1995693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyChannelCount, numChannels); 1996693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeySampleRate, sampleRate); 1997693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1998693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1999693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2000693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainVideo: 2001693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2002693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 2003693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2004693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (video_def->eCompressionFormat == OMX_VIDEO_CodingUnused) { 2005693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyMIMEType, "video/raw"); 2006693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingMPEG4) { 2007693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyMIMEType, "video/mp4v-es"); 2008693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingH263) { 2009693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyMIMEType, "video/3gpp"); 2010693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingAVC) { 2011693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyMIMEType, "video/avc"); 2012693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2013693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Unknown compression format."); 2014693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2015693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2016693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(mComponentName, "OMX.PV.avcdec")) { 2017693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // This component appears to be lying to me. 2018693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32( 2019693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyWidth, (video_def->nFrameWidth + 15) & -16); 2020693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32( 2021693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyHeight, (video_def->nFrameHeight + 15) & -16); 2022693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2023693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyWidth, video_def->nFrameWidth); 2024693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyHeight, video_def->nFrameHeight); 2025693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2026693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2027693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyColorFormat, video_def->eColorFormat); 2028693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2029693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2030693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2031693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 2032693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2033693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here, neither audio nor video."); 2034693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2035693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2036693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2037693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2038693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2039693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} // namespace android 2040