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

Side by Side Diff: media/cast/receiver/frame_receiver.cc

Issue 1709863002: Add Cast PLI support on sender side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address dcheng's comments. Created 4 years, 9 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
« no previous file with comments | « media/cast/receiver/frame_receiver.h ('k') | media/cast/receiver/frame_receiver_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « media/cast/receiver/frame_receiver.h ('k') | media/cast/receiver/frame_receiver_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698