File: image_capture.h

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (203 lines) | stat: -rw-r--r-- 8,514 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_IMAGECAPTURE_IMAGE_CAPTURE_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_IMAGECAPTURE_IMAGE_CAPTURE_H_

#include <memory>
#include <optional>

#include "base/time/time.h"
#include "media/capture/mojom/image_capture.mojom-blink.h"
#include "third_party/blink/public/mojom/permissions/permission.mojom-blink.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"

namespace blink {
class Blob;
class ExceptionState;
class ImageBitmap;
class ImageCaptureFrameGrabber;
class MediaStreamTrack;
class MediaTrackCapabilities;
class MediaTrackConstraints;
class MediaTrackConstraintSet;
class MediaTrackSettings;
class PhotoCapabilities;
class PhotoSettings;
class ScriptPromiseResolverBase;

class MODULES_EXPORT ImageCapture final
    : public ScriptWrappable,
      public ExecutionContextLifecycleObserver,
      public mojom::blink::PermissionObserver {
  DEFINE_WRAPPERTYPEINFO();

 public:
  enum class MediaTrackConstraintSetType;

  static ImageCapture* Create(ExecutionContext*,
                              MediaStreamTrack*,
                              ExceptionState&);

  // |initialized_callback| is called when settings and capabilities are
  // retrieved.
  ImageCapture(ExecutionContext*,
               MediaStreamTrack*,
               bool pan_tilt_zoom_allowed,
               base::OnceClosure initialized_callback,
               base::TimeDelta grab_frame_timeout = base::Seconds(2));
  ~ImageCapture() override;

  // ExecutionContextLifecycleObserver
  void ContextDestroyed() override;

  MediaStreamTrack* videoStreamTrack() const { return stream_track_.Get(); }

  ScriptPromise<PhotoCapabilities> getPhotoCapabilities(ScriptState*);
  ScriptPromise<PhotoSettings> getPhotoSettings(ScriptState*);
  ScriptPromise<Blob> takePhoto(ScriptState*, const PhotoSettings*);
  ScriptPromise<ImageBitmap> grabFrame(ScriptState*);

  bool CheckAndApplyMediaTrackConstraintsToSettings(
      media::mojom::blink::PhotoSettings*,
      const MediaTrackConstraints*,
      ScriptPromiseResolverBase*) const;
  void GetMediaTrackCapabilities(MediaTrackCapabilities*) const;
  void SetMediaTrackConstraints(ScriptPromiseResolverBase*,
                                const MediaTrackConstraints* constraints);
  MediaTrackConstraints* GetMediaTrackConstraints() const;
  void ClearMediaTrackConstraints();
  void GetMediaTrackSettings(MediaTrackSettings*) const;

  bool HasPanTiltZoomPermissionGranted() const;

  // Update the current settings and capabilities and check whether local
  // changes to background blur settings and capabilities were detected.
  void UpdateAndCheckMediaTrackSettingsAndCapabilities(
      base::OnceCallback<void(bool)>);

  // Called by MediaStreamTrack::clone() to get a clone with same capabilities,
  // settings, and constraints.
  ImageCapture* Clone() const;

  void Trace(Visitor*) const override;

  void SetCapabilitiesForTesting(MediaTrackCapabilities* capabilities) {
    capabilities_ = capabilities;
  }
  void SetSettingsForTesting(MediaTrackSettings* settings) {
    settings_ = settings;
  }

 private:
  using PromiseResolverFunction =
      base::OnceCallback<void(ScriptPromiseResolverBase*)>;

  // Called by `CheckAndApplyMediaTrackConstraintsToSettings()` to apply
  // a single constraint set to photo settings and to effective capabilities.
  void ApplyMediaTrackConstraintSetToSettings(
      media::mojom::blink::PhotoSettings*,
      MediaTrackCapabilities* effective_capabilities,
      MediaTrackSettings* effective_settings,
      const MediaTrackConstraintSet*,
      MediaTrackConstraintSetType) const;
  // Called by `CheckAndApplyMediaTrackConstraintsToSettings()` check if
  // effective capabilities satisfy a single constraint set.
  bool CheckMediaTrackConstraintSet(
      const MediaTrackCapabilities* effective_capabilities,
      const MediaTrackSettings* effective_settings,
      const MediaTrackConstraintSet*,
      MediaTrackConstraintSetType,
      ScriptPromiseResolverBase*) const;

  // mojom::blink::PermissionObserver implementation.
  // Called when we get an updated PTZ permission value from the browser.
  void OnPermissionStatusChange(mojom::blink::PermissionStatus) override;

  void GetMojoPhotoState(ScriptPromiseResolverBase*, PromiseResolverFunction);
  void OnMojoGetPhotoState(ScriptPromiseResolverBase*,
                           PromiseResolverFunction,
                           bool trigger_take_photo,
                           media::mojom::blink::PhotoStatePtr);
  void OnMojoSetPhotoOptions(ScriptPromiseResolverBase*,
                             bool trigger_take_photo,
                             bool result);
  void OnMojoTakePhoto(ScriptPromiseResolverBase*,
                       media::mojom::blink::BlobPtr);

  // If getUserMedia contains Image Capture constraints, the
  // corresponding settings will be set when image capture is created.
  void SetVideoTrackDeviceSettingsFromTrack(
      base::OnceClosure callback,
      media::mojom::blink::PhotoStatePtr photo_state);
  // Update local track settings and capabilities once Image Capture
  // settings have been set. |done_callback| will be called when settings and
  // capabilities are retrieved.
  void OnSetVideoTrackDeviceSettingsFromTrack(base::OnceClosure done_callback,
                                              bool result);
  // Update local track settings and capabilities and call
  // |initialized_callback| to indicate settings and capabilities have been
  // retrieved.
  void UpdateMediaTrackSettingsAndCapabilities(
      base::OnceClosure initialized_callback,
      media::mojom::blink::PhotoStatePtr photo_state);

  void OnServiceConnectionError();

  void MaybeRejectWithOverconstrainedError(ScriptPromiseResolverBase*,
                                           const char* constraint,
                                           const char* message) const;
  void ResolveWithNothing(ScriptPromiseResolverBase*);
  void ResolveWithPhotoSettings(ScriptPromiseResolverBase*);
  void ResolveWithPhotoCapabilities(ScriptPromiseResolverBase*);

  // Returns true if page is visible. Otherwise returns false.
  bool IsPageVisible() const;

  // Call UpdateMediaTrackSettingsAndCapabilities with |photo_state| and call
  // |callback| with whether local changes to background blur settings and
  // capabilities were detected.
  void GotPhotoState(base::OnceCallback<void(bool)> callback,
                     media::mojom::blink::PhotoStatePtr photo_state);

  const String& SourceId() const;

  // Get the name a constraint for which the existence of the capability or
  // the permission to access the capability does not match the constraint.
  const std::optional<const char*> GetConstraintWithCapabilityExistenceMismatch(
      const MediaTrackConstraintSet* constraint_set,
      MediaTrackConstraintSetType) const;

  Member<MediaStreamTrack> stream_track_;
  std::unique_ptr<ImageCaptureFrameGrabber> frame_grabber_;
  HeapMojoRemote<media::mojom::blink::ImageCapture> service_;

  // Whether the user has granted permission for the user to control camera PTZ.
  mojom::blink::PermissionStatus pan_tilt_zoom_permission_;
  // The permission service, enabling us to check for the PTZ permission.
  HeapMojoRemote<mojom::blink::PermissionService> permission_service_;
  HeapMojoReceiver<mojom::blink::PermissionObserver, ImageCapture>
      permission_observer_receiver_;

  Member<MediaTrackCapabilities> capabilities_;
  Member<MediaTrackSettings> settings_;
  Member<MediaTrackConstraints> current_constraints_;
  Member<PhotoSettings> photo_settings_;

  Member<PhotoCapabilities> photo_capabilities_;

  HeapHashSet<Member<ScriptPromiseResolverBase>> service_requests_;

  const base::TimeDelta grab_frame_timeout_;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_IMAGECAPTURE_IMAGE_CAPTURE_H_