Bug 1162412 - Part 3: Treat plain values as exact in advanced. r=jesup, a=lmandel
This commit is contained in:
@@ -84,28 +84,27 @@ MediaEngineCameraVideoSource::FitnessDistance(ValueType n,
|
|||||||
|
|
||||||
// Binding code doesn't templatize well...
|
// Binding code doesn't templatize well...
|
||||||
|
|
||||||
template<>
|
/*static*/ uint32_t
|
||||||
/* static */ uint32_t
|
|
||||||
MediaEngineCameraVideoSource::FitnessDistance(int32_t n,
|
MediaEngineCameraVideoSource::FitnessDistance(int32_t n,
|
||||||
const OwningLongOrConstrainLongRange& aConstraint)
|
const OwningLongOrConstrainLongRange& aConstraint, bool aAdvanced)
|
||||||
{
|
{
|
||||||
if (aConstraint.IsLong()) {
|
if (aConstraint.IsLong()) {
|
||||||
ConstrainLongRange range;
|
ConstrainLongRange range;
|
||||||
range.mIdeal.Construct(aConstraint.GetAsLong());
|
(aAdvanced ? range.mExact : range.mIdeal).Construct(aConstraint.GetAsLong());
|
||||||
return FitnessDistance(n, range);
|
return FitnessDistance(n, range);
|
||||||
} else {
|
} else {
|
||||||
return FitnessDistance(n, aConstraint.GetAsConstrainLongRange());
|
return FitnessDistance(n, aConstraint.GetAsConstrainLongRange());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
/*static*/ uint32_t
|
||||||
/* static */ uint32_t
|
|
||||||
MediaEngineCameraVideoSource::FitnessDistance(double n,
|
MediaEngineCameraVideoSource::FitnessDistance(double n,
|
||||||
const OwningDoubleOrConstrainDoubleRange& aConstraint)
|
const OwningDoubleOrConstrainDoubleRange& aConstraint,
|
||||||
|
bool aAdvanced)
|
||||||
{
|
{
|
||||||
if (aConstraint.IsDouble()) {
|
if (aConstraint.IsDouble()) {
|
||||||
ConstrainDoubleRange range;
|
ConstrainDoubleRange range;
|
||||||
range.mIdeal.Construct(aConstraint.GetAsDouble());
|
(aAdvanced ? range.mExact : range.mIdeal).Construct(aConstraint.GetAsDouble());
|
||||||
return FitnessDistance(n, range);
|
return FitnessDistance(n, range);
|
||||||
} else {
|
} else {
|
||||||
return FitnessDistance(n, aConstraint.GetAsConstrainDoubleRange());
|
return FitnessDistance(n, aConstraint.GetAsConstrainDoubleRange());
|
||||||
@@ -114,18 +113,22 @@ MediaEngineCameraVideoSource::FitnessDistance(double n,
|
|||||||
|
|
||||||
/*static*/ uint32_t
|
/*static*/ uint32_t
|
||||||
MediaEngineCameraVideoSource::GetFitnessDistance(const webrtc::CaptureCapability& aCandidate,
|
MediaEngineCameraVideoSource::GetFitnessDistance(const webrtc::CaptureCapability& aCandidate,
|
||||||
const MediaTrackConstraintSet &aConstraints)
|
const MediaTrackConstraintSet &aConstraints,
|
||||||
|
bool aAdvanced)
|
||||||
{
|
{
|
||||||
// Treat width|height|frameRate == 0 on capability as "can do any".
|
// Treat width|height|frameRate == 0 on capability as "can do any".
|
||||||
// This allows for orthogonal capabilities that are not in discrete steps.
|
// This allows for orthogonal capabilities that are not in discrete steps.
|
||||||
|
|
||||||
uint64_t distance =
|
uint64_t distance =
|
||||||
uint64_t(aCandidate.width? FitnessDistance(int32_t(aCandidate.width),
|
uint64_t(aCandidate.width? FitnessDistance(int32_t(aCandidate.width),
|
||||||
aConstraints.mWidth) : 0) +
|
aConstraints.mWidth,
|
||||||
|
aAdvanced) : 0) +
|
||||||
uint64_t(aCandidate.height? FitnessDistance(int32_t(aCandidate.height),
|
uint64_t(aCandidate.height? FitnessDistance(int32_t(aCandidate.height),
|
||||||
aConstraints.mHeight) : 0) +
|
aConstraints.mHeight,
|
||||||
|
aAdvanced) : 0) +
|
||||||
uint64_t(aCandidate.maxFPS? FitnessDistance(double(aCandidate.maxFPS),
|
uint64_t(aCandidate.maxFPS? FitnessDistance(double(aCandidate.maxFPS),
|
||||||
aConstraints.mFrameRate) : 0);
|
aConstraints.mFrameRate,
|
||||||
|
aAdvanced) : 0);
|
||||||
return uint32_t(std::min(distance, uint64_t(UINT32_MAX)));
|
return uint32_t(std::min(distance, uint64_t(UINT32_MAX)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,6 +155,8 @@ MediaEngineCameraVideoSource::TrimLessFitCandidates(CapabilitySet& set) {
|
|||||||
// GetBestFitnessDistance returns the best distance the capture device can offer
|
// GetBestFitnessDistance returns the best distance the capture device can offer
|
||||||
// as a whole, given an accumulated number of ConstraintSets.
|
// as a whole, given an accumulated number of ConstraintSets.
|
||||||
// Ideal values are considered in the first ConstraintSet only.
|
// Ideal values are considered in the first ConstraintSet only.
|
||||||
|
// Plain values are treated as Ideal in the first ConstraintSet.
|
||||||
|
// Plain values are treated as Exact in subsequent ConstraintSets.
|
||||||
// Infinity = UINT32_MAX e.g. device cannot satisfy accumulated ConstraintSets.
|
// Infinity = UINT32_MAX e.g. device cannot satisfy accumulated ConstraintSets.
|
||||||
// A finite result may be used to calculate this device's ranking as a choice.
|
// A finite result may be used to calculate this device's ranking as a choice.
|
||||||
|
|
||||||
@@ -172,7 +177,7 @@ MediaEngineCameraVideoSource::GetBestFitnessDistance(
|
|||||||
auto& candidate = candidateSet[i];
|
auto& candidate = candidateSet[i];
|
||||||
webrtc::CaptureCapability cap;
|
webrtc::CaptureCapability cap;
|
||||||
GetCapability(candidate.mIndex, cap);
|
GetCapability(candidate.mIndex, cap);
|
||||||
uint32_t distance = GetFitnessDistance(cap, *cs);
|
uint32_t distance = GetFitnessDistance(cap, *cs, !first);
|
||||||
if (distance == UINT32_MAX) {
|
if (distance == UINT32_MAX) {
|
||||||
candidateSet.RemoveElementAt(i);
|
candidateSet.RemoveElementAt(i);
|
||||||
} else {
|
} else {
|
||||||
@@ -212,7 +217,7 @@ MediaEngineCameraVideoSource::ChooseCapability(
|
|||||||
auto& candidate = candidateSet[i];
|
auto& candidate = candidateSet[i];
|
||||||
webrtc::CaptureCapability cap;
|
webrtc::CaptureCapability cap;
|
||||||
GetCapability(candidate.mIndex, cap);
|
GetCapability(candidate.mIndex, cap);
|
||||||
candidate.mDistance = GetFitnessDistance(cap, aConstraints);
|
candidate.mDistance = GetFitnessDistance(cap, aConstraints, false);
|
||||||
if (candidate.mDistance == UINT32_MAX) {
|
if (candidate.mDistance == UINT32_MAX) {
|
||||||
candidateSet.RemoveElementAt(i);
|
candidateSet.RemoveElementAt(i);
|
||||||
} else {
|
} else {
|
||||||
@@ -229,7 +234,7 @@ MediaEngineCameraVideoSource::ChooseCapability(
|
|||||||
auto& candidate = candidateSet[i];
|
auto& candidate = candidateSet[i];
|
||||||
webrtc::CaptureCapability cap;
|
webrtc::CaptureCapability cap;
|
||||||
GetCapability(candidate.mIndex, cap);
|
GetCapability(candidate.mIndex, cap);
|
||||||
if (GetFitnessDistance(cap, cs) == UINT32_MAX) {
|
if (GetFitnessDistance(cap, cs, true) == UINT32_MAX) {
|
||||||
rejects.AppendElement(candidate);
|
rejects.AppendElement(candidate);
|
||||||
candidateSet.RemoveElementAt(i);
|
candidateSet.RemoveElementAt(i);
|
||||||
} else {
|
} else {
|
||||||
@@ -261,7 +266,7 @@ MediaEngineCameraVideoSource::ChooseCapability(
|
|||||||
for (auto& candidate : candidateSet) {
|
for (auto& candidate : candidateSet) {
|
||||||
webrtc::CaptureCapability cap;
|
webrtc::CaptureCapability cap;
|
||||||
GetCapability(candidate.mIndex, cap);
|
GetCapability(candidate.mIndex, cap);
|
||||||
candidate.mDistance = GetFitnessDistance(cap, prefs);
|
candidate.mDistance = GetFitnessDistance(cap, prefs, false);
|
||||||
}
|
}
|
||||||
TrimLessFitCandidates(candidateSet);
|
TrimLessFitCandidates(candidateSet);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,8 +80,14 @@ protected:
|
|||||||
StreamTime delta);
|
StreamTime delta);
|
||||||
template<class ValueType, class ConstrainRange>
|
template<class ValueType, class ConstrainRange>
|
||||||
static uint32_t FitnessDistance(ValueType n, const ConstrainRange& aRange);
|
static uint32_t FitnessDistance(ValueType n, const ConstrainRange& aRange);
|
||||||
|
static uint32_t FitnessDistance(int32_t n,
|
||||||
|
const dom::OwningLongOrConstrainLongRange& aConstraint, bool aAdvanced);
|
||||||
|
static uint32_t FitnessDistance(double n,
|
||||||
|
const dom::OwningDoubleOrConstrainDoubleRange& aConstraint, bool aAdvanced);
|
||||||
|
|
||||||
static uint32_t GetFitnessDistance(const webrtc::CaptureCapability& aCandidate,
|
static uint32_t GetFitnessDistance(const webrtc::CaptureCapability& aCandidate,
|
||||||
const dom::MediaTrackConstraintSet &aConstraints);
|
const dom::MediaTrackConstraintSet &aConstraints,
|
||||||
|
bool aAdvanced);
|
||||||
static void TrimLessFitCandidates(CapabilitySet& set);
|
static void TrimLessFitCandidates(CapabilitySet& set);
|
||||||
virtual size_t NumCapabilities();
|
virtual size_t NumCapabilities();
|
||||||
virtual void GetCapability(size_t aIndex, webrtc::CaptureCapability& aOut);
|
virtual void GetCapability(size_t aIndex, webrtc::CaptureCapability& aOut);
|
||||||
|
|||||||
Reference in New Issue
Block a user