Send absolute capture time through audio coding module.

Bug: webrtc:10739
Change-Id: I44e0305be7c84b253172511c2977b1d700e40c1b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/167067
Reviewed-by: Oskar Sundbom <ossu@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Chen Xing <chxg@google.com>
Commit-Queue: Minyue Li <minyue@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30363}
This commit is contained in:
Minyue Li 2020-01-23 13:45:50 +01:00 committed by Commit Bot
parent cdd73e095c
commit 48655cfdbf
17 changed files with 69 additions and 30 deletions

View File

@ -146,17 +146,19 @@ class ChannelSend : public ChannelSendInterface,
// From AudioPacketizationCallback in the ACM // From AudioPacketizationCallback in the ACM
int32_t SendData(AudioFrameType frameType, int32_t SendData(AudioFrameType frameType,
uint8_t payloadType, uint8_t payloadType,
uint32_t timeStamp, uint32_t rtp_timestamp,
const uint8_t* payloadData, const uint8_t* payloadData,
size_t payloadSize) override; size_t payloadSize,
int64_t absolute_capture_timestamp_ms) override;
void OnUplinkPacketLossRate(float packet_loss_rate); void OnUplinkPacketLossRate(float packet_loss_rate);
bool InputMute() const; bool InputMute() const;
int32_t SendRtpAudio(AudioFrameType frameType, int32_t SendRtpAudio(AudioFrameType frameType,
uint8_t payloadType, uint8_t payloadType,
uint32_t timeStamp, uint32_t rtp_timestamp,
rtc::ArrayView<const uint8_t> payload) rtc::ArrayView<const uint8_t> payload,
int64_t absolute_capture_timestamp_ms)
RTC_RUN_ON(encoder_queue_); RTC_RUN_ON(encoder_queue_);
void OnReceivedRtt(int64_t rtt_ms); void OnReceivedRtt(int64_t rtt_ms);
@ -360,18 +362,21 @@ class VoERtcpObserver : public RtcpBandwidthObserver {
int32_t ChannelSend::SendData(AudioFrameType frameType, int32_t ChannelSend::SendData(AudioFrameType frameType,
uint8_t payloadType, uint8_t payloadType,
uint32_t timeStamp, uint32_t rtp_timestamp,
const uint8_t* payloadData, const uint8_t* payloadData,
size_t payloadSize) { size_t payloadSize,
int64_t absolute_capture_timestamp_ms) {
RTC_DCHECK_RUN_ON(&encoder_queue_); RTC_DCHECK_RUN_ON(&encoder_queue_);
rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize); rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
return SendRtpAudio(frameType, payloadType, timeStamp, payload); return SendRtpAudio(frameType, payloadType, rtp_timestamp, payload,
absolute_capture_timestamp_ms);
} }
int32_t ChannelSend::SendRtpAudio(AudioFrameType frameType, int32_t ChannelSend::SendRtpAudio(AudioFrameType frameType,
uint8_t payloadType, uint8_t payloadType,
uint32_t timeStamp, uint32_t rtp_timestamp,
rtc::ArrayView<const uint8_t> payload) { rtc::ArrayView<const uint8_t> payload,
int64_t absolute_capture_timestamp_ms) {
if (_includeAudioLevelIndication) { if (_includeAudioLevelIndication) {
// Store current audio level in the RTP sender. // Store current audio level in the RTP sender.
// The level will be used in combination with voice-activity state // The level will be used in combination with voice-activity state
@ -419,7 +424,7 @@ int32_t ChannelSend::SendRtpAudio(AudioFrameType frameType,
// Push data from ACM to RTP/RTCP-module to deliver audio frame for // Push data from ACM to RTP/RTCP-module to deliver audio frame for
// packetization. // packetization.
if (!_rtpRtcpModule->OnSendingRtpFrame(timeStamp, if (!_rtpRtcpModule->OnSendingRtpFrame(rtp_timestamp,
// Leaving the time when this frame was // Leaving the time when this frame was
// received from the capture device as // received from the capture device as
// undefined for voice for now. // undefined for voice for now.
@ -433,10 +438,12 @@ int32_t ChannelSend::SendRtpAudio(AudioFrameType frameType,
// call. // call.
// TODO(nisse): Delete RTCPSender:timestamp_offset_, and see if we can confine // TODO(nisse): Delete RTCPSender:timestamp_offset_, and see if we can confine
// knowledge of the offset to a single place. // knowledge of the offset to a single place.
const uint32_t rtp_timestamp = timeStamp + _rtpRtcpModule->StartTimestamp();
// This call will trigger Transport::SendPacket() from the RTP/RTCP module. // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
if (!rtp_sender_audio_->SendAudio(frameType, payloadType, rtp_timestamp, if (!rtp_sender_audio_->SendAudio(
payload.data(), payload.size())) { frameType, payloadType,
rtp_timestamp + _rtpRtcpModule->StartTimestamp(), payload.data(),
payload.size(), absolute_capture_timestamp_ms)) {
RTC_DLOG(LS_ERROR) RTC_DLOG(LS_ERROR)
<< "ChannelSend::SendData() failed to send data to RTP/RTCP module"; << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
return -1; return -1;

View File

@ -107,7 +107,8 @@ class AcmReceiverTestOldApi : public AudioPacketizationCallback,
uint8_t payload_type, uint8_t payload_type,
uint32_t timestamp, uint32_t timestamp,
const uint8_t* payload_data, const uint8_t* payload_data,
size_t payload_len_bytes) override { size_t payload_len_bytes,
int64_t absolute_capture_timestamp_ms) override {
if (frame_type == AudioFrameType::kEmptyFrame) if (frame_type == AudioFrameType::kEmptyFrame)
return 0; return 0;

View File

@ -126,7 +126,8 @@ int32_t AcmSendTestOldApi::SendData(AudioFrameType frame_type,
uint8_t payload_type, uint8_t payload_type,
uint32_t timestamp, uint32_t timestamp,
const uint8_t* payload_data, const uint8_t* payload_data,
size_t payload_len_bytes) { size_t payload_len_bytes,
int64_t absolute_capture_timestamp_ms) {
// Store the packet locally. // Store the packet locally.
frame_type_ = frame_type; frame_type_ = frame_type;
payload_type_ = payload_type; payload_type_ = payload_type;

View File

@ -54,7 +54,8 @@ class AcmSendTestOldApi : public AudioPacketizationCallback,
uint8_t payload_type, uint8_t payload_type,
uint32_t timestamp, uint32_t timestamp,
const uint8_t* payload_data, const uint8_t* payload_data,
size_t payload_len_bytes) override; size_t payload_len_bytes,
int64_t absolute_capture_timestamp_ms) override;
AudioCodingModule* acm() { return acm_.get(); } AudioCodingModule* acm() { return acm_.get(); }

View File

@ -11,7 +11,6 @@
#include "modules/audio_coding/include/audio_coding_module.h" #include "modules/audio_coding/include/audio_coding_module.h"
#include <assert.h> #include <assert.h>
#include <algorithm> #include <algorithm>
#include <cstdint> #include <cstdint>
@ -110,6 +109,7 @@ class AudioCodingModuleImpl final : public AudioCodingModule {
// If a re-mix is required (up or down), this buffer will store a re-mixed // If a re-mix is required (up or down), this buffer will store a re-mixed
// version of the input. // version of the input.
std::vector<int16_t> buffer; std::vector<int16_t> buffer;
int64_t absolute_capture_timestamp_ms;
}; };
InputData input_data_ RTC_GUARDED_BY(acm_crit_sect_); InputData input_data_ RTC_GUARDED_BY(acm_crit_sect_);
@ -253,6 +253,7 @@ int32_t AudioCodingModuleImpl::Encode(const InputData& input_data) {
int64_t{input_data.input_timestamp - last_timestamp_} * int64_t{input_data.input_timestamp - last_timestamp_} *
encoder_stack_->RtpTimestampRateHz(), encoder_stack_->RtpTimestampRateHz(),
int64_t{encoder_stack_->SampleRateHz()})); int64_t{encoder_stack_->SampleRateHz()}));
last_timestamp_ = input_data.input_timestamp; last_timestamp_ = input_data.input_timestamp;
last_rtp_timestamp_ = rtp_timestamp; last_rtp_timestamp_ = rtp_timestamp;
first_frame_ = false; first_frame_ = false;
@ -302,7 +303,8 @@ int32_t AudioCodingModuleImpl::Encode(const InputData& input_data) {
if (packetization_callback_) { if (packetization_callback_) {
packetization_callback_->SendData( packetization_callback_->SendData(
frame_type, encoded_info.payload_type, encoded_info.encoded_timestamp, frame_type, encoded_info.payload_type, encoded_info.encoded_timestamp,
encode_buffer_.data(), encode_buffer_.size()); encode_buffer_.data(), encode_buffer_.size(),
input_data.absolute_capture_timestamp_ms);
} }
if (vad_callback_) { if (vad_callback_) {
@ -392,6 +394,9 @@ int AudioCodingModuleImpl::Add10MsDataInternal(const AudioFrame& audio_frame,
input_data->input_timestamp = ptr_frame->timestamp_; input_data->input_timestamp = ptr_frame->timestamp_;
input_data->length_per_channel = ptr_frame->samples_per_channel_; input_data->length_per_channel = ptr_frame->samples_per_channel_;
input_data->audio_channel = current_num_channels; input_data->audio_channel = current_num_channels;
// TODO(bugs.webrtc.org/10739): Assign from a corresponding field in
// audio_frame when it is added in AudioFrame.
input_data->absolute_capture_timestamp_ms = 0;
if (!same_num_channels) { if (!same_num_channels) {
// Remixes the input frame to the output data and in the process resize the // Remixes the input frame to the output data and in the process resize the

View File

@ -111,7 +111,8 @@ class PacketizationCallbackStubOldApi : public AudioPacketizationCallback {
uint8_t payload_type, uint8_t payload_type,
uint32_t timestamp, uint32_t timestamp,
const uint8_t* payload_data, const uint8_t* payload_data,
size_t payload_len_bytes) override { size_t payload_len_bytes,
int64_t absolute_capture_timestamp_ms) override {
rtc::CritScope lock(&crit_sect_); rtc::CritScope lock(&crit_sect_);
++num_calls_; ++num_calls_;
last_frame_type_ = frame_type; last_frame_type_ = frame_type;

View File

@ -44,7 +44,21 @@ class AudioPacketizationCallback {
uint8_t payload_type, uint8_t payload_type,
uint32_t timestamp, uint32_t timestamp,
const uint8_t* payload_data, const uint8_t* payload_data,
size_t payload_len_bytes) = 0; size_t payload_len_bytes,
int64_t absolute_capture_timestamp_ms) {
// TODO(bugs.webrtc.org/10739): Deprecate the old SendData and make this one
// pure virtual.
RTC_NOTREACHED() << "This method must be overridden, or not used.";
return -1;
}
virtual int32_t SendData(AudioFrameType frame_type,
uint8_t payload_type,
uint32_t timestamp,
const uint8_t* payload_data,
size_t payload_len_bytes) {
return SendData(frame_type, payload_type, timestamp, payload_data,
payload_len_bytes, 0);
}
}; };
// Callback class used for reporting VAD decision // Callback class used for reporting VAD decision

View File

@ -112,7 +112,8 @@ class Packetizer : public AudioPacketizationCallback {
uint8_t payload_type, uint8_t payload_type,
uint32_t timestamp, uint32_t timestamp,
const uint8_t* payload_data, const uint8_t* payload_data,
size_t payload_len_bytes) override { size_t payload_len_bytes,
int64_t absolute_capture_timestamp_ms) override {
if (payload_len_bytes == 0) { if (payload_len_bytes == 0) {
return 0; return 0;
} }

View File

@ -23,7 +23,8 @@ int32_t Channel::SendData(AudioFrameType frameType,
uint8_t payloadType, uint8_t payloadType,
uint32_t timeStamp, uint32_t timeStamp,
const uint8_t* payloadData, const uint8_t* payloadData,
size_t payloadSize) { size_t payloadSize,
int64_t absolute_capture_timestamp_ms) {
RTPHeader rtp_header; RTPHeader rtp_header;
int32_t status; int32_t status;
size_t payloadDataSize = payloadSize; size_t payloadDataSize = payloadSize;

View File

@ -51,7 +51,8 @@ class Channel : public AudioPacketizationCallback {
uint8_t payloadType, uint8_t payloadType,
uint32_t timeStamp, uint32_t timeStamp,
const uint8_t* payloadData, const uint8_t* payloadData,
size_t payloadSize) override; size_t payloadSize,
int64_t absolute_capture_timestamp_ms) override;
void RegisterReceiverACM(AudioCodingModule* acm); void RegisterReceiverACM(AudioCodingModule* acm);

View File

@ -33,7 +33,8 @@ int32_t TestPacketization::SendData(const AudioFrameType /* frameType */,
const uint8_t payloadType, const uint8_t payloadType,
const uint32_t timeStamp, const uint32_t timeStamp,
const uint8_t* payloadData, const uint8_t* payloadData,
const size_t payloadSize) { const size_t payloadSize,
int64_t absolute_capture_timestamp_ms) {
_rtpStream->Write(payloadType, timeStamp, _seqNo++, payloadData, payloadSize, _rtpStream->Write(payloadType, timeStamp, _seqNo++, payloadData, payloadSize,
_frequency); _frequency);
return 1; return 1;

View File

@ -32,7 +32,8 @@ class TestPacketization : public AudioPacketizationCallback {
const uint8_t payloadType, const uint8_t payloadType,
const uint32_t timeStamp, const uint32_t timeStamp,
const uint8_t* payloadData, const uint8_t* payloadData,
const size_t payloadSize) override; const size_t payloadSize,
int64_t absolute_capture_timestamp_ms) override;
private: private:
static void MakeRTPheader(uint8_t* rtpHeader, static void MakeRTPheader(uint8_t* rtpHeader,

View File

@ -64,7 +64,8 @@ int32_t TestPack::SendData(AudioFrameType frame_type,
uint8_t payload_type, uint8_t payload_type,
uint32_t timestamp, uint32_t timestamp,
const uint8_t* payload_data, const uint8_t* payload_data,
size_t payload_size) { size_t payload_size,
int64_t absolute_capture_timestamp_ms) {
RTPHeader rtp_header; RTPHeader rtp_header;
int32_t status; int32_t status;

View File

@ -29,7 +29,8 @@ class TestPack : public AudioPacketizationCallback {
uint8_t payload_type, uint8_t payload_type,
uint32_t timestamp, uint32_t timestamp,
const uint8_t* payload_data, const uint8_t* payload_data,
size_t payload_size) override; size_t payload_size,
int64_t absolute_capture_timestamp_ms) override;
size_t payload_size(); size_t payload_size();
uint32_t timestamp_diff(); uint32_t timestamp_diff();

View File

@ -44,7 +44,8 @@ int32_t TestPackStereo::SendData(const AudioFrameType frame_type,
const uint8_t payload_type, const uint8_t payload_type,
const uint32_t timestamp, const uint32_t timestamp,
const uint8_t* payload_data, const uint8_t* payload_data,
const size_t payload_size) { const size_t payload_size,
int64_t absolute_capture_timestamp_ms) {
RTPHeader rtp_header; RTPHeader rtp_header;
int32_t status = 0; int32_t status = 0;

View File

@ -35,7 +35,8 @@ class TestPackStereo : public AudioPacketizationCallback {
const uint8_t payload_type, const uint8_t payload_type,
const uint32_t timestamp, const uint32_t timestamp,
const uint8_t* payload_data, const uint8_t* payload_data,
const size_t payload_size) override; const size_t payload_size,
int64_t absolute_capture_timestamp_ms) override;
uint16_t payload_size(); uint16_t payload_size();
uint32_t timestamp_diff(); uint32_t timestamp_diff();

View File

@ -337,7 +337,7 @@ void OpusTest::Run(TestPackStereo* channel,
// Send data to the channel. "channel" will handle the loss simulation. // Send data to the channel. "channel" will handle the loss simulation.
channel->SendData(AudioFrameType::kAudioFrameSpeech, payload_type_, channel->SendData(AudioFrameType::kAudioFrameSpeech, payload_type_,
rtp_timestamp_, bitstream, bitstream_len_byte); rtp_timestamp_, bitstream, bitstream_len_byte, 0);
if (first_packet) { if (first_packet) {
first_packet = false; first_packet = false;
start_time_stamp = rtp_timestamp_; start_time_stamp = rtp_timestamp_;