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

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

Issue 14312015: Effects Pepper Plugin and MediaStream Glue. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 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
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "content/renderer/media/video_source_handler.h"
6
7 #include <string>
8
9 #include "base/logging.h"
10 #include "content/renderer/media/media_stream_dependency_factory.h"
11 #include "content/renderer/render_thread_impl.h"
12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaStreamRegistr y.h"
13
14 using cricket::VideoFrame;
15 using cricket::VideoRenderer;
16 using webrtc::VideoSourceInterface;
17
18 namespace content {
19
20 // PpFrameReceiver implements cricket::VideoRenderer so that it can be attached
21 // to native video track's video source to receive the captured frame.
22 // It can be attached to a FrameReaderInterface to output the received frame.
23 class CONTENT_EXPORT PpFrameReceiver
24 : public NON_EXPORTED_BASE(cricket::VideoRenderer) {
25 public:
26 PpFrameReceiver() : reader_(NULL) {}
27 virtual ~PpFrameReceiver() {}
28
29 // Implements VideoRenderer.
30 virtual bool SetSize(int width, int height, int reserved) OVERRIDE {
31 return true;
32 }
33 virtual bool RenderFrame(const cricket::VideoFrame* frame) OVERRIDE {
34 base::AutoLock auto_lock(lock_);
35 if (reader_) {
36 // Make a shallow copy of the frame as the |reader_| may need to queue it.
37 // Both frames will share a single reference-counted frame buffer.
38 reader_->GotFrame(frame->Copy());
39 }
40 return true;
41 }
42
43 void SetReader(FrameReaderInterface* reader) {
44 base::AutoLock auto_lock(lock_);
45 reader_ = reader;
46 }
47
48 private:
49 FrameReaderInterface* reader_;
50 base::Lock lock_;
51
52 DISALLOW_COPY_AND_ASSIGN(PpFrameReceiver);
53 };
54
55 VideoSourceHandler::VideoSourceHandler(
56 MediaStreamDependencyFactory* factory,
57 MediaStreamRegistryInterface* registry)
58 : factory_(factory),
59 registry_(registry) {
60 ASSERT(factory_ != NULL);
61 }
62
63 bool VideoSourceHandler::Open(const std::string& url,
64 FrameReaderInterface* reader) {
65 scoped_refptr<webrtc::VideoSourceInterface> source = GetFirstVideoSource(url);
66 if (!source.get()) {
67 return false;
68 }
69 PpFrameReceiver* receiver = new PpFrameReceiver();
70 receiver->SetReader(reader);
71 source->AddSink(receiver);
72 reader_to_receiver_[reader] = receiver;
73 return true;
74 }
75
76 bool VideoSourceHandler::Close(const std::string& url,
77 FrameReaderInterface* reader) {
78 scoped_refptr<webrtc::VideoSourceInterface> source = GetFirstVideoSource(url);
79 if (!source.get()) {
80 LOG(ERROR) << "VideoSourceHandler::Close - Failed to get the video source "
81 << "from MediaStream with url: " << url;
82 return false;
83 }
84 PpFrameReceiver* receiver =
85 static_cast<PpFrameReceiver*>(GetReceiver(reader));
86 receiver->SetReader(NULL);
87 source->RemoveSink(receiver);
wjia(left Chromium) 2013/05/03 02:00:38 should receiver be removed from reader_to_receiver
Ronghua Wu (Left Chromium) 2013/05/03 05:37:28 It should. thanks. Added test as well.
88 return true;
89 }
90
91 scoped_refptr<VideoSourceInterface> VideoSourceHandler::GetFirstVideoSource(
92 const std::string& url) {
93 scoped_refptr<webrtc::VideoSourceInterface> source;
94 WebKit::WebMediaStream stream;
95 if (registry_) {
96 stream = registry_->GetMediaStream(url);
97 } else {
98 stream =
99 WebKit::WebMediaStreamRegistry::lookupMediaStreamDescriptor(GURL(url));
100 }
101 if (stream.isNull() || !stream.extraData()) {
102 LOG(ERROR) << "GetFirstVideoSource - invalid url: " << url;
103 return source;
104 }
105
106 // Get the first video track from the stream.
107 MediaStreamExtraData* extra_data =
108 static_cast<MediaStreamExtraData*>(stream.extraData());
109 if (!extra_data) {
110 LOG(ERROR) << "GetFirstVideoSource - MediaStreamExtraData is NULL.";
111 return source;
112 }
113 webrtc::MediaStreamInterface* native_stream = extra_data->stream();
114 if (!native_stream) {
115 LOG(ERROR) << "GetFirstVideoSource - native stream is NULL.";
116 return source;
117 }
118 webrtc::VideoTrackVector native_video_tracks =
119 native_stream->GetVideoTracks();
120 if (native_video_tracks.empty()) {
121 LOG(ERROR) << "GetFirstVideoSource - stream has no video track.";
122 return source;
123 }
124 source = native_video_tracks[0]->GetSource();
125 return source;
126 }
127
128 VideoRenderer* VideoSourceHandler::GetReceiver(
129 FrameReaderInterface* reader) {
130 std::map<FrameReaderInterface*, VideoRenderer*>::iterator it;
131 it = reader_to_receiver_.find(reader);
132 if (it == reader_to_receiver_.end()) {
133 return NULL;
134 }
135 return it->second;
136 }
137
138 } // namespace content
139
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698