summaryrefslogtreecommitdiffstats
path: root/content/renderer
diff options
context:
space:
mode:
authorperkj@chromium.org <perkj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-28 13:18:58 +0000
committerperkj@chromium.org <perkj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-28 13:18:58 +0000
commit09b4f4288e6ac0320448137aad32422745f73f4d (patch)
tree35fb8d3d42810ec4c7142218525b32ffc0034c34 /content/renderer
parentf91ed8ab9b6c33c8adbb5a4f3fb3979730bf5bd4 (diff)
downloadchromium_src-09b4f4288e6ac0320448137aad32422745f73f4d.zip
chromium_src-09b4f4288e6ac0320448137aad32422745f73f4d.tar.gz
chromium_src-09b4f4288e6ac0320448137aad32422745f73f4d.tar.bz2
Make RTCVideoRenderer listen on events from VideoTrack.
Also render a small black frame when the state change to ended. BUG= 177476 TEST= Use the demo attached in https://code.google.com/p/webrtc/issues/detail?id=1389 and make sure audio is heard + 1. Start peerconnection_server and open https://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/webrtc/manual/peerconnection.html in two tabs. 2. In one tab - click Request user media, add the local stream and click negotiate. 3. Note that video is played out in the other tab. 4. In the first tab, click remove local stream and click negotiate. 5. Note that the video is not played out any more in the second tab. Review URL: https://chromiumcodereview.appspot.com/12319043 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@185233 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer')
-rw-r--r--content/renderer/media/rtc_video_renderer.cc24
-rw-r--r--content/renderer/media/rtc_video_renderer.h7
2 files changed, 29 insertions, 2 deletions
diff --git a/content/renderer/media/rtc_video_renderer.cc b/content/renderer/media/rtc_video_renderer.cc
index ddf1b25..6af00f9 100644
--- a/content/renderer/media/rtc_video_renderer.cc
+++ b/content/renderer/media/rtc_video_renderer.cc
@@ -38,9 +38,12 @@ void RTCVideoRenderer::Start() {
DCHECK(message_loop_proxy_->BelongsToCurrentThread());
DCHECK_EQ(state_, kStopped);
- if (video_track_)
+ if (video_track_) {
video_track_->AddRenderer(this);
+ video_track_->RegisterObserver(this);
+ }
state_ = kStarted;
+ MaybeRenderSignalingFrame();
}
void RTCVideoRenderer::Stop() {
@@ -48,6 +51,7 @@ void RTCVideoRenderer::Stop() {
if (video_track_) {
state_ = kStopped;
video_track_->RemoveRenderer(this);
+ video_track_->UnregisterObserver(this);
video_track_ = NULL;
}
}
@@ -95,6 +99,24 @@ void RTCVideoRenderer::RenderFrame(const cricket::VideoFrame* frame) {
this, video_frame));
}
+void RTCVideoRenderer::OnChanged() {
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ MaybeRenderSignalingFrame();
+}
+
+void RTCVideoRenderer::MaybeRenderSignalingFrame() {
+ // Render a small black frame if the track transition to ended.
+ // This is necessary to make sure audio can play if the video tag src is
+ // a MediaStream video track that has been rejected or ended.
+ if (video_track_->state() == webrtc::MediaStreamTrackInterface::kEnded) {
+ const int kMinFrameSize = 2;
+ const gfx::Size size(kMinFrameSize, kMinFrameSize);
+ scoped_refptr<media::VideoFrame> video_frame =
+ media::VideoFrame::CreateBlackFrame(size);
+ DoRenderFrameOnMainThread(video_frame);
+ }
+}
+
void RTCVideoRenderer::DoRenderFrameOnMainThread(
scoped_refptr<media::VideoFrame> video_frame) {
DCHECK(message_loop_proxy_->BelongsToCurrentThread());
diff --git a/content/renderer/media/rtc_video_renderer.h b/content/renderer/media/rtc_video_renderer.h
index 925e70b..ea0ac50 100644
--- a/content/renderer/media/rtc_video_renderer.h
+++ b/content/renderer/media/rtc_video_renderer.h
@@ -27,7 +27,8 @@ namespace content {
// Calls to webrtc::VideoTrackInterface must occur on the main thread.
class CONTENT_EXPORT RTCVideoRenderer
: NON_EXPORTED_BASE(public webkit_media::VideoFrameProvider),
- NON_EXPORTED_BASE(public webrtc::VideoRendererInterface) {
+ NON_EXPORTED_BASE(public webrtc::VideoRendererInterface),
+ NON_EXPORTED_BASE(public webrtc::ObserverInterface) {
public:
RTCVideoRenderer(
webrtc::VideoTrackInterface* video_track,
@@ -45,6 +46,9 @@ class CONTENT_EXPORT RTCVideoRenderer
virtual void SetSize(int width, int height) OVERRIDE;
virtual void RenderFrame(const cricket::VideoFrame* frame) OVERRIDE;
+ // webrtc::ObserverInterface implementation.
+ virtual void OnChanged() OVERRIDE;
+
protected:
virtual ~RTCVideoRenderer();
@@ -55,6 +59,7 @@ class CONTENT_EXPORT RTCVideoRenderer
kStopped,
};
+ void MaybeRenderSignalingFrame();
void DoRenderFrameOnMainThread(scoped_refptr<media::VideoFrame> video_frame);
base::Closure error_cb_;