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_WEBRTC_VIDEO_DESTINATION_HANDLER_H_
6#define CONTENT_RENDERER_MEDIA_WEBRTC_VIDEO_DESTINATION_HANDLER_H_
7
8#include <string>
9#include <vector>
10
11#include "base/compiler_specific.h"
12#include "base/memory/weak_ptr.h"
13#include "content/common/content_export.h"
14#include "content/renderer/media/media_stream_video_source.h"
15#include "media/base/video_frame_pool.h"
16
17namespace content {
18
19class PeerConnectionDependencyFactory;
20class MediaStreamRegistryInterface;
21class PPB_ImageData_Impl;
22
23// Interface used by the effects pepper plugin to output the processed frame
24// to the video track.
25class CONTENT_EXPORT FrameWriterInterface {
26 public:
27  // The ownership of the |image_data| deosn't transfer. So the implementation
28  // of this interface should make a copy of the |image_data| before return.
29  virtual void PutFrame(PPB_ImageData_Impl* image_data,
30                        int64 time_stamp_ns) = 0;
31  virtual ~FrameWriterInterface() {}
32};
33
34// PpFrameWriter implements MediaStreamVideoSource and can therefore provide
35// video frames to MediaStreamVideoTracks. It also implements
36// FrameWriterInterface, which will be used by the effects pepper plugin to
37// inject the processed frame.
38class CONTENT_EXPORT PpFrameWriter
39    : NON_EXPORTED_BASE(public MediaStreamVideoSource),
40      public FrameWriterInterface,
41      NON_EXPORTED_BASE(public base::SupportsWeakPtr<PpFrameWriter>) {
42 public:
43  PpFrameWriter();
44  virtual ~PpFrameWriter();
45
46  // FrameWriterInterface implementation.
47  // This method will be called by the Pepper host from render thread.
48  virtual void PutFrame(PPB_ImageData_Impl* image_data,
49                        int64 time_stamp_ns) OVERRIDE;
50 protected:
51  // MediaStreamVideoSource implementation.
52  virtual void GetCurrentSupportedFormats(
53      int max_requested_width,
54      int max_requested_height,
55      double max_requested_frame_rate,
56      const VideoCaptureDeviceFormatsCB& callback) OVERRIDE;
57  virtual void StartSourceImpl(
58      const media::VideoCaptureFormat& format,
59      const VideoCaptureDeliverFrameCB& frame_callback) OVERRIDE;
60  virtual void StopSourceImpl() OVERRIDE;
61
62 private:
63  media::VideoFramePool frame_pool_;
64
65  class FrameWriterDelegate;
66  scoped_refptr<FrameWriterDelegate> delegate_;
67
68  DISALLOW_COPY_AND_ASSIGN(PpFrameWriter);
69};
70
71// VideoDestinationHandler is a glue class between the content MediaStream and
72// the effects pepper plugin host.
73class CONTENT_EXPORT VideoDestinationHandler {
74 public:
75  // Instantiates and adds a new video track to the MediaStream specified by
76  // |url|. Returns a handler for delivering frames to the new video track as
77  // |frame_writer|.
78  // If |registry| is NULL the global blink::WebMediaStreamRegistry will be
79  // used to look up the media stream.
80  // The caller of the function takes the ownership of |frame_writer|.
81  // Returns true on success and false on failure.
82  static bool Open(MediaStreamRegistryInterface* registry,
83                   const std::string& url,
84                   FrameWriterInterface** frame_writer);
85
86 private:
87  DISALLOW_COPY_AND_ASSIGN(VideoDestinationHandler);
88};
89
90}  // namespace content
91
92#endif  // CONTENT_RENDERER_MEDIA_VIDEO_DESTINATION_HANDLER_H_
93