common: Add more debug prints to track lost packets

This commit is contained in:
Joni Räsänen 2022-03-01 10:22:14 +02:00
parent c66db536be
commit 06c14ace97
3 changed files with 58 additions and 34 deletions

View File

@ -157,6 +157,11 @@ namespace uvgrtp {
/* __sendtov() calls these handlers in order before sending the packet */
std::vector<socket_packet_handler> vec_handlers_;
#ifndef NDEBUG
uint64_t sent_packets_ = 0;
uint64_t received_packets_ = 0;
#endif // !NDEBUG
#ifdef _WIN32
WSABUF buffers_[MAX_BUFFER_COUNT];
#else

View File

@ -485,7 +485,7 @@ uint32_t uvgrtp::formats::h26x::drop_frame(uint32_t ts)
uint16_t s_seq = frames_.at(ts).s_seq;
uint16_t e_seq = frames_.at(ts).e_seq;
LOG_INFO("Dropping frame %u, %u - %u", ts, s_seq, e_seq);
LOG_INFO("Dropping frame. Ts: %u, Seq: %u - %u", ts, s_seq, e_seq);
if (frames_.find(ts) == frames_.end())
{
@ -607,6 +607,7 @@ rtp_error_t uvgrtp::formats::h26x::packet_handler(int flags, uvgrtp::frame::rtp_
/* drop old intra if a new one is received */
if (nal_type == NT_INTRA) {
if (intra != INVALID_TS && enable_idelay) {
LOG_WARN("Dropping old h26x intra since new one has arrived");
drop_frame(intra);
}
intra = c_ts;
@ -684,6 +685,7 @@ rtp_error_t uvgrtp::formats::h26x::packet_handler(int flags, uvgrtp::frame::rtp_
/* intra is still in progress, do not return the inter */
if (nal_type == NT_INTER && intra != INVALID_TS && enable_idelay) {
LOG_WARN("Got h26x Inter frame while intra is still in progress");
drop_frame(c_ts);
return RTP_OK;
}
@ -717,6 +719,7 @@ rtp_error_t uvgrtp::formats::h26x::packet_handler(int flags, uvgrtp::frame::rtp_
if (is_frame_late(frames_.at(c_ts), rtp_ctx_->get_pkt_max_delay())) {
if (nal_type != NT_INTRA || (nal_type == NT_INTRA && !enable_idelay)) {
LOG_WARN("Received a packet that is too late!");
drop_frame(c_ts);
}
}
@ -745,6 +748,7 @@ void uvgrtp::formats::h26x::garbage_collect_lost_frames()
// first find all frames that have been waiting for too long
for (auto& gc_frame : frames_) {
if (uvgrtp::clock::hrc::diff_now(gc_frame.second.sframe_time) > LOST_FRAME_TIMEOUT_MS) {
LOG_WARN("Found and old frame that has not been completed");
to_remove.push_back(gc_frame.first);
}
}

View File

@ -28,11 +28,12 @@ using namespace mingw;
uvgrtp::socket::socket(int flags):
socket_(-1),
flags_(flags)
{
}
{}
uvgrtp::socket::~socket()
{
LOG_DEBUG("Socket total sent packets is %lu and received packets is %lu", sent_packets_, received_packets_);
#ifndef _WIN32
close(socket_);
#else
@ -181,6 +182,10 @@ rtp_error_t uvgrtp::socket::__sendto(sockaddr_in& addr, uint8_t *buf, size_t buf
if (bytes_sent)
*bytes_sent = nsend;
#ifndef NDEBUG
++sent_packets_;
#endif // !NDEBUG
return RTP_OK;
}
@ -232,10 +237,6 @@ rtp_error_t uvgrtp::socket::__sendtov(
set_bytes(bytes_sent, -1);
return RTP_SEND_ERROR;
}
set_bytes(bytes_sent, sent_bytes);
return RTP_OK;
#else
DWORD sent_bytes = 0;
@ -260,14 +261,20 @@ rtp_error_t uvgrtp::socket::__sendtov(
return RTP_SEND_ERROR;
}
#endif
#ifndef NDEBUG
sent_packets_ += buffers.size();
#endif // !NDEBUG
set_bytes(bytes_sent, sent_bytes);
return RTP_OK;
#endif
}
rtp_error_t uvgrtp::socket::sendto(buf_vec& buffers, int flags)
{
rtp_error_t ret;
rtp_error_t ret = RTP_OK;
for (auto& handler : vec_handlers_) {
if ((ret = (*handler.handler)(handler.arg, buffers)) != RTP_OK) {
@ -281,7 +288,7 @@ rtp_error_t uvgrtp::socket::sendto(buf_vec& buffers, int flags)
rtp_error_t uvgrtp::socket::sendto(buf_vec& buffers, int flags, int *bytes_sent)
{
rtp_error_t ret;
rtp_error_t ret = RTP_OK;
for (auto& handler : vec_handlers_) {
if ((ret = (*handler.handler)(handler.arg, buffers)) != RTP_OK) {
@ -295,7 +302,7 @@ rtp_error_t uvgrtp::socket::sendto(buf_vec& buffers, int flags, int *bytes_sent)
rtp_error_t uvgrtp::socket::sendto(sockaddr_in& addr, buf_vec& buffers, int flags)
{
rtp_error_t ret;
rtp_error_t ret = RTP_OK;
for (auto& handler : vec_handlers_) {
if ((ret = (*handler.handler)(handler.arg, buffers)) != RTP_OK) {
@ -313,7 +320,7 @@ rtp_error_t uvgrtp::socket::sendto(
int flags, int *bytes_sent
)
{
rtp_error_t ret;
rtp_error_t ret = RTP_OK;
for (auto& handler : vec_handlers_) {
if ((ret = (*handler.handler)(handler.arg, buffers)) != RTP_OK) {
@ -334,9 +341,8 @@ rtp_error_t uvgrtp::socket::__sendtov(
{
#ifndef _WIN32
int sent_bytes = 0;
struct mmsghdr *hptr, *headers;
hptr = headers = new struct mmsghdr[buffers.size()];
struct mmsghdr *headers = new struct mmsghdr[buffers.size()]tr;
struct mmsghdr *hptr = headers;
for (size_t i = 0; i < buffers.size(); ++i) {
headers[i].msg_hdr.msg_iov = new struct iovec[buffers[i].size()];
@ -375,11 +381,8 @@ rtp_error_t uvgrtp::socket::__sendtov(
delete[] headers[i].msg_hdr.msg_iov;
delete[] headers;
set_bytes(bytes_sent, sent_bytes);
return RTP_OK;
#else
INT ret;
INT ret = 0;
DWORD sent_bytes = 0;
WSABUF wsa_bufs[WSABUF_SIZE];
@ -417,14 +420,19 @@ send_:
}
}
#endif
#ifndef NDEBUG
sent_packets_ += buffers.size();
#endif // !NDEBUG
set_bytes(bytes_sent, sent_bytes);
return RTP_OK;
#endif
}
rtp_error_t uvgrtp::socket::sendto(pkt_vec& buffers, int flags)
{
rtp_error_t ret;
rtp_error_t ret = RTP_OK;
for (auto& buffer : buffers) {
for (auto& handler : vec_handlers_) {
@ -440,7 +448,7 @@ rtp_error_t uvgrtp::socket::sendto(pkt_vec& buffers, int flags)
rtp_error_t uvgrtp::socket::sendto(pkt_vec& buffers, int flags, int *bytes_sent)
{
rtp_error_t ret;
rtp_error_t ret = RTP_OK;
for (auto& buffer : buffers) {
for (auto& handler : vec_handlers_) {
@ -456,7 +464,7 @@ rtp_error_t uvgrtp::socket::sendto(pkt_vec& buffers, int flags, int *bytes_sent)
rtp_error_t uvgrtp::socket::sendto(sockaddr_in& addr, pkt_vec& buffers, int flags)
{
rtp_error_t ret;
rtp_error_t ret = RTP_OK;
for (auto& buffer : buffers) {
for (auto& handler : vec_handlers_) {
@ -472,7 +480,7 @@ rtp_error_t uvgrtp::socket::sendto(sockaddr_in& addr, pkt_vec& buffers, int flag
rtp_error_t uvgrtp::socket::sendto(sockaddr_in& addr, pkt_vec& buffers, int flags, int *bytes_sent)
{
rtp_error_t ret;
rtp_error_t ret = RTP_OK;
for (auto& buffer : buffers) {
for (auto& handler : vec_handlers_) {
@ -508,18 +516,16 @@ rtp_error_t uvgrtp::socket::__recv(uint8_t *buf, size_t buf_len, int flags, int
}
set_bytes(bytes_read, ret);
return RTP_OK;
#else
int rc, err;
WSABUF DataBuf;
DataBuf.len = (u_long)buf_len;
DataBuf.buf = (char *)buf;
DWORD bytes_received, flags_ = 0;
rc = ::WSARecv(socket_, &DataBuf, 1, &bytes_received, &flags_, NULL, NULL);
int rc = ::WSARecv(socket_, &DataBuf, 1, &bytes_received, &flags_, NULL, NULL);
if (rc == SOCKET_ERROR) {
err = WSAGetLastError();
int err = WSAGetLastError();
if (err == WSA_IO_PENDING || err == WSAEWOULDBLOCK) {
set_bytes(bytes_read, 0);
return RTP_INTERRUPTED;
@ -531,8 +537,13 @@ rtp_error_t uvgrtp::socket::__recv(uint8_t *buf, size_t buf_len, int flags, int
}
set_bytes(bytes_read, bytes_received);
return RTP_OK;
#endif
#ifndef NDEBUG
++received_packets_;
#endif // !NDEBUG
return RTP_OK;
}
rtp_error_t uvgrtp::socket::recv(uint8_t *buf, size_t buf_len, int flags)
@ -568,19 +579,18 @@ rtp_error_t uvgrtp::socket::__recvfrom(uint8_t *buf, size_t buf_len, int flags,
}
set_bytes(bytes_read, ret);
return RTP_OK;
#else
int rc, err;
WSABUF DataBuf;
DataBuf.len = (u_long)buf_len;
DataBuf.buf = (char *)buf;
DWORD bytes_received, flags_ = 0;
rc = ::WSARecvFrom(socket_, &DataBuf, 1, &bytes_received, &flags_, (SOCKADDR *)sender, (int *)len_ptr, NULL, NULL);
int rc = ::WSARecvFrom(socket_, &DataBuf, 1, &bytes_received, &flags_, (SOCKADDR *)sender, (int *)len_ptr, NULL, NULL);
if (WSAGetLastError() == WSAEWOULDBLOCK)
return RTP_INTERRUPTED;
int err = 0;
if ((rc == SOCKET_ERROR) && (WSA_IO_PENDING != (err = WSAGetLastError()))) {
/* win_get_last_error(); */
set_bytes(bytes_read, -1);
@ -588,8 +598,13 @@ rtp_error_t uvgrtp::socket::__recvfrom(uint8_t *buf, size_t buf_len, int flags,
}
set_bytes(bytes_read, bytes_received);
return RTP_OK;
#endif
#ifndef NDEBUG
++received_packets_;
#endif // !NDEBUG
return RTP_OK;
}
rtp_error_t uvgrtp::socket::recvfrom(uint8_t *buf, size_t buf_len, int flags, sockaddr_in *sender, int *bytes_read)