1ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber/* 2ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * Copyright (C) 2012 The Android Open Source Project 3ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * 4ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * you may not use this file except in compliance with the License. 6ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * You may obtain a copy of the License at 7ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * 8ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * 10ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * Unless required by applicable law or agreed to in writing, software 11ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * See the License for the specific language governing permissions and 14ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber * limitations under the License. 15ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber */ 16ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 17ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber//#define LOG_NDEBUG 0 18ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber#define LOG_TAG "SoftRaw" 19ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber#include <utils/Log.h> 20ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 21ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber#include "SoftRaw.h" 22ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 23ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber#include <media/stagefright/foundation/ADebug.h> 24ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber#include <media/stagefright/foundation/hexdump.h> 25ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 26ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Hubernamespace android { 27ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 28ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Hubertemplate<class T> 29ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huberstatic void InitOMXParams(T *params) { 30ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber params->nSize = sizeof(T); 31ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber params->nVersion.s.nVersionMajor = 1; 32ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber params->nVersion.s.nVersionMinor = 0; 33ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber params->nVersion.s.nRevision = 0; 34ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber params->nVersion.s.nStep = 0; 35ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 36ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 37ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas HuberSoftRaw::SoftRaw( 38ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber const char *name, 39ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber const OMX_CALLBACKTYPE *callbacks, 40ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_PTR appData, 41ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_COMPONENTTYPE **component) 42ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber : SimpleSoftOMXComponent(name, callbacks, appData, component), 43ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber mSignalledError(false), 44ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber mChannelCount(2), 455b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar mSampleRate(44100), 465b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar mNumericalData(OMX_NumericalDataSigned), 475b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar mBitsPerSample(16) { 48ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber initPorts(); 49ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber CHECK_EQ(initDecoder(), (status_t)OK); 50ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 51ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 52ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas HuberSoftRaw::~SoftRaw() { 53ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 54ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 55ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Hubervoid SoftRaw::initPorts() { 56ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 57ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber InitOMXParams(&def); 58ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 59ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.nPortIndex = 0; 60ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.eDir = OMX_DirInput; 61ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.nBufferCountMin = kNumBuffers; 62ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.nBufferCountActual = def.nBufferCountMin; 6372df338ed8fba1351d650a0910fb947ecc0e5c0fDavid Yeh def.nBufferSize = 64 * 1024; 64ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.bEnabled = OMX_TRUE; 65ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.bPopulated = OMX_FALSE; 66ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.eDomain = OMX_PortDomainAudio; 67ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.bBuffersContiguous = OMX_FALSE; 68ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.nBufferAlignment = 1; 69ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 70ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.format.audio.cMIMEType = const_cast<char *>("audio/raw"); 71ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.format.audio.pNativeRender = NULL; 72ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.format.audio.bFlagErrorConcealment = OMX_FALSE; 73ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingPCM; 74ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 75ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber addPort(def); 76ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 77ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.nPortIndex = 1; 78ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.eDir = OMX_DirOutput; 79ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.nBufferCountMin = kNumBuffers; 80ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.nBufferCountActual = def.nBufferCountMin; 8172df338ed8fba1351d650a0910fb947ecc0e5c0fDavid Yeh def.nBufferSize = 64 * 1024; 82ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.bEnabled = OMX_TRUE; 83ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.bPopulated = OMX_FALSE; 84ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.eDomain = OMX_PortDomainAudio; 85ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.bBuffersContiguous = OMX_FALSE; 86ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.nBufferAlignment = 2; 87ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 88ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.format.audio.cMIMEType = const_cast<char *>("audio/raw"); 89ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.format.audio.pNativeRender = NULL; 90ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.format.audio.bFlagErrorConcealment = OMX_FALSE; 91ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingPCM; 92ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 93ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber addPort(def); 94ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 95ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 96ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huberstatus_t SoftRaw::initDecoder() { 97ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OK; 98ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 99ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 100ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas HuberOMX_ERRORTYPE SoftRaw::internalGetParameter( 101ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_INDEXTYPE index, OMX_PTR params) { 102ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber switch (index) { 1031e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan case OMX_IndexParamAudioPortFormat: 1041e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan { 1051e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan OMX_AUDIO_PARAM_PORTFORMATTYPE *formatParams = 1061e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan (OMX_AUDIO_PARAM_PORTFORMATTYPE *)params; 1071e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan 1081e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan if (!isValidOMXParam(formatParams)) { 1091e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan return OMX_ErrorBadParameter; 1101e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan } 1111e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan 1121e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan if (formatParams->nPortIndex > 1) { 1131e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan return OMX_ErrorUndefined; 1141e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan } 1151e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan 1161e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan if (formatParams->nIndex > 0) { 1171e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan return OMX_ErrorNoMore; 1181e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan } 1191e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan 1201e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan formatParams->eEncoding = OMX_AUDIO_CodingPCM; 1211e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan 1221e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan return OMX_ErrorNone; 1231e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan } 1241e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan 125ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber case OMX_IndexParamAudioPcm: 126ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { 127ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE *pcmParams = 128ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber (OMX_AUDIO_PARAM_PCMMODETYPE *)params; 129ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 1302720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(pcmParams)) { 1312720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 1322720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 1332720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 134ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (pcmParams->nPortIndex != 0 && pcmParams->nPortIndex != 1) { 135ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorUndefined; 136ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 137ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 1385b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar pcmParams->eNumData = (OMX_NUMERICALDATATYPE)mNumericalData; 139ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->eEndian = OMX_EndianBig; 140ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->bInterleaved = OMX_TRUE; 1415b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar pcmParams->nBitPerSample = mBitsPerSample; 142ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->ePCMMode = OMX_AUDIO_PCMModeLinear; 143ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->eChannelMapping[0] = OMX_AUDIO_ChannelLF; 144ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->eChannelMapping[1] = OMX_AUDIO_ChannelRF; 145ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 146ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->nChannels = mChannelCount; 147ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->nSamplingRate = mSampleRate; 148ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 149ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorNone; 150ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 151ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 152ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber default: 153ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return SimpleSoftOMXComponent::internalGetParameter(index, params); 154ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 155ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 156ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 157ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas HuberOMX_ERRORTYPE SoftRaw::internalSetParameter( 158ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_INDEXTYPE index, const OMX_PTR params) { 159ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber switch (index) { 160ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber case OMX_IndexParamStandardComponentRole: 161ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { 162ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber const OMX_PARAM_COMPONENTROLETYPE *roleParams = 163ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber (const OMX_PARAM_COMPONENTROLETYPE *)params; 164ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 1652720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(roleParams)) { 1662720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 1672720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 1682720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 169ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (strncmp((const char *)roleParams->cRole, 170ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber "audio_decoder.raw", 171ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_MAX_STRINGNAME_SIZE - 1)) { 172ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorUndefined; 173ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 174ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 175ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorNone; 176ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 177ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 1781e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan case OMX_IndexParamAudioPortFormat: 1791e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan { 1801e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan const OMX_AUDIO_PARAM_PORTFORMATTYPE *formatParams = 1811e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan (const OMX_AUDIO_PARAM_PORTFORMATTYPE *)params; 1821e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan 1831e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan if (!isValidOMXParam(formatParams)) { 1841e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan return OMX_ErrorBadParameter; 1851e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan } 1861e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan 1871e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan if (formatParams->nPortIndex > 1) { 1881e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan return OMX_ErrorUndefined; 1891e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan } 1901e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan 1911e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan if (formatParams->eEncoding != OMX_AUDIO_CodingPCM) { 1921e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan return OMX_ErrorUndefined; 1931e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan } 1941e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan 1951e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan return OMX_ErrorNone; 1961e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan } 1971e73885bceac69f2b08987e36aad651c824fbd65Ram Mohan 198ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber case OMX_IndexParamAudioPcm: 199ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { 200ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber const OMX_AUDIO_PARAM_PCMMODETYPE *pcmParams = 201ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber (OMX_AUDIO_PARAM_PCMMODETYPE *)params; 202ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 2032720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(pcmParams)) { 2042720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 2052720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 2062720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 207ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (pcmParams->nPortIndex != 0) { 208ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorUndefined; 209ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 210ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 211ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber mChannelCount = pcmParams->nChannels; 212ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber mSampleRate = pcmParams->nSamplingRate; 2135b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar mNumericalData = pcmParams->eNumData; 2145b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar mBitsPerSample = pcmParams->nBitPerSample; 215ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 216ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorNone; 217ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 218ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 219ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber default: 220c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim { 221c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim OMX_ERRORTYPE err = SimpleSoftOMXComponent::internalSetParameter( 222c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim index, params); 223c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim // In case inPort->mDef.nBufferSize changed, the output buffer size 224c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim // should match the input buffer size. 225c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim PortInfo *inPort = editPortInfo(0); 226c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim PortInfo *outPort = editPortInfo(1); 227c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim outPort->mDef.nBufferSize = inPort->mDef.nBufferSize; 228c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim return err; 229c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim } 230ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 231ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 232ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 23384333e0475bc911adc16417f4ca327c975cf6c36Andreas Hubervoid SoftRaw::onQueueFilled(OMX_U32 /* portIndex */) { 234ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (mSignalledError) { 235ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return; 236ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 237ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 238ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber List<BufferInfo *> &inQueue = getPortQueue(0); 239ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber List<BufferInfo *> &outQueue = getPortQueue(1); 240ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 241ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber while (!inQueue.empty() && !outQueue.empty()) { 242ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber BufferInfo *inInfo = *inQueue.begin(); 243ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_BUFFERHEADERTYPE *inHeader = inInfo->mHeader; 244ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 245ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber BufferInfo *outInfo = *outQueue.begin(); 246ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader; 247ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 248ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber CHECK_GE(outHeader->nAllocLen, inHeader->nFilledLen); 249ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber memcpy(outHeader->pBuffer, 250ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber inHeader->pBuffer + inHeader->nOffset, 251ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber inHeader->nFilledLen); 252ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 253ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outHeader->nFlags = inHeader->nFlags; 254ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outHeader->nOffset = 0; 255ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outHeader->nFilledLen = inHeader->nFilledLen; 256ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outHeader->nTimeStamp = inHeader->nTimeStamp; 257ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 258ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber bool sawEOS = (inHeader->nFlags & OMX_BUFFERFLAG_EOS) != 0; 259ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 260ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber inQueue.erase(inQueue.begin()); 261ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber inInfo->mOwnedByUs = false; 262ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber notifyEmptyBufferDone(inHeader); 263ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 264ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outQueue.erase(outQueue.begin()); 265ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outInfo->mOwnedByUs = false; 266ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber notifyFillBufferDone(outHeader); 267ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 268ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (sawEOS) { 269ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber break; 270ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 271ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 272ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 273ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 274ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} // namespace android 275ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 276ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huberandroid::SoftOMXComponent *createSoftOMXComponent( 277ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber const char *name, const OMX_CALLBACKTYPE *callbacks, 278ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_PTR appData, OMX_COMPONENTTYPE **component) { 279ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return new android::SoftRaw(name, callbacks, appData, component); 280ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 281