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; 63ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.nBufferSize = 32 * 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; 81ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber def.nBufferSize = 32 * 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) { 103ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber case OMX_IndexParamAudioPcm: 104ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { 105ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE *pcmParams = 106ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber (OMX_AUDIO_PARAM_PCMMODETYPE *)params; 107ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 1082720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(pcmParams)) { 1092720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 1102720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 1112720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 112ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (pcmParams->nPortIndex != 0 && pcmParams->nPortIndex != 1) { 113ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorUndefined; 114ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 115ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 1165b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar pcmParams->eNumData = (OMX_NUMERICALDATATYPE)mNumericalData; 117ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->eEndian = OMX_EndianBig; 118ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->bInterleaved = OMX_TRUE; 1195b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar pcmParams->nBitPerSample = mBitsPerSample; 120ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->ePCMMode = OMX_AUDIO_PCMModeLinear; 121ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->eChannelMapping[0] = OMX_AUDIO_ChannelLF; 122ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->eChannelMapping[1] = OMX_AUDIO_ChannelRF; 123ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 124ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->nChannels = mChannelCount; 125ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber pcmParams->nSamplingRate = mSampleRate; 126ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 127ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorNone; 128ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 129ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 130ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber default: 131ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return SimpleSoftOMXComponent::internalGetParameter(index, params); 132ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 133ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 134ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 135ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas HuberOMX_ERRORTYPE SoftRaw::internalSetParameter( 136ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_INDEXTYPE index, const OMX_PTR params) { 137ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber switch (index) { 138ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber case OMX_IndexParamStandardComponentRole: 139ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { 140ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber const OMX_PARAM_COMPONENTROLETYPE *roleParams = 141ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber (const OMX_PARAM_COMPONENTROLETYPE *)params; 142ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 1432720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(roleParams)) { 1442720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 1452720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 1462720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 147ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (strncmp((const char *)roleParams->cRole, 148ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber "audio_decoder.raw", 149ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_MAX_STRINGNAME_SIZE - 1)) { 150ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorUndefined; 151ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 152ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 153ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorNone; 154ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 155ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 156ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber case OMX_IndexParamAudioPcm: 157ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { 158ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber const OMX_AUDIO_PARAM_PCMMODETYPE *pcmParams = 159ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber (OMX_AUDIO_PARAM_PCMMODETYPE *)params; 160ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 1612720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(pcmParams)) { 1622720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 1632720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 1642720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 165ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (pcmParams->nPortIndex != 0) { 166ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorUndefined; 167ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 168ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 169ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber mChannelCount = pcmParams->nChannels; 170ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber mSampleRate = pcmParams->nSamplingRate; 1715b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar mNumericalData = pcmParams->eNumData; 1725b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar mBitsPerSample = pcmParams->nBitPerSample; 173ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 174ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return OMX_ErrorNone; 175ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 176ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 177ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber default: 178c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim { 179c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim OMX_ERRORTYPE err = SimpleSoftOMXComponent::internalSetParameter( 180c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim index, params); 181c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim // In case inPort->mDef.nBufferSize changed, the output buffer size 182c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim // should match the input buffer size. 183c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim PortInfo *inPort = editPortInfo(0); 184c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim PortInfo *outPort = editPortInfo(1); 185c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim outPort->mDef.nBufferSize = inPort->mDef.nBufferSize; 186c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim return err; 187c6c6d6baf934a594fc4f81b7c4d9289a4c5962f4Wonsik Kim } 188ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 189ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 190ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 19184333e0475bc911adc16417f4ca327c975cf6c36Andreas Hubervoid SoftRaw::onQueueFilled(OMX_U32 /* portIndex */) { 192ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (mSignalledError) { 193ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return; 194ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 195ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 196ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber List<BufferInfo *> &inQueue = getPortQueue(0); 197ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber List<BufferInfo *> &outQueue = getPortQueue(1); 198ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 199ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber while (!inQueue.empty() && !outQueue.empty()) { 200ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber BufferInfo *inInfo = *inQueue.begin(); 201ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_BUFFERHEADERTYPE *inHeader = inInfo->mHeader; 202ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 203ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber BufferInfo *outInfo = *outQueue.begin(); 204ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader; 205ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 206ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber CHECK_GE(outHeader->nAllocLen, inHeader->nFilledLen); 207ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber memcpy(outHeader->pBuffer, 208ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber inHeader->pBuffer + inHeader->nOffset, 209ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber inHeader->nFilledLen); 210ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 211ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outHeader->nFlags = inHeader->nFlags; 212ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outHeader->nOffset = 0; 213ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outHeader->nFilledLen = inHeader->nFilledLen; 214ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outHeader->nTimeStamp = inHeader->nTimeStamp; 215ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 216ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber bool sawEOS = (inHeader->nFlags & OMX_BUFFERFLAG_EOS) != 0; 217ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 218ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber inQueue.erase(inQueue.begin()); 219ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber inInfo->mOwnedByUs = false; 220ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber notifyEmptyBufferDone(inHeader); 221ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 222ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outQueue.erase(outQueue.begin()); 223ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber outInfo->mOwnedByUs = false; 224ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber notifyFillBufferDone(outHeader); 225ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 226ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (sawEOS) { 227ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber break; 228ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 229ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 230ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 231ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 232ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} // namespace android 233ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber 234ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huberandroid::SoftOMXComponent *createSoftOMXComponent( 235ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber const char *name, const OMX_CALLBACKTYPE *callbacks, 236ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber OMX_PTR appData, OMX_COMPONENTTYPE **component) { 237ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber return new android::SoftRaw(name, callbacks, appData, component); 238ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber} 239