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