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.
5 #ifndef REMOTING_CODEC_VIDEO_ENCODER_VPX_H_
6 #define REMOTING_CODEC_VIDEO_ENCODER_VPX_H_
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"
14 typedef struct vpx_image vpx_image_t
;
23 class VideoEncoderVpx
: public VideoEncoder
{
25 // Create encoder for the specified protocol.
26 static scoped_ptr
<VideoEncoderVpx
> CreateForVP8();
27 static scoped_ptr
<VideoEncoderVpx
> CreateForVP9();
29 ~VideoEncoderVpx() override
;
31 // VideoEncoder interface.
32 void SetLosslessEncode(bool want_lossless
) override
;
33 void SetLosslessColor(bool want_lossless
) override
;
34 scoped_ptr
<VideoPacket
> Encode(const webrtc::DesktopFrame
& frame
) override
;
37 explicit VideoEncoderVpx(bool use_vp9
);
39 // (Re)Configures this instance to encode frames of the specified |size|,
40 // with the configured lossless color & encoding modes.
41 void Configure(const webrtc::DesktopSize
& size
);
43 // Prepares |image_| for encoding. Writes updated rectangles into
45 void PrepareImage(const webrtc::DesktopFrame
& frame
,
46 webrtc::DesktopRegion
* updated_region
);
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
);
52 // True if the encoder is for VP9, false for VP8.
55 // Options controlling VP9 encode quantization and color space.
56 // These are always off (false) for VP8.
57 bool lossless_encode_
;
60 // Holds the initialized & configured codec.
61 ScopedVpxCodec codec_
;
63 // Used to generate zero-based frame timestamps.
64 base::TimeTicks timestamp_base_
;
66 // VPX image and buffer to hold the actual YUV planes.
67 scoped_ptr
<vpx_image_t
> image_
;
68 scoped_ptr
<uint8
[]> image_buffer_
;
70 // Active map used to optimize out processing of un-changed macroblocks.
71 scoped_ptr
<uint8
[]> active_map_
;
72 int active_map_width_
;
73 int active_map_height_
;
75 // Used to help initialize VideoPackets from DesktopFrames.
76 VideoEncoderHelper helper_
;
78 DISALLOW_COPY_AND_ASSIGN(VideoEncoderVpx
);
81 } // namespace remoting
83 #endif // REMOTING_CODEC_VIDEO_ENCODER_VP8_H_