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

Side by Side Diff: remoting/protocol/webrtc_video_encoder.cc

Issue 1908203002: Adapt encoder behavior to target bitrate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/protocol/webrtc_video_encoder.h" 5 #include "remoting/protocol/webrtc_video_encoder.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 26 matching lines...) Expand all
37 int streamCount = codec_settings->numberOfSimulcastStreams; 37 int streamCount = codec_settings->numberOfSimulcastStreams;
38 // Validate request is to support a single stream. 38 // Validate request is to support a single stream.
39 if (streamCount > 1) { 39 if (streamCount > 1) {
40 for (int i = 0; i < streamCount; ++i) { 40 for (int i = 0; i < streamCount; ++i) {
41 if (codec_settings->simulcastStream[i].maxBitrate != 0) { 41 if (codec_settings->simulcastStream[i].maxBitrate != 0) {
42 LOG(ERROR) << "Simulcast unsupported"; 42 LOG(ERROR) << "Simulcast unsupported";
43 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; 43 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
44 } 44 }
45 } 45 }
46 } 46 }
47 target_bitrate_ = codec_settings->startBitrate;
48 state_ = kInitialized; 47 state_ = kInitialized;
49 return WEBRTC_VIDEO_CODEC_OK; 48 return WEBRTC_VIDEO_CODEC_OK;
50 } 49 }
51 50
52 int32_t WebRtcVideoEncoder::RegisterEncodeCompleteCallback( 51 int32_t WebRtcVideoEncoder::RegisterEncodeCompleteCallback(
53 webrtc::EncodedImageCallback* callback) { 52 webrtc::EncodedImageCallback* callback) {
54 base::AutoLock lock(lock_); 53 base::AutoLock lock(lock_);
55 DCHECK(callback); 54 DCHECK(callback);
56 encoded_callback_ = callback; 55 encoded_callback_ = callback;
57 return WEBRTC_VIDEO_CODEC_OK; 56 return WEBRTC_VIDEO_CODEC_OK;
(...skipping 19 matching lines...) Expand all
77 int64_t rtt) { 76 int64_t rtt) {
78 VLOG(1) << "WebRtcVideoEncoder::SetChannelParameters " 77 VLOG(1) << "WebRtcVideoEncoder::SetChannelParameters "
79 << "loss:RTT " << packet_loss << ":" << rtt; 78 << "loss:RTT " << packet_loss << ":" << rtt;
80 // Unused right now. 79 // Unused right now.
81 return WEBRTC_VIDEO_CODEC_OK; 80 return WEBRTC_VIDEO_CODEC_OK;
82 } 81 }
83 82
84 int32_t WebRtcVideoEncoder::SetRates(uint32_t bitrate, uint32_t framerate) { 83 int32_t WebRtcVideoEncoder::SetRates(uint32_t bitrate, uint32_t framerate) {
85 VLOG(1) << "WebRtcVideoEncoder::SetRates bitrate:framerate " << bitrate << ":" 84 VLOG(1) << "WebRtcVideoEncoder::SetRates bitrate:framerate " << bitrate << ":"
86 << framerate; 85 << framerate;
87 target_bitrate_ = bitrate; 86 if (!target_bitrate_cb_.is_null())
87 target_bitrate_cb_.Run(bitrate);
88 // framerate is not expected to be valid given we never report captured 88 // framerate is not expected to be valid given we never report captured
89 // frames 89 // frames
90 return WEBRTC_VIDEO_CODEC_OK; 90 return WEBRTC_VIDEO_CODEC_OK;
91 } 91 }
92 92
93 int WebRtcVideoEncoder::SendEncodedFrame(int64_t capture_timestamp_ms, 93 int WebRtcVideoEncoder::SendEncodedFrame(int64_t capture_timestamp_ms,
94 std::unique_ptr<VideoPacket> frame) { 94 std::unique_ptr<VideoPacket> frame) {
95 uint8_t* buffer = 95 uint8_t* buffer =
96 reinterpret_cast<uint8_t*>(const_cast<char*>(frame->data().data())); 96 reinterpret_cast<uint8_t*>(const_cast<char*>(frame->data().data()));
97 size_t buffer_size = frame->data().size(); 97 size_t buffer_size = frame->data().size();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 } 137 }
138 return result; 138 return result;
139 } 139 }
140 140
141 void WebRtcVideoEncoder::SetKeyFrameRequestCallback( 141 void WebRtcVideoEncoder::SetKeyFrameRequestCallback(
142 const base::Closure& key_frame_request) { 142 const base::Closure& key_frame_request) {
143 base::AutoLock lock(lock_); 143 base::AutoLock lock(lock_);
144 key_frame_request_ = key_frame_request; 144 key_frame_request_ = key_frame_request;
145 } 145 }
146 146
147 void WebRtcVideoEncoder::SetTargetBitrateCallback(
148 const TargetBitrateCallback& target_bitrate_cb) {
149 base::AutoLock lock(lock_);
150 target_bitrate_cb_ = target_bitrate_cb;
151 }
152
147 WebRtcVideoEncoderFactory::WebRtcVideoEncoderFactory() { 153 WebRtcVideoEncoderFactory::WebRtcVideoEncoderFactory() {
148 // TODO(isheriff): These do not really affect anything internally 154 // TODO(isheriff): These do not really affect anything internally
149 // in webrtc. 155 // in webrtc.
150 codecs_.push_back(cricket::WebRtcVideoEncoderFactory::VideoCodec( 156 codecs_.push_back(cricket::WebRtcVideoEncoderFactory::VideoCodec(
151 webrtc::kVideoCodecVP8, "VP8", 1280, 720, 30)); 157 webrtc::kVideoCodecVP8, "VP8", 1280, 720, 30));
152 } 158 }
153 159
154 WebRtcVideoEncoderFactory::~WebRtcVideoEncoderFactory() { 160 WebRtcVideoEncoderFactory::~WebRtcVideoEncoderFactory() {
155 DCHECK(encoders_.empty()); 161 DCHECK(encoders_.empty());
156 } 162 }
157 163
158 webrtc::VideoEncoder* WebRtcVideoEncoderFactory::CreateVideoEncoder( 164 webrtc::VideoEncoder* WebRtcVideoEncoderFactory::CreateVideoEncoder(
159 webrtc::VideoCodecType type) { 165 webrtc::VideoCodecType type) {
160 VLOG(2) << "WebRtcVideoEncoderFactory::CreateVideoEncoder " << type; 166 VLOG(2) << "WebRtcVideoEncoderFactory::CreateVideoEncoder " << type;
161 DCHECK(type == webrtc::kVideoCodecVP8); 167 DCHECK(type == webrtc::kVideoCodecVP8);
162 WebRtcVideoEncoder* encoder = new WebRtcVideoEncoder(type); 168 WebRtcVideoEncoder* encoder = new WebRtcVideoEncoder(type);
163 base::AutoLock lock(lock_); 169 base::AutoLock lock(lock_);
164 encoder->SetKeyFrameRequestCallback(key_frame_request_); 170 encoder->SetKeyFrameRequestCallback(key_frame_request_);
171 encoder->SetTargetBitrateCallback(target_bitrate_cb_);
165 VLOG(1) << "Created " << encoder; 172 VLOG(1) << "Created " << encoder;
166 encoders_.push_back(base::WrapUnique(encoder)); 173 encoders_.push_back(base::WrapUnique(encoder));
167 return encoder; 174 return encoder;
168 } 175 }
169 176
170 const std::vector<cricket::WebRtcVideoEncoderFactory::VideoCodec>& 177 const std::vector<cricket::WebRtcVideoEncoderFactory::VideoCodec>&
171 WebRtcVideoEncoderFactory::codecs() const { 178 WebRtcVideoEncoderFactory::codecs() const {
172 VLOG(2) << "WebRtcVideoEncoderFactory::codecs"; 179 VLOG(2) << "WebRtcVideoEncoderFactory::codecs";
173 return codecs_; 180 return codecs_;
174 } 181 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 base::AutoLock lock(lock_); 218 base::AutoLock lock(lock_);
212 key_frame_request_ = key_frame_request; 219 key_frame_request_ = key_frame_request;
213 if (encoders_.size() == 1) { 220 if (encoders_.size() == 1) {
214 encoders_.front()->SetKeyFrameRequestCallback(key_frame_request); 221 encoders_.front()->SetKeyFrameRequestCallback(key_frame_request);
215 } else { 222 } else {
216 LOG(ERROR) << "Dropping key frame request callback with unexpected" 223 LOG(ERROR) << "Dropping key frame request callback with unexpected"
217 " number of encoders" 224 " number of encoders"
218 << encoders_.size(); 225 << encoders_.size();
219 } 226 }
220 } 227 }
228
229 void WebRtcVideoEncoderFactory::SetTargetBitrateCallback(
230 const TargetBitrateCallback& target_bitrate_cb) {
231 base::AutoLock lock(lock_);
232 target_bitrate_cb_ = target_bitrate_cb;
233 if (encoders_.size() == 1) {
234 encoders_.front()->SetTargetBitrateCallback(target_bitrate_cb);
235 } else {
236 LOG(ERROR) << "Dropping target bitrate request callback with unexpected"
237 " number of encoders"
238 << encoders_.size();
239 }
240 }
221 } // namespace remoting 241 } // namespace remoting
OLDNEW
« remoting/codec/video_encoder_vpx.cc ('K') | « remoting/protocol/webrtc_video_encoder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698