OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 29 matching lines...) Expand all Loading... |
40 ss << "{decoders: ["; | 40 ss << "{decoders: ["; |
41 for (size_t i = 0; i < decoders.size(); ++i) { | 41 for (size_t i = 0; i < decoders.size(); ++i) { |
42 ss << decoders[i].ToString(); | 42 ss << decoders[i].ToString(); |
43 if (i != decoders.size() - 1) | 43 if (i != decoders.size() - 1) |
44 ss << ", "; | 44 ss << ", "; |
45 } | 45 } |
46 ss << ']'; | 46 ss << ']'; |
47 ss << ", rtp: " << rtp.ToString(); | 47 ss << ", rtp: " << rtp.ToString(); |
48 ss << ", renderer: " << (renderer != nullptr ? "(renderer)" : "nullptr"); | 48 ss << ", renderer: " << (renderer != nullptr ? "(renderer)" : "nullptr"); |
49 ss << ", render_delay_ms: " << render_delay_ms; | 49 ss << ", render_delay_ms: " << render_delay_ms; |
50 ss << ", audio_channel_id: " << audio_channel_id; | 50 if (!sync_group.empty()) |
| 51 ss << ", sync_group: " << sync_group; |
51 ss << ", pre_decode_callback: " | 52 ss << ", pre_decode_callback: " |
52 << (pre_decode_callback != nullptr ? "(EncodedFrameObserver)" : "nullptr"); | 53 << (pre_decode_callback != nullptr ? "(EncodedFrameObserver)" : "nullptr"); |
53 ss << ", pre_render_callback: " | 54 ss << ", pre_render_callback: " |
54 << (pre_render_callback != nullptr ? "(I420FrameCallback)" : "nullptr"); | 55 << (pre_render_callback != nullptr ? "(I420FrameCallback)" : "nullptr"); |
55 ss << ", target_delay_ms: " << target_delay_ms; | 56 ss << ", target_delay_ms: " << target_delay_ms; |
56 ss << '}'; | 57 ss << '}'; |
57 | 58 |
58 return ss.str(); | 59 return ss.str(); |
59 } | 60 } |
60 | 61 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 ChannelGroup* channel_group, | 129 ChannelGroup* channel_group, |
129 int channel_id, | 130 int channel_id, |
130 const VideoReceiveStream::Config& config, | 131 const VideoReceiveStream::Config& config, |
131 newapi::Transport* transport, | 132 newapi::Transport* transport, |
132 webrtc::VoiceEngine* voice_engine) | 133 webrtc::VoiceEngine* voice_engine) |
133 : transport_adapter_(transport), | 134 : transport_adapter_(transport), |
134 encoded_frame_proxy_(config.pre_decode_callback), | 135 encoded_frame_proxy_(config.pre_decode_callback), |
135 config_(config), | 136 config_(config), |
136 clock_(Clock::GetRealTimeClock()), | 137 clock_(Clock::GetRealTimeClock()), |
137 channel_group_(channel_group), | 138 channel_group_(channel_group), |
138 channel_id_(channel_id), | 139 channel_id_(channel_id) { |
139 voe_sync_interface_(nullptr) { | |
140 CHECK(channel_group_->CreateReceiveChannel(channel_id_, 0, base_channel_id, | 140 CHECK(channel_group_->CreateReceiveChannel(channel_id_, 0, base_channel_id, |
141 &transport_adapter_, num_cpu_cores, | 141 &transport_adapter_, num_cpu_cores, |
142 true)); | 142 true)); |
143 | 143 |
144 vie_channel_ = channel_group_->GetChannel(channel_id_); | 144 vie_channel_ = channel_group_->GetChannel(channel_id_); |
145 | 145 |
146 // TODO(pbos): This is not fine grained enough... | 146 // TODO(pbos): This is not fine grained enough... |
147 vie_channel_->SetProtectionMode(config_.rtp.nack.rtp_history_ms > 0, false, | 147 vie_channel_->SetProtectionMode(config_.rtp.nack.rtp_history_ms > 0, false, |
148 -1, -1); | 148 -1, -1); |
149 vie_channel_->SetKeyFrameRequestMethod(kKeyFrameReqPliRtcp); | 149 vie_channel_->SetKeyFrameRequestMethod(kKeyFrameReqPliRtcp); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 VideoCodec codec = CreateDecoderVideoCodec(decoder); | 235 VideoCodec codec = CreateDecoderVideoCodec(decoder); |
236 | 236 |
237 CHECK_EQ(0, vie_channel_->SetReceiveCodec(codec)); | 237 CHECK_EQ(0, vie_channel_->SetReceiveCodec(codec)); |
238 } | 238 } |
239 | 239 |
240 incoming_video_stream_.reset(new IncomingVideoStream(0)); | 240 incoming_video_stream_.reset(new IncomingVideoStream(0)); |
241 incoming_video_stream_->SetExpectedRenderDelay(config.render_delay_ms); | 241 incoming_video_stream_->SetExpectedRenderDelay(config.render_delay_ms); |
242 incoming_video_stream_->SetExternalCallback(this); | 242 incoming_video_stream_->SetExternalCallback(this); |
243 vie_channel_->SetIncomingVideoStream(incoming_video_stream_.get()); | 243 vie_channel_->SetIncomingVideoStream(incoming_video_stream_.get()); |
244 | 244 |
245 if (voice_engine && config_.audio_channel_id != -1) { | |
246 voe_sync_interface_ = VoEVideoSync::GetInterface(voice_engine); | |
247 vie_channel_->SetVoiceChannel(config.audio_channel_id, voe_sync_interface_); | |
248 } | |
249 | |
250 if (config.pre_decode_callback) | 245 if (config.pre_decode_callback) |
251 vie_channel_->RegisterPreDecodeImageCallback(&encoded_frame_proxy_); | 246 vie_channel_->RegisterPreDecodeImageCallback(&encoded_frame_proxy_); |
252 vie_channel_->RegisterPreRenderCallback(this); | 247 vie_channel_->RegisterPreRenderCallback(this); |
253 } | 248 } |
254 | 249 |
255 VideoReceiveStream::~VideoReceiveStream() { | 250 VideoReceiveStream::~VideoReceiveStream() { |
256 incoming_video_stream_->Stop(); | 251 incoming_video_stream_->Stop(); |
257 vie_channel_->RegisterPreRenderCallback(nullptr); | 252 vie_channel_->RegisterPreRenderCallback(nullptr); |
258 vie_channel_->RegisterPreDecodeImageCallback(nullptr); | 253 vie_channel_->RegisterPreDecodeImageCallback(nullptr); |
259 | 254 |
260 for (size_t i = 0; i < config_.decoders.size(); ++i) | 255 for (size_t i = 0; i < config_.decoders.size(); ++i) |
261 vie_channel_->DeRegisterExternalDecoder(config_.decoders[i].payload_type); | 256 vie_channel_->DeRegisterExternalDecoder(config_.decoders[i].payload_type); |
262 | 257 |
263 if (voe_sync_interface_ != nullptr) { | |
264 vie_channel_->SetVoiceChannel(-1, nullptr); | |
265 voe_sync_interface_->Release(); | |
266 } | |
267 vie_channel_->RegisterCodecObserver(nullptr); | 258 vie_channel_->RegisterCodecObserver(nullptr); |
268 vie_channel_->RegisterReceiveChannelRtpStatisticsCallback(nullptr); | 259 vie_channel_->RegisterReceiveChannelRtpStatisticsCallback(nullptr); |
269 vie_channel_->RegisterReceiveChannelRtcpStatisticsCallback(nullptr); | 260 vie_channel_->RegisterReceiveChannelRtcpStatisticsCallback(nullptr); |
270 vie_channel_->RegisterRtcpPacketTypeCounterObserver(nullptr); | 261 vie_channel_->RegisterRtcpPacketTypeCounterObserver(nullptr); |
271 channel_group_->DeleteChannel(channel_id_); | 262 channel_group_->DeleteChannel(channel_id_); |
272 } | 263 } |
273 | 264 |
274 void VideoReceiveStream::Start() { | 265 void VideoReceiveStream::Start() { |
275 transport_adapter_.Enable(); | 266 transport_adapter_.Enable(); |
276 incoming_video_stream_->Start(); | 267 incoming_video_stream_->Start(); |
277 vie_channel_->StartReceive(); | 268 vie_channel_->StartReceive(); |
278 } | 269 } |
279 | 270 |
280 void VideoReceiveStream::Stop() { | 271 void VideoReceiveStream::Stop() { |
281 incoming_video_stream_->Stop(); | 272 incoming_video_stream_->Stop(); |
282 vie_channel_->StopReceive(); | 273 vie_channel_->StopReceive(); |
283 transport_adapter_.Disable(); | 274 transport_adapter_.Disable(); |
284 } | 275 } |
285 | 276 |
| 277 void VideoReceiveStream::SetSyncChannel(VoiceEngine* voice_engine, |
| 278 int audio_channel_id) { |
| 279 if (voice_engine != nullptr && audio_channel_id != -1) { |
| 280 VoEVideoSync* voe_sync_interface = VoEVideoSync::GetInterface(voice_engine); |
| 281 vie_channel_->SetVoiceChannel(audio_channel_id, voe_sync_interface); |
| 282 voe_sync_interface->Release(); |
| 283 } else { |
| 284 vie_channel_->SetVoiceChannel(-1, nullptr); |
| 285 } |
| 286 } |
| 287 |
286 VideoReceiveStream::Stats VideoReceiveStream::GetStats() const { | 288 VideoReceiveStream::Stats VideoReceiveStream::GetStats() const { |
287 return stats_proxy_->GetStats(); | 289 return stats_proxy_->GetStats(); |
288 } | 290 } |
289 | 291 |
290 bool VideoReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) { | 292 bool VideoReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) { |
291 return vie_channel_->ReceivedRTCPPacket(packet, length) == 0; | 293 return vie_channel_->ReceivedRTCPPacket(packet, length) == 0; |
292 } | 294 } |
293 | 295 |
294 bool VideoReceiveStream::DeliverRtp(const uint8_t* packet, size_t length) { | 296 bool VideoReceiveStream::DeliverRtp(const uint8_t* packet, size_t length) { |
295 return vie_channel_->ReceivedRTPPacket(packet, length, PacketTime()) == 0; | 297 return vie_channel_->ReceivedRTPPacket(packet, length, PacketTime()) == 0; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 case newapi::kRtcpCompound: | 335 case newapi::kRtcpCompound: |
334 vie_channel_->SetRTCPMode(kRtcpCompound); | 336 vie_channel_->SetRTCPMode(kRtcpCompound); |
335 break; | 337 break; |
336 case newapi::kRtcpReducedSize: | 338 case newapi::kRtcpReducedSize: |
337 vie_channel_->SetRTCPMode(kRtcpNonCompound); | 339 vie_channel_->SetRTCPMode(kRtcpNonCompound); |
338 break; | 340 break; |
339 } | 341 } |
340 } | 342 } |
341 } // namespace internal | 343 } // namespace internal |
342 } // namespace webrtc | 344 } // namespace webrtc |
OLD | NEW |