1
0
mirror of https://github.com/danog/libtgvoip.git synced 2024-11-26 12:14:39 +01:00
This commit is contained in:
Daniil Gentili 2020-01-23 18:06:11 +01:00
parent 3f23dcc006
commit bcb8a6ad45
Signed by: danog
GPG Key ID: 8C1BE3B34B230CA7
7 changed files with 184 additions and 149 deletions

View File

@ -208,8 +208,7 @@ public:
setNetworkType(initialNetworkType);
std::vector<uint8_t> encryptionKeyValue = encryptionKey.value;
controller_->SetEncryptionKey((char *)(encryptionKeyValue.data()), encryptionKey.isOutgoing);
controller_->SetEncryptionKey(encryptionKey.value, encryptionKey.isOutgoing);
controller_->SetRemoteEndpoints(mappedEndpoints, config.enableP2P, config.maxApiLayer);
controller_->Start();

View File

@ -91,9 +91,9 @@ VoIPController::VoIPController() : activeNetItfName(""),
seq = 1;
lastRemoteSeq = 0;
state = STATE_WAIT_INIT;
audioInput = NULL;
audioOutput = NULL;
encoder = NULL;
audioInput = nullptr;
audioOutput = nullptr;
encoder = nullptr;
audioOutStarted = false;
audioTimestampIn = 0;
audioTimestampOut = 0;
@ -105,7 +105,7 @@ VoIPController::VoIPController() : activeNetItfName(""),
packetsReceived = 0;
waitingForAcks = false;
networkType = NET_TYPE_UNKNOWN;
echoCanceller = NULL;
echoCanceller = nullptr;
dontSendPackets = 0;
micMuted = false;
waitingForRelayPeerInfo = false;
@ -120,7 +120,7 @@ VoIPController::VoIPController() : activeNetItfName(""),
prevSendLossCount = 0;
receivedInit = false;
receivedInitAck = false;
statsDump = NULL;
statsDump = nullptr;
useTCP = false;
useUDP = true;
didAddTcpRelays = false;
@ -155,30 +155,30 @@ VoIPController::VoIPController() : activeNetItfName(""),
unsentStreamPackets.store(0);
runReceiver = false;
sendThread = NULL;
recvThread = NULL;
sendThread = nullptr;
recvThread = nullptr;
maxAudioBitrate = (uint32_t)ServerConfig::GetSharedInstance()->GetInt("audio_max_bitrate", 20000);
maxAudioBitrateGPRS = (uint32_t)ServerConfig::GetSharedInstance()->GetInt("audio_max_bitrate_gprs", 8000);
maxAudioBitrateEDGE = (uint32_t)ServerConfig::GetSharedInstance()->GetInt("audio_max_bitrate_edge", 16000);
maxAudioBitrateSaving = (uint32_t)ServerConfig::GetSharedInstance()->GetInt("audio_max_bitrate_saving", 8000);
initAudioBitrate = (uint32_t)ServerConfig::GetSharedInstance()->GetInt("audio_init_bitrate", 16000);
initAudioBitrateGPRS = (uint32_t)ServerConfig::GetSharedInstance()->GetInt("audio_init_bitrate_gprs", 8000);
initAudioBitrateEDGE = (uint32_t)ServerConfig::GetSharedInstance()->GetInt("audio_init_bitrate_edge", 8000);
initAudioBitrateSaving = (uint32_t)ServerConfig::GetSharedInstance()->GetInt("audio_init_bitrate_saving", 8000);
audioBitrateStepIncr = (uint32_t)ServerConfig::GetSharedInstance()->GetInt("audio_bitrate_step_incr", 1000);
audioBitrateStepDecr = (uint32_t)ServerConfig::GetSharedInstance()->GetInt("audio_bitrate_step_decr", 1000);
minAudioBitrate = (uint32_t)ServerConfig::GetSharedInstance()->GetInt("audio_min_bitrate", 8000);
maxAudioBitrate = ServerConfig::GetSharedInstance()->GetUInt("audio_max_bitrate", 20000);
maxAudioBitrateGPRS = ServerConfig::GetSharedInstance()->GetUInt("audio_max_bitrate_gprs", 8000);
maxAudioBitrateEDGE = ServerConfig::GetSharedInstance()->GetUInt("audio_max_bitrate_edge", 16000);
maxAudioBitrateSaving = ServerConfig::GetSharedInstance()->GetUInt("audio_max_bitrate_saving", 8000);
initAudioBitrate = ServerConfig::GetSharedInstance()->GetUInt("audio_init_bitrate", 16000);
initAudioBitrateGPRS = ServerConfig::GetSharedInstance()->GetUInt("audio_init_bitrate_gprs", 8000);
initAudioBitrateEDGE = ServerConfig::GetSharedInstance()->GetUInt("audio_init_bitrate_edge", 8000);
initAudioBitrateSaving = ServerConfig::GetSharedInstance()->GetUInt("audio_init_bitrate_saving", 8000);
audioBitrateStepIncr = ServerConfig::GetSharedInstance()->GetUInt("audio_bitrate_step_incr", 1000);
audioBitrateStepDecr = ServerConfig::GetSharedInstance()->GetUInt("audio_bitrate_step_decr", 1000);
minAudioBitrate = ServerConfig::GetSharedInstance()->GetUInt("audio_min_bitrate", 8000);
relaySwitchThreshold = ServerConfig::GetSharedInstance()->GetDouble("relay_switch_threshold", 0.8);
p2pToRelaySwitchThreshold = ServerConfig::GetSharedInstance()->GetDouble("p2p_to_relay_switch_threshold", 0.6);
relayToP2pSwitchThreshold = ServerConfig::GetSharedInstance()->GetDouble("relay_to_p2p_switch_threshold", 0.8);
reconnectingTimeout = ServerConfig::GetSharedInstance()->GetDouble("reconnecting_state_timeout", 2.0);
needRateFlags = static_cast<uint32_t>(ServerConfig::GetSharedInstance()->GetInt("rate_flags", 0xFFFFFFFF));
needRateFlags = ServerConfig::GetSharedInstance()->GetUInt("rate_flags", 0xFFFFFFFF);
rateMaxAcceptableRTT = ServerConfig::GetSharedInstance()->GetDouble("rate_min_rtt", 0.6);
rateMaxAcceptableSendLoss = ServerConfig::GetSharedInstance()->GetDouble("rate_min_send_loss", 0.2);
packetLossToEnableExtraEC = ServerConfig::GetSharedInstance()->GetDouble("packet_loss_for_extra_ec", 0.02);
maxUnsentStreamPackets = static_cast<uint32_t>(ServerConfig::GetSharedInstance()->GetInt("max_unsent_stream_packets", 2));
unackNopThreshold = static_cast<uint32_t>(ServerConfig::GetSharedInstance()->GetInt("unack_nop_threshold", 10));
maxUnsentStreamPackets = ServerConfig::GetSharedInstance()->GetUInt("max_unsent_stream_packets", 2);
unackNopThreshold = ServerConfig::GetSharedInstance()->GetUInt("unack_nop_threshold", 10);
#ifdef __APPLE__
machTimestart = 0;
@ -210,8 +210,8 @@ VoIPController::~VoIPController()
if (audioIO)
{
delete audioIO;
audioInput = NULL;
audioOutput = NULL;
audioInput = nullptr;
audioOutput = nullptr;
}
for (auto _stm = incomingStreams.begin(); _stm != incomingStreams.end(); ++_stm)
{
@ -242,7 +242,7 @@ VoIPController::~VoIPController()
if (tgvoipLogFile)
{
FILE *log = tgvoipLogFile;
tgvoipLogFile = NULL;
tgvoipLogFile = nullptr;
fclose(log);
}
#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO)
@ -301,7 +301,7 @@ void VoIPController::Stop()
{
LOGD("before delete video packet sender");
delete videoPacketSender;
videoPacketSender = NULL;
videoPacketSender = nullptr;
}
LOGD("Left VoIPController::Stop [need rate = %d]", (int)needRate);
}
@ -327,10 +327,12 @@ void VoIPController::SetRemoteEndpoints(vector<Endpoint> endpoints, bool allowP2
this->endpoints[it->id] = *it;
if (currentEndpoint == 0)
currentEndpoint = it->id;
if (it->type == Endpoint::Type::TCP_RELAY)
didAddTcpRelays = true;
if (it->type == Endpoint::Type::UDP_RELAY)
useTCP = false;
else if (it->type == Endpoint::Type::TCP_RELAY)
didAddTcpRelays = true;
LOGV("Adding endpoint: %s:%d, %s", it->address.ToString().c_str(), it->port, it->type == Endpoint::Type::UDP_RELAY ? "UDP" : "TCP");
}
preferredRelay = currentEndpoint;
@ -378,9 +380,9 @@ void VoIPController::Connect()
sendThread->Start();
}
void VoIPController::SetEncryptionKey(char *key, bool isOutgoing)
void VoIPController::SetEncryptionKey(std::vector<uint8_t> key, bool isOutgoing)
{
memcpy(encryptionKey, key, 256);
memcpy(encryptionKey, key.data(), 256);
uint8_t sha1[SHA1_LENGTH];
crypto.sha1((uint8_t *)encryptionKey, 256, sha1);
memcpy(keyFingerprint, sha1 + (SHA1_LENGTH - 8), 8);
@ -442,13 +444,9 @@ void VoIPController::SetNetworkType(int type)
else if (endpoint.type == Endpoint::Type::TCP_RELAY && endpoint.socket)
{
endpoint.socket->Close();
//delete endpoint.socket;
//endpoint.socket=NULL;
}
//if(endpoint->type==Endpoint::Type::UDP_P2P_INET){
endpoint.averageRTT = 0;
endpoint.rtts.Reset();
//}
}
}
}
@ -493,11 +491,11 @@ double VoIPController::GetAverageRTT()
{
double res = 0;
int count = 0;
for (auto itr = recentOutgoingPackets.begin(); itr != recentOutgoingPackets.end(); ++itr)
for (const auto &packet : recentOutgoingPackets)
{
if (itr->ackTime > 0)
if (packet.ackTime > 0)
{
res += (itr->ackTime - itr->sendTime);
res += (packet.ackTime - packet.sendTime);
count++;
}
}
@ -954,7 +952,7 @@ void VoIPController::SetConfig(const Config &cfg)
if (tgvoipLogFile)
{
fclose(tgvoipLogFile);
tgvoipLogFile = NULL;
tgvoipLogFile = nullptr;
}
if (!config.logFilePath.empty())
{
@ -963,19 +961,19 @@ void VoIPController::SetConfig(const Config &cfg)
#else
if (_wfopen_s(&tgvoipLogFile, config.logFilePath.c_str(), L"a") != 0)
{
tgvoipLogFile = NULL;
tgvoipLogFile = nullptr;
}
#endif
tgvoip_log_file_write_header(tgvoipLogFile);
}
else
{
tgvoipLogFile = NULL;
tgvoipLogFile = nullptr;
}
if (statsDump)
{
fclose(statsDump);
statsDump = NULL;
statsDump = nullptr;
}
if (!config.statsDumpFilePath.empty())
{
@ -984,7 +982,7 @@ void VoIPController::SetConfig(const Config &cfg)
#else
if (_wfopen_s(&statsDump, config.statsDumpFilePath.c_str(), L"w") != 0)
{
statsDump = NULL;
statsDump = nullptr;
}
#endif
if (statsDump)
@ -994,7 +992,7 @@ void VoIPController::SetConfig(const Config &cfg)
}
else
{
statsDump = NULL;
statsDump = nullptr;
}
UpdateDataSavingState();
UpdateAudioBitrateLimit();
@ -1071,37 +1069,39 @@ void VoIPController::SetAudioOutputDuckingEnabled(bool enabled)
void VoIPController::InitializeTimers()
{
initTimeoutID = messageThread.Post([this] {
LOGW("Init timeout, disconnecting");
lastError = ERROR_TIMEOUT;
SetState(STATE_FAILED);
},
config.initTimeout);
initTimeoutID = messageThread.Post(
[this] {
LOGW("Init timeout, disconnecting");
lastError = ERROR_TIMEOUT;
SetState(STATE_FAILED);
},
config.initTimeout);
if (!config.statsDumpFilePath.empty())
{
messageThread.Post([this] {
if (statsDump && incomingStreams.size() == 1)
{
shared_ptr<JitterBuffer> &jitterBuffer = incomingStreams[0]->jitterBuffer;
//fprintf(statsDump, "Time\tRTT\tLISeq\tLASeq\tCWnd\tBitrate\tJitter\tJDelay\tAJDelay\n");
fprintf(statsDump, "%.3f\t%.3f\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%.3f\t%.3f\t%.3f\n",
GetCurrentTime() - connectionInitTime,
endpoints.at(currentEndpoint).rtts[0],
lastRemoteSeq,
(uint32_t)seq,
lastRemoteAckSeq,
recvLossCount,
conctl ? conctl->GetSendLossCount() : 0,
conctl ? (int)conctl->GetInflightDataSize() : 0,
encoder ? encoder->GetBitrate() : 0,
encoder ? encoder->GetPacketLoss() : 0,
jitterBuffer ? jitterBuffer->GetLastMeasuredJitter() : 0,
jitterBuffer ? jitterBuffer->GetLastMeasuredDelay() * 0.06 : 0,
jitterBuffer ? jitterBuffer->GetAverageDelay() * 0.06 : 0);
}
},
0.1, 0.1);
messageThread.Post(
[this] {
if (statsDump && incomingStreams.size() == 1)
{
shared_ptr<JitterBuffer> &jitterBuffer = incomingStreams[0]->jitterBuffer;
//fprintf(statsDump, "Time\tRTT\tLISeq\tLASeq\tCWnd\tBitrate\tJitter\tJDelay\tAJDelay\n");
fprintf(statsDump, "%.3f\t%.3f\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%.3f\t%.3f\t%.3f\n",
GetCurrentTime() - connectionInitTime,
endpoints.at(currentEndpoint).rtts[0],
lastRemoteSeq,
(uint32_t)seq,
lastRemoteAckSeq,
recvLossCount,
conctl ? conctl->GetSendLossCount() : 0,
conctl ? (int)conctl->GetInflightDataSize() : 0,
encoder ? encoder->GetBitrate() : 0,
encoder ? encoder->GetPacketLoss() : 0,
jitterBuffer ? jitterBuffer->GetLastMeasuredJitter() : 0,
jitterBuffer ? jitterBuffer->GetLastMeasuredDelay() * 0.06 : 0,
jitterBuffer ? jitterBuffer->GetAverageDelay() * 0.06 : 0);
}
},
0.1, 0.1);
}
messageThread.Post(std::bind(&VoIPController::SendRelayPings, this), 0.0, 2.0);
@ -1120,9 +1120,10 @@ void VoIPController::RunSendThread()
break;
if (IS_MOBILE_NETWORK(networkType))
stats.bytesSentMobile += (uint64_t)pkt.packet.data.Length();
stats.bytesSentMobile += static_cast<uint64_t>(pkt.packet.data.Length());
else
stats.bytesSentWifi += (uint64_t)pkt.packet.data.Length();
stats.bytesSentWifi += static_cast<uint64_t>(pkt.packet.data.Length());
if (pkt.packet.protocol == NetworkProtocol::TCP)
{
if (pkt.socket && !pkt.socket->IsFailed())
@ -1523,11 +1524,6 @@ void VoIPController::UpdateDataSavingState()
#pragma mark - Networking & crypto
uint32_t VoIPController::GenerateOutSeq()
{
return seq++;
}
void VoIPController::WritePacketHeader(uint32_t pseq, BufferOutputStream *s, unsigned char type, uint32_t length, PacketSender *source)
{
uint32_t acks = 0;
@ -1579,7 +1575,7 @@ void VoIPController::WritePacketHeader(uint32_t pseq, BufferOutputStream *s, uns
}
if (peerVersion >= 9 && videoStream && videoStream->enabled)
{
s->WriteInt32((uint32_t)((lastRecvPacketTime - connectionInitTime) * 1000.0));
s->WriteInt32(static_cast<uint32_t>((lastRecvPacketTime - connectionInitTime) * 1000.0));
}
}
else
@ -1762,13 +1758,15 @@ void VoIPController::SendInit()
if (state == STATE_WAIT_INIT)
SetState(STATE_WAIT_INIT_ACK);
messageThread.Post([this] {
if (state == STATE_WAIT_INIT_ACK)
{
SendInit();
}
},
0.5);
messageThread.Post(
[this] {
if (state == STATE_WAIT_INIT_ACK)
{
SendInit();
}
},
0.5);
}
void VoIPController::InitUDPProxy()
@ -2110,7 +2108,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
{
// relay special request response
in.Seek(16 + 12);
uint32_t tlid = (uint32_t)in.ReadInt32();
uint32_t tlid = in.ReadUInt32();
if (tlid == TLID_UDP_REFLECTOR_SELF_INFO)
{
@ -2156,10 +2154,10 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
{
if (in.Remaining() >= 16)
{
uint32_t myAddr = (uint32_t)in.ReadInt32();
uint32_t myPort = (uint32_t)in.ReadInt32();
uint32_t peerAddr = (uint32_t)in.ReadInt32();
uint32_t peerPort = (uint32_t)in.ReadInt32();
uint32_t myAddr = in.ReadUInt32();
uint32_t myPort = in.ReadUInt32();
uint32_t peerAddr = in.ReadUInt32();
uint32_t peerPort = in.ReadUInt32();
constexpr int64_t p2pID = static_cast<int64_t>(FOURCC('P', '2', 'P', '4')) << 32;
constexpr int64_t lanID = static_cast<int64_t>(FOURCC('L', 'A', 'N', '4')) << 32;
@ -2234,7 +2232,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
crypto.aes_ige_decrypt((unsigned char *)buffer + in.GetOffset(), aesOut, in.Remaining(), key, iv);
BufferInputStream _in(aesOut, in.Remaining());
unsigned char sha[SHA1_LENGTH];
uint32_t _len = (uint32_t)_in.ReadInt32();
uint32_t _len = _in.ReadUInt32();
if (_len > _in.Remaining())
_len = (uint32_t)_in.Remaining();
crypto.sha1((uint8_t *)(aesOut), (size_t)(_len + 4), sha);
@ -2301,7 +2299,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
return;
}
innerLen = (uint32_t)(shortFormat ? in.ReadInt16() : in.ReadInt32());
innerLen = static_cast<uint32_t>(shortFormat ? in.ReadInt16() : in.ReadInt32());
if (innerLen > decryptedLen - sizeSize)
{
LOGW("Received packet has wrong inner length (%d with total of %u)", (int)innerLen, (unsigned int)decryptedLen);
@ -2356,21 +2354,21 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
if (shortFormat)
{
type = in.ReadByte();
ackId = (uint32_t)in.ReadInt32();
pseq = (uint32_t)in.ReadInt32();
acks = (uint32_t)in.ReadInt32();
ackId = in.ReadUInt32();
pseq = in.ReadUInt32();
acks = in.ReadUInt32();
pflags = in.ReadByte();
packetInnerLen = innerLen - 14;
}
else
{
uint32_t tlid = (uint32_t)in.ReadInt32();
uint32_t tlid = in.ReadUInt32();
if (tlid == TLID_DECRYPTED_AUDIO_BLOCK)
{
in.ReadInt64(); // random id
uint32_t randLen = (uint32_t)in.ReadTlLength();
uint32_t randLen = in.ReadTlLength();
in.Seek(in.GetOffset() + randLen + pad4(randLen));
uint32_t flags = (uint32_t)in.ReadInt32();
uint32_t flags = in.ReadUInt32();
type = (unsigned char)((flags >> 24) & 0xFF);
if (!(flags & PFLAG_HAS_SEQ && flags & PFLAG_HAS_RECENT_RECV))
{
@ -2391,12 +2389,12 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
return;
}
}
ackId = (uint32_t)in.ReadInt32();
pseq = (uint32_t)in.ReadInt32();
acks = (uint32_t)in.ReadInt32();
ackId = in.ReadUInt32();
pseq = in.ReadUInt32();
acks = in.ReadUInt32();
if (flags & PFLAG_HAS_PROTO)
{
uint32_t proto = (uint32_t)in.ReadInt32();
uint32_t proto = in.ReadUInt32();
if (proto != PROTOCOL_NAME)
{
LOGW("Received packet uses wrong protocol");
@ -2408,7 +2406,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
}
if (flags & PFLAG_HAS_EXTRA)
{
uint32_t extraLen = (uint32_t)in.ReadTlLength();
uint32_t extraLen = in.ReadTlLength();
in.Seek(in.GetOffset() + extraLen + pad4(extraLen));
}
if (flags & PFLAG_HAS_DATA)
@ -2420,13 +2418,13 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
else if (tlid == TLID_SIMPLE_AUDIO_BLOCK)
{
in.ReadInt64(); // random id
uint32_t randLen = (uint32_t)in.ReadTlLength();
uint32_t randLen = in.ReadTlLength();
in.Seek(in.GetOffset() + randLen + pad4(randLen));
packetInnerLen = in.ReadTlLength();
type = in.ReadByte();
ackId = (uint32_t)in.ReadInt32();
pseq = (uint32_t)in.ReadInt32();
acks = (uint32_t)in.ReadInt32();
ackId = in.ReadUInt32();
pseq = in.ReadUInt32();
acks = in.ReadUInt32();
if (peerVersion >= 6)
pflags = in.ReadByte();
else
@ -2627,11 +2625,11 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
if (type == PKT_INIT)
{
LOGD("Received init");
uint32_t ver = (uint32_t)in.ReadInt32();
uint32_t ver = in.ReadUInt32();
if (!receivedInit)
peerVersion = ver;
LOGI("Peer version is %d", peerVersion);
uint32_t minVer = (uint32_t)in.ReadInt32();
uint32_t minVer = in.ReadUInt32();
if (minVer > PROTOCOL_VERSION || peerVersion < MIN_PROTOCOL_VERSION)
{
lastError = ERROR_INCOMPATIBLE;
@ -2639,7 +2637,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
SetState(STATE_FAILED);
return;
}
uint32_t flags = (uint32_t)in.ReadInt32();
uint32_t flags = in.ReadUInt32();
if (!receivedInit)
{
if (flags & INIT_FLAG_DATA_SAVING_ENABLED)
@ -2742,7 +2740,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
if (packetInnerLen > 10)
{
peerVersion = in.ReadInt32();
uint32_t minVer = (uint32_t)in.ReadInt32();
uint32_t minVer = in.ReadUInt32();
if (minVer > PROTOCOL_VERSION || peerVersion < MIN_PROTOCOL_VERSION)
{
lastError = ERROR_INCOMPATIBLE;
@ -2763,7 +2761,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
return;
int i;
shared_ptr<Stream> incomingAudioStream = NULL;
shared_ptr<Stream> incomingAudioStream = nullptr;
for (i = 0; i < streamCount; i++)
{
shared_ptr<Stream> stm = make_shared<Stream>();
@ -2777,7 +2775,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
}
else
{
stm->codec = (uint32_t)in.ReadInt32();
stm->codec = in.ReadUInt32();
}
in.ReadInt16();
stm->frameDuration = 60;
@ -2791,12 +2789,12 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
{
stm->jitterBuffer = make_shared<JitterBuffer>(stm->frameDuration);
if (stm->frameDuration > 50)
stm->jitterBuffer->SetMinPacketCount((uint32_t)ServerConfig::GetSharedInstance()->GetInt("jitter_initial_delay_60", 2));
stm->jitterBuffer->SetMinPacketCount(ServerConfig::GetSharedInstance()->GetUInt("jitter_initial_delay_60", 2));
else if (stm->frameDuration > 30)
stm->jitterBuffer->SetMinPacketCount((uint32_t)ServerConfig::GetSharedInstance()->GetInt("jitter_initial_delay_40", 4));
stm->jitterBuffer->SetMinPacketCount(ServerConfig::GetSharedInstance()->GetUInt("jitter_initial_delay_40", 4));
else
stm->jitterBuffer->SetMinPacketCount((uint32_t)ServerConfig::GetSharedInstance()->GetInt("jitter_initial_delay_20", 6));
stm->decoder = NULL;
stm->jitterBuffer->SetMinPacketCount(ServerConfig::GetSharedInstance()->GetUInt("jitter_initial_delay_20", 6));
stm->decoder = nullptr;
}
else if (stm->type == STREAM_TYPE_VIDEO)
{
@ -2881,7 +2879,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
unsigned char flags = (unsigned char)(streamID & 0xC0);
streamID &= 0x3F;
uint16_t sdlen = (uint16_t)(flags & STREAM_DATA_FLAG_LEN16 ? in.ReadInt16() : in.ReadByte());
uint32_t pts = (uint32_t)in.ReadInt32();
uint32_t pts = in.ReadUInt32();
unsigned char fragmentCount = 1;
unsigned char fragmentIndex = 0;
//LOGD("stream data, pts=%d, len=%d, rem=%d", pts, sdlen, in.Remaining());
@ -3001,7 +2999,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
{
if (packetInnerLen >= 4)
{
uint32_t pingSeq = (uint32_t)in.ReadInt32();
uint32_t pingSeq = in.ReadUInt32();
#ifdef LOG_PACKETS
LOGD("Received pong for ping in seq %u", pingSeq);
#endif
@ -3033,7 +3031,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
if (type == PKT_LAN_ENDPOINT)
{
LOGV("received lan endpoint");
uint32_t peerAddr = (uint32_t)in.ReadInt32();
uint32_t peerAddr = in.ReadUInt32();
uint16_t peerPort = (uint16_t)in.ReadInt32();
constexpr int64_t lanID = static_cast<int64_t>(FOURCC('L', 'A', 'N', '4')) << 32;
unsigned char peerTag[16];
@ -3052,7 +3050,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
SendPublicEndpointsRequest();
if (peerVersion >= 2)
{
uint32_t flags = (uint32_t)in.ReadInt32();
uint32_t flags = in.ReadUInt32();
dataSavingRequestedByPeer = (flags & INIT_FLAG_DATA_SAVING_ENABLED) == INIT_FLAG_DATA_SAVING_ENABLED;
UpdateDataSavingState();
UpdateAudioBitrateLimit();
@ -3064,7 +3062,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
unsigned char streamID = in.ReadByte();
if (peerVersion < 7)
{
uint32_t lastTimestamp = (uint32_t)in.ReadInt32();
uint32_t lastTimestamp = in.ReadUInt32();
unsigned char count = in.ReadByte();
for (shared_ptr<Stream> &stm : incomingStreams)
{
@ -3103,7 +3101,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint &srcE
uint8_t fseq = in.ReadByte();
unsigned char fecScheme = in.ReadByte();
unsigned char prevFrameCount = in.ReadByte();
uint16_t fecLen = (uint16_t)in.ReadInt16();
uint16_t fecLen = in.ReadUInt16();
if (fecLen > in.Remaining())
return;
@ -3208,7 +3206,7 @@ void VoIPController::ProcessExtraData(Buffer &data)
if (!allowP2p)
return;
LOGV("received lan endpoint (extra)");
uint32_t peerAddr = (uint32_t)in.ReadInt32();
uint32_t peerAddr = in.ReadUInt32();
uint16_t peerPort = (uint16_t)in.ReadInt32();
constexpr int64_t lanID = static_cast<int64_t>(FOURCC('L', 'A', 'N', '4')) << 32;
if (currentEndpoint == lanID)
@ -3228,7 +3226,7 @@ void VoIPController::ProcessExtraData(Buffer &data)
currentEndpoint = preferredRelay;
if (allowP2p)
SendPublicEndpointsRequest();
uint32_t flags = (uint32_t)in.ReadInt32();
uint32_t flags = in.ReadUInt32();
dataSavingRequestedByPeer = (flags & INIT_FLAG_DATA_SAVING_ENABLED) == INIT_FLAG_DATA_SAVING_ENABLED;
UpdateDataSavingState();
UpdateAudioBitrateLimit();
@ -3304,7 +3302,7 @@ Endpoint &VoIPController::GetRemoteEndpoint()
Endpoint *VoIPController::GetEndpointForPacket(const PendingOutgoingPacket &pkt)
{
Endpoint *endpoint = NULL;
Endpoint *endpoint = nullptr;
if (pkt.endpoint)
{
try
@ -3441,7 +3439,7 @@ void VoIPController::SendPacket(unsigned char *data, size_t len, Endpoint &ep, P
else
{
BufferOutputStream inner(len + 128);
inner.WriteInt32((int32_t)len);
inner.WriteInt32(static_cast<int32_t>(len));
inner.WriteBytes(data, len);
if (inner.GetLength() % 16 != 0)
{
@ -3933,8 +3931,8 @@ void VoIPController::ProcessIncomingVideoFrame(Buffer frame, uint32_t pts, bool
if (keyframe)
{
BufferInputStream in(frame);
uint16_t width = (uint16_t)in.ReadInt16();
uint16_t height = (uint16_t)in.ReadInt16();
uint16_t width = in.ReadUInt16();
uint16_t height = in.ReadUInt16();
uint8_t sizeAndFlag = in.ReadByte();
int size = sizeAndFlag & 0x0F;
bool reset = (sizeAndFlag & 0x80) == 0x80;

View File

@ -236,7 +236,7 @@ public:
* @param key
* @param isOutgoing
*/
void SetEncryptionKey(char *key, bool isOutgoing);
void SetEncryptionKey(std::vector<uint8_t>, bool isOutgoing);
/**
*
* @param cfg
@ -333,7 +333,7 @@ public:
* The peer must have the TGVOIP_PEER_CAP_GROUP_CALLS capability. After the peer acknowledges the key, Callbacks::groupCallKeySent will be called.
* @param key newly-generated group call key, must be exactly 265 bytes long
*/
void SendGroupCallKey(unsigned char *key);
void SendGroupCallKey(uint8_t *key);
/**
* In an incoming call, request the peer to generate a new encryption key, send it to you and upgrade this call to a E2E group call.
*/
@ -370,7 +370,7 @@ public:
void (*connectionStateChanged)(VoIPController *, int);
void (*signalBarCountChanged)(VoIPController *, int);
void (*groupCallKeySent)(VoIPController *);
void (*groupCallKeyReceived)(VoIPController *, const unsigned char *);
void (*groupCallKeyReceived)(VoIPController *, const uint8_t *);
void (*upgradeToGroupCallRequested)(VoIPController *);
};
void SetCallbacks(Callbacks callbacks);
@ -390,7 +390,7 @@ public:
struct PendingOutgoingPacket
{
PendingOutgoingPacket(uint32_t seq, unsigned char type, size_t len, Buffer &&data, int64_t endpoint)
PendingOutgoingPacket(uint32_t seq, uint8_t type, size_t len, Buffer &&data, int64_t endpoint)
{
this->seq = seq;
this->type = type;
@ -420,7 +420,7 @@ public:
}
TGVOIP_DISALLOW_COPY_AND_ASSIGN(PendingOutgoingPacket);
uint32_t seq;
unsigned char type;
uint8_t type;
size_t len;
Buffer data;
int64_t endpoint;
@ -429,7 +429,7 @@ public:
struct Stream
{
int32_t userID;
unsigned char id;
uint8_t id;
unsigned char type;
uint32_t codec;
bool enabled;
@ -552,7 +552,11 @@ private:
void SendPublicEndpointsRequest(const Endpoint &relay);
Endpoint &GetEndpointByType(const Endpoint::Type type);
void SendPacketReliably(unsigned char type, unsigned char *data, size_t len, double retryInterval, double timeout);
uint32_t GenerateOutSeq();
inline uint32_t GenerateOutSeq()
{
return seq++;
}
void ActuallySendPacket(NetworkPacket pkt, Endpoint &ep);
void InitializeAudio();
void StartAudio();
@ -583,9 +587,9 @@ private:
int64_t peerPreferredRelay = 0;
std::atomic<bool> runReceiver;
std::atomic<uint32_t> seq;
uint32_t lastRemoteSeq; // Seqno of last received packet
uint32_t lastRemoteSeq; // Seqno of last received packet
uint32_t lastRemoteAckSeq; // Seqno of last sent packet acked by remote
uint32_t lastSentSeq; // Seqno of last sent packet
uint32_t lastSentSeq; // Seqno of last sent packet
std::vector<RecentOutgoingPacket> recentOutgoingPackets;
std::array<uint32_t, MAX_RECENT_PACKETS> recentIncomingSeqs{};
size_t recentIncomingSeqIdx = 0;

View File

@ -53,6 +53,14 @@ int32_t ServerConfig::GetInt(std::string name, int32_t fallback)
return fallback;
}
uint32_t ServerConfig::GetUInt(std::string name, uint32_t fallback)
{
MutexGuard sync(mutex);
if (ContainsKey(name) && config[name].is_number())
return static_cast<uint32_t>(config[name].int_value());
return fallback;
}
std::string ServerConfig::GetString(std::string name, std::string fallback)
{
MutexGuard sync(mutex);

View File

@ -28,6 +28,8 @@ public:
bool GetBoolean(std::string name, bool fallback);
void Update(std::string jsonString);
uint32_t GetUInt(std::string name, uint32_t fallback);
private:
static ServerConfig *sharedInstance;
bool ContainsKey(std::string key);

View File

@ -95,16 +95,16 @@ int16_t BufferInputStream::ReadInt16()
return res;
}
int32_t BufferInputStream::ReadTlLength()
uint32_t BufferInputStream::ReadTlLength()
{
unsigned char l = ReadByte();
if (l < 254)
return l;
assert(length - offset >= 3);
EnsureEnoughRemaining(3);
int32_t res = ((int32_t)buffer[offset] & 0xFF) |
(((int32_t)buffer[offset + 1] & 0xFF) << 8) |
(((int32_t)buffer[offset + 2] & 0xFF) << 16);
uint32_t res = ((uint32_t)buffer[offset] & 0xFF) |
(((uint32_t)buffer[offset + 1] & 0xFF) << 8) |
(((uint32_t)buffer[offset + 2] & 0xFF) << 16);
offset += 3;
return res;
}

View File

@ -4,8 +4,7 @@
// you should have received with this source code distribution.
//
#ifndef LIBTGVOIP_BUFFERINPUTSTREAM_H
#define LIBTGVOIP_BUFFERINPUTSTREAM_H
#pragma once
#include <stdio.h>
#include <stdint.h>
@ -41,11 +40,24 @@ public:
int64_t ReadInt64();
int32_t ReadInt32();
int16_t ReadInt16();
int32_t ReadTlLength();
uint32_t ReadTlLength();
void ReadBytes(unsigned char *to, size_t count);
void ReadBytes(Buffer &to);
BufferInputStream GetPartBuffer(size_t length, bool advance);
inline uint64_t ReadUInt64()
{
return static_cast<uint64_t>(ReadInt64());
}
inline uint32_t ReadUInt32()
{
return static_cast<uint32_t>(ReadInt32());
}
inline uint16_t ReadUInt16()
{
return static_cast<uint16_t>(ReadInt16());
}
private:
void EnsureEnoughRemaining(size_t need);
const unsigned char *buffer;
@ -74,6 +86,20 @@ public:
void Reset();
void Rewind(size_t numBytes);
inline void WriteUInt64(uint64_t i)
{
WriteInt64(static_cast<int64_t>(i));
}
inline void WriteUInt32(uint32_t i)
{
WriteInt32(static_cast<int32_t>(i));
}
inline void WriteUInt16(uint16_t i)
{
WriteInt16(static_cast<int16_t>(i));
}
BufferOutputStream &operator=(BufferOutputStream &&other)
{
if (this != &other)
@ -396,5 +422,3 @@ private:
Mutex mutex;
};
} // namespace tgvoip
#endif //LIBTGVOIP_BUFFERINPUTSTREAM_H