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