OMXCodec.cpp revision ba229b3faa98b3bb6567cf95040062be2d9c2b3f
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 2189e69da4d86348409994c9dafbbb2634ccd7c196Andreas Huber#include "include/ESDS.h" 2289e69da4d86348409994c9dafbbb2634ccd7c196Andreas Huber 23693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <binder/IServiceManager.h> 24693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <binder/MemoryDealer.h> 25693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <binder/ProcessState.h> 26693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/IMediaPlayerService.h> 27693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MediaBuffer.h> 28693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MediaBufferGroup.h> 29693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MediaDebug.h> 3018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h> 31693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MediaExtractor.h> 32693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MetaData.h> 33693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MmapSource.h> 34693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/OMXCodec.h> 35bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber#include <media/stagefright/Utils.h> 36693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <utils/Vector.h> 37693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 38693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <OMX_Audio.h> 39693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <OMX_Component.h> 40693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 41693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubernamespace android { 42693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 43ec430b158df17b2c766f7750a96c35d3902f5f49Andreas Huberstatic const int OMX_QCOM_COLOR_FormatYVU420SemiPlanar = 0x7FA30C00; 44ec430b158df17b2c766f7750a96c35d3902f5f49Andreas Huber 45693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstruct CodecInfo { 46693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime; 47693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *codec; 48693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}; 49693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 50693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const CodecInfo kDecoderInfo[] = { 5118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_IMAGE_JPEG, "OMX.TI.JPEG.decode" }, 5218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG, "OMX.TI.MP3.decode" }, 5318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG, "OMX.PV.mp3dec" }, 5418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.TI.AMR.decode" }, 5518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.PV.amrdec" }, 5618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, "OMX.TI.WBAMR.decode" }, 5718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, "OMX.PV.amrdec" }, 5818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, "OMX.TI.AAC.decode" }, 5918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, "OMX.PV.aacdec" }, 6018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.qcom.video.decoder.mpeg4" }, 6118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.TI.Video.Decoder" }, 6218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.PV.mpeg4dec" }, 6318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, "OMX.qcom.video.decoder.h263" }, 6418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, "OMX.TI.Video.Decoder" }, 6518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, "OMX.PV.h263dec" }, 6618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.qcom.video.decoder.avc" }, 6718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.TI.Video.Decoder" }, 6818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.PV.avcdec" }, 69693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}; 70693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 71693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const CodecInfo kEncoderInfo[] = { 7218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.TI.AMR.encode" }, 7318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.PV.amrencnb" }, 7418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, "OMX.TI.WBAMR.encode" }, 7518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, "OMX.TI.AAC.encode" }, 7618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, "OMX.PV.aacenc" }, 7718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.qcom.video.encoder.mpeg4" }, 7818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.TI.Video.encoder" }, 7918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.PV.mpeg4enc" }, 8018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, "OMX.qcom.video.encoder.h263" }, 8118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, "OMX.TI.Video.encoder" }, 8218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, "OMX.PV.h263enc" }, 8318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.TI.Video.encoder" }, 8418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.PV.avcenc" }, 85693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}; 86693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 878cd11d23197209e2c2bdb7980bc17e3f1257a118Andreas Huber#define CODEC_LOGI(x, ...) LOGI("[%s] "x, mComponentName, ##__VA_ARGS__) 887a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber#define CODEC_LOGV(x, ...) LOGV("[%s] "x, mComponentName, ##__VA_ARGS__) 897a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 90693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstruct OMXCodecObserver : public BnOMXObserver { 91318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXCodecObserver() { 92318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 94318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber void setCodec(const sp<OMXCodec> &target) { 95318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mTarget = target; 96693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 97693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 98693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // from IOMXObserver 99318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual void onMessage(const omx_message &msg) { 100693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<OMXCodec> codec = mTarget.promote(); 101693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 102693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (codec.get() != NULL) { 103693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->on_message(msg); 104693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 105693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 106693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 107693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprotected: 108693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual ~OMXCodecObserver() {} 109693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprivate: 111693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber wp<OMXCodec> mTarget; 112693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 113693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMXCodecObserver(const OMXCodecObserver &); 114693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMXCodecObserver &operator=(const OMXCodecObserver &); 115693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}; 116693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 117693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *GetCodec(const CodecInfo *info, size_t numInfos, 118693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, int index) { 119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(index >= 0); 120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for(size_t i = 0; i < numInfos; ++i) { 121693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcasecmp(mime, info[i].mime)) { 122693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (index == 0) { 123693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return info[i].codec; 124693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 125693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 126693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber --index; 127693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 128693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 129693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 130693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return NULL; 131693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 132693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 133bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huberenum { 134bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileBaseline = 0x42, 135bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileMain = 0x4d, 136bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileExtended = 0x58, 137bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh = 0x64, 138bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh10 = 0x6e, 139bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh422 = 0x7a, 140bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileHigh444 = 0xf4, 141bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber kAVCProfileCAVLC444Intra = 0x2c 142bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber}; 143bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 144bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huberstatic const char *AVCProfileToString(uint8_t profile) { 145bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber switch (profile) { 146bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileBaseline: 147bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "Baseline"; 148bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileMain: 149bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "Main"; 150bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileExtended: 151bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "Extended"; 152bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh: 153bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High"; 154bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh10: 155bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High 10"; 156bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh422: 157bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High 422"; 158bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileHigh444: 159bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "High 444"; 160bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber case kAVCProfileCAVLC444Intra: 161bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return "CAVLC 444 Intra"; 162bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber default: return "Unknown"; 163bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber } 164bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber} 165bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 1667a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Hubertemplate<class T> 1677a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huberstatic void InitOMXParams(T *params) { 1687a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber params->nSize = sizeof(T); 1697a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber params->nVersion.s.nVersionMajor = 1; 1707a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber params->nVersion.s.nVersionMinor = 0; 1717a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber params->nVersion.s.nRevision = 0; 1727a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber params->nVersion.s.nStep = 0; 1737a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber} 1747a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 175ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huberstatic bool IsSoftwareCodec(const char *componentName) { 176ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber if (!strncmp("OMX.PV.", componentName, 7)) { 177ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber return true; 178ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } 179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 180ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber return false; 181ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber} 182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 183ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huberstatic int CompareSoftwareCodecsFirst( 184ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber const String8 *elem1, const String8 *elem2) { 185ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber bool isSoftwareCodec1 = IsSoftwareCodec(elem1->string()); 186ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber bool isSoftwareCodec2 = IsSoftwareCodec(elem2->string()); 187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 188ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber if (isSoftwareCodec1) { 189ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber if (isSoftwareCodec2) { return 0; } 190ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber return -1; 191ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } 192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 193ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber if (isSoftwareCodec2) { 194ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber return 1; 195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 197ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber return 0; 198ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber} 199ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 200ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber// static 201ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huberuint32_t OMXCodec::getComponentQuirks(const char *componentName) { 202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber uint32_t quirks = 0; 203ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(componentName, "OMX.PV.avcdec")) { 205dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber quirks |= kWantsNALFragments; 206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(componentName, "OMX.TI.MP3.decode")) { 208693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kNeedsFlushBeforeDisable; 209693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 210693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(componentName, "OMX.TI.AAC.decode")) { 211693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kNeedsFlushBeforeDisable; 2121beb760d920561679862ded945a04e370368c7f7Andreas Huber quirks |= kRequiresFlushCompleteEmulation; 213693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 214693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strncmp(componentName, "OMX.qcom.video.encoder.", 23)) { 215693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kRequiresLoadedToIdleAfterAllocation; 216693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber quirks |= kRequiresAllocateBufferOnInputPorts; 217693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 218b7802d9ee9c9dbb471ae4f010bd67ba1aaa9f264Andreas Huber if (!strncmp(componentName, "OMX.qcom.video.decoder.", 23)) { 219b7802d9ee9c9dbb471ae4f010bd67ba1aaa9f264Andreas Huber // XXX Required on P....on only. 220b7802d9ee9c9dbb471ae4f010bd67ba1aaa9f264Andreas Huber quirks |= kRequiresAllocateBufferOnOutputPorts; 221b7802d9ee9c9dbb471ae4f010bd67ba1aaa9f264Andreas Huber } 222693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 223df4de7d7bd0060a84b064ce074d3f86d3a7aa0aeAndreas Huber if (!strncmp(componentName, "OMX.TI.", 7)) { 224df4de7d7bd0060a84b064ce074d3f86d3a7aa0aeAndreas Huber // Apparently I must not use OMX_UseBuffer on either input or 225df4de7d7bd0060a84b064ce074d3f86d3a7aa0aeAndreas Huber // output ports on any of the TI components or quote: 226df4de7d7bd0060a84b064ce074d3f86d3a7aa0aeAndreas Huber // "(I) may have unexpected problem (sic) which can be timing related 227df4de7d7bd0060a84b064ce074d3f86d3a7aa0aeAndreas Huber // and hard to reproduce." 228df4de7d7bd0060a84b064ce074d3f86d3a7aa0aeAndreas Huber 229df4de7d7bd0060a84b064ce074d3f86d3a7aa0aeAndreas Huber quirks |= kRequiresAllocateBufferOnInputPorts; 230df4de7d7bd0060a84b064ce074d3f86d3a7aa0aeAndreas Huber quirks |= kRequiresAllocateBufferOnOutputPorts; 231df4de7d7bd0060a84b064ce074d3f86d3a7aa0aeAndreas Huber } 232df4de7d7bd0060a84b064ce074d3f86d3a7aa0aeAndreas Huber 233ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber return quirks; 234ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber} 235ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 236ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber// static 237ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Hubervoid OMXCodec::findMatchingCodecs( 238ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber const char *mime, 239ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber bool createEncoder, const char *matchComponentName, 240ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber uint32_t flags, 241ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber Vector<String8> *matchingCodecs) { 242ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber matchingCodecs->clear(); 243ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 244ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber for (int index = 0;; ++index) { 245ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber const char *componentName; 246ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 247ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber if (createEncoder) { 248ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber componentName = GetCodec( 249ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber kEncoderInfo, 250ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber sizeof(kEncoderInfo) / sizeof(kEncoderInfo[0]), 251ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber mime, index); 252ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } else { 253ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber componentName = GetCodec( 254ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber kDecoderInfo, 255ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber sizeof(kDecoderInfo) / sizeof(kDecoderInfo[0]), 256ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber mime, index); 257ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } 258ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 259ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber if (!componentName) { 260ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber break; 261ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } 262ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 263ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber // If a specific codec is requested, skip the non-matching ones. 264ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber if (matchComponentName && strcmp(componentName, matchComponentName)) { 265ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber continue; 266ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } 267ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 268ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber matchingCodecs->push(String8(componentName)); 269ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } 270ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 271ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber if (flags & kPreferSoftwareCodecs) { 272ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber matchingCodecs->sort(CompareSoftwareCodecsFirst); 273ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } 274ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber} 275ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 276ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber// static 277ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Hubersp<OMXCodec> OMXCodec::Create( 278ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber const sp<IOMX> &omx, 279ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber const sp<MetaData> &meta, bool createEncoder, 280ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber const sp<MediaSource> &source, 281ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber const char *matchComponentName, 282ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber uint32_t flags) { 283ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber const char *mime; 284ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber bool success = meta->findCString(kKeyMIMEType, &mime); 285ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber CHECK(success); 286ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 287ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber Vector<String8> matchingCodecs; 288ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber findMatchingCodecs( 289ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber mime, createEncoder, matchComponentName, flags, &matchingCodecs); 290ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 291ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber if (matchingCodecs.isEmpty()) { 292ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber return NULL; 293ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } 294ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 295ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber sp<OMXCodecObserver> observer = new OMXCodecObserver; 296ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber IOMX::node_id node = 0; 297ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber success = false; 298ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 299ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber const char *componentName; 300ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber for (size_t i = 0; i < matchingCodecs.size(); ++i) { 301ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber componentName = matchingCodecs[i].string(); 302ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 303ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber LOGV("Attempting to allocate OMX node '%s'", componentName); 304ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 305ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber status_t err = omx->allocateNode(componentName, observer, &node); 306ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber if (err == OK) { 307ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber LOGV("Successfully allocated OMX node '%s'", componentName); 308ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 309ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber success = true; 310ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber break; 311ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } 312ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } 313ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 314ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber if (!success) { 315ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber return NULL; 316ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber } 317ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber 318693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<OMXCodec> codec = new OMXCodec( 319ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber omx, node, getComponentQuirks(componentName), 320ba229b3faa98b3bb6567cf95040062be2d9c2b3fAndreas Huber createEncoder, mime, componentName, 321693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber source); 322693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 323318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber observer->setCodec(codec); 324318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 325693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber uint32_t type; 326693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const void *data; 327693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t size; 328693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (meta->findData(kKeyESDS, &type, &data, &size)) { 329693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ESDS esds((const char *)data, size); 330693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(esds.InitCheck(), OK); 331693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const void *codec_specific_data; 333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t codec_specific_data_size; 334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber esds.getCodecSpecificInfo( 335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &codec_specific_data, &codec_specific_data_size); 336693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 337693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("found codec-specific data of size %d\n", 338693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec_specific_data_size); 339693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 340693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->addCodecSpecificData( 341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec_specific_data, codec_specific_data_size); 342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (meta->findData(kKeyAVCC, &type, &data, &size)) { 343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("found avcc of size %d\n", size); 344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 345bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // Parse the AVCDecoderConfigurationRecord 346bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 347bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber const uint8_t *ptr = (const uint8_t *)data; 348bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 349bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 7); 350bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK_EQ(ptr[0], 1); // configurationVersion == 1 351bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber uint8_t profile = ptr[1]; 352bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber uint8_t level = ptr[3]; 353bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 354bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK((ptr[4] >> 2) == 0x3f); // reserved 355bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 356bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t lengthSize = 1 + (ptr[4] & 3); 357bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 358bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // commented out check below as H264_QVGA_500_NO_AUDIO.3gp 359bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // violates it... 360bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber // CHECK((ptr[5] >> 5) == 7); // reserved 361bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 362bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t numSeqParameterSets = ptr[5] & 31; 363bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 364bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ptr += 6; 365693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size -= 6; 366bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 367bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber for (size_t i = 0; i < numSeqParameterSets; ++i) { 368bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 2); 369bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t length = U16_AT(ptr); 370693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 371693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ptr += 2; 372693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size -= 2; 373693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 374bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= length); 375bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 376bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber codec->addCodecSpecificData(ptr, length); 377bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 378bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ptr += length; 379bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size -= length; 380bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber } 381bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 382bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 1); 383bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t numPictureParameterSets = *ptr; 384bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ++ptr; 385bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber --size; 386bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 387bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber for (size_t i = 0; i < numPictureParameterSets; ++i) { 388bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber CHECK(size >= 2); 389bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size_t length = U16_AT(ptr); 390bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 391bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber ptr += 2; 392bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber size -= 2; 393693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 394693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(size >= length); 395693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 396693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->addCodecSpecificData(ptr, length); 397693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 398693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ptr += length; 399693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size -= length; 400bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber } 401693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 4022a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber LOGV("AVC profile = %d (%s), level = %d", 403bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber (int)profile, AVCProfileToString(profile), (int)level / 10); 404693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 405bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber if (!strcmp(componentName, "OMX.TI.Video.Decoder") 406bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber && (profile != kAVCProfileBaseline || level > 39)) { 407318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber // This stream exceeds the decoder's capabilities. The decoder 408318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber // does not handle this gracefully and would clobber the heap 409318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber // and wreak havoc instead... 410bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 411bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber LOGE("Profile and/or level exceed the decoder's capabilities."); 412bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber return NULL; 413693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 414693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 415693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 41618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_NB, mime)) { 417693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setAMRFormat(); 418693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 41918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_WB, mime)) { 420456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber codec->setAMRWBFormat(); 421456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber } 42218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AAC, mime)) { 42337940eefcba982836b579fe1ffec6cada72b0974Andreas Huber int32_t numChannels, sampleRate; 42437940eefcba982836b579fe1ffec6cada72b0974Andreas Huber CHECK(meta->findInt32(kKeyChannelCount, &numChannels)); 42537940eefcba982836b579fe1ffec6cada72b0974Andreas Huber CHECK(meta->findInt32(kKeySampleRate, &sampleRate)); 42637940eefcba982836b579fe1ffec6cada72b0974Andreas Huber 42737940eefcba982836b579fe1ffec6cada72b0974Andreas Huber codec->setAACFormat(numChannels, sampleRate); 428693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 429693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strncasecmp(mime, "video/", 6)) { 430693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t width, height; 431693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool success = meta->findInt32(kKeyWidth, &width); 432693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber success = success && meta->findInt32(kKeyHeight, &height); 4337530e9c708275c273c134c36c68179f511c1940eAndreas Huber CHECK(success); 434693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 435693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (createEncoder) { 436693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setVideoInputFormat(mime, width, height); 437693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 438693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setVideoOutputFormat(mime, width, height); 439693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 440693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 44118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_IMAGE_JPEG) 442693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && !strcmp(componentName, "OMX.TI.JPEG.decode")) { 443693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE format = 444693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_Format32bitARGB8888; 445693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // OMX_COLOR_FormatYUV420PackedPlanar; 446693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // OMX_COLOR_FormatCbYCrY; 447693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // OMX_COLOR_FormatYUV411Planar; 448693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 449693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t width, height; 450693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool success = meta->findInt32(kKeyWidth, &width); 451693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber success = success && meta->findInt32(kKeyHeight, &height); 4527530e9c708275c273c134c36c68179f511c1940eAndreas Huber 4537530e9c708275c273c134c36c68179f511c1940eAndreas Huber int32_t compressedSize; 4547530e9c708275c273c134c36c68179f511c1940eAndreas Huber success = success && meta->findInt32( 455e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber kKeyMaxInputSize, &compressedSize); 4567530e9c708275c273c134c36c68179f511c1940eAndreas Huber 4577530e9c708275c273c134c36c68179f511c1940eAndreas Huber CHECK(success); 4587530e9c708275c273c134c36c68179f511c1940eAndreas Huber CHECK(compressedSize > 0); 459693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 460693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->setImageOutputFormat(format, width, height); 4617530e9c708275c273c134c36c68179f511c1940eAndreas Huber codec->setJPEGInputFormat(width, height, (OMX_U32)compressedSize); 462693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 463693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 464e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber int32_t maxInputSize; 465e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (createEncoder && meta->findInt32(kKeyMaxInputSize, &maxInputSize)) { 466e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber codec->setMinBufferSize(kPortIndexInput, (OMX_U32)maxInputSize); 467e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 468e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 469e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (!strcmp(componentName, "OMX.TI.AMR.encode") 470e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber || !strcmp(componentName, "OMX.TI.WBAMR.encode")) { 471e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber codec->setMinBufferSize(kPortIndexOutput, 8192); // XXX 472e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 473e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 474693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber codec->initOutputFormat(meta); 475693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 476693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return codec; 477693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 478693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 479e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Hubervoid OMXCodec::setMinBufferSize(OMX_U32 portIndex, OMX_U32 size) { 480e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 4817a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 482e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber def.nPortIndex = portIndex; 483e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 484318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 485e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 486e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(err, OK); 487e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 488e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (def.nBufferSize < size) { 489e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber def.nBufferSize = size; 490e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 491e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 492e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 493318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter( 494e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 495e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(err, OK); 496e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber} 497e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 498693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::setVideoPortFormatType( 499693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex, 500693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 501693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE colorFormat) { 502693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 5037a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&format); 504693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nPortIndex = portIndex; 505693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nIndex = 0; 506693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool found = false; 507693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 508693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 index = 0; 509693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (;;) { 510693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nIndex = index; 511318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 512693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 513693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 514693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 515693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 516693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 517693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 518693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 519693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // The following assertion is violated by TI's video decoder. 5207530e9c708275c273c134c36c68179f511c1940eAndreas Huber // CHECK_EQ(format.nIndex, index); 521693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 522693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1 5232a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber CODEC_LOGV("portIndex: %ld, index: %ld, eCompressionFormat=%d eColorFormat=%d", 524693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber portIndex, 525693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber index, format.eCompressionFormat, format.eColorFormat); 526693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 527693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 528693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp("OMX.TI.Video.encoder", mComponentName)) { 529693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexInput 530693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && colorFormat == format.eColorFormat) { 531693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // eCompressionFormat does not seem right. 532693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber found = true; 533693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 534693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 535693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexOutput 536693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && compressionFormat == format.eCompressionFormat) { 537693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // eColorFormat does not seem right. 538693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber found = true; 539693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 540693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 541693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 542693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 543693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (format.eCompressionFormat == compressionFormat 544693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && format.eColorFormat == colorFormat) { 545693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber found = true; 546693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 547693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 548693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 549693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++index; 550693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 551693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 552693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!found) { 553693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return UNKNOWN_ERROR; 554693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 555693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 5562a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber CODEC_LOGV("found a match."); 557318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->setParameter( 558693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 559693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 560693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 561693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 562693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 563693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 564693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setVideoInputFormat( 565693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, OMX_U32 width, OMX_U32 height) { 5662a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber CODEC_LOGV("setVideoInputFormat width=%ld, height=%ld", width, height); 567693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 568693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused; 56918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime)) { 570693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingAVC; 57118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_MPEG4, mime)) { 572693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingMPEG4; 57318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_H263, mime)) { 574693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingH263; 575693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 576693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("Not a supported video mime type: %s", mime); 577693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Should not be here. Not a supported video mime type."); 578693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 579693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 580693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE colorFormat = 581693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 0 ? OMX_COLOR_FormatYCbYCr : OMX_COLOR_FormatCbYCrY; 582693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 583693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strncmp("OMX.qcom.video.encoder.", mComponentName, 23)) { 584693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 585693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 586693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 587693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setVideoPortFormatType( 588693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kPortIndexInput, OMX_VIDEO_CodingUnused, 589693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormat); 590693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 591693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setVideoPortFormatType( 592693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused); 593693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 594693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 5957a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 596693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 597693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 5987a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 5997a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 600318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 601693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 602693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 603693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 604693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 605693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 606693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 607693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 608693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 609693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eCompressionFormat = compressionFormat; 610693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 611693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 612318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter( 613693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 614693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 615693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 616693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber //////////////////////////////////////////////////////////////////////////// 617693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 6187a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 619693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 620693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 621318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->getParameter( 622693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 623693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 624693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 625693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = (width * height * 2); // (width * height * 3) / 2; 6262a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber CODEC_LOGV("Setting nBufferSize = %ld", def.nBufferSize); 627693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 628693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 629693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 630693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 631693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 632693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eCompressionFormat = OMX_VIDEO_CodingUnused; 633693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eColorFormat = colorFormat; 634693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 635318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter( 636693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 637693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 638693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 639693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 640693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setVideoOutputFormat( 641693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, OMX_U32 width, OMX_U32 height) { 6422a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber CODEC_LOGV("setVideoOutputFormat width=%ld, height=%ld", width, height); 643693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 644693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused; 64518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime)) { 646693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingAVC; 64718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_MPEG4, mime)) { 648693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingMPEG4; 64918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_H263, mime)) { 650693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber compressionFormat = OMX_VIDEO_CodingH263; 651693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 652693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("Not a supported video mime type: %s", mime); 653693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Should not be here. Not a supported video mime type."); 654693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 655693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 656693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setVideoPortFormatType( 657693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused); 658693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 659693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1 660693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 661693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 6627a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&format); 663693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nPortIndex = kPortIndexOutput; 664693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber format.nIndex = 0; 665693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 666318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 667693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 668693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 669693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 670693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(format.eCompressionFormat, OMX_VIDEO_CodingUnused); 671693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 672693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const int OMX_QCOM_COLOR_FormatYVU420SemiPlanar = 0x7FA30C00; 673693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 674693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(format.eColorFormat == OMX_COLOR_FormatYUV420Planar 675693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || format.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar 676693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || format.eColorFormat == OMX_COLOR_FormatCbYCrY 677693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || format.eColorFormat == OMX_QCOM_COLOR_FormatYVU420SemiPlanar); 678693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 679318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter( 680693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 681693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber &format, sizeof(format)); 682693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 683693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 684693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 685693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 686693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 6877a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 688693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 689693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 6907a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 6917a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 692318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 693693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 694693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 695693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 696693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 697693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1 698693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // XXX Need a (much) better heuristic to compute input buffer sizes. 699693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const size_t X = 64 * 1024; 700693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (def.nBufferSize < X) { 701693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = X; 702693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 703693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 704693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 705693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 706693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 707693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 708693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 709693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 710693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 711693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 712318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter( 713693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 714693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 715693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 716693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber //////////////////////////////////////////////////////////////////////////// 717693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 7187a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 719693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 720693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 721318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->getParameter( 722693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 723693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 724693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainVideo); 725693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 726693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 0 727693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = 728693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber (((width + 15) & -16) * ((height + 15) & -16) * 3) / 2; // YUV420 729693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 730693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 731693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameWidth = width; 732693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber video_def->nFrameHeight = height; 733693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 734318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter( 735693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 736693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 737693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 738693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 739693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 740693d271e62a3726689ff68f4505ba49228eb94b2Andreas HuberOMXCodec::OMXCodec( 741693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<IOMX> &omx, IOMX::node_id node, uint32_t quirks, 742bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber bool isEncoder, 743693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *mime, 744693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *componentName, 745693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<MediaSource> &source) 746693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber : mOMX(omx), 747693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode(node), 748693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mQuirks(quirks), 749693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mIsEncoder(isEncoder), 750693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mMIME(strdup(mime)), 751693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mComponentName(strdup(componentName)), 752693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSource(source), 753693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificDataIndex(0), 754693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mState(LOADED), 755284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber mInitialBufferSubmit(true), 756693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS(false), 757693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData(false), 7587f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber mOutputPortSettingsHaveChanged(false), 759693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs(-1) { 760693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexInput] = ENABLED; 761693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexOutput] = ENABLED; 762693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 7637a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber setComponentRole(); 7647a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber} 7657a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 76618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber// static 76718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Hubervoid OMXCodec::setComponentRole( 76818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber const sp<IOMX> &omx, IOMX::node_id node, bool isEncoder, 76918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber const char *mime) { 7707a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber struct MimeToRole { 7717a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber const char *mime; 7727a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber const char *decoderRole; 7737a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber const char *encoderRole; 7747a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber }; 7757a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 7767a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber static const MimeToRole kMimeToRole[] = { 77718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG, 77818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber "audio_decoder.mp3", "audio_encoder.mp3" }, 77918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, 78018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber "audio_decoder.amrnb", "audio_encoder.amrnb" }, 78118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, 78218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber "audio_decoder.amrwb", "audio_encoder.amrwb" }, 78318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, 78418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber "audio_decoder.aac", "audio_encoder.aac" }, 78518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, 78618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber "video_decoder.avc", "video_encoder.avc" }, 78718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, 78818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber "video_decoder.mpeg4", "video_encoder.mpeg4" }, 78918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, 79018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber "video_decoder.h263", "video_encoder.h263" }, 7917a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber }; 7927a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 7937a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber static const size_t kNumMimeToRole = 7947a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber sizeof(kMimeToRole) / sizeof(kMimeToRole[0]); 7957a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 7967a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber size_t i; 7977a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber for (i = 0; i < kNumMimeToRole; ++i) { 79818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (!strcasecmp(mime, kMimeToRole[i].mime)) { 7997a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber break; 8007a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber } 8017a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber } 8027a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 8037a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber if (i == kNumMimeToRole) { 8047a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber return; 8057a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber } 8067a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 8077a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber const char *role = 80818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber isEncoder ? kMimeToRole[i].encoderRole 80918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber : kMimeToRole[i].decoderRole; 8107a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 8117a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber if (role != NULL) { 8127a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber OMX_PARAM_COMPONENTROLETYPE roleParams; 8137a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&roleParams); 8147a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 8157a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber strncpy((char *)roleParams.cRole, 8167a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber role, OMX_MAX_STRINGNAME_SIZE - 1); 8177a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 8187a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 8197a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 820318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = omx->setParameter( 82118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber node, OMX_IndexParamStandardComponentRole, 8227a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber &roleParams, sizeof(roleParams)); 8237a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber 8247a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber if (err != OK) { 8257a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber LOGW("Failed to set standard component role '%s'.", role); 8267a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber } 8277a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber } 828693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 829693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 83018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Hubervoid OMXCodec::setComponentRole() { 83118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber setComponentRole(mOMX, mNode, mIsEncoder, mMIME); 83218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber} 83318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 834693d271e62a3726689ff68f4505ba49228eb94b2Andreas HuberOMXCodec::~OMXCodec() { 835dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber CHECK(mState == LOADED || mState == ERROR); 836693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 837318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->freeNode(mNode); 838693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 839693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 840693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode = NULL; 841693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(DEAD); 842693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 843693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber clearCodecSpecificData(); 844693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 845693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(mComponentName); 846693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mComponentName = NULL; 847bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 848693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(mMIME); 849693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mMIME = NULL; 850693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 851693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 852693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::init() { 853284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // mLock is held. 854693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 855693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, LOADED); 856693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 857693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err; 858693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!(mQuirks & kRequiresLoadedToIdleAfterAllocation)) { 859318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->sendCommand(mNode, OMX_CommandStateSet, OMX_StateIdle); 860693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 861693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(LOADED_TO_IDLE); 862693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 863693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 864693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = allocateBuffers(); 865693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 866693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 867693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mQuirks & kRequiresLoadedToIdleAfterAllocation) { 868318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->sendCommand(mNode, OMX_CommandStateSet, OMX_StateIdle); 869693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 870693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 871693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(LOADED_TO_IDLE); 872693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 873693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 874693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (mState != EXECUTING && mState != ERROR) { 875693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.wait(mLock); 876693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 877693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 878693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return mState == ERROR ? UNKNOWN_ERROR : OK; 879693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 880693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 881693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber// static 882693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberbool OMXCodec::isIntermediateState(State state) { 883693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return state == LOADED_TO_IDLE 884693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == IDLE_TO_EXECUTING 885693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == EXECUTING_TO_IDLE 886693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == IDLE_TO_LOADED 887693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || state == RECONFIGURING; 888693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 889693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 890693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::allocateBuffers() { 891693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = allocateBuffersOnPort(kPortIndexInput); 892693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 893693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 894693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 895693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 896693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 897693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return allocateBuffersOnPort(kPortIndexOutput); 898693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 899693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 900693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) { 901693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 9027a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 903693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = portIndex; 904693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 905318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 906693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 907693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 908693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 909693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 910693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 911693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 9127530e9c708275c273c134c36c68179f511c1940eAndreas Huber size_t totalSize = def.nBufferCountActual * def.nBufferSize; 9137530e9c708275c273c134c36c68179f511c1940eAndreas Huber mDealer[portIndex] = new MemoryDealer(totalSize); 9147530e9c708275c273c134c36c68179f511c1940eAndreas Huber 915693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { 9167530e9c708275c273c134c36c68179f511c1940eAndreas Huber sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize); 917693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mem.get() != NULL); 918693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 919693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::buffer_id buffer; 920693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexInput 921693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && (mQuirks & kRequiresAllocateBufferOnInputPorts)) { 922318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->allocateBufferWithBackup( 923693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, portIndex, mem, &buffer); 924ea7d15629752256f6ea1d5c6ea796e59aefd030fAndreas Huber } else if (portIndex == kPortIndexOutput 925ea7d15629752256f6ea1d5c6ea796e59aefd030fAndreas Huber && (mQuirks & kRequiresAllocateBufferOnOutputPorts)) { 926318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->allocateBufferWithBackup( 927df4de7d7bd0060a84b064ce074d3f86d3a7aa0aeAndreas Huber mNode, portIndex, mem, &buffer); 928693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 929318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->useBuffer(mNode, portIndex, mem, &buffer); 930693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 931693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 932693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 933693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("allocate_buffer_with_backup failed"); 934693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 935693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 936693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 937693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo info; 938693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mBuffer = buffer; 939693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mOwnedByComponent = false; 940693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMem = mem; 941693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMediaBuffer = NULL; 942693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 943693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (portIndex == kPortIndexOutput) { 944693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMediaBuffer = new MediaBuffer(mem->pointer(), mem->size()); 945693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info.mMediaBuffer->setObserver(this); 946693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 947693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 948693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[portIndex].push(info); 949693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 9507a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("allocated buffer %p on %s port", buffer, 951693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber portIndex == kPortIndexInput ? "input" : "output"); 952693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 953693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 954693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber dumpPortStatus(portIndex); 955693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 956693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 957693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 958693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 959693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::on_message(const omx_message &msg) { 960693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 961693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 962693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (msg.type) { 963693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case omx_message::EVENT: 964693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 965693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onEvent( 966693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.event_data.event, msg.u.event_data.data1, 967693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.event_data.data2); 968693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 969693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 970693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 971693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 972693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 973693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 974693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer; 975693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 9767a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("EMPTY_BUFFER_DONE(buffer: %p)", buffer); 977693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 978693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput]; 979693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t i = 0; 980693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (i < buffers->size() && (*buffers)[i].mBuffer != buffer) { 981693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++i; 982693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 983693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 984693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(i < buffers->size()); 985693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!(*buffers)[i].mOwnedByComponent) { 986693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGW("We already own input buffer %p, yet received " 987693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "an EMPTY_BUFFER_DONE.", buffer); 988693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 989693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 990693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->editItemAt(i).mOwnedByComponent = false; 991693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 992693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mPortStatus[kPortIndexInput] == DISABLING) { 9937a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Port is disabled, freeing buffer %p", buffer); 994693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 995693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 996318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX->freeBuffer(mNode, kPortIndexInput, buffer); 997693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 998693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 999693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->removeAt(i); 1000693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (mPortStatus[kPortIndexInput] != SHUTTING_DOWN) { 1001693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[kPortIndexInput], ENABLED); 1002693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffer(&buffers->editItemAt(i)); 1003693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1004693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1005693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1006693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1007693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1008693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case omx_message::FILL_BUFFER_DONE: 1009693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1010693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer; 1011693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 flags = msg.u.extended_buffer_data.flags; 1012693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 10137a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("FILL_BUFFER_DONE(buffer: %p, size: %ld, flags: 0x%08lx)", 1014693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer, 1015693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.range_length, 1016693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber flags); 1017693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 10187a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("FILL_BUFFER_DONE(timestamp: %lld us (%.2f secs))", 1019693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.timestamp, 1020693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.timestamp / 1E6); 1021693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1022693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 1023693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t i = 0; 1024693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (i < buffers->size() && (*buffers)[i].mBuffer != buffer) { 1025693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++i; 1026693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1027693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1028693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(i < buffers->size()); 1029693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &buffers->editItemAt(i); 1030693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1031693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!info->mOwnedByComponent) { 1032693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGW("We already own output buffer %p, yet received " 1033693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "a FILL_BUFFER_DONE.", buffer); 1034693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1035693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1036693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mOwnedByComponent = false; 1037693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1038693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mPortStatus[kPortIndexOutput] == DISABLING) { 10397a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Port is disabled, freeing buffer %p", buffer); 1040693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1041693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1042318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX->freeBuffer(mNode, kPortIndexOutput, buffer); 1043693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1044693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1045693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->removeAt(i); 1046355edcea2f15c0f619c1e1d0f4fa433b0d38098fAndreas Huber } else if (mPortStatus[kPortIndexOutput] == ENABLED 1047355edcea2f15c0f619c1e1d0f4fa433b0d38098fAndreas Huber && (flags & OMX_BUFFERFLAG_EOS)) { 10487a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("No more output data."); 1049693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = true; 1050693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.signal(); 1051693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (mPortStatus[kPortIndexOutput] != SHUTTING_DOWN) { 1052693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[kPortIndexOutput], ENABLED); 1053bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 1054693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaBuffer *buffer = info->mMediaBuffer; 1055693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1056693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->set_range( 1057693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.range_offset, 1058693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.range_length); 1059693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1060693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->clear(); 1061693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 106248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber buffer->meta_data()->setInt64( 106348c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber kKeyTime, msg.u.extended_buffer_data.timestamp); 1064693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1065693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (msg.u.extended_buffer_data.flags & OMX_BUFFERFLAG_SYNCFRAME) { 1066693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setInt32(kKeyIsSyncFrame, true); 1067693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1068693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1069693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setPointer( 1070693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyPlatformPrivate, 1071693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.platform_private); 1072693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1073693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffer->meta_data()->setPointer( 1074693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyBufferID, 1075693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber msg.u.extended_buffer_data.buffer); 1076693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1077693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.push_back(i); 1078693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.signal(); 1079693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1080693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1081693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1082693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1083693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1084693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1085693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1086693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1087693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1088693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1089693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1090693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1091693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1092693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 1093693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (event) { 1094693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventCmdComplete: 1095693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1096693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onCmdComplete((OMX_COMMANDTYPE)data1, data2); 1097693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1098693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1099693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1100693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventError: 1101693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1102693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("ERROR(%ld, %ld)", data1, data2); 1103693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1104693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(ERROR); 1105693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1106693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1107693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1108693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventPortSettingsChanged: 1109693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onPortSettingsChanged(data1); 1111693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1112693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1113693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1114693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_EventBufferFlag: 1115693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 11167a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("EVENT_BUFFER_FLAG(%ld)", data1); 1117693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1118693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (data1 == kPortIndexOutput) { 1119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = true; 1120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1121693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1122693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1123693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1124693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1125693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 11267a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("EVENT(%d, %ld, %ld)", event, data1, data2); 1127693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1128693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1129693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1130693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1131693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 113212658b720b176b7d934444256d07ba3c595d9b44Andreas Huber// Has the format changed in any way that the client would have to be aware of? 113312658b720b176b7d934444256d07ba3c595d9b44Andreas Huberstatic bool formatHasNotablyChanged( 113412658b720b176b7d934444256d07ba3c595d9b44Andreas Huber const sp<MetaData> &from, const sp<MetaData> &to) { 113512658b720b176b7d934444256d07ba3c595d9b44Andreas Huber if (from.get() == NULL && to.get() == NULL) { 113612658b720b176b7d934444256d07ba3c595d9b44Andreas Huber return false; 113712658b720b176b7d934444256d07ba3c595d9b44Andreas Huber } 113812658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 1139c6323f9d72e0f08dd1e813550a56c8d2f0fd76a2Andreas Huber if ((from.get() == NULL && to.get() != NULL) 1140c6323f9d72e0f08dd1e813550a56c8d2f0fd76a2Andreas Huber || (from.get() != NULL && to.get() == NULL)) { 114112658b720b176b7d934444256d07ba3c595d9b44Andreas Huber return true; 114212658b720b176b7d934444256d07ba3c595d9b44Andreas Huber } 114312658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 114412658b720b176b7d934444256d07ba3c595d9b44Andreas Huber const char *mime_from, *mime_to; 114512658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(from->findCString(kKeyMIMEType, &mime_from)); 114612658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(to->findCString(kKeyMIMEType, &mime_to)); 114712658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 114812658b720b176b7d934444256d07ba3c595d9b44Andreas Huber if (strcasecmp(mime_from, mime_to)) { 114912658b720b176b7d934444256d07ba3c595d9b44Andreas Huber return true; 115012658b720b176b7d934444256d07ba3c595d9b44Andreas Huber } 115112658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 115212658b720b176b7d934444256d07ba3c595d9b44Andreas Huber if (!strcasecmp(mime_from, MEDIA_MIMETYPE_VIDEO_RAW)) { 115312658b720b176b7d934444256d07ba3c595d9b44Andreas Huber int32_t colorFormat_from, colorFormat_to; 115412658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(from->findInt32(kKeyColorFormat, &colorFormat_from)); 115512658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(to->findInt32(kKeyColorFormat, &colorFormat_to)); 115612658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 115712658b720b176b7d934444256d07ba3c595d9b44Andreas Huber if (colorFormat_from != colorFormat_to) { 115812658b720b176b7d934444256d07ba3c595d9b44Andreas Huber return true; 115912658b720b176b7d934444256d07ba3c595d9b44Andreas Huber } 116012658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 116112658b720b176b7d934444256d07ba3c595d9b44Andreas Huber int32_t width_from, width_to; 116212658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(from->findInt32(kKeyWidth, &width_from)); 116312658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(to->findInt32(kKeyWidth, &width_to)); 116412658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 116512658b720b176b7d934444256d07ba3c595d9b44Andreas Huber if (width_from != width_to) { 116612658b720b176b7d934444256d07ba3c595d9b44Andreas Huber return true; 116712658b720b176b7d934444256d07ba3c595d9b44Andreas Huber } 116812658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 116912658b720b176b7d934444256d07ba3c595d9b44Andreas Huber int32_t height_from, height_to; 117012658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(from->findInt32(kKeyHeight, &height_from)); 117112658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(to->findInt32(kKeyHeight, &height_to)); 117212658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 117312658b720b176b7d934444256d07ba3c595d9b44Andreas Huber if (height_from != height_to) { 117412658b720b176b7d934444256d07ba3c595d9b44Andreas Huber return true; 117512658b720b176b7d934444256d07ba3c595d9b44Andreas Huber } 117612658b720b176b7d934444256d07ba3c595d9b44Andreas Huber } else if (!strcasecmp(mime_from, MEDIA_MIMETYPE_AUDIO_RAW)) { 117712658b720b176b7d934444256d07ba3c595d9b44Andreas Huber int32_t numChannels_from, numChannels_to; 117812658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(from->findInt32(kKeyChannelCount, &numChannels_from)); 117912658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(to->findInt32(kKeyChannelCount, &numChannels_to)); 118012658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 118112658b720b176b7d934444256d07ba3c595d9b44Andreas Huber if (numChannels_from != numChannels_to) { 118212658b720b176b7d934444256d07ba3c595d9b44Andreas Huber return true; 118312658b720b176b7d934444256d07ba3c595d9b44Andreas Huber } 118412658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 118512658b720b176b7d934444256d07ba3c595d9b44Andreas Huber int32_t sampleRate_from, sampleRate_to; 118612658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(from->findInt32(kKeySampleRate, &sampleRate_from)); 118712658b720b176b7d934444256d07ba3c595d9b44Andreas Huber CHECK(to->findInt32(kKeySampleRate, &sampleRate_to)); 118812658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 118912658b720b176b7d934444256d07ba3c595d9b44Andreas Huber if (sampleRate_from != sampleRate_to) { 119012658b720b176b7d934444256d07ba3c595d9b44Andreas Huber return true; 119112658b720b176b7d934444256d07ba3c595d9b44Andreas Huber } 119212658b720b176b7d934444256d07ba3c595d9b44Andreas Huber } 119312658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 119412658b720b176b7d934444256d07ba3c595d9b44Andreas Huber return false; 119512658b720b176b7d934444256d07ba3c595d9b44Andreas Huber} 119612658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 1197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data) { 1198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (cmd) { 1199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandStateSet: 1200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber onStateChange((OMX_STATETYPE)data); 1202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandPortDisable: 1206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex = data; 12087a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("PORT_DISABLED(%ld)", portIndex); 1209693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1210693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1211693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], DISABLING); 1212693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortBuffers[portIndex].size(), 0); 1213693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1214693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = DISABLED; 1215693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1216693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == RECONFIGURING) { 1217693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 1218693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 121912658b720b176b7d934444256d07ba3c595d9b44Andreas Huber sp<MetaData> oldOutputFormat = mOutputFormat; 12207f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber initOutputFormat(mSource->getFormat()); 122112658b720b176b7d934444256d07ba3c595d9b44Andreas Huber 122212658b720b176b7d934444256d07ba3c595d9b44Andreas Huber // Don't notify clients if the output port settings change 122312658b720b176b7d934444256d07ba3c595d9b44Andreas Huber // wasn't of importance to them, i.e. it may be that just the 122412658b720b176b7d934444256d07ba3c595d9b44Andreas Huber // number of buffers has changed and nothing else. 122512658b720b176b7d934444256d07ba3c595d9b44Andreas Huber mOutputPortSettingsHaveChanged = 122612658b720b176b7d934444256d07ba3c595d9b44Andreas Huber formatHasNotablyChanged(oldOutputFormat, mOutputFormat); 12277f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 1228693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber enablePortAsync(portIndex); 1229693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1230693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = allocateBuffersOnPort(portIndex); 1231693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1232693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1233693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1234693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1235693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1236693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandPortEnable: 1237693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1238693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex = data; 12397a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("PORT_ENABLED(%ld)", portIndex); 1240693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1241693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1242693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], ENABLING); 1243693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1244693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = ENABLED; 1245693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1246693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == RECONFIGURING) { 1247693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 1248693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1249693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(EXECUTING); 1250693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1251693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffers(); 1252693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1253693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1254693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1255693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1256693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_CommandFlush: 1257693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1258693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex = data; 1259693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 12607a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("FLUSH_DONE(%ld)", portIndex); 1261693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1262693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], SHUTTING_DOWN); 1263693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = ENABLED; 1264693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1265693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(countBuffersWeOwn(mPortBuffers[portIndex]), 1266693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[portIndex].size()); 1267693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1268693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == RECONFIGURING) { 1269693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 1270693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1271693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber disablePortAsync(portIndex); 12728297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } else if (mState == EXECUTING_TO_IDLE) { 12738297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber if (mPortStatus[kPortIndexInput] == ENABLED 12748297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber && mPortStatus[kPortIndexOutput] == ENABLED) { 12757a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Finished flushing both ports, now completing " 12768297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber "transition from EXECUTING to IDLE."); 12778297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 12788297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber mPortStatus[kPortIndexInput] = SHUTTING_DOWN; 12798297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber mPortStatus[kPortIndexOutput] = SHUTTING_DOWN; 12808297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 12818297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber status_t err = 1282318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX->sendCommand(mNode, OMX_CommandStateSet, OMX_StateIdle); 12838297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber CHECK_EQ(err, OK); 12848297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } 1285693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1286693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // We're flushing both ports in preparation for seeking. 1287693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1288693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mPortStatus[kPortIndexInput] == ENABLED 1289693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber && mPortStatus[kPortIndexOutput] == ENABLED) { 12907a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Finished flushing both ports, now continuing from" 1291693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber " seek-time."); 1292693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 12935228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber // Clear this flag in case the decoder sent us either 12945228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber // the EVENT_BUFFER_FLAG(1) or an output buffer with 12955228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber // the EOS flag set _while_ flushing. Since we're going 12965228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber // to submit "fresh" input data now, this flag no longer 12975228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber // applies to our future. 12985228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber mNoMoreOutputData = false; 12995228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1300693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffers(); 1301693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffers(); 1302693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1303693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1304693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1305693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1306693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1307693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1308693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1309693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 13107a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("CMD_COMPLETE(%d, %ld)", cmd, data); 1311693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1312693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1313693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1314693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1315693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1316693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onStateChange(OMX_STATETYPE newState) { 1317693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (newState) { 1318693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_StateIdle: 1319693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 13207a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Now Idle."); 1321693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == LOADED_TO_IDLE) { 1322318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->sendCommand( 1323693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_CommandStateSet, OMX_StateExecuting); 1324693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1325693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1326693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1327693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(IDLE_TO_EXECUTING); 1328693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1329693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING_TO_IDLE); 1330693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1331693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ( 1332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber countBuffersWeOwn(mPortBuffers[kPortIndexInput]), 1333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[kPortIndexInput].size()); 1334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ( 1336693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber countBuffersWeOwn(mPortBuffers[kPortIndexOutput]), 1337693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortBuffers[kPortIndexOutput].size()); 1338693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1339318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->sendCommand( 1340693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_CommandStateSet, OMX_StateLoaded); 1341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = freeBuffersOnPort(kPortIndexInput); 1345693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1346693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1347693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = freeBuffersOnPort(kPortIndexOutput); 1348693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1349693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1350693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexInput] = ENABLED; 1351693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[kPortIndexOutput] = ENABLED; 1352693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1353693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(IDLE_TO_LOADED); 1354693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1355693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1356693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1357693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1358693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_StateExecuting: 1359693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1360693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, IDLE_TO_EXECUTING); 1361693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 13627a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Now Executing."); 1363693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1364693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(EXECUTING); 1365693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1366284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // Buffers will be submitted to the component in the first 1367284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // call to OMXCodec::read as mInitialBufferSubmit is true at 1368284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // this point. This ensures that this on_message call returns, 1369284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // releases the lock and ::init can notice the state change and 1370284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber // itself return. 1371693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1372693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1373693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1374693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_StateLoaded: 1375693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1376693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, IDLE_TO_LOADED); 1377693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 13787a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Now Loaded."); 1379693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1380693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(LOADED); 1381693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1382693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1383693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1384693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1385693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1386693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1387693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1388693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1389693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1390693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1391693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1392693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber// static 1393693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersize_t OMXCodec::countBuffersWeOwn(const Vector<BufferInfo> &buffers) { 1394693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t n = 0; 1395693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers.size(); ++i) { 1396693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!buffers[i].mOwnedByComponent) { 1397693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++n; 1398693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1399693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1400693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1401693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return n; 1402693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1403693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1404693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::freeBuffersOnPort( 1405693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 portIndex, bool onlyThoseWeOwn) { 1406693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 1407693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1408693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t stickyErr = OK; 1409693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1410693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = buffers->size(); i-- > 0;) { 1411693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &buffers->editItemAt(i); 1412693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1413693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (onlyThoseWeOwn && info->mOwnedByComponent) { 1414693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber continue; 1415693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1416693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1417693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mOwnedByComponent, false); 1418693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 141995301196d59fb88ef96342fd307a2be374b5079bAndreas Huber CODEC_LOGV("freeing buffer %p on port %ld", info->mBuffer, portIndex); 142095301196d59fb88ef96342fd307a2be374b5079bAndreas Huber 1421693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1422318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX->freeBuffer(mNode, portIndex, info->mBuffer); 1423693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1424693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 1425693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber stickyErr = err; 1426693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1427693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1428693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (info->mMediaBuffer != NULL) { 1429693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMediaBuffer->setObserver(NULL); 1430693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1431693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // Make sure nobody but us owns this buffer at this point. 1432693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mMediaBuffer->refcount(), 0); 1433693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1434693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMediaBuffer->release(); 1435693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1436693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1437693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber buffers->removeAt(i); 1438693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1439693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1440693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(onlyThoseWeOwn || buffers->isEmpty()); 1441693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1442693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return stickyErr; 1443693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1444693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1445693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::onPortSettingsChanged(OMX_U32 portIndex) { 14467a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("PORT_SETTINGS_CHANGED(%ld)", portIndex); 1447693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1448693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING); 1449693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(portIndex, kPortIndexOutput); 1450693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(RECONFIGURING); 1451693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1452693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mQuirks & kNeedsFlushBeforeDisable) { 14531beb760d920561679862ded945a04e370368c7f7Andreas Huber if (!flushPortAsync(portIndex)) { 14541beb760d920561679862ded945a04e370368c7f7Andreas Huber onCmdComplete(OMX_CommandFlush, portIndex); 14551beb760d920561679862ded945a04e370368c7f7Andreas Huber } 1456693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1457693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber disablePortAsync(portIndex); 1458693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1459693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1460693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 14611beb760d920561679862ded945a04e370368c7f7Andreas Huberbool OMXCodec::flushPortAsync(OMX_U32 portIndex) { 14628297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING 14638297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber || mState == EXECUTING_TO_IDLE); 1464693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 14657a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("flushPortAsync(%ld): we own %d out of %d buffers already.", 14661beb760d920561679862ded945a04e370368c7f7Andreas Huber portIndex, countBuffersWeOwn(mPortBuffers[portIndex]), 14671beb760d920561679862ded945a04e370368c7f7Andreas Huber mPortBuffers[portIndex].size()); 14681beb760d920561679862ded945a04e370368c7f7Andreas Huber 1469693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], ENABLED); 1470693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = SHUTTING_DOWN; 1471693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 14721beb760d920561679862ded945a04e370368c7f7Andreas Huber if ((mQuirks & kRequiresFlushCompleteEmulation) 14731beb760d920561679862ded945a04e370368c7f7Andreas Huber && countBuffersWeOwn(mPortBuffers[portIndex]) 14741beb760d920561679862ded945a04e370368c7f7Andreas Huber == mPortBuffers[portIndex].size()) { 14751beb760d920561679862ded945a04e370368c7f7Andreas Huber // No flush is necessary and this component fails to send a 14761beb760d920561679862ded945a04e370368c7f7Andreas Huber // flush-complete event in this case. 14771beb760d920561679862ded945a04e370368c7f7Andreas Huber 14781beb760d920561679862ded945a04e370368c7f7Andreas Huber return false; 14791beb760d920561679862ded945a04e370368c7f7Andreas Huber } 14801beb760d920561679862ded945a04e370368c7f7Andreas Huber 1481693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1482318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX->sendCommand(mNode, OMX_CommandFlush, portIndex); 1483693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 14841beb760d920561679862ded945a04e370368c7f7Andreas Huber 14851beb760d920561679862ded945a04e370368c7f7Andreas Huber return true; 1486693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1487693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1488693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::disablePortAsync(OMX_U32 portIndex) { 1489693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1490693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1491693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], ENABLED); 1492693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = DISABLING; 1493693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1494693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1495318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX->sendCommand(mNode, OMX_CommandPortDisable, portIndex); 1496693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1497693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1498693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber freeBuffersOnPort(portIndex, true); 1499693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1500693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1501693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::enablePortAsync(OMX_U32 portIndex) { 1502693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1503693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1504693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[portIndex], DISABLED); 1505693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mPortStatus[portIndex] = ENABLING; 1506693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1507693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1508318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX->sendCommand(mNode, OMX_CommandPortEnable, portIndex); 1509693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1510693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1511693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1512693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::fillOutputBuffers() { 1513693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING); 1514693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1515693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 1516693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1517693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffer(&buffers->editItemAt(i)); 1518693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1519693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1520693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1521693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::drainInputBuffers() { 1522450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber CHECK(mState == EXECUTING || mState == RECONFIGURING); 1523693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1524693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput]; 1525693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1526693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffer(&buffers->editItemAt(i)); 1527693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1528693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1529693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1530693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::drainInputBuffer(BufferInfo *info) { 1531693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mOwnedByComponent, false); 1532693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1533693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mSignalledEOS) { 1534693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1535693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1536693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1537693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mCodecSpecificDataIndex < mCodecSpecificData.size()) { 1538693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const CodecSpecificData *specific = 1539693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificData[mCodecSpecificDataIndex]; 1540693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1541693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t size = specific->mSize; 1542693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 154318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mMIME) 1544dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber && !(mQuirks & kWantsNALFragments)) { 1545693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const uint8_t kNALStartCode[4] = 1546693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 0x00, 0x00, 0x00, 0x01 }; 1547693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1548693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(info->mMem->size() >= specific->mSize + 4); 1549693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1550693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size += 4; 1551693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1552693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(info->mMem->pointer(), kNALStartCode, 4); 1553693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy((uint8_t *)info->mMem->pointer() + 4, 1554693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber specific->mData, specific->mSize); 1555693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1556693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(info->mMem->size() >= specific->mSize); 1557693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(info->mMem->pointer(), specific->mData, specific->mSize); 1558693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1559693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1560318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->emptyBuffer( 1561693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, info->mBuffer, 0, size, 1562693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_BUFFERFLAG_ENDOFFRAME | OMX_BUFFERFLAG_CODECCONFIG, 1563693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 0); 156436efa039efaae4526791336cb688032d22b34becAndreas Huber CHECK_EQ(err, OK); 1565693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1566693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mOwnedByComponent = true; 1567693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1568693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ++mCodecSpecificDataIndex; 1569693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1570693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1571693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1572693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaBuffer *srcBuffer; 1573693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err; 1574693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mSeekTimeUs >= 0) { 1575693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaSource::ReadOptions options; 1576693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber options.setSeekTo(mSeekTimeUs); 1577693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs = -1; 1578693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1579693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mSource->read(&srcBuffer, &options); 1580693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1581693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mSource->read(&srcBuffer); 1582693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1583693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1584693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME; 158548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber OMX_TICKS timestampUs = 0; 1586693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t srcLength = 0; 1587693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1588693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 15897a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("signalling end of input stream."); 1590693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber flags |= OMX_BUFFERFLAG_EOS; 1591693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1592693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS = true; 1593693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 1594693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcLength = srcBuffer->range_length(); 1595693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1596693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (info->mMem->size() < srcLength) { 1597693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber LOGE("info->mMem->size() = %d, srcLength = %d", 1598693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMem->size(), srcLength); 1599693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1600693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(info->mMem->size() >= srcLength); 1601693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(info->mMem->pointer(), 1602693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber (const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(), 1603693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcLength); 1604693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 160548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber if (srcBuffer->meta_data()->findInt64(kKeyTime, ×tampUs)) { 1606318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber CODEC_LOGV("Calling emptyBuffer on buffer %p (length %d)", 1607693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mBuffer, srcLength); 1608318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber CODEC_LOGV("Calling emptyBuffer with timestamp %lld us (%.2f secs)", 160948c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber timestampUs, timestampUs / 1E6); 1610693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1611693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1612693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1613693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (srcBuffer != NULL) { 1614693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcBuffer->release(); 1615693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber srcBuffer = NULL; 1616693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 161736efa039efaae4526791336cb688032d22b34becAndreas Huber 1618318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->emptyBuffer( 161936efa039efaae4526791336cb688032d22b34becAndreas Huber mNode, info->mBuffer, 0, srcLength, 162048c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber flags, timestampUs); 162136efa039efaae4526791336cb688032d22b34becAndreas Huber 162236efa039efaae4526791336cb688032d22b34becAndreas Huber if (err != OK) { 162336efa039efaae4526791336cb688032d22b34becAndreas Huber setState(ERROR); 162436efa039efaae4526791336cb688032d22b34becAndreas Huber return; 162536efa039efaae4526791336cb688032d22b34becAndreas Huber } 162636efa039efaae4526791336cb688032d22b34becAndreas Huber 162736efa039efaae4526791336cb688032d22b34becAndreas Huber info->mOwnedByComponent = true; 1628693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1629693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1630693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::fillOutputBuffer(BufferInfo *info) { 1631693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(info->mOwnedByComponent, false); 1632693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 16331beb760d920561679862ded945a04e370368c7f7Andreas Huber if (mNoMoreOutputData) { 16347a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("There is no more output data available, not " 16351beb760d920561679862ded945a04e370368c7f7Andreas Huber "calling fillOutputBuffer"); 16361beb760d920561679862ded945a04e370368c7f7Andreas Huber return; 16371beb760d920561679862ded945a04e370368c7f7Andreas Huber } 16381beb760d920561679862ded945a04e370368c7f7Andreas Huber 16397a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("Calling fill_buffer on buffer %p", info->mBuffer); 1640318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->fillBuffer(mNode, info->mBuffer); 164136efa039efaae4526791336cb688032d22b34becAndreas Huber CHECK_EQ(err, OK); 1642693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1643693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mOwnedByComponent = true; 1644693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1645693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1646693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::drainInputBuffer(IOMX::buffer_id buffer) { 1647693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput]; 1648693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1649693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if ((*buffers)[i].mBuffer == buffer) { 1650693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber drainInputBuffer(&buffers->editItemAt(i)); 1651693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1652693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1653693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1654693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1655693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1656693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1657693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1658693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::fillOutputBuffer(IOMX::buffer_id buffer) { 1659693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 1660693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 1661693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if ((*buffers)[i].mBuffer == buffer) { 1662693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffer(&buffers->editItemAt(i)); 1663693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 1664693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1665693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1666693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1667693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1668693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1669693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1670693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setState(State newState) { 1671693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mState = newState; 1672693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.signal(); 1673693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1674693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // This may cause some spurious wakeups but is necessary to 1675693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // unblock the reader if we enter ERROR state. 1676693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.signal(); 1677693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1678693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1679e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Hubervoid OMXCodec::setRawAudioFormat( 1680e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) { 1681e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber OMX_AUDIO_PARAM_PCMMODETYPE pcmParams; 16827a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&pcmParams); 1683e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.nPortIndex = portIndex; 1684e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1685318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 1686e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1687e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1688e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(err, OK); 1689e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1690e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.nChannels = numChannels; 1691e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.eNumData = OMX_NumericalDataSigned; 1692e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.bInterleaved = OMX_TRUE; 1693e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.nBitPerSample = 16; 1694e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.nSamplingRate = sampleRate; 1695e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear; 1696e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1697e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (numChannels == 1) { 1698e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelCF; 1699e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } else { 1700e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(numChannels, 2); 1701e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1702e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelLF; 1703e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber pcmParams.eChannelMapping[1] = OMX_AUDIO_ChannelRF; 1704e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 1705e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1706318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter( 1707e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1708e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1709e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(err, OK); 1710e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber} 1711e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 1712693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setAMRFormat() { 1713693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!mIsEncoder) { 1714693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 17157a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 1716693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 1717693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1718693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = 1719318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX->getParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1720693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1721693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1722693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1723693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 1724693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.eAMRBandMode = OMX_AUDIO_AMRBandModeNB0; 1725693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1726318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1727693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1728693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1729693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1730693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber //////////////////////// 1731693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1732693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mIsEncoder) { 1733693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> format = mSource->getFormat(); 1734693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t sampleRate; 1735693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int32_t numChannels; 1736693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(format->findInt32(kKeySampleRate, &sampleRate)); 1737456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber CHECK(format->findInt32(kKeyChannelCount, &numChannels)); 1738456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1739456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber setRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1740456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber } 1741456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber} 1742456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1743456db75516efc889e1ee4e5e16021e77c03b0941Andreas Hubervoid OMXCodec::setAMRWBFormat() { 1744456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber if (!mIsEncoder) { 1745456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 1746456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber InitOMXParams(&def); 1747456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber def.nPortIndex = kPortIndexInput; 1748456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1749456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber status_t err = 1750318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX->getParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1751456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1752456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber CHECK_EQ(err, OK); 1753456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1754456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 1755456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber def.eAMRBandMode = OMX_AUDIO_AMRBandModeWB0; 1756456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1757318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1758456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber CHECK_EQ(err, OK); 1759456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber } 1760456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1761456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber //////////////////////// 1762456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber 1763456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber if (mIsEncoder) { 1764456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber sp<MetaData> format = mSource->getFormat(); 1765456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber int32_t sampleRate; 1766456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber int32_t numChannels; 1767456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber CHECK(format->findInt32(kKeySampleRate, &sampleRate)); 1768693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(format->findInt32(kKeyChannelCount, &numChannels)); 1769693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1770e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber setRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1771e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 1772e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber} 1773693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1774e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Hubervoid OMXCodec::setAACFormat(int32_t numChannels, int32_t sampleRate) { 1775e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (mIsEncoder) { 1776e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber setRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1777e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } else { 1778e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 17797a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&profile); 1780e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber profile.nPortIndex = kPortIndexInput; 1781693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1782318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 1783e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 1784693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1785693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1786e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber profile.nChannels = numChannels; 1787e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber profile.nSampleRate = sampleRate; 1788e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS; 1789693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1790318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter( 1791e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 1792693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1793693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1794693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1795693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1796693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::setImageOutputFormat( 1797693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height) { 17987a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("setImageOutputFormat(%ld, %ld)", width, height); 1799693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1800693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 0 1801693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE index; 1802693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mOMX->get_extension_index( 1803693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, "OMX.TI.JPEG.decode.Config.OutputColorFormat", &index); 1804693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1805693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1806693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber err = mOMX->set_config(mNode, index, &format, sizeof(format)); 1807693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1808693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 1809693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1810693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 18117a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 1812693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 1813693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1814318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 1815693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1816693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1817693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1818693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainImage); 1819693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1820693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; 1821bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 1822693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingUnused); 1823693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->eColorFormat = format; 1824693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameWidth = width; 1825693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameHeight = height; 1826693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1827693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (format) { 1828693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_FormatYUV420PackedPlanar: 1829693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_FormatYUV411Planar: 1830693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1831693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = (width * height * 3) / 2; 1832693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1833693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1834693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1835693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_FormatCbYCrY: 1836693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1837693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = width * height * 2; 1838693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1839693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1840693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1841693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_COLOR_Format32bitARGB8888: 1842693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1843693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferSize = width * height * 4; 1844693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1845693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1846693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1847195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber case OMX_COLOR_Format16bitARGB4444: 1848195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber case OMX_COLOR_Format16bitARGB1555: 1849195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber case OMX_COLOR_Format16bitRGB565: 1850195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber case OMX_COLOR_Format16bitBGR565: 1851195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber { 1852195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber def.nBufferSize = width * height * 2; 1853195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber break; 1854195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber } 1855195ea1e0d4484f1deb2309e239f6a5cc9a7e5ba7Andreas Huber 1856693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1857693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Should not be here. Unknown color format."); 1858693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1859693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1860693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 18617530e9c708275c273c134c36c68179f511c1940eAndreas Huber def.nBufferCountActual = def.nBufferCountMin; 18627530e9c708275c273c134c36c68179f511c1940eAndreas Huber 1863318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter( 1864693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1865693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 18667530e9c708275c273c134c36c68179f511c1940eAndreas Huber} 1867693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 18687530e9c708275c273c134c36c68179f511c1940eAndreas Hubervoid OMXCodec::setJPEGInputFormat( 18697530e9c708275c273c134c36c68179f511c1940eAndreas Huber OMX_U32 width, OMX_U32 height, OMX_U32 compressedSize) { 18707530e9c708275c273c134c36c68179f511c1940eAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 18717a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 1872693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexInput; 1873693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1874318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 1875693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1876693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1877693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 18787530e9c708275c273c134c36c68179f511c1940eAndreas Huber CHECK_EQ(def.eDomain, OMX_PortDomainImage); 18797530e9c708275c273c134c36c68179f511c1940eAndreas Huber OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; 18807530e9c708275c273c134c36c68179f511c1940eAndreas Huber 1881693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingJPEG); 1882693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameWidth = width; 1883693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageDef->nFrameHeight = height; 1884693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 18857530e9c708275c273c134c36c68179f511c1940eAndreas Huber def.nBufferSize = compressedSize; 1886693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nBufferCountActual = def.nBufferCountMin; 1887693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1888318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->setParameter( 1889693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1890693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 1891693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1892693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1893693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::addCodecSpecificData(const void *data, size_t size) { 1894693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CodecSpecificData *specific = 1895693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber (CodecSpecificData *)malloc(sizeof(CodecSpecificData) + size - 1); 1896693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1897693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber specific->mSize = size; 1898693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber memcpy(specific->mData, data, size); 1899693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1900693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificData.push(specific); 1901693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1902693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1903693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::clearCodecSpecificData() { 1904693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < mCodecSpecificData.size(); ++i) { 1905693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(mCodecSpecificData.editItemAt(i)); 1906693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1907693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificData.clear(); 1908693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificDataIndex = 0; 1909693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1910693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1911693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::start(MetaData *) { 1912284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber Mutex::Autolock autoLock(mLock); 1913284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber 1914693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState != LOADED) { 1915693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return UNKNOWN_ERROR; 1916693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1917bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber 1918693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> params = new MetaData; 1919dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber if (mQuirks & kWantsNALFragments) { 1920dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber params->setInt32(kKeyWantsNALFragments, true); 1921693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1922693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mSource->start(params.get()); 1923693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1924693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 1925693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 1926693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1927693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1928693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mCodecSpecificDataIndex = 0; 1929284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber mInitialBufferSubmit = true; 1930693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS = false; 1931693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = false; 19327f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber mOutputPortSettingsHaveChanged = false; 1933693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs = -1; 1934693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.clear(); 1935693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1936693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return init(); 1937693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 1938693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1939693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::stop() { 19407a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("stop"); 1941693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1942693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 1943693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1944693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (isIntermediateState(mState)) { 1945693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.wait(mLock); 1946693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1947693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1948693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (mState) { 1949693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case LOADED: 1950693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case ERROR: 1951693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1952693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1953693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case EXECUTING: 1954693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1955693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber setState(EXECUTING_TO_IDLE); 1956693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 19578297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber if (mQuirks & kRequiresFlushBeforeShutdown) { 19587a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("This component requires a flush before transitioning " 19598297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber "from EXECUTING to IDLE..."); 19608297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 19618297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber bool emulateInputFlushCompletion = 19628297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber !flushPortAsync(kPortIndexInput); 19638297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 19648297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber bool emulateOutputFlushCompletion = 19658297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber !flushPortAsync(kPortIndexOutput); 1966693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 19678297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber if (emulateInputFlushCompletion) { 19688297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber onCmdComplete(OMX_CommandFlush, kPortIndexInput); 19698297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } 19708297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 19718297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber if (emulateOutputFlushCompletion) { 19728297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber onCmdComplete(OMX_CommandFlush, kPortIndexOutput); 19738297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } 19748297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } else { 19758297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber mPortStatus[kPortIndexInput] = SHUTTING_DOWN; 19768297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber mPortStatus[kPortIndexOutput] = SHUTTING_DOWN; 19778297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber 19788297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber status_t err = 1979318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX->sendCommand(mNode, OMX_CommandStateSet, OMX_StateIdle); 19808297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber CHECK_EQ(err, OK); 19818297cedd12f689167d74de5ddacb514e9f6896eaAndreas Huber } 1982693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1983693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (mState != LOADED && mState != ERROR) { 1984693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mAsyncCompletion.wait(mLock); 1985693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1986693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1987693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1988693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1989693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1990693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 1991693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 1992693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 1993693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 1994693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1995693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 1996693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1997693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSource->stop(); 1998693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1999693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 2000693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2001693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2002693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersp<MetaData> OMXCodec::getFormat() { 20037f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber Mutex::Autolock autoLock(mLock); 20047f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 2005693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return mOutputFormat; 2006693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2007693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2008693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatus_t OMXCodec::read( 2009693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaBuffer **buffer, const ReadOptions *options) { 2010693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *buffer = NULL; 2011693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2012693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 2013693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2014450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber if (mState != EXECUTING && mState != RECONFIGURING) { 2015450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber return UNKNOWN_ERROR; 2016450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber } 2017450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber 20187e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber bool seeking = false; 20197e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber int64_t seekTimeUs; 20207e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber if (options && options->getSeekTo(&seekTimeUs)) { 20217e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber seeking = true; 20227e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber } 20237e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 2024284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber if (mInitialBufferSubmit) { 2025284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber mInitialBufferSubmit = false; 2026284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber 20277e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber if (seeking) { 20287e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber CHECK(seekTimeUs >= 0); 20297e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber mSeekTimeUs = seekTimeUs; 20307e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 20317e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber // There's no reason to trigger the code below, there's 20327e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber // nothing to flush yet. 20337e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber seeking = false; 20347e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber } 20357e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 2036284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber drainInputBuffers(); 2037284f513a4ce2c5aa0e250c07c873731aedb0be26Andreas Huber 2038450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber if (mState == EXECUTING) { 2039450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber // Otherwise mState == RECONFIGURING and this code will trigger 2040450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber // after the output port is reenabled. 2041450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber fillOutputBuffers(); 2042450bf4b0d25c933431b790d911a5fcae750fe38dAndreas Huber } 2043693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2044693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 20457e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber if (seeking) { 20467a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber CODEC_LOGV("seeking to %lld us (%.2f secs)", seekTimeUs, seekTimeUs / 1E6); 2047693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2048693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSignalledEOS = false; 2049693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNoMoreOutputData = false; 2050693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2051693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(seekTimeUs >= 0); 2052693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSeekTimeUs = seekTimeUs; 2053693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2054693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.clear(); 2055693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2056693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mState, EXECUTING); 2057693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 20581beb760d920561679862ded945a04e370368c7f7Andreas Huber bool emulateInputFlushCompletion = !flushPortAsync(kPortIndexInput); 20591beb760d920561679862ded945a04e370368c7f7Andreas Huber bool emulateOutputFlushCompletion = !flushPortAsync(kPortIndexOutput); 20601beb760d920561679862ded945a04e370368c7f7Andreas Huber 20611beb760d920561679862ded945a04e370368c7f7Andreas Huber if (emulateInputFlushCompletion) { 20621beb760d920561679862ded945a04e370368c7f7Andreas Huber onCmdComplete(OMX_CommandFlush, kPortIndexInput); 20631beb760d920561679862ded945a04e370368c7f7Andreas Huber } 20641beb760d920561679862ded945a04e370368c7f7Andreas Huber 20651beb760d920561679862ded945a04e370368c7f7Andreas Huber if (emulateOutputFlushCompletion) { 20661beb760d920561679862ded945a04e370368c7f7Andreas Huber onCmdComplete(OMX_CommandFlush, kPortIndexOutput); 20671beb760d920561679862ded945a04e370368c7f7Andreas Huber } 2068693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2069693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2070693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber while (mState != ERROR && !mNoMoreOutputData && mFilledBuffers.empty()) { 2071693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mBufferFilled.wait(mLock); 2072693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2073693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2074693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mState == ERROR) { 2075693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return UNKNOWN_ERROR; 2076693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2077693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2078693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (mFilledBuffers.empty()) { 2079693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return ERROR_END_OF_STREAM; 2080693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2081693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 20827f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber if (mOutputPortSettingsHaveChanged) { 20837f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber mOutputPortSettingsHaveChanged = false; 20847f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 20857f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber return INFO_FORMAT_CHANGED; 20867f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber } 20877f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 2088693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t index = *mFilledBuffers.begin(); 2089693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mFilledBuffers.erase(mFilledBuffers.begin()); 2090693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2091693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index); 2092693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber info->mMediaBuffer->add_ref(); 2093693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *buffer = info->mMediaBuffer; 2094693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2095693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 2096693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2097693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2098693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::signalBufferReturned(MediaBuffer *buffer) { 2099693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Mutex::Autolock autoLock(mLock); 2100693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2101693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput]; 2102693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 2103693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber BufferInfo *info = &buffers->editItemAt(i); 2104693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2105693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (info->mMediaBuffer == buffer) { 2106693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(mPortStatus[kPortIndexOutput], ENABLED); 2107693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fillOutputBuffer(info); 2108693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return; 2109693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2111693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2112693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here."); 2113693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2114693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2115693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *imageCompressionFormatString(OMX_IMAGE_CODINGTYPE type) { 2116693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 2117693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingUnused", 2118693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingAutoDetect", 2119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingJPEG", 2120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingJPEG2K", 2121693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingEXIF", 2122693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingTIFF", 2123693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingGIF", 2124693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingPNG", 2125693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingLZW", 2126693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_IMAGE_CodingBMP", 2127693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 2128693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2129693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 2130693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2131693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 2132693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 2133693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2134693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 2135693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2136693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2137693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2138693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *colorFormatString(OMX_COLOR_FORMATTYPE type) { 2139693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 2140693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatUnused", 2141693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatMonochrome", 2142693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format8bitRGB332", 2143693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format12bitRGB444", 2144693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitARGB4444", 2145693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitARGB1555", 2146693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitRGB565", 2147693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format16bitBGR565", 2148693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format18bitRGB666", 2149693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format18bitARGB1665", 2150bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_Format19bitARGB1666", 2151693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24bitRGB888", 2152693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24bitBGR888", 2153693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24bitARGB1887", 2154693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format25bitARGB1888", 2155693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format32bitBGRA8888", 2156693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format32bitARGB8888", 2157693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV411Planar", 2158693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV411PackedPlanar", 2159693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420Planar", 2160693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420PackedPlanar", 2161693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420SemiPlanar", 2162693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422Planar", 2163693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422PackedPlanar", 2164693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422SemiPlanar", 2165693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYCbYCr", 2166693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYCrYCb", 2167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatCbYCrY", 2168693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatCrYCbY", 2169693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV444Interleaved", 2170693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatRawBayer8bit", 2171693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatRawBayer10bit", 2172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatRawBayer8bitcompressed", 2173bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL2", 2174bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL4", 2175bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL8", 2176bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL16", 2177bde3caae211e215e4bbfef1a267f8d680efa4764Andreas Huber "OMX_COLOR_FormatL24", 2178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatL32", 2179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV420PackedSemiPlanar", 2180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_FormatYUV422PackedSemiPlanar", 2181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format18BitBGR666", 2182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24BitARGB6666", 2183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_COLOR_Format24BitABGR6666", 2184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 2185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 2187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type == OMX_QCOM_COLOR_FormatYVU420SemiPlanar) { 2189693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "OMX_QCOM_COLOR_FormatYVU420SemiPlanar"; 2190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (type < 0 || (size_t)type >= numNames) { 2191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 2192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 2194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *videoCompressionFormatString(OMX_VIDEO_CODINGTYPE type) { 2198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 2199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingUnused", 2200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingAutoDetect", 2201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingMPEG2", 2202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingH263", 2203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingMPEG4", 2204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingWMV", 2205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingRV", 2206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingAVC", 2207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_VIDEO_CodingMJPEG", 2208693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 2209693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2210693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 2211693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2212693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 2213693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 2214693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2215693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 2216693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2217693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2218693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2219693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *audioCodingTypeString(OMX_AUDIO_CODINGTYPE type) { 2220693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 2221693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingUnused", 2222693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingAutoDetect", 2223693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPCM", 2224693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingADPCM", 2225693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingAMR", 2226693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingGSMFR", 2227693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingGSMEFR", 2228693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingGSMHR", 2229693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPDCFR", 2230693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPDCEFR", 2231693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingPDCHR", 2232693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingTDMAFR", 2233693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingTDMAEFR", 2234693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingQCELP8", 2235693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingQCELP13", 2236693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingEVRC", 2237693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingSMV", 2238693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG711", 2239693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG723", 2240693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG726", 2241693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingG729", 2242693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingAAC", 2243693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingMP3", 2244693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingSBC", 2245693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingVORBIS", 2246693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingWMA", 2247693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingRA", 2248693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_CodingMIDI", 2249693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 2250693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2251693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 2252693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2253693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 2254693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 2255693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2256693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 2257693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2258693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2259693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2260693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic const char *audioPCMModeString(OMX_AUDIO_PCMMODETYPE type) { 2261693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber static const char *kNames[] = { 2262693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_PCMModeLinear", 2263693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_PCMModeALaw", 2264693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber "OMX_AUDIO_PCMModeMULaw", 2265693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 2266693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2267693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 2268693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2269693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (type < 0 || (size_t)type >= numNames) { 2270693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return "UNKNOWN"; 2271693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2272693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return kNames[type]; 2273693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2274693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2275693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 22762f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huberstatic const char *amrBandModeString(OMX_AUDIO_AMRBANDMODETYPE type) { 22772f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber static const char *kNames[] = { 22782f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeUnused", 22792f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB0", 22802f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB1", 22812f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB2", 22822f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB3", 22832f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB4", 22842f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB5", 22852f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB6", 22862f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeNB7", 22872f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB0", 22882f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB1", 22892f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB2", 22902f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB3", 22912f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB4", 22922f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB5", 22932f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB6", 22942f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB7", 22952f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRBandModeWB8", 22962f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber }; 22972f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 22982f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 22992f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 23002f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber if (type < 0 || (size_t)type >= numNames) { 23012f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber return "UNKNOWN"; 23022f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } else { 23032f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber return kNames[type]; 23042f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } 23052f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber} 23062f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 23072f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huberstatic const char *amrFrameFormatString(OMX_AUDIO_AMRFRAMEFORMATTYPE type) { 23082f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber static const char *kNames[] = { 23092f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatConformance", 23102f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatIF1", 23112f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatIF2", 23122f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatFSF", 23132f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatRTPPayload", 23142f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber "OMX_AUDIO_AMRFrameFormatITU", 23152f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber }; 23162f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 23172f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber size_t numNames = sizeof(kNames) / sizeof(kNames[0]); 23182f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 23192f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber if (type < 0 || (size_t)type >= numNames) { 23202f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber return "UNKNOWN"; 23212f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } else { 23222f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber return kNames[type]; 23232f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } 23242f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber} 2325693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2326693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::dumpPortStatus(OMX_U32 portIndex) { 2327693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 23287a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 2329693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = portIndex; 2330693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2331318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 2332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 2334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("%s Port = {\n", portIndex == kPortIndexInput ? "Input" : "Output"); 2336693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2337693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK((portIndex == kPortIndexInput && def.eDir == OMX_DirInput) 2338693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber || (portIndex == kPortIndexOutput && def.eDir == OMX_DirOutput)); 2339693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2340693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBufferCountActual = %ld\n", def.nBufferCountActual); 2341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBufferCountMin = %ld\n", def.nBufferCountMin); 2342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBufferSize = %ld\n", def.nBufferSize); 2343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (def.eDomain) { 2345693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainImage: 2346693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2347693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; 2348693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2349693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 2350693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Image\n"); 2351693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameWidth = %ld\n", imageDef->nFrameWidth); 2352693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameHeight = %ld\n", imageDef->nFrameHeight); 2353693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nStride = %ld\n", imageDef->nStride); 2354693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2355693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eCompressionFormat = %s\n", 2356693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber imageCompressionFormatString(imageDef->eCompressionFormat)); 2357693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2358693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eColorFormat = %s\n", 2359693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormatString(imageDef->eColorFormat)); 2360693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2361693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2362693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2363693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2364693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainVideo: 2365693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2366693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *videoDef = &def.format.video; 2367693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2368693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 2369693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Video\n"); 2370693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameWidth = %ld\n", videoDef->nFrameWidth); 2371693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nFrameHeight = %ld\n", videoDef->nFrameHeight); 2372693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nStride = %ld\n", videoDef->nStride); 2373693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2374693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eCompressionFormat = %s\n", 2375693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber videoCompressionFormatString(videoDef->eCompressionFormat)); 2376693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2377693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eColorFormat = %s\n", 2378693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber colorFormatString(videoDef->eColorFormat)); 2379693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2380693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2381693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2382693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2383693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainAudio: 2384693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2385693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audioDef = &def.format.audio; 2386693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2387693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 2388693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Audio\n"); 2389693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eEncoding = %s\n", 2390693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber audioCodingTypeString(audioDef->eEncoding)); 2391693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2392693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (audioDef->eEncoding == OMX_AUDIO_CodingPCM) { 2393693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 23947a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(¶ms); 2395693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.nPortIndex = portIndex; 2396693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2397318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->getParameter( 2398693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamAudioPcm, ¶ms, sizeof(params)); 2399693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 2400693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2401693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nSamplingRate = %ld\n", params.nSamplingRate); 2402693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nChannels = %ld\n", params.nChannels); 2403693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" bInterleaved = %d\n", params.bInterleaved); 2404693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" nBitPerSample = %ld\n", params.nBitPerSample); 2405693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2406693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" eNumData = %s\n", 2407693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params.eNumData == OMX_NumericalDataSigned 2408693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber ? "signed" : "unsigned"); 2409693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2410693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" ePCMMode = %s\n", audioPCMModeString(params.ePCMMode)); 24112f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } else if (audioDef->eEncoding == OMX_AUDIO_CodingAMR) { 24122f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber OMX_AUDIO_PARAM_AMRTYPE amr; 24132f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber InitOMXParams(&amr); 24142f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber amr.nPortIndex = portIndex; 24152f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 2416318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->getParameter( 24172f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mNode, OMX_IndexParamAudioAmr, &amr, sizeof(amr)); 24182f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber CHECK_EQ(err, OK); 24192f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 24202f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber printf(" nChannels = %ld\n", amr.nChannels); 24212f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber printf(" eAMRBandMode = %s\n", 24222f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber amrBandModeString(amr.eAMRBandMode)); 24232f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber printf(" eAMRFrameFormat = %s\n", 24242f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber amrFrameFormatString(amr.eAMRFrameFormat)); 2425693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2426693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2427693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2428693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2429693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2430693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 2431693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2432693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf(" // Unknown\n"); 2433693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2434693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2435693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2436693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2437693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("}\n"); 2438693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2439693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2440693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMXCodec::initOutputFormat(const sp<MetaData> &inputFormat) { 2441693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat = new MetaData; 2442693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setCString(kKeyDecoderComponent, mComponentName); 2443693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2444693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 24457a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(&def); 2446693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber def.nPortIndex = kPortIndexOutput; 2447693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2448318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = mOMX->getParameter( 2449693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2450693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(err, OK); 2451693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2452693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber switch (def.eDomain) { 2453693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainImage: 2454693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2455693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; 2456693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingUnused); 2457693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 245818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber mOutputFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); 2459693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyColorFormat, imageDef->eColorFormat); 2460693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyWidth, imageDef->nFrameWidth); 2461693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyHeight, imageDef->nFrameHeight); 2462693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2463693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2464693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2465693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainAudio: 2466693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2467693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audio_def = &def.format.audio; 2468693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2469e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if (audio_def->eEncoding == OMX_AUDIO_CodingPCM) { 2470e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 24717a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber InitOMXParams(¶ms); 2472e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber params.nPortIndex = kPortIndexOutput; 2473693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2474318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->getParameter( 2475e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mNode, OMX_IndexParamAudioPcm, ¶ms, sizeof(params)); 2476e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(err, OK); 2477693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2478e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(params.eNumData, OMX_NumericalDataSigned); 2479e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(params.nBitPerSample, 16); 2480e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK_EQ(params.ePCMMode, OMX_AUDIO_PCMModeLinear); 2481693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2482e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber int32_t numChannels, sampleRate; 2483e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber inputFormat->findInt32(kKeyChannelCount, &numChannels); 2484e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber inputFormat->findInt32(kKeySampleRate, &sampleRate); 2485693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2486e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber if ((OMX_U32)numChannels != params.nChannels) { 2487e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber LOGW("Codec outputs a different number of channels than " 2488e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber "the input stream contains."); 2489e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 249037940eefcba982836b579fe1ffec6cada72b0974Andreas Huber 249118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber mOutputFormat->setCString( 249218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW); 249337940eefcba982836b579fe1ffec6cada72b0974Andreas Huber 2494e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber // Use the codec-advertised number of channels, as some 2495e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber // codecs appear to output stereo even if the input data is 2496e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber // mono. 2497e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mOutputFormat->setInt32(kKeyChannelCount, params.nChannels); 249837940eefcba982836b579fe1ffec6cada72b0974Andreas Huber 2499e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber // The codec-reported sampleRate is not reliable... 2500e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber mOutputFormat->setInt32(kKeySampleRate, sampleRate); 2501e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } else if (audio_def->eEncoding == OMX_AUDIO_CodingAMR) { 25022f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber OMX_AUDIO_PARAM_AMRTYPE amr; 25032f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber InitOMXParams(&amr); 25042f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber amr.nPortIndex = kPortIndexOutput; 25052f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 2506318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = mOMX->getParameter( 25072f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mNode, OMX_IndexParamAudioAmr, &amr, sizeof(amr)); 25082f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber CHECK_EQ(err, OK); 25092f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 25102f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber CHECK_EQ(amr.nChannels, 1); 25112f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mOutputFormat->setInt32(kKeyChannelCount, 1); 25122f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber 25132f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber if (amr.eAMRBandMode >= OMX_AUDIO_AMRBandModeNB0 25142f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber && amr.eAMRBandMode <= OMX_AUDIO_AMRBandModeNB7) { 251518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber mOutputFormat->setCString( 251618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AMR_NB); 25172f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mOutputFormat->setInt32(kKeySampleRate, 8000); 25182f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } else if (amr.eAMRBandMode >= OMX_AUDIO_AMRBandModeWB0 25192f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber && amr.eAMRBandMode <= OMX_AUDIO_AMRBandModeWB8) { 252018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber mOutputFormat->setCString( 252118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AMR_WB); 25222f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber mOutputFormat->setInt32(kKeySampleRate, 16000); 25232f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } else { 25242f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber CHECK(!"Unknown AMR band mode."); 25252f7daa1d7e01bfc2cd7546edeeaea0c3c2ee728cAndreas Huber } 2526e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } else if (audio_def->eEncoding == OMX_AUDIO_CodingAAC) { 252718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber mOutputFormat->setCString( 252818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC); 2529e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } else { 2530e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber CHECK(!"Should not be here. Unknown audio encoding."); 2531e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 2532693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2533693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2534693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2535693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case OMX_PortDomainVideo: 2536693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2537693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 2538693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2539693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (video_def->eCompressionFormat == OMX_VIDEO_CodingUnused) { 254018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber mOutputFormat->setCString( 254118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); 2542693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingMPEG4) { 254318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber mOutputFormat->setCString( 254418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4); 2545693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingH263) { 254618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber mOutputFormat->setCString( 254718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263); 2548693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingAVC) { 254918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber mOutputFormat->setCString( 255018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); 2551693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2552693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"Unknown compression format."); 2553693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2554693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2555693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (!strcmp(mComponentName, "OMX.PV.avcdec")) { 2556693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // This component appears to be lying to me. 2557693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32( 2558693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyWidth, (video_def->nFrameWidth + 15) & -16); 2559693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32( 2560693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kKeyHeight, (video_def->nFrameHeight + 15) & -16); 2561693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 2562693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyWidth, video_def->nFrameWidth); 2563693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyHeight, video_def->nFrameHeight); 2564693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2565693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2566693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mOutputFormat->setInt32(kKeyColorFormat, video_def->eColorFormat); 2567693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2568693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2569693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2570693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber default: 2571693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 2572693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(!"should not be here, neither audio nor video."); 2573693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber break; 2574693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2575693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2576693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 2577693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 257818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber//////////////////////////////////////////////////////////////////////////////// 257918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 258018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huberstatus_t QueryCodecs( 258118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber const sp<IOMX> &omx, 258218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber const char *mime, bool queryDecoders, 258318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber Vector<CodecCapabilities> *results) { 258418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber results->clear(); 258518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 258618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber for (int index = 0;; ++index) { 258718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber const char *componentName; 258818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 258918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (!queryDecoders) { 259018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber componentName = GetCodec( 259118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber kEncoderInfo, sizeof(kEncoderInfo) / sizeof(kEncoderInfo[0]), 259218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber mime, index); 259318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } else { 259418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber componentName = GetCodec( 259518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber kDecoderInfo, sizeof(kDecoderInfo) / sizeof(kDecoderInfo[0]), 259618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber mime, index); 259718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 259818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 259918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (!componentName) { 260018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber return OK; 260118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 260218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 2603318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<OMXCodecObserver> observer = new OMXCodecObserver; 260418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber IOMX::node_id node; 2605318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = omx->allocateNode(componentName, observer, &node); 260618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 260718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (err != OK) { 260818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber continue; 260918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 261018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 261118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber OMXCodec::setComponentRole(omx, node, queryDecoders, mime); 261218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 261318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber results->push(); 261418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CodecCapabilities *caps = &results->editItemAt(results->size() - 1); 261518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber caps->mComponentName = componentName; 261618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 261718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber OMX_VIDEO_PARAM_PROFILELEVELTYPE param; 261818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber InitOMXParams(¶m); 261918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 262018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber param.nPortIndex = queryDecoders ? 0 : 1; 262118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 262218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber for (param.nProfileIndex = 0;; ++param.nProfileIndex) { 2623318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber err = omx->getParameter( 262418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber node, OMX_IndexParamVideoProfileLevelQuerySupported, 262518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber ¶m, sizeof(param)); 262618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 262718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (err != OK) { 262818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber break; 262918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 263018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 263118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CodecProfileLevel profileLevel; 263218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber profileLevel.mProfile = param.eProfile; 263318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber profileLevel.mLevel = param.eLevel; 263418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 263518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber caps->mProfileLevels.push(profileLevel); 263618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 263718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 2638318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber CHECK_EQ(omx->freeNode(node), OK); 263918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 264018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber} 264118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 2642693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} // namespace android 2643