Bug 1233410 - Support VP8 video in OpenMAX PDM. r?alfredo draft
authorJohn Lin <jolin@mozilla.com>
Tue, 23 Feb 2016 13:23:51 +0800
changeset 333265 75fe1118925557c9da9266644791862c5a44d982
parent 333264 5864badc34eb9b8ec09ea6055aea76e6a785cd8c
child 514684 9e170833e7242c83ea1ba68e2b11dd917d788b78
push id11311
push userbmo:jolin@mozilla.com
push dateTue, 23 Feb 2016 05:24:08 +0000
reviewersalfredo
bugs1233410
milestone47.0a1
Bug 1233410 - Support VP8 video in OpenMAX PDM. r?alfredo MozReview-Commit-ID: HVxynPLlXKJ
dom/media/platforms/omx/GonkOmxPlatformLayer.cpp
dom/media/platforms/omx/GonkOmxPlatformLayer.h
--- a/dom/media/platforms/omx/GonkOmxPlatformLayer.cpp
+++ b/dom/media/platforms/omx/GonkOmxPlatformLayer.cpp
@@ -30,16 +30,19 @@ extern mozilla::LogModule* GetPDMLog();
 #define LOG(arg, ...) MOZ_LOG(GetPDMLog(), mozilla::LogLevel::Debug, ("GonkOmxPlatformLayer(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
 
 #define CHECK_ERR(err)                    \
   if (err != OK)                       {  \
     LOG("error %d at %s", err, __func__); \
     return NS_ERROR_FAILURE;              \
   }                                       \
 
+// Android proprietary value.
+#define ANDROID_OMX_VIDEO_CodingVP8 (static_cast<OMX_VIDEO_CODINGTYPE>(9))
+
 using namespace android;
 
 namespace mozilla {
 
 // In Gonk, the software component name has prefix "OMX.google". It needs to
 // have a way to use hardware codec first.
 bool IsSoftwareCodec(const char* aComponentName)
 {
@@ -613,22 +616,26 @@ GonkOmxPlatformLayer::FindComponents(con
   if (!IsInEmulator() &&
       (aMimeType.EqualsLiteral("video/avc") ||
        aMimeType.EqualsLiteral("video/mp4") ||
        aMimeType.EqualsLiteral("video/mp4v-es") ||
        aMimeType.EqualsLiteral("video/3gp"))) {
     useHardwareCodecOnly = true;
   }
 
+  const char* mime = aMimeType.Data();
+  // Translate VP8 MIME type to Android format.
+  if (aMimeType.EqualsLiteral("video/webm; codecs=vp8")) {
+    mime = "video/x-vnd.on2.vp8";
+  }
+
   size_t start = 0;
   bool found = false;
   while (true) {
-    ssize_t index = codecs->findCodecByType(aMimeType.Data(),
-                                            false /* encoder */,
-                                            start);
+    ssize_t index = codecs->findCodecByType(mime, false /* encoder */, start);
     if (index < 0) {
       break;
     }
     start = index + 1;
 
     const char* name = codecs->getCodecName(index);
     if (IsSoftwareCodec(name) && useHardwareCodecOnly) {
       continue;
@@ -647,9 +654,18 @@ GonkOmxPlatformLayer::FindComponents(con
     if (codecs->codecHasQuirk(index, "requires-allocate-on-output-ports")) {
       comp->mQuirks.set(kRequiresAllocateBufferOnOutputPorts);
     }
   }
 
   return found;
 }
 
+OMX_VIDEO_CODINGTYPE
+GonkOmxPlatformLayer::CompressionFormat()
+{
+  MOZ_ASSERT(mInfo);
+
+  return mInfo->mMimeType.EqualsLiteral("video/webm; codecs=vp8") ?
+    ANDROID_OMX_VIDEO_CodingVP8 : OmxPlatformLayer::CompressionFormat();
+}
+
 } // mozilla
--- a/dom/media/platforms/omx/GonkOmxPlatformLayer.h
+++ b/dom/media/platforms/omx/GonkOmxPlatformLayer.h
@@ -151,16 +151,21 @@ public:
                             OMX_U32 aParam1,
                             OMX_PTR aCmdData) override;
 
   nsresult Shutdown() override;
 
   static bool FindComponents(const nsACString& aMimeType,
                              nsTArray<ComponentInfo>* aComponents = nullptr);
 
+  // Android/QCOM decoder uses its own OMX_VIDEO_CodingVP8 definition in
+  // frameworks/native/media/include/openmax/OMX_Video.h, not the one defined
+  // in OpenMAX v1.1.2 OMX_VideoExt.h
+  OMX_VIDEO_CODINGTYPE CompressionFormat() override;
+
 protected:
   friend GonkBufferData;
 
   layers::ImageContainer* GetImageContainer();
 
   const TrackInfo* GetTrackInfo();
 
   TaskQueue* GetTaskQueue()