Bug 1295886: Plug in Android FLAC decoder. draft
authorJames Cheng <jacheng@mozilla.com>
Fri, 02 Sep 2016 14:59:47 +0800
changeset 409089 8de28b190b97b8d1c2ce3cfc0efd2166cba6ebff
parent 409041 d5f20820c80514476f596090292a5d77c4b41e3b
child 530266 ea51204211e03f73a1b93c8fd5e99f41cabb564e
push id28385
push userbmo:jacheng@mozilla.com
push dateFri, 02 Sep 2016 07:07:47 +0000
bugs1295886
milestone51.0a1
Bug 1295886: Plug in Android FLAC decoder. MozReview-Commit-ID: B5pOZIEGssO
dom/media/flac/FlacDecoder.cpp
dom/media/platforms/android/AndroidDecoderModule.cpp
--- a/dom/media/flac/FlacDecoder.cpp
+++ b/dom/media/flac/FlacDecoder.cpp
@@ -27,22 +27,17 @@ FlacDecoder::CreateStateMachine()
   RefPtr<MediaDecoderReader> reader =
       new MediaFormatReader(this, new FlacDemuxer(GetResource()));
   return new MediaDecoderStateMachine(this, reader);
 }
 
 /* static */ bool
 FlacDecoder::IsEnabled()
 {
-#ifdef MOZ_FFVPX
   return MediaPrefs::FlacEnabled();
-#else
-  // Until bug 1295886 is fixed.
-  return false;
-#endif
 }
 
 /* static */ bool
 FlacDecoder::CanHandleMediaType(const nsACString& aType,
                                 const nsAString& aCodecs)
 {
   return IsEnabled() &&
     (aType.EqualsASCII("audio/flac") || aType.EqualsASCII("audio/x-flac") ||
--- a/dom/media/platforms/android/AndroidDecoderModule.cpp
+++ b/dom/media/platforms/android/AndroidDecoderModule.cpp
@@ -31,16 +31,21 @@ using media::TimeUnit;
 
 namespace mozilla {
 
 mozilla::LazyLogModule sAndroidDecoderModuleLog("AndroidDecoderModule");
 
 static const char*
 TranslateMimeType(const nsACString& aMimeType)
 {
+  // By adding the log, android native app passed audio/raw to get the decoder.
+  if (aMimeType.EqualsLiteral("audio/flac")) {
+    return "audio/raw";
+  }
+
   if (VPXDecoder::IsVPX(aMimeType, VPXDecoder::VP8)) {
     return "video/x-vnd.on2.vp8";
   } else if (VPXDecoder::IsVPX(aMimeType, VPXDecoder::VP9)) {
     return "video/x-vnd.on2.vp9";
   }
   return PromiseFlatCString(aMimeType).get();
 }
 
@@ -61,17 +66,18 @@ AndroidDecoderModule::SupportsMimeType(c
                                        DecoderDoctorDiagnostics* aDiagnostics) const
 {
   if (!AndroidBridge::Bridge() ||
       AndroidBridge::Bridge()->GetAPIVersion() < 16) {
     return false;
   }
 
   if (aMimeType.EqualsLiteral("video/mp4") ||
-      aMimeType.EqualsLiteral("video/avc")) {
+      aMimeType.EqualsLiteral("video/avc") ||
+      aMimeType.EqualsLiteral("audio/flac")) {
     return true;
   }
 
   // When checking "audio/x-wav", CreateDecoder can cause a JNI ERROR by
   // Accessing a stale local reference leading to a SIGSEGV crash.
   // To avoid this we check for wav types here.
   if (aMimeType.EqualsLiteral("audio/x-wav") ||
       aMimeType.EqualsLiteral("audio/wave; codecs=1") ||
@@ -116,25 +122,24 @@ AndroidDecoderModule::CreateVideoDecoder
 
   return decoder.forget();
 }
 
 already_AddRefed<MediaDataDecoder>
 AndroidDecoderModule::CreateAudioDecoder(const CreateDecoderParams& aParams)
 {
   const AudioInfo& config = aParams.AudioConfig();
-  MOZ_ASSERT(config.mBitDepth == 16, "We only handle 16-bit audio!");
 
   MediaFormat::LocalRef format;
 
   LOG("CreateAudioFormat with mimeType=%s, mRate=%d, channels=%d",
       config.mMimeType.Data(), config.mRate, config.mChannels);
 
   NS_ENSURE_SUCCESS(MediaFormat::CreateAudioFormat(
-      config.mMimeType,
+      TranslateMimeType(config.mMimeType),
       config.mRate,
       config.mChannels,
       &format), nullptr);
 
   RefPtr<MediaDataDecoder> decoder = MediaPrefs::PDMAndroidRemoteCodecEnabled() ?
       RemoteDataDecoder::CreateAudioDecoder(config, format, aParams.mCallback) :
       MediaCodecDataDecoder::CreateAudioDecoder(config, format, aParams.mCallback);