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

Side by Side Diff: content/renderer/media/video_source_handler.cc

Issue 264363005: Cast: deliver video frames on the IO thread (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: style nits Created 6 years, 7 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
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/video_source_handler.h" 5 #include "content/renderer/media/video_source_handler.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/weak_ptr.h"
10 #include "base/synchronization/lock.h" 11 #include "base/synchronization/lock.h"
11 #include "content/public/renderer/media_stream_video_sink.h" 12 #include "content/public/renderer/media_stream_video_sink.h"
12 #include "content/renderer/media/media_stream.h" 13 #include "content/renderer/media/media_stream.h"
13 #include "content/renderer/media/media_stream_registry_interface.h" 14 #include "content/renderer/media/media_stream_registry_interface.h"
15 #include "media/base/bind_to_current_loop.h"
14 #include "third_party/WebKit/public/platform/WebMediaStream.h" 16 #include "third_party/WebKit/public/platform/WebMediaStream.h"
15 #include "third_party/WebKit/public/platform/WebURL.h" 17 #include "third_party/WebKit/public/platform/WebURL.h"
16 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" 18 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h"
17 #include "url/gurl.h" 19 #include "url/gurl.h"
18 20
19 namespace content { 21 namespace content {
20 22
21 // PpFrameReceiver implements MediaStreamVideoSink so that it can be attached 23 // PpFrameReceiver implements MediaStreamVideoSink so that it can be attached
22 // to video track to receive the captured frame. 24 // to video track to receive the captured frame.
23 // It can be attached to a FrameReaderInterface to output the received frame. 25 // It can be attached to a FrameReaderInterface to output the received frame.
24 class PpFrameReceiver : public MediaStreamVideoSink { 26 class PpFrameReceiver : public MediaStreamVideoSink {
25 public: 27 public:
26 PpFrameReceiver() : reader_(NULL) {} 28 PpFrameReceiver(blink::WebMediaStreamTrack track)
29 : track_(track),
30 reader_(NULL),
31 weak_factory_(this) {
32 }
33
27 virtual ~PpFrameReceiver() {} 34 virtual ~PpFrameReceiver() {}
28 35
29 // Implements MediaStreamVideoSink. 36 void SetReader(FrameReaderInterface* reader) {
30 virtual void OnVideoFrame( 37 if (reader) {
31 const scoped_refptr<media::VideoFrame>& frame) OVERRIDE { 38 DCHECK(!reader_);
32 base::AutoLock auto_lock(lock_); 39 MediaStreamVideoSink::AddToVideoTrack(
40 this,
41 media::BindToCurrentLoop(
42 base::Bind(
43 &PpFrameReceiver::OnVideoFrame,
44 weak_factory_.GetWeakPtr())),
45 track_);
46 } else {
47 DCHECK(reader_);
48 MediaStreamVideoSink::RemoveFromVideoTrack(this, track_);
49 weak_factory_.InvalidateWeakPtrs();
50 }
51 reader_ = reader;
52 }
53
54 void OnVideoFrame(
55 const scoped_refptr<media::VideoFrame>& frame,
56 const media::VideoCaptureFormat& format) {
33 if (reader_) { 57 if (reader_) {
34 reader_->GotFrame(frame); 58 reader_->GotFrame(frame);
35 } 59 }
36 } 60 }
37 61
38 void SetReader(FrameReaderInterface* reader) {
39 base::AutoLock auto_lock(lock_);
40 reader_ = reader;
41 }
42
43 private: 62 private:
63 blink::WebMediaStreamTrack track_;
44 FrameReaderInterface* reader_; 64 FrameReaderInterface* reader_;
45 base::Lock lock_; 65 base::WeakPtrFactory<PpFrameReceiver> weak_factory_;
46 66
47 DISALLOW_COPY_AND_ASSIGN(PpFrameReceiver); 67 DISALLOW_COPY_AND_ASSIGN(PpFrameReceiver);
48 }; 68 };
49 69
50 VideoSourceHandler::VideoSourceHandler( 70 VideoSourceHandler::VideoSourceHandler(
51 MediaStreamRegistryInterface* registry) 71 MediaStreamRegistryInterface* registry)
52 : registry_(registry) { 72 : registry_(registry) {
53 } 73 }
54 74
55 VideoSourceHandler::~VideoSourceHandler() { 75 VideoSourceHandler::~VideoSourceHandler() {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 stream.videoTracks(video_tracks); 122 stream.videoTracks(video_tracks);
103 if (video_tracks.isEmpty()) { 123 if (video_tracks.isEmpty()) {
104 LOG(ERROR) << "GetFirstVideoSource - non video tracks available." 124 LOG(ERROR) << "GetFirstVideoSource - non video tracks available."
105 << " url: " << url; 125 << " url: " << url;
106 return blink::WebMediaStreamTrack(); 126 return blink::WebMediaStreamTrack();
107 } 127 }
108 128
109 return video_tracks[0]; 129 return video_tracks[0];
110 } 130 }
111 131
112 MediaStreamVideoSink* VideoSourceHandler::GetReceiver( 132 void VideoSourceHandler::DeliverFrameForTesting(
113 FrameReaderInterface* reader) { 133 FrameReaderInterface* reader,
134 const scoped_refptr<media::VideoFrame>& frame) {
114 SourceInfoMap::iterator it = reader_to_receiver_.find(reader); 135 SourceInfoMap::iterator it = reader_to_receiver_.find(reader);
115 if (it == reader_to_receiver_.end()) { 136 if (it == reader_to_receiver_.end()) {
116 return NULL; 137 return;
117 } 138 }
118 return it->second->receiver_.get(); 139 PpFrameReceiver* receiver = it->second->receiver_.get();
140 receiver->OnVideoFrame(frame, media::VideoCaptureFormat());
119 } 141 }
120 142
121 VideoSourceHandler::SourceInfo::SourceInfo( 143 VideoSourceHandler::SourceInfo::SourceInfo(
122 const blink::WebMediaStreamTrack& blink_track, 144 const blink::WebMediaStreamTrack& blink_track,
123 FrameReaderInterface* reader) 145 FrameReaderInterface* reader)
124 : receiver_(new PpFrameReceiver()), 146 : receiver_(new PpFrameReceiver(blink_track)) {
125 track_(blink_track) {
126 MediaStreamVideoSink::AddToVideoTrack(receiver_.get(), track_);
127 receiver_->SetReader(reader); 147 receiver_->SetReader(reader);
128 } 148 }
129 149
130 VideoSourceHandler::SourceInfo::~SourceInfo() { 150 VideoSourceHandler::SourceInfo::~SourceInfo() {
131 MediaStreamVideoSink::RemoveFromVideoTrack(receiver_.get(), track_);
132 receiver_->SetReader(NULL); 151 receiver_->SetReader(NULL);
133 } 152 }
134 153
135 } // namespace content 154 } // namespace content
136
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698