diff options
author | Andreas Huber <andih@google.com> | 2012-04-24 12:48:18 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-04-24 14:45:25 -0700 |
commit | c1d8115e8a0bdaeb2b723d395b9a85a02c90c933 (patch) | |
tree | 09339f44279672f1bfa79cbb9c667830f17ae9a4 /media/libstagefright/OMXCodec.cpp | |
parent | 1dc28b794587be22c90a97070d928f94586db638 (diff) | |
download | frameworks_av-c1d8115e8a0bdaeb2b723d395b9a85a02c90c933.zip frameworks_av-c1d8115e8a0bdaeb2b723d395b9a85a02c90c933.tar.gz frameworks_av-c1d8115e8a0bdaeb2b723d395b9a85a02c90c933.tar.bz2 |
Make sure OMXCodec and ACodec both accept more than 2 channels of audio
and fill in the OMX channel mask properly.
Change-Id: I915950a0b252142b9eb3277cf7c6e0d9f5875305
Diffstat (limited to 'media/libstagefright/OMXCodec.cpp')
-rwxr-xr-x | media/libstagefright/OMXCodec.cpp | 73 |
1 files changed, 65 insertions, 8 deletions
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 1c4b47e..1d6f927 100755 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -3310,14 +3310,8 @@ void OMXCodec::setRawAudioFormat( pcmParams.nSamplingRate = sampleRate; pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear; - if (numChannels == 1) { - pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelCF; - } else { - CHECK_EQ(numChannels, 2); - - pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelLF; - pcmParams.eChannelMapping[1] = OMX_AUDIO_ChannelRF; - } + CHECK_EQ(getOMXChannelMapping( + numChannels, pcmParams.eChannelMapping), (status_t)OK); err = mOMX->setParameter( mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); @@ -4602,4 +4596,67 @@ void OMXCodec::restorePatchedDataPointer(BufferInfo *info) { header->pBuffer = (OMX_U8 *)info->mData; } +// These are supposed be equivalent to the logic in +// "audio_channel_out_mask_from_count". +status_t getOMXChannelMapping(size_t numChannels, OMX_AUDIO_CHANNELTYPE map[]) { + switch (numChannels) { + case 1: + map[0] = OMX_AUDIO_ChannelCF; + break; + case 2: + map[0] = OMX_AUDIO_ChannelLF; + map[1] = OMX_AUDIO_ChannelRF; + break; + case 3: + map[0] = OMX_AUDIO_ChannelLF; + map[1] = OMX_AUDIO_ChannelRF; + map[2] = OMX_AUDIO_ChannelCF; + break; + case 4: + map[0] = OMX_AUDIO_ChannelLF; + map[1] = OMX_AUDIO_ChannelRF; + map[2] = OMX_AUDIO_ChannelLR; + map[3] = OMX_AUDIO_ChannelRR; + break; + case 5: + map[0] = OMX_AUDIO_ChannelLF; + map[1] = OMX_AUDIO_ChannelRF; + map[2] = OMX_AUDIO_ChannelCF; + map[3] = OMX_AUDIO_ChannelLR; + map[4] = OMX_AUDIO_ChannelRR; + break; + case 6: + map[0] = OMX_AUDIO_ChannelLF; + map[1] = OMX_AUDIO_ChannelRF; + map[2] = OMX_AUDIO_ChannelCF; + map[3] = OMX_AUDIO_ChannelLFE; + map[4] = OMX_AUDIO_ChannelLR; + map[5] = OMX_AUDIO_ChannelRR; + break; + case 7: + map[0] = OMX_AUDIO_ChannelLF; + map[1] = OMX_AUDIO_ChannelRF; + map[2] = OMX_AUDIO_ChannelCF; + map[3] = OMX_AUDIO_ChannelLFE; + map[4] = OMX_AUDIO_ChannelLR; + map[5] = OMX_AUDIO_ChannelRR; + map[6] = OMX_AUDIO_ChannelCS; + break; + case 8: + map[0] = OMX_AUDIO_ChannelLF; + map[1] = OMX_AUDIO_ChannelRF; + map[2] = OMX_AUDIO_ChannelCF; + map[3] = OMX_AUDIO_ChannelLFE; + map[4] = OMX_AUDIO_ChannelLR; + map[5] = OMX_AUDIO_ChannelRR; + map[6] = OMX_AUDIO_ChannelLS; + map[7] = OMX_AUDIO_ChannelRS; + break; + default: + return -EINVAL; + } + + return OK; +} + } // namespace android |