Index: media/cast/receiver/frame_receiver.cc |
diff --git a/media/cast/receiver/frame_receiver.cc b/media/cast/receiver/frame_receiver.cc |
index b9d5a6ea6785ad11478e311a986bbe9c49dfbb1d..d7a12e68a26e9da1182e9b63955890274c04074a 100644 |
--- a/media/cast/receiver/frame_receiver.cc |
+++ b/media/cast/receiver/frame_receiver.cc |
@@ -59,7 +59,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() { |
@@ -92,7 +91,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_) { |
@@ -136,7 +135,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 |
@@ -154,9 +153,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>(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( |
@@ -173,7 +173,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()); |
@@ -302,12 +302,10 @@ base::TimeTicks FrameReceiver::GetPlayoutTime(const EncodedFrame& frame) const { |
target_playout_delay = base::TimeDelta::FromMilliseconds( |
frame.new_playout_delay_ms); |
} |
- return lip_sync_reference_time_ + |
- lip_sync_drift_.Current() + |
- RtpDeltaToTimeDelta( |
- static_cast<int32>(frame.rtp_timestamp - lip_sync_rtp_timestamp_), |
- rtp_timebase_) + |
- target_playout_delay; |
+ return lip_sync_reference_time_ + lip_sync_drift_.Current() + |
+ (frame.rtp_timestamp - lip_sync_rtp_timestamp_) |
+ .ToTimeDelta(rtp_timebase_) + |
+ target_playout_delay; |
} |
void FrameReceiver::ScheduleNextCastMessage() { |