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_H_
      6 #define REMOTING_CODEC_VIDEO_DECODER_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "remoting/proto/video.pb.h"
     10 
     11 namespace webrtc {
     12 class DesktopRect;
     13 class DesktopRegion;
     14 class DesktopSize;
     15 }  // namespace webrtc
     16 
     17 namespace remoting {
     18 
     19 // Interface for a decoder that takes a stream of bytes from the network and
     20 // outputs frames of data.
     21 class VideoDecoder {
     22  public:
     23   static const int kBytesPerPixel = 4;
     24 
     25   VideoDecoder() {}
     26   virtual ~VideoDecoder() {}
     27 
     28   // Initializes the decoder and sets the output dimensions.
     29   // |screen size| must not be empty.
     30   virtual void Initialize(const webrtc::DesktopSize& screen_size) = 0;
     31 
     32   // Feeds more data into the decoder. Returns true if |packet| was processed
     33   // and the frame can be displayed now.
     34   virtual bool DecodePacket(const VideoPacket& packet) = 0;
     35 
     36   // Marks the specified |region| of the view for update the next time
     37   // RenderFrame() is called.  |region| is expressed in |view_size| coordinates.
     38   // |view_size| must not be empty.
     39   virtual void Invalidate(const webrtc::DesktopSize& view_size,
     40                           const webrtc::DesktopRegion& region) = 0;
     41 
     42   // Copies invalidated pixels within |clip_area| to |image_buffer|. Pixels are
     43   // invalidated either by new data received in DecodePacket(), or by explicit
     44   // calls to Invalidate(). |clip_area| is specified in |view_size| coordinates.
     45   // If |view_size| differs from the source size then the copied pixels will be
     46   // scaled accordingly. |view_size| cannot be empty.
     47   //
     48   // |image_buffer|'s origin must correspond to the top-left of |clip_area|,
     49   // and the buffer must be large enough to hold |clip_area| RGBA32 pixels.
     50   // |image_stride| gives the output buffer's stride in pixels.
     51   //
     52   // On return, |output_region| contains the updated area, in |view_size|
     53   // coordinates.
     54   virtual void RenderFrame(const webrtc::DesktopSize& view_size,
     55                            const webrtc::DesktopRect& clip_area,
     56                            uint8* image_buffer,
     57                            int image_stride,
     58                            webrtc::DesktopRegion* output_region) = 0;
     59 
     60   // Returns the "shape", if any, of the most recently rendered frame.
     61   // The shape is returned in source dimensions.
     62   virtual const webrtc::DesktopRegion* GetImageShape() = 0;
     63 };
     64 
     65 }  // namespace remoting
     66 
     67 #endif  // REMOTING_CODEC_VIDEO_DECODER_H_
     68