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