OLD | NEW |
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 Loading... |
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 Loading... |
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(¶ms_lock_); | 93 rtc::CritScope lock(¶ms_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 Loading... |
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 |
OLD | NEW |