diff options
author | Andras Becsi <andras.becsi@digia.com> | 2013-12-11 21:33:03 +0100 |
---|---|---|
committer | Andras Becsi <andras.becsi@digia.com> | 2013-12-13 12:34:07 +0100 |
commit | f2a33ff9cbc6d19943f1c7fbddd1f23d23975577 (patch) | |
tree | 0586a32aa390ade8557dfd6b4897f43a07449578 /chromium/media/cast/video_sender/codecs/vp8/vp8_encoder.h | |
parent | 5362912cdb5eea702b68ebe23702468d17c3017a (diff) | |
download | qtwebengine-chromium-f2a33ff9cbc6d19943f1c7fbddd1f23d23975577.tar.gz |
Update Chromium to branch 1650 (31.0.1650.63)
Change-Id: I57d8c832eaec1eb2364e0a8e7352a6dd354db99f
Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Diffstat (limited to 'chromium/media/cast/video_sender/codecs/vp8/vp8_encoder.h')
-rw-r--r-- | chromium/media/cast/video_sender/codecs/vp8/vp8_encoder.h | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/chromium/media/cast/video_sender/codecs/vp8/vp8_encoder.h b/chromium/media/cast/video_sender/codecs/vp8/vp8_encoder.h new file mode 100644 index 00000000000..3b041a01d26 --- /dev/null +++ b/chromium/media/cast/video_sender/codecs/vp8/vp8_encoder.h @@ -0,0 +1,87 @@ +// 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 MEDIA_CAST_VIDEO_SENDER_CODECS_VP8_VP8_ENCODER_H_ +#define MEDIA_CAST_VIDEO_SENDER_CODECS_VP8_VP8_ENCODER_H_ + +#include "base/basictypes.h" +#include "base/memory/scoped_ptr.h" +#include "media/cast/cast_config.h" +#include "third_party/libvpx/source/libvpx/vpx/vpx_encoder.h" + +// VPX forward declaration. +typedef struct vpx_codec_ctx vpx_enc_ctx_t; + +namespace media { +namespace cast { + +const int kNumberOfVp8VideoBuffers = 3; + +class Vp8Encoder { + public: + Vp8Encoder(const VideoSenderConfig& video_config, + uint8 max_unacked_frames); + + ~Vp8Encoder(); + + // Encode a raw image (as a part of a video stream). + bool Encode(const I420VideoFrame& input_image, + EncodedVideoFrame* encoded_image); + + // Update the encoder with a new target bit rate. + void UpdateRates(uint32 new_bitrate); + + // Set the next frame to be a key frame. + void GenerateKeyFrame(); + + void LatestFrameIdToReference(uint8 frame_id); + + private: + enum Vp8Buffers { + kAltRefBuffer = 0, + kGoldenBuffer = 1, + kLastBuffer = 2, + kNoBuffer = 3 // Note: must be last. + }; + + void InitEncode(int number_of_cores); + + // Calculate the max target in % for a keyframe. + uint32 MaxIntraTarget(uint32 optimal_buffer_size) const; + + // Calculate which next Vp8 buffers to update with the next frame. + Vp8Buffers GetNextBufferToUpdate(); + + // Calculate which previous frame to reference. + uint8_t GetLatestFrameIdToReference(); + + // Get encoder flags for our referenced encoder buffers. + void GetCodecReferenceFlags(vpx_codec_flags_t* flags); + + // Get encoder flags for our encoder buffers to update with next frame. + void GetCodecUpdateFlags(Vp8Buffers buffer_to_update, + vpx_codec_flags_t* flags); + + const VideoSenderConfig cast_config_; + const bool use_multiple_video_buffers_; + const int max_number_of_repeated_buffers_in_a_row_; + + // VP8 internal objects. + scoped_ptr<vpx_codec_enc_cfg_t> config_; + vpx_enc_ctx_t* encoder_; + vpx_image_t* raw_image_; + + bool key_frame_requested_; + int64 timestamp_; + uint8 last_encoded_frame_id_; + uint8 used_buffers_frame_id_[kNumberOfVp8VideoBuffers]; + bool acked_frame_buffers_[kNumberOfVp8VideoBuffers]; + Vp8Buffers last_used_vp8_buffer_; + int number_of_repeated_buffers_; +}; + +} // namespace cast +} // namespace media + +#endif // MEDIA_CAST_VIDEO_SENDER_CODECS_VP8_VP8_ENCODER_H_ |