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_ENCODER_VPX_H_
      6 #define REMOTING_CODEC_VIDEO_ENCODER_VPX_H_
      7 
      8 #include "base/callback.h"
      9 #include "base/time/time.h"
     10 #include "remoting/codec/scoped_vpx_codec.h"
     11 #include "remoting/codec/video_encoder.h"
     12 #include "remoting/codec/video_encoder_helper.h"
     13 
     14 typedef struct vpx_image vpx_image_t;
     15 
     16 namespace webrtc {
     17 class DesktopRegion;
     18 class DesktopSize;
     19 }  // namespace webrtc
     20 
     21 namespace remoting {
     22 
     23 class VideoEncoderVpx : public VideoEncoder {
     24  public:
     25   // Create encoder for the specified protocol.
     26   static scoped_ptr<VideoEncoderVpx> CreateForVP8();
     27   static scoped_ptr<VideoEncoderVpx> CreateForVP9();
     28 
     29   virtual ~VideoEncoderVpx();
     30 
     31   // VideoEncoder interface.
     32   virtual void SetLosslessEncode(bool want_lossless) OVERRIDE;
     33   virtual void SetLosslessColor(bool want_lossless) OVERRIDE;
     34   virtual scoped_ptr<VideoPacket> Encode(
     35       const webrtc::DesktopFrame& frame) OVERRIDE;
     36 
     37  private:
     38   explicit VideoEncoderVpx(bool use_vp9);
     39 
     40   // Initializes the codec for frames of |size|. Returns true if successful.
     41   bool Initialize(const webrtc::DesktopSize& size);
     42 
     43   // Prepares |image_| for encoding. Writes updated rectangles into
     44   // |updated_region|.
     45   void PrepareImage(const webrtc::DesktopFrame& frame,
     46                     webrtc::DesktopRegion* updated_region);
     47 
     48   // Updates the active map according to |updated_region|. Active map is then
     49   // given to the encoder to speed up encoding.
     50   void PrepareActiveMap(const webrtc::DesktopRegion& updated_region);
     51 
     52   // True if the encoder should generate VP9, false for VP8.
     53   bool use_vp9_;
     54 
     55   // Options controlling VP9 encode quantization and color space.
     56   // These are always off (false) for VP8.
     57   bool lossless_encode_;
     58   bool lossless_color_;
     59 
     60   ScopedVpxCodec codec_;
     61   base::TimeTicks timestamp_base_;
     62 
     63   // VPX image and buffer to hold the actual YUV planes.
     64   scoped_ptr<vpx_image_t> image_;
     65   scoped_ptr<uint8[]> image_buffer_;
     66 
     67   // Active map used to optimize out processing of un-changed macroblocks.
     68   scoped_ptr<uint8[]> active_map_;
     69   int active_map_width_;
     70   int active_map_height_;
     71 
     72   // Used to help initialize VideoPackets from DesktopFrames.
     73   VideoEncoderHelper helper_;
     74 
     75   DISALLOW_COPY_AND_ASSIGN(VideoEncoderVpx);
     76 };
     77 
     78 }  // namespace remoting
     79 
     80 #endif  // REMOTING_CODEC_VIDEO_ENCODER_VP8_H_
     81