1// Copyright 2014 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_PEPPER_PEPPER_MEDIA_STREAM_VIDEO_TRACK_HOST_H_
6#define CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_STREAM_VIDEO_TRACK_HOST_H_
7
8#include "base/compiler_specific.h"
9#include "base/memory/weak_ptr.h"
10#include "content/public/renderer/media_stream_video_sink.h"
11#include "content/renderer/media/media_stream_video_source.h"
12#include "content/renderer/pepper/pepper_media_stream_track_host_base.h"
13#include "media/base/video_frame.h"
14#include "ppapi/c/ppb_video_frame.h"
15#include "ppapi/shared_impl/media_stream_video_track_shared.h"
16#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
17#include "ui/gfx/size.h"
18
19namespace content {
20
21class PepperMediaStreamVideoTrackHost : public PepperMediaStreamTrackHostBase,
22                                        public MediaStreamVideoSink,
23                                        public MediaStreamVideoSource {
24 public:
25  // Input mode constructor.
26  // In input mode, this class passes video frames from |track| to the
27  // associated pepper plugin.
28  PepperMediaStreamVideoTrackHost(RendererPpapiHost* host,
29                                  PP_Instance instance,
30                                  PP_Resource resource,
31                                  const blink::WebMediaStreamTrack& track);
32
33  // Output mode constructor.
34  // In output mode, this class passes video frames from the associated
35  // pepper plugin to a newly created blink::WebMediaStreamTrack.
36  PepperMediaStreamVideoTrackHost(RendererPpapiHost* host,
37                                  PP_Instance instance,
38                                  PP_Resource resource);
39
40  virtual bool IsMediaStreamVideoTrackHost() OVERRIDE;
41
42  blink::WebMediaStreamTrack track() { return track_; }
43
44 private:
45
46  virtual ~PepperMediaStreamVideoTrackHost();
47
48  void InitBuffers();
49
50  // PepperMediaStreamTrackHostBase overrides:
51  virtual void OnClose() OVERRIDE;
52  virtual int32_t OnHostMsgEnqueueBuffer(
53      ppapi::host::HostMessageContext* context, int32_t index) OVERRIDE;
54
55  // Sends frame with |index| to |track_|.
56  int32_t SendFrameToTrack(int32_t index);
57
58  void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame,
59                    const media::VideoCaptureFormat& format,
60                    const base::TimeTicks& estimated_capture_time);
61
62  // MediaStreamVideoSource overrides:
63  virtual void GetCurrentSupportedFormats(
64      int max_requested_width,
65      int max_requested_height,
66      double max_requested_frame_rate,
67      const VideoCaptureDeviceFormatsCB& callback) OVERRIDE;
68
69  virtual void StartSourceImpl(
70      const media::VideoCaptureFormat& format,
71      const VideoCaptureDeliverFrameCB& frame_callback) OVERRIDE;
72
73  virtual void StopSourceImpl() OVERRIDE;
74
75  // ResourceHost overrides:
76  virtual void DidConnectPendingHostToResource() OVERRIDE;
77
78  // ResourceMessageHandler overrides:
79  virtual int32_t OnResourceMessageReceived(
80      const IPC::Message& msg,
81      ppapi::host::HostMessageContext* context) OVERRIDE;
82
83  // Message handlers:
84  int32_t OnHostMsgConfigure(
85      ppapi::host::HostMessageContext* context,
86      const ppapi::MediaStreamVideoTrackShared::Attributes& attributes);
87
88  void InitBlinkTrack();
89  void OnTrackStarted(MediaStreamSource* source,
90                      MediaStreamRequestResult result,
91                      const blink::WebString& result_name);
92
93  blink::WebMediaStreamTrack track_;
94
95  // True if it has been added to |blink::WebMediaStreamTrack| as a sink.
96  bool connected_;
97
98  // Number of buffers.
99  int32_t number_of_buffers_;
100
101  // Size of frames which are received from MediaStreamVideoSink.
102  gfx::Size source_frame_size_;
103
104  // Plugin specified frame size.
105  gfx::Size plugin_frame_size_;
106
107  // Format of frames which are received from MediaStreamVideoSink.
108  PP_VideoFrame_Format source_frame_format_;
109
110  // Plugin specified frame format.
111  PP_VideoFrame_Format plugin_frame_format_;
112
113  // The size of frame pixels in bytes.
114  uint32_t frame_data_size_;
115
116  // TODO(ronghuawu): Remove |type_| and split PepperMediaStreamVideoTrackHost
117  // into 2 classes for read and write.
118  TrackType type_;
119  bool output_started_;
120
121  // Internal class used for delivering video frames on the IO-thread to
122  // the MediaStreamVideoSource implementation.
123  class FrameDeliverer;
124  scoped_refptr<FrameDeliverer> frame_deliverer_;
125
126  base::WeakPtrFactory<PepperMediaStreamVideoTrackHost> weak_factory_;
127
128  DISALLOW_COPY_AND_ASSIGN(PepperMediaStreamVideoTrackHost);
129};
130
131}  // namespace content
132
133#endif  // CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_STREAM_VIDEO_TRACK_HOST_H_
134