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

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

Issue 2782523003: [Remoting Host] Supporting WebRTC VP9 streaming (Closed)
Patch Set: Fix Feedback Created 3 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_dummy_video_encoder.h" 5 #include "remoting/protocol/webrtc_dummy_video_encoder.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "base/synchronization/lock.h" 14 #include "base/synchronization/lock.h"
15 #include "base/threading/thread_task_runner_handle.h" 15 #include "base/threading/thread_task_runner_handle.h"
16 #include "remoting/protocol/video_channel_state_observer.h" 16 #include "remoting/protocol/video_channel_state_observer.h"
17 17
18 namespace remoting { 18 namespace remoting {
19 namespace protocol { 19 namespace protocol {
20 20
21 WebrtcDummyVideoEncoder::WebrtcDummyVideoEncoder( 21 WebrtcDummyVideoEncoder::WebrtcDummyVideoEncoder(
22 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 22 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
23 base::WeakPtr<VideoChannelStateObserver> video_channel_state_observer) 23 base::WeakPtr<VideoChannelStateObserver> video_channel_state_observer,
24 webrtc::VideoCodecType type)
24 : main_task_runner_(main_task_runner), 25 : main_task_runner_(main_task_runner),
25 state_(kUninitialized), 26 state_(kUninitialized),
26 video_channel_state_observer_(video_channel_state_observer) {} 27 codec_type_(type),
28 video_channel_state_observer_(video_channel_state_observer) {
29 DCHECK(type == webrtc::kVideoCodecVP8 || type == webrtc::kVideoCodecVP9);
30 }
27 31
28 WebrtcDummyVideoEncoder::~WebrtcDummyVideoEncoder() {} 32 WebrtcDummyVideoEncoder::~WebrtcDummyVideoEncoder() {}
29 33
30 int32_t WebrtcDummyVideoEncoder::InitEncode( 34 int32_t WebrtcDummyVideoEncoder::InitEncode(
31 const webrtc::VideoCodec* codec_settings, 35 const webrtc::VideoCodec* codec_settings,
32 int32_t number_of_cores, 36 int32_t number_of_cores,
33 size_t max_payload_size) { 37 size_t max_payload_size) {
34 DCHECK(codec_settings); 38 DCHECK(codec_settings);
35 base::AutoLock lock(lock_); 39 base::AutoLock lock(lock_);
36 int stream_count = codec_settings->numberOfSimulcastStreams; 40 int stream_count = codec_settings->numberOfSimulcastStreams;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 encoded_image._frameType = 118 encoded_image._frameType =
115 frame.key_frame ? webrtc::kVideoFrameKey : webrtc::kVideoFrameDelta; 119 frame.key_frame ? webrtc::kVideoFrameKey : webrtc::kVideoFrameDelta;
116 int64_t capture_time_ms = (capture_time - base::TimeTicks()).InMilliseconds(); 120 int64_t capture_time_ms = (capture_time - base::TimeTicks()).InMilliseconds();
117 encoded_image.capture_time_ms_ = capture_time_ms; 121 encoded_image.capture_time_ms_ = capture_time_ms;
118 encoded_image._timeStamp = static_cast<uint32_t>(capture_time_ms * 90); 122 encoded_image._timeStamp = static_cast<uint32_t>(capture_time_ms * 90);
119 encoded_image.playout_delay_.min_ms = 0; 123 encoded_image.playout_delay_.min_ms = 0;
120 encoded_image.playout_delay_.max_ms = 0; 124 encoded_image.playout_delay_.max_ms = 0;
121 125
122 webrtc::CodecSpecificInfo codec_specific_info; 126 webrtc::CodecSpecificInfo codec_specific_info;
123 memset(&codec_specific_info, 0, sizeof(codec_specific_info)); 127 memset(&codec_specific_info, 0, sizeof(codec_specific_info));
124 codec_specific_info.codecType = webrtc::kVideoCodecVP8; 128 codec_specific_info.codecType = codec_type_;
129
130 if (codec_type_ == webrtc::kVideoCodecVP8) {
131 codec_specific_info.codecSpecific.VP8.simulcastIdx = 0;
132 codec_specific_info.codecSpecific.VP8.temporalIdx = webrtc::kNoTemporalIdx;
133 codec_specific_info.codecSpecific.VP8.tl0PicIdx = webrtc::kNoTl0PicIdx;
134 codec_specific_info.codecSpecific.VP8.pictureId = webrtc::kNoPictureId;
135 } else if (codec_type_ == webrtc::kVideoCodecVP9) {
136 codec_specific_info.codecSpecific.generic.simulcast_idx = 0;
137 codec_specific_info.codecSpecific.VP9.gof_idx = webrtc::kNoGofIdx;
138 codec_specific_info.codecSpecific.VP9.temporal_idx = webrtc::kNoTemporalIdx;
139 codec_specific_info.codecSpecific.VP9.spatial_idx = webrtc::kNoSpatialIdx;
140 codec_specific_info.codecSpecific.VP9.tl0_pic_idx = webrtc::kNoTl0PicIdx;
141 codec_specific_info.codecSpecific.VP9.picture_id = webrtc::kNoPictureId;
142 } else {
143 NOTREACHED();
144 }
125 145
126 webrtc::RTPFragmentationHeader header; 146 webrtc::RTPFragmentationHeader header;
127 memset(&header, 0, sizeof(header)); 147 memset(&header, 0, sizeof(header));
128 148
129 codec_specific_info.codecSpecific.VP8.simulcastIdx = 0;
130 codec_specific_info.codecSpecific.VP8.temporalIdx = webrtc::kNoTemporalIdx;
131 codec_specific_info.codecSpecific.VP8.tl0PicIdx = webrtc::kNoTl0PicIdx;
132 codec_specific_info.codecSpecific.VP8.pictureId = webrtc::kNoPictureId;
133
134 header.VerifyAndAllocateFragmentationHeader(1); 149 header.VerifyAndAllocateFragmentationHeader(1);
135 header.fragmentationOffset[0] = 0; 150 header.fragmentationOffset[0] = 0;
136 header.fragmentationLength[0] = buffer_size; 151 header.fragmentationLength[0] = buffer_size;
137 header.fragmentationPlType[0] = 0; 152 header.fragmentationPlType[0] = 0;
138 header.fragmentationTimeDiff[0] = 0; 153 header.fragmentationTimeDiff[0] = 0;
139 154
140 return encoded_callback_->OnEncodedImage(encoded_image, &codec_specific_info, 155 return encoded_callback_->OnEncodedImage(encoded_image, &codec_specific_info,
141 &header); 156 &header);
142 } 157 }
143 158
144 WebrtcDummyVideoEncoderFactory::WebrtcDummyVideoEncoderFactory() 159 WebrtcDummyVideoEncoderFactory::WebrtcDummyVideoEncoderFactory()
145 : main_task_runner_(base::ThreadTaskRunnerHandle::Get()) { 160 : main_task_runner_(base::ThreadTaskRunnerHandle::Get()) {
146 // TODO(isheriff): These do not really affect anything internally 161 // TODO(isheriff): These do not really affect anything internally
147 // in webrtc. 162 // in webrtc.
148 codecs_.push_back(cricket::WebRtcVideoEncoderFactory::VideoCodec( 163 codecs_.push_back(cricket::WebRtcVideoEncoderFactory::VideoCodec(
149 webrtc::kVideoCodecVP8, "VP8", 1280, 720, 30)); 164 webrtc::kVideoCodecVP9, "VP8", 1280, 720, 30));
165 codecs_.push_back(cricket::WebRtcVideoEncoderFactory::VideoCodec(
166 webrtc::kVideoCodecVP9, "VP9", 1280, 720, 30));
150 } 167 }
151 168
152 WebrtcDummyVideoEncoderFactory::~WebrtcDummyVideoEncoderFactory() { 169 WebrtcDummyVideoEncoderFactory::~WebrtcDummyVideoEncoderFactory() {
153 DCHECK(encoders_.empty()); 170 DCHECK(encoders_.empty());
154 } 171 }
155 172
156 webrtc::VideoEncoder* WebrtcDummyVideoEncoderFactory::CreateVideoEncoder( 173 webrtc::VideoEncoder* WebrtcDummyVideoEncoderFactory::CreateVideoEncoder(
157 webrtc::VideoCodecType type) { 174 webrtc::VideoCodecType type) {
158 DCHECK_EQ(type, webrtc::kVideoCodecVP8);
159 WebrtcDummyVideoEncoder* encoder = new WebrtcDummyVideoEncoder( 175 WebrtcDummyVideoEncoder* encoder = new WebrtcDummyVideoEncoder(
160 main_task_runner_, video_channel_state_observer_); 176 main_task_runner_, video_channel_state_observer_, type);
161 base::AutoLock lock(lock_); 177 base::AutoLock lock(lock_);
162 encoders_.push_back(base::WrapUnique(encoder)); 178 encoders_.push_back(base::WrapUnique(encoder));
179 if (encoder_created_callback_) {
180 main_task_runner_->PostTask(FROM_HERE,
181 base::Bind(encoder_created_callback_, type));
182 }
163 return encoder; 183 return encoder;
164 } 184 }
165 185
166 const std::vector<cricket::WebRtcVideoEncoderFactory::VideoCodec>& 186 const std::vector<cricket::WebRtcVideoEncoderFactory::VideoCodec>&
167 WebrtcDummyVideoEncoderFactory::codecs() const { 187 WebrtcDummyVideoEncoderFactory::codecs() const {
168 return codecs_; 188 return codecs_;
169 } 189 }
170 190
171 bool WebrtcDummyVideoEncoderFactory::EncoderTypeHasInternalSource( 191 bool WebrtcDummyVideoEncoderFactory::EncoderTypeHasInternalSource(
172 webrtc::VideoCodecType type) const { 192 webrtc::VideoCodecType type) const {
(...skipping 24 matching lines...) Expand all
197 DCHECK(main_task_runner_->BelongsToCurrentThread()); 217 DCHECK(main_task_runner_->BelongsToCurrentThread());
198 base::AutoLock lock(lock_); 218 base::AutoLock lock(lock_);
199 if (encoders_.size() != 1) { 219 if (encoders_.size() != 1) {
200 LOG(ERROR) << "Unexpected number of encoders " << encoders_.size(); 220 LOG(ERROR) << "Unexpected number of encoders " << encoders_.size();
201 return webrtc::EncodedImageCallback::Result( 221 return webrtc::EncodedImageCallback::Result(
202 webrtc::EncodedImageCallback::Result::ERROR_SEND_FAILED); 222 webrtc::EncodedImageCallback::Result::ERROR_SEND_FAILED);
203 } 223 }
204 return encoders_.front()->SendEncodedFrame(frame, capture_time); 224 return encoders_.front()->SendEncodedFrame(frame, capture_time);
205 } 225 }
206 226
227 void WebrtcDummyVideoEncoderFactory::RegisterEncoderSelectedCallback(
228 const base::Callback<void(webrtc::VideoCodecType)>& callback) {
229 encoder_created_callback_ = callback;
230 }
231
207 void WebrtcDummyVideoEncoderFactory::SetVideoChannelStateObserver( 232 void WebrtcDummyVideoEncoderFactory::SetVideoChannelStateObserver(
208 base::WeakPtr<VideoChannelStateObserver> video_channel_state_observer) { 233 base::WeakPtr<VideoChannelStateObserver> video_channel_state_observer) {
209 DCHECK(main_task_runner_->BelongsToCurrentThread()); 234 DCHECK(main_task_runner_->BelongsToCurrentThread());
210 DCHECK(encoders_.empty()); 235 DCHECK(encoders_.empty());
211 base::AutoLock lock(lock_); 236 base::AutoLock lock(lock_);
212 video_channel_state_observer_ = video_channel_state_observer; 237 video_channel_state_observer_ = video_channel_state_observer;
213 } 238 }
214 239
215 } // namespace protocol 240 } // namespace protocol
216 } // namespace remoting 241 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/protocol/webrtc_dummy_video_encoder.h ('k') | remoting/protocol/webrtc_frame_scheduler_simple.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698