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 17 namespace content { 18 19 class PeerConnectionDependencyFactory; 20 class MediaStreamRegistryInterface; 21 class PPB_ImageData_Impl; 22 23 // Interface used by the effects pepper plugin to output the processed frame 24 // to the video track. 25 class 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. 38 class 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. 73 class 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