工程发生了内存泄漏,排查许久发现是jrtp传输的问题。 在此备份一下,以共勉。
接收端代码段:
int main(void)
{
#ifdef RTP_SOCKETTYPE_WINSOCK
WSADATA dat;
WSAStartup(MAKEWORD(2, 2), &dat);
#endif // RTP_SOCKETTYPE_WINSOCK
RTPSession sess;
uint16_t portbase;
int status, i, num;
cout << "Using version " << RTPLibraryVersion::GetVersion().GetVersionString() << endl;
cout << "Enter local portbase:" << endl;
cin >> portbase;
cout << endl;
// Now, we'll create a RTP session, set the destination, send some
// packets and poll for incoming data.
RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;
// IMPORTANT: The local timestamp unit MUST be set, otherwise
// RTCP Sender Report info will be calculated wrong
// In this case, we'll be sending 10 samples each second, so we'll
// put the timestamp unit to (1.0/10.0)
sessparams.SetOwnTimestampUnit(1.0 / 10.0);
sessparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(portbase);
status = sess.Create(sessparams, &transparams);
checkerror(status);
while (1)
{
sess.BeginDataAccess();
// check incoming packets
if (sess.GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
while ((pack = sess.GetNextPacket()) != NULL)
{
// You can examine the data here
cout << "Got packet !" << endl;
cout << pack->GetPayloadData() << endl;
// we don't longer need the packet, so
// we'll delete it
sess.DeletePacket(pack);
}
} while (sess.GotoNextSourceWithData());
}
sess.EndDataAccess();
#ifndef RTP_SUPPORT_THREAD
status = sess.Poll();
checkerror(status);
#endif // RTP_SUPPORT_THREAD
RTPTime::Wait(RTPTime(1, 0));
}
sess.BYEDestroy(RTPTime(10, 0), 0, 0);
#ifdef RTP_SOCKETTYPE_WINSOCK
WSACleanup();
#endif // RTP_SOCKETTYPE_WINSOCK
return 0;
}
问题一:
GetNextPacket()和DeletePacket()必须配对使用。
如果只GetNextPacket()而不DeletePacket(),发送端不断地发送数据,接收端就会不断地发生内存泄漏。
问题二:
while (1)
{
// sess.BeginDataAccess();
// // check incoming packets
// if (sess.GotoFirstSourceWithData())
// {
// do
// {
// RTPPacket *pack;
// while ((pack = sess.GetNextPacket()) != NULL)
// {
// // You can examine the data here
// cout << "Got packet !" << endl;
// cout << pack->GetPayloadData() << endl;
// // we don't longer need the packet, so
// // we'll delete it
// sess.DeletePacket(pack);
// }
// } while (sess.GotoNextSourceWithData());
// }
// sess.EndDataAccess();
//
//#ifndef RTP_SUPPORT_THREAD
// status = sess.Poll();
// checkerror(status);
//#endif // RTP_SUPPORT_THREAD
//
// RTPTime::Wait(RTPTime(1, 0));
}
如果将线程里的循环全都注释让线程空跑,当发送端发送数据时,接收端依然会不断地发生内存泄漏。深层原因需要钻研jrtp源码,懒得看了,如果有同胞发现原因。望告知
程序代码:
https://download.youkuaiyun.com/download/qq_25359343/11461800
参考:
https://blog.youkuaiyun.com/wastedsoul/article/details/80581864