bug 1422239 - relax the resolution limitation of WMF H264 decoder; r?jya draft
authorKaku Kuo <kaku@mozilla.com>
Mon, 08 Jan 2018 16:37:40 +0800
changeset 718415 4ede0881f5b769f7d2a51f09b0e91f415c1132c8
parent 718412 36b1005c444860fc648100d79ec0e7b646474f01
child 745477 fc9f28d622b6733f84a774152c92e0d9ca1eaa0e
push id94920
push userbmo:kaku@mozilla.com
push dateWed, 10 Jan 2018 09:45:23 +0000
reviewersjya
bugs1422239
milestone59.0a1
bug 1422239 - relax the resolution limitation of WMF H264 decoder; r?jya https://msdn.microsoft.com/en-us/library/windows/desktop/dd797815(v=vs.85).aspx Relax the resolution limitation from "width <= 4096 and height <= 2304" to "any width and height combination as long as the total pixel count is under 4096x2304". MozReview-Commit-ID: 5wHiJfLaJkp
dom/media/platforms/wmf/WMFVideoMFTManager.cpp
--- a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
+++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
@@ -553,40 +553,39 @@ WMFVideoMFTManager::InitializeDXVA()
 
   return mDXVA2Manager != nullptr;
 }
 
 MediaResult
 WMFVideoMFTManager::ValidateVideoInfo()
 {
   if (mStreamType != H264 ||
-      gfxPrefs::PDMWMFAllowUnsupportedResolutions()) {
+    gfxPrefs::PDMWMFAllowUnsupportedResolutions()) {
     return NS_OK;
   }
 
   // The WMF H.264 decoder is documented to have a minimum resolution 48x48 pixels
   // for resolution, but we won't enable hw decoding for the resolution < 132 pixels.
   // It's assumed the software decoder doesn't have this limitation, but it still
   // might have maximum resolution limitation.
   // https://msdn.microsoft.com/en-us/library/windows/desktop/dd797815(v=vs.85).aspx
   const bool Is4KCapable = IsWin8OrLater() || IsWin7H264Decoder4KCapable();
-  static const int32_t MIN_H264_FRAME_DIMENSION = 48;
-  static const int32_t MAX_H264_FRAME_WIDTH = Is4KCapable ? 4096 : 1920;
-  static const int32_t MAX_H264_FRAME_HEIGHT = Is4KCapable ? 2304 : 1088;
+  static const int32_t MAX_H264_PIXEL_COUNT =
+    Is4KCapable ? 4096 * 2304 : 1920 * 1088;
+  const CheckedInt32 pixelCount =
+    CheckedInt32(mVideoInfo.mImage.width) * mVideoInfo.mImage.height;
 
-  if (mVideoInfo.mImage.width > MAX_H264_FRAME_WIDTH  ||
-      mVideoInfo.mImage.height > MAX_H264_FRAME_HEIGHT) {
+  if (!pixelCount.isValid() || pixelCount.value() > MAX_H264_PIXEL_COUNT) {
     mIsValid = false;
     return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
                        RESULT_DETAIL("Can't decode H.264 stream because its "
                                      "resolution is out of the maximum limitation"));
   }
 
   return NS_OK;
-
 }
 
 already_AddRefed<MFTDecoder>
 WMFVideoMFTManager::LoadAMDVP9Decoder()
 {
   MOZ_ASSERT(mStreamType == VP9);
 
   RefPtr<MFTDecoder> decoder = new MFTDecoder();