1 // Copyright (c) 2014 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.
5 #ifndef CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_DECODER_HOST_H_
6 #define CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_DECODER_HOST_H_
11 #include "base/basictypes.h"
12 #include "base/containers/hash_tables.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/scoped_vector.h"
15 #include "content/common/content_export.h"
16 #include "media/video/video_decode_accelerator.h"
17 #include "ppapi/c/pp_codecs.h"
18 #include "ppapi/host/host_message_context.h"
19 #include "ppapi/host/resource_host.h"
20 #include "ppapi/proxy/resource_message_params.h"
28 class PPB_Graphics3D_Impl
;
29 class RendererPpapiHost
;
31 class VideoDecoderShim
;
33 class CONTENT_EXPORT PepperVideoDecoderHost
34 : public ppapi::host::ResourceHost
,
35 public media::VideoDecodeAccelerator::Client
{
37 PepperVideoDecoderHost(RendererPpapiHost
* host
,
39 PP_Resource resource
);
40 virtual ~PepperVideoDecoderHost();
43 struct PendingDecode
{
44 PendingDecode(uint32_t shm_id
,
45 const ppapi::host::ReplyMessageContext
& reply_context
);
48 const uint32_t shm_id
;
49 const ppapi::host::ReplyMessageContext reply_context
;
52 friend class VideoDecoderShim
;
54 // ResourceHost implementation.
55 virtual int32_t OnResourceMessageReceived(
56 const IPC::Message
& msg
,
57 ppapi::host::HostMessageContext
* context
) OVERRIDE
;
59 // media::VideoDecodeAccelerator::Client implementation.
60 virtual void ProvidePictureBuffers(uint32 requested_num_of_buffers
,
61 const gfx::Size
& dimensions
,
62 uint32 texture_target
) OVERRIDE
;
63 virtual void DismissPictureBuffer(int32 picture_buffer_id
) OVERRIDE
;
64 virtual void PictureReady(const media::Picture
& picture
) OVERRIDE
;
65 virtual void NotifyEndOfBitstreamBuffer(int32 bitstream_buffer_id
) OVERRIDE
;
66 virtual void NotifyFlushDone() OVERRIDE
;
67 virtual void NotifyResetDone() OVERRIDE
;
68 virtual void NotifyError(media::VideoDecodeAccelerator::Error error
) OVERRIDE
;
70 int32_t OnHostMsgInitialize(ppapi::host::HostMessageContext
* context
,
71 const ppapi::HostResource
& graphics_context
,
72 PP_VideoProfile profile
,
73 PP_HardwareAcceleration acceleration
);
74 int32_t OnHostMsgGetShm(ppapi::host::HostMessageContext
* context
,
77 int32_t OnHostMsgDecode(ppapi::host::HostMessageContext
* context
,
81 int32_t OnHostMsgAssignTextures(ppapi::host::HostMessageContext
* context
,
83 const std::vector
<uint32_t>& texture_ids
);
84 int32_t OnHostMsgRecyclePicture(ppapi::host::HostMessageContext
* context
,
86 int32_t OnHostMsgFlush(ppapi::host::HostMessageContext
* context
);
87 int32_t OnHostMsgReset(ppapi::host::HostMessageContext
* context
);
89 // These methods are needed by VideoDecodeShim, to look like a
90 // VideoDecodeAccelerator.
91 void OnInitializeComplete(int32_t result
);
92 const uint8_t* DecodeIdToAddress(uint32_t decode_id
);
93 void RequestTextures(uint32 requested_num_of_buffers
,
94 const gfx::Size
& dimensions
,
95 uint32 texture_target
,
96 const std::vector
<gpu::Mailbox
>& mailboxes
);
98 // Non-owning pointer.
99 RendererPpapiHost
* renderer_ppapi_host_
;
101 scoped_ptr
<media::VideoDecodeAccelerator
> decoder_
;
103 // A vector holding our shm buffers, in sync with a similar vector in the
104 // resource. We use a buffer's index in these vectors as its id on both sides
105 // of the proxy. Only add buffers or update them in place so as not to
106 // invalidate these ids.
107 ScopedVector
<base::SharedMemory
> shm_buffers_
;
108 // A vector of true/false indicating if a shm buffer is in use by the decoder.
109 // This is parallel to |shm_buffers_|.
110 std::vector
<uint8_t> shm_buffer_busy_
;
112 // Maps decode uid to PendingDecode info.
113 typedef base::hash_map
<int32_t, PendingDecode
> PendingDecodeMap
;
114 PendingDecodeMap pending_decodes_
;
116 ppapi::host::ReplyMessageContext flush_reply_context_
;
117 ppapi::host::ReplyMessageContext reset_reply_context_
;
118 // Only used when in software fallback mode.
119 ppapi::host::ReplyMessageContext initialize_reply_context_
;
123 DISALLOW_COPY_AND_ASSIGN(PepperVideoDecoderHost
);
126 } // namespace content
128 #endif // CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_DECODER_HOST_H_