- minor fixes of warnings + counter of dropped packets
This commit is contained in:
parent
e95aa2274f
commit
cf1f206056
|
|
@ -535,6 +535,9 @@ void AgentImpl::processGetMediaStats(JsonCpp::Value& request, JsonCpp::Value& an
|
||||||
#endif
|
#endif
|
||||||
if (result.exists(SessionInfo_PacketLoss))
|
if (result.exists(SessionInfo_PacketLoss))
|
||||||
answer["rtp_lost"] = result[SessionInfo_LostRtp].asInt();
|
answer["rtp_lost"] = result[SessionInfo_LostRtp].asInt();
|
||||||
|
if (result.exists(SessionInfo_DroppedRtp))
|
||||||
|
answer["rtp_dropped"] = result[SessionInfo_DroppedRtp].asInt();
|
||||||
|
|
||||||
if (result.exists(SessionInfo_SentRtp))
|
if (result.exists(SessionInfo_SentRtp))
|
||||||
answer["rtp_sent"] = result[SessionInfo_SentRtp].asInt();
|
answer["rtp_sent"] = result[SessionInfo_SentRtp].asInt();
|
||||||
if (result.exists(SessionInfo_ReceivedRtp))
|
if (result.exists(SessionInfo_ReceivedRtp))
|
||||||
|
|
|
||||||
|
|
@ -43,32 +43,32 @@ public:
|
||||||
void sendData(PDatagramSocket s, InternetAddress& destination, const void* dataBuffer, unsigned int datasize);
|
void sendData(PDatagramSocket s, InternetAddress& destination, const void* dataBuffer, unsigned int datasize);
|
||||||
|
|
||||||
// Updates SDP offer
|
// Updates SDP offer
|
||||||
void updateSdpOffer(resip::SdpContents::Session::Medium& sdp, SdpDirection direction);
|
void updateSdpOffer(resip::SdpContents::Session::Medium& sdp, SdpDirection direction) override;
|
||||||
|
|
||||||
// Called by user agent when session is deleted.
|
// Called by user agent when session is deleted.
|
||||||
void sessionDeleted();
|
void sessionDeleted() override;
|
||||||
|
|
||||||
// Called by user agent when session is terminated.
|
// Called by user agent when session is terminated.
|
||||||
void sessionTerminated();
|
void sessionTerminated() override;
|
||||||
|
|
||||||
// Called by user agent when session is started.
|
// Called by user agent when session is started.
|
||||||
void sessionEstablished(int conntype);
|
void sessionEstablished(int conntype) override;
|
||||||
|
|
||||||
// Called by user agent to save media socket for this provider
|
// Called by user agent to save media socket for this provider
|
||||||
void setSocket(const RtpPair<PDatagramSocket>& p4, const RtpPair<PDatagramSocket>& p6);
|
void setSocket(const RtpPair<PDatagramSocket>& p4, const RtpPair<PDatagramSocket>& p6) override;
|
||||||
|
|
||||||
// Called by user agent to get media socket for this provider
|
// Called by user agent to get media socket for this provider
|
||||||
RtpPair<PDatagramSocket>& socket(int family);
|
RtpPair<PDatagramSocket>& socket(int family) override;
|
||||||
|
|
||||||
// Called by user agent to process media stream description from remote peer.
|
// Called by user agent to process media stream description from remote peer.
|
||||||
// Returns true if description is processed succesfully. Otherwise method returns false.
|
// Returns true if description is processed succesfully. Otherwise method returns false.
|
||||||
// myAnswer sets if the answer will be sent after.
|
// myAnswer sets if the answer will be sent after.
|
||||||
bool processSdpOffer(const resip::SdpContents::Session::Medium& media, SdpDirection sdpDirection);
|
bool processSdpOffer(const resip::SdpContents::Session::Medium& media, SdpDirection sdpDirection) override;
|
||||||
|
|
||||||
|
|
||||||
void setState(unsigned state) override;
|
void setState(unsigned state) override;
|
||||||
unsigned state();
|
unsigned state() override;
|
||||||
MT::Statistics getStatistics();
|
MT::Statistics getStatistics() override;
|
||||||
MT::PStream activeStream();
|
MT::PStream activeStream();
|
||||||
|
|
||||||
void readFile(const Audio::PWavFileReader& stream, MT::Stream::MediaDirection direction);
|
void readFile(const Audio::PWavFileReader& stream, MT::Stream::MediaDirection direction);
|
||||||
|
|
|
||||||
|
|
@ -478,6 +478,7 @@ void Session::getSessionInfo(Session::InfoOptions options, VariantMap& info)
|
||||||
info[SessionInfo_ReceivedRtp] = static_cast<int>(stat.mReceivedRtp);
|
info[SessionInfo_ReceivedRtp] = static_cast<int>(stat.mReceivedRtp);
|
||||||
info[SessionInfo_ReceivedRtcp] = static_cast<int>(stat.mReceivedRtcp);
|
info[SessionInfo_ReceivedRtcp] = static_cast<int>(stat.mReceivedRtcp);
|
||||||
info[SessionInfo_LostRtp] = static_cast<int>(stat.mPacketLoss);
|
info[SessionInfo_LostRtp] = static_cast<int>(stat.mPacketLoss);
|
||||||
|
info[SessionInfo_DroppedRtp] = static_cast<int>(stat.mPacketDropped);
|
||||||
info[SessionInfo_SentRtp] = static_cast<int>(stat.mSentRtp);
|
info[SessionInfo_SentRtp] = static_cast<int>(stat.mSentRtp);
|
||||||
info[SessionInfo_SentRtcp] = static_cast<int>(stat.mSentRtcp);
|
info[SessionInfo_SentRtcp] = static_cast<int>(stat.mSentRtcp);
|
||||||
if (stat.mFirstRtpTime)
|
if (stat.mFirstRtpTime)
|
||||||
|
|
|
||||||
|
|
@ -66,12 +66,13 @@ enum SessionInfo
|
||||||
SessionInfo_ReceivedRtp,
|
SessionInfo_ReceivedRtp,
|
||||||
SessionInfo_ReceivedRtcp,
|
SessionInfo_ReceivedRtcp,
|
||||||
SessionInfo_LostRtp,
|
SessionInfo_LostRtp,
|
||||||
|
SessionInfo_DroppedRtp,
|
||||||
SessionInfo_Duration,
|
SessionInfo_Duration,
|
||||||
SessionInfo_Jitter,
|
SessionInfo_Jitter,
|
||||||
SessionInfo_Rtt,
|
SessionInfo_Rtt,
|
||||||
SessionInfo_BitrateSwitchCounter, // It is for AMR codecs only
|
SessionInfo_BitrateSwitchCounter, // It is for AMR codecs only
|
||||||
SessionInfo_RemotePeer,
|
SessionInfo_RemotePeer,
|
||||||
SessionInfo_SSRC
|
SessionInfo_SSRC,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
using namespace MT;
|
using namespace MT;
|
||||||
|
|
||||||
// ----------------- RtpBuffer::Packet --------------
|
// ----------------- RtpBuffer::Packet --------------
|
||||||
RtpBuffer::Packet::Packet(std::shared_ptr<RTPPacket> packet, int timelength, int rate)
|
RtpBuffer::Packet::Packet(const std::shared_ptr<RTPPacket>& packet, int timelength, int rate)
|
||||||
:mRtp(packet), mTimelength(timelength), mRate(rate)
|
:mRtp(packet), mTimelength(timelength), mRate(rate)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
@ -120,9 +120,8 @@ bool RtpBuffer::add(std::shared_ptr<jrtplib::RTPPacket> packet, int timelength,
|
||||||
// New sequence number
|
// New sequence number
|
||||||
unsigned newSeqno = packet->GetExtendedSequenceNumber();
|
unsigned newSeqno = packet->GetExtendedSequenceNumber();
|
||||||
|
|
||||||
for (PacketList::iterator iter = mPacketList.begin(); iter != mPacketList.end(); iter++)
|
for (Packet& p: mPacketList)
|
||||||
{
|
{
|
||||||
Packet& p = *iter;
|
|
||||||
unsigned seqno = p.rtp()->GetExtendedSequenceNumber();
|
unsigned seqno = p.rtp()->GetExtendedSequenceNumber();
|
||||||
|
|
||||||
if (seqno == newSeqno)
|
if (seqno == newSeqno)
|
||||||
|
|
@ -138,6 +137,7 @@ bool RtpBuffer::add(std::shared_ptr<jrtplib::RTPPacket> packet, int timelength,
|
||||||
minno = seqno;
|
minno = seqno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get amount of available audio (in milliseconds) in jitter buffer
|
||||||
int available = findTimelength();
|
int available = findTimelength();
|
||||||
|
|
||||||
if (newSeqno > minno || (available < mHigh))
|
if (newSeqno > minno || (available < mHigh))
|
||||||
|
|
@ -188,6 +188,9 @@ RtpBuffer::FetchResult RtpBuffer::fetch(ResultList& rl)
|
||||||
|
|
||||||
// Erase from packet list
|
// Erase from packet list
|
||||||
mPacketList.erase(mPacketList.begin());
|
mPacketList.erase(mPacketList.begin());
|
||||||
|
|
||||||
|
// Increase number in statistics
|
||||||
|
mStat.mPacketDropped++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (total < mLow)
|
if (total < mLow)
|
||||||
|
|
@ -351,7 +354,7 @@ AudioReceiver::~AudioReceiver()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool AudioReceiver::add(std::shared_ptr<jrtplib::RTPPacket> p, Codec** codec)
|
bool AudioReceiver::add(const std::shared_ptr<jrtplib::RTPPacket>& p, Codec** codec)
|
||||||
{
|
{
|
||||||
// Increase codec counter
|
// Increase codec counter
|
||||||
mStat.mCodecCount[p->GetPayloadType()]++;
|
mStat.mCodecCount[p->GetPayloadType()]++;
|
||||||
|
|
@ -373,20 +376,20 @@ bool AudioReceiver::add(std::shared_ptr<jrtplib::RTPPacket> p, Codec** codec)
|
||||||
codecIter->second = mCodecList.codecAt(codecIndex).create();
|
codecIter->second = mCodecList.codecAt(codecIndex).create();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return pointer to codec if needed
|
// Return pointer to codec if needed.get()
|
||||||
if (codec)
|
if (codec)
|
||||||
*codec = codecIter->second.get();
|
*codec = codecIter->second.get();
|
||||||
|
|
||||||
if (mStat.mCodecName.empty())
|
if (mStat.mCodecName.empty())
|
||||||
mStat.mCodecName = codecIter->second.get()->name();
|
mStat.mCodecName = codecIter->second->name();
|
||||||
|
|
||||||
// Estimate time length
|
// Estimate time length
|
||||||
int timelen = 0, payloadLength = p->GetPayloadLength(), ptype = p->GetPayloadType();
|
int time_length = 0, payloadLength = p->GetPayloadLength(), ptype = p->GetPayloadType();
|
||||||
|
|
||||||
if (!codecIter->second->rtpLength())
|
if (!codecIter->second->rtpLength())
|
||||||
timelen = codecIter->second->frameTime();
|
time_length = codecIter->second->frameTime();
|
||||||
else
|
else
|
||||||
timelen = int(double(payloadLength) / codecIter->second->rtpLength() * codecIter->second->frameTime() + 0.5);
|
time_length = lround(double(payloadLength) / codecIter->second->rtpLength() * codecIter->second->frameTime());
|
||||||
|
|
||||||
// Process jitter
|
// Process jitter
|
||||||
mJitterStats.process(p.get(), codecIter->second->samplerate());
|
mJitterStats.process(p.get(), codecIter->second->samplerate());
|
||||||
|
|
@ -394,19 +397,19 @@ bool AudioReceiver::add(std::shared_ptr<jrtplib::RTPPacket> p, Codec** codec)
|
||||||
|
|
||||||
// Check if packet is CNG
|
// Check if packet is CNG
|
||||||
if (payloadLength >= 1 && payloadLength <= 6 && (ptype == 0 || ptype == 8))
|
if (payloadLength >= 1 && payloadLength <= 6 && (ptype == 0 || ptype == 8))
|
||||||
timelen = mLastPacketTimeLength ? mLastPacketTimeLength : 20;
|
time_length = mLastPacketTimeLength ? mLastPacketTimeLength : 20;
|
||||||
else
|
else
|
||||||
// Check if packet is too short from time length side
|
// Check if packet is too short from time length side
|
||||||
if (timelen < 2)
|
if (time_length < 2)
|
||||||
{
|
{
|
||||||
// It will cause statistics to report about bad RTP packet
|
// It will cause statistics to report about bad RTP packet
|
||||||
// I have to replay last packet payload here to avoid report about lost packet
|
// I have to replay last packet payload here to avoid report about lost packet
|
||||||
mBuffer.add(p, timelen, codecIter->second->samplerate());
|
mBuffer.add(p, time_length, codecIter->second->samplerate());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Queue packet to buffer
|
// Queue packet to buffer
|
||||||
return mBuffer.add(p, timelen, codecIter->second->samplerate());
|
return mBuffer.add(p, time_length, codecIter->second->samplerate());
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioReceiver::processDecoded(Audio::DataWindow& output, int options)
|
void AudioReceiver::processDecoded(Audio::DataWindow& output, int options)
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ namespace MT
|
||||||
class Packet
|
class Packet
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Packet(std::shared_ptr<RTPPacket> packet, int timelen, int rate);
|
Packet(const std::shared_ptr<RTPPacket>& packet, int timelen, int rate);
|
||||||
std::shared_ptr<RTPPacket> rtp() const;
|
std::shared_ptr<RTPPacket> rtp() const;
|
||||||
int timelength() const;
|
int timelength() const;
|
||||||
int rate() const;
|
int rate() const;
|
||||||
|
|
@ -109,7 +109,7 @@ namespace MT
|
||||||
|
|
||||||
// Returns false when packet is rejected as illegal. codec parameter will show codec which will be used for decoding.
|
// Returns false when packet is rejected as illegal. codec parameter will show codec which will be used for decoding.
|
||||||
// Lifetime of pointer to codec is limited by lifetime of AudioReceiver (it is container).
|
// Lifetime of pointer to codec is limited by lifetime of AudioReceiver (it is container).
|
||||||
bool add(std::shared_ptr<jrtplib::RTPPacket> p, Codec** codec = nullptr);
|
bool add(const std::shared_ptr<jrtplib::RTPPacket>& p, Codec** codec = nullptr);
|
||||||
|
|
||||||
// Returns false when there is no rtp data from jitter
|
// Returns false when there is no rtp data from jitter
|
||||||
enum DecodeOptions
|
enum DecodeOptions
|
||||||
|
|
@ -178,6 +178,7 @@ namespace MT
|
||||||
void initPvqa();
|
void initPvqa();
|
||||||
void updatePvqa(const void* data, int size);
|
void updatePvqa(const void* data, int size);
|
||||||
float calculatePvqaMos(int rate, std::string& report);
|
float calculatePvqaMos(int rate, std::string& report);
|
||||||
|
|
||||||
std::shared_ptr<Audio::DataWindow> mPvqaBuffer;
|
std::shared_ptr<Audio::DataWindow> mPvqaBuffer;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ void JitterStatistics::process(jrtplib::RTPPacket* packet, int rate)
|
||||||
int64_t delta = receiveDelta - timestampDelta;
|
int64_t delta = receiveDelta - timestampDelta;
|
||||||
|
|
||||||
// Update max delta in milliseconds
|
// Update max delta in milliseconds
|
||||||
double delta_in_seconds = fabs(double(delta) / rate);
|
float delta_in_seconds = float(fabs(double(delta) / rate));
|
||||||
if (delta_in_seconds > mMaxDelta)
|
if (delta_in_seconds > mMaxDelta)
|
||||||
mMaxDelta = delta_in_seconds;
|
mMaxDelta = delta_in_seconds;
|
||||||
|
|
||||||
|
|
@ -56,7 +56,7 @@ void JitterStatistics::process(jrtplib::RTPPacket* packet, int rate)
|
||||||
mReceiveTimestamp = timestamp;
|
mReceiveTimestamp = timestamp;
|
||||||
|
|
||||||
// And mJitter are in seconds again
|
// And mJitter are in seconds again
|
||||||
mJitter.process(mLastJitter.value() / rate);
|
mJitter.process(mLastJitter.value() / float(rate));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -67,7 +67,7 @@ void JitterStatistics::process(jrtplib::RTPPacket* packet, int rate)
|
||||||
Statistics::Statistics()
|
Statistics::Statistics()
|
||||||
:mReceived(0), mSent(0), mReceivedRtp(0), mSentRtp(0),
|
:mReceived(0), mSent(0), mReceivedRtp(0), mSentRtp(0),
|
||||||
mReceivedRtcp(0), mSentRtcp(0), mDuplicatedRtp(0), mOldRtp(0), mIllegalRtp(0),
|
mReceivedRtcp(0), mSentRtcp(0), mDuplicatedRtp(0), mOldRtp(0), mIllegalRtp(0),
|
||||||
mPacketLoss(0), mJitter(0.0), mAudioTime(0), mSsrc(0)
|
mPacketLoss(0), mJitter(0.0), mAudioTime(0), mSsrc(0), mPacketDropped(0)
|
||||||
{
|
{
|
||||||
mBitrateSwitchCounter = 0;
|
mBitrateSwitchCounter = 0;
|
||||||
memset(mLoss, 0, sizeof mLoss);
|
memset(mLoss, 0, sizeof mLoss);
|
||||||
|
|
@ -94,64 +94,11 @@ void Statistics::reset()
|
||||||
mIllegalRtp = 0;
|
mIllegalRtp = 0;
|
||||||
mJitter = 0.0;
|
mJitter = 0.0;
|
||||||
mAudioTime = 0;
|
mAudioTime = 0;
|
||||||
|
mPacketDropped = 0;
|
||||||
|
|
||||||
memset(mLoss, 0, sizeof mLoss);
|
memset(mLoss, 0, sizeof mLoss);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
double calculate_mos_g711(double ppl, double burstr, int version) {
|
|
||||||
double r;
|
|
||||||
double bpl = 8.47627; //mos = -4.23836 + 0.29873 * r - 0.00416744 * r * r + 0.0000209855 * r * r * r;
|
|
||||||
double mos;
|
|
||||||
|
|
||||||
if(ppl == 0 or burstr == 0) {
|
|
||||||
return 4.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ppl > 0.5) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(version) {
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
default:
|
|
||||||
// this mos is calculated for G.711 and PLC
|
|
||||||
bpl = 17.2647;
|
|
||||||
r = 93.2062077233 - 95.0 * (ppl*100/(ppl*100/burstr + bpl));
|
|
||||||
mos = 2.06405 + 0.031738 * r - 0.000356641 * r * r + 2.93143 * pow(10,-6) * r * r * r;
|
|
||||||
if(mos < 1)
|
|
||||||
return 1;
|
|
||||||
if(mos > 4.5)
|
|
||||||
return 4.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mos;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
double calculate_mos(double ppl, double burstr, int codec, unsigned int received) {
|
|
||||||
if(codec == PAYLOAD_G729) {
|
|
||||||
if(opt_mos_g729) {
|
|
||||||
if(received < 100) {
|
|
||||||
return 3.92;
|
|
||||||
}
|
|
||||||
return (double)mos_g729((long double)ppl, (long double)burstr);
|
|
||||||
} else {
|
|
||||||
if(received < 100) {
|
|
||||||
return 4.5;
|
|
||||||
}
|
|
||||||
return calculate_mos_g711(ppl, burstr, 2);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(received < 100) {
|
|
||||||
return 4.5;
|
|
||||||
}
|
|
||||||
return calculate_mos_g711(ppl, burstr, 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
void Statistics::calculateBurstr(double* burstr, double* lossr) const
|
void Statistics::calculateBurstr(double* burstr, double* lossr) const
|
||||||
{
|
{
|
||||||
int lost = 0;
|
int lost = 0;
|
||||||
|
|
@ -230,8 +177,10 @@ Statistics& Statistics::operator += (const Statistics& src)
|
||||||
mDuplicatedRtp += src.mDuplicatedRtp;
|
mDuplicatedRtp += src.mDuplicatedRtp;
|
||||||
mOldRtp += src.mOldRtp;
|
mOldRtp += src.mOldRtp;
|
||||||
mPacketLoss += src.mPacketLoss;
|
mPacketLoss += src.mPacketLoss;
|
||||||
|
mPacketDropped += src.mPacketDropped;
|
||||||
mAudioTime += src.mAudioTime;
|
mAudioTime += src.mAudioTime;
|
||||||
|
|
||||||
|
|
||||||
for (auto codecStat: src.mCodecCount)
|
for (auto codecStat: src.mCodecCount)
|
||||||
{
|
{
|
||||||
if (mCodecCount.find(codecStat.first) == mCodecCount.end())
|
if (mCodecCount.find(codecStat.first) == mCodecCount.end())
|
||||||
|
|
@ -277,6 +226,8 @@ Statistics& Statistics::operator -= (const Statistics& src)
|
||||||
mDuplicatedRtp -= src.mDuplicatedRtp;
|
mDuplicatedRtp -= src.mDuplicatedRtp;
|
||||||
mOldRtp -= src.mOldRtp;
|
mOldRtp -= src.mOldRtp;
|
||||||
mPacketLoss -= src.mPacketLoss;
|
mPacketLoss -= src.mPacketLoss;
|
||||||
|
mPacketDropped -= src.mPacketDropped;
|
||||||
|
|
||||||
mAudioTime -= src.mAudioTime;
|
mAudioTime -= src.mAudioTime;
|
||||||
for (auto codecStat: src.mCodecCount)
|
for (auto codecStat: src.mCodecCount)
|
||||||
{
|
{
|
||||||
|
|
@ -291,9 +242,10 @@ Statistics& Statistics::operator -= (const Statistics& src)
|
||||||
std::string Statistics::toShortString() const
|
std::string Statistics::toShortString() const
|
||||||
{
|
{
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "Received: " << mReceivedRtp
|
oss << "Received: " << mReceivedRtp
|
||||||
<< ", lost: " << mPacketLoss
|
<< ", lost: " << mPacketLoss
|
||||||
<< ", sent: " << mSentRtp;
|
<< ", dropped: " << mPacketDropped
|
||||||
|
<< ", sent: " << mSentRtp;
|
||||||
|
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,9 @@ public:
|
||||||
mDuplicatedRtp, // Number of received duplicated rtp packets
|
mDuplicatedRtp, // Number of received duplicated rtp packets
|
||||||
mOldRtp, // Number of late rtp packets
|
mOldRtp, // Number of late rtp packets
|
||||||
mPacketLoss, // Number of lost packets
|
mPacketLoss, // Number of lost packets
|
||||||
|
mPacketDropped, // Number of dropped packets (due to time unsync when playing)
|
||||||
mIllegalRtp; // Number of rtp packets with bad payload type
|
mIllegalRtp; // Number of rtp packets with bad payload type
|
||||||
|
|
||||||
int mLoss[128]; // Every item is number of loss of corresping length
|
int mLoss[128]; // Every item is number of loss of corresping length
|
||||||
size_t mAudioTime; // Decoded/found time in milliseconds
|
size_t mAudioTime; // Decoded/found time in milliseconds
|
||||||
uint16_t mSsrc; // Last known SSRC ID in a RTP stream
|
uint16_t mSsrc; // Last known SSRC ID in a RTP stream
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue