OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "media/cast/receiver/frame_receiver.h" | 5 #include "media/cast/receiver/frame_receiver.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/big_endian.h" | 10 #include "base/big_endian.h" |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 ack_sent_event->timestamp = now; | 188 ack_sent_event->timestamp = now; |
189 ack_sent_event->type = FRAME_ACK_SENT; | 189 ack_sent_event->type = FRAME_ACK_SENT; |
190 ack_sent_event->media_type = event_media_type_; | 190 ack_sent_event->media_type = event_media_type_; |
191 ack_sent_event->rtp_timestamp = rtp_timestamp; | 191 ack_sent_event->rtp_timestamp = rtp_timestamp; |
192 ack_sent_event->frame_id = cast_message.ack_frame_id; | 192 ack_sent_event->frame_id = cast_message.ack_frame_id; |
193 cast_environment_->logger()->DispatchFrameEvent(std::move(ack_sent_event)); | 193 cast_environment_->logger()->DispatchFrameEvent(std::move(ack_sent_event)); |
194 | 194 |
195 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; | 195 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; |
196 event_subscriber_.GetRtcpEventsWithRedundancy(&rtcp_events); | 196 event_subscriber_.GetRtcpEventsWithRedundancy(&rtcp_events); |
197 SendRtcpReport(rtcp_.local_ssrc(), rtcp_.remote_ssrc(), | 197 SendRtcpReport(rtcp_.local_ssrc(), rtcp_.remote_ssrc(), |
198 CreateRtcpTimeData(now), &cast_message, target_playout_delay_, | 198 CreateRtcpTimeData(now), &cast_message, nullptr, |
199 &rtcp_events, NULL); | 199 target_playout_delay_, &rtcp_events, nullptr); |
200 } | 200 } |
201 | 201 |
202 void FrameReceiver::EmitAvailableEncodedFrames() { | 202 void FrameReceiver::EmitAvailableEncodedFrames() { |
203 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 203 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
204 | 204 |
205 while (!frame_request_queue_.empty()) { | 205 while (!frame_request_queue_.empty()) { |
206 // Attempt to peek at the next completed frame from the |framer_|. | 206 // Attempt to peek at the next completed frame from the |framer_|. |
207 // TODO(miu): We should only be peeking at the metadata, and not copying the | 207 // TODO(miu): We should only be peeking at the metadata, and not copying the |
208 // payload yet! Or, at least, peek using a StringPiece instead of a copy. | 208 // payload yet! Or, at least, peek using a StringPiece instead of a copy. |
209 scoped_ptr<EncodedFrame> encoded_frame( | 209 scoped_ptr<EncodedFrame> encoded_frame( |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 base::Bind(&FrameReceiver::SendNextRtcpReport, | 342 base::Bind(&FrameReceiver::SendNextRtcpReport, |
343 weak_factory_.GetWeakPtr()), | 343 weak_factory_.GetWeakPtr()), |
344 base::TimeDelta::FromMilliseconds(kRtcpReportIntervalMs)); | 344 base::TimeDelta::FromMilliseconds(kRtcpReportIntervalMs)); |
345 } | 345 } |
346 | 346 |
347 void FrameReceiver::SendNextRtcpReport() { | 347 void FrameReceiver::SendNextRtcpReport() { |
348 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 348 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
349 const base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 349 const base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
350 RtpReceiverStatistics stats = stats_.GetStatistics(); | 350 RtpReceiverStatistics stats = stats_.GetStatistics(); |
351 SendRtcpReport(rtcp_.local_ssrc(), rtcp_.remote_ssrc(), | 351 SendRtcpReport(rtcp_.local_ssrc(), rtcp_.remote_ssrc(), |
352 CreateRtcpTimeData(now), NULL, base::TimeDelta(), NULL, | 352 CreateRtcpTimeData(now), nullptr, nullptr, base::TimeDelta(), |
353 &stats); | 353 nullptr, &stats); |
354 ScheduleNextRtcpReport(); | 354 ScheduleNextRtcpReport(); |
355 } | 355 } |
356 | 356 |
357 void FrameReceiver::SendRtcpReport( | 357 void FrameReceiver::SendRtcpReport( |
358 uint32_t rtp_receiver_ssrc, | 358 uint32_t rtp_receiver_ssrc, |
359 uint32_t rtp_sender_ssrc, | 359 uint32_t rtp_sender_ssrc, |
360 const RtcpTimeData& time_data, | 360 const RtcpTimeData& time_data, |
361 const RtcpCastMessage* cast_message, | 361 const RtcpCastMessage* cast_message, |
| 362 const RtcpPliMessage* pli_message, |
362 base::TimeDelta target_delay, | 363 base::TimeDelta target_delay, |
363 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, | 364 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, |
364 const RtpReceiverStatistics* rtp_receiver_statistics) { | 365 const RtpReceiverStatistics* rtp_receiver_statistics) { |
365 transport_->InitializeRtpReceiverRtcpBuilder(rtp_receiver_ssrc, time_data); | 366 transport_->InitializeRtpReceiverRtcpBuilder(rtp_receiver_ssrc, time_data); |
366 RtcpReportBlock report_block; | 367 RtcpReportBlock report_block; |
367 if (rtp_receiver_statistics) { | 368 if (rtp_receiver_statistics) { |
368 report_block.remote_ssrc = 0; // Not needed to set send side. | 369 report_block.remote_ssrc = 0; // Not needed to set send side. |
369 report_block.media_ssrc = | 370 report_block.media_ssrc = |
370 rtp_sender_ssrc; // SSRC of the RTP packet sender. | 371 rtp_sender_ssrc; // SSRC of the RTP packet sender. |
371 report_block.fraction_lost = rtp_receiver_statistics->fraction_lost; | 372 report_block.fraction_lost = rtp_receiver_statistics->fraction_lost; |
(...skipping 12 matching lines...) Expand all Loading... |
384 &delay_fraction); | 385 &delay_fraction); |
385 report_block.delay_since_last_sr = | 386 report_block.delay_since_last_sr = |
386 ConvertToNtpDiff(delay_seconds, delay_fraction); | 387 ConvertToNtpDiff(delay_seconds, delay_fraction); |
387 } else { | 388 } else { |
388 report_block.delay_since_last_sr = 0; | 389 report_block.delay_since_last_sr = 0; |
389 } | 390 } |
390 transport_->AddRtpReceiverReport(report_block); | 391 transport_->AddRtpReceiverReport(report_block); |
391 } | 392 } |
392 if (cast_message) | 393 if (cast_message) |
393 transport_->AddCastFeedback(*cast_message, target_delay); | 394 transport_->AddCastFeedback(*cast_message, target_delay); |
| 395 if (pli_message) |
| 396 transport_->AddPli(*pli_message); |
394 if (rtcp_events) | 397 if (rtcp_events) |
395 transport_->AddRtcpEvents(*rtcp_events); | 398 transport_->AddRtcpEvents(*rtcp_events); |
396 transport_->SendRtcpFromRtpReceiver(); | 399 transport_->SendRtcpFromRtpReceiver(); |
397 } | 400 } |
398 | 401 |
399 } // namespace cast | 402 } // namespace cast |
400 } // namespace media | 403 } // namespace media |
OLD | NEW |