More trace events
The goal of this change is to unify tracing events styles and add trace events for all RTP traffic. BUG=1555 Review URL: https://webrtc-codereview.appspot.com/1290007 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3806 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@@ -1304,6 +1304,10 @@ int32_t AudioCodingModuleImpl::RegisterIncomingMessagesCallback(
|
|||||||
// Add 10MS of raw (PCM) audio data to the encoder.
|
// Add 10MS of raw (PCM) audio data to the encoder.
|
||||||
int32_t AudioCodingModuleImpl::Add10MsData(
|
int32_t AudioCodingModuleImpl::Add10MsData(
|
||||||
const AudioFrame& audio_frame) {
|
const AudioFrame& audio_frame) {
|
||||||
|
TRACE_EVENT2("webrtc", "ACM::Add10MsData",
|
||||||
|
"timestamp", audio_frame.timestamp_,
|
||||||
|
"samples_per_channel", audio_frame.samples_per_channel_);
|
||||||
|
|
||||||
if (audio_frame.samples_per_channel_ <= 0) {
|
if (audio_frame.samples_per_channel_ <= 0) {
|
||||||
assert(false);
|
assert(false);
|
||||||
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
|
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
|
||||||
@@ -2232,11 +2236,14 @@ AudioPlayoutMode AudioCodingModuleImpl::PlayoutMode() const {
|
|||||||
// Automatic resample to the requested frequency.
|
// Automatic resample to the requested frequency.
|
||||||
int32_t AudioCodingModuleImpl::PlayoutData10Ms(
|
int32_t AudioCodingModuleImpl::PlayoutData10Ms(
|
||||||
int32_t desired_freq_hz, AudioFrame* audio_frame) {
|
int32_t desired_freq_hz, AudioFrame* audio_frame) {
|
||||||
TRACE_EVENT0("webrtc_voe", "ACM::PlayoutData10Ms");
|
TRACE_EVENT_ASYNC_BEGIN0("webrtc", "ACM::PlayoutData10Ms", 0);
|
||||||
bool stereo_mode;
|
bool stereo_mode;
|
||||||
|
|
||||||
if (GetSilence(desired_freq_hz, audio_frame))
|
if (GetSilence(desired_freq_hz, audio_frame)) {
|
||||||
|
TRACE_EVENT_ASYNC_END1("webrtc", "ACM::PlayoutData10Ms", 0,
|
||||||
|
"silence", true);
|
||||||
return 0; // Silence is generated, return.
|
return 0; // Silence is generated, return.
|
||||||
|
}
|
||||||
|
|
||||||
// RecOut always returns 10 ms.
|
// RecOut always returns 10 ms.
|
||||||
if (neteq_.RecOut(audio_frame_) != 0) {
|
if (neteq_.RecOut(audio_frame_) != 0) {
|
||||||
@@ -2264,6 +2271,8 @@ int32_t AudioCodingModuleImpl::PlayoutData10Ms(
|
|||||||
CriticalSectionScoped lock(acm_crit_sect_);
|
CriticalSectionScoped lock(acm_crit_sect_);
|
||||||
|
|
||||||
if ((receive_freq != desired_freq_hz) && (desired_freq_hz != -1)) {
|
if ((receive_freq != desired_freq_hz) && (desired_freq_hz != -1)) {
|
||||||
|
TRACE_EVENT_ASYNC_END2("webrtc", "ACM::PlayoutData10Ms", 0,
|
||||||
|
"stereo", stereo_mode, "resample", true);
|
||||||
// Resample payload_data.
|
// Resample payload_data.
|
||||||
int16_t temp_len = output_resampler_.Resample10Msec(
|
int16_t temp_len = output_resampler_.Resample10Msec(
|
||||||
audio_frame_.data_, receive_freq, audio_frame->data_,
|
audio_frame_.data_, receive_freq, audio_frame->data_,
|
||||||
@@ -2280,6 +2289,8 @@ int32_t AudioCodingModuleImpl::PlayoutData10Ms(
|
|||||||
// Set the sampling frequency.
|
// Set the sampling frequency.
|
||||||
audio_frame->sample_rate_hz_ = desired_freq_hz;
|
audio_frame->sample_rate_hz_ = desired_freq_hz;
|
||||||
} else {
|
} else {
|
||||||
|
TRACE_EVENT_ASYNC_END2("webrtc", "ACM::PlayoutData10Ms", 0,
|
||||||
|
"stereo", stereo_mode, "resample", false);
|
||||||
memcpy(audio_frame->data_, audio_frame_.data_,
|
memcpy(audio_frame->data_, audio_frame_.data_,
|
||||||
audio_frame_.samples_per_channel_ * audio_frame->num_channels_
|
audio_frame_.samples_per_channel_ * audio_frame->num_channels_
|
||||||
* sizeof(int16_t));
|
* sizeof(int16_t));
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include <cassert> //assert
|
#include <cassert> //assert
|
||||||
|
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
#include "trace_event.h"
|
||||||
#include "critical_section_wrapper.h"
|
#include "critical_section_wrapper.h"
|
||||||
#include "rtcp_utility.h"
|
#include "rtcp_utility.h"
|
||||||
#include "rtp_rtcp_impl.h"
|
#include "rtp_rtcp_impl.h"
|
||||||
@@ -397,8 +398,9 @@ RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser,
|
|||||||
|
|
||||||
if (rtcpPacketType == RTCPUtility::kRtcpSrCode)
|
if (rtcpPacketType == RTCPUtility::kRtcpSrCode)
|
||||||
{
|
{
|
||||||
WEBRTC_TRACE(kTraceDebug, kTraceRtpRtcp, _id,
|
TRACE_EVENT_INSTANT2("webrtc_rtp", "SR",
|
||||||
"Received SR(%d). SSRC:0x%x, from SSRC:0x%x, to us %d.", _id, _SSRC, remoteSSRC, (_remoteSSRC == remoteSSRC)?1:0);
|
"remote_ssrc", remoteSSRC,
|
||||||
|
"ssrc", _SSRC);
|
||||||
|
|
||||||
if (_remoteSSRC == remoteSSRC) // have I received RTP packets from this party
|
if (_remoteSSRC == remoteSSRC) // have I received RTP packets from this party
|
||||||
{
|
{
|
||||||
@@ -427,8 +429,9 @@ RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser,
|
|||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
WEBRTC_TRACE(kTraceDebug, kTraceRtpRtcp, _id,
|
TRACE_EVENT_INSTANT2("webrtc_rtp", "RR",
|
||||||
"Received RR(%d). SSRC:0x%x, from SSRC:0x%x", _id, _SSRC, remoteSSRC);
|
"remote_ssrc", remoteSSRC,
|
||||||
|
"ssrc", _SSRC);
|
||||||
|
|
||||||
rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr;
|
rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr;
|
||||||
}
|
}
|
||||||
@@ -481,6 +484,10 @@ RTCPReceiver::HandleReportBlock(const RTCPUtility::RTCPPacket& rtcpPacket,
|
|||||||
|
|
||||||
_lastReceivedRrMs = _clock->TimeInMilliseconds();
|
_lastReceivedRrMs = _clock->TimeInMilliseconds();
|
||||||
const RTCPPacketReportBlockItem& rb = rtcpPacket.ReportBlockItem;
|
const RTCPPacketReportBlockItem& rb = rtcpPacket.ReportBlockItem;
|
||||||
|
TRACE_COUNTER_ID1("webrtc_rtp", "RRFractionLost", rb.SSRC, rb.FractionLost);
|
||||||
|
TRACE_COUNTER_ID1("webrtc_rtp", "RRCumulativeNumOfPacketLost",
|
||||||
|
rb.SSRC, rb.CumulativeNumOfPacketsLost);
|
||||||
|
TRACE_COUNTER_ID1("webrtc_rtp", "RRJitter", rb.SSRC, rb.Jitter);
|
||||||
reportBlock->remoteReceiveBlock.remoteSSRC = remoteSSRC;
|
reportBlock->remoteReceiveBlock.remoteSSRC = remoteSSRC;
|
||||||
reportBlock->remoteReceiveBlock.sourceSSRC = rb.SSRC;
|
reportBlock->remoteReceiveBlock.sourceSSRC = rb.SSRC;
|
||||||
reportBlock->remoteReceiveBlock.fractionLost = rb.FractionLost;
|
reportBlock->remoteReceiveBlock.fractionLost = rb.FractionLost;
|
||||||
@@ -554,9 +561,7 @@ RTCPReceiver::HandleReportBlock(const RTCPUtility::RTCPPacket& rtcpPacket,
|
|||||||
reportBlock->numAverageCalcs++;
|
reportBlock->numAverageCalcs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
WEBRTC_TRACE(kTraceDebug, kTraceRtpRtcp, _id,
|
TRACE_COUNTER_ID1("webrtc_rtp", "RR_RTT", rb.SSRC, RTT);
|
||||||
" -> Received report block(%d), from SSRC:0x%x, RTT:%d, loss:%d",
|
|
||||||
_id, remoteSSRC, RTT, rtcpPacket.ReportBlockItem.FractionLost);
|
|
||||||
|
|
||||||
// rtcpPacketInformation
|
// rtcpPacketInformation
|
||||||
rtcpPacketInformation.AddReportInfo(
|
rtcpPacketInformation.AddReportInfo(
|
||||||
|
|||||||
@@ -1117,7 +1117,7 @@ RTCPSender::BuildREMB(uint8_t* rtcpbuffer, uint32_t& pos)
|
|||||||
ModuleRTPUtility::AssignUWord32ToBuffer(rtcpbuffer+pos, _rembSSRC[i]);
|
ModuleRTPUtility::AssignUWord32ToBuffer(rtcpbuffer+pos, _rembSSRC[i]);
|
||||||
pos += 4;
|
pos += 4;
|
||||||
}
|
}
|
||||||
TRACE_COUNTER1("webrtc_rtcp", "Remb", _rembBitrate);
|
TRACE_COUNTER_ID1("webrtc_rtp", "RTCPRembBitrate", _SSRC, _rembBitrate);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1842,9 +1842,9 @@ RTCPSender::SendRTCP(const uint32_t packetTypeFlags,
|
|||||||
{
|
{
|
||||||
break; // out of buffer
|
break; // out of buffer
|
||||||
}
|
}
|
||||||
TRACE_EVENT_INSTANT1("webrtc_rtcp", "SendRTCP", "type", "pli");
|
TRACE_EVENT_INSTANT0("webrtc_rtp", "RTCPSender::PLI");
|
||||||
_pliCount++;
|
_pliCount++;
|
||||||
TRACE_COUNTER1("webrtc_rtcp", "PLI Count", _pliCount);
|
TRACE_COUNTER_ID1("webrtc_rtp", "RTCP_PLICount", _SSRC, _pliCount);
|
||||||
}
|
}
|
||||||
if(rtcpPacketTypeFlags & kRtcpFir)
|
if(rtcpPacketTypeFlags & kRtcpFir)
|
||||||
{
|
{
|
||||||
@@ -1857,9 +1857,10 @@ RTCPSender::SendRTCP(const uint32_t packetTypeFlags,
|
|||||||
{
|
{
|
||||||
break; // out of buffer
|
break; // out of buffer
|
||||||
}
|
}
|
||||||
TRACE_EVENT_INSTANT1("webrtc_rtcp", "SendRTCP", "type", "fir");
|
TRACE_EVENT_INSTANT0("webrtc_rtp", "RTCPSender::FIR");
|
||||||
_fullIntraRequestCount++;
|
_fullIntraRequestCount++;
|
||||||
TRACE_COUNTER1("webrtc_rtcp", "FIR Count", _fullIntraRequestCount);
|
TRACE_COUNTER_ID1("webrtc_rtp", "RTCP_FIRCount", _SSRC,
|
||||||
|
_fullIntraRequestCount);
|
||||||
}
|
}
|
||||||
if(rtcpPacketTypeFlags & kRtcpSli)
|
if(rtcpPacketTypeFlags & kRtcpSli)
|
||||||
{
|
{
|
||||||
@@ -1901,8 +1902,7 @@ RTCPSender::SendRTCP(const uint32_t packetTypeFlags,
|
|||||||
{
|
{
|
||||||
break; // out of buffer
|
break; // out of buffer
|
||||||
}
|
}
|
||||||
TRACE_EVENT_INSTANT2("webrtc_rtcp", "SendRTCP", "type", "remb",
|
TRACE_EVENT_INSTANT0("webrtc_rtp", "RTCPSender::REMB");
|
||||||
"bitrate", _rembBitrate);
|
|
||||||
}
|
}
|
||||||
if(rtcpPacketTypeFlags & kRtcpBye)
|
if(rtcpPacketTypeFlags & kRtcpBye)
|
||||||
{
|
{
|
||||||
@@ -1965,10 +1965,10 @@ RTCPSender::SendRTCP(const uint32_t packetTypeFlags,
|
|||||||
{
|
{
|
||||||
break; // out of buffer
|
break; // out of buffer
|
||||||
}
|
}
|
||||||
TRACE_EVENT_INSTANT2("webrtc_rtcp", "SendRTCP", "type", "nack",
|
TRACE_EVENT_INSTANT1("webrtc_rtp", "RTCPSender::NACK",
|
||||||
"list", TRACE_STR_COPY(nackString.c_str()));
|
"nacks", TRACE_STR_COPY(nackString.c_str()));
|
||||||
_nackCount++;
|
_nackCount++;
|
||||||
TRACE_COUNTER1("webrtc_rtcp", "Nacks", _nackCount);
|
TRACE_COUNTER_ID1("webrtc_rtp", "RTCP_NACKCount", _SSRC, _nackCount);
|
||||||
}
|
}
|
||||||
if(rtcpPacketTypeFlags & kRtcpXrVoipMetric)
|
if(rtcpPacketTypeFlags & kRtcpXrVoipMetric)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -337,6 +337,7 @@ int32_t RTPReceiver::IncomingRTPPacket(
|
|||||||
WebRtcRTPHeader* rtp_header,
|
WebRtcRTPHeader* rtp_header,
|
||||||
const uint8_t* packet,
|
const uint8_t* packet,
|
||||||
const uint16_t packet_length) {
|
const uint16_t packet_length) {
|
||||||
|
TRACE_EVENT0("webrtc_rtp", "RTPRecv::Packet");
|
||||||
// The rtp_header argument contains the parsed RTP header.
|
// The rtp_header argument contains the parsed RTP header.
|
||||||
int length = packet_length - rtp_header->header.paddingLength;
|
int length = packet_length - rtp_header->header.paddingLength;
|
||||||
|
|
||||||
@@ -1141,8 +1142,10 @@ void RTPReceiver::ProcessBitrate() {
|
|||||||
CriticalSectionScoped cs(critical_section_rtp_receiver_);
|
CriticalSectionScoped cs(critical_section_rtp_receiver_);
|
||||||
|
|
||||||
Bitrate::Process();
|
Bitrate::Process();
|
||||||
TRACE_COUNTER1("webrtc_rtp", "Received Bitrate", BitrateLast());
|
TRACE_COUNTER_ID1("webrtc_rtp",
|
||||||
TRACE_COUNTER1("webrtc_rtp", "Received Packet Rate", PacketRate());
|
"RTPReceiverBitrate", ssrc_, BitrateLast());
|
||||||
|
TRACE_COUNTER_ID1("webrtc_rtp",
|
||||||
|
"RTPReceiverPacketRate", ssrc_, PacketRate());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
@@ -191,10 +191,9 @@ int32_t RTPReceiverAudio::ParseRtpPacket(
|
|||||||
const uint16_t packet_length,
|
const uint16_t packet_length,
|
||||||
const int64_t timestamp_ms,
|
const int64_t timestamp_ms,
|
||||||
const bool is_first_packet) {
|
const bool is_first_packet) {
|
||||||
TRACE_EVENT_INSTANT2("webrtc_rtp", "RTPReceiverAudio::ParseRtpPacket",
|
TRACE_EVENT2("webrtc_rtp", "Audio::ParseRtp",
|
||||||
"seqnum", rtp_header->header.sequenceNumber,
|
"seqnum", rtp_header->header.sequenceNumber,
|
||||||
"timestamp", rtp_header->header.timestamp);
|
"timestamp", rtp_header->header.timestamp);
|
||||||
|
|
||||||
const uint8_t* payload_data =
|
const uint8_t* payload_data =
|
||||||
ModuleRTPUtility::GetPayloadData(rtp_header, packet);
|
ModuleRTPUtility::GetPayloadData(rtp_header, packet);
|
||||||
const uint16_t payload_data_length =
|
const uint16_t payload_data_length =
|
||||||
|
|||||||
@@ -75,9 +75,9 @@ int32_t RTPReceiverVideo::ParseRtpPacket(
|
|||||||
const uint16_t packet_length,
|
const uint16_t packet_length,
|
||||||
const int64_t timestamp_ms,
|
const int64_t timestamp_ms,
|
||||||
const bool is_first_packet) {
|
const bool is_first_packet) {
|
||||||
TRACE_EVENT_INSTANT2("webrtc_rtp", "RTPReceiverVideo::ParseRtpPacket",
|
TRACE_EVENT2("webrtc_rtp", "Video::ParseRtp",
|
||||||
"seqnum", rtp_header->header.sequenceNumber,
|
"seqnum", rtp_header->header.sequenceNumber,
|
||||||
"timestamp", rtp_header->header.timestamp);
|
"timestamp", rtp_header->header.timestamp);
|
||||||
const uint8_t* payload_data =
|
const uint8_t* payload_data =
|
||||||
ModuleRTPUtility::GetPayloadData(rtp_header, packet);
|
ModuleRTPUtility::GetPayloadData(rtp_header, packet);
|
||||||
const uint16_t payload_data_length =
|
const uint16_t payload_data_length =
|
||||||
|
|||||||
@@ -18,9 +18,27 @@
|
|||||||
#include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h"
|
#include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h"
|
||||||
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
|
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
|
||||||
#include "webrtc/system_wrappers/interface/trace.h"
|
#include "webrtc/system_wrappers/interface/trace.h"
|
||||||
|
#include "webrtc/system_wrappers/interface/trace_event.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
const char* FrameTypeToString(const FrameType frame_type) {
|
||||||
|
switch (frame_type) {
|
||||||
|
case kFrameEmpty: return "empty";
|
||||||
|
case kAudioFrameSpeech: return "audio_speech";
|
||||||
|
case kAudioFrameCN: return "audio_cn";
|
||||||
|
case kVideoFrameKey: return "video_key";
|
||||||
|
case kVideoFrameDelta: return "video_delta";
|
||||||
|
case kVideoFrameGolden: return "video_golden";
|
||||||
|
case kVideoFrameAltRef: return "video_altref";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
RTPSender::RTPSender(const int32_t id, const bool audio, Clock *clock,
|
RTPSender::RTPSender(const int32_t id, const bool audio, Clock *clock,
|
||||||
Transport *transport, RtpAudioFeedback *audio_feedback,
|
Transport *transport, RtpAudioFeedback *audio_feedback,
|
||||||
PacedSender *paced_sender)
|
PacedSender *paced_sender)
|
||||||
@@ -305,6 +323,9 @@ int32_t RTPSender::SendOutgoingData(
|
|||||||
const uint8_t *payload_data, const uint32_t payload_size,
|
const uint8_t *payload_data, const uint32_t payload_size,
|
||||||
const RTPFragmentationHeader *fragmentation,
|
const RTPFragmentationHeader *fragmentation,
|
||||||
VideoCodecInformation *codec_info, const RTPVideoTypeHeader *rtp_type_hdr) {
|
VideoCodecInformation *codec_info, const RTPVideoTypeHeader *rtp_type_hdr) {
|
||||||
|
TRACE_EVENT2("webrtc_rtp", "RTPSender::SendOutgoingData",
|
||||||
|
"timestsamp", capture_timestamp,
|
||||||
|
"frame_type", FrameTypeToString(frame_type));
|
||||||
{
|
{
|
||||||
// Drop this packet if we're not sending media packets.
|
// Drop this packet if we're not sending media packets.
|
||||||
CriticalSectionScoped cs(send_critsect_);
|
CriticalSectionScoped cs(send_critsect_);
|
||||||
@@ -448,6 +469,12 @@ int32_t RTPSender::ReSendPacket(uint16_t packet_id, uint32_t min_resend_time) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int32_t bytes_sent = ReSendToNetwork(buffer_to_send_ptr, length);
|
int32_t bytes_sent = ReSendToNetwork(buffer_to_send_ptr, length);
|
||||||
|
ModuleRTPUtility::RTPHeaderParser rtp_parser(data_buffer, length);
|
||||||
|
WebRtcRTPHeader rtp_header;
|
||||||
|
rtp_parser.Parse(rtp_header);
|
||||||
|
TRACE_EVENT_INSTANT2("webrtc_rtp", "RTPSender::ReSendPacket",
|
||||||
|
"timestamp", rtp_header.header.timestamp,
|
||||||
|
"seqnum", rtp_header.header.sequenceNumber);
|
||||||
if (bytes_sent <= 0) {
|
if (bytes_sent <= 0) {
|
||||||
WEBRTC_TRACE(kTraceWarning, kTraceRtpRtcp, id_,
|
WEBRTC_TRACE(kTraceWarning, kTraceRtpRtcp, id_,
|
||||||
"Transport failed to resend packet_id %u", packet_id);
|
"Transport failed to resend packet_id %u", packet_id);
|
||||||
@@ -490,6 +517,8 @@ int RTPSender::SetSelectiveRetransmissions(uint8_t settings) {
|
|||||||
void RTPSender::OnReceivedNACK(
|
void RTPSender::OnReceivedNACK(
|
||||||
const std::list<uint16_t>& nack_sequence_numbers,
|
const std::list<uint16_t>& nack_sequence_numbers,
|
||||||
const uint16_t avg_rtt) {
|
const uint16_t avg_rtt) {
|
||||||
|
TRACE_EVENT2("webrtc_rtp", "RTPSender::OnReceivedNACK",
|
||||||
|
"num_seqnum", nack_sequence_numbers.size(), "avg_rtt", avg_rtt);
|
||||||
const int64_t now = clock_->TimeInMilliseconds();
|
const int64_t now = clock_->TimeInMilliseconds();
|
||||||
uint32_t bytes_re_sent = 0;
|
uint32_t bytes_re_sent = 0;
|
||||||
|
|
||||||
@@ -608,6 +637,9 @@ void RTPSender::TimeToSendPacket(uint16_t sequence_number,
|
|||||||
ModuleRTPUtility::RTPHeaderParser rtp_parser(data_buffer, length);
|
ModuleRTPUtility::RTPHeaderParser rtp_parser(data_buffer, length);
|
||||||
WebRtcRTPHeader rtp_header;
|
WebRtcRTPHeader rtp_header;
|
||||||
rtp_parser.Parse(rtp_header);
|
rtp_parser.Parse(rtp_header);
|
||||||
|
TRACE_EVENT_INSTANT2("webrtc_rtp", "RTPSender::TimeToSendPacket",
|
||||||
|
"timestamp", rtp_header.header.timestamp,
|
||||||
|
"seqnum", sequence_number);
|
||||||
|
|
||||||
int64_t diff_ms = clock_->TimeInMilliseconds() - capture_time_ms;
|
int64_t diff_ms = clock_->TimeInMilliseconds() - capture_time_ms;
|
||||||
if (UpdateTransmissionTimeOffset(data_buffer, length, rtp_header, diff_ms)) {
|
if (UpdateTransmissionTimeOffset(data_buffer, length, rtp_header, diff_ms)) {
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
#include <string.h> //memcpy
|
#include <string.h> //memcpy
|
||||||
#include <cassert> //assert
|
#include <cassert> //assert
|
||||||
|
|
||||||
|
#include "trace_event.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
RTPSenderAudio::RTPSenderAudio(const int32_t id, Clock* clock,
|
RTPSenderAudio::RTPSenderAudio(const int32_t id, Clock* clock,
|
||||||
RTPSenderInterface* rtpSender) :
|
RTPSenderInterface* rtpSender) :
|
||||||
@@ -471,6 +473,9 @@ int32_t RTPSenderAudio::SendAudio(
|
|||||||
}
|
}
|
||||||
_lastPayloadType = payloadType;
|
_lastPayloadType = payloadType;
|
||||||
} // end critical section
|
} // end critical section
|
||||||
|
TRACE_EVENT_INSTANT2("webrtc_rtp", "Audio::Send",
|
||||||
|
"timestamp", captureTimeStamp,
|
||||||
|
"seqnum", _rtpSender->SequenceNumber());
|
||||||
return _rtpSender->SendToNetwork(dataBuffer,
|
return _rtpSender->SendToNetwork(dataBuffer,
|
||||||
payloadSize,
|
payloadSize,
|
||||||
static_cast<uint16_t>(rtpHeaderLength),
|
static_cast<uint16_t>(rtpHeaderLength),
|
||||||
@@ -609,6 +614,10 @@ RTPSenderAudio::SendTelephoneEventPacket(const bool ended,
|
|||||||
ModuleRTPUtility::AssignUWord16ToBuffer(dtmfbuffer+14, duration);
|
ModuleRTPUtility::AssignUWord16ToBuffer(dtmfbuffer+14, duration);
|
||||||
|
|
||||||
_sendAudioCritsect->Leave();
|
_sendAudioCritsect->Leave();
|
||||||
|
TRACE_EVENT_INSTANT2("webrtc_rtp",
|
||||||
|
"Audio::SendTelephoneEvent",
|
||||||
|
"timestamp", dtmfTimeStamp,
|
||||||
|
"seqnum", _rtpSender->SequenceNumber());
|
||||||
retVal = _rtpSender->SendToNetwork(dtmfbuffer, 4, 12, -1,
|
retVal = _rtpSender->SendToNetwork(dtmfbuffer, 4, 12, -1,
|
||||||
kAllowRetransmission);
|
kAllowRetransmission);
|
||||||
sendCount--;
|
sendCount--;
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#include "critical_section_wrapper.h"
|
#include "critical_section_wrapper.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
#include "trace_event.h"
|
||||||
|
|
||||||
#include "rtp_utility.h"
|
#include "rtp_utility.h"
|
||||||
|
|
||||||
@@ -111,6 +112,7 @@ int32_t
|
|||||||
RTPSenderVideo::SendVideoPacket(uint8_t* data_buffer,
|
RTPSenderVideo::SendVideoPacket(uint8_t* data_buffer,
|
||||||
const uint16_t payload_length,
|
const uint16_t payload_length,
|
||||||
const uint16_t rtp_header_length,
|
const uint16_t rtp_header_length,
|
||||||
|
const uint32_t capture_timestamp,
|
||||||
int64_t capture_time_ms,
|
int64_t capture_time_ms,
|
||||||
StorageType storage,
|
StorageType storage,
|
||||||
bool protect) {
|
bool protect) {
|
||||||
@@ -123,6 +125,9 @@ RTPSenderVideo::SendVideoPacket(uint8_t* data_buffer,
|
|||||||
payload_length,
|
payload_length,
|
||||||
rtp_header_length,
|
rtp_header_length,
|
||||||
_payloadTypeRED);
|
_payloadTypeRED);
|
||||||
|
TRACE_EVENT_INSTANT2("webrtc_rtp", "Video::PacketRed",
|
||||||
|
"timestamp", capture_timestamp,
|
||||||
|
"seqnum", _rtpSender.SequenceNumber());
|
||||||
// Sending the media packet with RED header.
|
// Sending the media packet with RED header.
|
||||||
int packet_success = _rtpSender.SendToNetwork(
|
int packet_success = _rtpSender.SendToNetwork(
|
||||||
red_packet->data(),
|
red_packet->data(),
|
||||||
@@ -157,6 +162,9 @@ RTPSenderVideo::SendVideoPacket(uint8_t* data_buffer,
|
|||||||
if (_retransmissionSettings & kRetransmitFECPackets) {
|
if (_retransmissionSettings & kRetransmitFECPackets) {
|
||||||
storage = kAllowRetransmission;
|
storage = kAllowRetransmission;
|
||||||
}
|
}
|
||||||
|
TRACE_EVENT_INSTANT2("webrtc_rtp", "Video::PacketFec",
|
||||||
|
"timestamp", capture_timestamp,
|
||||||
|
"seqnum", _rtpSender.SequenceNumber());
|
||||||
// Sending FEC packet with RED header.
|
// Sending FEC packet with RED header.
|
||||||
int packet_success = _rtpSender.SendToNetwork(
|
int packet_success = _rtpSender.SendToNetwork(
|
||||||
red_packet->data(),
|
red_packet->data(),
|
||||||
@@ -177,6 +185,9 @@ RTPSenderVideo::SendVideoPacket(uint8_t* data_buffer,
|
|||||||
_fecOverheadRate.Update(fec_overhead_sent);
|
_fecOverheadRate.Update(fec_overhead_sent);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
TRACE_EVENT_INSTANT2("webrtc_rtp", "Video::PacketNormal",
|
||||||
|
"timestamp", capture_timestamp,
|
||||||
|
"seqnum", _rtpSender.SequenceNumber());
|
||||||
int ret = _rtpSender.SendToNetwork(data_buffer,
|
int ret = _rtpSender.SendToNetwork(data_buffer,
|
||||||
payload_length,
|
payload_length,
|
||||||
rtp_header_length,
|
rtp_header_length,
|
||||||
@@ -203,6 +214,9 @@ RTPSenderVideo::SendRTPIntraRequest()
|
|||||||
|
|
||||||
ModuleRTPUtility::AssignUWord32ToBuffer(data+4, _rtpSender.SSRC());
|
ModuleRTPUtility::AssignUWord32ToBuffer(data+4, _rtpSender.SSRC());
|
||||||
|
|
||||||
|
TRACE_EVENT_INSTANT1("webrtc_rtp",
|
||||||
|
"Video::IntraRequest",
|
||||||
|
"seqnum", _rtpSender.SequenceNumber());
|
||||||
return _rtpSender.SendToNetwork(data, 0, length, -1, kDontStore);
|
return _rtpSender.SendToNetwork(data, 0, length, -1, kDontStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,7 +375,8 @@ int32_t RTPSenderVideo::SendGeneric(const FrameType frame_type,
|
|||||||
payload += payload_length;
|
payload += payload_length;
|
||||||
|
|
||||||
if (SendVideoPacket(buffer, payload_length + 1, rtp_header_length,
|
if (SendVideoPacket(buffer, payload_length + 1, rtp_header_length,
|
||||||
capture_time_ms, kAllowRetransmission, true)) {
|
capture_timestamp, capture_time_ms,
|
||||||
|
kAllowRetransmission, true)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -450,7 +465,8 @@ RTPSenderVideo::SendVP8(const FrameType frameType,
|
|||||||
_rtpSender.BuildRTPheader(dataBuffer, payloadType, last,
|
_rtpSender.BuildRTPheader(dataBuffer, payloadType, last,
|
||||||
captureTimeStamp);
|
captureTimeStamp);
|
||||||
if (-1 == SendVideoPacket(dataBuffer, payloadBytesInPacket,
|
if (-1 == SendVideoPacket(dataBuffer, payloadBytesInPacket,
|
||||||
rtpHeaderLength, capture_time_ms, storage, protect))
|
rtpHeaderLength, captureTimeStamp,
|
||||||
|
capture_time_ms, storage, protect))
|
||||||
{
|
{
|
||||||
WEBRTC_TRACE(kTraceError, kTraceRtpRtcp, _id,
|
WEBRTC_TRACE(kTraceError, kTraceRtpRtcp, _id,
|
||||||
"RTPSenderVideo::SendVP8 failed to send packet number"
|
"RTPSenderVideo::SendVP8 failed to send packet number"
|
||||||
@@ -463,6 +479,12 @@ RTPSenderVideo::SendVP8(const FrameType frameType,
|
|||||||
void RTPSenderVideo::ProcessBitrate() {
|
void RTPSenderVideo::ProcessBitrate() {
|
||||||
_videoBitrate.Process();
|
_videoBitrate.Process();
|
||||||
_fecOverheadRate.Process();
|
_fecOverheadRate.Process();
|
||||||
|
TRACE_COUNTER_ID1("webrtc_rtp", "VideoSendBitrate",
|
||||||
|
_rtpSender.SSRC(),
|
||||||
|
_videoBitrate.BitrateLast());
|
||||||
|
TRACE_COUNTER_ID1("webrtc_rtp", "VideoFecOverheadRate",
|
||||||
|
_rtpSender.SSRC(),
|
||||||
|
_fecOverheadRate.BitrateLast());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t RTPSenderVideo::VideoBitrateSent() const {
|
uint32_t RTPSenderVideo::VideoBitrateSent() const {
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ protected:
|
|||||||
virtual int32_t SendVideoPacket(uint8_t* dataBuffer,
|
virtual int32_t SendVideoPacket(uint8_t* dataBuffer,
|
||||||
const uint16_t payloadLength,
|
const uint16_t payloadLength,
|
||||||
const uint16_t rtpHeaderLength,
|
const uint16_t rtpHeaderLength,
|
||||||
|
const uint32_t capture_timestamp,
|
||||||
int64_t capture_time_ms,
|
int64_t capture_time_ms,
|
||||||
StorageType storage,
|
StorageType storage,
|
||||||
bool protect);
|
bool protect);
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "ref_count.h"
|
#include "ref_count.h"
|
||||||
#include "tick_util.h"
|
#include "tick_util.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
#include "trace_event.h"
|
||||||
#include "video_capture_config.h"
|
#include "video_capture_config.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -199,6 +200,9 @@ WebRtc_Word32 VideoCaptureImpl::DeliverCapturedFrame(I420VideoFrame&
|
|||||||
captureFrame.set_render_time_ms(TickTime::MillisecondTimestamp());
|
captureFrame.set_render_time_ms(TickTime::MillisecondTimestamp());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TRACE_EVENT1("webrtc", "VC::DeliverCapturedFrame",
|
||||||
|
"capture_time", capture_time);
|
||||||
|
|
||||||
if (captureFrame.render_time_ms() == last_capture_time_) {
|
if (captureFrame.render_time_ms() == last_capture_time_) {
|
||||||
// We don't allow the same capture time for two frames, drop this one.
|
// We don't allow the same capture time for two frames, drop this one.
|
||||||
return -1;
|
return -1;
|
||||||
@@ -267,6 +271,8 @@ WebRtc_Word32 VideoCaptureImpl::IncomingFrame(
|
|||||||
const WebRtc_Word32 width = frameInfo.width;
|
const WebRtc_Word32 width = frameInfo.width;
|
||||||
const WebRtc_Word32 height = frameInfo.height;
|
const WebRtc_Word32 height = frameInfo.height;
|
||||||
|
|
||||||
|
TRACE_EVENT1("webrtc", "VC::IncomingFrame", "capture_time", captureTime);
|
||||||
|
|
||||||
if (frameInfo.codecType == kVideoCodecUnknown)
|
if (frameInfo.codecType == kVideoCodecUnknown)
|
||||||
{
|
{
|
||||||
// Not encoded, convert to I420.
|
// Not encoded, convert to I420.
|
||||||
|
|||||||
@@ -331,6 +331,8 @@ uint32_t VP8EncoderImpl::MaxIntraTarget(uint32_t optimalBuffersize) {
|
|||||||
int VP8EncoderImpl::Encode(const I420VideoFrame& input_image,
|
int VP8EncoderImpl::Encode(const I420VideoFrame& input_image,
|
||||||
const CodecSpecificInfo* codec_specific_info,
|
const CodecSpecificInfo* codec_specific_info,
|
||||||
const std::vector<VideoFrameType>* frame_types) {
|
const std::vector<VideoFrameType>* frame_types) {
|
||||||
|
TRACE_EVENT1("webrtc", "VP8::Encode", "timestamp", input_image.timestamp());
|
||||||
|
|
||||||
if (!inited_) {
|
if (!inited_) {
|
||||||
return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
|
return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
|
||||||
}
|
}
|
||||||
@@ -390,9 +392,6 @@ int VP8EncoderImpl::Encode(const I420VideoFrame& input_image,
|
|||||||
input_image.timestamp());
|
input_image.timestamp());
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE_EVENT1("video_coding", "VP8EncoderImpl::Encode",
|
|
||||||
"input_image_timestamp", input_image.timestamp());
|
|
||||||
|
|
||||||
// TODO(holmer): Ideally the duration should be the timestamp diff of this
|
// TODO(holmer): Ideally the duration should be the timestamp diff of this
|
||||||
// frame and the next frame to be encoded, which we don't have. Instead we
|
// frame and the next frame to be encoded, which we don't have. Instead we
|
||||||
// would like to use the duration of the previous frame. Unfortunately the
|
// would like to use the duration of the previous frame. Unfortunately the
|
||||||
|
|||||||
@@ -64,9 +64,6 @@ int32_t VCMDecodedFrameCallback::Decoded(I420VideoFrame& decodedImage)
|
|||||||
_frame.SwapFrame(&decodedImage);
|
_frame.SwapFrame(&decodedImage);
|
||||||
_frame.set_render_time_ms(frameInfo->renderTimeMs);
|
_frame.set_render_time_ms(frameInfo->renderTimeMs);
|
||||||
int32_t callbackReturn = _receiveCallback->FrameToRender(_frame);
|
int32_t callbackReturn = _receiveCallback->FrameToRender(_frame);
|
||||||
TRACE_EVENT_INSTANT2("webrtc_vie", "VCMDecodedFrameCallback::Decoded",
|
|
||||||
"timestamp", decodedImage.timestamp(),
|
|
||||||
"render_time_ms", decodedImage.render_time_ms());
|
|
||||||
if (callbackReturn < 0)
|
if (callbackReturn < 0)
|
||||||
{
|
{
|
||||||
WEBRTC_TRACE(webrtc::kTraceDebug,
|
WEBRTC_TRACE(webrtc::kTraceDebug,
|
||||||
@@ -169,10 +166,6 @@ int32_t VCMGenericDecoder::Decode(const VCMEncodedFrame& frame,
|
|||||||
"Decoding timestamp %u", frame.TimeStamp());
|
"Decoding timestamp %u", frame.TimeStamp());
|
||||||
|
|
||||||
_nextFrameInfoIdx = (_nextFrameInfoIdx + 1) % kDecoderFrameMemoryLength;
|
_nextFrameInfoIdx = (_nextFrameInfoIdx + 1) % kDecoderFrameMemoryLength;
|
||||||
|
|
||||||
TRACE_EVENT2("webrtc_vie", "VCMGenericDecoder::Decode",
|
|
||||||
"timestamp", frame.TimeStamp(),
|
|
||||||
"render_time_ms", frame.RenderTimeMs());
|
|
||||||
int32_t ret = _decoder.Decode(frame.EncodedImage(),
|
int32_t ret = _decoder.Decode(frame.EncodedImage(),
|
||||||
frame.MissingFrame(),
|
frame.MissingFrame(),
|
||||||
frame.FragmentationHeader(),
|
frame.FragmentationHeader(),
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include "generic_encoder.h"
|
#include "generic_encoder.h"
|
||||||
#include "media_optimization.h"
|
#include "media_optimization.h"
|
||||||
#include "../../../../engine_configurations.h"
|
#include "../../../../engine_configurations.h"
|
||||||
|
#include "trace_event.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
@@ -177,6 +178,8 @@ VCMEncodedFrameCallback::Encoded(
|
|||||||
const CodecSpecificInfo* codecSpecificInfo,
|
const CodecSpecificInfo* codecSpecificInfo,
|
||||||
const RTPFragmentationHeader* fragmentationHeader)
|
const RTPFragmentationHeader* fragmentationHeader)
|
||||||
{
|
{
|
||||||
|
TRACE_EVENT2("webrtc", "VCM::Encoded", "timestamp", encodedImage._timeStamp,
|
||||||
|
"length", encodedImage._length);
|
||||||
FrameType frameType = VCMEncodedFrame::ConvertFrameType(encodedImage._frameType);
|
FrameType frameType = VCMEncodedFrame::ConvertFrameType(encodedImage._frameType);
|
||||||
|
|
||||||
uint32_t encodedBytes = 0;
|
uint32_t encodedBytes = 0;
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ void VCMJitterBuffer::Stop() {
|
|||||||
running_ = false;
|
running_ = false;
|
||||||
last_decoded_state_.Reset();
|
last_decoded_state_.Reset();
|
||||||
frame_list_.clear();
|
frame_list_.clear();
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "FrameListEmptied", "type", "Stop");
|
TRACE_EVENT_INSTANT1("webrtc", "JB::FrameListEmptied", "type", "Stop");
|
||||||
for (int i = 0; i < kMaxNumberOfFrames; i++) {
|
for (int i = 0; i < kMaxNumberOfFrames; i++) {
|
||||||
if (frame_buffers_[i] != NULL) {
|
if (frame_buffers_[i] != NULL) {
|
||||||
static_cast<VCMFrameBuffer*>(frame_buffers_[i])->SetState(kStateFree);
|
static_cast<VCMFrameBuffer*>(frame_buffers_[i])->SetState(kStateFree);
|
||||||
@@ -240,7 +240,8 @@ void VCMJitterBuffer::Flush() {
|
|||||||
CriticalSectionScoped cs(crit_sect_);
|
CriticalSectionScoped cs(crit_sect_);
|
||||||
// Erase all frames from the sorted list and set their state to free.
|
// Erase all frames from the sorted list and set their state to free.
|
||||||
frame_list_.clear();
|
frame_list_.clear();
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "FrameListEmptied", "type", "Flush");
|
TRACE_EVENT_INSTANT2("webrtc", "JB::FrameListEmptied", "type", "Flush",
|
||||||
|
"frames", max_number_of_frames_);
|
||||||
for (int i = 0; i < max_number_of_frames_; i++) {
|
for (int i = 0; i < max_number_of_frames_; i++) {
|
||||||
ReleaseFrameIfNotDecoding(frame_buffers_[i]);
|
ReleaseFrameIfNotDecoding(frame_buffers_[i]);
|
||||||
}
|
}
|
||||||
@@ -261,7 +262,6 @@ void VCMJitterBuffer::Flush() {
|
|||||||
WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
|
WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
|
||||||
VCMId(vcm_id_, receiver_id_), "JB(0x%x): Jitter buffer: flush",
|
VCMId(vcm_id_, receiver_id_), "JB(0x%x): Jitter buffer: flush",
|
||||||
this);
|
this);
|
||||||
TRACE_EVENT_INSTANT0("webrtc_vie", "VCMJitterBuffer::Flush");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get received key and delta frames
|
// Get received key and delta frames
|
||||||
@@ -340,8 +340,8 @@ void VCMJitterBuffer::IncomingRateStatistics(unsigned int* framerate,
|
|||||||
bitrate = 0;
|
bitrate = 0;
|
||||||
incoming_bit_rate_ = 0;
|
incoming_bit_rate_ = 0;
|
||||||
}
|
}
|
||||||
TRACE_COUNTER1("webrtc_vie", "IncomingFrameRate", incoming_frame_rate_);
|
TRACE_COUNTER1("webrtc", "JBIncomingFramerate", incoming_frame_rate_);
|
||||||
TRACE_COUNTER1("webrtc_vie", "IncomingBitRate", incoming_bit_rate_);
|
TRACE_COUNTER1("webrtc", "JBIncomingBitrate", incoming_bit_rate_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for the first packet in the next frame to arrive.
|
// Wait for the first packet in the next frame to arrive.
|
||||||
@@ -433,6 +433,7 @@ bool VCMJitterBuffer::CompleteSequenceWithNextFrame() {
|
|||||||
// complete frame, |max_wait_time_ms| decided by caller.
|
// complete frame, |max_wait_time_ms| decided by caller.
|
||||||
VCMEncodedFrame* VCMJitterBuffer::GetCompleteFrameForDecoding(
|
VCMEncodedFrame* VCMJitterBuffer::GetCompleteFrameForDecoding(
|
||||||
uint32_t max_wait_time_ms) {
|
uint32_t max_wait_time_ms) {
|
||||||
|
TRACE_EVENT0("webrtc", "JB::GetCompleteFrame");
|
||||||
if (!running_) {
|
if (!running_) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -495,7 +496,7 @@ VCMEncodedFrame* VCMJitterBuffer::GetCompleteFrameForDecoding(
|
|||||||
VCMFrameBuffer* oldest_frame = *it;
|
VCMFrameBuffer* oldest_frame = *it;
|
||||||
it = frame_list_.erase(it);
|
it = frame_list_.erase(it);
|
||||||
if (frame_list_.empty()) {
|
if (frame_list_.empty()) {
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "FrameListEmptied",
|
TRACE_EVENT_INSTANT1("webrtc", "JB::FrameListEmptied",
|
||||||
"type", "GetCompleteFrameForDecoding");
|
"type", "GetCompleteFrameForDecoding");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,15 +522,11 @@ VCMEncodedFrame* VCMJitterBuffer::GetCompleteFrameForDecoding(
|
|||||||
DropPacketsFromNackList(last_decoded_state_.sequence_num());
|
DropPacketsFromNackList(last_decoded_state_.sequence_num());
|
||||||
|
|
||||||
crit_sect_->Leave();
|
crit_sect_->Leave();
|
||||||
|
|
||||||
TRACE_EVENT_INSTANT2("webrtc_vie",
|
|
||||||
"VCMJitterBuffer::GetCompleteFrameForDecoding",
|
|
||||||
"timestamp", oldest_frame->TimeStamp(),
|
|
||||||
"render_time_ms", oldest_frame->RenderTimeMs());
|
|
||||||
return oldest_frame;
|
return oldest_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
VCMEncodedFrame* VCMJitterBuffer::GetFrameForDecoding() {
|
VCMEncodedFrame* VCMJitterBuffer::GetFrameForDecoding() {
|
||||||
|
TRACE_EVENT0("webrtc", "JB::GetFrameForDecoding");
|
||||||
CriticalSectionScoped cs(crit_sect_);
|
CriticalSectionScoped cs(crit_sect_);
|
||||||
if (!running_) {
|
if (!running_) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -572,7 +569,7 @@ VCMEncodedFrame* VCMJitterBuffer::GetFrameForDecoding() {
|
|||||||
}
|
}
|
||||||
frame_list_.erase(frame_list_.begin());
|
frame_list_.erase(frame_list_.begin());
|
||||||
if (frame_list_.empty()) {
|
if (frame_list_.empty()) {
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "FrameListEmptied",
|
TRACE_EVENT_INSTANT1("webrtc", "JB::FrameListEmptied",
|
||||||
"type", "GetFrameForDecoding");
|
"type", "GetFrameForDecoding");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -596,11 +593,6 @@ VCMEncodedFrame* VCMJitterBuffer::GetFrameForDecoding() {
|
|||||||
// We have a frame - update decoded state with frame info.
|
// We have a frame - update decoded state with frame info.
|
||||||
last_decoded_state_.SetState(oldest_frame);
|
last_decoded_state_.SetState(oldest_frame);
|
||||||
DropPacketsFromNackList(last_decoded_state_.sequence_num());
|
DropPacketsFromNackList(last_decoded_state_.sequence_num());
|
||||||
|
|
||||||
TRACE_EVENT_INSTANT2("webrtc_vie",
|
|
||||||
"VCMJitterBuffer::GetFrameForDecoding",
|
|
||||||
"timestamp", oldest_frame->TimeStamp(),
|
|
||||||
"render_time_ms", oldest_frame->RenderTimeMs());
|
|
||||||
return oldest_frame;
|
return oldest_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -627,10 +619,10 @@ int VCMJitterBuffer::GetFrame(const VCMPacket& packet,
|
|||||||
if (packet.sizeBytes > 0) {
|
if (packet.sizeBytes > 0) {
|
||||||
num_discarded_packets_++;
|
num_discarded_packets_++;
|
||||||
num_consecutive_old_packets_++;
|
num_consecutive_old_packets_++;
|
||||||
TRACE_EVENT_INSTANT2("webrtc_vie", "OldPacketDropped",
|
TRACE_EVENT_INSTANT2("webrtc", "JB::OldPacketDropped",
|
||||||
"seqnum", packet.seqNum,
|
"seqnum", packet.seqNum,
|
||||||
"timestamp", packet.timestamp);
|
"timestamp", packet.timestamp);
|
||||||
TRACE_COUNTER1("webrtc_vie", "DroppedOldPackets", num_discarded_packets_);
|
TRACE_COUNTER1("webrtc", "JBDroppedOldPackets", num_discarded_packets_);
|
||||||
}
|
}
|
||||||
// Update last decoded sequence number if the packet arrived late and
|
// Update last decoded sequence number if the packet arrived late and
|
||||||
// belongs to a frame with a timestamp equal to the last decoded
|
// belongs to a frame with a timestamp equal to the last decoded
|
||||||
@@ -896,6 +888,8 @@ uint16_t* VCMJitterBuffer::GetNackList(uint16_t* nack_list_size,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (TooLargeNackList()) {
|
if (TooLargeNackList()) {
|
||||||
|
TRACE_EVENT_INSTANT1("webrtc", "JB::NackListTooLarge",
|
||||||
|
"size", missing_sequence_numbers_.size());
|
||||||
*request_key_frame = !HandleTooLargeNackList();
|
*request_key_frame = !HandleTooLargeNackList();
|
||||||
}
|
}
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
@@ -925,6 +919,7 @@ bool VCMJitterBuffer::UpdateNackList(uint16_t sequence_number) {
|
|||||||
for (uint16_t i = latest_received_sequence_number_ + 1;
|
for (uint16_t i = latest_received_sequence_number_ + 1;
|
||||||
i < sequence_number; ++i) {
|
i < sequence_number; ++i) {
|
||||||
missing_sequence_numbers_.insert(missing_sequence_numbers_.end(), i);
|
missing_sequence_numbers_.insert(missing_sequence_numbers_.end(), i);
|
||||||
|
TRACE_EVENT_INSTANT1("webrtc", "AddNack", "seqnum", i);
|
||||||
}
|
}
|
||||||
if (TooLargeNackList() && !HandleTooLargeNackList()) {
|
if (TooLargeNackList() && !HandleTooLargeNackList()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -935,6 +930,7 @@ bool VCMJitterBuffer::UpdateNackList(uint16_t sequence_number) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
missing_sequence_numbers_.erase(sequence_number);
|
missing_sequence_numbers_.erase(sequence_number);
|
||||||
|
TRACE_EVENT_INSTANT1("webrtc", "RemoveNack", "seqnum", sequence_number);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -994,6 +990,7 @@ int64_t VCMJitterBuffer::LastDecodedTimestamp() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
VCMEncodedFrame* VCMJitterBuffer::GetFrameForDecodingNACK() {
|
VCMEncodedFrame* VCMJitterBuffer::GetFrameForDecodingNACK() {
|
||||||
|
TRACE_EVENT0("webrtc", "JB::GetFrameForDecodingNACK");
|
||||||
CleanUpOldOrEmptyFrames();
|
CleanUpOldOrEmptyFrames();
|
||||||
// First look for a complete continuous frame.
|
// First look for a complete continuous frame.
|
||||||
// When waiting for nack, wait for a key frame, if a continuous frame cannot
|
// When waiting for nack, wait for a key frame, if a continuous frame cannot
|
||||||
@@ -1023,7 +1020,7 @@ VCMEncodedFrame* VCMJitterBuffer::GetFrameForDecodingNACK() {
|
|||||||
}
|
}
|
||||||
it = frame_list_.erase(it);
|
it = frame_list_.erase(it);
|
||||||
if (frame_list_.empty()) {
|
if (frame_list_.empty()) {
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "FrameListEmptied",
|
TRACE_EVENT_INSTANT1("webrtc", "JB::FrameListEmptied",
|
||||||
"type", "GetFrameForDecodingNACK");
|
"type", "GetFrameForDecodingNACK");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1045,11 +1042,6 @@ VCMEncodedFrame* VCMJitterBuffer::GetFrameForDecodingNACK() {
|
|||||||
// We have a frame - update decoded state with frame info.
|
// We have a frame - update decoded state with frame info.
|
||||||
last_decoded_state_.SetState(oldest_frame);
|
last_decoded_state_.SetState(oldest_frame);
|
||||||
DropPacketsFromNackList(last_decoded_state_.sequence_num());
|
DropPacketsFromNackList(last_decoded_state_.sequence_num());
|
||||||
|
|
||||||
TRACE_EVENT_INSTANT2("webrtc_vie",
|
|
||||||
"VCMJitterBuffer::GetFrameForDecodingNACK",
|
|
||||||
"timestamp", oldest_frame->TimeStamp(),
|
|
||||||
"render_time_ms", oldest_frame->RenderTimeMs());
|
|
||||||
return oldest_frame;
|
return oldest_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1066,8 +1058,6 @@ VCMFrameBuffer* VCMJitterBuffer::GetEmptyFrame() {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE_EVENT_INSTANT0("webrtc_vie", "VCMJitterBuffer::GetEmptyFrame");
|
|
||||||
|
|
||||||
crit_sect_->Enter();
|
crit_sect_->Enter();
|
||||||
|
|
||||||
for (int i = 0; i < max_number_of_frames_; ++i) {
|
for (int i = 0; i < max_number_of_frames_; ++i) {
|
||||||
@@ -1091,8 +1081,7 @@ VCMFrameBuffer* VCMJitterBuffer::GetEmptyFrame() {
|
|||||||
VCMId(vcm_id_, receiver_id_),
|
VCMId(vcm_id_, receiver_id_),
|
||||||
"JB(0x%x) FB(0x%x): Jitter buffer increased to:%d frames",
|
"JB(0x%x) FB(0x%x): Jitter buffer increased to:%d frames",
|
||||||
this, ptr_new_buffer, max_number_of_frames_);
|
this, ptr_new_buffer, max_number_of_frames_);
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "JitterBufferIncreased",
|
TRACE_COUNTER1("webrtc", "JBMaxFrames", max_number_of_frames_);
|
||||||
"NewSize", max_number_of_frames_);
|
|
||||||
return ptr_new_buffer;
|
return ptr_new_buffer;
|
||||||
}
|
}
|
||||||
crit_sect_->Leave();
|
crit_sect_->Leave();
|
||||||
@@ -1113,8 +1102,7 @@ bool VCMJitterBuffer::RecycleFramesUntilKeyFrame() {
|
|||||||
VCMId(vcm_id_, receiver_id_),
|
VCMId(vcm_id_, receiver_id_),
|
||||||
"Jitter buffer drop count:%d, low_seq %d", drop_count_,
|
"Jitter buffer drop count:%d, low_seq %d", drop_count_,
|
||||||
(*it)->GetLowSeqNum());
|
(*it)->GetLowSeqNum());
|
||||||
TRACE_EVENT_INSTANT0("webrtc_vie",
|
TRACE_EVENT_INSTANT0("webrtc", "JB::RecycleFramesUntilKeyFrame");
|
||||||
"VCMJitterBuffer::RecycleFramesUntilKeyFrame");
|
|
||||||
ReleaseFrameIfNotDecoding(*it);
|
ReleaseFrameIfNotDecoding(*it);
|
||||||
it = frame_list_.erase(it);
|
it = frame_list_.erase(it);
|
||||||
if (it != frame_list_.end() && (*it)->FrameType() == kVideoFrameKey) {
|
if (it != frame_list_.end() && (*it)->FrameType() == kVideoFrameKey) {
|
||||||
@@ -1125,7 +1113,7 @@ bool VCMJitterBuffer::RecycleFramesUntilKeyFrame() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (frame_list_.empty()) {
|
if (frame_list_.empty()) {
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "FrameListEmptied",
|
TRACE_EVENT_INSTANT1("webrtc", "JB::FrameListEmptied",
|
||||||
"type", "RecycleFramesUntilKeyFrame");
|
"type", "RecycleFramesUntilKeyFrame");
|
||||||
}
|
}
|
||||||
waiting_for_key_frame_ = true;
|
waiting_for_key_frame_ = true;
|
||||||
@@ -1154,32 +1142,19 @@ VCMFrameBufferEnum VCMJitterBuffer::UpdateFrameState(VCMFrameBuffer* frame) {
|
|||||||
this, frame, length, frame->FrameType());
|
this, frame, length, frame->FrameType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool frame_counted = false;
|
||||||
if (length != 0 && !frame->GetCountedFrame()) {
|
if (length != 0 && !frame->GetCountedFrame()) {
|
||||||
// Ignore ACK frames.
|
// Ignore ACK frames.
|
||||||
incoming_frame_count_++;
|
incoming_frame_count_++;
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "AddFrameToJitterBuffer",
|
|
||||||
"timestamp", frame->TimeStamp());
|
|
||||||
if (frame->FrameType() == kVideoFrameKey) {
|
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "AddKeyFrameToJitterBuffer",
|
|
||||||
"timestamp", frame->TimeStamp());
|
|
||||||
}
|
|
||||||
frame->SetCountedFrame(true);
|
frame->SetCountedFrame(true);
|
||||||
} else {
|
frame_counted = true;
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie",
|
|
||||||
"AddRetransmittedFrameToJitterBuffer",
|
|
||||||
"timestamp", frame->TimeStamp());
|
|
||||||
if (frame->FrameType() == kVideoFrameKey) {
|
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie",
|
|
||||||
"AddRetransmittedKeyFrameToJitterBuffer",
|
|
||||||
"timestamp", frame->TimeStamp());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we should drop the frame. A complete frame can arrive too late.
|
// Check if we should drop the frame. A complete frame can arrive too late.
|
||||||
if (last_decoded_state_.IsOldFrame(frame)) {
|
if (last_decoded_state_.IsOldFrame(frame)) {
|
||||||
// Frame is older than the latest decoded frame, drop it. Will be
|
// Frame is older than the latest decoded frame, drop it. Will be
|
||||||
// released by CleanUpOldFrames later.
|
// released by CleanUpOldFrames later.
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "DropLateFrame",
|
TRACE_EVENT_INSTANT1("webrtc", "JB::DropLateFrame",
|
||||||
"timestamp", frame->TimeStamp());
|
"timestamp", frame->TimeStamp());
|
||||||
frame->Reset();
|
frame->Reset();
|
||||||
frame->SetState(kStateEmpty);
|
frame->SetState(kStateEmpty);
|
||||||
@@ -1202,6 +1177,15 @@ VCMFrameBufferEnum VCMJitterBuffer::UpdateFrameState(VCMFrameBuffer* frame) {
|
|||||||
}
|
}
|
||||||
num_consecutive_old_frames_ = 0;
|
num_consecutive_old_frames_ = 0;
|
||||||
frame->SetState(kStateComplete);
|
frame->SetState(kStateComplete);
|
||||||
|
if (frame->FrameType() == kVideoFrameKey) {
|
||||||
|
TRACE_EVENT_INSTANT2("webrtc", "JB::AddKeyFrame",
|
||||||
|
"timestamp", frame->TimeStamp(),
|
||||||
|
"retransmit", !frame_counted);
|
||||||
|
} else {
|
||||||
|
TRACE_EVENT_INSTANT2("webrtc", "JB::AddFrame",
|
||||||
|
"timestamp", frame->TimeStamp(),
|
||||||
|
"retransmit", !frame_counted);
|
||||||
|
}
|
||||||
|
|
||||||
// Update receive statistics. We count all layers, thus when you use layers
|
// Update receive statistics. We count all layers, thus when you use layers
|
||||||
// adding all key and delta frames might differ from frame count.
|
// adding all key and delta frames might differ from frame count.
|
||||||
@@ -1294,16 +1278,16 @@ void VCMJitterBuffer::CleanUpOldOrEmptyFrames() {
|
|||||||
}
|
}
|
||||||
if (last_decoded_state_.IsOldFrame(oldest_frame)) {
|
if (last_decoded_state_.IsOldFrame(oldest_frame)) {
|
||||||
ReleaseFrameIfNotDecoding(frame_list_.front());
|
ReleaseFrameIfNotDecoding(frame_list_.front());
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "OldFrameDropped",
|
TRACE_EVENT_INSTANT1("webrtc", "JB::OldFrameDropped",
|
||||||
"timestamp", oldest_frame->TimeStamp());
|
"timestamp", oldest_frame->TimeStamp());
|
||||||
TRACE_COUNTER1("webrtc_vie", "DroppedLateFrames", drop_count_);
|
TRACE_COUNTER1("webrtc", "JBDroppedLateFrames", drop_count_);
|
||||||
frame_list_.erase(frame_list_.begin());
|
frame_list_.erase(frame_list_.begin());
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (frame_list_.empty()) {
|
if (frame_list_.empty()) {
|
||||||
TRACE_EVENT_INSTANT1("webrtc_vie", "FrameListEmptied",
|
TRACE_EVENT_INSTANT1("webrtc", "JB::FrameListEmptied",
|
||||||
"type", "CleanUpOldOrEmptyFrames");
|
"type", "CleanUpOldOrEmptyFrames");
|
||||||
}
|
}
|
||||||
if (!last_decoded_state_.in_initial_state()) {
|
if (!last_decoded_state_.in_initial_state()) {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include "webrtc/modules/video_coding/main/source/media_opt_util.h"
|
#include "webrtc/modules/video_coding/main/source/media_opt_util.h"
|
||||||
#include "webrtc/system_wrappers/interface/clock.h"
|
#include "webrtc/system_wrappers/interface/clock.h"
|
||||||
#include "webrtc/system_wrappers/interface/trace.h"
|
#include "webrtc/system_wrappers/interface/trace.h"
|
||||||
|
#include "webrtc/system_wrappers/interface/trace_event.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
@@ -173,6 +174,7 @@ VCMEncodedFrame* VCMReceiver::FrameForDecoding(
|
|||||||
int64_t& next_render_time_ms,
|
int64_t& next_render_time_ms,
|
||||||
bool render_timing,
|
bool render_timing,
|
||||||
VCMReceiver* dual_receiver) {
|
VCMReceiver* dual_receiver) {
|
||||||
|
TRACE_EVENT0("webrtc", "Recv::FrameForDecoding");
|
||||||
// No need to enter the critical section here since the jitter buffer
|
// No need to enter the critical section here since the jitter buffer
|
||||||
// is thread-safe.
|
// is thread-safe.
|
||||||
FrameType incoming_frame_type = kVideoFrameDelta;
|
FrameType incoming_frame_type = kVideoFrameDelta;
|
||||||
@@ -227,6 +229,8 @@ VCMEncodedFrame* VCMReceiver::FrameForDecoding(
|
|||||||
uint16_t max_wait_time_ms,
|
uint16_t max_wait_time_ms,
|
||||||
int64_t next_render_time_ms,
|
int64_t next_render_time_ms,
|
||||||
VCMReceiver* dual_receiver) {
|
VCMReceiver* dual_receiver) {
|
||||||
|
TRACE_EVENT1("webrtc", "FrameForDecoding",
|
||||||
|
"max_wait", max_wait_time_ms);
|
||||||
// How long can we wait until we must decode the next frame.
|
// How long can we wait until we must decode the next frame.
|
||||||
uint32_t wait_time_ms = timing_->MaxWaitingTime(
|
uint32_t wait_time_ms = timing_->MaxWaitingTime(
|
||||||
next_render_time_ms, clock_->TimeInMilliseconds());
|
next_render_time_ms, clock_->TimeInMilliseconds());
|
||||||
@@ -286,6 +290,7 @@ VCMEncodedFrame* VCMReceiver::FrameForDecoding(
|
|||||||
VCMEncodedFrame* VCMReceiver::FrameForRendering(uint16_t max_wait_time_ms,
|
VCMEncodedFrame* VCMReceiver::FrameForRendering(uint16_t max_wait_time_ms,
|
||||||
int64_t next_render_time_ms,
|
int64_t next_render_time_ms,
|
||||||
VCMReceiver* dual_receiver) {
|
VCMReceiver* dual_receiver) {
|
||||||
|
TRACE_EVENT0("webrtc", "FrameForRendering");
|
||||||
// How long MUST we wait until we must decode the next frame. This is
|
// How long MUST we wait until we must decode the next frame. This is
|
||||||
// different for the case where we have a renderer which can render at a
|
// different for the case where we have a renderer which can render at a
|
||||||
// specified time. Here we must wait as long as possible before giving the
|
// specified time. Here we must wait as long as possible before giving the
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "video_codec_interface.h"
|
#include "video_codec_interface.h"
|
||||||
#include "webrtc/system_wrappers/interface/clock.h"
|
#include "webrtc/system_wrappers/interface/clock.h"
|
||||||
|
#include "webrtc/system_wrappers/interface/trace_event.h"
|
||||||
|
|
||||||
namespace webrtc
|
namespace webrtc
|
||||||
{
|
{
|
||||||
@@ -863,6 +864,7 @@ VideoCodingModuleImpl::RegisterPacketRequestCallback(
|
|||||||
int32_t
|
int32_t
|
||||||
VideoCodingModuleImpl::Decode(uint16_t maxWaitTimeMs)
|
VideoCodingModuleImpl::Decode(uint16_t maxWaitTimeMs)
|
||||||
{
|
{
|
||||||
|
TRACE_EVENT1("webrtc", "VCM::Decode", "max_wait", maxWaitTimeMs);
|
||||||
int64_t nextRenderTimeMs;
|
int64_t nextRenderTimeMs;
|
||||||
{
|
{
|
||||||
CriticalSectionScoped cs(_receiveCritSect);
|
CriticalSectionScoped cs(_receiveCritSect);
|
||||||
@@ -954,6 +956,7 @@ int32_t
|
|||||||
VideoCodingModuleImpl::RequestSliceLossIndication(
|
VideoCodingModuleImpl::RequestSliceLossIndication(
|
||||||
const uint64_t pictureID) const
|
const uint64_t pictureID) const
|
||||||
{
|
{
|
||||||
|
TRACE_EVENT1("webrtc", "RequestSLI", "picture_id", pictureID);
|
||||||
if (_frameTypeCallback != NULL)
|
if (_frameTypeCallback != NULL)
|
||||||
{
|
{
|
||||||
const int32_t ret =
|
const int32_t ret =
|
||||||
@@ -980,6 +983,7 @@ VideoCodingModuleImpl::RequestSliceLossIndication(
|
|||||||
int32_t
|
int32_t
|
||||||
VideoCodingModuleImpl::RequestKeyFrame()
|
VideoCodingModuleImpl::RequestKeyFrame()
|
||||||
{
|
{
|
||||||
|
TRACE_EVENT0("webrtc", "RequestKeyFrame");
|
||||||
if (_frameTypeCallback != NULL)
|
if (_frameTypeCallback != NULL)
|
||||||
{
|
{
|
||||||
const int32_t ret = _frameTypeCallback->RequestKeyFrame();
|
const int32_t ret = _frameTypeCallback->RequestKeyFrame();
|
||||||
@@ -1062,6 +1066,9 @@ VideoCodingModuleImpl::DecodeDualFrame(uint16_t maxWaitTimeMs)
|
|||||||
int32_t
|
int32_t
|
||||||
VideoCodingModuleImpl::Decode(const VCMEncodedFrame& frame)
|
VideoCodingModuleImpl::Decode(const VCMEncodedFrame& frame)
|
||||||
{
|
{
|
||||||
|
TRACE_EVENT2("webrtc", "Decode",
|
||||||
|
"timestamp", frame.TimeStamp(),
|
||||||
|
"type", frame.FrameType());
|
||||||
// Change decoder if payload type has changed
|
// Change decoder if payload type has changed
|
||||||
const bool renderTimingBefore = _codecDataBase.SupportsRenderScheduling();
|
const bool renderTimingBefore = _codecDataBase.SupportsRenderScheduling();
|
||||||
_decoder = _codecDataBase.GetDecoder(frame.PayloadType(),
|
_decoder = _codecDataBase.GetDecoder(frame.PayloadType(),
|
||||||
@@ -1208,6 +1215,9 @@ VideoCodingModuleImpl::IncomingPacket(const uint8_t* incomingPayload,
|
|||||||
uint32_t payloadLength,
|
uint32_t payloadLength,
|
||||||
const WebRtcRTPHeader& rtpInfo)
|
const WebRtcRTPHeader& rtpInfo)
|
||||||
{
|
{
|
||||||
|
TRACE_EVENT2("webrtc", "VCM::Packet",
|
||||||
|
"seqnum", rtpInfo.header.sequenceNumber,
|
||||||
|
"type", rtpInfo.frameType);
|
||||||
if (incomingPayload == NULL) {
|
if (incomingPayload == NULL) {
|
||||||
// The jitter buffer doesn't handle non-zero payload lengths for packets
|
// The jitter buffer doesn't handle non-zero payload lengths for packets
|
||||||
// without payload.
|
// without payload.
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "system_wrappers/interface/event_wrapper.h"
|
#include "system_wrappers/interface/event_wrapper.h"
|
||||||
#include "system_wrappers/interface/thread_wrapper.h"
|
#include "system_wrappers/interface/thread_wrapper.h"
|
||||||
#include "system_wrappers/interface/trace.h"
|
#include "system_wrappers/interface/trace.h"
|
||||||
|
#include "system_wrappers/interface/trace_event.h"
|
||||||
#include "video_engine/include/vie_image_process.h"
|
#include "video_engine/include/vie_image_process.h"
|
||||||
#include "video_engine/vie_defines.h"
|
#include "video_engine/vie_defines.h"
|
||||||
#include "video_engine/vie_encoder.h"
|
#include "video_engine/vie_encoder.h"
|
||||||
@@ -353,6 +354,10 @@ void ViECapturer::OnIncomingCapturedFrame(const int32_t capture_id,
|
|||||||
// is slightly off since it's being set when the frame has been received from
|
// is slightly off since it's being set when the frame has been received from
|
||||||
// the camera, and not when the camera actually captured the frame.
|
// the camera, and not when the camera actually captured the frame.
|
||||||
video_frame.set_render_time_ms(video_frame.render_time_ms() - FrameDelay());
|
video_frame.set_render_time_ms(video_frame.render_time_ms() - FrameDelay());
|
||||||
|
|
||||||
|
TRACE_EVENT_INSTANT1("webrtc", "VC::OnIncomingCapturedFrame",
|
||||||
|
"render_time", video_frame.render_time_ms());
|
||||||
|
|
||||||
captured_frame_.SwapFrame(&video_frame);
|
captured_frame_.SwapFrame(&video_frame);
|
||||||
capture_event_.Set();
|
capture_event_.Set();
|
||||||
return;
|
return;
|
||||||
@@ -368,6 +373,10 @@ void ViECapturer::OnIncomingCapturedEncodedFrame(const int32_t capture_id,
|
|||||||
// is slightly off since it's being set when the frame has been received from
|
// is slightly off since it's being set when the frame has been received from
|
||||||
// the camera, and not when the camera actually captured the frame.
|
// the camera, and not when the camera actually captured the frame.
|
||||||
video_frame.SetRenderTime(video_frame.RenderTimeMs() - FrameDelay());
|
video_frame.SetRenderTime(video_frame.RenderTimeMs() - FrameDelay());
|
||||||
|
|
||||||
|
TRACE_EVENT_INSTANT1("webrtc", "VC::OnIncomingCapturedEncodedFrame",
|
||||||
|
"render_time", video_frame.RenderTimeMs());
|
||||||
|
|
||||||
assert(codec_type != kVideoCodecUnknown);
|
assert(codec_type != kVideoCodecUnknown);
|
||||||
if (encoded_frame_.Length() != 0) {
|
if (encoded_frame_.Length() != 0) {
|
||||||
// The last encoded frame has not been sent yet. Need to wait.
|
// The last encoded frame has not been sent yet. Need to wait.
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "system_wrappers/interface/logging.h"
|
#include "system_wrappers/interface/logging.h"
|
||||||
#include "system_wrappers/interface/tick_util.h"
|
#include "system_wrappers/interface/tick_util.h"
|
||||||
#include "system_wrappers/interface/trace.h"
|
#include "system_wrappers/interface/trace.h"
|
||||||
|
#include "system_wrappers/interface/trace_event.h"
|
||||||
#include "video_engine/include/vie_codec.h"
|
#include "video_engine/include/vie_codec.h"
|
||||||
#include "video_engine/include/vie_image_process.h"
|
#include "video_engine/include/vie_image_process.h"
|
||||||
#include "video_engine/vie_defines.h"
|
#include "video_engine/vie_defines.h"
|
||||||
@@ -507,6 +508,9 @@ void ViEEncoder::DeliverFrame(int id,
|
|||||||
ViEId(engine_id_, channel_id_),
|
ViEId(engine_id_, channel_id_),
|
||||||
"%s: Dropping frame %llu after a key fame", __FUNCTION__,
|
"%s: Dropping frame %llu after a key fame", __FUNCTION__,
|
||||||
video_frame->timestamp());
|
video_frame->timestamp());
|
||||||
|
TRACE_EVENT_INSTANT1("webrtc", "VE::EncoderDropFrame",
|
||||||
|
"timestamp", video_frame->timestamp());
|
||||||
|
|
||||||
drop_next_frame_ = false;
|
drop_next_frame_ = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -517,6 +521,11 @@ void ViEEncoder::DeliverFrame(int id,
|
|||||||
const uint32_t time_stamp =
|
const uint32_t time_stamp =
|
||||||
kMsToRtpTimestamp *
|
kMsToRtpTimestamp *
|
||||||
static_cast<uint32_t>(video_frame->render_time_ms());
|
static_cast<uint32_t>(video_frame->render_time_ms());
|
||||||
|
|
||||||
|
TRACE_EVENT2("webrtc", "VE::DeliverFrame",
|
||||||
|
"timestamp", time_stamp,
|
||||||
|
"render_time", video_frame->render_time_ms());
|
||||||
|
|
||||||
video_frame->set_timestamp(time_stamp);
|
video_frame->set_timestamp(time_stamp);
|
||||||
{
|
{
|
||||||
CriticalSectionScoped cs(callback_cs_.get());
|
CriticalSectionScoped cs(callback_cs_.get());
|
||||||
@@ -770,6 +779,9 @@ int32_t ViEEncoder::SendData(
|
|||||||
// Paused, don't send this packet.
|
// Paused, don't send this packet.
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
TRACE_EVENT2("webrtc", "VE::SendData",
|
||||||
|
"timestamp", time_stamp,
|
||||||
|
"capture_time_ms", capture_time_ms);
|
||||||
if (channels_dropping_delta_frames_ &&
|
if (channels_dropping_delta_frames_ &&
|
||||||
frame_type == webrtc::kVideoFrameKey) {
|
frame_type == webrtc::kVideoFrameKey) {
|
||||||
WEBRTC_TRACE(webrtc::kTraceStream, webrtc::kTraceVideo,
|
WEBRTC_TRACE(webrtc::kTraceStream, webrtc::kTraceVideo,
|
||||||
|
|||||||
@@ -153,10 +153,9 @@ int32_t ViESyncModule::Process() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE_COUNTER1("webrtc_sync", "CurrentVideoDelay",
|
TRACE_COUNTER1("webrtc", "SyncCurrentVideoDelay", total_video_delay_target_ms);
|
||||||
total_video_delay_target_ms);
|
TRACE_COUNTER1("webrtc", "SyncCurrentAudioDelay", current_audio_delay_ms);
|
||||||
TRACE_COUNTER1("webrtc_sync", "CurrentAudioDelay", current_audio_delay_ms);
|
TRACE_COUNTER1("webrtc", "SyncRelativeDelay", relative_delay_ms);
|
||||||
TRACE_COUNTER1("webrtc_sync", "RelativeDelay", relative_delay_ms);
|
|
||||||
int extra_audio_delay_ms = 0;
|
int extra_audio_delay_ms = 0;
|
||||||
// Calculate the necessary extra audio delay and desired total video
|
// Calculate the necessary extra audio delay and desired total video
|
||||||
// delay to get the streams in sync.
|
// delay to get the streams in sync.
|
||||||
@@ -167,8 +166,8 @@ int32_t ViESyncModule::Process() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE_COUNTER1("webrtc_sync", "ExtraAudioDelayTarget", extra_audio_delay_ms);
|
TRACE_COUNTER1("webrtc", "SyncExtraAudioDelayTarget", extra_audio_delay_ms);
|
||||||
TRACE_COUNTER1("webrtc_sync", "TotalVideoDelayTarget",
|
TRACE_COUNTER1("webrtc", "SyncTotalVideoDelayTarget",
|
||||||
total_video_delay_target_ms);
|
total_video_delay_target_ms);
|
||||||
if (voe_sync_interface_->SetMinimumPlayoutDelay(
|
if (voe_sync_interface_->SetMinimumPlayoutDelay(
|
||||||
voe_channel_id_, extra_audio_delay_ms) == -1) {
|
voe_channel_id_, extra_audio_delay_ms) == -1) {
|
||||||
|
|||||||
Reference in New Issue
Block a user