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

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: upload again 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"
16 #include "media/video/capture/video_capture_types.h"
14 #include "third_party/WebKit/public/platform/WebMediaStream.h" 17 #include "third_party/WebKit/public/platform/WebMediaStream.h"
15 #include "third_party/WebKit/public/platform/WebURL.h" 18 #include "third_party/WebKit/public/platform/WebURL.h"
16 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" 19 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h"
17 #include "url/gurl.h" 20 #include "url/gurl.h"
18 21
19 namespace content { 22 namespace content {
20 23
21 // PpFrameReceiver implements MediaStreamVideoSink so that it can be attached 24 // PpFrameReceiver implements MediaStreamVideoSink so that it can be attached
22 // to video track to receive the captured frame. 25 // to video track to receive the captured frame.
23 // It can be attached to a FrameReaderInterface to output the received frame. 26 // It can be attached to a FrameReaderInterface to output the received frame.
24 class PpFrameReceiver : public MediaStreamVideoSink { 27 class PpFrameReceiver : public MediaStreamVideoSink {
25 public: 28 public:
26 PpFrameReceiver() : reader_(NULL) {} 29 PpFrameReceiver(blink::WebMediaStreamTrack track)
30 : track_(track),
31 reader_(NULL),
32 weak_factory_(this) {
33 }
34
27 virtual ~PpFrameReceiver() {} 35 virtual ~PpFrameReceiver() {}
28 36
29 // Implements MediaStreamVideoSink. 37 void SetReader(FrameReaderInterface* reader) {
30 virtual void OnVideoFrame( 38 if (reader) {
31 const scoped_refptr<media::VideoFrame>& frame) OVERRIDE { 39 DCHECK(!reader_);
32 base::AutoLock auto_lock(lock_); 40 MediaStreamVideoSink::AddToVideoTrack(
41 this,
42 media::BindToCurrentLoop(
43 base::Bind(
44 &PpFrameReceiver::OnVideoFrame,
45 weak_factory_.GetWeakPtr())),
46 track_);
47 } else {
48 DCHECK(reader_);
49 MediaStreamVideoSink::RemoveFromVideoTrack(this, track_);
50 weak_factory_.InvalidateWeakPtrs();
51 }
52 reader_ = reader;
53 }
54
55 void OnVideoFrame(
56 const scoped_refptr<media::VideoFrame>& frame,
57 const media::VideoCaptureFormat& format) {
33 if (reader_) { 58 if (reader_) {
Ronghua Wu (Left Chromium) 2014/05/08 21:32:14 OnVideoFrame is called from the io thread, and Set
Alpha Left Google 2014/05/08 21:48:41 OnVideoFrame is *NOT* called on the IO thread beca
Ronghua Wu (Left Chromium) 2014/05/08 22:00:04 ic
34 reader_->GotFrame(frame); 59 reader_->GotFrame(frame);
35 } 60 }
36 } 61 }
37 62
38 void SetReader(FrameReaderInterface* reader) {
39 base::AutoLock auto_lock(lock_);
40 reader_ = reader;
41 }
42
43 private: 63 private:
64 blink::WebMediaStreamTrack track_;
44 FrameReaderInterface* reader_; 65 FrameReaderInterface* reader_;
45 base::Lock lock_; 66 base::WeakPtrFactory<PpFrameReceiver> weak_factory_;
46 67
47 DISALLOW_COPY_AND_ASSIGN(PpFrameReceiver); 68 DISALLOW_COPY_AND_ASSIGN(PpFrameReceiver);
48 }; 69 };
49 70
50 VideoSourceHandler::VideoSourceHandler( 71 VideoSourceHandler::VideoSourceHandler(
51 MediaStreamRegistryInterface* registry) 72 MediaStreamRegistryInterface* registry)
52 : registry_(registry) { 73 : registry_(registry) {
53 } 74 }
54 75
55 VideoSourceHandler::~VideoSourceHandler() { 76 VideoSourceHandler::~VideoSourceHandler() {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 stream.videoTracks(video_tracks); 123 stream.videoTracks(video_tracks);
103 if (video_tracks.isEmpty()) { 124 if (video_tracks.isEmpty()) {
104 LOG(ERROR) << "GetFirstVideoSource - non video tracks available." 125 LOG(ERROR) << "GetFirstVideoSource - non video tracks available."
105 << " url: " << url; 126 << " url: " << url;
106 return blink::WebMediaStreamTrack(); 127 return blink::WebMediaStreamTrack();
107 } 128 }
108 129
109 return video_tracks[0]; 130 return video_tracks[0];
110 } 131 }
111 132
112 MediaStreamVideoSink* VideoSourceHandler::GetReceiver( 133 void VideoSourceHandler::DeliverFrameForTesting(
113 FrameReaderInterface* reader) { 134 FrameReaderInterface* reader,
135 const scoped_refptr<media::VideoFrame>& frame) {
114 SourceInfoMap::iterator it = reader_to_receiver_.find(reader); 136 SourceInfoMap::iterator it = reader_to_receiver_.find(reader);
115 if (it == reader_to_receiver_.end()) { 137 if (it == reader_to_receiver_.end()) {
116 return NULL; 138 return;
117 } 139 }
118 return it->second->receiver_.get(); 140 PpFrameReceiver* receiver = it->second->receiver_.get();
141 receiver->OnVideoFrame(frame, media::VideoCaptureFormat());
119 } 142 }
120 143
121 VideoSourceHandler::SourceInfo::SourceInfo( 144 VideoSourceHandler::SourceInfo::SourceInfo(
122 const blink::WebMediaStreamTrack& blink_track, 145 const blink::WebMediaStreamTrack& blink_track,
123 FrameReaderInterface* reader) 146 FrameReaderInterface* reader)
124 : receiver_(new PpFrameReceiver()), 147 : receiver_(new PpFrameReceiver(blink_track)) {
125 track_(blink_track) {
126 MediaStreamVideoSink::AddToVideoTrack(receiver_.get(), track_);
127 receiver_->SetReader(reader); 148 receiver_->SetReader(reader);
128 } 149 }
129 150
130 VideoSourceHandler::SourceInfo::~SourceInfo() { 151 VideoSourceHandler::SourceInfo::~SourceInfo() {
131 MediaStreamVideoSink::RemoveFromVideoTrack(receiver_.get(), track_);
132 receiver_->SetReader(NULL); 152 receiver_->SetReader(NULL);
133 } 153 }
134 154
135 } // namespace content 155 } // namespace content
136
OLDNEW
« no previous file with comments | « content/renderer/media/video_source_handler.h ('k') | content/renderer/media/video_source_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698