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

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

Issue 765643006: Cast: Make receiver use cast_transport (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix end2end test Created 6 years 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 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 8
9 #include "base/big_endian.h" 9 #include "base/big_endian.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "media/cast/cast_environment.h" 13 #include "media/cast/cast_environment.h"
14 14
15 namespace { 15 namespace {
16 const int kMinSchedulingDelayMs = 1; 16 const int kMinSchedulingDelayMs = 1;
17 } // namespace 17 } // namespace
18 18
19 namespace media { 19 namespace media {
20 namespace cast { 20 namespace cast {
21 21
22 FrameReceiver::FrameReceiver( 22 FrameReceiver::FrameReceiver(
23 const scoped_refptr<CastEnvironment>& cast_environment, 23 const scoped_refptr<CastEnvironment>& cast_environment,
24 const FrameReceiverConfig& config, 24 const FrameReceiverConfig& config,
25 EventMediaType event_media_type, 25 EventMediaType event_media_type,
26 PacedPacketSender* const packet_sender) 26 CastTransportSender* const transport)
27 : cast_environment_(cast_environment), 27 : cast_environment_(cast_environment),
28 transport_(transport),
28 packet_parser_(config.incoming_ssrc, config.rtp_payload_type), 29 packet_parser_(config.incoming_ssrc, config.rtp_payload_type),
29 stats_(cast_environment->Clock()), 30 stats_(cast_environment->Clock()),
30 event_media_type_(event_media_type), 31 event_media_type_(event_media_type),
31 event_subscriber_(kReceiverRtcpEventHistorySize, event_media_type), 32 event_subscriber_(kReceiverRtcpEventHistorySize, event_media_type),
32 rtp_timebase_(config.frequency), 33 rtp_timebase_(config.frequency),
33 target_playout_delay_( 34 target_playout_delay_(
34 base::TimeDelta::FromMilliseconds(config.rtp_max_delay_ms)), 35 base::TimeDelta::FromMilliseconds(config.rtp_max_delay_ms)),
35 expected_frame_duration_( 36 expected_frame_duration_(
36 base::TimeDelta::FromSeconds(1) / config.max_frame_rate), 37 base::TimeDelta::FromSeconds(1) / config.max_frame_rate),
37 reports_are_scheduled_(false), 38 reports_are_scheduled_(false),
38 framer_(cast_environment->Clock(), 39 framer_(cast_environment->Clock(),
39 this, 40 this,
40 config.incoming_ssrc, 41 config.incoming_ssrc,
41 true, 42 true,
42 config.rtp_max_delay_ms * config.max_frame_rate / 1000), 43 config.rtp_max_delay_ms * config.max_frame_rate / 1000),
43 rtcp_(RtcpCastMessageCallback(), 44 rtcp_(RtcpCastMessageCallback(),
44 RtcpRttCallback(), 45 RtcpRttCallback(),
45 RtcpLogMessageCallback(), 46 RtcpLogMessageCallback(),
46 cast_environment_->Clock(), 47 cast_environment_->Clock(),
47 packet_sender, 48 NULL,
48 config.feedback_ssrc, 49 config.feedback_ssrc,
49 config.incoming_ssrc), 50 config.incoming_ssrc),
50 is_waiting_for_consecutive_frame_(false), 51 is_waiting_for_consecutive_frame_(false),
51 lip_sync_drift_(ClockDriftSmoother::GetDefaultTimeConstant()), 52 lip_sync_drift_(ClockDriftSmoother::GetDefaultTimeConstant()),
52 rtcp_interval_(base::TimeDelta::FromMilliseconds(config.rtcp_interval)), 53 rtcp_interval_(base::TimeDelta::FromMilliseconds(config.rtcp_interval)),
53 weak_factory_(this) { 54 weak_factory_(this) {
55 transport_->AddValidSsrc(config.incoming_ssrc);
54 DCHECK_GT(config.rtp_max_delay_ms, 0); 56 DCHECK_GT(config.rtp_max_delay_ms, 0);
55 DCHECK_GT(config.max_frame_rate, 0); 57 DCHECK_GT(config.max_frame_rate, 0);
56 decryptor_.Initialize(config.aes_key, config.aes_iv_mask); 58 decryptor_.Initialize(config.aes_key, config.aes_iv_mask);
57 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber_); 59 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber_);
58 memset(frame_id_to_rtp_timestamp_, 0, sizeof(frame_id_to_rtp_timestamp_)); 60 memset(frame_id_to_rtp_timestamp_, 0, sizeof(frame_id_to_rtp_timestamp_));
59 } 61 }
60 62
61 FrameReceiver::~FrameReceiver() { 63 FrameReceiver::~FrameReceiver() {
62 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 64 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
63 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber_); 65 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber_);
(...skipping 29 matching lines...) Expand all
93 95
94 if (!reports_are_scheduled_) { 96 if (!reports_are_scheduled_) {
95 ScheduleNextRtcpReport(); 97 ScheduleNextRtcpReport();
96 ScheduleNextCastMessage(); 98 ScheduleNextCastMessage();
97 reports_are_scheduled_ = true; 99 reports_are_scheduled_ = true;
98 } 100 }
99 101
100 return true; 102 return true;
101 } 103 }
102 104
103 // static
104 bool FrameReceiver::ParseSenderSsrc(const uint8* packet,
105 size_t length,
106 uint32* ssrc) {
107 base::BigEndianReader big_endian_reader(
108 reinterpret_cast<const char*>(packet), length);
109 return big_endian_reader.Skip(8) && big_endian_reader.ReadU32(ssrc);
110 }
111
112 void FrameReceiver::ProcessParsedPacket(const RtpCastHeader& rtp_header, 105 void FrameReceiver::ProcessParsedPacket(const RtpCastHeader& rtp_header,
113 const uint8* payload_data, 106 const uint8* payload_data,
114 size_t payload_size) { 107 size_t payload_size) {
115 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 108 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
116 109
117 const base::TimeTicks now = cast_environment_->Clock()->NowTicks(); 110 const base::TimeTicks now = cast_environment_->Clock()->NowTicks();
118 111
119 frame_id_to_rtp_timestamp_[rtp_header.frame_id & 0xff] = 112 frame_id_to_rtp_timestamp_[rtp_header.frame_id & 0xff] =
120 rtp_header.rtp_timestamp; 113 rtp_header.rtp_timestamp;
121 cast_environment_->Logging()->InsertPacketEvent( 114 cast_environment_->Logging()->InsertPacketEvent(
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 void FrameReceiver::CastFeedback(const RtcpCastMessage& cast_message) { 163 void FrameReceiver::CastFeedback(const RtcpCastMessage& cast_message) {
171 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 164 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
172 165
173 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); 166 base::TimeTicks now = cast_environment_->Clock()->NowTicks();
174 RtpTimestamp rtp_timestamp = 167 RtpTimestamp rtp_timestamp =
175 frame_id_to_rtp_timestamp_[cast_message.ack_frame_id & 0xff]; 168 frame_id_to_rtp_timestamp_[cast_message.ack_frame_id & 0xff];
176 cast_environment_->Logging()->InsertFrameEvent( 169 cast_environment_->Logging()->InsertFrameEvent(
177 now, FRAME_ACK_SENT, event_media_type_, 170 now, FRAME_ACK_SENT, event_media_type_,
178 rtp_timestamp, cast_message.ack_frame_id); 171 rtp_timestamp, cast_message.ack_frame_id);
179 172
180 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; 173 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events;
181 event_subscriber_.GetRtcpEventsAndReset(&rtcp_events); 174 event_subscriber_.GetRtcpEventsWithRedundancy(&rtcp_events);
182 rtcp_.SendRtcpFromRtpReceiver(&cast_message, target_playout_delay_, 175 transport_->SendRtcpFromRtpReceiver(rtcp_.GetLocalSsrc(),
183 &rtcp_events, NULL); 176 rtcp_.GetRemoteSsrc(),
177 rtcp_.ConvertToNTPAndSave(now),
178 &cast_message,
179 target_playout_delay_,
180 &rtcp_events,
181 NULL);
184 } 182 }
185 183
186 void FrameReceiver::EmitAvailableEncodedFrames() { 184 void FrameReceiver::EmitAvailableEncodedFrames() {
187 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 185 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
188 186
189 while (!frame_request_queue_.empty()) { 187 while (!frame_request_queue_.empty()) {
190 // Attempt to peek at the next completed frame from the |framer_|. 188 // Attempt to peek at the next completed frame from the |framer_|.
191 // TODO(miu): We should only be peeking at the metadata, and not copying the 189 // TODO(miu): We should only be peeking at the metadata, and not copying the
192 // payload yet! Or, at least, peek using a StringPiece instead of a copy. 190 // payload yet! Or, at least, peek using a StringPiece instead of a copy.
193 scoped_ptr<EncodedFrame> encoded_frame( 191 scoped_ptr<EncodedFrame> encoded_frame(
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 cast_environment_->PostDelayedTask( 327 cast_environment_->PostDelayedTask(
330 CastEnvironment::MAIN, 328 CastEnvironment::MAIN,
331 FROM_HERE, 329 FROM_HERE,
332 base::Bind(&FrameReceiver::SendNextRtcpReport, 330 base::Bind(&FrameReceiver::SendNextRtcpReport,
333 weak_factory_.GetWeakPtr()), 331 weak_factory_.GetWeakPtr()),
334 time_to_next); 332 time_to_next);
335 } 333 }
336 334
337 void FrameReceiver::SendNextRtcpReport() { 335 void FrameReceiver::SendNextRtcpReport() {
338 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 336 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
337 const base::TimeTicks now = cast_environment_->Clock()->NowTicks();
339 RtpReceiverStatistics stats = stats_.GetStatistics(); 338 RtpReceiverStatistics stats = stats_.GetStatistics();
340 rtcp_.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats); 339 transport_->SendRtcpFromRtpReceiver(rtcp_.GetLocalSsrc(),
340 rtcp_.GetRemoteSsrc(),
341 rtcp_.ConvertToNTPAndSave(now),
342 NULL,
343 base::TimeDelta(),
344 NULL,
345 &stats);
341 ScheduleNextRtcpReport(); 346 ScheduleNextRtcpReport();
342 } 347 }
343 348
344 } // namespace cast 349 } // namespace cast
345 } // namespace media 350 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698