1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CONTENT_RENDERER_MEDIA_VIDEO_SOURCE_HANDLER_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CONTENT_RENDERER_MEDIA_VIDEO_SOURCE_HANDLER_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/gtest_prod_util.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/threading/thread_checker.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/content_export.h" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "media/base/video_frame.h" 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content { 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MediaStreamRegistryInterface; 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MediaStreamVideoSink; 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PpFrameReceiver; 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Interface used by the effects pepper plugin to get captured frame 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from the video track. 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CONTENT_EXPORT FrameReaderInterface { 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Got a new captured frame. 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool GotFrame(const scoped_refptr<media::VideoFrame>& frame) = 0; 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~FrameReaderInterface() {} 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// VideoSourceHandler is a glue class between MediaStreamVideoTrack and 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the effects pepper plugin host. 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CONTENT_EXPORT VideoSourceHandler { 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |registry| is used to look up the media stream by url. If a NULL |registry| 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // is given, the global blink::WebMediaStreamRegistry will be used. 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit VideoSourceHandler(MediaStreamRegistryInterface* registry); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~VideoSourceHandler(); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Connects to the first video track in the MediaStream specified by |url| and 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the received frames will be delivered via |reader|. 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns true on success and false on failure. 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Open(const std::string& url, FrameReaderInterface* reader); 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Closes |reader|'s connection with the video track, i.e. stops receiving 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // frames from the video track. 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns true on success and false on failure. 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool Close(FrameReaderInterface* reader); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(VideoSourceHandlerTest, OpenClose); 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct SourceInfo { 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SourceInfo(const blink::WebMediaStreamTrack& blink_track, 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameReaderInterface* reader); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ~SourceInfo(); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<PpFrameReceiver> receiver_; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef std::map<FrameReaderInterface*, SourceInfo*> SourceInfoMap; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Deliver VideoFrame to the MediaStreamVideoSink associated with 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |reader|. For testing only. 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void DeliverFrameForTesting(FrameReaderInterface* reader, 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const scoped_refptr<media::VideoFrame>& frame); 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebMediaStreamTrack GetFirstVideoTrack(const std::string& url); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MediaStreamRegistryInterface* registry_; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SourceInfoMap reader_to_receiver_; 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::ThreadChecker thread_checker_; 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VideoSourceHandler); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace content 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // CONTENT_RENDERER_MEDIA_VIDEO_SOURCE_HANDLER_H_ 85