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