Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Unified Diff: webrtc/modules/video_coding/media_optimization.cc

Issue 1972083002: Move logic for calculating needed bitrate overhead used by NACK and FEC to VideoSender. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Addressed Åsas comments. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/video_coding/media_optimization.cc
diff --git a/webrtc/modules/video_coding/media_optimization.cc b/webrtc/modules/video_coding/media_optimization.cc
index d5fbadc122fc34c92ea71debad7aa5ee04bc2742..76556492830eaa98e0cbb876449112c8e22d1fb9 100644
--- a/webrtc/modules/video_coding/media_optimization.cc
+++ b/webrtc/modules/video_coding/media_optimization.cc
@@ -16,39 +16,6 @@
namespace webrtc {
namespace media_optimization {
-namespace {
-void UpdateProtectionCallback(
- VCMProtectionMethod* selected_method,
- uint32_t* video_rate_bps,
- uint32_t* nack_overhead_rate_bps,
- uint32_t* fec_overhead_rate_bps,
- VCMProtectionCallback* video_protection_callback) {
- FecProtectionParams delta_fec_params;
- FecProtectionParams key_fec_params;
- // Get the FEC code rate for Key frames (set to 0 when NA).
- key_fec_params.fec_rate = selected_method->RequiredProtectionFactorK();
-
- // Get the FEC code rate for Delta frames (set to 0 when NA).
- delta_fec_params.fec_rate = selected_method->RequiredProtectionFactorD();
-
- // The RTP module currently requires the same |max_fec_frames| for both
- // key and delta frames.
- delta_fec_params.max_fec_frames = selected_method->MaxFramesFec();
- key_fec_params.max_fec_frames = selected_method->MaxFramesFec();
-
- // Set the FEC packet mask type. |kFecMaskBursty| is more effective for
- // consecutive losses and little/no packet re-ordering. As we currently
- // do not have feedback data on the degree of correlated losses and packet
- // re-ordering, we keep default setting to |kFecMaskRandom| for now.
- delta_fec_params.fec_mask_type = kFecMaskRandom;
- key_fec_params.fec_mask_type = kFecMaskRandom;
-
- // TODO(Marco): Pass FEC protection values per layer.
- video_protection_callback->ProtectionRequest(
- &delta_fec_params, &key_fec_params, video_rate_bps,
- nack_overhead_rate_bps, fec_overhead_rate_bps);
-}
-} // namespace
struct MediaOptimization::EncodedFrameSample {
EncodedFrameSample(size_t size_bytes,
@@ -67,13 +34,10 @@ MediaOptimization::MediaOptimization(Clock* clock)
: crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
clock_(clock),
max_bit_rate_(0),
- send_codec_type_(kVideoCodecUnknown),
codec_width_(0),
codec_height_(0),
user_frame_rate_(0),
frame_dropper_(new FrameDropper),
- loss_prot_logic_(
- new VCMLossProtectionLogic(clock_->TimeInMilliseconds())),
fraction_lost_(0),
send_statistics_zero_encode_(0),
max_payload_size_(1460),
@@ -82,8 +46,6 @@ MediaOptimization::MediaOptimization(Clock* clock)
encoded_frame_samples_(),
avg_sent_bit_rate_bps_(0),
avg_sent_framerate_(0),
- key_frame_cnt_(0),
- delta_frame_cnt_(0),
num_layers_(0),
suspension_enabled_(false),
video_suspended_(false),
@@ -94,34 +56,26 @@ MediaOptimization::MediaOptimization(Clock* clock)
}
MediaOptimization::~MediaOptimization(void) {
- loss_prot_logic_->Release();
}
void MediaOptimization::Reset() {
CriticalSectionScoped lock(crit_sect_.get());
- SetEncodingDataInternal(kVideoCodecUnknown, 0, 0, 0, 0, 0, 0,
- max_payload_size_);
+ SetEncodingDataInternal(0, 0, 0, 0, 0, 0, max_payload_size_);
memset(incoming_frame_times_, -1, sizeof(incoming_frame_times_));
incoming_frame_rate_ = 0.0;
frame_dropper_->Reset();
- loss_prot_logic_->Reset(clock_->TimeInMilliseconds());
frame_dropper_->SetRates(0, 0);
- loss_prot_logic_->UpdateFrameRate(incoming_frame_rate_);
- loss_prot_logic_->Reset(clock_->TimeInMilliseconds());
send_statistics_zero_encode_ = 0;
video_target_bitrate_ = 0;
codec_width_ = 0;
codec_height_ = 0;
user_frame_rate_ = 0;
- key_frame_cnt_ = 0;
- delta_frame_cnt_ = 0;
encoded_frame_samples_.clear();
avg_sent_bit_rate_bps_ = 0;
num_layers_ = 1;
}
-void MediaOptimization::SetEncodingData(VideoCodecType send_codec_type,
- int32_t max_bit_rate,
+void MediaOptimization::SetEncodingData(int32_t max_bit_rate,
uint32_t target_bitrate,
uint16_t width,
uint16_t height,
@@ -129,12 +83,11 @@ void MediaOptimization::SetEncodingData(VideoCodecType send_codec_type,
int num_layers,
int32_t mtu) {
CriticalSectionScoped lock(crit_sect_.get());
- SetEncodingDataInternal(send_codec_type, max_bit_rate, frame_rate,
- target_bitrate, width, height, num_layers, mtu);
+ SetEncodingDataInternal(max_bit_rate, frame_rate, target_bitrate, width,
+ height, num_layers, mtu);
}
-void MediaOptimization::SetEncodingDataInternal(VideoCodecType send_codec_type,
- int32_t max_bit_rate,
+void MediaOptimization::SetEncodingDataInternal(int32_t max_bit_rate,
uint32_t frame_rate,
uint32_t target_bitrate,
uint16_t width,
@@ -145,13 +98,8 @@ void MediaOptimization::SetEncodingDataInternal(VideoCodecType send_codec_type,
// has changed.
max_bit_rate_ = max_bit_rate;
- send_codec_type_ = send_codec_type;
video_target_bitrate_ = target_bitrate;
float target_bitrate_kbps = static_cast<float>(target_bitrate) / 1000.0f;
- loss_prot_logic_->UpdateBitRate(target_bitrate_kbps);
- loss_prot_logic_->UpdateFrameRate(static_cast<float>(frame_rate));
- loss_prot_logic_->UpdateFrameSize(width, height);
- loss_prot_logic_->UpdateNumLayers(num_layers);
frame_dropper_->Reset();
frame_dropper_->SetRates(target_bitrate_kbps, static_cast<float>(frame_rate));
user_frame_rate_ = static_cast<float>(frame_rate);
@@ -161,16 +109,10 @@ void MediaOptimization::SetEncodingDataInternal(VideoCodecType send_codec_type,
max_payload_size_ = mtu;
}
-uint32_t MediaOptimization::SetTargetRates(
- uint32_t target_bitrate,
- uint8_t fraction_lost,
- int64_t round_trip_time_ms,
- VCMProtectionCallback* protection_callback) {
+uint32_t MediaOptimization::SetTargetRates(uint32_t target_bitrate,
+ uint8_t fraction_lost,
+ int64_t round_trip_time_ms) {
CriticalSectionScoped lock(crit_sect_.get());
- VCMProtectionMethod* selected_method = loss_prot_logic_->SelectedMethod();
- float target_bitrate_kbps = static_cast<float>(target_bitrate) / 1000.0f;
- loss_prot_logic_->UpdateBitRate(target_bitrate_kbps);
- loss_prot_logic_->UpdateRtt(round_trip_time_ms);
// Get frame rate for encoder: this is the actual/sent frame rate.
float actual_frame_rate = SentFrameRateInternal();
@@ -180,65 +122,9 @@ uint32_t MediaOptimization::SetTargetRates(
actual_frame_rate = 1.0;
}
- // Update frame rate for the loss protection logic class: frame rate should
- // be the actual/sent rate.
- loss_prot_logic_->UpdateFrameRate(actual_frame_rate);
-
fraction_lost_ = fraction_lost;
- // Returns the filtered packet loss, used for the protection setting.
- // The filtered loss may be the received loss (no filter), or some
- // filtered value (average or max window filter).
- // Use max window filter for now.
- FilterPacketLossMode filter_mode = kMaxFilter;
- uint8_t packet_loss_enc = loss_prot_logic_->FilteredLoss(
- clock_->TimeInMilliseconds(), filter_mode, fraction_lost);
-
- // For now use the filtered loss for computing the robustness settings.
- loss_prot_logic_->UpdateFilteredLossPr(packet_loss_enc);
-
- // Rate cost of the protection methods.
- float protection_overhead_rate = 0.0f;
-
- // Update protection settings, when applicable.
- if (loss_prot_logic_->SelectedType() != kNone) {
- // Update method will compute the robustness settings for the given
- // protection method and the overhead cost
- // the protection method is set by the user via SetVideoProtection.
- loss_prot_logic_->UpdateMethod();
-
- // Update protection callback with protection settings.
- uint32_t sent_video_rate_bps = 0;
- uint32_t sent_nack_rate_bps = 0;
- uint32_t sent_fec_rate_bps = 0;
- // Get the bit cost of protection method, based on the amount of
- // overhead data actually transmitted (including headers) the last
- // second.
- if (protection_callback) {
- UpdateProtectionCallback(selected_method, &sent_video_rate_bps,
- &sent_nack_rate_bps, &sent_fec_rate_bps,
- protection_callback);
- }
- uint32_t sent_total_rate_bps =
- sent_video_rate_bps + sent_nack_rate_bps + sent_fec_rate_bps;
- // Estimate the overhead costs of the next second as staying the same
- // wrt the source bitrate.
- if (sent_total_rate_bps > 0) {
- protection_overhead_rate =
- static_cast<float>(sent_nack_rate_bps + sent_fec_rate_bps) /
- sent_total_rate_bps;
- }
- // Cap the overhead estimate to 50%.
- if (protection_overhead_rate > 0.5)
- protection_overhead_rate = 0.5;
-
- // Get the effective packet loss for encoder ER when applicable. Should be
- // passed to encoder via fraction_lost.
- packet_loss_enc = selected_method->RequiredPacketLossER();
- }
-
- // Source coding rate: total rate - protection overhead.
- video_target_bitrate_ = target_bitrate * (1.0 - protection_overhead_rate);
+ video_target_bitrate_ = target_bitrate;
// Cap target video bitrate to codec maximum.
if (max_bit_rate_ > 0 && video_target_bitrate_ > max_bit_rate_) {
@@ -255,11 +141,6 @@ uint32_t MediaOptimization::SetTargetRates(
return video_target_bitrate_;
}
-void MediaOptimization::SetProtectionMethod(VCMProtectionMethodEnum method) {
- CriticalSectionScoped lock(crit_sect_.get());
- loss_prot_logic_->SetMethod(method);
-}
-
uint32_t MediaOptimization::InputFrameRate() {
CriticalSectionScoped lock(crit_sect_.get());
return InputFrameRateInternal();
@@ -311,29 +192,7 @@ int32_t MediaOptimization::UpdateWithEncodedData(
UpdateSentFramerate();
if (encoded_length > 0) {
const bool delta_frame = encoded_image._frameType != kVideoFrameKey;
-
frame_dropper_->Fill(encoded_length, delta_frame);
- if (max_payload_size_ > 0 && encoded_length > 0) {
- const float min_packets_per_frame =
- encoded_length / static_cast<float>(max_payload_size_);
- if (delta_frame) {
- loss_prot_logic_->UpdatePacketsPerFrame(min_packets_per_frame,
- clock_->TimeInMilliseconds());
- } else {
- loss_prot_logic_->UpdatePacketsPerFrameKey(
- min_packets_per_frame, clock_->TimeInMilliseconds());
- }
- }
- if (!delta_frame && encoded_length > 0) {
- loss_prot_logic_->UpdateKeyFrameSize(static_cast<float>(encoded_length));
- }
-
- // Updating counters.
- if (delta_frame) {
- delta_frame_cnt_++;
- } else {
- key_frame_cnt_++;
- }
}
return VCM_OK;
« no previous file with comments | « webrtc/modules/video_coding/media_optimization.h ('k') | webrtc/modules/video_coding/media_optimization_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698