blob: 29a9297edaa4457e83dbd0b0940364bdad49e105 [file] [log] [blame]
Ho-Eun Ryu0592b1b2009-10-16 15:26:16 +09001/*
2 * Copyright (C) 2009 Wind River Systems
3 * Author: Keun-O Park <keun-o.park@windriver.com>
4 * Ho-Eun Ryu <ho-eun.ryu@windriver.com>
5 * Min-Su Kim <min-su.kim@windriver.com>
6 */
7
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +09008#include <stdio.h>
9#include <stdlib.h>
10#include <string.h>
11#include <unistd.h>
12
13#include <OMX_Core.h>
14
Ho-Eun Ryu4375deb2009-10-27 09:49:25 +090015#include <audio_parser.h>
16
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +090017#include <cmodule.h>
18#include <portaudio.h>
19#include <componentbase.h>
20
Ho-Eun Ryu52045a32009-10-21 18:10:33 +090021#include <pv_omxcore.h>
22
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +090023#ifdef __cplusplus
24extern "C" {
25#endif
26
27#include <mixaudio.h>
28#include <mixacpaac.h>
29#include <mixacpmp3.h>
30
31#ifdef __cplusplus
32} /* extern "C" */
33#endif
34
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +090035#include "sst.h"
36
Ho-Eun Ryu4375deb2009-10-27 09:49:25 +090037#define LOG_NDEBUG 1
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +090038
39#define LOG_TAG "mrst_sst"
40#include <log.h>
41
42/*
43 * constructor & destructor
44 */
45MrstSstComponent::MrstSstComponent()
46{
47 LOGV("%s(): enter\n", __func__);
48
49 LOGV("%s(),%d: exit (ret = void)\n", __func__, __LINE__);
50}
51
52MrstSstComponent::~MrstSstComponent()
53{
54 LOGV("%s(): enter\n", __func__);
55
56 LOGV("%s(),%d: exit (ret = void)\n", __func__, __LINE__);
57}
58
59/* end of constructor & destructor */
60
61/* core methods & helpers */
62OMX_ERRORTYPE MrstSstComponent::ComponentAllocatePorts(void)
63{
64 OMX_ERRORTYPE ret = OMX_ErrorUndefined;
65
66 LOGV("%s(): enter\n", __func__);
67
68 if (!strcmp(GetWorkingRole(), "audio_decoder.mp3"))
69 ret = __AllocateMp3RolePorts(false);
Ho-Eun Ryuf796f982009-10-19 17:01:09 +090070 else if(!strcmp(GetWorkingRole(), "audio_decoder.aac"))
71 ret = __AllocateAacRolePorts(false);
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +090072
73 LOGV("%s(): exit (ret = 0x%08x)\n", __func__, ret);
74 return ret;
75}
76
77
78OMX_ERRORTYPE MrstSstComponent::__AllocateMp3RolePorts(bool isencoder)
79{
80 PortBase **ports;
81
82 OMX_U32 mp3_port_index, pcm_port_index;
83 OMX_DIRTYPE mp3_port_dir, pcm_port_dir;
84
85 OMX_PORT_PARAM_TYPE portparam;
86 OMX_U32 i;
87 OMX_ERRORTYPE ret;
88
89 LOGV("%s(): enter\n", __func__);
90
91 ports = new PortBase *[NR_PORTS];
92 if (!ports)
93 return OMX_ErrorInsufficientResources;
94 this->nr_ports = NR_PORTS;
95 this->ports = ports;
96
97 if (isencoder) {
98 pcm_port_index = INPORT_INDEX;
99 mp3_port_index = OUTPORT_INDEX;
100 pcm_port_dir = OMX_DirInput;
101 mp3_port_dir = OMX_DirOutput;
102 }
103 else {
104 mp3_port_index = INPORT_INDEX;
105 pcm_port_index = OUTPORT_INDEX;
106 mp3_port_dir = OMX_DirInput;
107 pcm_port_dir = OMX_DirOutput;
108 }
109
110 ret = __AllocateMp3Port(mp3_port_index, mp3_port_dir);
111 if (ret != OMX_ErrorNone)
112 goto free_ports;
113
114 ret = __AllocatePcmPort(pcm_port_index, pcm_port_dir);
115 if (ret != OMX_ErrorNone)
116 goto free_mp3port;
117
118 /* OMX_PORT_PARAM_TYPE */
119 memset(&portparam, 0, sizeof(portparam));
120 SetTypeHeader(&portparam, sizeof(portparam));
121 portparam.nPorts = NR_PORTS;
122 portparam.nStartPortNumber = INPORT_INDEX;
123
124 memcpy(&this->portparam, &portparam, sizeof(portparam));
125 /* end of OMX_PORT_PARAM_TYPE */
126
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900127 coding_type = OMX_AUDIO_CodingMP3;
128 codec_mode = isencoder ? MIX_CODING_ENCODE : MIX_CODING_DECODE;
129
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900130 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, OMX_ErrorNone);
131 return OMX_ErrorNone;
132
133free_mp3port:
134 delete ports[mp3_port_index];
135
136free_ports:
137 delete []ports;
138
139 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
140 return ret;
141}
142
Ho-Eun Ryuf796f982009-10-19 17:01:09 +0900143
144OMX_ERRORTYPE MrstSstComponent::__AllocateAacRolePorts(bool isencoder)
145{
146 PortBase **ports;
147
148 OMX_U32 aac_port_index, pcm_port_index;
149 OMX_DIRTYPE aac_port_dir, pcm_port_dir;
150
151 OMX_PORT_PARAM_TYPE portparam;
152 OMX_U32 i;
153 OMX_ERRORTYPE ret;
154
155 LOGV("%s(): enter\n", __func__);
156
157 ports = new PortBase *[NR_PORTS];
158 if (!ports)
159 return OMX_ErrorInsufficientResources;
160 this->nr_ports = NR_PORTS;
161 this->ports = ports;
162
163 if (isencoder) {
164 pcm_port_index = INPORT_INDEX;
165 aac_port_index = OUTPORT_INDEX;
166 pcm_port_dir = OMX_DirInput;
167 aac_port_dir = OMX_DirOutput;
168 }
169 else {
170 aac_port_index = INPORT_INDEX;
171 pcm_port_index = OUTPORT_INDEX;
172 aac_port_dir = OMX_DirInput;
173 pcm_port_dir = OMX_DirOutput;
174 }
175
176 ret = __AllocateAacPort(aac_port_index, aac_port_dir);
177 if (ret != OMX_ErrorNone)
178 goto free_ports;
179
180 ret = __AllocatePcmPort(pcm_port_index, pcm_port_dir);
181 if (ret != OMX_ErrorNone)
182 goto free_aacport;
183
184 /* OMX_PORT_PARAM_TYPE */
185 memset(&portparam, 0, sizeof(portparam));
186 SetTypeHeader(&portparam, sizeof(portparam));
187 portparam.nPorts = NR_PORTS;
188 portparam.nStartPortNumber = INPORT_INDEX;
189
190 memcpy(&this->portparam, &portparam, sizeof(portparam));
191 /* end of OMX_PORT_PARAM_TYPE */
192
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900193 coding_type = OMX_AUDIO_CodingAAC;
194 codec_mode = isencoder ? MIX_CODING_ENCODE : MIX_CODING_DECODE;
195
Ho-Eun Ryuf796f982009-10-19 17:01:09 +0900196 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, OMX_ErrorNone);
197 return OMX_ErrorNone;
198
199free_aacport:
200 delete ports[aac_port_index];
201
202free_ports:
203 delete []ports;
204
205 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
206 return ret;
207}
208
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900209OMX_ERRORTYPE MrstSstComponent::__AllocateMp3Port(OMX_U32 port_index,
210 OMX_DIRTYPE dir)
211{
212 PortMp3 *mp3port;
213
214 OMX_PARAM_PORTDEFINITIONTYPE mp3portdefinition;
215 OMX_AUDIO_PARAM_MP3TYPE mp3portparam;
216 OMX_U32 i;
217
218 LOGV("%s(): enter\n", __func__);
219
220 ports[port_index] = new PortMp3;
221 if (!ports[port_index]) {
222 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
223 OMX_ErrorInsufficientResources);
224 return OMX_ErrorInsufficientResources;
225 }
226
227 mp3port = static_cast<PortMp3 *>(this->ports[port_index]);
228
229 /* MP3 - OMX_PARAM_PORTDEFINITIONTYPE */
230 memset(&mp3portdefinition, 0, sizeof(mp3portdefinition));
231 SetTypeHeader(&mp3portdefinition, sizeof(mp3portdefinition));
232 mp3portdefinition.nPortIndex = port_index;
233 mp3portdefinition.eDir = dir;
234 if (dir == OMX_DirInput) {
235 mp3portdefinition.nBufferCountActual = INPORT_MP3_ACTUAL_BUFFER_COUNT;
236 mp3portdefinition.nBufferCountMin = INPORT_MP3_MIN_BUFFER_COUNT;
237 mp3portdefinition.nBufferSize = INPORT_MP3_BUFFER_SIZE;
238 }
239 else {
240 mp3portdefinition.nBufferCountActual = OUTPORT_MP3_ACTUAL_BUFFER_COUNT;
241 mp3portdefinition.nBufferCountMin = OUTPORT_MP3_MIN_BUFFER_COUNT;
242 mp3portdefinition.nBufferSize = OUTPORT_MP3_BUFFER_SIZE;
243 }
244 mp3portdefinition.bEnabled = OMX_TRUE;
245 mp3portdefinition.bPopulated = OMX_FALSE;
246 mp3portdefinition.eDomain = OMX_PortDomainAudio;
247 mp3portdefinition.format.audio.cMIMEType = "audio/mpeg";
248 mp3portdefinition.format.audio.pNativeRender = NULL;
249 mp3portdefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
250 mp3portdefinition.format.audio.eEncoding = OMX_AUDIO_CodingMP3;
251 mp3portdefinition.bBuffersContiguous = OMX_FALSE;
252 mp3portdefinition.nBufferAlignment = 0;
253
254 mp3port->SetPortDefinition(&mp3portdefinition, true);
255
256 /* end of MP3 - OMX_PARAM_PORTDEFINITIONTYPE */
257
258 /* OMX_AUDIO_PARAM_MP3TYPE */
259 memset(&mp3portparam, 0, sizeof(mp3portparam));
260 SetTypeHeader(&mp3portparam, sizeof(mp3portparam));
261 mp3portparam.nPortIndex = port_index;
262 mp3portparam.nChannels = 2;
263 mp3portparam.nBitRate = 0;
264 mp3portparam.nSampleRate = 0;
265 mp3portparam.nAudioBandWidth = 0;
266 mp3portparam.eChannelMode = OMX_AUDIO_ChannelModeStereo;
267 mp3portparam.eFormat = OMX_AUDIO_MP3StreamFormatMP1Layer3;
268
269 mp3port->SetPortMp3Param(&mp3portparam, true);
270 /* end of OMX_AUDIO_PARAM_MP3TYPE */
271
272 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, OMX_ErrorNone);
273 return OMX_ErrorNone;
274}
275
Ho-Eun Ryuf796f982009-10-19 17:01:09 +0900276OMX_ERRORTYPE MrstSstComponent::__AllocateAacPort(OMX_U32 port_index,
277 OMX_DIRTYPE dir)
278{
279 PortAac *aacport;
280
281 OMX_PARAM_PORTDEFINITIONTYPE aacportdefinition;
282 OMX_AUDIO_PARAM_AACPROFILETYPE aacportparam;
283 OMX_U32 i;
284
285 LOGV("%s(): enter\n", __func__);
286
287 ports[port_index] = new PortAac;
288 if (!ports[port_index]) {
289 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
290 OMX_ErrorInsufficientResources);
291 return OMX_ErrorInsufficientResources;
292 }
293
294 aacport = static_cast<PortAac *>(this->ports[port_index]);
295
296 /* AAC - OMX_PARAM_PORTDEFINITIONTYPE */
297 memset(&aacportdefinition, 0, sizeof(aacportdefinition));
298 SetTypeHeader(&aacportdefinition, sizeof(aacportdefinition));
299 aacportdefinition.nPortIndex = port_index;
300 aacportdefinition.eDir = dir;
301 if (dir == OMX_DirInput) {
302 aacportdefinition.nBufferCountActual = INPORT_AAC_ACTUAL_BUFFER_COUNT;
303 aacportdefinition.nBufferCountMin = INPORT_AAC_MIN_BUFFER_COUNT;
304 aacportdefinition.nBufferSize = INPORT_AAC_BUFFER_SIZE;
305 }
306 else {
307 aacportdefinition.nBufferCountActual = OUTPORT_AAC_ACTUAL_BUFFER_COUNT;
308 aacportdefinition.nBufferCountMin = OUTPORT_AAC_MIN_BUFFER_COUNT;
309 aacportdefinition.nBufferSize = OUTPORT_AAC_BUFFER_SIZE;
310 }
311 aacportdefinition.bEnabled = OMX_TRUE;
312 aacportdefinition.bPopulated = OMX_FALSE;
313 aacportdefinition.eDomain = OMX_PortDomainAudio;
314 aacportdefinition.format.audio.cMIMEType = "audio/mpeg";
315 aacportdefinition.format.audio.pNativeRender = NULL;
316 aacportdefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
317 aacportdefinition.format.audio.eEncoding = OMX_AUDIO_CodingAAC;
318 aacportdefinition.bBuffersContiguous = OMX_FALSE;
319 aacportdefinition.nBufferAlignment = 0;
320
321 aacport->SetPortDefinition(&aacportdefinition, true);
322
323 /* end of AAC - OMX_PARAM_PORTDEFINITIONTYPE */
324
325 /* OMX_AUDIO_PARAM_AACPROFILETYPE */
326 memset(&aacportparam, 0, sizeof(aacportparam));
327 SetTypeHeader(&aacportparam, sizeof(aacportparam));
328 aacportparam.nPortIndex = port_index;
329 aacportparam.nChannels = 2;
330 aacportparam.nBitRate = 0;
331 aacportparam.nSampleRate = 0;
332 aacportparam.nAudioBandWidth = 0;
333 aacportparam.nFrameLength = 1024; /* default for LC */
334 aacportparam.nAACtools = OMX_AUDIO_AACToolNone;
335 aacportparam.nAACERtools = OMX_AUDIO_AACERNone;
336 aacportparam.eAACProfile = OMX_AUDIO_AACObjectLC;
337 aacportparam.eChannelMode = OMX_AUDIO_ChannelModeStereo;
338
339 aacport->SetPortAacParam(&aacportparam, true);
340 /* end of OMX_AUDIO_PARAM_AACPROFILETYPE */
341
342 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, OMX_ErrorNone);
343 return OMX_ErrorNone;
344}
345
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900346OMX_ERRORTYPE MrstSstComponent::__AllocatePcmPort(OMX_U32 port_index,
347 OMX_DIRTYPE dir)
348{
349 PortPcm *pcmport;
350
351 OMX_PARAM_PORTDEFINITIONTYPE pcmportdefinition;
352 OMX_AUDIO_PARAM_PCMMODETYPE pcmportparam;
353 OMX_U32 i;
354
355 LOGV("%s(): enter\n", __func__);
356
357 ports[port_index] = new PortPcm;
358 if (!ports[port_index]) {
359 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
360 OMX_ErrorInsufficientResources);
361 return OMX_ErrorInsufficientResources;
362 }
363 pcmport = static_cast<PortPcm *>(this->ports[port_index]);
364
365 /* PCM - OMX_PARAM_PORTDEFINITIONTYPE */
366 memset(&pcmportdefinition, 0, sizeof(pcmportdefinition));
367 SetTypeHeader(&pcmportdefinition, sizeof(pcmportdefinition));
368 pcmportdefinition.nPortIndex = port_index;
369 pcmportdefinition.eDir = dir;
370 if (dir == OMX_DirInput) {
371 pcmportdefinition.nBufferCountActual = INPORT_PCM_ACTUAL_BUFFER_COUNT;
372 pcmportdefinition.nBufferCountMin = INPORT_PCM_MIN_BUFFER_COUNT;
373 pcmportdefinition.nBufferSize = INPORT_PCM_BUFFER_SIZE;
374 }
375 else {
376 pcmportdefinition.nBufferCountActual = OUTPORT_PCM_ACTUAL_BUFFER_COUNT;
377 pcmportdefinition.nBufferCountMin = OUTPORT_PCM_MIN_BUFFER_COUNT;
378 pcmportdefinition.nBufferSize = OUTPORT_PCM_BUFFER_SIZE;
379 }
380 pcmportdefinition.bEnabled = OMX_TRUE;
381 pcmportdefinition.bPopulated = OMX_FALSE;
382 pcmportdefinition.eDomain = OMX_PortDomainAudio;
383 pcmportdefinition.format.audio.cMIMEType = "raw";
384 pcmportdefinition.format.audio.pNativeRender = NULL;
385 pcmportdefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
386 pcmportdefinition.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
387 pcmportdefinition.bBuffersContiguous = OMX_FALSE;
388 pcmportdefinition.nBufferAlignment = 0;
389
390 pcmport->SetPortDefinition(&pcmportdefinition, true);
391 /* end of PCM - OMX_PARAM_PORTDEFINITIONTYPE */
392
393 /* OMX_AUDIO_PARAM_PCMMODETYPE */
394 memset(&pcmportparam, 0, sizeof(pcmportparam));
395 SetTypeHeader(&pcmportparam, sizeof(pcmportparam));
396 pcmportparam.nPortIndex = port_index;
397 pcmportparam.nChannels = 2;
398 pcmportparam.eNumData = OMX_NumericalDataUnsigned;
399 pcmportparam.eEndian = OMX_EndianLittle;
400 pcmportparam.bInterleaved = OMX_FALSE;
401 pcmportparam.nBitPerSample = 16;
402 pcmportparam.nSamplingRate = 44100;
403 pcmportparam.ePCMMode = OMX_AUDIO_PCMModeLinear;
404 pcmportparam.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
405 pcmportparam.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
406
407 pcmport->SetPortPcmParam(&pcmportparam, true);
408 /* end of OMX_AUDIO_PARAM_PCMMODETYPE */
409
410 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, OMX_ErrorNone);
411 return OMX_ErrorNone;
412}
413
414/* end of core methods & helpers */
415
416/*
417 * component methods & helpers
418 */
419/* Get/SetParameter */
420OMX_ERRORTYPE MrstSstComponent::ComponentGetParameter(
421 OMX_INDEXTYPE nParamIndex,
422 OMX_PTR pComponentParameterStructure)
423{
424 OMX_ERRORTYPE ret = OMX_ErrorNone;
425
426 LOGV("%s(): enter (index = 0x%08x)\n", __func__, nParamIndex);
427
428 switch (nParamIndex) {
429 case OMX_IndexParamAudioPortFormat: {
430 OMX_AUDIO_PARAM_PORTFORMATTYPE *p =
431 (OMX_AUDIO_PARAM_PORTFORMATTYPE *)pComponentParameterStructure;
432 OMX_U32 index = p->nPortIndex;
433 PortAudio *port = NULL;
434
435 ret = CheckTypeHeader(p, sizeof(*p));
436 if (ret != OMX_ErrorNone) {
437 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
438 return ret;
439 }
440
441 if (index < nr_ports)
442 port = static_cast<PortAudio *>(ports[index]);
443
444 if (!port) {
445 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
446 OMX_ErrorBadPortIndex);
447 return OMX_ErrorBadPortIndex;
448 }
449
450 memcpy(p, port->GetPortAudioParam(), sizeof(*p));
451 break;
452 }
453 case OMX_IndexParamAudioPcm: {
454 OMX_AUDIO_PARAM_PCMMODETYPE *p =
455 (OMX_AUDIO_PARAM_PCMMODETYPE *)pComponentParameterStructure;
456 OMX_U32 index = p->nPortIndex;
457 PortPcm *port = NULL;
458
Ho-Eun Ryuf796f982009-10-19 17:01:09 +0900459 if (strcmp(GetWorkingRole(), "audio_decoder.mp3") &&
460 strcmp(GetWorkingRole(), "audio_decoder.aac")) {
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900461 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
462 OMX_ErrorUnsupportedIndex);
463 return OMX_ErrorUnsupportedIndex;
464 }
465
466 ret = CheckTypeHeader(p, sizeof(*p));
467 if (ret != OMX_ErrorNone) {
468 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
469 return ret;
470 }
471
472 if (index < nr_ports)
473 port = static_cast<PortPcm *>(ports[index]);
474
475 if (!port) {
476 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
477 OMX_ErrorBadPortIndex);
478 return OMX_ErrorBadPortIndex;
479 }
480
481 memcpy(p, port->GetPortPcmParam(), sizeof(*p));
482 break;
483 }
484 case OMX_IndexParamAudioMp3: {
485 OMX_AUDIO_PARAM_MP3TYPE *p =
486 (OMX_AUDIO_PARAM_MP3TYPE *)pComponentParameterStructure;
487 OMX_U32 index = p->nPortIndex;
488 PortMp3 *port = NULL;
489
490 if (strcmp(GetWorkingRole(), "audio_decoder.mp3")) {
491 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
492 OMX_ErrorUnsupportedIndex);
493 return OMX_ErrorUnsupportedIndex;
494 }
495
496 ret = CheckTypeHeader(p, sizeof(*p));
497 if (ret != OMX_ErrorNone) {
498 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
499 return ret;
500 }
501
502 if (index < nr_ports)
503 port = static_cast<PortMp3 *>(ports[index]);
504
505 if (!port) {
506 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
507 OMX_ErrorBadPortIndex);
508 return OMX_ErrorBadPortIndex;
509 }
510
511 memcpy(p, port->GetPortMp3Param(), sizeof(*p));
512 break;
513 }
Ho-Eun Ryuf796f982009-10-19 17:01:09 +0900514 case OMX_IndexParamAudioAac: {
515 OMX_AUDIO_PARAM_AACPROFILETYPE *p =
516 (OMX_AUDIO_PARAM_AACPROFILETYPE *)pComponentParameterStructure;
517 OMX_U32 index = p->nPortIndex;
518 PortAac *port = NULL;
519
520 if (strcmp(GetWorkingRole(), "audio_decoder.aac")) {
521 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
522 OMX_ErrorUnsupportedIndex);
523 return OMX_ErrorUnsupportedIndex;
524 }
525
526 ret = CheckTypeHeader(p, sizeof(*p));
527 if (ret != OMX_ErrorNone) {
528 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
529 return ret;
530 }
531
532 if (index < nr_ports)
533 port = static_cast<PortAac *>(ports[index]);
534
535 if (!port) {
536 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
537 OMX_ErrorBadPortIndex);
538 return OMX_ErrorBadPortIndex;
539 }
540
541 memcpy(p, port->GetPortAacParam(), sizeof(*p));
542 break;
543 }
Ho-Eun Ryu52045a32009-10-21 18:10:33 +0900544 case (OMX_INDEXTYPE) PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX: {
545 PV_OMXComponentCapabilityFlagsType *p =
546 (PV_OMXComponentCapabilityFlagsType *)pComponentParameterStructure;
547
548 p->iIsOMXComponentMultiThreaded = OMX_TRUE;
549 p->iOMXComponentSupportsExternalInputBufferAlloc = OMX_TRUE;
550 p->iOMXComponentSupportsExternalOutputBufferAlloc = OMX_TRUE;
551 p->iOMXComponentSupportsMovableInputBuffers = OMX_TRUE;
552 p->iOMXComponentUsesNALStartCodes = OMX_TRUE;
553 p->iOMXComponentSupportsPartialFrames = OMX_FALSE;
554 p->iOMXComponentCanHandleIncompleteFrames = OMX_TRUE;
555 p->iOMXComponentUsesFullAVCFrames = OMX_FALSE;
556 break;
557 }
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900558 default:
559 ret = OMX_ErrorUnsupportedIndex;
560 } /* switch */
561
562 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
563 return ret;
564}
565
566OMX_ERRORTYPE MrstSstComponent::ComponentSetParameter(
567 OMX_INDEXTYPE nIndex,
568 OMX_PTR pComponentParameterStructure)
569{
570 OMX_ERRORTYPE ret = OMX_ErrorNone;
571
572 LOGV("%s(): enter (index = 0x%08x)\n", __func__, nIndex);
573
574 switch (nIndex) {
575 case OMX_IndexParamAudioPortFormat: {
576 OMX_AUDIO_PARAM_PORTFORMATTYPE *p =
577 (OMX_AUDIO_PARAM_PORTFORMATTYPE *)pComponentParameterStructure;
578 OMX_U32 index = p->nPortIndex;
579 PortAudio *port = NULL;
580
581 ret = CheckTypeHeader(p, sizeof(*p));
582 if (ret != OMX_ErrorNone) {
583 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
584 return ret;
585 }
586
587 if (index < nr_ports)
588 port = static_cast<PortPcm *>(ports[index]);
589
590 if (!port) {
591 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
592 OMX_ErrorBadPortIndex);
593 return OMX_ErrorBadPortIndex;
594 }
595
596 if (port->IsEnabled()) {
597 OMX_STATETYPE state;
598
599 CBaseGetState((void *)GetComponentHandle(), &state);
600 if (state != OMX_StateLoaded &&
601 state != OMX_StateWaitForResources) {
602 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
603 OMX_ErrorIncorrectStateOperation);
604 return OMX_ErrorIncorrectStateOperation;
605 }
606 }
607
608 ret = port->SetPortAudioParam(p, false);
609 break;
610 }
611 case OMX_IndexParamAudioPcm: {
612 OMX_AUDIO_PARAM_PCMMODETYPE *p =
613 (OMX_AUDIO_PARAM_PCMMODETYPE *)pComponentParameterStructure;
614 OMX_U32 index = p->nPortIndex;
615 PortPcm *port = NULL;
616
Ho-Eun Ryuf796f982009-10-19 17:01:09 +0900617 if (strcmp(GetWorkingRole(), "audio_decoder.mp3") &&
618 strcmp(GetWorkingRole(), "audio_decoder.aac")) {
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900619 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
620 OMX_ErrorUnsupportedIndex);
621 return OMX_ErrorUnsupportedIndex;
622 }
623
624 ret = CheckTypeHeader(p, sizeof(*p));
625 if (ret != OMX_ErrorNone) {
626 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
627 return ret;
628 }
629
630 if (index < nr_ports)
631 port = static_cast<PortPcm *>(ports[index]);
632
633 if (!port) {
634 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
635 OMX_ErrorBadPortIndex);
636 return OMX_ErrorBadPortIndex;
637 }
638
639 if (port->IsEnabled()) {
640 OMX_STATETYPE state;
641
642 CBaseGetState((void *)GetComponentHandle(), &state);
643 if (state != OMX_StateLoaded &&
644 state != OMX_StateWaitForResources) {
645 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
646 OMX_ErrorIncorrectStateOperation);
647 return OMX_ErrorIncorrectStateOperation;
648 }
649 }
650
651 ret = port->SetPortPcmParam(p, false);
652 break;
653 }
654 case OMX_IndexParamAudioMp3: {
655 OMX_AUDIO_PARAM_MP3TYPE *p =
656 (OMX_AUDIO_PARAM_MP3TYPE *)pComponentParameterStructure;
657 OMX_U32 index = p->nPortIndex;
658 PortMp3 *port = NULL;
659
660 if (strcmp(GetWorkingRole(), "audio_decoder.mp3")) {
661 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
662 OMX_ErrorUnsupportedIndex);
663 return OMX_ErrorUnsupportedIndex;
664 }
665
666 ret = CheckTypeHeader(p, sizeof(*p));
667 if (ret != OMX_ErrorNone) {
668 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
669 return ret;
670 }
671
672 if (index < nr_ports)
673 port = static_cast<PortMp3 *>(ports[index]);
674
675 if (!port) {
676 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
677 OMX_ErrorBadPortIndex);
678 return OMX_ErrorBadPortIndex;
679 }
680
681 if (port->IsEnabled()) {
682 OMX_STATETYPE state;
683
684 CBaseGetState((void *)GetComponentHandle(), &state);
685 if (state != OMX_StateLoaded &&
686 state != OMX_StateWaitForResources) {
687 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
688 OMX_ErrorIncorrectStateOperation);
689 return OMX_ErrorIncorrectStateOperation;
690 }
691 }
692
693 ret = port->SetPortMp3Param(p, false);
694 break;
695 }
Ho-Eun Ryuf796f982009-10-19 17:01:09 +0900696 case OMX_IndexParamAudioAac: {
697 OMX_AUDIO_PARAM_AACPROFILETYPE *p =
698 (OMX_AUDIO_PARAM_AACPROFILETYPE *)pComponentParameterStructure;
699 OMX_U32 index = p->nPortIndex;
700 PortAac *port = NULL;
701
702 if (strcmp(GetWorkingRole(), "audio_decoder.aac")) {
703 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
704 OMX_ErrorUnsupportedIndex);
705 return OMX_ErrorUnsupportedIndex;
706 }
707
708 ret = CheckTypeHeader(p, sizeof(*p));
709 if (ret != OMX_ErrorNone) {
710 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
711 return ret;
712 }
713
714 if (index < nr_ports)
715 port = static_cast<PortAac *>(ports[index]);
716
717 if (!port) {
718 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
719 OMX_ErrorBadPortIndex);
720 return OMX_ErrorBadPortIndex;
721 }
722
723 if (port->IsEnabled()) {
724 OMX_STATETYPE state;
725
726 CBaseGetState((void *)GetComponentHandle(), &state);
727 if (state != OMX_StateLoaded &&
728 state != OMX_StateWaitForResources) {
729 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
730 OMX_ErrorIncorrectStateOperation);
731 return OMX_ErrorIncorrectStateOperation;
732 }
733 }
734
735 ret = port->SetPortAacParam(p, false);
736 break;
737 }
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900738 default:
739 ret = OMX_ErrorUnsupportedIndex;
740 } /* switch */
741
742 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
743 return ret;
744}
745
746/* Get/SetConfig */
747OMX_ERRORTYPE MrstSstComponent::ComponentGetConfig(
748 OMX_INDEXTYPE nIndex,
749 OMX_PTR pComponentConfigStructure)
750{
751 OMX_ERRORTYPE ret = OMX_ErrorUnsupportedIndex;
752 LOGV("%s(): enter\n", __func__);
753
754 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
755 return ret;
756}
757
758OMX_ERRORTYPE MrstSstComponent::ComponentSetConfig(
759 OMX_INDEXTYPE nParamIndex,
760 OMX_PTR pComponentConfigStructure)
761{
762 OMX_ERRORTYPE ret = OMX_ErrorUnsupportedIndex;
763 LOGV("%s(): enter\n", __func__);
764
765 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
766 return ret;
767}
768
769/* implement ComponentBase::Processor[*] */
770OMX_ERRORTYPE MrstSstComponent::ProcessorInit(void)
771{
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900772 MixAudio *mix;
773 MixAudioConfigParams *acp;
774 MixIOVec *mixio;
775 OMX_ERRORTYPE oret = OMX_ErrorNone;
776 MIX_RESULT mret;
777
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900778 LOGV("%s(): enter\n", __func__);
779
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900780 g_type_init();
781
782 /* set default parameters */
783 if (coding_type == OMX_AUDIO_CodingMP3)
784 acp = MIX_AUDIOCONFIGPARAMS(mix_acp_mp3_new());
785 else if (coding_type == OMX_AUDIO_CodingAAC)
786 acp = MIX_AUDIOCONFIGPARAMS(mix_acp_aac_new());
787 else {
788 LOGE("%s(),%d: exit, unkown role (ret == 0x%08x)\n",
789 __func__, __LINE__, OMX_ErrorInvalidState);
790 return OMX_ErrorInvalidState;
791 }
792
793 if (codec_mode == MIX_CODING_DECODE)
794 MIX_ACP_DECODEMODE(acp) = MIX_DECODE_DIRECTRENDER;
795 /*
796 else if (codec_mode == MIX_CODING_ENCODE)
797 ;
798 */
799
800 mret = mix_acp_set_streamname(acp, GetWorkingRole());
801 if (!MIX_SUCCEEDED(mret)) {
802 LOGE("%s(),%d: exit, mix_acp_set_streamname failed (ret == 0x%08x)",
803 __func__, __LINE__, mret);
804 mix_params_unref(MIX_PARAMS(acp));
805 return OMX_ErrorInvalidState;
806 }
807
808 mix = mix_audio_new();
809 mret = mix_audio_initialize(mix, codec_mode, NULL, NULL);
810 if (!(MIX_SUCCEEDED(mret))) {
811 LOGE("%s(),%d: exit, mix_audio_initialize failed (ret == 0x%08x)",
812 __func__, __LINE__, mret);
813 mix_params_unref(MIX_PARAMS(acp));
814 return OMX_ErrorInvalidState;
815 }
816
817 mixio = (MixIOVec *)malloc(sizeof(MixIOVec));
818 if (!mixio) {
819 LOGE("%s(),%d: exit, failed to allocate mbuffer (ret == 0x%08x)",
820 __func__, __LINE__, mret);
821 mix_params_unref(MIX_PARAMS(acp));
822 mix_audio_unref(mix);
823 return OMX_ErrorInvalidState;
824 }
825
826 this->mix = mix;
827 this->acp = acp;
828 this->mixio = mixio;
829
830 ibuffercount = 0;
831
832 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, oret);
833 return oret;
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900834}
835
836OMX_ERRORTYPE MrstSstComponent::ProcessorDeinit(void)
837{
838 OMX_ERRORTYPE ret = OMX_ErrorNone;
839 LOGV("%s(): enter\n", __func__);
840
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900841 mix_audio_stop_drop(mix);
842
843 mix_audio_deinitialize(mix);
844
845 mix_acp_unref(acp);
846 mix_audio_unref(mix);
847
848 free(mixio);
849
850 ibuffercount = 0;
851
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900852 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
853 return ret;
854}
855
856OMX_ERRORTYPE MrstSstComponent::ProcessorStart(void)
857{
858 OMX_ERRORTYPE ret = OMX_ErrorNone;
859 LOGV("%s(): enter\n", __func__);
860
861 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
862 return ret;
863}
864
865OMX_ERRORTYPE MrstSstComponent::ProcessorStop(void)
866{
867 OMX_ERRORTYPE ret = OMX_ErrorNone;
868 LOGV("%s(): enter\n", __func__);
869
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900870 mix_audio_stop_drop(mix);
871
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900872 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
873 return ret;
874}
875
876OMX_ERRORTYPE MrstSstComponent::ProcessorPause(void)
877{
878 OMX_ERRORTYPE ret = OMX_ErrorNone;
879 LOGV("%s(): enter\n", __func__);
880
881 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
882 return ret;
883}
884
885OMX_ERRORTYPE MrstSstComponent::ProcessorResume(void)
886{
887 OMX_ERRORTYPE ret = OMX_ErrorNone;
888 LOGV("%s(): enter\n", __func__);
889
890 LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
891 return ret;
892}
893
894/* implement ComponentBase::ProcessorProcess */
895void MrstSstComponent::ProcessorProcess(
896 OMX_BUFFERHEADERTYPE **buffers,
897 bool *retain,
898 OMX_U32 nr_buffers)
899{
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900900 OMX_U32 outfilledlen = 0;
901 OMX_S64 outtimestamp = 0;
Ho-Eun Ryu4375deb2009-10-27 09:49:25 +0900902
903 MixStreamState mstream_state = MIX_STREAM_NULL;
904 MixState mstate;
905 bool acp_changed = false;
906
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900907 MIX_RESULT mret;
908
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900909 LOGV("%s(): enter\n", __func__);
910
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900911 if (!buffers[INPORT_INDEX]->nFilledLen) {
Ho-Eun Ryu4375deb2009-10-27 09:49:25 +0900912 LOGE("%s(),%d: exit, input buffer's nFilledLen is zero (ret = void)\n",
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900913 __func__, __LINE__);
914 return;
915 }
916
917 mixio->data = buffers[INPORT_INDEX]->pBuffer +
918 buffers[INPORT_INDEX]->nOffset;
919 mixio->size = buffers[INPORT_INDEX]->nFilledLen;
920
Ho-Eun Ryu4375deb2009-10-27 09:49:25 +0900921 if (coding_type == OMX_AUDIO_CodingMP3)
922 mret = ChangeAcpWithConfigHeader(mixio->data, &acp_changed);
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900923 /*
Ho-Eun Ryu4375deb2009-10-27 09:49:25 +0900924 else if (coding_type == OMX_AUDIO_CodingAAC) {
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900925 ;
926 }
927 */
928 else {
929 LOGE("%s(),%d: exit, unkown mix acp\n", __func__, __LINE__);
930 return;
931 }
932
Ho-Eun Ryu4375deb2009-10-27 09:49:25 +0900933 if (mret) {
934 LOGE("%s(),%d: exit, ret == 0x%08x\n", __func__, __LINE__, mret);
935 return;
936 }
937
938 mix_audio_get_state(mix, &mstate);
939 if (mstate == MIX_STATE_CONFIGURED)
940 mix_audio_get_stream_state(mix, &mstream_state);
941
942 if (acp_changed) {
943 if ((mstream_state != MIX_STREAM_NULL) &&
944 (mstream_state != MIX_STREAM_STOPPED))
945 mix_audio_stop_drain(mix);
946
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900947 mret = mix_audio_configure(mix, acp, NULL);
948 if (!MIX_SUCCEEDED(mret)) {
949 LOGE("%s(),%d: exit, mix_audio_configure failed (ret == 0x%08x)",
950 __func__, __LINE__, mret);
951 return;
952 }
Ho-Eun Ryu4375deb2009-10-27 09:49:25 +0900953 }
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900954
Ho-Eun Ryu4375deb2009-10-27 09:49:25 +0900955 mix_audio_get_stream_state(mix, &mstream_state);
956 if (mstream_state != MIX_STREAM_PLAYING) {
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900957 mret = mix_audio_start(mix);
958 if (!MIX_SUCCEEDED(mret)) {
959 LOGE("%s(),%d: faild to mix_audio_start (ret == 0x%08x)",
960 __func__, __LINE__, mret);
961 return;
962 }
963 }
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +0900964
965 if (codec_mode == MIX_CODING_DECODE) {
966 mret = mix_audio_decode(mix, (const MixIOVec *)mixio, 1, NULL, NULL);
967 if (!MIX_SUCCEEDED(mret)) {
968 LOGV("_decode returns fail. Error code:0x%08x", mret);
969 return;
970 }
971 mix_audio_get_timestamp(mix, (OMX_U64 *)&outtimestamp);
972 }
973 /*
974 else {
975 ;
976 }
977 */
978
979 buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
980 buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +0900981
982 buffers[INPORT_INDEX]->nFilledLen = 0;
983
984 LOGV("%s(),%d: exit (ret = void)\n", __func__, __LINE__);
985}
986
987/* end of implement ComponentBase::Processor[*] */
988
989/* end of component methods & helpers */
990
991/*
Ho-Eun Ryu4375deb2009-10-27 09:49:25 +0900992 * parser wrappers
993 */
994static inline MIX_RESULT __Mp3ChangeAcpWithConfigHeader(
995 MixAudioConfigParams *acp, const unsigned char *buffer, bool *acp_changed)
996{
997 int version, layer, crc, bitrate, samplingrate, channel,
998 mode_extension;
999 int ret;
1000
1001 if (!acp_changed)
1002 return MIX_RESULT_FAIL;
1003
1004 ret = mp3_header_parse(buffer,
1005 &version, &layer,
1006 &crc, &bitrate,
1007 &samplingrate, &channel,
1008 &mode_extension);
1009 if (ret)
1010 return MIX_RESULT_FAIL;
1011
1012 if (version == MP3_HEADER_VERSION_1)
1013 version = 1;
1014 else if ((version == MP3_HEADER_VERSION_2) ||
1015 (version == MP3_HEADER_VERSION_25))
1016 version = 2;
1017 else
1018 return MIX_RESULT_FAIL;
1019
1020 if (layer == MP3_HEADER_LAYER_1)
1021 layer = 1;
1022 else if (layer == MP3_HEADER_LAYER_2)
1023 layer = 2;
1024 else if (layer == MP3_HEADER_LAYER_3)
1025 layer = 3;
1026 else
1027 return MIX_RESULT_FAIL;
1028
1029
1030 if (crc == MP3_HEADER_CRC_PROTECTED)
1031 crc = 1;
1032 else if (crc == MP3_HEADER_NOT_PROTECTED)
1033 crc = 0;
1034 else
1035 return MIX_RESULT_FAIL;
1036
1037 if ((channel == MP3_HEADER_STEREO) ||
1038 (channel == MP3_HEADER_JOINT_STEREO) ||
1039 (channel == MP3_HEADER_DUAL_CHANNEL))
1040 channel = 2;
1041 else if (channel == MP3_HEADER_SINGLE_CHANNEL)
1042 channel = 1;
1043 else
1044 return MIX_RESULT_FAIL;
1045
1046 if (MIX_ACP_NUM_CHANNELS(acp) != channel) {
1047 LOGV("%s(): channel : %d != %d\n", __func__, MIX_ACP_NUM_CHANNELS(acp),
1048 channel);
1049
1050 MIX_ACP_NUM_CHANNELS(acp) = channel;
1051 *acp_changed = true;
1052 }
1053
1054 if (MIX_ACP_BITRATE(acp) != bitrate) {
1055 LOGV("%s(): channel : %d != %d\n", __func__, MIX_ACP_BITRATE(acp),
1056 bitrate);
1057
1058 MIX_ACP_BITRATE(acp) = bitrate;
1059 *acp_changed = true;
1060 }
1061
1062 if (MIX_ACP_SAMPLE_FREQ(acp) != samplingrate) {
1063 LOGV("%s(): samplingrate : %d != %d\n", __func__,
1064 MIX_ACP_SAMPLE_FREQ(acp), samplingrate);
1065
1066 MIX_ACP_SAMPLE_FREQ(acp) = samplingrate;
1067 *acp_changed = true;
1068 }
1069
1070 if (MIX_ACP_MP3_CRC(acp) != crc) {
1071 LOGV("%s(): crc : %d != %d\n", __func__, MIX_ACP_MP3_CRC(acp), crc);
1072
1073 MIX_ACP_MP3_CRC(acp) = crc;
1074 *acp_changed = true;
1075 }
1076
1077 if (MIX_ACP_MP3_MPEG_FORMAT(acp) != version) {
1078 LOGV("%s(): version : %d != %d\n", __func__,
1079 MIX_ACP_MP3_MPEG_FORMAT(acp), version);
1080
1081 MIX_ACP_MP3_MPEG_FORMAT(acp) = version;
1082 *acp_changed = true;
1083 }
1084
1085 if (MIX_ACP_MP3_MPEG_LAYER(acp) != layer) {
1086 LOGV("%s(): version : %d != %d\n", __func__,
1087 MIX_ACP_MP3_MPEG_LAYER(acp), layer);
1088
1089 MIX_ACP_MP3_MPEG_LAYER(acp) = layer;
1090 *acp_changed = true;
1091 }
1092
1093 if (*acp_changed) {
1094 LOGV("%s(): mp3 configration parameter has been chagned\n", __func__);
1095 LOGV("%s(): format : %d\n", __func__, MIX_ACP_MP3_MPEG_FORMAT(acp));
1096 LOGV("%s(): layer : %d\n", __func__, MIX_ACP_MP3_MPEG_LAYER(acp));
1097 LOGV("%s(): crc : %d\n", __func__, MIX_ACP_MP3_CRC(acp));
1098 LOGV("%s(): sampling rate : %d\n", __func__,
1099 MIX_ACP_SAMPLE_FREQ(acp));
1100 LOGV("%s(): bitrate : %d\n", __func__, MIX_ACP_BITRATE(acp));
1101 LOGV("%s(): channel : %d\n", __func__, MIX_ACP_NUM_CHANNELS(acp));
1102 }
1103
1104 return MIX_RESULT_SUCCESS;
1105}
1106
1107MIX_RESULT MrstSstComponent::ChangeAcpWithConfigHeader(
1108 const unsigned char *buffer,
1109 bool *acp_changed)
1110{
1111 MIX_RESULT ret;
1112
1113 if (coding_type == OMX_AUDIO_CodingMP3)
1114 ret = __Mp3ChangeAcpWithConfigHeader(acp, buffer, acp_changed);
1115 /*
1116 else if (coding_type == OMX_AUDIO_CodingAAC)
1117 ret = __AacChangeAcpWithConfigHeader(acp, buffer, acp_changed);
1118 */
1119 else
1120 return -1;
1121
1122 if (!MIX_SUCCEEDED(ret))
1123 return ret;
1124
1125 mix_acp_set_op_align(acp, MIX_ACP_OUTPUT_ALIGN_LSB);
1126 mix_acp_set_bps(acp, MIX_ACP_BPS_16);
1127
1128 return MIX_RESULT_SUCCESS;
1129}
1130
1131/* end of parser wrappers */
1132
1133/*
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +09001134 * CModule Interface
1135 */
1136static const OMX_STRING g_roles[] =
1137{
1138 "audio_decoder.mp3",
Ho-Eun Ryue4e0bd82009-10-23 16:16:04 +09001139 //"audio_decoder.aac",
Ho-Eun Ryu2046ff92009-10-16 12:27:28 +09001140};
1141
1142static const OMX_STRING g_compname = "OMX.Intel.MrstSST";
1143
1144#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
1145
1146OMX_ERRORTYPE omx_component_module_instantiate(OMX_PTR *instance)
1147{
1148 ComponentBase *cbase;
1149
1150 cbase = new MrstSstComponent;
1151 if (!cbase) {
1152 *instance = NULL;
1153 return OMX_ErrorInsufficientResources;
1154 }
1155
1156 *instance = cbase;
1157 return OMX_ErrorNone;
1158}
1159
1160OMX_ERRORTYPE omx_component_module_query_name(OMX_STRING name, OMX_U32 len)
1161{
1162 if (!name)
1163 return OMX_ErrorBadParameter;
1164
1165 strncpy(name, g_compname, len);
1166 return OMX_ErrorNone;
1167}
1168
1169OMX_ERRORTYPE omx_component_module_query_roles(OMX_U32 *nr_roles,
1170 OMX_U8 **roles)
1171{
1172 return ComponentBase::QueryRolesHelper(ARRAY_SIZE(g_roles),
1173 (const OMX_U8 **)g_roles,
1174 nr_roles, roles);
1175}