summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Andrews <athenian200@outlook.com>2022-07-06 09:04:40 -0500
committerJeremy Andrews <athenian200@outlook.com>2022-07-06 12:52:23 -0500
commit1fadb7fa2f6e5e8e5b5905dedf7597dba19dee3b (patch)
tree991afc5a8594b9f84cba2c80b06944853326eedb
parentde383de310088eff07d91c567cddd5b7c3d6c571 (diff)
downloaduxp-1fadb7fa2f6e5e8e5b5905dedf7597dba19dee3b.tar.gz
Issue #1956 - Use preprocessor to work around strange template behavior with 32-bit MSVC2022.
-rw-r--r--dom/media/webrtc/MediaTrackConstraints.cpp50
-rw-r--r--dom/media/webrtc/MediaTrackConstraints.h10
2 files changed, 60 insertions, 0 deletions
diff --git a/dom/media/webrtc/MediaTrackConstraints.cpp b/dom/media/webrtc/MediaTrackConstraints.cpp
index 08bb513955..63dab1492f 100644
--- a/dom/media/webrtc/MediaTrackConstraints.cpp
+++ b/dom/media/webrtc/MediaTrackConstraints.cpp
@@ -34,6 +34,56 @@ NormalizedConstraintSet::Range<ValueType>::SetFrom(const ConstrainRange& aOther)
}
}
+// FIXME(Issue #1956): 32-bit MSVC 2022 does not like these functions being
+// defined here. The 64-bit version accepts my workaround for the 32-bit
+// version as valid code, but every other compiler dislikes them being defined
+// elsewhere.
+
+#if _MSC_VER <= 1900 || !defined(_MSC_VER)
+// The Range code works surprisingly well for bool, except when averaging ideals.
+template<>
+bool
+NormalizedConstraintSet::Range<bool>::Merge(const Range& aOther) {
+ if (!Intersects(aOther)) {
+ return false;
+ }
+ Intersect(aOther);
+
+ // To avoid "unsafe use of type 'bool'", we keep counter in mMergeDenominator
+ uint32_t counter = mMergeDenominator >> 16;
+ uint32_t denominator = mMergeDenominator & 0xffff;
+
+ if (aOther.mIdeal.isSome()) {
+ if (mIdeal.isNothing()) {
+ mIdeal.emplace(aOther.Get(false));
+ counter = aOther.Get(false);
+ denominator = 1;
+ } else {
+ if (!denominator) {
+ counter = Get(false);
+ denominator = 1;
+ }
+ counter += aOther.Get(false);
+ denominator++;
+ }
+ }
+ mMergeDenominator = ((counter & 0xffff) << 16) + (denominator & 0xffff);
+ return true;
+}
+
+template<>
+void
+NormalizedConstraintSet::Range<bool>::FinalizeMerge()
+{
+ if (mMergeDenominator) {
+ uint32_t counter = mMergeDenominator >> 16;
+ uint32_t denominator = mMergeDenominator & 0xffff;
+
+ *mIdeal = !!(counter / denominator);
+ mMergeDenominator = 0;
+ }
+}
+#endif
NormalizedConstraintSet::LongRange::LongRange(
LongPtrType aMemberPtr,
diff --git a/dom/media/webrtc/MediaTrackConstraints.h b/dom/media/webrtc/MediaTrackConstraints.h
index 693c905d5f..0746fc245f 100644
--- a/dom/media/webrtc/MediaTrackConstraints.h
+++ b/dom/media/webrtc/MediaTrackConstraints.h
@@ -261,6 +261,11 @@ public:
aOther.mMozAutoGainControl, advanced, aList) {}
};
+// FIXME (Issue #1956): 32-bit MSVC 2022 needed this code to be moved here,
+// and the 64-bit version seems fine with it as well. But other compilers
+// are not.
+
+#if _MSC_VER > 1900
// The Range code works surprisingly well for bool, except when averaging ideals.
template<>
bool
@@ -304,7 +309,12 @@ NormalizedConstraintSet::Range<bool>::FinalizeMerge()
mMergeDenominator = 0;
}
}
+#endif
+#if _MSC_VER <= 1900 || !defined(_MSC_VER)
+template<> bool NormalizedConstraintSet::Range<bool>::Merge(const Range& aOther);
+template<> void NormalizedConstraintSet::Range<bool>::FinalizeMerge();
+#endif
// Used instead of MediaTrackConstraints in lower-level code.
struct NormalizedConstraints : public NormalizedConstraintSet