123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- // Copyright 2013 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef REMOTING_CODEC_VIDEO_ENCODER_VPX_H_
- #define REMOTING_CODEC_VIDEO_ENCODER_VPX_H_
- #include <stdint.h>
- #include "base/callback.h"
- #include "base/memory/raw_ptr.h"
- #include "base/time/default_tick_clock.h"
- #include "base/time/time.h"
- #include "remoting/codec/scoped_vpx_codec.h"
- #include "remoting/codec/video_encoder.h"
- #include "remoting/codec/video_encoder_helper.h"
- typedef struct vpx_image vpx_image_t;
- namespace webrtc {
- class DesktopRegion;
- class DesktopSize;
- } // namespace webrtc
- namespace remoting {
- class VideoEncoderVpx : public VideoEncoder {
- public:
- // Create encoder for the specified protocol.
- static std::unique_ptr<VideoEncoderVpx> CreateForVP8();
- static std::unique_ptr<VideoEncoderVpx> CreateForVP9();
- VideoEncoderVpx(const VideoEncoderVpx&) = delete;
- VideoEncoderVpx& operator=(const VideoEncoderVpx&) = delete;
- ~VideoEncoderVpx() override;
- void SetTickClockForTests(const base::TickClock* tick_clock);
- // VideoEncoder interface.
- void SetLosslessEncode(bool want_lossless) override;
- void SetLosslessColor(bool want_lossless) override;
- std::unique_ptr<VideoPacket> Encode(
- const webrtc::DesktopFrame& frame) override;
- private:
- explicit VideoEncoderVpx(bool use_vp9);
- // (Re)Configures this instance to encode frames of the specified |size|,
- // with the configured lossless color & encoding modes.
- void Configure(const webrtc::DesktopSize& size);
- // Prepares |image_| for encoding. Writes updated rectangles into
- // |updated_region|.
- void PrepareImage(const webrtc::DesktopFrame& frame,
- webrtc::DesktopRegion* updated_region);
- // Updates the active map according to |updated_region|. Active map is then
- // given to the encoder to speed up encoding.
- void SetActiveMapFromRegion(const webrtc::DesktopRegion& updated_region);
- // Adds areas changed in the most recent frame to |updated_region|. This
- // includes both content changes and areas enhanced by cyclic refresh.
- void UpdateRegionFromActiveMap(webrtc::DesktopRegion* updated_region);
- // True if the encoder is for VP9, false for VP8.
- const bool use_vp9_;
- // Options controlling VP9 encode quantization and color space.
- // These are always off (false) for VP8.
- bool lossless_encode_ = false;
- bool lossless_color_ = false;
- // Holds the initialized & configured codec.
- ScopedVpxCodec codec_;
- // Used to generate zero-based frame timestamps.
- base::TimeTicks timestamp_base_;
- // VPX image and buffer to hold the actual YUV planes.
- std::unique_ptr<vpx_image_t> image_;
- std::unique_ptr<uint8_t[]> image_buffer_;
- // Active map used to optimize out processing of un-changed macroblocks.
- std::unique_ptr<uint8_t[]> active_map_;
- webrtc::DesktopSize active_map_size_;
- // True if the codec wants unchanged frames to finish topping-off with.
- bool encode_unchanged_frame_;
- // Used to help initialize VideoPackets from DesktopFrames.
- VideoEncoderHelper helper_;
- raw_ptr<const base::TickClock> clock_;
- };
- } // namespace remoting
- #endif // REMOTING_CODEC_VIDEO_ENCODER_VPX_H_
|