Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(338)

Side by Side Diff: content/renderer/media/webrtc/media_stream_remote_video_source.cc

Issue 201583003: Implement a source for remote video tracks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/renderer/media/webrtc/media_stream_remote_video_source.h"
6
7 #include "base/bind.h"
8 #include "base/location.h"
9 #include "content/renderer/media/native_handle_impl.h"
10 #include "media/base/video_frame.h"
11 #include "media/base/video_util.h"
12 #include "third_party/libjingle/source/talk/media/base/videoframe.h"
13
14 namespace content {
15
16 MediaStreamRemoteVideoSource::MediaStreamRemoteVideoSource(
17 webrtc::VideoTrackInterface* remote_track)
18 : MediaStreamVideoSource(NULL),
19 message_loop_proxy_(base::MessageLoopProxy::current()),
20 remote_track_(remote_track),
21 track_state_(remote_track_->state()),
Jói 2014/03/17 22:00:40 As a minor suggestion, perhaps this should be call
Ronghua Wu (Left Chromium) 2014/03/17 22:45:35 +1
perkj_chrome 2014/03/19 16:34:48 Done.
perkj_chrome 2014/03/19 16:34:48 Done.
22 first_frame_received_(false) {
23 remote_track_->AddRenderer(this);
24 remote_track_->RegisterObserver(this);
25 }
26
27 MediaStreamRemoteVideoSource::~MediaStreamRemoteVideoSource() {
28 StopSourceImpl();
29 }
30
31 void MediaStreamRemoteVideoSource::GetCurrentSupportedFormats(
32 int max_requested_width,
33 int max_requested_height) {
34 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
35 if (format_.IsValid()) {
Jói 2014/03/17 22:00:40 If format_ is not valid, is it acceptable to never
Ronghua Wu (Left Chromium) 2014/03/17 22:45:35 Should call OnSupportedFormats regardless, otherwi
perkj_chrome 2014/03/19 16:34:48 So the idea here is that format_ gets valid when t
36 media::VideoCaptureFormats formats;
37 formats.push_back(format_);
38 OnSupportedFormats(formats);
39 }
40 }
41
42 void MediaStreamRemoteVideoSource::StartSourceImpl(
43 const media::VideoCaptureParams& params) {
44 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
45 OnStartDone(true);
46 }
47
48 void MediaStreamRemoteVideoSource::StopSourceImpl() {
49 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
50 remote_track_->RemoveRenderer(this);
51 remote_track_->UnregisterObserver(this);
52 }
53
54 webrtc::VideoSourceInterface* MediaStreamRemoteVideoSource::GetAdapter() {
55 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
56 return remote_track_->GetSource();
57 }
58
59 void MediaStreamRemoteVideoSource::SetSize(int width, int height) {
60 }
61
62 void MediaStreamRemoteVideoSource::RenderFrame(
63 const cricket::VideoFrame* frame) {
64 base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds(
Jói 2014/03/17 22:00:40 Note that there is also a FromMicroseconds factory
perkj_chrome 2014/03/19 16:34:48 Except that I introduce the video frame pool I kep
65 frame->GetTimeStamp() / talk_base::kNumNanosecsPerMillisec);
66
67 scoped_refptr<media::VideoFrame> video_frame;
68 if (frame->GetNativeHandle() != NULL) {
69 NativeHandleImpl* handle =
70 static_cast<NativeHandleImpl*>(frame->GetNativeHandle());
71 video_frame = static_cast<media::VideoFrame*>(handle->GetHandle());
72 video_frame->SetTimestamp(timestamp);
73 } else {
74 gfx::Size size(frame->GetWidth(), frame->GetHeight());
75 video_frame = frame_pool_.CreateFrame(
76 media::VideoFrame::I420, size, gfx::Rect(size), size, timestamp);
77
78 // Aspect ratio unsupported; DCHECK when there are non-square pixels.
Ronghua Wu (Left Chromium) 2014/03/17 22:45:35 how do you mean by "Aspect ratio unsupported"?
perkj_chrome 2014/03/19 16:34:48 This function is actually copied from the one I th
79 DCHECK_EQ(frame->GetPixelWidth(), 1u);
80 DCHECK_EQ(frame->GetPixelHeight(), 1u);
Ronghua Wu (Left Chromium) 2014/03/17 22:45:35 why is this check needed?
perkj_chrome 2014/03/19 16:34:48 On 2014/03/17 22:45:35, Ronghua Wu wrote: > why is
81
82 int y_rows = frame->GetHeight();
83 int uv_rows = frame->GetChromaHeight();
84 CopyYPlane(
85 frame->GetYPlane(), frame->GetYPitch(), y_rows, video_frame.get());
86 CopyUPlane(
87 frame->GetUPlane(), frame->GetUPitch(), uv_rows, video_frame.get());
88 CopyVPlane(
89 frame->GetVPlane(), frame->GetVPitch(), uv_rows, video_frame.get());
90 }
91
92 if (!first_frame_received_) {
93 first_frame_received_ = true;
94 media::VideoPixelFormat pixel_format = (
95 video_frame->format() == media::VideoFrame::I420) ?
96 media::PIXEL_FORMAT_I420 : media::PIXEL_FORMAT_TEXTURE;
97 media::VideoCaptureFormat format(
98 gfx::Size(video_frame->natural_size().width(),
99 video_frame->natural_size().height()),
100 MediaStreamVideoSource::kDefaultFrameRate,
101 pixel_format);
102 message_loop_proxy_->PostTask(
103 FROM_HERE,
104 base::Bind(&MediaStreamRemoteVideoSource::FrameFormatOnMainThread,
105 AsWeakPtr(), format));
106 }
107
108 // TODO(perkj): Consider delivering the frame on whatever thread the frame is
109 // delivered on once crbug/335327 is fixed.
110 message_loop_proxy_->PostTask(
Ronghua Wu (Left Chromium) 2014/03/17 22:45:35 Don't deliver the frame before the source is start
perkj_chrome 2014/03/19 16:34:48 ok- But we need to do that on the correct thread.
111 FROM_HERE,
112 base::Bind(&MediaStreamRemoteVideoSource::DoRenderFrameOnMainThread,
113 AsWeakPtr(), video_frame));
114 }
115
116 void MediaStreamRemoteVideoSource::OnChanged() {
117 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
118 webrtc::MediaStreamTrackInterface::TrackState state = remote_track_->state();
119 if (state != track_state_) {
120 track_state_ = state;
121 switch (state) {
122 case webrtc::MediaStreamTrackInterface::kInitializing:
123 // Ignore the kInitializing state since there is no match in
124 // WebMediaStreamSource::ReadyState.
125 break;
126 case webrtc::MediaStreamTrackInterface::kLive:
127 SetReadyState(blink::WebMediaStreamSource::ReadyStateLive);
128 break;
129 case webrtc::MediaStreamTrackInterface::kEnded:
130 SetReadyState(blink::WebMediaStreamSource::ReadyStateEnded);
131 break;
132 default:
133 NOTREACHED();
134 break;
135 }
136 }
137 }
138
139 void MediaStreamRemoteVideoSource::FrameFormatOnMainThread(
140 const media::VideoCaptureFormat& format) {
141 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
142 format_ = format;
143 if (GetState() == RETRIEVING_CAPABILITIES) {
144 media::VideoCaptureFormats formats;
145 formats.push_back(format);
146 OnSupportedFormats(formats);
147 }
148 }
149
150 void MediaStreamRemoteVideoSource::DoRenderFrameOnMainThread(
151 scoped_refptr<media::VideoFrame> video_frame) {
152 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
153 DeliverVideoFrame(video_frame);
154 }
155
156 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698