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