Home | History | Annotate | Download | only in pepper
      1 // Copyright 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_SHIM_H_
      6 #define CONTENT_RENDERER_PEPPER_VIDEO_DECODER_SHIM_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/linked_ptr.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "base/memory/weak_ptr.h"
     16 #include "base/message_loop/message_loop_proxy.h"
     17 #include "gpu/command_buffer/common/mailbox.h"
     18 #include "media/base/video_decoder_config.h"
     19 #include "media/video/video_decode_accelerator.h"
     20 
     21 #include "ppapi/c/pp_codecs.h"
     22 
     23 namespace gpu {
     24 namespace gles2 {
     25 class GLES2Interface;
     26 }
     27 }
     28 
     29 namespace media {
     30 class DecoderBuffer;
     31 }
     32 
     33 namespace webkit {
     34 namespace gpu {
     35 class ContextProviderWebContext;
     36 }
     37 }
     38 
     39 namespace content {
     40 
     41 class PepperVideoDecoderHost;
     42 
     43 // This class is a shim to wrap a media::VideoDecoder so that it can be used
     44 // by PepperVideoDecoderHost in place of a media::VideoDecodeAccelerator.
     45 // This class should be constructed, used, and destructed on the main (render)
     46 // thread.
     47 class VideoDecoderShim : public media::VideoDecodeAccelerator {
     48  public:
     49   explicit VideoDecoderShim(PepperVideoDecoderHost* host);
     50   virtual ~VideoDecoderShim();
     51 
     52   // media::VideoDecodeAccelerator implementation.
     53   virtual bool Initialize(
     54       media::VideoCodecProfile profile,
     55       media::VideoDecodeAccelerator::Client* client) OVERRIDE;
     56   virtual void Decode(const media::BitstreamBuffer& bitstream_buffer) OVERRIDE;
     57   virtual void AssignPictureBuffers(
     58       const std::vector<media::PictureBuffer>& buffers) OVERRIDE;
     59   virtual void ReusePictureBuffer(int32 picture_buffer_id) OVERRIDE;
     60   virtual void Flush() OVERRIDE;
     61   virtual void Reset() OVERRIDE;
     62   virtual void Destroy() OVERRIDE;
     63 
     64  private:
     65   enum State {
     66     UNINITIALIZED,
     67     DECODING,
     68     FLUSHING,
     69     RESETTING,
     70   };
     71 
     72   struct PendingDecode;
     73   struct PendingFrame;
     74   class DecoderImpl;
     75 
     76   void OnInitializeComplete(int32_t result, uint32_t texture_pool_size);
     77   void OnDecodeComplete(int32_t result, uint32_t decode_id);
     78   void OnOutputComplete(scoped_ptr<PendingFrame> frame);
     79   void SendPictures();
     80   void OnResetComplete();
     81   void NotifyCompletedDecodes();
     82   void DismissTexture(uint32_t texture_id);
     83   void DeleteTexture(uint32_t texture_id);
     84   // Call this whenever we change GL state that the plugin relies on, such as
     85   // creating picture textures.
     86   void FlushCommandBuffer();
     87 
     88   scoped_ptr<DecoderImpl> decoder_impl_;
     89   State state_;
     90 
     91   PepperVideoDecoderHost* host_;
     92   scoped_refptr<base::MessageLoopProxy> media_message_loop_;
     93   scoped_refptr<webkit::gpu::ContextProviderWebContext> context_provider_;
     94 
     95   // The current decoded frame size.
     96   gfx::Size texture_size_;
     97   // Map that takes the plugin's GL texture id to the renderer's GL texture id.
     98   typedef base::hash_map<uint32_t, uint32_t> TextureIdMap;
     99   TextureIdMap texture_id_map_;
    100   // Available textures (these are plugin ids.)
    101   typedef base::hash_set<uint32_t> TextureIdSet;
    102   TextureIdSet available_textures_;
    103   // Track textures that are no longer needed (these are plugin ids.)
    104   TextureIdSet textures_to_dismiss_;
    105   // Mailboxes for pending texture requests, to write to plugin's textures.
    106   std::vector<gpu::Mailbox> pending_texture_mailboxes_;
    107 
    108   // Queue of completed decode ids, for notifying the host.
    109   typedef std::queue<uint32_t> CompletedDecodeQueue;
    110   CompletedDecodeQueue completed_decodes_;
    111 
    112   // Queue of decoded frames that have been converted to RGB and await upload to
    113   // a GL texture.
    114   typedef std::queue<linked_ptr<PendingFrame> > PendingFrameQueue;
    115   PendingFrameQueue pending_frames_;
    116 
    117   // The optimal number of textures to allocate for decoder_impl_.
    118   uint32_t texture_pool_size_;
    119 
    120   uint32_t num_pending_decodes_;
    121 
    122   base::WeakPtrFactory<VideoDecoderShim> weak_ptr_factory_;
    123 
    124   DISALLOW_COPY_AND_ASSIGN(VideoDecoderShim);
    125 };
    126 
    127 }  // namespace content
    128 
    129 #endif  // CONTENT_RENDERER_PEPPER_VIDEO_DECODER_SHIM_H_
    130