Index: media/cast/receiver/frame_receiver.cc |
diff --git a/media/cast/receiver/frame_receiver.cc b/media/cast/receiver/frame_receiver.cc |
index 3c92be10bbaf94efa4550dd4a426d8f0a7a6c3a7..ae38c5599ca3a79eff4e036e8018e383b07b2949 100644 |
--- a/media/cast/receiver/frame_receiver.cc |
+++ b/media/cast/receiver/frame_receiver.cc |
@@ -60,7 +60,6 @@ FrameReceiver::FrameReceiver( |
DCHECK_GT(config.target_frame_rate, 0); |
decryptor_.Initialize(config.aes_key, config.aes_iv_mask); |
cast_environment_->logger()->Subscribe(&event_subscriber_); |
- memset(frame_id_to_rtp_timestamp_, 0, sizeof(frame_id_to_rtp_timestamp_)); |
} |
FrameReceiver::~FrameReceiver() { |
@@ -93,7 +92,7 @@ bool FrameReceiver::ProcessPacket(scoped_ptr<Packet> packet) { |
} |
ProcessParsedPacket(rtp_header, payload_data, payload_size); |
- stats_.UpdateStatistics(rtp_header); |
+ stats_.UpdateStatistics(rtp_header, rtp_timebase_); |
} |
if (!reports_are_scheduled_) { |
@@ -137,7 +136,7 @@ void FrameReceiver::ProcessParsedPacket(const RtpCastHeader& rtp_header, |
// Update lip-sync values upon receiving the first packet of each frame, or if |
// they have never been set yet. |
if (rtp_header.packet_id == 0 || lip_sync_reference_time_.is_null()) { |
- RtpTimestamp fresh_sync_rtp; |
+ RtpTimeTicks fresh_sync_rtp; |
base::TimeTicks fresh_sync_reference; |
if (!rtcp_.GetLatestLipSyncTimes(&fresh_sync_rtp, &fresh_sync_reference)) { |
// HACK: The sender should have provided Sender Reports before the first |
@@ -155,9 +154,10 @@ void FrameReceiver::ProcessParsedPacket(const RtpCastHeader& rtp_header, |
if (lip_sync_reference_time_.is_null()) { |
lip_sync_reference_time_ = fresh_sync_reference; |
} else { |
- lip_sync_reference_time_ += RtpDeltaToTimeDelta( |
- static_cast<int32_t>(fresh_sync_rtp - lip_sync_rtp_timestamp_), |
- rtp_timebase_); |
+ // Note: It's okay for the conversion ToTimeDelta() to be approximate |
+ // because |lip_sync_drift_| will account for accumulated errors. |
+ lip_sync_reference_time_ += |
+ (fresh_sync_rtp - lip_sync_rtp_timestamp_).ToTimeDelta(rtp_timebase_); |
} |
lip_sync_rtp_timestamp_ = fresh_sync_rtp; |
lip_sync_drift_.Update( |
@@ -174,7 +174,7 @@ void FrameReceiver::CastFeedback(const RtcpCastMessage& cast_message) { |
DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
- RtpTimestamp rtp_timestamp = |
+ RtpTimeTicks rtp_timestamp = |
frame_id_to_rtp_timestamp_[cast_message.ack_frame_id & 0xff]; |
scoped_ptr<FrameEvent> ack_sent_event(new FrameEvent()); |
@@ -304,9 +304,8 @@ base::TimeTicks FrameReceiver::GetPlayoutTime(const EncodedFrame& frame) const { |
frame.new_playout_delay_ms); |
} |
return lip_sync_reference_time_ + lip_sync_drift_.Current() + |
- RtpDeltaToTimeDelta(static_cast<int32_t>(frame.rtp_timestamp - |
- lip_sync_rtp_timestamp_), |
- rtp_timebase_) + |
+ (frame.rtp_timestamp - lip_sync_rtp_timestamp_) |
+ .ToTimeDelta(rtp_timebase_) + |
target_playout_delay; |
} |