RTP support: fixed RTPSink with a new version of the JRTPlib library

This commit is contained in:
f4exb 2018-02-21 00:28:14 +01:00
parent de2f47dd85
commit 9f220f182c
3 changed files with 58 additions and 20 deletions

View File

@ -426,6 +426,7 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force)
<< " m_ctcssOn: " << settings.m_ctcssOn << " m_ctcssOn: " << settings.m_ctcssOn
<< " m_audioMute: " << settings.m_audioMute << " m_audioMute: " << settings.m_audioMute
<< " m_copyAudioToUDP: " << settings.m_copyAudioToUDP << " m_copyAudioToUDP: " << settings.m_copyAudioToUDP
<< " m_copyAudioUseRTP: " << settings.m_copyAudioUseRTP
<< " m_udpAddress: " << settings.m_udpAddress << " m_udpAddress: " << settings.m_udpAddress
<< " m_udpPort: " << settings.m_udpPort << " m_udpPort: " << settings.m_udpPort
<< " force: " << force; << " force: " << force;

View File

@ -18,9 +18,9 @@
#include "rtpsink.h" #include "rtpsink.h"
#include "dsp/dsptypes.h" #include "dsp/dsptypes.h"
#include <algorithm> #include <algorithm>
#include <sys/socket.h>
RTPSink::RTPSink(const QString& address, uint16_t port, PayloadType payloadType) : RTPSink::RTPSink(const QString& address, uint16_t port, PayloadType payloadType) :
m_payloadType(payloadType),
m_sampleRate(48000), m_sampleRate(48000),
m_sampleBytes(0), m_sampleBytes(0),
m_packetSamples(0), m_packetSamples(0),
@ -28,6 +28,7 @@ RTPSink::RTPSink(const QString& address, uint16_t port, PayloadType payloadType)
m_sampleBufferIndex(0), m_sampleBufferIndex(0),
m_byteBuffer(0), m_byteBuffer(0),
m_destport(port), m_destport(port),
m_rtpTransmitter(&m_rtpMemoryManager),
m_mutex(QMutex::Recursive) m_mutex(QMutex::Recursive)
{ {
// Here we use JRTPLIB in a bit funny way since we do not want the socket to bind because we are only sending // Here we use JRTPLIB in a bit funny way since we do not want the socket to bind because we are only sending
@ -36,25 +37,21 @@ RTPSink::RTPSink(const QString& address, uint16_t port, PayloadType payloadType)
// By doing this the socket is left unbound but sending RTP packets with the library is still possible. Other functions may // By doing this the socket is left unbound but sending RTP packets with the library is still possible. Other functions may
// not work but we don't care // not work but we don't care
m_rtpsock = socket(PF_INET,SOCK_DGRAM,0); m_rtpSessionParams.SetOwnTimestampUnit(1.0 / (double) m_sampleRate);
m_rtpTransmissionParams.SetRTCPMultiplexing(true); // do not allocate another socket for RTCP
if (m_rtpsock < 0) { int status = m_rtpTransmitter.Init(false);
qCritical("RTPSink::RTPSink: cannot allocate socket"); if (status < 0) {
m_valid = false; qCritical("RTPSink::RTPSink: cannot initialize transmitter: %s", jrtplib::RTPGetErrorString(status).c_str());
} m_valid = false;
} else {
qDebug("RTPSink::RTPSink: initialized transmitter: %s", jrtplib::RTPGetErrorString(status).c_str());
}
uint32_t endianTest32 = 1; m_rtpTransmitter.Create(m_rtpSessionParams.GetMaximumPacketSize(), &m_rtpTransmissionParams);
uint8_t *ptr = (uint8_t*) &endianTest32; qDebug("RTPSink::RTPSink: created transmitter: %s", jrtplib::RTPGetErrorString(status).c_str());
m_endianReverse = (*ptr == 1);
m_destip = inet_addr(address.toStdString().c_str());
m_destip = ntohl(m_destip);
m_rtpSessionParams.SetOwnTimestampUnit(1.0 / (double) m_sampleRate);
m_rtpTransmissionParams.SetUseExistingSockets(m_rtpsock, m_rtpsock);
int status = m_rtpSession.Create(m_rtpSessionParams, &m_rtpTransmissionParams);
status = m_rtpSession.Create(m_rtpSessionParams, &m_rtpTransmitter);
if (status < 0) { if (status < 0) {
qCritical("RTPSink::RTPSink: cannot create session: %s", jrtplib::RTPGetErrorString(status).c_str()); qCritical("RTPSink::RTPSink: cannot create session: %s", jrtplib::RTPGetErrorString(status).c_str());
m_valid = false; m_valid = false;
@ -64,6 +61,14 @@ RTPSink::RTPSink(const QString& address, uint16_t port, PayloadType payloadType)
setPayloadType(payloadType); setPayloadType(payloadType);
m_valid = true; m_valid = true;
uint32_t endianTest32 = 1;
uint8_t *ptr = (uint8_t*) &endianTest32;
m_endianReverse = (*ptr == 1);
m_destip = inet_addr(address.toStdString().c_str());
m_destip = ntohl(m_destip);
} }
RTPSink::~RTPSink() RTPSink::~RTPSink()

View File

@ -20,16 +20,47 @@
#include <QString> #include <QString>
#include <QMutex> #include <QMutex>
#include <QDebug>
#include <stdint.h> #include <stdint.h>
// jrtplib includes // jrtplib includes
#include "rtpsession.h" #include "rtpsession.h"
#include "rtpudpv4transmitter.h" #include "rtpudpv4transmitternobind.h"
#include "rtpipv4address.h" #include "rtpipv4address.h"
#include "rtpsessionparams.h" #include "rtpsessionparams.h"
#include "rtperrors.h" #include "rtperrors.h"
#include "rtplibraryversion.h" #include "rtplibraryversion.h"
class RTPSinkMemoryManager : public jrtplib::RTPMemoryManager
{
public:
RTPSinkMemoryManager()
{
alloccount = 0;
freecount = 0;
}
~RTPSinkMemoryManager()
{
qDebug() << "RTPSinkMemoryManager::~RTPSinkMemoryManager: alloc: " << alloccount << " free: " << freecount;
}
void *AllocateBuffer(size_t numbytes, int memtype)
{
void *buf = malloc(numbytes);
qDebug() << "RTPSinkMemoryManager::AllocateBuffer: Allocated " << numbytes << " bytes at location " << buf << " (memtype = " << memtype << ")";
alloccount++;
return buf;
}
void FreeBuffer(void *p)
{
qDebug() << "RTPSinkMemoryManager::FreeBuffer: Freeing block " << p;
freecount++;
free(p);
}
private:
int alloccount,freecount;
};
class RTPSink class RTPSink
{ {
public: public:
@ -57,7 +88,6 @@ protected:
static void writeNetBuf(uint8_t *dest, const uint8_t *src, unsigned int elemLen, unsigned int bytesLen, bool endianReverse); static void writeNetBuf(uint8_t *dest, const uint8_t *src, unsigned int elemLen, unsigned int bytesLen, bool endianReverse);
static unsigned int elemLength(PayloadType payloadType); static unsigned int elemLength(PayloadType payloadType);
int m_rtpsock;
bool m_valid; bool m_valid;
PayloadType m_payloadType; PayloadType m_payloadType;
int m_sampleRate; int m_sampleRate;
@ -70,7 +100,9 @@ protected:
uint16_t m_destport; uint16_t m_destport;
jrtplib::RTPSession m_rtpSession; jrtplib::RTPSession m_rtpSession;
jrtplib::RTPSessionParams m_rtpSessionParams; jrtplib::RTPSessionParams m_rtpSessionParams;
jrtplib::RTPUDPv4TransmissionParams m_rtpTransmissionParams; jrtplib::RTPUDPv4TransmissionNoBindParams m_rtpTransmissionParams;
jrtplib::RTPUDPv4TransmitterNoBind m_rtpTransmitter;
RTPSinkMemoryManager m_rtpMemoryManager;
bool m_endianReverse; bool m_endianReverse;
QMutex m_mutex; QMutex m_mutex;
}; };