Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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. | |
| 4 | |
| 5 #ifndef CONTENT_RENDERER_PEPPER_VIDEO_DECODER_PROXY_H_ | |
| 6 #define CONTENT_RENDERER_PEPPER_VIDEO_DECODER_PROXY_H_ | |
| 7 | |
| 8 #include <queue> | |
| 9 #include <vector> | |
| 10 | |
| 11 #include "base/basictypes.h" | |
| 12 #include "base/containers/hash_tables.h" | |
| 13 #include "base/memory/scoped_ptr.h" | |
| 14 #include "base/memory/weak_ptr.h" | |
| 15 #include "base/message_loop/message_loop_proxy.h" | |
| 16 #include "gpu/command_buffer/common/mailbox.h" | |
| 17 #include "media/base/decoder_buffer.h" | |
| 18 #include "media/base/video_decoder.h" | |
| 19 #include "media/base/video_decoder_config.h" | |
| 20 | |
| 21 #include "ppapi/c/pp_codecs.h" | |
| 22 | |
| 23 namespace gpu { | |
| 24 namespace gles2 { | |
| 25 class GLES2Interface; | |
| 26 } | |
| 27 } | |
| 28 | |
| 29 namespace webkit { | |
| 30 namespace gpu { | |
| 31 class ContextProviderWebContext; | |
| 32 } | |
| 33 } | |
| 34 | |
| 35 namespace content { | |
| 36 | |
| 37 class PepperVideoDecoderHost; | |
| 38 | |
| 39 // This class proxies calls to a media::VideoDecoder on the media thread. | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
I think it is the case that this class is meant to
bbudge
2014/06/06 02:03:44
It would definitely simplify the host if this was
| |
| 40 // Instances should be constructed, used, and destructed on the main (render) | |
| 41 // thread. | |
| 42 class VideoDecoderProxy { | |
|
dmichael (off chromium)
2014/06/05 23:00:43
I can see why you used "Proxy", but I'm so used to
bbudge
2014/06/06 02:03:43
Adapter it is. Done.
| |
| 43 public: | |
| 44 explicit VideoDecoderProxy(PepperVideoDecoderHost* host); | |
| 45 | |
| 46 void Initialize(media::VideoCodecProfile profile); | |
| 47 void Decode(uint32_t decode_id, const uint8_t* buffer, uint32_t size); | |
| 48 void AssignTextures(const std::vector<uint32_t>& texture_ids); | |
| 49 void RecycleTexture(uint32_t texture_id); | |
| 50 void Flush(); | |
| 51 void Reset(); | |
| 52 void Destroy(); | |
| 53 | |
| 54 protected: | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
why not private?
bbudge
2014/06/06 02:03:43
Done.
| |
| 55 // Do not delete directly; use Destroy() or own it with a scoped_ptr, which | |
| 56 // will Destroy() it properly by default. | |
| 57 ~VideoDecoderProxy(); | |
| 58 | |
| 59 private: | |
| 60 enum State { | |
| 61 UNINITIALIZED, | |
| 62 DECODING, | |
| 63 FLUSHING, | |
| 64 RESETTING, | |
| 65 }; | |
| 66 | |
| 67 struct PendingDecode { | |
| 68 PendingDecode(uint32_t decode_id, | |
| 69 const scoped_refptr<media::DecoderBuffer>& buffer); | |
| 70 ~PendingDecode(); | |
| 71 | |
| 72 uint32_t decode_id; | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
Here and below, make const-able members const?
bbudge
2014/06/06 02:03:44
Done.
| |
| 73 scoped_refptr<media::DecoderBuffer> buffer; | |
| 74 }; | |
| 75 | |
| 76 struct PendingFrame { | |
| 77 PendingFrame(uint32_t decode_id, const gfx::Size& size); | |
| 78 ~PendingFrame(); | |
| 79 | |
| 80 uint32_t decode_id; | |
| 81 gfx::Size size; | |
| 82 std::vector<uint8_t> pixels; | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
rgba_pixels ?
(or comment on their colorspace)
bbudge
2014/06/06 02:03:43
Changed to argb_pixels, to match the conversion fu
| |
| 83 }; | |
| 84 | |
| 85 // This class is constructed on the main (render) thread, but used and | |
| 86 // destructed on the media thread. | |
| 87 class Delegate { | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
optional: here and above, can fwd-declare inner cl
bbudge
2014/06/06 02:03:44
Done.
| |
| 88 public: | |
| 89 Delegate(const base::WeakPtr<VideoDecoderProxy>& proxy); | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
explicit
bbudge
2014/06/06 02:03:43
Done.
| |
| 90 ~Delegate(); | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
private b/c Destroy?
bbudge
2014/06/06 02:03:43
Destroy is a misleading name here, since it doesn'
| |
| 91 | |
| 92 void Initialize(scoped_ptr<media::VideoDecoder> decoder, | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
decoder seems like a strange thing to pass to Init
bbudge
2014/06/06 02:03:43
Yeah, that works out well. Thanks.
| |
| 93 media::VideoDecoderConfig config); | |
| 94 void ReceiveBuffer(uint32_t decode_id, | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
I get that you want to distinguish between a calle
bbudge
2014/06/06 02:03:43
I eliminated the second method, and renamed this m
| |
| 95 scoped_refptr<media::DecoderBuffer> buffer); | |
| 96 void Decode(); | |
| 97 void Reset(); | |
| 98 void Destroy(); | |
| 99 | |
| 100 private: | |
| 101 void OnPipelineStatus(media::PipelineStatus status); | |
| 102 void ConvertFrame(uint32_t decode_id, | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
"convert"? From what to what?
doco please (here a
bbudge
2014/06/06 02:03:43
I changed some other method names, and now OnDecod
| |
| 103 media::VideoDecoder::Status status, | |
| 104 const scoped_refptr<media::VideoFrame>& frame); | |
| 105 void OnResetComplete(); | |
| 106 | |
| 107 base::WeakPtr<VideoDecoderProxy> proxy_; | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
// Bound to main_message_loop_.
bbudge
2014/06/06 02:03:43
I don't understand this comment. I construct and d
| |
| 108 scoped_ptr<media::VideoDecoder> decoder_; | |
| 109 scoped_refptr<base::MessageLoopProxy> main_message_loop_; | |
| 110 // Queue of decodes waiting for the decoder. | |
| 111 typedef std::queue<PendingDecode> PendingDecodeQueue; | |
| 112 PendingDecodeQueue pending_decodes_; | |
| 113 }; | |
| 114 | |
| 115 void OnPipelineStatus(media::PipelineStatus status); | |
| 116 void ReceiveFrame(media::VideoDecoder::Status status, | |
| 117 scoped_ptr<PendingFrame> frame); | |
| 118 void SendPictures(); | |
| 119 void OnResetComplete(); | |
| 120 void OnDestroyComplete(); | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
Not implemented (and thank goodness, because what
bbudge
2014/06/06 02:03:43
Left over from previous patchset. Removed.
| |
| 121 void DismissTexture(uint32_t texture_id); | |
| 122 void DeleteTexture(uint32_t texture_id); | |
| 123 void FlushCommandBuffer(); | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
doco should say when it is required to call this (
bbudge
2014/06/06 02:03:43
Done.
| |
| 124 | |
| 125 scoped_ptr<Delegate> delegate_; | |
| 126 State state_; | |
| 127 | |
| 128 PepperVideoDecoderHost* host_; | |
| 129 scoped_refptr<base::MessageLoopProxy> media_message_loop_; | |
| 130 scoped_refptr<webkit::gpu::ContextProviderWebContext> context_provider_; | |
| 131 | |
| 132 // The current decoded frame size. | |
| 133 gfx::Size texture_size_; | |
| 134 // Map that takes the plugin's GL texture id to the renderer's GL texture id. | |
| 135 typedef base::hash_map<uint32_t, uint32_t> TextureIdMap; | |
| 136 TextureIdMap texture_id_map_; | |
| 137 // Available textures (these are plugin ids.) | |
| 138 std::vector<uint32_t> available_textures_; | |
| 139 // Track textures that are no longer needed (these are plugin ids.) | |
| 140 typedef base::hash_set<uint32_t> TextureIdSet; | |
| 141 TextureIdSet textures_to_dismiss_; | |
| 142 // Mailboxes for pending texture requests, to write to plugin's textures. | |
| 143 std::vector<gpu::Mailbox> pending_texture_mailboxes_; | |
| 144 // Queue of pending decoded frames. These have been converted to RGB, and | |
| 145 // await upload to a GL texture. | |
| 146 typedef std::queue<PendingFrame*> PendingFrameQueue; | |
|
Ami GONE FROM CHROMIUM
2014/06/05 00:06:24
y no queue<linked_ptr<PF> > ?
bbudge
2014/06/06 02:03:43
Good idea. Done.
| |
| 147 PendingFrameQueue pending_frames_; | |
| 148 uint32_t num_pending_decodes_; | |
| 149 | |
| 150 base::WeakPtrFactory<VideoDecoderProxy> weak_ptr_factory_; | |
| 151 | |
| 152 DISALLOW_COPY_AND_ASSIGN(VideoDecoderProxy); | |
| 153 }; | |
| 154 | |
| 155 } // namespace content | |
| 156 | |
| 157 namespace base { | |
| 158 | |
| 159 template <class T> | |
| 160 struct DefaultDeleter; | |
| 161 | |
| 162 // Specialize DefaultDeleter so that scoped_ptr<content::VideoDecoderProxy> | |
| 163 // always uses "Destroy()" instead of trying to use the destructor. | |
| 164 template <> | |
| 165 struct DefaultDeleter<content::VideoDecoderProxy> { | |
| 166 public: | |
| 167 inline void operator()(void* video_decoder) const { | |
| 168 static_cast<content::VideoDecoderProxy*>(video_decoder)->Destroy(); | |
| 169 } | |
| 170 }; | |
|
dmichael (off chromium)
2014/06/05 23:00:43
(Note, if you are able to get rid of Destroy and j
bbudge
2014/06/06 02:03:43
I don't think it's possible for this class.
| |
| 171 | |
| 172 } // namespace base | |
| 173 | |
| 174 #endif // CONTENT_RENDERER_PEPPER_VIDEO_DECODER_PROXY_H_ | |
| OLD | NEW |