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

Side by Side Diff: webrtc/modules/video_coding/generic_encoder.cc

Issue 3011213002: Move reencode logic for screenshare bitrate overshoot from generic (Closed)
Patch Set: Implement sprang@ comments Created 3 years, 3 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 unified diff | Download patch
« no previous file with comments | « webrtc/modules/video_coding/generic_encoder.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 15 matching lines...) Expand all
26 namespace webrtc { 26 namespace webrtc {
27 27
28 VCMGenericEncoder::VCMGenericEncoder( 28 VCMGenericEncoder::VCMGenericEncoder(
29 VideoEncoder* encoder, 29 VideoEncoder* encoder,
30 VCMEncodedFrameCallback* encoded_frame_callback, 30 VCMEncodedFrameCallback* encoded_frame_callback,
31 bool internal_source) 31 bool internal_source)
32 : encoder_(encoder), 32 : encoder_(encoder),
33 vcm_encoded_frame_callback_(encoded_frame_callback), 33 vcm_encoded_frame_callback_(encoded_frame_callback),
34 internal_source_(internal_source), 34 internal_source_(internal_source),
35 encoder_params_({BitrateAllocation(), 0, 0, 0}), 35 encoder_params_({BitrateAllocation(), 0, 0, 0}),
36 is_screenshare_(false),
37 streams_or_svc_num_(0) {} 36 streams_or_svc_num_(0) {}
38 37
39 VCMGenericEncoder::~VCMGenericEncoder() {} 38 VCMGenericEncoder::~VCMGenericEncoder() {}
40 39
41 int32_t VCMGenericEncoder::Release() { 40 int32_t VCMGenericEncoder::Release() {
42 RTC_DCHECK_RUNS_SERIALIZED(&race_checker_); 41 RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
43 TRACE_EVENT0("webrtc", "VCMGenericEncoder::Release"); 42 TRACE_EVENT0("webrtc", "VCMGenericEncoder::Release");
44 return encoder_->Release(); 43 return encoder_->Release();
45 } 44 }
46 45
47 int32_t VCMGenericEncoder::InitEncode(const VideoCodec* settings, 46 int32_t VCMGenericEncoder::InitEncode(const VideoCodec* settings,
48 int32_t number_of_cores, 47 int32_t number_of_cores,
49 size_t max_payload_size) { 48 size_t max_payload_size) {
50 RTC_DCHECK_RUNS_SERIALIZED(&race_checker_); 49 RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
51 TRACE_EVENT0("webrtc", "VCMGenericEncoder::InitEncode"); 50 TRACE_EVENT0("webrtc", "VCMGenericEncoder::InitEncode");
52 is_screenshare_ = settings->mode == VideoCodecMode::kScreensharing;
53 streams_or_svc_num_ = settings->numberOfSimulcastStreams; 51 streams_or_svc_num_ = settings->numberOfSimulcastStreams;
54 if (settings->codecType == kVideoCodecVP9) { 52 if (settings->codecType == kVideoCodecVP9) {
55 streams_or_svc_num_ = settings->VP9().numberOfSpatialLayers; 53 streams_or_svc_num_ = settings->VP9().numberOfSpatialLayers;
56 } 54 }
57 if (streams_or_svc_num_ == 0) 55 if (streams_or_svc_num_ == 0)
58 streams_or_svc_num_ = 1; 56 streams_or_svc_num_ = 1;
59 57
60 vcm_encoded_frame_callback_->SetTimingFramesThresholds( 58 vcm_encoded_frame_callback_->SetTimingFramesThresholds(
61 settings->timing_frame_thresholds); 59 settings->timing_frame_thresholds);
62 vcm_encoded_frame_callback_->OnFrameRateChanged(settings->maxFramerate); 60 vcm_encoded_frame_callback_->OnFrameRateChanged(settings->maxFramerate);
(...skipping 13 matching lines...) Expand all
76 const std::vector<FrameType>& frame_types) { 74 const std::vector<FrameType>& frame_types) {
77 RTC_DCHECK_RUNS_SERIALIZED(&race_checker_); 75 RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
78 TRACE_EVENT1("webrtc", "VCMGenericEncoder::Encode", "timestamp", 76 TRACE_EVENT1("webrtc", "VCMGenericEncoder::Encode", "timestamp",
79 frame.timestamp()); 77 frame.timestamp());
80 78
81 for (FrameType frame_type : frame_types) 79 for (FrameType frame_type : frame_types)
82 RTC_DCHECK(frame_type == kVideoFrameKey || frame_type == kVideoFrameDelta); 80 RTC_DCHECK(frame_type == kVideoFrameKey || frame_type == kVideoFrameDelta);
83 81
84 for (size_t i = 0; i < streams_or_svc_num_; ++i) 82 for (size_t i = 0; i < streams_or_svc_num_; ++i)
85 vcm_encoded_frame_callback_->OnEncodeStarted(frame.render_time_ms(), i); 83 vcm_encoded_frame_callback_->OnEncodeStarted(frame.render_time_ms(), i);
86 int32_t result = encoder_->Encode(frame, codec_specific, &frame_types);
87 84
88 if (is_screenshare_ && 85 return encoder_->Encode(frame, codec_specific, &frame_types);
89 result == WEBRTC_VIDEO_CODEC_TARGET_BITRATE_OVERSHOOT) {
90 // Target bitrate exceeded, encoder state has been reset - try again.
91 return encoder_->Encode(frame, codec_specific, &frame_types);
92 }
93
94 return result;
95 } 86 }
96 87
97 void VCMGenericEncoder::SetEncoderParameters(const EncoderParameters& params) { 88 void VCMGenericEncoder::SetEncoderParameters(const EncoderParameters& params) {
98 RTC_DCHECK_RUNS_SERIALIZED(&race_checker_); 89 RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
99 bool channel_parameters_have_changed; 90 bool channel_parameters_have_changed;
100 bool rates_have_changed; 91 bool rates_have_changed;
101 { 92 {
102 rtc::CritScope lock(&params_lock_); 93 rtc::CritScope lock(&params_lock_);
103 channel_parameters_have_changed = 94 channel_parameters_have_changed =
104 params.loss_rate != encoder_params_.loss_rate || 95 params.loss_rate != encoder_params_.loss_rate ||
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 media_opt_->UpdateWithEncodedData(encoded_image); 336 media_opt_->UpdateWithEncodedData(encoded_image);
346 if (internal_source_) { 337 if (internal_source_) {
347 // Signal to encoder to drop next frame. 338 // Signal to encoder to drop next frame.
348 result.drop_next_frame = media_opt_->DropFrame(); 339 result.drop_next_frame = media_opt_->DropFrame();
349 } 340 }
350 } 341 }
351 return result; 342 return result;
352 } 343 }
353 344
354 } // namespace webrtc 345 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/video_coding/generic_encoder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698