diff options
author | Moonchild <moonchild@palemoon.org> | 2022-04-27 16:08:36 +0000 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2022-04-27 16:08:36 +0000 |
commit | bf110158b926f99fa36c180150d242453c8b0f95 (patch) | |
tree | 882e05a28526be3d2c1ff90ed65074cc8037d19f /dom/media | |
parent | 983a87a9d7d01c8a8750fe070ebc790f12614a63 (diff) | |
download | uxp-bf110158b926f99fa36c180150d242453c8b0f95.tar.gz |
Issue #1820 - Part 8: Check bit depth in PDM::Supports.
Diffstat (limited to 'dom/media')
-rw-r--r-- | dom/media/platforms/PlatformDecoderModule.h | 17 | ||||
-rw-r--r-- | dom/media/platforms/ffmpeg/FFmpegDecoderModule.h | 15 | ||||
-rw-r--r-- | dom/media/platforms/wmf/WMFDecoderModule.cpp | 10 |
3 files changed, 38 insertions, 4 deletions
diff --git a/dom/media/platforms/PlatformDecoderModule.h b/dom/media/platforms/PlatformDecoderModule.h index 62855335f3..1584706b22 100644 --- a/dom/media/platforms/PlatformDecoderModule.h +++ b/dom/media/platforms/PlatformDecoderModule.h @@ -129,9 +129,11 @@ public: virtual bool Supports(const TrackInfo& aTrackInfo, DecoderDoctorDiagnostics* aDiagnostics) const { - // By default, fall back to SupportsMimeType with just the MIME string. - // (So PDMs do not need to override this method -- yet.) - return SupportsMimeType(aTrackInfo.mMimeType, aDiagnostics); + if (!SupportsMimeType(aTrackInfo.mMimeType, aDiagnostics)) { + return false; + } + const auto videoInfo = aTrackInfo.GetAsVideoInfo(); + return !videoInfo || SupportsBitDepth(videoInfo->mBitDepth, aDiagnostics); } enum class ConversionRequired : uint8_t { @@ -153,6 +155,15 @@ protected: friend class PDMFactory; friend class dom::RemoteDecoderModule; + // Indicates if the PlatformDecoderModule supports decoding of aBitDepth. + // Should override this method when the platform can support bitDepth != 8. + virtual bool SupportsBitDepth(const uint8_t aBitDepth, + DecoderDoctorDiagnostics* aDiagnostics) const + { + return aBitDepth == 8; + } + + // Creates a Video decoder. The layers backend is passed in so that // decoders can determine whether hardware accelerated decoding can be used. // Asynchronous decoding of video should be done in runnables dispatched diff --git a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h index 969ac7e0be..d220fcf91c 100644 --- a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h +++ b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h @@ -77,6 +77,21 @@ public: } } +protected: + bool SupportsBitDepth(const uint8_t aBitDepth, + DecoderDoctorDiagnostics* aDiagnostics) const override + { + // We don't support bitDepth > 8 when compositor backend is D3D11. + // But we don't have KnowsCompositor or any object + // that we can ask for the layersbackend type. + // We should remove this restriction until + // we solve the D3D11 compositor backend issue. +#if defined(XP_LINUX) || defined(XP_MACOSX) + return true; +#endif + return aBitDepth == 8; + } + private: FFmpegLibWrapper* mLib; }; diff --git a/dom/media/platforms/wmf/WMFDecoderModule.cpp b/dom/media/platforms/wmf/WMFDecoderModule.cpp index 06bf49fa6a..423d58c967 100644 --- a/dom/media/platforms/wmf/WMFDecoderModule.cpp +++ b/dom/media/platforms/wmf/WMFDecoderModule.cpp @@ -205,6 +205,14 @@ bool WMFDecoderModule::Supports(const TrackInfo& aTrackInfo, DecoderDoctorDiagnostics* aDiagnostics) const { + // Check bit depth of video. + // XXXMC: This is here in case we want to start accepting HDR video. Do we? + // This currently defaults to a fail if video bitdepth != 8 + const auto videoInfo = aTrackInfo.GetAsVideoInfo(); + if (videoInfo && !SupportsBitDepth(videoInfo->mBitDepth, aDiagnostics)) { + return false; + } + if ((aTrackInfo.mMimeType.EqualsLiteral("audio/mp4a-latm") || aTrackInfo.mMimeType.EqualsLiteral("audio/mp4")) && WMFDecoderModule::HasAAC()) { @@ -221,7 +229,7 @@ WMFDecoderModule::Supports(const TrackInfo& aTrackInfo, return false; } } else { - // Windows <=7 supports at most 1920x1088. + // Windows 7 supports at most 1920x1088. if (videoInfo->mImage.width > 1920 || videoInfo->mImage.height > 1088) { return false; } |