Bug 1229361 - Support AMR audio in OpenMAX PDM. r?alfredo draft
authorJohn Lin <jolin@mozilla.com>
Fri, 19 Feb 2016 15:58:12 +0800
changeset 332079 137eafd50deca6ee899ae2b941a30b60bff8be2c
parent 332078 e28ddc59083934f9d89ede96d60c9cfb0180c7d6
child 332080 41cca4b8fd8ebfc826b56135ca079f1bb5414ab3
push id11156
push userbmo:jolin@mozilla.com
push dateFri, 19 Feb 2016 09:30:47 +0000
reviewersalfredo
bugs1229361
milestone47.0a1
Bug 1229361 - Support AMR audio in OpenMAX PDM. r?alfredo MozReview-Commit-ID: 4csBcHMxJem
dom/media/platforms/omx/OmxPlatformLayer.cpp
--- a/dom/media/platforms/omx/OmxPlatformLayer.cpp
+++ b/dom/media/platforms/omx/OmxPlatformLayer.cpp
@@ -127,28 +127,62 @@ public:
 
     LOG("Config OMX_IndexParamAudioMp3, channel %d, sample rate %d",
         mp3Param.nChannels, mp3Param.nSampleRate);
 
     return ConfigAudioOutputPort(aOmx, aInfo);
   }
 };
 
+enum OmxAmrSampleRate {
+  kNarrowBand = 8000,
+  kWideBand = 16000,
+};
+
+template <OmxAmrSampleRate R>
+class OmxAmrConfig : public OmxAudioConfig
+{
+public:
+  OMX_ERRORTYPE Apply(OmxPlatformLayer& aOmx, const AudioInfo& aInfo) override
+  {
+    OMX_ERRORTYPE err;
+
+    OMX_AUDIO_PARAM_AMRTYPE def;
+    InitOmxParameter(&def);
+    def.nPortIndex = aOmx.InputPortIndex();
+    err = aOmx.GetParameter(OMX_IndexParamAudioAmr, &def, sizeof(def));
+    RETURN_IF_ERR(err);
+
+    def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF;
+    err = aOmx.SetParameter(OMX_IndexParamAudioAmr, &def, sizeof(def));
+    RETURN_IF_ERR(err);
+
+    MOZ_ASSERT(aInfo.mChannels == 1);
+    MOZ_ASSERT(aInfo.mRate == R);
+
+    return ConfigAudioOutputPort(aOmx, aInfo);
+  }
+};
+
 template<>
 UniquePtr<OmxAudioConfig>
 ConfigForMime(const nsACString& aMimeType)
 {
   UniquePtr<OmxAudioConfig> conf;
 
   if (OmxPlatformLayer::SupportsMimeType(aMimeType)) {
     if (aMimeType.EqualsLiteral("audio/mp4a-latm")) {
       conf.reset(new OmxAacConfig());
     } else if (aMimeType.EqualsLiteral("audio/mp3") ||
                 aMimeType.EqualsLiteral("audio/mpeg")) {
       conf.reset(new OmxMp3Config());
+    } else if (aMimeType.EqualsLiteral("audio/3gpp")) {
+      conf.reset(new OmxAmrConfig<OmxAmrSampleRate::kNarrowBand>());
+    } else if (aMimeType.EqualsLiteral("audio/amr-wb")) {
+      conf.reset(new OmxAmrConfig<OmxAmrSampleRate::kWideBand>());
     }
   }
   return Move(conf);
 }
 
 // There should be a better way to calculate it.
 #define MIN_VIDEO_INPUT_BUFFER_SIZE 64 * 1024