@@ -687,6 +687,8 @@ void ACodec::setComponentRole(
687687 " audio_decoder.amrwb" , " audio_encoder.amrwb" },
688688 { MEDIA_MIMETYPE_AUDIO_AAC,
689689 " audio_decoder.aac" , " audio_encoder.aac" },
690+ { MEDIA_MIMETYPE_AUDIO_VORBIS,
691+ " audio_decoder.vorbis" , " audio_encoder.vorbis" },
690692 { MEDIA_MIMETYPE_VIDEO_AVC,
691693 " video_decoder.avc" , " video_encoder.avc" },
692694 { MEDIA_MIMETYPE_VIDEO_MPEG4,
@@ -750,9 +752,19 @@ void ACodec::configureCodec(
750752 CHECK (msg->findInt32 (" sample-rate" , &sampleRate));
751753
752754 CHECK_EQ (setupAACDecoder (numChannels, sampleRate), (status_t )OK);
753- } else if (!strcasecmp (mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {
754- } else {
755- TRESPASS ();
755+ } else if (!strcasecmp (mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) {
756+ CHECK_EQ (setupAMRDecoder (false /* isWAMR */ ), (status_t )OK);
757+ } else if (!strcasecmp (mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) {
758+ CHECK_EQ (setupAMRDecoder (true /* isWAMR */ ), (status_t )OK);
759+ } else if (!strcasecmp (mime, MEDIA_MIMETYPE_AUDIO_G711_ALAW)
760+ || !strcasecmp (mime, MEDIA_MIMETYPE_AUDIO_G711_MLAW)) {
761+ // These are PCM-like formats with a fixed sample rate but
762+ // a variable number of channels.
763+
764+ int32_t numChannels;
765+ CHECK (msg->findInt32 (" channel-count" , &numChannels));
766+
767+ CHECK_EQ (setupG711Decoder (numChannels), (status_t )OK);
756768 }
757769
758770 int32_t maxInputSize;
@@ -824,6 +836,84 @@ status_t ACodec::setupAACDecoder(int32_t numChannels, int32_t sampleRate) {
824836 return err;
825837}
826838
839+ status_t ACodec::setupAMRDecoder (bool isWAMR) {
840+ OMX_AUDIO_PARAM_AMRTYPE def;
841+ InitOMXParams (&def);
842+ def.nPortIndex = kPortIndexInput ;
843+
844+ status_t err =
845+ mOMX ->getParameter (mNode , OMX_IndexParamAudioAmr, &def, sizeof (def));
846+
847+ if (err != OK) {
848+ return err;
849+ }
850+
851+ def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF;
852+
853+ def.eAMRBandMode =
854+ isWAMR ? OMX_AUDIO_AMRBandModeWB0 : OMX_AUDIO_AMRBandModeNB0;
855+
856+ return mOMX ->setParameter (mNode , OMX_IndexParamAudioAmr, &def, sizeof (def));
857+ }
858+
859+ status_t ACodec::setupG711Decoder (int32_t numChannels) {
860+ return setupRawAudioFormat (
861+ kPortIndexInput , 8000 /* sampleRate */ , numChannels);
862+ }
863+
864+ status_t ACodec::setupRawAudioFormat (
865+ OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) {
866+ OMX_PARAM_PORTDEFINITIONTYPE def;
867+ InitOMXParams (&def);
868+ def.nPortIndex = portIndex;
869+
870+ status_t err = mOMX ->getParameter (
871+ mNode , OMX_IndexParamPortDefinition, &def, sizeof (def));
872+
873+ if (err != OK) {
874+ return err;
875+ }
876+
877+ def.format .audio .eEncoding = OMX_AUDIO_CodingPCM;
878+
879+ err = mOMX ->setParameter (
880+ mNode , OMX_IndexParamPortDefinition, &def, sizeof (def));
881+
882+ if (err != OK) {
883+ return err;
884+ }
885+
886+ OMX_AUDIO_PARAM_PCMMODETYPE pcmParams;
887+ InitOMXParams (&pcmParams);
888+ pcmParams.nPortIndex = portIndex;
889+
890+ err = mOMX ->getParameter (
891+ mNode , OMX_IndexParamAudioPcm, &pcmParams, sizeof (pcmParams));
892+
893+ if (err != OK) {
894+ return err;
895+ }
896+
897+ pcmParams.nChannels = numChannels;
898+ pcmParams.eNumData = OMX_NumericalDataSigned;
899+ pcmParams.bInterleaved = OMX_TRUE;
900+ pcmParams.nBitPerSample = 16 ;
901+ pcmParams.nSamplingRate = sampleRate;
902+ pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear;
903+
904+ if (numChannels == 1 ) {
905+ pcmParams.eChannelMapping [0 ] = OMX_AUDIO_ChannelCF;
906+ } else {
907+ CHECK_EQ (numChannels, 2 );
908+
909+ pcmParams.eChannelMapping [0 ] = OMX_AUDIO_ChannelLF;
910+ pcmParams.eChannelMapping [1 ] = OMX_AUDIO_ChannelRF;
911+ }
912+
913+ return mOMX ->setParameter (
914+ mNode , OMX_IndexParamAudioPcm, &pcmParams, sizeof (pcmParams));
915+ }
916+
827917status_t ACodec::setVideoPortFormatType (
828918 OMX_U32 portIndex,
829919 OMX_VIDEO_CODINGTYPE compressionFormat,
0 commit comments