blob: b3df2ff8f07feb5dbe1c717afa30aba322fd3730 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_CONSTRAINTS_UTIL_VIDEO_SOURCE_H_
#define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_CONSTRAINTS_UTIL_VIDEO_SOURCE_H_
#include <iosfwd>
#include <string>
#include <vector>
#include "content/common/content_export.h"
#include "content/common/media/media_devices.mojom.h"
#include "media/capture/video_capture_types.h"
namespace blink {
class WebString;
class WebMediaConstraints;
}
namespace content {
// Calculates and returns videoKind value for |format|.
// See https://w3c.github.io/mediacapture-depth.
blink::WebString CONTENT_EXPORT
GetVideoKindForFormat(const media::VideoCaptureFormat& format);
struct CONTENT_EXPORT VideoCaptureCapabilities {
VideoCaptureCapabilities();
VideoCaptureCapabilities(VideoCaptureCapabilities&& other);
~VideoCaptureCapabilities();
VideoCaptureCapabilities& operator=(VideoCaptureCapabilities&& other);
// Each field is independent of each other.
std::vector<::mojom::VideoInputDeviceCapabilitiesPtr> device_capabilities;
std::vector<media::PowerLineFrequency> power_line_capabilities;
};
class CONTENT_EXPORT VideoCaptureSourceSettings {
public:
VideoCaptureSourceSettings();
VideoCaptureSourceSettings(const VideoCaptureSourceSettings& other);
VideoCaptureSourceSettings(VideoCaptureSourceSettings&& other);
VideoCaptureSourceSettings(const std::string& device_id,
const media::VideoCaptureFormat& format,
::mojom::FacingMode facing_mode,
media::PowerLineFrequency power_line_frequency);
~VideoCaptureSourceSettings();
VideoCaptureSourceSettings& operator=(
const VideoCaptureSourceSettings& other);
VideoCaptureSourceSettings& operator=(VideoCaptureSourceSettings&& other);
// Accessors for easier interaction with blink constraint classes.
blink::WebString GetFacingMode() const;
long GetPowerLineFrequency() const;
long GetWidth() const;
long GetHeight() const;
double GetFrameRate() const;
blink::WebString GetDeviceId() const;
blink::WebString GetVideoKind() const;
const media::VideoCaptureFormat& format() const { return format_; }
const std::string& device_id() const { return device_id_; }
::mojom::FacingMode facing_mode() const { return facing_mode_; }
media::PowerLineFrequency power_line_frequency() const {
return power_line_frequency_;
}
private:
std::string device_id_;
media::VideoCaptureFormat format_;
::mojom::FacingMode facing_mode_;
media::PowerLineFrequency power_line_frequency_;
};
struct CONTENT_EXPORT VideoCaptureSourceSelectionResult {
VideoCaptureSourceSelectionResult();
VideoCaptureSourceSelectionResult(
const VideoCaptureSourceSelectionResult& other);
VideoCaptureSourceSelectionResult(VideoCaptureSourceSelectionResult&& other);
~VideoCaptureSourceSelectionResult();
VideoCaptureSourceSelectionResult& operator=(
const VideoCaptureSourceSelectionResult& other);
VideoCaptureSourceSelectionResult& operator=(
VideoCaptureSourceSelectionResult&& other);
bool has_value() const { return failed_constraint_name == nullptr; }
VideoCaptureSourceSettings settings;
const char* failed_constraint_name;
};
// This function performs source and source-settings selection based on
// the given |capabilities| and |constraints|.
// Chromium performs constraint resolution in two steps. First, a source and its
// settings are selected; then a track is created, connected to the source, and
// finally the track settings are selected. This function implements an
// algorithm for the first step. Sources are not a user-visible concept, so the
// spec only specifies an algorithm for track settings.
// This algorithm for sources is compatible with the spec algorithm for tracks,
// as defined in https://w3c.github.io/mediacapture-main/#dfn-selectsettings,
// but it is customized to account for differences between sources and tracks,
// and to break ties when multiple source settings are equally good according to
// the spec algorithm.
// The main difference between a source and a track with regards to the spec
// algorithm is that a candidate source can support a range of values for some
// constraints while a candidate track supports a single value. For example,
// cropping allows a source with native resolution AxB to support the range of
// resolutions from 1x1 to AxB.
// Only candidates that satisfy the basic constraint set are valid. If no
// candidate can satisfy the basic constraint set, this function returns
// a result without a valid |settings| field and with the name of a failed
// constraint in field |failed_constraint_name|. If at least one candidate that
// satisfies the basic constraint set can be found, this function returns a
// result with a valid |settings| field and a null |failed_constraint_name|.
// If there are no candidates at all, this function returns a result with an
// empty string in |failed_constraint_name| and without a valid |settings|
// field.
// The criteria to decide if a valid candidate is better than another one are as
// follows:
// 1. Given advanced constraint sets A[0],A[1]...,A[n], candidate C1 is better
// than candidate C2 if C1 supports the first advanced set for which C1's
// support is different than C2's support.
// Examples:
// * One advanced set, C1 supports it, and C2 does not. C1 is better.
// * Two sets, C1 supports both, C2 supports only the first. C1 is better.
// * Three sets, C1 supports the first and second set, C2 supports the first
// and third set. C1 is better.
// 2. C1 is better than C2 if C1 has a smaller fitness distance than C2. The
// fitness distance depends on the ability of the candidate to support ideal
// values in the basic constraint set. This is the final criterion defined in
// the spec.
// 3. C1 is better than C2 if C1 has a lower Chromium-specific custom distance
// from the basic constraint set. This custom distance is the sum of various
// constraint-specific custom distances.
// For example, if the constraint set specifies a resolution of exactly
// 1000x1000 for a track, then a candidate with a resolution of 1200x1200
// is better than a candidate with a resolution of 2000x2000. Both settings
// satisfy the constraint set because cropping can be used to produce the
// track setting of 1000x1000, but 1200x1200 is considered better because it
// has lower resource usage. The same criteria applies for each advanced
// constraint set.
// 4. C1 is better than C2 if its native settings have a smaller fitness
// distance. For example, if the ideal resolution is 1000x1000 and C1 has a
// native resolution of 1200x1200, while C2 has a native resolution of
// 2000x2000, then C1 is better because it can support the ideal value with
// lower resource usage. Both C1 and C2 are better than a candidate C3 with
// a native resolution of 999x999, since C3 has a nonzero distance to the
// ideal value and thus has worse fitness according to step 2, even if C3's
// native fitness is better than C1's and C2's.
// 5. C1 is better than C2 if its settings are closer to certain default
// settings that include the device ID, power-line frequency, resolution, and
// frame rate, in that order. Note that there is no default facing mode or
// aspect ratio.
VideoCaptureSourceSelectionResult CONTENT_EXPORT
SelectVideoCaptureSourceSettings(const VideoCaptureCapabilities& capabilities,
const blink::WebMediaConstraints& constraints);
} // namespace content
#endif // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_CONSTRAINTS_UTIL_VIDEO_SOURCE_H_