Chromium Code Reviews| Index: media/cast/audio_receiver/audio_receiver.cc |
| diff --git a/media/cast/audio_receiver/audio_receiver.cc b/media/cast/audio_receiver/audio_receiver.cc |
| index b214c52c6d63309b214921a109eee975a3b84385..8413ff9f52ee9c2aecb8a641191e42fe2bdc6bb9 100644 |
| --- a/media/cast/audio_receiver/audio_receiver.cc |
| +++ b/media/cast/audio_receiver/audio_receiver.cc |
| @@ -4,6 +4,8 @@ |
| #include "media/cast/audio_receiver/audio_receiver.h" |
| +#include <algorithm> |
| + |
| #include "base/bind.h" |
| #include "base/logging.h" |
| #include "base/message_loop/message_loop.h" |
| @@ -11,8 +13,10 @@ |
| #include "media/cast/transport/cast_transport_defines.h" |
| namespace { |
| -const int kTypicalAudioFrameDurationMs = 10; |
| const int kMinSchedulingDelayMs = 1; |
| +// TODO(miu): These should go in AudioReceiverConfig. |
| +const int kTypicalAudioFrameDurationMs = 10; |
| +const int kTypicalFramesPerSecond = 1000 / kTypicalAudioFrameDurationMs; |
| } // namespace |
| namespace media { |
| @@ -27,11 +31,13 @@ AudioReceiver::AudioReceiver(scoped_refptr<CastEnvironment> cast_environment, |
| ReceiverRtcpEventSubscriber::kAudioEventSubscriber), |
| codec_(audio_config.codec), |
| frequency_(audio_config.frequency), |
| + target_delay_delta_( |
| + base::TimeDelta::FromMilliseconds(audio_config.rtp_max_delay_ms)), |
| framer_(cast_environment->Clock(), |
| - this, |
| - audio_config.incoming_ssrc, |
| - true, |
| - 0), |
| + this, |
| + audio_config.incoming_ssrc, |
| + true, |
| + audio_config.rtp_max_delay_ms * kTypicalFramesPerSecond / 1000), |
|
hubbe
2014/04/07 18:40:17
Seems simpler to just divide by kTypicalAudioFrame
miu
2014/04/08 00:59:41
Oh, duh. Yes, agreed. Done.
|
| rtcp_(cast_environment, |
| NULL, |
| NULL, |
| @@ -44,8 +50,6 @@ AudioReceiver::AudioReceiver(scoped_refptr<CastEnvironment> cast_environment, |
| audio_config.rtcp_c_name), |
| is_waiting_for_consecutive_frame_(false), |
| weak_factory_(this) { |
| - target_delay_delta_ = |
| - base::TimeDelta::FromMilliseconds(audio_config.rtp_max_delay_ms); |
| if (!audio_config.use_external_decoder) |
| audio_decoder_.reset(new AudioDecoder(cast_environment, audio_config)); |
| decryptor_.Initialize(audio_config.aes_key, audio_config.aes_iv_mask); |
| @@ -81,13 +85,6 @@ void AudioReceiver::OnReceivedPayloadData(const uint8* payload_data, |
| DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
| - frame_id_to_rtp_timestamp_[rtp_header.frame_id & 0xff] = |
| - rtp_header.webrtc.header.timestamp; |
| - cast_environment_->Logging()->InsertPacketEvent( |
| - now, kAudioPacketReceived, rtp_header.webrtc.header.timestamp, |
| - rtp_header.frame_id, rtp_header.packet_id, rtp_header.max_packet_id, |
| - payload_size); |
| - |
| // TODO(pwestin): update this as video to refresh over time. |
| if (time_first_incoming_packet_.is_null()) { |
| InitializeTimers(); |
| @@ -95,13 +92,24 @@ void AudioReceiver::OnReceivedPayloadData(const uint8* payload_data, |
| time_first_incoming_packet_ = now; |
| } |
| + frame_id_to_rtp_timestamp_[rtp_header.frame_id & 0xff] = |
| + rtp_header.webrtc.header.timestamp; |
| + cast_environment_->Logging()->InsertPacketEvent( |
| + now, kAudioPacketReceived, rtp_header.webrtc.header.timestamp, |
| + rtp_header.frame_id, rtp_header.packet_id, rtp_header.max_packet_id, |
| + payload_size); |
| + |
| bool duplicate = false; |
| const bool complete = |
| framer_.InsertPacket(payload_data, payload_size, rtp_header, &duplicate); |
| if (duplicate) { |
| cast_environment_->Logging()->InsertPacketEvent( |
| - now, kDuplicateAudioPacketReceived, rtp_header.webrtc.header.timestamp, |
| - rtp_header.frame_id, rtp_header.packet_id, rtp_header.max_packet_id, |
| + now, |
| + kDuplicateAudioPacketReceived, |
| + rtp_header.webrtc.header.timestamp, |
| + rtp_header.frame_id, |
| + rtp_header.packet_id, |
| + rtp_header.max_packet_id, |
| payload_size); |
| // Duplicate packets are ignored. |
| return; |
| @@ -197,6 +205,7 @@ void AudioReceiver::EmitAvailableEncodedFrames() { |
| const base::TimeTicks playout_time = |
| GetPlayoutTime(now, encoded_frame->rtp_timestamp); |
| if (!is_consecutively_next_frame) { |
| + // TODO(miu): Also account for expected decode time here? |
| const base::TimeTicks earliest_possible_end_time_of_missing_frame = |
| now + base::TimeDelta::FromMilliseconds(kTypicalAudioFrameDurationMs); |
| if (earliest_possible_end_time_of_missing_frame < playout_time) { |
| @@ -249,11 +258,10 @@ void AudioReceiver::EmitAvailableEncodedFramesAfterWaiting() { |
| void AudioReceiver::IncomingPacket(scoped_ptr<Packet> packet) { |
| DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| - bool rtcp_packet = Rtcp::IsRtcpPacket(&packet->front(), packet->size()); |
| - if (!rtcp_packet) { |
| - ReceivedPacket(&packet->front(), packet->size()); |
| - } else { |
| + if (Rtcp::IsRtcpPacket(&packet->front(), packet->size())) { |
| rtcp_.IncomingRtcpPacket(&packet->front(), packet->size()); |
| + } else { |
| + ReceivedPacket(&packet->front(), packet->size()); |
| } |
| } |
| @@ -341,7 +349,8 @@ void AudioReceiver::ScheduleNextRtcpReport() { |
| time_to_send, base::TimeDelta::FromMilliseconds(kMinSchedulingDelayMs)); |
| cast_environment_->PostDelayedTask( |
| - CastEnvironment::MAIN, FROM_HERE, |
| + CastEnvironment::MAIN, |
| + FROM_HERE, |
| base::Bind(&AudioReceiver::SendNextRtcpReport, |
| weak_factory_.GetWeakPtr()), |
| time_to_send); |
| @@ -365,7 +374,8 @@ void AudioReceiver::ScheduleNextCastMessage() { |
| time_to_send = std::max( |
| time_to_send, base::TimeDelta::FromMilliseconds(kMinSchedulingDelayMs)); |
| cast_environment_->PostDelayedTask( |
| - CastEnvironment::MAIN, FROM_HERE, |
| + CastEnvironment::MAIN, |
| + FROM_HERE, |
| base::Bind(&AudioReceiver::SendNextCastMessage, |
| weak_factory_.GetWeakPtr()), |
| time_to_send); |
| @@ -373,8 +383,7 @@ void AudioReceiver::ScheduleNextCastMessage() { |
| void AudioReceiver::SendNextCastMessage() { |
| DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| - // Will only send a message if it is time. |
| - framer_.SendCastMessage(); |
| + framer_.SendCastMessage(); // Will only send a message if it is time. |
| ScheduleNextCastMessage(); |
| } |