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

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

Powered by Google App Engine
This is Rietveld 408576698