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