| Index: webrtc/modules/video_coding/generic_encoder.cc
|
| diff --git a/webrtc/modules/video_coding/generic_encoder.cc b/webrtc/modules/video_coding/generic_encoder.cc
|
| index cdb244da96a3f26f4d5370d88c1425b35f83aed7..adc43654976cb551862be159ab39074e8a5197f1 100644
|
| --- a/webrtc/modules/video_coding/generic_encoder.cc
|
| +++ b/webrtc/modules/video_coding/generic_encoder.cc
|
| @@ -13,6 +13,7 @@
|
| #include <vector>
|
|
|
| #include "webrtc/api/video/i420_buffer.h"
|
| +#include "webrtc/modules/pacing/alr_detector.h"
|
| #include "webrtc/modules/video_coding/encoded_frame.h"
|
| #include "webrtc/modules/video_coding/media_optimization.h"
|
| #include "webrtc/rtc_base/checks.h"
|
| @@ -20,6 +21,7 @@
|
| #include "webrtc/rtc_base/optional.h"
|
| #include "webrtc/rtc_base/timeutils.h"
|
| #include "webrtc/rtc_base/trace_event.h"
|
| +#include "webrtc/system_wrappers/include/field_trial.h"
|
|
|
| namespace webrtc {
|
|
|
| @@ -183,7 +185,23 @@ VCMEncodedFrameCallback::VCMEncodedFrameCallback(
|
| media_opt_(media_opt),
|
| framerate_(1),
|
| last_timing_frame_time_ms_(-1),
|
| - timing_frames_thresholds_({-1, 0}) {}
|
| + timing_frames_thresholds_({-1, 0}) {
|
| + rtc::Optional<AlrDetector::AlrExperimentSettings> experiment_settings =
|
| + AlrDetector::ParseAlrSettingsFromFieldTrial(
|
| + AlrDetector::kStrictPacingAndProbingExperimentName);
|
| + if (experiment_settings) {
|
| + experiment_groups_[0] = experiment_settings->group_id + 1;
|
| + } else {
|
| + experiment_groups_[0] = 0;
|
| + }
|
| + experiment_settings = AlrDetector::ParseAlrSettingsFromFieldTrial(
|
| + AlrDetector::kScreenshareProbingBweExperimentName);
|
| + if (experiment_settings) {
|
| + experiment_groups_[1] = experiment_settings->group_id + 1;
|
| + } else {
|
| + experiment_groups_[1] = 0;
|
| + }
|
| +}
|
|
|
| VCMEncodedFrameCallback::~VCMEncodedFrameCallback() {}
|
|
|
| @@ -231,13 +249,15 @@ EncodedImageCallback::Result VCMEncodedFrameCallback::OnEncodedImage(
|
|
|
| rtc::Optional<size_t> outlier_frame_size;
|
| rtc::Optional<int64_t> encode_start_ms;
|
| + size_t num_simulcast_svc_streams = 1;
|
| uint8_t timing_flags = TimingFrameFlags::kInvalid;
|
| {
|
| rtc::CritScope crit(&timing_params_lock_);
|
|
|
| // Encoders with internal sources do not call OnEncodeStarted and
|
| // OnFrameRateChanged. |timing_frames_info_| may be not filled here.
|
| - if (simulcast_svc_idx < timing_frames_info_.size()) {
|
| + num_simulcast_svc_streams = timing_frames_info_.size();
|
| + if (simulcast_svc_idx < num_simulcast_svc_streams) {
|
| auto encode_start_map =
|
| &timing_frames_info_[simulcast_svc_idx].encode_start_time_ms;
|
| auto it = encode_start_map->find(encoded_image.capture_time_ms_);
|
| @@ -299,6 +319,23 @@ EncodedImageCallback::Result VCMEncodedFrameCallback::OnEncodedImage(
|
| encoded_image.timing_.flags = TimingFrameFlags::kInvalid;
|
| }
|
|
|
| + // Piggyback ALR experiment group id and simulcast id into the content type.
|
| + uint8_t experiment_id =
|
| + experiment_groups_[videocontenttypehelpers::IsScreenshare(
|
| + encoded_image.content_type_)];
|
| +
|
| + // TODO(ilnik): This will force content type extension to be present even
|
| + // for realtime video. At the expense of miniscule overhead we will get
|
| + // sliced receive statistics.
|
| + RTC_CHECK(videocontenttypehelpers::SetExperimentId(
|
| + &encoded_image.content_type_, experiment_id));
|
| + // We count simulcast streams from 1 on the wire. That's why we set simulcast
|
| + // id in content type to +1 of that is actual simulcast index. This is because
|
| + // value 0 on the wire is reserved for 'no simulcast stream specified'.
|
| + RTC_CHECK(videocontenttypehelpers::SetSimulcastId(
|
| + &encoded_image.content_type_,
|
| + static_cast<uint8_t>(simulcast_svc_idx + 1)));
|
| +
|
| Result result = post_encode_callback_->OnEncodedImage(
|
| encoded_image, codec_specific, fragmentation_header);
|
| if (result.error != Result::OK)
|
|
|