| Index: webrtc/modules/audio_coding/neteq/neteq_impl.cc | 
| diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.cc b/webrtc/modules/audio_coding/neteq/neteq_impl.cc | 
| index 89bddeccf8eb99f65e961efd591c24263816acdb..e119d9439cfbb617f38dfe27c1a9773792f8664c 100644 | 
| --- a/webrtc/modules/audio_coding/neteq/neteq_impl.cc | 
| +++ b/webrtc/modules/audio_coding/neteq/neteq_impl.cc | 
| @@ -364,8 +364,14 @@ int NetEqImpl::SetTargetDelay() { | 
| return kNotImplemented; | 
| } | 
|  | 
| -int NetEqImpl::TargetDelay() { | 
| -  return kNotImplemented; | 
| +int NetEqImpl::TargetDelayMs() { | 
| +  rtc::CritScope lock(&crit_sect_); | 
| +  RTC_DCHECK(delay_manager_.get()); | 
| +  // The value from TargetLevel() is in number of packets, represented in Q8. | 
| +  const size_t target_delay_samples = | 
| +      (delay_manager_->TargetLevel() * decoder_frame_length_) >> 8; | 
| +  return static_cast<int>(target_delay_samples) / | 
| +         rtc::CheckedDivExact(fs_hz_, 1000); | 
| } | 
|  | 
| int NetEqImpl::CurrentDelayMs() const { | 
| @@ -569,6 +575,17 @@ std::vector<uint16_t> NetEqImpl::GetNackList(int64_t round_trip_time_ms) const { | 
| return nack_->GetNackList(round_trip_time_ms); | 
| } | 
|  | 
| +std::vector<uint32_t> NetEqImpl::LastDecodedTimestamps() const { | 
| +  rtc::CritScope lock(&crit_sect_); | 
| +  return last_decoded_timestamps_; | 
| +} | 
| + | 
| +int NetEqImpl::SyncBufferSizeMs() const { | 
| +  rtc::CritScope lock(&crit_sect_); | 
| +  return rtc::dchecked_cast<int>(sync_buffer_->FutureLength() / | 
| +                                 rtc::CheckedDivExact(fs_hz_, 1000)); | 
| +} | 
| + | 
| const SyncBuffer* NetEqImpl::sync_buffer_for_test() const { | 
| rtc::CritScope lock(&crit_sect_); | 
| return sync_buffer_.get(); | 
| @@ -873,6 +890,7 @@ int NetEqImpl::GetAudioInternal(AudioFrame* audio_frame, bool* muted) { | 
| Operations operation; | 
| bool play_dtmf; | 
| *muted = false; | 
| +  last_decoded_timestamps_.clear(); | 
| tick_timer_->Increment(); | 
| stats_.IncreaseCounter(output_size_samples_, fs_hz_); | 
|  | 
| @@ -1498,6 +1516,8 @@ int NetEqImpl::DecodeCng(AudioDecoder* decoder, int* decoded_length, | 
| int NetEqImpl::DecodeLoop(PacketList* packet_list, const Operations& operation, | 
| AudioDecoder* decoder, int* decoded_length, | 
| AudioDecoder::SpeechType* speech_type) { | 
| +  RTC_DCHECK(last_decoded_timestamps_.empty()); | 
| + | 
| // Do decoding. | 
| while ( | 
| !packet_list->empty() && | 
| @@ -1514,6 +1534,7 @@ int NetEqImpl::DecodeLoop(PacketList* packet_list, const Operations& operation, | 
| auto opt_result = packet_list->front().frame->Decode( | 
| rtc::ArrayView<int16_t>(&decoded_buffer_[*decoded_length], | 
| decoded_buffer_length_ - *decoded_length)); | 
| +    last_decoded_timestamps_.push_back(packet_list->front().timestamp); | 
| packet_list->pop_front(); | 
| if (opt_result) { | 
| const auto& result = *opt_result; | 
|  |