Home | History | Annotate | Download | only in codec
      1 // Copyright (c) 2012 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 REMOTING_CODEC_VIDEO_DECODER_VP8_H_
      6 #define REMOTING_CODEC_VIDEO_DECODER_VP8_H_
      7 
      8 #include "base/compiler_specific.h"
      9 #include "remoting/codec/video_decoder.h"
     10 
     11 typedef struct vpx_codec_ctx vpx_codec_ctx_t;
     12 typedef struct vpx_image vpx_image_t;
     13 
     14 namespace remoting {
     15 
     16 class VideoDecoderVp8 : public VideoDecoder {
     17  public:
     18   VideoDecoderVp8();
     19   virtual ~VideoDecoderVp8();
     20 
     21   // VideoDecoder implementations.
     22   virtual void Initialize(const SkISize& screen_size) OVERRIDE;
     23   virtual DecodeResult DecodePacket(const VideoPacket* packet) OVERRIDE;
     24   virtual bool IsReadyForData() OVERRIDE;
     25   virtual VideoPacketFormat::Encoding Encoding() OVERRIDE;
     26   virtual void Invalidate(const SkISize& view_size,
     27                           const SkRegion& region) OVERRIDE;
     28   virtual void RenderFrame(const SkISize& view_size,
     29                            const SkIRect& clip_area,
     30                            uint8* image_buffer,
     31                            int image_stride,
     32                            SkRegion* output_region) OVERRIDE;
     33   virtual const SkRegion* GetImageShape() OVERRIDE;
     34 
     35  private:
     36   enum State {
     37     kUninitialized,
     38     kReady,
     39     kError,
     40   };
     41 
     42   // Fills the rectangle |rect| with the given ARGB color |color| in |buffer|.
     43   void FillRect(uint8* buffer, int stride, const SkIRect& rect, uint32 color);
     44 
     45   // Calculates the difference between the desktop shape regions in two
     46   // consecutive frames and updates |updated_region_| and |transparent_region_|
     47   // accordingly.
     48   void UpdateImageShapeRegion(SkRegion* new_desktop_shape);
     49 
     50   // The internal state of the decoder.
     51   State state_;
     52 
     53   vpx_codec_ctx_t* codec_;
     54 
     55   // Pointer to the last decoded image.
     56   vpx_image_t* last_image_;
     57 
     58   // The region updated that hasn't been copied to the screen yet.
     59   SkRegion updated_region_;
     60 
     61   // Output dimensions.
     62   SkISize screen_size_;
     63 
     64   // The region occupied by the top level windows.
     65   SkRegion desktop_shape_;
     66 
     67   // The region that should be make transparent.
     68   SkRegion transparent_region_;
     69 
     70   DISALLOW_COPY_AND_ASSIGN(VideoDecoderVp8);
     71 };
     72 
     73 }  // namespace remoting
     74 
     75 #endif  // REMOTING_CODEC_VIDEO_DECODER_VP8_H_
     76