| Index: content/renderer/media/video_source_handler.cc
|
| diff --git a/content/renderer/media/video_source_handler.cc b/content/renderer/media/video_source_handler.cc
|
| index 9882207965648871aadf24e17adb05c7c0833c4a..dabc9cc1326187d68262f19b76977180d8074ff0 100644
|
| --- a/content/renderer/media/video_source_handler.cc
|
| +++ b/content/renderer/media/video_source_handler.cc
|
| @@ -7,10 +7,13 @@
|
| #include <string>
|
|
|
| #include "base/logging.h"
|
| +#include "base/memory/weak_ptr.h"
|
| #include "base/synchronization/lock.h"
|
| #include "content/public/renderer/media_stream_video_sink.h"
|
| #include "content/renderer/media/media_stream.h"
|
| #include "content/renderer/media/media_stream_registry_interface.h"
|
| +#include "media/base/bind_to_current_loop.h"
|
| +#include "media/video/capture/video_capture_types.h"
|
| #include "third_party/WebKit/public/platform/WebMediaStream.h"
|
| #include "third_party/WebKit/public/platform/WebURL.h"
|
| #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h"
|
| @@ -23,26 +26,44 @@ namespace content {
|
| // It can be attached to a FrameReaderInterface to output the received frame.
|
| class PpFrameReceiver : public MediaStreamVideoSink {
|
| public:
|
| - PpFrameReceiver() : reader_(NULL) {}
|
| + PpFrameReceiver(blink::WebMediaStreamTrack track)
|
| + : track_(track),
|
| + reader_(NULL),
|
| + weak_factory_(this) {
|
| + }
|
| +
|
| virtual ~PpFrameReceiver() {}
|
|
|
| - // Implements MediaStreamVideoSink.
|
| - virtual void OnVideoFrame(
|
| - const scoped_refptr<media::VideoFrame>& frame) OVERRIDE {
|
| - base::AutoLock auto_lock(lock_);
|
| - if (reader_) {
|
| - reader_->GotFrame(frame);
|
| + void SetReader(FrameReaderInterface* reader) {
|
| + if (reader) {
|
| + DCHECK(!reader_);
|
| + MediaStreamVideoSink::AddToVideoTrack(
|
| + this,
|
| + media::BindToCurrentLoop(
|
| + base::Bind(
|
| + &PpFrameReceiver::OnVideoFrame,
|
| + weak_factory_.GetWeakPtr())),
|
| + track_);
|
| + } else {
|
| + DCHECK(reader_);
|
| + MediaStreamVideoSink::RemoveFromVideoTrack(this, track_);
|
| + weak_factory_.InvalidateWeakPtrs();
|
| }
|
| + reader_ = reader;
|
| }
|
|
|
| - void SetReader(FrameReaderInterface* reader) {
|
| - base::AutoLock auto_lock(lock_);
|
| - reader_ = reader;
|
| + void OnVideoFrame(
|
| + const scoped_refptr<media::VideoFrame>& frame,
|
| + const media::VideoCaptureFormat& format) {
|
| + if (reader_) {
|
| + reader_->GotFrame(frame);
|
| + }
|
| }
|
|
|
| private:
|
| + blink::WebMediaStreamTrack track_;
|
| FrameReaderInterface* reader_;
|
| - base::Lock lock_;
|
| + base::WeakPtrFactory<PpFrameReceiver> weak_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(PpFrameReceiver);
|
| };
|
| @@ -109,28 +130,26 @@ blink::WebMediaStreamTrack VideoSourceHandler::GetFirstVideoTrack(
|
| return video_tracks[0];
|
| }
|
|
|
| -MediaStreamVideoSink* VideoSourceHandler::GetReceiver(
|
| - FrameReaderInterface* reader) {
|
| +void VideoSourceHandler::DeliverFrameForTesting(
|
| + FrameReaderInterface* reader,
|
| + const scoped_refptr<media::VideoFrame>& frame) {
|
| SourceInfoMap::iterator it = reader_to_receiver_.find(reader);
|
| if (it == reader_to_receiver_.end()) {
|
| - return NULL;
|
| + return;
|
| }
|
| - return it->second->receiver_.get();
|
| + PpFrameReceiver* receiver = it->second->receiver_.get();
|
| + receiver->OnVideoFrame(frame, media::VideoCaptureFormat());
|
| }
|
|
|
| VideoSourceHandler::SourceInfo::SourceInfo(
|
| const blink::WebMediaStreamTrack& blink_track,
|
| FrameReaderInterface* reader)
|
| - : receiver_(new PpFrameReceiver()),
|
| - track_(blink_track) {
|
| - MediaStreamVideoSink::AddToVideoTrack(receiver_.get(), track_);
|
| + : receiver_(new PpFrameReceiver(blink_track)) {
|
| receiver_->SetReader(reader);
|
| }
|
|
|
| VideoSourceHandler::SourceInfo::~SourceInfo() {
|
| - MediaStreamVideoSink::RemoveFromVideoTrack(receiver_.get(), track_);
|
| receiver_->SetReader(NULL);
|
| }
|
|
|
| } // namespace content
|
| -
|
|
|