12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_CAPTURE_HOST_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_CAPTURE_HOST_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/scoped_ptr.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/common/media/video_capture.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/renderer/renderer_ppapi_host.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/pepper/pepper_device_enumeration_host_helper.h" 14bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_buffer_impl.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/video/capture/video_capture_types.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/dev/ppp_video_capture_dev.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/host_message_context.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/resource_host.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace media { 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass VideoFrame; 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace media 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass PepperPlatformVideoCapture; 26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochclass RendererPpapiHostImpl; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass PepperVideoCaptureHost : public ppapi::host::ResourceHost { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 30bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PepperVideoCaptureHost(RendererPpapiHostImpl* host, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Resource resource); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PepperVideoCaptureHost(); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool Init(); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int32_t OnResourceMessageReceived( 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::Message& msg, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext* context) OVERRIDE; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // These methods are called by PepperPlatformVideoCapture only. 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Called when video capture is initialized. We can start 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // video capture if |succeeded| is true. 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnInitialized(bool succeeded); 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Called when video capture has started successfully. 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnStarted(); 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Called when video capture has stopped. There will be no more 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // frames delivered. 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnStopped(); 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Called when video capture has paused. 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnPaused(); 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Called when video capture cannot be started because of an error. 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnError(); 60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Called when a video frame is ready. 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnFrameReady(const scoped_refptr<media::VideoFrame>& frame, 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu media::VideoCaptureFormat format); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t OnOpen(ppapi::host::HostMessageContext* context, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_VideoCaptureDeviceInfo_Dev& requested_info, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t buffer_count); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t OnStartCapture(ppapi::host::HostMessageContext* context); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t OnReuseBuffer(ppapi::host::HostMessageContext* context, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t buffer); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t OnStopCapture(ppapi::host::HostMessageContext* context); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t OnClose(ppapi::host::HostMessageContext* context); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t StopCapture(); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t Close(); 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void PostErrorReply(); 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void AllocBuffers(const gfx::Size& resolution, int frame_rate); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReleaseBuffers(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SendStatus(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetRequestedInfo(const PP_VideoCaptureDeviceInfo_Dev& device_info, 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t buffer_count); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DetachPlatformVideoCapture(); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool SetStatus(PP_VideoCaptureStatus_Dev status, bool forced); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<PepperPlatformVideoCapture> platform_video_capture_; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Buffers of video frame. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct BufferInfo { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BufferInfo(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~BufferInfo(); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool in_use; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* data; 9958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PPB_Buffer_Impl> buffer; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RendererPpapiHostImpl* renderer_ppapi_host_; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::Size alloc_size_; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<BufferInfo> buffers_; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t buffer_count_hint_; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) media::VideoCaptureParams video_capture_params_; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_VideoCaptureStatus_Dev status_; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::ReplyMessageContext open_reply_context_; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PepperDeviceEnumerationHostHelper enumeration_helper_; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PepperVideoCaptureHost); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_CAPTURE_HOST_H_ 122