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_VERBATIM_H_
      6 #define REMOTING_CODEC_VIDEO_DECODER_VERBATIM_H_
      7 
      8 #include "base/compiler_specific.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "remoting/codec/video_decoder.h"
     11 
     12 namespace remoting {
     13 
     14 // Video decoder implementations that decodes video packet encoded by
     15 // VideoEncoderVerbatim. It just copies data from incoming packets to the
     16 // video frames.
     17 class VideoDecoderVerbatim : public VideoDecoder {
     18  public:
     19   virtual ~VideoDecoderVerbatim();
     20 
     21   VideoDecoderVerbatim();
     22 
     23   // VideoDecoder implementation.
     24   virtual bool IsReadyForData() OVERRIDE;
     25   virtual void Initialize(const SkISize& screen_size) OVERRIDE;
     26   virtual DecodeResult DecodePacket(const VideoPacket* packet) OVERRIDE;
     27   virtual VideoPacketFormat::Encoding Encoding() OVERRIDE;
     28   virtual void Invalidate(const SkISize& view_size,
     29                           const SkRegion& region) OVERRIDE;
     30   virtual void RenderFrame(const SkISize& view_size,
     31                            const SkIRect& clip_area,
     32                            uint8* image_buffer,
     33                            int image_stride,
     34                            SkRegion* output_region) OVERRIDE;
     35   virtual const SkRegion* GetImageShape() OVERRIDE;
     36 
     37  private:
     38   enum State {
     39     kUninitialized,
     40     kReady,
     41     kProcessing,
     42     kPartitionDone,
     43     kDone,
     44     kError,
     45   };
     46 
     47   // Helper method. Called from DecodePacket to updated state of the decoder.
     48   void UpdateStateForPacket(const VideoPacket* packet);
     49 
     50   // The internal state of the decoder.
     51   State state_;
     52 
     53   // Keeps track of the updating rect.
     54   SkIRect clip_;
     55 
     56   // The position in the row that we are updating.
     57   int row_pos_;
     58 
     59   // The current row in the rect that we are updaing.
     60   int row_y_;
     61 
     62   // The region updated that hasn't been copied to the screen yet.
     63   SkRegion updated_region_;
     64 
     65   // Size of the remote screen.
     66   SkISize screen_size_;
     67 
     68   // The bitmap holding the remote screen bits.
     69   scoped_ptr<uint8[]> screen_buffer_;
     70 
     71   DISALLOW_COPY_AND_ASSIGN(VideoDecoderVerbatim);
     72 };
     73 
     74 }  // namespace remoting
     75 
     76 #endif  // REMOTING_CODEC_VIDEO_DECODER_VERBATIM_H_
     77