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_PEPPER_PEPPER_VIDEO_SOURCE_HOST_H_
6#define CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_SOURCE_HOST_H_
7
8#include "base/compiler_specific.h"
9#include "base/memory/ref_counted.h"
10#include "base/memory/scoped_ptr.h"
11#include "base/memory/weak_ptr.h"
12#include "content/common/content_export.h"
13#include "content/renderer/media/video_source_handler.h"
14#include "ppapi/c/pp_time.h"
15#include "ppapi/c/ppb_image_data.h"
16#include "ppapi/host/host_message_context.h"
17#include "ppapi/host/resource_host.h"
18
19struct PP_ImageDataDesc;
20
21namespace content {
22
23class PPB_ImageData_Impl;
24class RendererPpapiHost;
25
26class CONTENT_EXPORT PepperVideoSourceHost : public ppapi::host::ResourceHost {
27 public:
28  PepperVideoSourceHost(RendererPpapiHost* host,
29                        PP_Instance instance,
30                        PP_Resource resource);
31
32  virtual ~PepperVideoSourceHost();
33
34  virtual int32_t OnResourceMessageReceived(
35      const IPC::Message& msg,
36      ppapi::host::HostMessageContext* context) OVERRIDE;
37
38 private:
39  // This helper object receives frames on a video worker thread and passes
40  // them on to us.
41  class FrameReceiver : public FrameReaderInterface,
42                        public base::RefCountedThreadSafe<FrameReceiver> {
43   public:
44    explicit FrameReceiver(const base::WeakPtr<PepperVideoSourceHost>& host);
45
46    // FrameReaderInterface implementation.
47    virtual bool GotFrame(const scoped_refptr<media::VideoFrame>& frame)
48        OVERRIDE;
49
50    void OnGotFrame(const scoped_refptr<media::VideoFrame>& frame);
51
52   private:
53    friend class base::RefCountedThreadSafe<FrameReceiver>;
54    virtual ~FrameReceiver();
55
56    base::WeakPtr<PepperVideoSourceHost> host_;
57    scoped_refptr<base::MessageLoopProxy> main_message_loop_proxy_;
58  };
59
60  friend class FrameReceiver;
61
62  int32_t OnHostMsgOpen(ppapi::host::HostMessageContext* context,
63                        const std::string& stream_url);
64  int32_t OnHostMsgGetFrame(ppapi::host::HostMessageContext* context);
65  int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context);
66
67  // Sends the reply to a GetFrame message from the plugin. A reply is always
68  // sent and last_frame_, reply_context_, and get_frame_pending_ are all reset.
69  void SendGetFrameReply();
70  // Sends the reply to a GetFrame message from the plugin in case of an error.
71  void SendGetFrameErrorReply(int32_t error);
72
73  void Close();
74
75  RendererPpapiHost* renderer_ppapi_host_;
76
77  ppapi::host::ReplyMessageContext reply_context_;
78
79  scoped_ptr<VideoSourceHandler> source_handler_;
80  scoped_refptr<FrameReceiver> frame_receiver_;
81  std::string stream_url_;
82  scoped_refptr<media::VideoFrame> last_frame_;
83  bool get_frame_pending_;
84  // We use only one ImageData resource in order to avoid allocating
85  // shared memory repeatedly. We send the same one each time the plugin
86  // requests a frame. For this to work, the plugin must finish using
87  // the ImageData it receives prior to calling GetFrame, and not access
88  // the ImageData until it gets its next callback to GetFrame.
89  scoped_refptr<PPB_ImageData_Impl> shared_image_;
90  PP_ImageDataDesc shared_image_desc_;
91
92  base::WeakPtrFactory<PepperVideoSourceHost> weak_factory_;
93
94  DISALLOW_COPY_AND_ASSIGN(PepperVideoSourceHost);
95};
96
97}  // namespace content
98
99#endif  // CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_SOURCE_HOST_H_
100