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