summaryrefslogtreecommitdiff
path: root/dom/media
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2022-04-27 16:08:36 +0000
committerMoonchild <moonchild@palemoon.org>2022-04-27 16:08:36 +0000
commitbf110158b926f99fa36c180150d242453c8b0f95 (patch)
tree882e05a28526be3d2c1ff90ed65074cc8037d19f /dom/media
parent983a87a9d7d01c8a8750fe070ebc790f12614a63 (diff)
downloaduxp-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.h17
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegDecoderModule.h15
-rw-r--r--dom/media/platforms/wmf/WMFDecoderModule.cpp10
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;
}