blob: 743afc5b8e8c99e5f7a99c45fd164e21f8c2a1ed [file] [log] [blame]
// Copyright 2022 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_MEDIASTREAM_MEDIA_STREAM_TRACK_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MEDIA_STREAM_TRACK_H_
#include <memory>
#include "build/build_config.h"
#include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_capture_handle.h"
#include "third_party/blink/renderer/modules/event_target_modules.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_descriptor.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_source.h"
#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
#include "third_party/blink/renderer/platform/wtf/forward.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
static const char kContentHintStringNone[] = "";
static const char kContentHintStringAudioSpeech[] = "speech";
static const char kContentHintStringAudioMusic[] = "music";
static const char kContentHintStringVideoMotion[] = "motion";
static const char kContentHintStringVideoDetail[] = "detail";
static const char kContentHintStringVideoText[] = "text";
class AudioSourceProvider;
class ImageCapture;
class MediaConstraints;
class MediaTrackCapabilities;
class MediaTrackConstraints;
class MediaStream;
class MediaTrackSettings;
class ScriptState;
String ContentHintToString(
const WebMediaStreamTrack::ContentHintType& content_hint);
String ReadyStateToString(const MediaStreamSource::ReadyState& ready_state);
class MODULES_EXPORT MediaStreamTrack
: public EventTargetWithInlineData,
public ActiveScriptWrappable<MediaStreamTrack> {
DEFINE_WRAPPERTYPEINFO();
public:
class MODULES_EXPORT Observer : public GarbageCollectedMixin {
public:
virtual ~Observer() = default;
virtual void TrackChangedState() = 0;
};
// For carrying data to the FromTransferredState method.
struct TransferredValues {
const WrapperTypeInfo* track_impl_subtype;
base::UnguessableToken session_id;
base::UnguessableToken transfer_id;
String kind;
String id;
String label;
bool enabled;
bool muted;
WebMediaStreamTrack::ContentHintType content_hint;
MediaStreamSource::ReadyState ready_state;
// Set only if
// track_impl_subtype->IsSubclass(BrowserCaptureMediaStreamTrack::GetStaticWrapperTypeInfo())
absl::optional<uint32_t> crop_version;
};
// See SetFromTransferredStateImplForTesting in ./test/transfer_test_utils.h.
using FromTransferredStateImplForTesting =
base::RepeatingCallback<MediaStreamTrack*(const TransferredValues&)>;
// Create a MediaStreamTrack instance as a result of a transfer into this
// context, eg when receiving a postMessage() with an MST in the transfer
// list.
// TODO(https://crbug.com/1288839): Implement to recreate MST after transfer
static MediaStreamTrack* FromTransferredState(ScriptState* script_state,
const TransferredValues& data);
MediaStreamTrack();
// MediaStreamTrack.idl
virtual String kind() const = 0;
virtual String id() const = 0;
virtual String label() const = 0;
virtual bool enabled() const = 0;
virtual void setEnabled(bool) = 0;
virtual bool muted() const = 0;
virtual String ContentHint() const = 0;
virtual String readyState() const = 0;
virtual void SetContentHint(const String&) = 0;
virtual void stopTrack(ExecutionContext*) = 0;
virtual MediaStreamTrack* clone(ExecutionContext*) = 0;
virtual MediaTrackCapabilities* getCapabilities() const = 0;
virtual MediaTrackConstraints* getConstraints() const = 0;
virtual MediaTrackSettings* getSettings() const = 0;
virtual CaptureHandle* getCaptureHandle() const = 0;
virtual ScriptPromise applyConstraints(ScriptState*,
const MediaTrackConstraints*) = 0;
virtual void applyConstraints(ScriptPromiseResolver*,
const MediaTrackConstraints*) = 0;
virtual void SetInitialConstraints(const MediaConstraints& constraints) = 0;
virtual void SetConstraints(const MediaConstraints& constraints) = 0;
DEFINE_ATTRIBUTE_EVENT_LISTENER(mute, kMute)
DEFINE_ATTRIBUTE_EVENT_LISTENER(unmute, kUnmute)
DEFINE_ATTRIBUTE_EVENT_LISTENER(ended, kEnded)
DEFINE_ATTRIBUTE_EVENT_LISTENER(capturehandlechange, kCapturehandlechange)
DEFINE_ATTRIBUTE_EVENT_LISTENER(configurationchange, kConfigurationchange)
virtual MediaStreamSource::ReadyState GetReadyState() = 0;
virtual MediaStreamComponent* Component() const = 0;
virtual bool Ended() const = 0;
virtual void RegisterMediaStream(MediaStream*) = 0;
virtual void UnregisterMediaStream(MediaStream*) = 0;
// EventTarget
const AtomicString& InterfaceName() const override = 0;
ExecutionContext* GetExecutionContext() const override = 0;
void AddedEventListener(const AtomicString&,
RegisteredEventListener&) override = 0;
// ScriptWrappable
bool HasPendingActivity() const override = 0;
virtual std::unique_ptr<AudioSourceProvider> CreateWebAudioSource(
int context_sample_rate) = 0;
virtual ImageCapture* GetImageCapture() = 0;
virtual absl::optional<const MediaStreamDevice> device() const = 0;
// This function is called on the track by the serializer once it has been
// serialized for transfer to another context.
// Prepares the track for a potentially cross-renderer transfer. After this
// is called, the track will be in an ended state and no longer usable.
virtual void BeingTransferred(const base::UnguessableToken& transfer_id) = 0;
// Returns true if this track is allowed to be transferred. If a transfer is
// not allowed, message will contain an explanatory text that can be
// surfaced to the caller.
virtual bool TransferAllowed(String& message) const = 0;
virtual void AddObserver(Observer*) = 0;
void Trace(Visitor* visitor) const override {
EventTargetWithInlineData::Trace(visitor);
}
private:
// Friend in order to allow setting a new impl for FromTransferredState.
friend void SetFromTransferredStateImplForTesting(
FromTransferredStateImplForTesting impl);
// Provides access to the global mock impl of FromTransferredState. Set to
// base::NullCallback() to restore the real impl.
static FromTransferredStateImplForTesting&
GetFromTransferredStateImplForTesting();
};
typedef HeapVector<Member<MediaStreamTrack>> MediaStreamTrackVector;
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MEDIA_STREAM_TRACK_H_