Home | History | Annotate | Download | only in media
      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 #ifndef CONTENT_RENDERER_MEDIA_VIDEO_SOURCE_HANDLER_H_
      6 #define CONTENT_RENDERER_MEDIA_VIDEO_SOURCE_HANDLER_H_
      7 
      8 #include <map>
      9 #include <string>
     10 
     11 #include "base/compiler_specific.h"
     12 #include "base/gtest_prod_util.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "base/threading/thread_checker.h"
     16 #include "content/common/content_export.h"
     17 #include "media/base/video_frame.h"
     18 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
     19 
     20 namespace content {
     21 
     22 class MediaStreamRegistryInterface;
     23 class MediaStreamVideoSink;
     24 class PpFrameReceiver;
     25 
     26 // Interface used by the effects pepper plugin to get captured frame
     27 // from the video track.
     28 class CONTENT_EXPORT FrameReaderInterface {
     29  public:
     30   // Got a new captured frame.
     31   virtual bool GotFrame(const scoped_refptr<media::VideoFrame>& frame) = 0;
     32 
     33  protected:
     34   virtual ~FrameReaderInterface() {}
     35 };
     36 
     37 // VideoSourceHandler is a glue class between MediaStreamVideoTrack and
     38 // the effects pepper plugin host.
     39 class CONTENT_EXPORT VideoSourceHandler {
     40  public:
     41   // |registry| is used to look up the media stream by url. If a NULL |registry|
     42   // is given, the global blink::WebMediaStreamRegistry will be used.
     43   explicit VideoSourceHandler(MediaStreamRegistryInterface* registry);
     44   virtual ~VideoSourceHandler();
     45   // Connects to the first video track in the MediaStream specified by |url| and
     46   // the received frames will be delivered via |reader|.
     47   // Returns true on success and false on failure.
     48   bool Open(const std::string& url, FrameReaderInterface* reader);
     49   // Closes |reader|'s connection with the video track, i.e. stops receiving
     50   // frames from the video track.
     51   // Returns true on success and false on failure.
     52   bool Close(FrameReaderInterface* reader);
     53 
     54  private:
     55   FRIEND_TEST_ALL_PREFIXES(VideoSourceHandlerTest, OpenClose);
     56 
     57   struct SourceInfo {
     58     SourceInfo(const blink::WebMediaStreamTrack& blink_track,
     59                FrameReaderInterface* reader);
     60     ~SourceInfo();
     61 
     62     scoped_ptr<PpFrameReceiver> receiver_;
     63   };
     64 
     65   typedef std::map<FrameReaderInterface*, SourceInfo*> SourceInfoMap;
     66 
     67   // Deliver VideoFrame to the MediaStreamVideoSink associated with
     68   // |reader|. For testing only.
     69   void DeliverFrameForTesting(FrameReaderInterface* reader,
     70                               const scoped_refptr<media::VideoFrame>& frame);
     71 
     72   blink::WebMediaStreamTrack GetFirstVideoTrack(const std::string& url);
     73 
     74   MediaStreamRegistryInterface* registry_;
     75   SourceInfoMap reader_to_receiver_;
     76 
     77   base::ThreadChecker thread_checker_;
     78 
     79   DISALLOW_COPY_AND_ASSIGN(VideoSourceHandler);
     80 };
     81 
     82 }  // namespace content
     83 
     84 #endif  // CONTENT_RENDERER_MEDIA_VIDEO_SOURCE_HANDLER_H_
     85