Bug 1162412 - Part 3: Treat plain values as exact in advanced. r=jesup, a=lmandel

This commit is contained in:
Jan-Ivar Bruaroey
2015-05-06 23:01:17 -04:00
parent 5306b988f1
commit c53c83cf09
2 changed files with 28 additions and 17 deletions

View File

@@ -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);
} }

View File

@@ -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);