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

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

Issue 1520613004: cast: Split Rtcp into two for sender and receiver (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@timestamp
Patch Set: Rebased Created 4 years, 11 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/sender/audio_sender_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 <utility> 8 #include <string>
9 9
10 #include "base/big_endian.h" 10 #include "base/big_endian.h"
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/message_loop/message_loop.h" 13 #include "base/message_loop/message_loop.h"
14 #include "media/cast/cast_config.h" 14 #include "media/cast/cast_config.h"
15 #include "media/cast/cast_defines.h" 15 #include "media/cast/cast_defines.h"
16 #include "media/cast/cast_environment.h" 16 #include "media/cast/cast_environment.h"
17 #include "media/cast/constants.h" 17 #include "media/cast/constants.h"
18 #include "media/cast/net/rtcp/rtcp_utility.h"
18 19
19 namespace { 20 namespace {
21
20 const int kMinSchedulingDelayMs = 1; 22 const int kMinSchedulingDelayMs = 1;
23
24 media::cast::RtcpTimeData CreateRtcpTimeData(base::TimeTicks now) {
25 media::cast::RtcpTimeData ret;
26 ret.timestamp = now;
27 media::cast::ConvertTimeTicksToNtp(now, &ret.ntp_seconds, &ret.ntp_fraction);
28 return ret;
29 }
30
21 } // namespace 31 } // namespace
22 32
23 namespace media { 33 namespace media {
24 namespace cast { 34 namespace cast {
25 35
26 FrameReceiver::FrameReceiver( 36 FrameReceiver::FrameReceiver(
27 const scoped_refptr<CastEnvironment>& cast_environment, 37 const scoped_refptr<CastEnvironment>& cast_environment,
28 const FrameReceiverConfig& config, 38 const FrameReceiverConfig& config,
29 EventMediaType event_media_type, 39 EventMediaType event_media_type,
30 CastTransportSender* const transport) 40 CastTransportSender* const transport)
31 : cast_environment_(cast_environment), 41 : cast_environment_(cast_environment),
32 transport_(transport), 42 transport_(transport),
33 packet_parser_(config.sender_ssrc, config.rtp_payload_type), 43 packet_parser_(config.sender_ssrc, config.rtp_payload_type),
34 stats_(cast_environment->Clock()), 44 stats_(cast_environment->Clock()),
35 event_media_type_(event_media_type), 45 event_media_type_(event_media_type),
36 event_subscriber_(kReceiverRtcpEventHistorySize, event_media_type), 46 event_subscriber_(kReceiverRtcpEventHistorySize, event_media_type),
37 rtp_timebase_(config.rtp_timebase), 47 rtp_timebase_(config.rtp_timebase),
38 target_playout_delay_( 48 target_playout_delay_(
39 base::TimeDelta::FromMilliseconds(config.rtp_max_delay_ms)), 49 base::TimeDelta::FromMilliseconds(config.rtp_max_delay_ms)),
40 expected_frame_duration_( 50 expected_frame_duration_(base::TimeDelta::FromSeconds(1) /
41 base::TimeDelta::FromSeconds(1) / config.target_frame_rate), 51 config.target_frame_rate),
42 reports_are_scheduled_(false), 52 reports_are_scheduled_(false),
43 framer_(cast_environment->Clock(), 53 framer_(cast_environment->Clock(),
44 this, 54 this,
45 config.sender_ssrc, 55 config.sender_ssrc,
46 true, 56 true,
47 config.rtp_max_delay_ms * config.target_frame_rate / 1000), 57 config.rtp_max_delay_ms * config.target_frame_rate / 1000),
48 rtcp_(RtcpCastMessageCallback(), 58 rtcp_(cast_environment_->Clock(),
49 RtcpRttCallback(),
50 RtcpLogMessageCallback(),
51 cast_environment_->Clock(),
52 NULL, 59 NULL,
53 config.receiver_ssrc, 60 config.receiver_ssrc,
54 config.sender_ssrc), 61 config.sender_ssrc),
55 is_waiting_for_consecutive_frame_(false), 62 is_waiting_for_consecutive_frame_(false),
56 lip_sync_drift_(ClockDriftSmoother::GetDefaultTimeConstant()), 63 lip_sync_drift_(ClockDriftSmoother::GetDefaultTimeConstant()),
57 weak_factory_(this) { 64 weak_factory_(this) {
58 transport_->AddValidSsrc(config.sender_ssrc); 65 transport_->AddValidSsrc(config.sender_ssrc);
59 DCHECK_GT(config.rtp_max_delay_ms, 0); 66 DCHECK_GT(config.rtp_max_delay_ms, 0);
60 DCHECK_GT(config.target_frame_rate, 0); 67 DCHECK_GT(config.target_frame_rate, 0);
61 decryptor_.Initialize(config.aes_key, config.aes_iv_mask); 68 decryptor_.Initialize(config.aes_key, config.aes_iv_mask);
62 cast_environment_->logger()->Subscribe(&event_subscriber_); 69 cast_environment_->logger()->Subscribe(&event_subscriber_);
63 } 70 }
64 71
65 FrameReceiver::~FrameReceiver() { 72 FrameReceiver::~FrameReceiver() {
66 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 73 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
67 cast_environment_->logger()->Unsubscribe(&event_subscriber_); 74 cast_environment_->logger()->Unsubscribe(&event_subscriber_);
68 } 75 }
69 76
70 void FrameReceiver::RequestEncodedFrame( 77 void FrameReceiver::RequestEncodedFrame(
71 const ReceiveEncodedFrameCallback& callback) { 78 const ReceiveEncodedFrameCallback& callback) {
72 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 79 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
73 frame_request_queue_.push_back(callback); 80 frame_request_queue_.push_back(callback);
74 EmitAvailableEncodedFrames(); 81 EmitAvailableEncodedFrames();
75 } 82 }
76 83
77 bool FrameReceiver::ProcessPacket(scoped_ptr<Packet> packet) { 84 bool FrameReceiver::ProcessPacket(scoped_ptr<Packet> packet) {
78 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 85 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
79 86
80 if (Rtcp::IsRtcpPacket(&packet->front(), packet->size())) { 87 if (IsRtcpPacket(&packet->front(), packet->size())) {
81 rtcp_.IncomingRtcpPacket(&packet->front(), packet->size()); 88 rtcp_.IncomingRtcpPacket(&packet->front(), packet->size());
82 } else { 89 } else {
83 RtpCastHeader rtp_header; 90 RtpCastHeader rtp_header;
84 const uint8_t* payload_data; 91 const uint8_t* payload_data;
85 size_t payload_size; 92 size_t payload_size;
86 if (!packet_parser_.ParsePacket(&packet->front(), 93 if (!packet_parser_.ParsePacket(&packet->front(),
87 packet->size(), 94 packet->size(),
88 &rtp_header, 95 &rtp_header,
89 &payload_data, 96 &payload_data,
90 &payload_size)) { 97 &payload_size)) {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 scoped_ptr<FrameEvent> ack_sent_event(new FrameEvent()); 187 scoped_ptr<FrameEvent> ack_sent_event(new FrameEvent());
181 ack_sent_event->timestamp = now; 188 ack_sent_event->timestamp = now;
182 ack_sent_event->type = FRAME_ACK_SENT; 189 ack_sent_event->type = FRAME_ACK_SENT;
183 ack_sent_event->media_type = event_media_type_; 190 ack_sent_event->media_type = event_media_type_;
184 ack_sent_event->rtp_timestamp = rtp_timestamp; 191 ack_sent_event->rtp_timestamp = rtp_timestamp;
185 ack_sent_event->frame_id = cast_message.ack_frame_id; 192 ack_sent_event->frame_id = cast_message.ack_frame_id;
186 cast_environment_->logger()->DispatchFrameEvent(std::move(ack_sent_event)); 193 cast_environment_->logger()->DispatchFrameEvent(std::move(ack_sent_event));
187 194
188 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; 195 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events;
189 event_subscriber_.GetRtcpEventsWithRedundancy(&rtcp_events); 196 event_subscriber_.GetRtcpEventsWithRedundancy(&rtcp_events);
190 transport_->SendRtcpFromRtpReceiver(rtcp_.GetLocalSsrc(), 197 transport_->SendRtcpFromRtpReceiver(
191 rtcp_.GetRemoteSsrc(), 198 rtcp_.local_ssrc(), rtcp_.remote_ssrc(), CreateRtcpTimeData(now),
192 rtcp_.ConvertToNTPAndSave(now), 199 &cast_message, target_playout_delay_, &rtcp_events, NULL);
193 &cast_message,
194 target_playout_delay_,
195 &rtcp_events,
196 NULL);
197 } 200 }
198 201
199 void FrameReceiver::EmitAvailableEncodedFrames() { 202 void FrameReceiver::EmitAvailableEncodedFrames() {
200 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 203 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
201 204
202 while (!frame_request_queue_.empty()) { 205 while (!frame_request_queue_.empty()) {
203 // Attempt to peek at the next completed frame from the |framer_|. 206 // Attempt to peek at the next completed frame from the |framer_|.
204 // 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
205 // 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.
206 scoped_ptr<EncodedFrame> encoded_frame( 209 scoped_ptr<EncodedFrame> encoded_frame(
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 CastEnvironment::MAIN, FROM_HERE, 341 CastEnvironment::MAIN, FROM_HERE,
339 base::Bind(&FrameReceiver::SendNextRtcpReport, 342 base::Bind(&FrameReceiver::SendNextRtcpReport,
340 weak_factory_.GetWeakPtr()), 343 weak_factory_.GetWeakPtr()),
341 base::TimeDelta::FromMilliseconds(kRtcpReportIntervalMs)); 344 base::TimeDelta::FromMilliseconds(kRtcpReportIntervalMs));
342 } 345 }
343 346
344 void FrameReceiver::SendNextRtcpReport() { 347 void FrameReceiver::SendNextRtcpReport() {
345 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 348 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
346 const base::TimeTicks now = cast_environment_->Clock()->NowTicks(); 349 const base::TimeTicks now = cast_environment_->Clock()->NowTicks();
347 RtpReceiverStatistics stats = stats_.GetStatistics(); 350 RtpReceiverStatistics stats = stats_.GetStatistics();
348 transport_->SendRtcpFromRtpReceiver(rtcp_.GetLocalSsrc(), 351 transport_->SendRtcpFromRtpReceiver(rtcp_.local_ssrc(), rtcp_.remote_ssrc(),
349 rtcp_.GetRemoteSsrc(), 352 CreateRtcpTimeData(now), NULL,
350 rtcp_.ConvertToNTPAndSave(now), 353 base::TimeDelta(), NULL, &stats);
351 NULL,
352 base::TimeDelta(),
353 NULL,
354 &stats);
355 ScheduleNextRtcpReport(); 354 ScheduleNextRtcpReport();
356 } 355 }
357 356
358 } // namespace cast 357 } // namespace cast
359 } // namespace media 358 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/receiver/frame_receiver.h ('k') | media/cast/sender/audio_sender_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698