Reland "Use internal() in VideoTrack when invoking the source."

This is a reland of 962bf1896185c0d84232f2bfae492eeb04e1236d

Original change's description:
> Use internal() in VideoTrack when invoking the source.
>
> This skips going through the proxy and potentially hide a thread hop
> should a regression occur.
>
> This CL contains a part of a previously reviewed, landed, reverted,
> relanded and re-reverted CL:
> https://webrtc-review.googlesource.com/c/src/+/250180
>
> Bug: webrtc:13540
> Change-Id: If098f5c04a263547fb53f44e9f9738b8e941a294
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/251861
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
> Cr-Commit-Position: refs/heads/main@{#36026}

Bug: webrtc:13540
Change-Id: I00e998be6614b1a478ddf02110b3a2d67bd42274
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/252043
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36053}
diff --git a/pc/video_track.cc b/pc/video_track.cc
index 27274dc..4559181 100644
--- a/pc/video_track.cc
+++ b/pc/video_track.cc
@@ -57,18 +57,18 @@
   VideoSourceBaseGuarded::AddOrUpdateSink(sink, wants);
   rtc::VideoSinkWants modified_wants = wants;
   modified_wants.black_frames = !enabled_w_;
-  video_source_->AddOrUpdateSink(sink, modified_wants);
+  video_source_->internal()->AddOrUpdateSink(sink, modified_wants);
 }
 
 void VideoTrack::RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) {
   RTC_DCHECK_RUN_ON(worker_thread_);
   VideoSourceBaseGuarded::RemoveSink(sink);
-  video_source_->RemoveSink(sink);
+  video_source_->internal()->RemoveSink(sink);
 }
 
 void VideoTrack::RequestRefreshFrame() {
   RTC_DCHECK_RUN_ON(worker_thread_);
-  video_source_->RequestRefreshFrame();
+  video_source_->internal()->RequestRefreshFrame();
 }
 
 VideoTrackSourceInterface* VideoTrack::GetSource() const {
@@ -76,6 +76,10 @@
   return video_source_.get();
 }
 
+VideoTrackSourceInterface* VideoTrack::GetSourceInternal() const {
+  return video_source_->internal();
+}
+
 VideoTrackInterface::ContentHint VideoTrack::content_hint() const {
   RTC_DCHECK_RUN_ON(&signaling_thread_);
   return content_hint_;
diff --git a/pc/video_track.h b/pc/video_track.h
index 2bf7f31..66262d2 100644
--- a/pc/video_track.h
+++ b/pc/video_track.h
@@ -54,6 +54,9 @@
   MediaStreamTrackInterface::TrackState state() const override;
   std::string kind() const override;
 
+  // Direct access to the non-proxied source object for internal implementation.
+  VideoTrackSourceInterface* GetSourceInternal() const;
+
  protected:
   VideoTrack(
       const std::string& id,
diff --git a/pc/video_track_unittest.cc b/pc/video_track_unittest.cc
index 6342b60..e6dcce7 100644
--- a/pc/video_track_unittest.cc
+++ b/pc/video_track_unittest.cc
@@ -40,10 +40,19 @@
 
  protected:
   rtc::scoped_refptr<FakeVideoTrackSource> video_track_source_;
-  rtc::scoped_refptr<VideoTrackInterface> video_track_;
+  rtc::scoped_refptr<VideoTrack> video_track_;
   cricket::FakeFrameSource frame_source_;
 };
 
+// VideoTrack::Create will create an API proxy around the source object.
+// The `GetSource` method provides access to the proxy object intented for API
+// use while the GetSourceInternal() provides direct access to the source object
+// as provided to the `VideoTrack::Create` factory function.
+TEST_F(VideoTrackTest, CheckApiProxyAndInternalSource) {
+  EXPECT_NE(video_track_->GetSource(), video_track_source_.get());
+  EXPECT_EQ(video_track_->GetSourceInternal(), video_track_source_.get());
+}
+
 // Test changing the source state also changes the track state.
 TEST_F(VideoTrackTest, SourceStateChangeTrackState) {
   EXPECT_EQ(MediaStreamTrackInterface::kLive, video_track_->state());