diff options
Diffstat (limited to 'media/cast/video_sender/codecs/vp8/vp8_encoder.cc')
-rw-r--r-- | media/cast/video_sender/codecs/vp8/vp8_encoder.cc | 62 |
1 files changed, 37 insertions, 25 deletions
diff --git a/media/cast/video_sender/codecs/vp8/vp8_encoder.cc b/media/cast/video_sender/codecs/vp8/vp8_encoder.cc index c977dd2..a073b9f0 100644 --- a/media/cast/video_sender/codecs/vp8/vp8_encoder.cc +++ b/media/cast/video_sender/codecs/vp8/vp8_encoder.cc @@ -19,6 +19,13 @@ namespace cast { static const uint32 kMinIntra = 300; +static int ComputeMaxNumOfRepeatedBuffes(uint8 max_unacked_frames) { + if (max_unacked_frames > kNumberOfVp8VideoBuffers) + return (max_unacked_frames - 1) / kNumberOfVp8VideoBuffers; + + return 0; +} + Vp8Encoder::Vp8Encoder(const VideoSenderConfig& video_config, uint8 max_unacked_frames) : cast_config_(video_config), @@ -26,8 +33,7 @@ Vp8Encoder::Vp8Encoder(const VideoSenderConfig& video_config, cast_config_.max_number_of_video_buffers_used == kNumberOfVp8VideoBuffers), max_number_of_repeated_buffers_in_a_row_( - (max_unacked_frames > kNumberOfVp8VideoBuffers) ? - ((max_unacked_frames - 1) / kNumberOfVp8VideoBuffers) : 0), + ComputeMaxNumOfRepeatedBuffes(max_unacked_frames)), key_frame_requested_(true), timestamp_(0), last_encoded_frame_id_(kStartFrameId), @@ -36,7 +42,8 @@ Vp8Encoder::Vp8Encoder(const VideoSenderConfig& video_config, // internal state of the encoder, ideally the encoder will tell if we can // send another frame. DCHECK(!use_multiple_video_buffers_ || - max_number_of_repeated_buffers_in_a_row_ == 0) << "Invalid config"; + max_number_of_repeated_buffers_in_a_row_ == 0) + << "Invalid config"; // VP8 have 3 buffers available for prediction, with // max_number_of_video_buffers_used set to 1 we maximize the coding efficiency @@ -46,7 +53,8 @@ Vp8Encoder::Vp8Encoder(const VideoSenderConfig& video_config, // propagation. DCHECK(cast_config_.max_number_of_video_buffers_used == 1 || cast_config_.max_number_of_video_buffers_used == - kNumberOfVp8VideoBuffers) << "Invalid argument"; + kNumberOfVp8VideoBuffers) + << "Invalid argument"; thread_checker_.DetachFromThread(); } @@ -64,8 +72,8 @@ void Vp8Encoder::Initialize() { // Creating a wrapper to the image - setting image data to NULL. Actual // pointer will be set during encode. Setting align to 1, as it is // meaningless (actual memory is not allocated). - raw_image_ = vpx_img_wrap(NULL, IMG_FMT_I420, cast_config_.width, - cast_config_.height, 1, NULL); + raw_image_ = vpx_img_wrap( + NULL, IMG_FMT_I420, cast_config_.width, cast_config_.height, 1, NULL); for (int i = 0; i < kNumberOfVp8VideoBuffers; ++i) { acked_frame_buffers_[i] = true; @@ -95,8 +103,8 @@ void Vp8Encoder::InitEncode(int number_of_cores) { config_->g_error_resilient = 1; } - if (cast_config_.width * cast_config_.height > 640 * 480 - && number_of_cores >= 2) { + if (cast_config_.width * cast_config_.height > 640 * 480 && + number_of_cores >= 2) { config_->g_threads = 2; // 2 threads for qHD/HD. } else { config_->g_threads = 1; // 1 thread for VGA or less. @@ -120,10 +128,8 @@ void Vp8Encoder::InitEncode(int number_of_cores) { uint32 rc_max_intra_target = MaxIntraTarget(config_->rc_buf_optimal_sz); vpx_codec_flags_t flags = 0; // TODO(mikhal): Tune settings. - if (vpx_codec_enc_init(encoder_.get(), - vpx_codec_vp8_cx(), - config_.get(), - flags)) { + if (vpx_codec_enc_init( + encoder_.get(), vpx_codec_vp8_cx(), config_.get(), flags)) { DCHECK(false) << "vpx_codec_enc_init() failed."; encoder_.reset(); return; @@ -131,8 +137,8 @@ void Vp8Encoder::InitEncode(int number_of_cores) { vpx_codec_control(encoder_.get(), VP8E_SET_STATIC_THRESHOLD, 1); vpx_codec_control(encoder_.get(), VP8E_SET_NOISE_SENSITIVITY, 0); vpx_codec_control(encoder_.get(), VP8E_SET_CPUUSED, -6); - vpx_codec_control(encoder_.get(), VP8E_SET_MAX_INTRA_BITRATE_PCT, - rc_max_intra_target); + vpx_codec_control( + encoder_.get(), VP8E_SET_MAX_INTRA_BITRATE_PCT, rc_max_intra_target); } bool Vp8Encoder::Encode(const scoped_refptr<media::VideoFrame>& video_frame, @@ -183,7 +189,7 @@ bool Vp8Encoder::Encode(const scoped_refptr<media::VideoFrame>& video_frame, timestamp_ += duration; // Get encoded frame. - const vpx_codec_cx_pkt_t *pkt = NULL; + const vpx_codec_cx_pkt_t* pkt = NULL; vpx_codec_iter_t iter = NULL; size_t total_size = 0; while ((pkt = vpx_codec_get_cx_data(encoder_.get(), &iter)) != NULL) { @@ -193,8 +199,7 @@ bool Vp8Encoder::Encode(const scoped_refptr<media::VideoFrame>& video_frame, encoded_image->data.insert( encoded_image->data.end(), static_cast<const uint8*>(pkt->data.frame.buf), - static_cast<const uint8*>(pkt->data.frame.buf) + - pkt->data.frame.sz); + static_cast<const uint8*>(pkt->data.frame.buf) + pkt->data.frame.sz); if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) { encoded_image->key_frame = true; } else { @@ -203,7 +208,8 @@ bool Vp8Encoder::Encode(const scoped_refptr<media::VideoFrame>& video_frame, } } // Don't update frame_id for zero size frames. - if (total_size == 0) return true; + if (total_size == 0) + return true; // Populate the encoded frame. encoded_image->codec = transport::kVp8; @@ -233,12 +239,14 @@ bool Vp8Encoder::Encode(const scoped_refptr<media::VideoFrame>& video_frame, } void Vp8Encoder::GetCodecReferenceFlags(vpx_codec_flags_t* flags) { - if (!use_multiple_video_buffers_) return; + if (!use_multiple_video_buffers_) + return; // We need to reference something. DCHECK(acked_frame_buffers_[kAltRefBuffer] || acked_frame_buffers_[kGoldenBuffer] || - acked_frame_buffers_[kLastBuffer]) << "Invalid state"; + acked_frame_buffers_[kLastBuffer]) + << "Invalid state"; if (!acked_frame_buffers_[kAltRefBuffer]) { *flags |= VP8_EFLAG_NO_REF_ARF; @@ -252,7 +260,8 @@ void Vp8Encoder::GetCodecReferenceFlags(vpx_codec_flags_t* flags) { } uint32 Vp8Encoder::GetLatestFrameIdToReference() { - if (!use_multiple_video_buffers_) return last_encoded_frame_id_; + if (!use_multiple_video_buffers_) + return last_encoded_frame_id_; int latest_frame_id_to_reference = -1; if (acked_frame_buffers_[kAltRefBuffer]) { @@ -317,7 +326,8 @@ Vp8Encoder::Vp8Buffers Vp8Encoder::GetNextBufferToUpdate() { void Vp8Encoder::GetCodecUpdateFlags(Vp8Buffers buffer_to_update, vpx_codec_flags_t* flags) { - if (!use_multiple_video_buffers_) return; + if (!use_multiple_video_buffers_) + return; // Update at most one buffer, except for key-frames. switch (buffer_to_update) { @@ -345,7 +355,8 @@ void Vp8Encoder::GetCodecUpdateFlags(Vp8Buffers buffer_to_update, void Vp8Encoder::UpdateRates(uint32 new_bitrate) { DCHECK(thread_checker_.CalledOnValidThread()); uint32 new_bitrate_kbit = new_bitrate / 1000; - if (config_->rc_target_bitrate == new_bitrate_kbit) return; + if (config_->rc_target_bitrate == new_bitrate_kbit) + return; config_->rc_target_bitrate = new_bitrate_kbit; @@ -357,7 +368,8 @@ void Vp8Encoder::UpdateRates(uint32 new_bitrate) { void Vp8Encoder::LatestFrameIdToReference(uint32 frame_id) { DCHECK(thread_checker_.CalledOnValidThread()); - if (!use_multiple_video_buffers_) return; + if (!use_multiple_video_buffers_) + return; VLOG(1) << "VP8 ok to reference frame:" << static_cast<int>(frame_id); for (int i = 0; i < kNumberOfVp8VideoBuffers; ++i) { @@ -383,7 +395,7 @@ uint32 Vp8Encoder::MaxIntraTarget(uint32 optimal_buffer_size_ms) const { float scale_parameter = 0.5; uint32 target_pct = optimal_buffer_size_ms * scale_parameter * - cast_config_.max_frame_rate / 10; + cast_config_.max_frame_rate / 10; // Don't go below 3 times the per frame bandwidth. return std::max(target_pct, kMinIntra); |