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