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

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

Powered by Google App Engine
This is Rietveld 408576698