Home | History | Annotate | Download | only in codec
      1 // Copyright 2013 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_VPX_H_
      6 #define REMOTING_CODEC_VIDEO_DECODER_VPX_H_
      7 
      8 #include "base/compiler_specific.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "remoting/codec/scoped_vpx_codec.h"
     11 #include "remoting/codec/video_decoder.h"
     12 #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
     13 #include "third_party/webrtc/modules/desktop_capture/desktop_region.h"
     14 
     15 typedef struct vpx_image vpx_image_t;
     16 
     17 namespace remoting {
     18 
     19 class VideoDecoderVpx : public VideoDecoder {
     20  public:
     21   // Create decoders for the specified protocol.
     22   static scoped_ptr<VideoDecoderVpx> CreateForVP8();
     23   static scoped_ptr<VideoDecoderVpx> CreateForVP9();
     24 
     25   virtual ~VideoDecoderVpx();
     26 
     27   // VideoDecoder interface.
     28   virtual void Initialize(const webrtc::DesktopSize& screen_size) OVERRIDE;
     29   virtual bool DecodePacket(const VideoPacket& packet) OVERRIDE;
     30   virtual void Invalidate(const webrtc::DesktopSize& view_size,
     31                           const webrtc::DesktopRegion& region) OVERRIDE;
     32   virtual void RenderFrame(const webrtc::DesktopSize& view_size,
     33                            const webrtc::DesktopRect& clip_area,
     34                            uint8* image_buffer,
     35                            int image_stride,
     36                            webrtc::DesktopRegion* output_region) OVERRIDE;
     37   virtual const webrtc::DesktopRegion* GetImageShape() OVERRIDE;
     38 
     39  private:
     40   explicit VideoDecoderVpx(ScopedVpxCodec codec);
     41 
     42   // Calculates the difference between the desktop shape regions in two
     43   // consecutive frames and updates |updated_region_| and |transparent_region_|
     44   // accordingly.
     45   void UpdateImageShapeRegion(webrtc::DesktopRegion* new_desktop_shape);
     46 
     47   ScopedVpxCodec codec_;
     48 
     49   // Pointer to the last decoded image.
     50   vpx_image_t* last_image_;
     51 
     52   // The region updated that hasn't been copied to the screen yet.
     53   webrtc::DesktopRegion updated_region_;
     54 
     55   // Output dimensions.
     56   webrtc::DesktopSize screen_size_;
     57 
     58   // The region occupied by the top level windows.
     59   webrtc::DesktopRegion desktop_shape_;
     60 
     61   // The region that should be make transparent.
     62   webrtc::DesktopRegion transparent_region_;
     63 
     64   DISALLOW_COPY_AND_ASSIGN(VideoDecoderVpx);
     65 };
     66 
     67 }  // namespace remoting
     68 
     69 #endif  // REMOTING_CODEC_VIDEO_DECODER_VP8_H_
     70