Skip to content

Commit

Permalink
Add MediaStreamTrackPlatform::Clone and call from MediaStreamComponent
Browse files Browse the repository at this point in the history
This makes it possible to clone MediaStreamComponents independently without relying on the caller (in MediaStreamTrack) to provide a cloned MediaStreamTrackPlatform.

Bug: 1302689
Change-Id: I10b7a1e86719543fecf1c56037126e6faf1ef10c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4350108
Reviewed-by: Guido Urdaneta <guidou@chromium.org>
Reviewed-by: Thomas Guilbert <tguilbert@chromium.org>
Commit-Queue: Tove Petersson <tovep@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1119827}
  • Loading branch information
Tove Petersson authored and Chromium LUCI CQ committed Mar 21, 2023
1 parent 0c8b467 commit 40852bb
Show file tree
Hide file tree
Showing 15 changed files with 69 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,7 @@ void CanvasCaptureMediaStreamTrack::requestFrame() {

CanvasCaptureMediaStreamTrack* CanvasCaptureMediaStreamTrack::clone(
ExecutionContext* script_state) {
MediaStreamComponent* cloned_component =
Component()->Clone(std::make_unique<blink::MediaStreamVideoTrack>(
MediaStreamVideoSource::GetVideoSource(Component()->Source()),
blink::MediaStreamVideoSource::ConstraintsOnceCallback(),
Component()->Enabled()));
MediaStreamComponent* cloned_component = Component()->Clone();
CanvasCaptureMediaStreamTrack* cloned_track =
MakeGarbageCollected<CanvasCaptureMediaStreamTrack>(*this,
cloned_component);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,8 +235,8 @@ BrowserCaptureMediaStreamTrack* BrowserCaptureMediaStreamTrack::clone(
// Instantiate the clone.
BrowserCaptureMediaStreamTrack* cloned_track =
MakeGarbageCollected<BrowserCaptureMediaStreamTrack>(
execution_context, Component()->Clone(ClonePlatformTrack()),
GetReadyState(), base::DoNothing());
execution_context, Component()->Clone(), GetReadyState(),
base::DoNothing());

// Copy state.
MediaStreamTrackImpl::CloneInternal(cloned_track);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,25 +166,6 @@ CreateWebAudioSourceFromMediaStreamTrack(MediaStreamComponent* component,
context_sample_rate);
}

// TODO(crbug.com/1302689): Move inside MediaStreamComponent.
std::unique_ptr<MediaStreamVideoTrack> CloneNativeVideoMediaStreamTrack(
MediaStreamComponent* original) {
MediaStreamSource* source = original->Source();
DCHECK_EQ(source->GetType(), MediaStreamSource::kTypeVideo);
MediaStreamVideoSource* native_source =
MediaStreamVideoSource::GetVideoSource(source);
DCHECK(native_source);
MediaStreamVideoTrack* original_track = MediaStreamVideoTrack::From(original);
DCHECK(original_track);
return std::make_unique<MediaStreamVideoTrack>(
native_source, original_track->adapter_settings(),
original_track->noise_reduction(), original_track->is_screencast(),
original_track->min_frame_rate(), original_track->pan(),
original_track->tilt(), original_track->zoom(),
original_track->pan_tilt_zoom_allowed(),
MediaStreamVideoSource::ConstraintsOnceCallback(), original->Enabled());
}

void DidCloneMediaStreamTrack(MediaStreamComponent* clone) {
DCHECK(clone);
DCHECK(clone->Source());
Expand Down Expand Up @@ -432,17 +413,6 @@ void MediaStreamTrackImpl::stopTrack(ExecutionContext* execution_context) {

PropagateTrackEnded();
}
// TODO(crbug.com/1302689): Move inside MediaStreamComponent.
std::unique_ptr<MediaStreamTrackPlatform>
MediaStreamTrackImpl::ClonePlatformTrack() {
switch (Component()->GetSourceType()) {
case MediaStreamSource::kTypeVideo:
return CloneNativeVideoMediaStreamTrack(Component());
case MediaStreamSource::kTypeAudio:
return MediaStreamAudioSource::From(Component()->Source())
->CreateMediaStreamAudioTrack(Component()->Id().Utf8());
}
}

MediaStreamTrack* MediaStreamTrackImpl::clone(
ExecutionContext* execution_context) {
Expand All @@ -451,8 +421,8 @@ MediaStreamTrack* MediaStreamTrackImpl::clone(
// Instantiate the clone.
MediaStreamTrackImpl* cloned_track =
MakeGarbageCollected<MediaStreamTrackImpl>(
execution_context, Component()->Clone(ClonePlatformTrack()),
ready_state_, base::DoNothing(), /*is_clone=*/true);
execution_context, Component()->Clone(), ready_state_,
base::DoNothing(), /*is_clone=*/true);

// Copy state.
CloneInternal(cloned_track);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,6 @@ class MODULES_EXPORT MediaStreamTrackImpl : public MediaStreamTrack,
// this class as well as of their own class.
void CloneInternal(MediaStreamTrackImpl*);

std::unique_ptr<MediaStreamTrackPlatform> ClonePlatformTrack();

private:
friend class CanvasCaptureMediaStreamTrack;
friend class InternalsMediaStream;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -729,6 +729,27 @@ MediaStreamVideoTrack::~MediaStreamVideoTrack() {
DVLOG(3) << "~MediaStreamVideoTrack()";
}

std::unique_ptr<MediaStreamTrackPlatform>
MediaStreamVideoTrack::CreateFromComponent(
const MediaStreamComponent* component,
const String& id) {
MediaStreamSource* source = component->Source();
DCHECK_EQ(source->GetType(), MediaStreamSource::kTypeVideo);
MediaStreamVideoSource* native_source =
MediaStreamVideoSource::GetVideoSource(source);
DCHECK(native_source);
MediaStreamVideoTrack* original_track =
MediaStreamVideoTrack::From(component);
DCHECK(original_track);
return std::make_unique<MediaStreamVideoTrack>(
native_source, original_track->adapter_settings(),
original_track->noise_reduction(), original_track->is_screencast(),
original_track->min_frame_rate(), original_track->pan(),
original_track->tilt(), original_track->zoom(),
original_track->pan_tilt_zoom_allowed(),
MediaStreamVideoSource::ConstraintsOnceCallback(), component->Enabled());
}

static void AddSinkInternal(Vector<WebMediaStreamSink*>* sinks,
WebMediaStreamSink* sink) {
DCHECK(!base::Contains(*sinks, sink));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ class MODULES_EXPORT MediaStreamVideoTrack : public MediaStreamTrackPlatform {

~MediaStreamVideoTrack() override;

std::unique_ptr<MediaStreamTrackPlatform> CreateFromComponent(
const MediaStreamComponent* component,
const String& id) override;

// MediaStreamTrack overrides.
void SetEnabled(bool enabled) override;
void SetContentHint(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_audio_sink.h"
#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_source.h"
#include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_audio_source.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_component.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_source.h"

Expand All @@ -36,6 +37,16 @@ MediaStreamAudioTrack::~MediaStreamAudioTrack() {
Stop();
}

std::unique_ptr<MediaStreamTrackPlatform>
MediaStreamAudioTrack::CreateFromComponent(
const MediaStreamComponent* component,
const String& id) {
MediaStreamSource* source = component->Source();
CHECK_EQ(source->GetType(), MediaStreamSource::kTypeAudio);
return MediaStreamAudioSource::From(source)->CreateMediaStreamAudioTrack(
id.Utf8());
}

// static
MediaStreamAudioTrack* MediaStreamAudioTrack::From(
const MediaStreamComponent* component) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ class PLATFORM_EXPORT MediaStreamAudioTrack : public MediaStreamTrackPlatform {

~MediaStreamAudioTrack() override;

std::unique_ptr<MediaStreamTrackPlatform> CreateFromComponent(
const MediaStreamComponent*,
const String& id) override;

// Returns the MediaStreamAudioTrack instance owned by the given blink |track|
// or null.
static MediaStreamAudioTrack* From(const MediaStreamComponent* component);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,7 @@ class WebLocalFrame;

class PLATFORM_EXPORT MediaStreamComponent : public GarbageCollectedMixin {
public:
// TODO(crbug.com/1302689): Clone the platform track internally rather than
// taking it as a parameter.
virtual MediaStreamComponent* Clone(std::unique_ptr<MediaStreamTrackPlatform>
cloned_platform_track) const = 0;
virtual MediaStreamComponent* Clone() const = 0;

virtual MediaStreamSource* Source() const = 0;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,12 @@ MediaStreamComponentImpl::MediaStreamComponentImpl(
source,
std::move(platform_track)) {}

MediaStreamComponentImpl* MediaStreamComponentImpl::Clone(
std::unique_ptr<MediaStreamTrackPlatform> cloned_platform_track) const {
MediaStreamComponentImpl* MediaStreamComponentImpl::Clone() const {
const String id = WTF::CreateCanonicalUUIDString();
std::unique_ptr<MediaStreamTrackPlatform> cloned_platform_track =
platform_track_->CreateFromComponent(this, id);
auto* cloned_component = MakeGarbageCollected<MediaStreamComponentImpl>(
Source(), std::move(cloned_platform_track));
id, Source(), std::move(cloned_platform_track));
cloned_component->SetEnabled(enabled_);
cloned_component->SetContentHint(content_hint_);
return cloned_component;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,7 @@ class PLATFORM_EXPORT MediaStreamComponentImpl final
MediaStreamComponentImpl(MediaStreamSource*,
std::unique_ptr<MediaStreamTrackPlatform>);

MediaStreamComponentImpl* Clone(
std::unique_ptr<MediaStreamTrackPlatform> cloned_platform_track =
nullptr) const override;
MediaStreamComponentImpl* Clone() const override;

// |m_trackData| may hold pointers to GC objects indirectly, and it may touch
// eagerly finalized objects in destruction.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,19 @@ class PLATFORM_EXPORT MediaStreamTrackPlatform {
MediaStreamTrackPlatform& operator=(const MediaStreamTrackPlatform&) = delete;
virtual ~MediaStreamTrackPlatform();

// Creates a new MediaStreamTrackPlatform of the same type as this based on
// data retrieved from the supplied MediaStreamComponent. This method must be
// called on a MediaStreamTrackPlatform object of the same type as the
// platform track member of the passed MediaStreamComponent.
//
// TODO(crbug.com/1302689): This is an instance method of this class solely
// for creating an object of the right type from either the platform or
// modules directories. Remove this method when there is a better way to
// achieve this.
virtual std::unique_ptr<MediaStreamTrackPlatform> CreateFromComponent(
const MediaStreamComponent* component,
const String& id) = 0;

static MediaStreamTrackPlatform* GetTrack(const WebMediaStreamTrack& track);

virtual void SetEnabled(bool enabled) = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,9 @@ void TransferredMediaStreamComponent::SetImplementation(
add_audio_sink_calls_.clear();
}

MediaStreamComponent* TransferredMediaStreamComponent::Clone(
std::unique_ptr<MediaStreamTrackPlatform> cloned_platform_track) const {
MediaStreamComponent* TransferredMediaStreamComponent::Clone() const {
if (component_) {
return component_->Clone(std::move(cloned_platform_track));
return component_->Clone();
}
// TODO(crbug.com/1288839): Implement Clone() for when component_ is not set
return nullptr;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_MEDIASTREAM_TRANSFERRED_MEDIA_STREAM_COMPONENT_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_MEDIASTREAM_TRANSFERRED_MEDIA_STREAM_COMPONENT_H_

#include <memory>

#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_track.h"
#include "third_party/blink/renderer/platform/audio/audio_source_provider.h"
#include "third_party/blink/renderer/platform/heap/collection_support/heap_vector.h"
Expand Down Expand Up @@ -40,9 +38,7 @@ class PLATFORM_EXPORT TransferredMediaStreamComponent final

void SetImplementation(MediaStreamComponent* component);

MediaStreamComponent* Clone(
std::unique_ptr<MediaStreamTrackPlatform> cloned_platform_track =
nullptr) const override;
MediaStreamComponent* Clone() const override;

MediaStreamSource* Source() const override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ class MockMediaStreamComponent
public MediaStreamComponent {
public:
virtual ~MockMediaStreamComponent() = default;
MOCK_CONST_METHOD1(
Clone,
MediaStreamComponent*(std::unique_ptr<MediaStreamTrackPlatform>));
MOCK_CONST_METHOD0(Clone, MediaStreamComponent*());
MOCK_CONST_METHOD0(Source, MediaStreamSource*());
MOCK_CONST_METHOD0(Id, String());
MOCK_CONST_METHOD0(UniqueId, int());
Expand Down

0 comments on commit 40852bb

Please sign in to comment.