mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-04 05:30:32 -05:00 
			
		
		
		
	qrtplib: file cleanup
This commit is contained in:
		
							parent
							
								
									914b8a4d97
								
							
						
					
					
						commit
						915b865e6a
					
				@ -19,12 +19,8 @@ set (qrtplib_HEADERS
 | 
			
		||||
    rtpdefines.h
 | 
			
		||||
    rtpendian.h
 | 
			
		||||
    rtperrors.h
 | 
			
		||||
    rtphashtable.h
 | 
			
		||||
    rtpinternalsourcedata.h
 | 
			
		||||
#   rtpipv4address.h
 | 
			
		||||
#   rtpipv4destination.h
 | 
			
		||||
    rtpkeyhashtable.h
 | 
			
		||||
    rtplibraryversion.h
 | 
			
		||||
    rtppacket.h
 | 
			
		||||
    rtppacketbuilder.h
 | 
			
		||||
    rtprandom.h
 | 
			
		||||
@ -43,14 +39,7 @@ set (qrtplib_HEADERS
 | 
			
		||||
    rtptypes_win.h
 | 
			
		||||
    rtptypes.h
 | 
			
		||||
    rtpudptransmitter.h
 | 
			
		||||
#   rtpudpv4transmitter.h
 | 
			
		||||
#   rtpudpv4transmitternobind.h
 | 
			
		||||
#   rtpexternaltransmitter.h
 | 
			
		||||
    rtpsocketutil.h
 | 
			
		||||
    rtpabortdescriptors.h
 | 
			
		||||
    rtpselect.h
 | 
			
		||||
#   rtptcpaddress.h
 | 
			
		||||
#   rtptcptransmitter.h
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
set(qrtplib_SOURCES
 | 
			
		||||
@ -68,9 +57,6 @@ set(qrtplib_SOURCES
 | 
			
		||||
    rtpcollisionlist.cpp
 | 
			
		||||
    rtperrors.cpp
 | 
			
		||||
    rtpinternalsourcedata.cpp
 | 
			
		||||
#   rtpipv4address.cpp
 | 
			
		||||
#   rtpipv4destination.cpp
 | 
			
		||||
    rtplibraryversion.cpp
 | 
			
		||||
    rtppacket.cpp
 | 
			
		||||
    rtppacketbuilder.cpp
 | 
			
		||||
    rtprandom.cpp
 | 
			
		||||
@ -84,12 +70,6 @@ set(qrtplib_SOURCES
 | 
			
		||||
    rtpsources.cpp
 | 
			
		||||
    rtptimeutilities.cpp
 | 
			
		||||
    rtpudptransmitter.cpp
 | 
			
		||||
#   rtpudpv4transmitter.cpp
 | 
			
		||||
#   rtpudpv4transmitternobind.cpp
 | 
			
		||||
#   rtpexternaltransmitter.cpp
 | 
			
		||||
    rtpabortdescriptors.cpp
 | 
			
		||||
#   rtptcpaddress.cpp
 | 
			
		||||
#   rtptcptransmitter.cpp
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
include_directories(
 | 
			
		||||
 | 
			
		||||
@ -40,10 +40,7 @@ HEADERS += $$PWD/rtcpapppacket.h \
 | 
			
		||||
    $$PWD/rtpdefines.h \
 | 
			
		||||
    $$PWD/rtpendian.h \
 | 
			
		||||
    $$PWD/rtperrors.h \
 | 
			
		||||
    $$PWD/rtphashtable.h \
 | 
			
		||||
    $$PWD/rtpinternalsourcedata.h \
 | 
			
		||||
    $$PWD/rtpkeyhashtable.h \
 | 
			
		||||
    $$PWD/rtplibraryversion.h \
 | 
			
		||||
    $$PWD/rtppacket.h \
 | 
			
		||||
    $$PWD/rtppacketbuilder.h \
 | 
			
		||||
    $$PWD/rtprandom.h \
 | 
			
		||||
@ -80,7 +77,6 @@ SOURCES += $$PWD/rtcpapppacket.cpp \
 | 
			
		||||
    $$PWD/rtpcollisionlist.cpp \
 | 
			
		||||
    $$PWD/rtperrors.cpp \
 | 
			
		||||
    $$PWD/rtpinternalsourcedata.cpp \
 | 
			
		||||
    $$PWD/rtplibraryversion.cpp \
 | 
			
		||||
    $$PWD/rtppacket.cpp \
 | 
			
		||||
    $$PWD/rtppacketbuilder.cpp \
 | 
			
		||||
    $$PWD/rtprandom.cpp \
 | 
			
		||||
 | 
			
		||||
@ -1,258 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "rtpabortdescriptors.h"
 | 
			
		||||
#include "rtpsocketutilinternal.h"
 | 
			
		||||
#include "rtperrors.h"
 | 
			
		||||
#include "rtpselect.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
RTPAbortDescriptors::RTPAbortDescriptors()
 | 
			
		||||
{
 | 
			
		||||
    m_descriptors[0] = RTPSOCKERR;
 | 
			
		||||
    m_descriptors[1] = RTPSOCKERR;
 | 
			
		||||
    m_init = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTPAbortDescriptors::~RTPAbortDescriptors()
 | 
			
		||||
{
 | 
			
		||||
    Destroy();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef RTP_SOCKETTYPE_WINSOCK
 | 
			
		||||
 | 
			
		||||
int RTPAbortDescriptors::Init()
 | 
			
		||||
{
 | 
			
		||||
    if (m_init)
 | 
			
		||||
    return ERR_RTP_ABORTDESC_ALREADYINIT;
 | 
			
		||||
 | 
			
		||||
    SOCKET listensock;
 | 
			
		||||
    int size;
 | 
			
		||||
    struct sockaddr_in addr;
 | 
			
		||||
 | 
			
		||||
    listensock = socket(PF_INET,SOCK_STREAM,0);
 | 
			
		||||
    if (listensock == RTPSOCKERR)
 | 
			
		||||
    return ERR_RTP_ABORTDESC_CANTCREATEABORTDESCRIPTORS;
 | 
			
		||||
 | 
			
		||||
    memset(&addr,0,sizeof(struct sockaddr_in));
 | 
			
		||||
    addr.sin_family = AF_INET;
 | 
			
		||||
    if (bind(listensock,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) != 0)
 | 
			
		||||
    {
 | 
			
		||||
        RTPCLOSE(listensock);
 | 
			
		||||
        return ERR_RTP_ABORTDESC_CANTCREATEABORTDESCRIPTORS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memset(&addr,0,sizeof(struct sockaddr_in));
 | 
			
		||||
    size = sizeof(struct sockaddr_in);
 | 
			
		||||
    if (getsockname(listensock,(struct sockaddr*)&addr,&size) != 0)
 | 
			
		||||
    {
 | 
			
		||||
        RTPCLOSE(listensock);
 | 
			
		||||
        return ERR_RTP_ABORTDESC_CANTCREATEABORTDESCRIPTORS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    unsigned short connectport = ntohs(addr.sin_port);
 | 
			
		||||
 | 
			
		||||
    m_descriptors[0] = socket(PF_INET,SOCK_STREAM,0);
 | 
			
		||||
    if (m_descriptors[0] == RTPSOCKERR)
 | 
			
		||||
    {
 | 
			
		||||
        RTPCLOSE(listensock);
 | 
			
		||||
        return ERR_RTP_ABORTDESC_CANTCREATEABORTDESCRIPTORS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memset(&addr,0,sizeof(struct sockaddr_in));
 | 
			
		||||
    addr.sin_family = AF_INET;
 | 
			
		||||
    if (bind(m_descriptors[0],(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) != 0)
 | 
			
		||||
    {
 | 
			
		||||
        RTPCLOSE(listensock);
 | 
			
		||||
        RTPCLOSE(m_descriptors[0]);
 | 
			
		||||
        return ERR_RTP_ABORTDESC_CANTCREATEABORTDESCRIPTORS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (listen(listensock,1) != 0)
 | 
			
		||||
    {
 | 
			
		||||
        RTPCLOSE(listensock);
 | 
			
		||||
        RTPCLOSE(m_descriptors[0]);
 | 
			
		||||
        return ERR_RTP_ABORTDESC_CANTCREATEABORTDESCRIPTORS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memset(&addr,0,sizeof(struct sockaddr_in));
 | 
			
		||||
    addr.sin_family = AF_INET;
 | 
			
		||||
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
 | 
			
		||||
    addr.sin_port = htons(connectport);
 | 
			
		||||
 | 
			
		||||
    if (connect(m_descriptors[0],(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) != 0)
 | 
			
		||||
    {
 | 
			
		||||
        RTPCLOSE(listensock);
 | 
			
		||||
        RTPCLOSE(m_descriptors[0]);
 | 
			
		||||
        return ERR_RTP_ABORTDESC_CANTCREATEABORTDESCRIPTORS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memset(&addr,0,sizeof(struct sockaddr_in));
 | 
			
		||||
    size = sizeof(struct sockaddr_in);
 | 
			
		||||
    m_descriptors[1] = accept(listensock,(struct sockaddr *)&addr,&size);
 | 
			
		||||
    if (m_descriptors[1] == RTPSOCKERR)
 | 
			
		||||
    {
 | 
			
		||||
        RTPCLOSE(listensock);
 | 
			
		||||
        RTPCLOSE(m_descriptors[0]);
 | 
			
		||||
        return ERR_RTP_ABORTDESC_CANTCREATEABORTDESCRIPTORS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // okay, got the connection, close the listening socket
 | 
			
		||||
 | 
			
		||||
    RTPCLOSE(listensock);
 | 
			
		||||
 | 
			
		||||
    m_init = true;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPAbortDescriptors::Destroy()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
    RTPCLOSE(m_descriptors[0]);
 | 
			
		||||
    RTPCLOSE(m_descriptors[1]);
 | 
			
		||||
    m_descriptors[0] = RTPSOCKERR;
 | 
			
		||||
    m_descriptors[1] = RTPSOCKERR;
 | 
			
		||||
 | 
			
		||||
    m_init = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPAbortDescriptors::SendAbortSignal()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
    return ERR_RTP_ABORTDESC_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    send(m_descriptors[1],"*",1,0);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPAbortDescriptors::ReadSignallingByte()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
    return ERR_RTP_ABORTDESC_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    char buf[1];
 | 
			
		||||
 | 
			
		||||
    recv(m_descriptors[0],buf,1,0);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else // unix-style
 | 
			
		||||
 | 
			
		||||
int RTPAbortDescriptors::Init()
 | 
			
		||||
{
 | 
			
		||||
    if (m_init)
 | 
			
		||||
        return ERR_RTP_ABORTDESC_ALREADYINIT;
 | 
			
		||||
 | 
			
		||||
    if (pipe(m_descriptors) < 0)
 | 
			
		||||
        return ERR_RTP_ABORTDESC_CANTCREATEPIPE;
 | 
			
		||||
 | 
			
		||||
    m_init = true;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPAbortDescriptors::Destroy()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    close(m_descriptors[0]);
 | 
			
		||||
    close(m_descriptors[1]);
 | 
			
		||||
    m_descriptors[0] = RTPSOCKERR;
 | 
			
		||||
    m_descriptors[1] = RTPSOCKERR;
 | 
			
		||||
 | 
			
		||||
    m_init = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPAbortDescriptors::SendAbortSignal()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_ABORTDESC_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (write(m_descriptors[1], "*", 1))
 | 
			
		||||
    {
 | 
			
		||||
        // To get rid of __wur related compiler warnings
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPAbortDescriptors::ReadSignallingByte()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_ABORTDESC_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    unsigned char buf[1];
 | 
			
		||||
 | 
			
		||||
    if (read(m_descriptors[0], buf, 1))
 | 
			
		||||
    {
 | 
			
		||||
        // To get rid of __wur related compiler warnings
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // RTP_SOCKETTYPE_WINSOCK
 | 
			
		||||
 | 
			
		||||
// Keep calling 'ReadSignallingByte' until there's no byte left
 | 
			
		||||
int RTPAbortDescriptors::ClearAbortSignal()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_ABORTDESC_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    bool done = false;
 | 
			
		||||
    while (!done)
 | 
			
		||||
    {
 | 
			
		||||
        int8_t isset = 0;
 | 
			
		||||
 | 
			
		||||
        // Not used: struct timeval tv = { 0, 0 };
 | 
			
		||||
 | 
			
		||||
        int status = RTPSelect(&m_descriptors[0], &isset, 1, RTPTime(0));
 | 
			
		||||
        if (status < 0)
 | 
			
		||||
            return status;
 | 
			
		||||
 | 
			
		||||
        if (!isset)
 | 
			
		||||
            done = true;
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            int status = ReadSignallingByte();
 | 
			
		||||
            if (status < 0)
 | 
			
		||||
                return status;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
@ -1,111 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file rtpabortdescriptors.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTPABORTDESCRIPTORS_H
 | 
			
		||||
 | 
			
		||||
#define RTPABORTDESCRIPTORS_H
 | 
			
		||||
 | 
			
		||||
#include "rtpconfig.h"
 | 
			
		||||
#include "rtpsocketutil.h"
 | 
			
		||||
 | 
			
		||||
#include "util/export.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper class for several RTPTransmitter instances, to be able to cancel a
 | 
			
		||||
 * call to 'select', 'poll' or 'WSAPoll'.
 | 
			
		||||
 *
 | 
			
		||||
 * This is a helper class for several RTPTransmitter instances. Typically a
 | 
			
		||||
 * call to 'select' (or 'poll' or 'WSAPoll', depending on the platform) is used
 | 
			
		||||
 * to wait for incoming data for a certain time. To be able to cancel this wait
 | 
			
		||||
 * from another thread, this class provides a socket descriptor that's compatible
 | 
			
		||||
 * with e.g. the 'select' call, and to which data can be sent using
 | 
			
		||||
 * RTPAbortDescriptors::SendAbortSignal. If the descriptor is included in the
 | 
			
		||||
 * 'select' call, the function will detect incoming data and the function stops
 | 
			
		||||
 * waiting for incoming data.
 | 
			
		||||
 *
 | 
			
		||||
 * The class can be useful in case you'd like to create an implementation which
 | 
			
		||||
 * uses a single poll thread for several RTPSession and RTPTransmitter instances.
 | 
			
		||||
 * This idea is further illustrated in `example8.cpp`.
 | 
			
		||||
 */
 | 
			
		||||
class QRTPLIB_API RTPAbortDescriptors
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPAbortDescriptors();
 | 
			
		||||
    ~RTPAbortDescriptors();
 | 
			
		||||
 | 
			
		||||
    /** Initializes this instance. */
 | 
			
		||||
    int Init();
 | 
			
		||||
 | 
			
		||||
    /** Returns the socket descriptor that can be included in a call to
 | 
			
		||||
     *  'select' (for example).*/
 | 
			
		||||
    SocketType GetAbortSocket() const
 | 
			
		||||
    {
 | 
			
		||||
        return m_descriptors[0];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns a flag indicating if this instance was initialized. */
 | 
			
		||||
    bool IsInitialized() const
 | 
			
		||||
    {
 | 
			
		||||
        return m_init;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** De-initializes this instance. */
 | 
			
		||||
    void Destroy();
 | 
			
		||||
 | 
			
		||||
    /** Send a signal to the socket that's returned by RTPAbortDescriptors::GetAbortSocket,
 | 
			
		||||
     *  causing the 'select' call to detect that data is available, making the call
 | 
			
		||||
     *  end. */
 | 
			
		||||
    int SendAbortSignal();
 | 
			
		||||
 | 
			
		||||
    /** For each RTPAbortDescriptors::SendAbortSignal function that's called, a call
 | 
			
		||||
     *  to this function can be made to clear the state again. */
 | 
			
		||||
    int ReadSignallingByte();
 | 
			
		||||
 | 
			
		||||
    /** Similar to ReadSignallingByte::ReadSignallingByte, this function clears the signalling
 | 
			
		||||
     *  state, but this also works independently from the amount of times that
 | 
			
		||||
     *  RTPAbortDescriptors::SendAbortSignal was called. */
 | 
			
		||||
    int ClearAbortSignal();
 | 
			
		||||
private:
 | 
			
		||||
    SocketType m_descriptors[2];
 | 
			
		||||
    bool m_init;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#endif // RTPABORTDESCRIPTORS_H
 | 
			
		||||
@ -1,634 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "rtpexternaltransmitter.h"
 | 
			
		||||
#include "rtprawpacket.h"
 | 
			
		||||
#include "rtptimeutilities.h"
 | 
			
		||||
#include "rtpdefines.h"
 | 
			
		||||
#include "rtperrors.h"
 | 
			
		||||
#include "rtpsocketutilinternal.h"
 | 
			
		||||
#include "rtpselect.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
RTPExternalTransmitter::RTPExternalTransmitter() :
 | 
			
		||||
        packetinjector((RTPExternalTransmitter *) this)
 | 
			
		||||
{
 | 
			
		||||
    created = false;
 | 
			
		||||
    init = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTPExternalTransmitter::~RTPExternalTransmitter()
 | 
			
		||||
{
 | 
			
		||||
    Destroy();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::Init(bool tsafe)
 | 
			
		||||
{
 | 
			
		||||
    if (init)
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_ALREADYINIT;
 | 
			
		||||
 | 
			
		||||
    if (tsafe)
 | 
			
		||||
        return ERR_RTP_NOTHREADSUPPORT;
 | 
			
		||||
 | 
			
		||||
    init = true;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::Create(std::size_t maximumpacketsize, const RTPTransmissionParams *transparams)
 | 
			
		||||
{
 | 
			
		||||
    const RTPExternalTransmissionParams *params;
 | 
			
		||||
    int status;
 | 
			
		||||
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_ALREADYCREATED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Obtain transmission parameters
 | 
			
		||||
 | 
			
		||||
    if (transparams == 0)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_ILLEGALPARAMETERS;
 | 
			
		||||
    }
 | 
			
		||||
    if (transparams->GetTransmissionProtocol() != RTPTransmitter::ExternalProto)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_ILLEGALPARAMETERS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    params = (const RTPExternalTransmissionParams *) transparams;
 | 
			
		||||
 | 
			
		||||
    if ((status = m_abortDesc.Init()) < 0)
 | 
			
		||||
    {
 | 
			
		||||
        return status;
 | 
			
		||||
    }
 | 
			
		||||
    m_abortCount = 0;
 | 
			
		||||
 | 
			
		||||
    maxpacksize = maximumpacketsize;
 | 
			
		||||
    sender = params->GetSender();
 | 
			
		||||
    headersize = params->GetAdditionalHeaderSize();
 | 
			
		||||
 | 
			
		||||
    localhostname = 0;
 | 
			
		||||
    localhostnamelength = 0;
 | 
			
		||||
 | 
			
		||||
    waitingfordata = false;
 | 
			
		||||
    created = true;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPExternalTransmitter::Destroy()
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (localhostname)
 | 
			
		||||
    {
 | 
			
		||||
        delete[] localhostname;
 | 
			
		||||
        localhostname = 0;
 | 
			
		||||
        localhostnamelength = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    FlushPackets();
 | 
			
		||||
    created = false;
 | 
			
		||||
 | 
			
		||||
    if (waitingfordata)
 | 
			
		||||
    {
 | 
			
		||||
        m_abortDesc.SendAbortSignal();
 | 
			
		||||
        m_abortCount++;
 | 
			
		||||
        m_abortDesc.Destroy();
 | 
			
		||||
        // to make sure that the WaitForIncomingData function ended
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
        m_abortDesc.Destroy();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTPTransmissionInfo *RTPExternalTransmitter::GetTransmissionInfo()
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    RTPTransmissionInfo *tinf = new RTPExternalTransmissionInfo(&packetinjector);
 | 
			
		||||
    return tinf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPExternalTransmitter::DeleteTransmissionInfo(RTPTransmissionInfo *i)
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    delete i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::GetLocalHostName(uint8_t *buffer, std::size_t *bufferlength)
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (localhostname == 0)
 | 
			
		||||
    {
 | 
			
		||||
// We'll just use 'gethostname' for simplicity
 | 
			
		||||
 | 
			
		||||
        char name[1024];
 | 
			
		||||
 | 
			
		||||
        if (gethostname(name, 1023) != 0)
 | 
			
		||||
            strcpy(name, "localhost"); // failsafe
 | 
			
		||||
        else
 | 
			
		||||
            name[1023] = 0; // ensure null-termination
 | 
			
		||||
 | 
			
		||||
        localhostnamelength = strlen(name);
 | 
			
		||||
        localhostname = new uint8_t[localhostnamelength + 1];
 | 
			
		||||
 | 
			
		||||
        memcpy(localhostname, name, localhostnamelength);
 | 
			
		||||
        localhostname[localhostnamelength] = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((*bufferlength) < localhostnamelength)
 | 
			
		||||
    {
 | 
			
		||||
        *bufferlength = localhostnamelength; // tell the application the required size of the buffer
 | 
			
		||||
        return ERR_RTP_TRANS_BUFFERLENGTHTOOSMALL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memcpy(buffer, localhostname, localhostnamelength);
 | 
			
		||||
    *bufferlength = localhostnamelength;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RTPExternalTransmitter::ComesFromThisTransmitter(const RTPAddress *addr)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    bool value = false;
 | 
			
		||||
    if (sender)
 | 
			
		||||
        value = sender->ComesFromThisSender(addr);
 | 
			
		||||
    return value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::Poll()
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::WaitForIncomingData(const RTPTime &delay, bool *dataavailable)
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
    if (waitingfordata)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_ALREADYWAITING;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    waitingfordata = true;
 | 
			
		||||
 | 
			
		||||
    if (!rawpacketlist.empty())
 | 
			
		||||
    {
 | 
			
		||||
        if (dataavailable != 0)
 | 
			
		||||
            *dataavailable = true;
 | 
			
		||||
        waitingfordata = false;
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int8_t isset = 0;
 | 
			
		||||
    SocketType abortSock = m_abortDesc.GetAbortSocket();
 | 
			
		||||
    int status = RTPSelect(&abortSock, &isset, 1, delay);
 | 
			
		||||
    if (status < 0)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        waitingfordata = false;
 | 
			
		||||
 | 
			
		||||
        return status;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    waitingfordata = false;
 | 
			
		||||
    if (!created) // destroy called
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // if aborted, read from abort buffer
 | 
			
		||||
    if (isset)
 | 
			
		||||
    {
 | 
			
		||||
        m_abortDesc.ClearAbortSignal();
 | 
			
		||||
        m_abortCount = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (dataavailable != 0)
 | 
			
		||||
    {
 | 
			
		||||
        if (rawpacketlist.empty())
 | 
			
		||||
            *dataavailable = false;
 | 
			
		||||
        else
 | 
			
		||||
            *dataavailable = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::AbortWait()
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
    if (!waitingfordata)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTWAITING;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m_abortDesc.SendAbortSignal();
 | 
			
		||||
    m_abortCount++;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::SendRTPData(const void *data, std::size_t len)
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
    if (len > maxpacksize)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_SPECIFIEDSIZETOOBIG;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!sender)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOSENDER;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!sender->SendRTP(data, len))
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_SENDERROR;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::SendRTCPData(const void *data, std::size_t len)
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
    if (len > maxpacksize)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_SPECIFIEDSIZETOOBIG;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!sender)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOSENDER;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!sender->SendRTCP(data, len))
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_SENDERROR;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::AddDestination(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_EXTERNALTRANS_NODESTINATIONSSUPPORTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::DeleteDestination(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_EXTERNALTRANS_NODESTINATIONSSUPPORTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPExternalTransmitter::ClearDestinations()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RTPExternalTransmitter::SupportsMulticasting()
 | 
			
		||||
{
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::JoinMulticastGroup(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_EXTERNALTRANS_NOMULTICASTSUPPORT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::LeaveMulticastGroup(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_EXTERNALTRANS_NOMULTICASTSUPPORT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPExternalTransmitter::LeaveAllMulticastGroups()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::SetReceiveMode(RTPTransmitter::ReceiveMode m)
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
    if (m != RTPTransmitter::AcceptAll)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_BADRECEIVEMODE;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::AddToIgnoreList(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_EXTERNALTRANS_NOIGNORELIST;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::DeleteFromIgnoreList(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_EXTERNALTRANS_NOIGNORELIST;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPExternalTransmitter::ClearIgnoreList()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::AddToAcceptList(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_EXTERNALTRANS_NOACCEPTLIST;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::DeleteFromAcceptList(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_EXTERNALTRANS_NOACCEPTLIST;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPExternalTransmitter::ClearAcceptList()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPExternalTransmitter::SetMaximumPacketSize(std::size_t s)
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_EXTERNALTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
    maxpacksize = s;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RTPExternalTransmitter::NewDataAvailable()
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    bool v;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
        v = false;
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        if (rawpacketlist.empty())
 | 
			
		||||
            v = false;
 | 
			
		||||
        else
 | 
			
		||||
            v = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTPRawPacket *RTPExternalTransmitter::GetNextPacket()
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    RTPRawPacket *p;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    if (rawpacketlist.empty())
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    p = *(rawpacketlist.begin());
 | 
			
		||||
    rawpacketlist.pop_front();
 | 
			
		||||
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Here the private functions start...
 | 
			
		||||
 | 
			
		||||
void RTPExternalTransmitter::FlushPackets()
 | 
			
		||||
{
 | 
			
		||||
    std::list<RTPRawPacket*>::const_iterator it;
 | 
			
		||||
 | 
			
		||||
    for (it = rawpacketlist.begin(); it != rawpacketlist.end(); ++it)
 | 
			
		||||
        delete *it;
 | 
			
		||||
    rawpacketlist.clear();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPExternalTransmitter::InjectRTP(const void *data, std::size_t len, const RTPAddress &a)
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RTPAddress *addr = a.CreateCopy();
 | 
			
		||||
    if (addr == 0)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    uint8_t *datacopy;
 | 
			
		||||
 | 
			
		||||
    datacopy = new uint8_t[len];
 | 
			
		||||
    if (datacopy == 0)
 | 
			
		||||
    {
 | 
			
		||||
        delete addr;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    memcpy(datacopy, data, len);
 | 
			
		||||
 | 
			
		||||
    RTPTime curtime = RTPTime::CurrentTime();
 | 
			
		||||
    RTPRawPacket *pack;
 | 
			
		||||
 | 
			
		||||
    pack = new RTPRawPacket(datacopy, len, addr, curtime, true);
 | 
			
		||||
    if (pack == 0)
 | 
			
		||||
    {
 | 
			
		||||
        delete addr;
 | 
			
		||||
        delete[] localhostname;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    rawpacketlist.push_back(pack);
 | 
			
		||||
 | 
			
		||||
    if (m_abortCount == 0)
 | 
			
		||||
    {
 | 
			
		||||
        m_abortDesc.SendAbortSignal();
 | 
			
		||||
        m_abortCount++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPExternalTransmitter::InjectRTCP(const void *data, std::size_t len, const RTPAddress &a)
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RTPAddress *addr = a.CreateCopy();
 | 
			
		||||
    if (addr == 0)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    uint8_t *datacopy;
 | 
			
		||||
 | 
			
		||||
    datacopy = new uint8_t[len];
 | 
			
		||||
    if (datacopy == 0)
 | 
			
		||||
    {
 | 
			
		||||
        delete addr;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    memcpy(datacopy, data, len);
 | 
			
		||||
 | 
			
		||||
    RTPTime curtime = RTPTime::CurrentTime();
 | 
			
		||||
    RTPRawPacket *pack;
 | 
			
		||||
 | 
			
		||||
    pack = new RTPRawPacket(datacopy, len, addr, curtime, false);
 | 
			
		||||
    if (pack == 0)
 | 
			
		||||
    {
 | 
			
		||||
        delete addr;
 | 
			
		||||
        delete[] localhostname;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    rawpacketlist.push_back(pack);
 | 
			
		||||
 | 
			
		||||
    if (m_abortCount == 0)
 | 
			
		||||
    {
 | 
			
		||||
        m_abortDesc.SendAbortSignal();
 | 
			
		||||
        m_abortCount++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPExternalTransmitter::InjectRTPorRTCP(const void *data, std::size_t len, const RTPAddress &a)
 | 
			
		||||
{
 | 
			
		||||
    if (!init)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (!created)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RTPAddress *addr = a.CreateCopy();
 | 
			
		||||
    if (addr == 0)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    uint8_t *datacopy;
 | 
			
		||||
    bool rtp = true;
 | 
			
		||||
 | 
			
		||||
    if (len >= 2)
 | 
			
		||||
    {
 | 
			
		||||
        const uint8_t *pData = (const uint8_t *) data;
 | 
			
		||||
        if (pData[1] >= 200 && pData[1] <= 204)
 | 
			
		||||
            rtp = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    datacopy = new uint8_t[len];
 | 
			
		||||
    if (datacopy == 0)
 | 
			
		||||
    {
 | 
			
		||||
        delete addr;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    memcpy(datacopy, data, len);
 | 
			
		||||
 | 
			
		||||
    RTPTime curtime = RTPTime::CurrentTime();
 | 
			
		||||
    RTPRawPacket *pack;
 | 
			
		||||
 | 
			
		||||
    pack = new RTPRawPacket(datacopy, len, addr, curtime, rtp);
 | 
			
		||||
    if (pack == 0)
 | 
			
		||||
    {
 | 
			
		||||
        delete addr;
 | 
			
		||||
        delete[] localhostname;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    rawpacketlist.push_back(pack);
 | 
			
		||||
 | 
			
		||||
    if (m_abortCount == 0)
 | 
			
		||||
    {
 | 
			
		||||
        m_abortDesc.SendAbortSignal();
 | 
			
		||||
        m_abortCount++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
@ -1,254 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file rtpexternaltransmitter.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTPEXTERNALTRANSMITTER_H
 | 
			
		||||
 | 
			
		||||
#define RTPEXTERNALTRANSMITTER_H
 | 
			
		||||
 | 
			
		||||
#include "rtpconfig.h"
 | 
			
		||||
#include "rtptransmitter.h"
 | 
			
		||||
#include "rtpabortdescriptors.h"
 | 
			
		||||
#include <list>
 | 
			
		||||
 | 
			
		||||
#include "util/export.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class RTPExternalTransmitter;
 | 
			
		||||
 | 
			
		||||
/** Base class to specify a mechanism to transmit RTP packets outside of this library.
 | 
			
		||||
 *  Base class to specify a mechanism to transmit RTP packets outside of this library. When
 | 
			
		||||
 *  you want to use your own mechanism to transmit RTP packets, you need to specify that
 | 
			
		||||
 *  you'll be using the external transmission component, and derive a class from this base
 | 
			
		||||
 *  class. An instance should then be specified in the RTPExternalTransmissionParams object,
 | 
			
		||||
 *  so that the transmitter will call the \c SendRTP, \c SendRTCP and \c ComesFromThisSender
 | 
			
		||||
 *  methods of this instance when needed.
 | 
			
		||||
 */
 | 
			
		||||
class QRTPLIB_API RTPExternalSender
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPExternalSender()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
    virtual ~RTPExternalSender()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** This member function will be called when RTP data needs to be transmitted. */
 | 
			
		||||
    virtual bool SendRTP(const void *data, std::size_t len) = 0;
 | 
			
		||||
 | 
			
		||||
    /** This member function will be called when an RTCP packet needs to be transmitted. */
 | 
			
		||||
    virtual bool SendRTCP(const void *data, std::size_t len) = 0;
 | 
			
		||||
 | 
			
		||||
    /** Used to identify if an RTPAddress instance originated from this sender (to be able to detect own packets). */
 | 
			
		||||
    virtual bool ComesFromThisSender(const RTPAddress *a) = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Interface to inject incoming RTP and RTCP packets into the library.
 | 
			
		||||
 *  Interface to inject incoming RTP and RTCP packets into the library. When you have your own
 | 
			
		||||
 *  mechanism to receive incoming RTP/RTCP data, you'll need to pass these packets to the library.
 | 
			
		||||
 *  By first retrieving the RTPExternalTransmissionInfo instance for the external transmitter you'll
 | 
			
		||||
 *  be using, you can obtain the associated RTPExternalPacketInjecter instance. By calling it's
 | 
			
		||||
 *  member functions, you can then inject RTP or RTCP data into the library for further processing.
 | 
			
		||||
 */
 | 
			
		||||
class RTPExternalPacketInjecter
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPExternalPacketInjecter(RTPExternalTransmitter *trans)
 | 
			
		||||
    {
 | 
			
		||||
        transmitter = trans;
 | 
			
		||||
    }
 | 
			
		||||
    ~RTPExternalPacketInjecter()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** This function can be called to insert an RTP packet into the transmission component. */
 | 
			
		||||
    void InjectRTP(const void *data, std::size_t len, const RTPAddress &a);
 | 
			
		||||
 | 
			
		||||
    /** This function can be called to insert an RTCP packet into the transmission component. */
 | 
			
		||||
    void InjectRTCP(const void *data, std::size_t len, const RTPAddress &a);
 | 
			
		||||
 | 
			
		||||
    /** Use this function to inject an RTP or RTCP packet and the transmitter will try to figure out which type of packet it is. */
 | 
			
		||||
    void InjectRTPorRTCP(const void *data, std::size_t len, const RTPAddress &a);
 | 
			
		||||
private:
 | 
			
		||||
    RTPExternalTransmitter *transmitter;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Parameters to initialize a transmitter of type RTPExternalTransmitter. */
 | 
			
		||||
class RTPExternalTransmissionParams: public RTPTransmissionParams
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    /** Using this constructor you can specify which RTPExternalSender object you'll be using
 | 
			
		||||
     *  and how much the additional header overhead for each packet will be. */
 | 
			
		||||
    RTPExternalTransmissionParams(RTPExternalSender *s, int headeroverhead) :
 | 
			
		||||
            RTPTransmissionParams(RTPTransmitter::ExternalProto)
 | 
			
		||||
    {
 | 
			
		||||
        sender = s;
 | 
			
		||||
        headersize = headeroverhead;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RTPExternalSender *GetSender() const
 | 
			
		||||
    {
 | 
			
		||||
        return sender;
 | 
			
		||||
    }
 | 
			
		||||
    int GetAdditionalHeaderSize() const
 | 
			
		||||
    {
 | 
			
		||||
        return headersize;
 | 
			
		||||
    }
 | 
			
		||||
private:
 | 
			
		||||
    RTPExternalSender *sender;
 | 
			
		||||
    int headersize;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Additional information about the external transmission component. */
 | 
			
		||||
class RTPExternalTransmissionInfo: public RTPTransmissionInfo
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPExternalTransmissionInfo(RTPExternalPacketInjecter *p) :
 | 
			
		||||
            RTPTransmissionInfo(RTPTransmitter::ExternalProto)
 | 
			
		||||
    {
 | 
			
		||||
        packetinjector = p;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Tells you which RTPExternalPacketInjecter you need to use to pass RTP or RTCP
 | 
			
		||||
     *  data on to the transmission component. */
 | 
			
		||||
    RTPExternalPacketInjecter *GetPacketInjector() const
 | 
			
		||||
    {
 | 
			
		||||
        return packetinjector;
 | 
			
		||||
    }
 | 
			
		||||
private:
 | 
			
		||||
    RTPExternalPacketInjecter *packetinjector;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** A transmission component which will use user specified functions to transmit the data and
 | 
			
		||||
 *  which will expose functions to inject received RTP or RTCP data into this component.
 | 
			
		||||
 *  A transmission component which will use user specified functions to transmit the data and
 | 
			
		||||
 *  which will expose functions to inject received RTP or RTCP data into this component. Use
 | 
			
		||||
 *  a class derived from RTPExternalSender to specify the functions which need to be used for
 | 
			
		||||
 *  sending the data. Obtain the RTPExternalTransmissionInfo object associated with this
 | 
			
		||||
 *  transmitter to obtain the functions needed to pass RTP/RTCP packets on to the transmitter.
 | 
			
		||||
 */
 | 
			
		||||
class RTPExternalTransmitter: public RTPTransmitter
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPExternalTransmitter();
 | 
			
		||||
    ~RTPExternalTransmitter();
 | 
			
		||||
 | 
			
		||||
    int Init(bool treadsafe);
 | 
			
		||||
    int Create(std::size_t maxpacksize, const RTPTransmissionParams *transparams);
 | 
			
		||||
    void Destroy();
 | 
			
		||||
    RTPTransmissionInfo *GetTransmissionInfo();
 | 
			
		||||
    void DeleteTransmissionInfo(RTPTransmissionInfo *inf);
 | 
			
		||||
 | 
			
		||||
    int GetLocalHostName(uint8_t *buffer, std::size_t *bufferlength);
 | 
			
		||||
    bool ComesFromThisTransmitter(const RTPAddress *addr);
 | 
			
		||||
    std::size_t GetHeaderOverhead()
 | 
			
		||||
    {
 | 
			
		||||
        return headersize;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int Poll();
 | 
			
		||||
    int WaitForIncomingData(const RTPTime &delay, bool *dataavailable = 0);
 | 
			
		||||
    int AbortWait();
 | 
			
		||||
 | 
			
		||||
    int SendRTPData(const void *data, std::size_t len);
 | 
			
		||||
    int SendRTCPData(const void *data, std::size_t len);
 | 
			
		||||
 | 
			
		||||
    int AddDestination(const RTPAddress &addr);
 | 
			
		||||
    int DeleteDestination(const RTPAddress &addr);
 | 
			
		||||
    void ClearDestinations();
 | 
			
		||||
 | 
			
		||||
    bool SupportsMulticasting();
 | 
			
		||||
    int JoinMulticastGroup(const RTPAddress &addr);
 | 
			
		||||
    int LeaveMulticastGroup(const RTPAddress &addr);
 | 
			
		||||
    void LeaveAllMulticastGroups();
 | 
			
		||||
 | 
			
		||||
    int SetReceiveMode(RTPTransmitter::ReceiveMode m);
 | 
			
		||||
    int AddToIgnoreList(const RTPAddress &addr);
 | 
			
		||||
    int DeleteFromIgnoreList(const RTPAddress &addr);
 | 
			
		||||
    void ClearIgnoreList();
 | 
			
		||||
    int AddToAcceptList(const RTPAddress &addr);
 | 
			
		||||
    int DeleteFromAcceptList(const RTPAddress &addr);
 | 
			
		||||
    void ClearAcceptList();
 | 
			
		||||
    int SetMaximumPacketSize(std::size_t s);
 | 
			
		||||
 | 
			
		||||
    bool NewDataAvailable();
 | 
			
		||||
    RTPRawPacket *GetNextPacket();
 | 
			
		||||
 | 
			
		||||
    void InjectRTP(const void *data, std::size_t len, const RTPAddress &a);
 | 
			
		||||
    void InjectRTCP(const void *data, std::size_t len, const RTPAddress &a);
 | 
			
		||||
    void InjectRTPorRTCP(const void *data, std::size_t len, const RTPAddress &a);
 | 
			
		||||
private:
 | 
			
		||||
    void FlushPackets();
 | 
			
		||||
 | 
			
		||||
    bool init;
 | 
			
		||||
    bool created;
 | 
			
		||||
    bool waitingfordata;
 | 
			
		||||
    RTPExternalSender *sender;
 | 
			
		||||
    RTPExternalPacketInjecter packetinjector;
 | 
			
		||||
 | 
			
		||||
    std::list<RTPRawPacket*> rawpacketlist;
 | 
			
		||||
 | 
			
		||||
    uint8_t *localhostname;
 | 
			
		||||
    std::size_t localhostnamelength;
 | 
			
		||||
 | 
			
		||||
    std::size_t maxpacksize;
 | 
			
		||||
    int headersize;
 | 
			
		||||
 | 
			
		||||
    RTPAbortDescriptors m_abortDesc;
 | 
			
		||||
    int m_abortCount;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline void RTPExternalPacketInjecter::InjectRTP(const void *data, std::size_t len, const RTPAddress &a)
 | 
			
		||||
{
 | 
			
		||||
    transmitter->InjectRTP(data, len, a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void RTPExternalPacketInjecter::InjectRTCP(const void *data, std::size_t len, const RTPAddress &a)
 | 
			
		||||
{
 | 
			
		||||
    transmitter->InjectRTCP(data, len, a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void RTPExternalPacketInjecter::InjectRTPorRTCP(const void *data, std::size_t len, const RTPAddress &a)
 | 
			
		||||
{
 | 
			
		||||
    transmitter->InjectRTPorRTCP(data, len, a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#endif // RTPTCPSOCKETTRANSMITTER_H
 | 
			
		||||
 | 
			
		||||
@ -1,333 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTPHASHTABLE_H
 | 
			
		||||
 | 
			
		||||
#define RTPHASHTABLE_H
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file rtphashtable.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "rtperrors.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
//template<class Element,int GetIndex(const Element &k),int hashsize>
 | 
			
		||||
template<class Element, class GetIndex, int hashsize>
 | 
			
		||||
class RTPHashTable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPHashTable();
 | 
			
		||||
    ~RTPHashTable()
 | 
			
		||||
    {
 | 
			
		||||
        Clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void GotoFirstElement()
 | 
			
		||||
    {
 | 
			
		||||
        curhashelem = firsthashelem;
 | 
			
		||||
    }
 | 
			
		||||
    void GotoLastElement()
 | 
			
		||||
    {
 | 
			
		||||
        curhashelem = lasthashelem;
 | 
			
		||||
    }
 | 
			
		||||
    bool HasCurrentElement()
 | 
			
		||||
    {
 | 
			
		||||
        return (curhashelem == 0) ? false : true;
 | 
			
		||||
    }
 | 
			
		||||
    int DeleteCurrentElement();
 | 
			
		||||
    Element &GetCurrentElement()
 | 
			
		||||
    {
 | 
			
		||||
        return curhashelem->GetElement();
 | 
			
		||||
    }
 | 
			
		||||
    int GotoElement(const Element &e);
 | 
			
		||||
    bool HasElement(const Element &e);
 | 
			
		||||
    void GotoNextElement();
 | 
			
		||||
    void GotoPreviousElement();
 | 
			
		||||
    void Clear();
 | 
			
		||||
 | 
			
		||||
    int AddElement(const Element &elem);
 | 
			
		||||
    int DeleteElement(const Element &elem);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    class HashElement
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        HashElement(const Element &e, int index) :
 | 
			
		||||
                element(e)
 | 
			
		||||
        {
 | 
			
		||||
            hashprev = 0;
 | 
			
		||||
            hashnext = 0;
 | 
			
		||||
            listnext = 0;
 | 
			
		||||
            listprev = 0;
 | 
			
		||||
            hashindex = index;
 | 
			
		||||
        }
 | 
			
		||||
        int GetHashIndex()
 | 
			
		||||
        {
 | 
			
		||||
            return hashindex;
 | 
			
		||||
        }
 | 
			
		||||
        Element &GetElement()
 | 
			
		||||
        {
 | 
			
		||||
            return element;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
        int hashindex;
 | 
			
		||||
        Element element;
 | 
			
		||||
    public:
 | 
			
		||||
        HashElement *hashprev, *hashnext;
 | 
			
		||||
        HashElement *listprev, *listnext;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    HashElement *table[hashsize];
 | 
			
		||||
    HashElement *firsthashelem, *lasthashelem;
 | 
			
		||||
    HashElement *curhashelem;
 | 
			
		||||
#ifdef RTP_SUPPORT_MEMORYMANAGEMENT
 | 
			
		||||
    int memorytype;
 | 
			
		||||
#endif // RTP_SUPPORT_MEMORYMANAGEMENT
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class Element, class GetIndex, int hashsize>
 | 
			
		||||
inline RTPHashTable<Element, GetIndex, hashsize>::RTPHashTable()
 | 
			
		||||
{
 | 
			
		||||
    for (int i = 0; i < hashsize; i++)
 | 
			
		||||
        table[i] = 0;
 | 
			
		||||
    firsthashelem = 0;
 | 
			
		||||
    lasthashelem = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Element, class GetIndex, int hashsize>
 | 
			
		||||
inline int RTPHashTable<Element, GetIndex, hashsize>::DeleteCurrentElement()
 | 
			
		||||
{
 | 
			
		||||
    if (curhashelem)
 | 
			
		||||
    {
 | 
			
		||||
        HashElement *tmp1, *tmp2;
 | 
			
		||||
        int index;
 | 
			
		||||
 | 
			
		||||
        // First, relink elements in current hash bucket
 | 
			
		||||
 | 
			
		||||
        index = curhashelem->GetHashIndex();
 | 
			
		||||
        tmp1 = curhashelem->hashprev;
 | 
			
		||||
        tmp2 = curhashelem->hashnext;
 | 
			
		||||
        if (tmp1 == 0) // no previous element in hash bucket
 | 
			
		||||
        {
 | 
			
		||||
            table[index] = tmp2;
 | 
			
		||||
            if (tmp2 != 0)
 | 
			
		||||
                tmp2->hashprev = 0;
 | 
			
		||||
        }
 | 
			
		||||
        else // there is a previous element in the hash bucket
 | 
			
		||||
        {
 | 
			
		||||
            tmp1->hashnext = tmp2;
 | 
			
		||||
            if (tmp2 != 0)
 | 
			
		||||
                tmp2->hashprev = tmp1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Relink elements in list
 | 
			
		||||
 | 
			
		||||
        tmp1 = curhashelem->listprev;
 | 
			
		||||
        tmp2 = curhashelem->listnext;
 | 
			
		||||
        if (tmp1 == 0) // curhashelem is first in list
 | 
			
		||||
        {
 | 
			
		||||
            firsthashelem = tmp2;
 | 
			
		||||
            if (tmp2 != 0)
 | 
			
		||||
                tmp2->listprev = 0;
 | 
			
		||||
            else
 | 
			
		||||
                // curhashelem is also last in list
 | 
			
		||||
                lasthashelem = 0;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            tmp1->listnext = tmp2;
 | 
			
		||||
            if (tmp2 != 0)
 | 
			
		||||
                tmp2->listprev = tmp1;
 | 
			
		||||
            else
 | 
			
		||||
                // curhashelem is last in list
 | 
			
		||||
                lasthashelem = tmp1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // finally, with everything being relinked, we can delete curhashelem
 | 
			
		||||
        delete curhashelem;
 | 
			
		||||
        curhashelem = tmp2; // Set to next element in the list
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
        return ERR_RTP_HASHTABLE_NOCURRENTELEMENT;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Element, class GetIndex, int hashsize>
 | 
			
		||||
inline int RTPHashTable<Element, GetIndex, hashsize>::GotoElement(const Element &e)
 | 
			
		||||
{
 | 
			
		||||
    int index;
 | 
			
		||||
    bool found;
 | 
			
		||||
 | 
			
		||||
    index = GetIndex::GetIndex(e);
 | 
			
		||||
    if (index >= hashsize)
 | 
			
		||||
        return ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
 | 
			
		||||
 | 
			
		||||
    curhashelem = table[index];
 | 
			
		||||
    found = false;
 | 
			
		||||
    while (!found && curhashelem != 0)
 | 
			
		||||
    {
 | 
			
		||||
        if (curhashelem->GetElement() == e)
 | 
			
		||||
            found = true;
 | 
			
		||||
        else
 | 
			
		||||
            curhashelem = curhashelem->hashnext;
 | 
			
		||||
    }
 | 
			
		||||
    if (!found)
 | 
			
		||||
        return ERR_RTP_HASHTABLE_ELEMENTNOTFOUND;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Element, class GetIndex, int hashsize>
 | 
			
		||||
inline bool RTPHashTable<Element, GetIndex, hashsize>::HasElement(const Element &e)
 | 
			
		||||
{
 | 
			
		||||
    int index;
 | 
			
		||||
    bool found;
 | 
			
		||||
    HashElement *tmp;
 | 
			
		||||
 | 
			
		||||
    index = GetIndex::GetIndex(e);
 | 
			
		||||
    if (index >= hashsize)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    tmp = table[index];
 | 
			
		||||
    found = false;
 | 
			
		||||
    while (!found && tmp != 0)
 | 
			
		||||
    {
 | 
			
		||||
        if (tmp->GetElement() == e)
 | 
			
		||||
            found = true;
 | 
			
		||||
        else
 | 
			
		||||
            tmp = tmp->hashnext;
 | 
			
		||||
    }
 | 
			
		||||
    return found;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Element, class GetIndex, int hashsize>
 | 
			
		||||
inline void RTPHashTable<Element, GetIndex, hashsize>::GotoNextElement()
 | 
			
		||||
{
 | 
			
		||||
    if (curhashelem)
 | 
			
		||||
        curhashelem = curhashelem->listnext;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Element, class GetIndex, int hashsize>
 | 
			
		||||
inline void RTPHashTable<Element, GetIndex, hashsize>::GotoPreviousElement()
 | 
			
		||||
{
 | 
			
		||||
    if (curhashelem)
 | 
			
		||||
        curhashelem = curhashelem->listprev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Element, class GetIndex, int hashsize>
 | 
			
		||||
inline void RTPHashTable<Element, GetIndex, hashsize>::Clear()
 | 
			
		||||
{
 | 
			
		||||
    HashElement *tmp1, *tmp2;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < hashsize; i++)
 | 
			
		||||
        table[i] = 0;
 | 
			
		||||
 | 
			
		||||
    tmp1 = firsthashelem;
 | 
			
		||||
    while (tmp1 != 0)
 | 
			
		||||
    {
 | 
			
		||||
        tmp2 = tmp1->listnext;
 | 
			
		||||
        delete tmp1;
 | 
			
		||||
        tmp1 = tmp2;
 | 
			
		||||
    }
 | 
			
		||||
    firsthashelem = 0;
 | 
			
		||||
    lasthashelem = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Element, class GetIndex, int hashsize>
 | 
			
		||||
inline int RTPHashTable<Element, GetIndex, hashsize>::AddElement(const Element &elem)
 | 
			
		||||
{
 | 
			
		||||
    int index;
 | 
			
		||||
    bool found;
 | 
			
		||||
    HashElement *e, *newelem;
 | 
			
		||||
 | 
			
		||||
    index = GetIndex::GetIndex(elem);
 | 
			
		||||
    if (index >= hashsize)
 | 
			
		||||
        return ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
 | 
			
		||||
 | 
			
		||||
    e = table[index];
 | 
			
		||||
    found = false;
 | 
			
		||||
    while (!found && e != 0)
 | 
			
		||||
    {
 | 
			
		||||
        if (e->GetElement() == elem)
 | 
			
		||||
            found = true;
 | 
			
		||||
        else
 | 
			
		||||
            e = e->hashnext;
 | 
			
		||||
    }
 | 
			
		||||
    if (found)
 | 
			
		||||
        return ERR_RTP_HASHTABLE_ELEMENTALREADYEXISTS;
 | 
			
		||||
 | 
			
		||||
    // Okay, the key doesn't exist, so we can add the new element in the hash table
 | 
			
		||||
 | 
			
		||||
    newelem = new HashElement(elem, index);
 | 
			
		||||
    if (newelem == 0)
 | 
			
		||||
        return ERR_RTP_OUTOFMEM;
 | 
			
		||||
 | 
			
		||||
    e = table[index];
 | 
			
		||||
    table[index] = newelem;
 | 
			
		||||
    newelem->hashnext = e;
 | 
			
		||||
    if (e != 0)
 | 
			
		||||
        e->hashprev = newelem;
 | 
			
		||||
 | 
			
		||||
    // Now, we still got to add it to the linked list
 | 
			
		||||
 | 
			
		||||
    if (firsthashelem == 0)
 | 
			
		||||
    {
 | 
			
		||||
        firsthashelem = newelem;
 | 
			
		||||
        lasthashelem = newelem;
 | 
			
		||||
    }
 | 
			
		||||
    else // there already are some elements in the list
 | 
			
		||||
    {
 | 
			
		||||
        lasthashelem->listnext = newelem;
 | 
			
		||||
        newelem->listprev = lasthashelem;
 | 
			
		||||
        lasthashelem = newelem;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Element, class GetIndex, int hashsize>
 | 
			
		||||
inline int RTPHashTable<Element, GetIndex, hashsize>::DeleteElement(const Element &elem)
 | 
			
		||||
{
 | 
			
		||||
    int status;
 | 
			
		||||
 | 
			
		||||
    status = GotoElement(elem);
 | 
			
		||||
    if (status < 0)
 | 
			
		||||
        return status;
 | 
			
		||||
    return DeleteCurrentElement();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#endif // RTPHASHTABLE_H
 | 
			
		||||
 | 
			
		||||
@ -1,71 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "rtpipv4address.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
bool RTPIPv4Address::IsSameAddress(const RTPAddress *addr) const
 | 
			
		||||
{
 | 
			
		||||
    if (addr == 0)
 | 
			
		||||
        return false;
 | 
			
		||||
    if (addr->GetAddressType() != IPv4Address)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    const RTPIPv4Address *addr2 = (const RTPIPv4Address *) addr;
 | 
			
		||||
    if (addr2->GetIP() == ip && addr2->GetPort() == port)
 | 
			
		||||
        return true;
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RTPIPv4Address::IsFromSameHost(const RTPAddress *addr) const
 | 
			
		||||
{
 | 
			
		||||
    if (addr == 0)
 | 
			
		||||
        return false;
 | 
			
		||||
    if (addr->GetAddressType() != IPv4Address)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    const RTPIPv4Address *addr2 = (const RTPIPv4Address *) addr;
 | 
			
		||||
    if (addr2->GetIP() == ip)
 | 
			
		||||
        return true;
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTPAddress *RTPIPv4Address::CreateCopy() const
 | 
			
		||||
{
 | 
			
		||||
    RTPIPv4Address *a = new RTPIPv4Address(ip, port);
 | 
			
		||||
    return a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
@ -1,176 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file rtpipv4address.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTPIPV4ADDRESS_H
 | 
			
		||||
 | 
			
		||||
#define RTPIPV4ADDRESS_H
 | 
			
		||||
 | 
			
		||||
#include "rtpconfig.h"
 | 
			
		||||
#include "rtpaddress.h"
 | 
			
		||||
#include "rtptypes.h"
 | 
			
		||||
 | 
			
		||||
#include "util/export.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
/** Represents an IPv4 IP address and port.
 | 
			
		||||
 *  This class is used by the UDP over IPv4 transmission component.
 | 
			
		||||
 *  When an RTPIPv4Address is used in one of the multicast functions of the transmitter, the port
 | 
			
		||||
 *  number is ignored. When an instance is used in one of the accept or ignore functions of the
 | 
			
		||||
 *  transmitter, a zero port number represents all ports for the specified IP address.
 | 
			
		||||
 */
 | 
			
		||||
class QRTPLIB_API RTPIPv4Address: public RTPAddress
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    /** Creates an instance with IP address \c ip and port number \c port (both
 | 
			
		||||
     *  are interpreted in host byte order), and possibly sets the RTCP multiplex flag
 | 
			
		||||
     *  (see RTPIPv4Address::UseRTCPMultiplexingOnTransmission). */
 | 
			
		||||
    RTPIPv4Address(uint32_t ip = 0, uint16_t port = 0, bool rtcpmux = false) :
 | 
			
		||||
            RTPAddress(IPv4Address)
 | 
			
		||||
    {
 | 
			
		||||
        RTPIPv4Address::ip = ip;
 | 
			
		||||
        RTPIPv4Address::port = port;
 | 
			
		||||
        if (rtcpmux)
 | 
			
		||||
            rtcpsendport = port;
 | 
			
		||||
        else
 | 
			
		||||
            rtcpsendport = port + 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Creates an instance with IP address \c ip and port number \c port (both
 | 
			
		||||
     *  are interpreted in host byte order), and sets a specific port to
 | 
			
		||||
     *  send RTCP packets to (see RTPIPv4Address::GetRTCPSendPort). */
 | 
			
		||||
    RTPIPv4Address(uint32_t ip, uint16_t port, uint16_t rtcpsendport) :
 | 
			
		||||
            RTPAddress(IPv4Address)
 | 
			
		||||
    {
 | 
			
		||||
        RTPIPv4Address::ip = ip;
 | 
			
		||||
        RTPIPv4Address::port = port;
 | 
			
		||||
        RTPIPv4Address::rtcpsendport = rtcpsendport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Creates an instance with IP address \c ip and port number \c port (\c port is
 | 
			
		||||
     *  interpreted in host byte order) and possibly sets the RTCP multiplex flag
 | 
			
		||||
     *  (see RTPIPv4Address::UseRTCPMultiplexingOnTransmission). */
 | 
			
		||||
    RTPIPv4Address(const uint8_t ip[4], uint16_t port = 0, bool rtcpmux = false) :
 | 
			
		||||
            RTPAddress(IPv4Address)
 | 
			
		||||
    {
 | 
			
		||||
        RTPIPv4Address::ip = (uint32_t) ip[3];
 | 
			
		||||
        RTPIPv4Address::ip |= (((uint32_t) ip[2]) << 8);
 | 
			
		||||
        RTPIPv4Address::ip |= (((uint32_t) ip[1]) << 16);
 | 
			
		||||
        RTPIPv4Address::ip |= (((uint32_t) ip[0]) << 24);
 | 
			
		||||
 | 
			
		||||
        RTPIPv4Address::port = port;
 | 
			
		||||
        if (rtcpmux)
 | 
			
		||||
            rtcpsendport = port;
 | 
			
		||||
        else
 | 
			
		||||
            rtcpsendport = port + 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Creates an instance with IP address \c ip and port number \c port (both
 | 
			
		||||
     *  are interpreted in host byte order), and sets a specific port to
 | 
			
		||||
     *  send RTCP packets to (see RTPIPv4Address::GetRTCPSendPort). */
 | 
			
		||||
    RTPIPv4Address(const uint8_t ip[4], uint16_t port, uint16_t rtcpsendport) :
 | 
			
		||||
            RTPAddress(IPv4Address)
 | 
			
		||||
    {
 | 
			
		||||
        RTPIPv4Address::ip = (uint32_t) ip[3];
 | 
			
		||||
        RTPIPv4Address::ip |= (((uint32_t) ip[2]) << 8);
 | 
			
		||||
        RTPIPv4Address::ip |= (((uint32_t) ip[1]) << 16);
 | 
			
		||||
        RTPIPv4Address::ip |= (((uint32_t) ip[0]) << 24);
 | 
			
		||||
 | 
			
		||||
        RTPIPv4Address::port = port;
 | 
			
		||||
        RTPIPv4Address::rtcpsendport = rtcpsendport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~RTPIPv4Address()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the IP address for this instance to \c ip which is assumed to be in host byte order. */
 | 
			
		||||
    void SetIP(uint32_t ip)
 | 
			
		||||
    {
 | 
			
		||||
        RTPIPv4Address::ip = ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the IP address of this instance to \c ip. */
 | 
			
		||||
    void SetIP(const uint8_t ip[4])
 | 
			
		||||
    {
 | 
			
		||||
        RTPIPv4Address::ip = (uint32_t) ip[3];
 | 
			
		||||
        RTPIPv4Address::ip |= (((uint32_t) ip[2]) << 8);
 | 
			
		||||
        RTPIPv4Address::ip |= (((uint32_t) ip[1]) << 16);
 | 
			
		||||
        RTPIPv4Address::ip |= (((uint32_t) ip[0]) << 24);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the port number for this instance to \c port which is interpreted in host byte order. */
 | 
			
		||||
    void SetPort(uint16_t port)
 | 
			
		||||
    {
 | 
			
		||||
        RTPIPv4Address::port = port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the IP address contained in this instance in host byte order. */
 | 
			
		||||
    uint32_t GetIP() const
 | 
			
		||||
    {
 | 
			
		||||
        return ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the port number of this instance in host byte order. */
 | 
			
		||||
    uint16_t GetPort() const
 | 
			
		||||
    {
 | 
			
		||||
        return port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** For outgoing packets, this indicates to which port RTCP packets will be sent (can,
 | 
			
		||||
     *  be the same port as the RTP packets in case RTCP multiplexing is used). */
 | 
			
		||||
    uint16_t GetRTCPSendPort() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtcpsendport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RTPAddress *CreateCopy() const;
 | 
			
		||||
 | 
			
		||||
    // Note that these functions are only used for received packets, and for those
 | 
			
		||||
    // the rtcpsendport variable is not important and should be ignored.
 | 
			
		||||
    bool IsSameAddress(const RTPAddress *addr) const;
 | 
			
		||||
    bool IsFromSameHost(const RTPAddress *addr) const;
 | 
			
		||||
private:
 | 
			
		||||
    uint32_t ip;
 | 
			
		||||
    uint16_t port;
 | 
			
		||||
    uint16_t rtcpsendport;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#endif // RTPIPV4ADDRESS_H
 | 
			
		||||
 | 
			
		||||
@ -1,50 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2011 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "rtpipv4destination.h"
 | 
			
		||||
#include "rtpinternalutils.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
std::string RTPIPv4Destination::GetDestinationString() const
 | 
			
		||||
{
 | 
			
		||||
    char str[24];
 | 
			
		||||
    uint32_t ip = GetIP();
 | 
			
		||||
    uint16_t portbase = ntohs(GetRTPPort_NBO());
 | 
			
		||||
 | 
			
		||||
    RTP_SNPRINTF(str, 24, "%d.%d.%d.%d:%d", (int) ((ip >> 24) & 0xFF), (int) ((ip >> 16) & 0xFF), (int) ((ip >> 8) & 0xFF), (int) (ip & 0xFF), (int) (portbase));
 | 
			
		||||
    return std::string(str);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
@ -1,138 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file rtpipv4destination.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTPIPV4DESTINATION_H
 | 
			
		||||
 | 
			
		||||
#define RTPIPV4DESTINATION_H
 | 
			
		||||
 | 
			
		||||
#include "rtpconfig.h"
 | 
			
		||||
#include "rtptypes.h"
 | 
			
		||||
#include "rtpipv4address.h"
 | 
			
		||||
#ifndef RTP_SOCKETTYPE_WINSOCK
 | 
			
		||||
#include <netinet/in.h>
 | 
			
		||||
#include <arpa/inet.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#endif // RTP_SOCKETTYPE_WINSOCK
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "util/export.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class QRTPLIB_API RTPIPv4Destination
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPIPv4Destination()
 | 
			
		||||
    {
 | 
			
		||||
        ip = 0;
 | 
			
		||||
        memset(&rtpaddr, 0, sizeof(struct sockaddr_in));
 | 
			
		||||
        memset(&rtcpaddr, 0, sizeof(struct sockaddr_in));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RTPIPv4Destination(uint32_t ip, uint16_t rtpport, uint16_t rtcpport)
 | 
			
		||||
    {
 | 
			
		||||
        memset(&rtpaddr, 0, sizeof(struct sockaddr_in));
 | 
			
		||||
        memset(&rtcpaddr, 0, sizeof(struct sockaddr_in));
 | 
			
		||||
 | 
			
		||||
        rtpaddr.sin_family = AF_INET;
 | 
			
		||||
        rtpaddr.sin_port = htons(rtpport);
 | 
			
		||||
        rtpaddr.sin_addr.s_addr = htonl(ip);
 | 
			
		||||
 | 
			
		||||
        rtcpaddr.sin_family = AF_INET;
 | 
			
		||||
        rtcpaddr.sin_port = htons(rtcpport);
 | 
			
		||||
        rtcpaddr.sin_addr.s_addr = htonl(ip);
 | 
			
		||||
 | 
			
		||||
        RTPIPv4Destination::ip = ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator==(const RTPIPv4Destination &src) const
 | 
			
		||||
    {
 | 
			
		||||
        if (rtpaddr.sin_addr.s_addr == src.rtpaddr.sin_addr.s_addr && rtpaddr.sin_port == src.rtpaddr.sin_port)
 | 
			
		||||
            return true;
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    uint32_t GetIP() const
 | 
			
		||||
    {
 | 
			
		||||
        return ip;
 | 
			
		||||
    }
 | 
			
		||||
    // nbo = network byte order
 | 
			
		||||
    uint32_t GetIP_NBO() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtpaddr.sin_addr.s_addr;
 | 
			
		||||
    }
 | 
			
		||||
    uint16_t GetRTPPort_NBO() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtpaddr.sin_port;
 | 
			
		||||
    }
 | 
			
		||||
    uint16_t GetRTCPPort_NBO() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtcpaddr.sin_port;
 | 
			
		||||
    }
 | 
			
		||||
    const struct sockaddr_in *GetRTPSockAddr() const
 | 
			
		||||
    {
 | 
			
		||||
        return &rtpaddr;
 | 
			
		||||
    }
 | 
			
		||||
    const struct sockaddr_in *GetRTCPSockAddr() const
 | 
			
		||||
    {
 | 
			
		||||
        return &rtcpaddr;
 | 
			
		||||
    }
 | 
			
		||||
    std::string GetDestinationString() const;
 | 
			
		||||
 | 
			
		||||
    static bool AddressToDestination(const RTPAddress &addr, RTPIPv4Destination &dest)
 | 
			
		||||
    {
 | 
			
		||||
        if (addr.GetAddressType() != RTPAddress::IPv4Address)
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        const RTPIPv4Address &address = (const RTPIPv4Address &) addr;
 | 
			
		||||
        uint16_t rtpport = address.GetPort();
 | 
			
		||||
        uint16_t rtcpport = address.GetRTCPSendPort();
 | 
			
		||||
 | 
			
		||||
        dest = RTPIPv4Destination(address.GetIP(), rtpport, rtcpport);
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    uint32_t ip;
 | 
			
		||||
    struct sockaddr_in rtpaddr;
 | 
			
		||||
    struct sockaddr_in rtcpaddr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#endif // RTPIPV4DESTINATION_H
 | 
			
		||||
 | 
			
		||||
@ -1,57 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "rtplibraryversion.h"
 | 
			
		||||
#include "rtpdefines.h"
 | 
			
		||||
#include "rtplibraryversioninternal.h"
 | 
			
		||||
#include "rtpinternalutils.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
RTPLibraryVersion RTPLibraryVersion::GetVersion()
 | 
			
		||||
{
 | 
			
		||||
    return RTPLibraryVersion(JRTPLIB_VERSION_MAJOR, JRTPLIB_VERSION_MINOR, JRTPLIB_VERSION_DEBUG);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string RTPLibraryVersion::GetVersionString() const
 | 
			
		||||
{
 | 
			
		||||
    char str[16];
 | 
			
		||||
 | 
			
		||||
    RTP_SNPRINTF(str, 16, "%d.%d.%d", majornr, minornr, debugnr);
 | 
			
		||||
 | 
			
		||||
    return std::string(str);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
@ -1,93 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file rtplibraryversion.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTPLIBRARYVERSION_H
 | 
			
		||||
 | 
			
		||||
#define RTPLIBRARYVERSION_H
 | 
			
		||||
 | 
			
		||||
#include "rtpconfig.h"
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include "util/export.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Used to provide information about the version of the library.
 | 
			
		||||
 */
 | 
			
		||||
class QRTPLIB_API RTPLibraryVersion
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    /** Returns an instance of RTPLibraryVersion describing the version of the library. */
 | 
			
		||||
    static RTPLibraryVersion GetVersion();
 | 
			
		||||
private:
 | 
			
		||||
    RTPLibraryVersion(int major, int minor, int debug)
 | 
			
		||||
    {
 | 
			
		||||
        majornr = major;
 | 
			
		||||
        minornr = minor;
 | 
			
		||||
        debugnr = debug;
 | 
			
		||||
    }
 | 
			
		||||
public:
 | 
			
		||||
    /** Returns the major version number. */
 | 
			
		||||
    int GetMajorNumber() const
 | 
			
		||||
    {
 | 
			
		||||
        return majornr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the minor version number. */
 | 
			
		||||
    int GetMinorNumber() const
 | 
			
		||||
    {
 | 
			
		||||
        return minornr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the debug version number. */
 | 
			
		||||
    int GetDebugNumber() const
 | 
			
		||||
    {
 | 
			
		||||
        return debugnr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns a string describing the library version. */
 | 
			
		||||
    std::string GetVersionString() const;
 | 
			
		||||
private:
 | 
			
		||||
    int debugnr, minornr, majornr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#endif // RTPLIBRARYVERSION_H
 | 
			
		||||
 | 
			
		||||
@ -1,190 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file rtpselect.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTPSELECT_H
 | 
			
		||||
 | 
			
		||||
#define RTPSELECT_H
 | 
			
		||||
 | 
			
		||||
#include "rtpconfig.h"
 | 
			
		||||
#include "rtptypes.h"
 | 
			
		||||
#include "rtperrors.h"
 | 
			
		||||
#include "rtptimeutilities.h"
 | 
			
		||||
#include "rtpsocketutil.h"
 | 
			
		||||
 | 
			
		||||
#if defined(RTP_HAVE_WSAPOLL) || defined(RTP_HAVE_POLL)
 | 
			
		||||
 | 
			
		||||
#ifndef RTP_HAVE_WSAPOLL
 | 
			
		||||
#include <poll.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#endif // !RTP_HAVE_WSAPOLL
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <limits>
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline int RTPSelect(const SocketType *sockets, int8_t *readflags, std::size_t numsocks, RTPTime timeout)
 | 
			
		||||
{
 | 
			
		||||
    using namespace std;
 | 
			
		||||
 | 
			
		||||
    vector<struct pollfd> fds(numsocks);
 | 
			
		||||
 | 
			
		||||
    for (std::size_t i = 0; i < numsocks; i++)
 | 
			
		||||
    {
 | 
			
		||||
        fds[i].fd = sockets[i];
 | 
			
		||||
        fds[i].events = POLLIN;
 | 
			
		||||
        fds[i].revents = 0;
 | 
			
		||||
        readflags[i] = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int timeoutmsec = -1;
 | 
			
		||||
    if (timeout.GetDouble() >= 0)
 | 
			
		||||
    {
 | 
			
		||||
        double dtimeoutmsec = timeout.GetDouble() * 1000.0;
 | 
			
		||||
        if (dtimeoutmsec > (numeric_limits<int>::max)()) // parentheses to prevent windows 'max' macro expansion
 | 
			
		||||
            dtimeoutmsec = (numeric_limits<int>::max)();
 | 
			
		||||
 | 
			
		||||
        timeoutmsec = (int) dtimeoutmsec;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef RTP_HAVE_WSAPOLL
 | 
			
		||||
    int status = WSAPoll(&(fds[0]), (ULONG)numsocks, timeoutmsec);
 | 
			
		||||
    if (status < 0)
 | 
			
		||||
    return ERR_RTP_SELECT_ERRORINPOLL;
 | 
			
		||||
#else
 | 
			
		||||
    int status = poll(&(fds[0]), numsocks, timeoutmsec);
 | 
			
		||||
    if (status < 0)
 | 
			
		||||
    {
 | 
			
		||||
        // We're just going to ignore an EINTR
 | 
			
		||||
        if (errno == EINTR)
 | 
			
		||||
            return 0;
 | 
			
		||||
        return ERR_RTP_SELECT_ERRORINPOLL;
 | 
			
		||||
    }
 | 
			
		||||
#endif // RTP_HAVE_WSAPOLL
 | 
			
		||||
 | 
			
		||||
    if (status > 0)
 | 
			
		||||
    {
 | 
			
		||||
        for (std::size_t i = 0; i < numsocks; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (fds[i].revents)
 | 
			
		||||
                readflags[i] = 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#ifndef RTP_SOCKETTYPE_WINSOCK
 | 
			
		||||
#include <sys/select.h>
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#endif // !RTP_SOCKETTYPE_WINSOCK
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    /** Wrapper function around 'select', 'poll' or 'WSAPoll', depending on the
 | 
			
		||||
     *  availability on your platform.
 | 
			
		||||
     *
 | 
			
		||||
     *  Wrapper function around 'select', 'poll' or 'WSAPoll', depending on the
 | 
			
		||||
     *  availability on your platform. The function will check the specified
 | 
			
		||||
     *  `sockets` for incoming data and sets the flags in `readflags` if so.
 | 
			
		||||
     *  A maximum time `timeout` will be waited for data to arrive, which is
 | 
			
		||||
     *  indefinitely if set to a negative value. The function returns the number
 | 
			
		||||
     *  of sockets that have data incoming.
 | 
			
		||||
     */
 | 
			
		||||
    inline int RTPSelect(const SocketType *sockets, int8_t *readflags, std::size_t numsocks, RTPTime timeout)
 | 
			
		||||
    {
 | 
			
		||||
        struct timeval tv;
 | 
			
		||||
        struct timeval *pTv = 0;
 | 
			
		||||
 | 
			
		||||
        if (timeout.GetDouble() >= 0)
 | 
			
		||||
        {
 | 
			
		||||
            tv.tv_sec = (long)timeout.GetSeconds();
 | 
			
		||||
            tv.tv_usec = timeout.GetMicroSeconds();
 | 
			
		||||
            pTv = &tv;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fd_set fdset;
 | 
			
		||||
        FD_ZERO(&fdset);
 | 
			
		||||
        for (std::size_t i = 0; i < numsocks; i++)
 | 
			
		||||
        {
 | 
			
		||||
#ifndef RTP_SOCKETTYPE_WINSOCK
 | 
			
		||||
            const int setsize = FD_SETSIZE;
 | 
			
		||||
            // On windows it seems that comparing the socket value to FD_SETSIZE does
 | 
			
		||||
            // not make sense
 | 
			
		||||
            if (sockets[i] >= setsize)
 | 
			
		||||
            return ERR_RTP_SELECT_SOCKETDESCRIPTORTOOLARGE;
 | 
			
		||||
#endif // RTP_SOCKETTYPE_WINSOCK
 | 
			
		||||
            FD_SET(sockets[i], &fdset);
 | 
			
		||||
            readflags[i] = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        int status = select(FD_SETSIZE, &fdset, 0, 0, pTv);
 | 
			
		||||
#ifdef RTP_SOCKETTYPE_WINSOCK
 | 
			
		||||
        if (status < 0)
 | 
			
		||||
        return ERR_RTP_SELECT_ERRORINSELECT;
 | 
			
		||||
#else
 | 
			
		||||
        if (status < 0)
 | 
			
		||||
        {
 | 
			
		||||
            // We're just going to ignore an EINTR
 | 
			
		||||
            if (errno == EINTR)
 | 
			
		||||
            return 0;
 | 
			
		||||
            return ERR_RTP_SELECT_ERRORINSELECT;
 | 
			
		||||
        }
 | 
			
		||||
#endif // RTP_HAVE_WSAPOLL
 | 
			
		||||
 | 
			
		||||
        if (status > 0) // some descriptors were set, check them
 | 
			
		||||
        {
 | 
			
		||||
            for (std::size_t i = 0; i < numsocks; i++)
 | 
			
		||||
            {
 | 
			
		||||
                if (FD_ISSET(sockets[i], &fdset))
 | 
			
		||||
                readflags[i] = 1;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return status;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#endif // RTP_HAVE_POLL || RTP_HAVE_WSAPOLL
 | 
			
		||||
 | 
			
		||||
#endif // RTPSELECT_H
 | 
			
		||||
@ -39,7 +39,6 @@
 | 
			
		||||
#define RTPSESSION_H
 | 
			
		||||
 | 
			
		||||
#include "rtpconfig.h"
 | 
			
		||||
#include "rtplibraryversion.h"
 | 
			
		||||
#include "rtppacketbuilder.h"
 | 
			
		||||
#include "rtpsessionsources.h"
 | 
			
		||||
#include "rtptransmitter.h"
 | 
			
		||||
 | 
			
		||||
@ -1,66 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "rtptcpaddress.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
bool RTPTCPAddress::IsSameAddress(const RTPAddress *addr) const
 | 
			
		||||
{
 | 
			
		||||
    if (addr == 0)
 | 
			
		||||
        return false;
 | 
			
		||||
    if (addr->GetAddressType() != TCPAddress)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    const RTPTCPAddress *a = static_cast<const RTPTCPAddress *>(addr);
 | 
			
		||||
 | 
			
		||||
    // We're using a socket to identify connections
 | 
			
		||||
    if (a->m_socket == m_socket)
 | 
			
		||||
        return true;
 | 
			
		||||
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RTPTCPAddress::IsFromSameHost(const RTPAddress *addr) const
 | 
			
		||||
{
 | 
			
		||||
    return IsSameAddress(addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTPAddress *RTPTCPAddress::CreateCopy() const
 | 
			
		||||
{
 | 
			
		||||
    RTPTCPAddress *a = new RTPTCPAddress(m_socket);
 | 
			
		||||
    return a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
@ -1,89 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file rtptcpaddress.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTPTCPADDRESS_H
 | 
			
		||||
 | 
			
		||||
#define RTPTCPADDRESS_H
 | 
			
		||||
 | 
			
		||||
#include "rtpconfig.h"
 | 
			
		||||
#include "rtpaddress.h"
 | 
			
		||||
#include "rtptypes.h"
 | 
			
		||||
#include "rtpsocketutil.h"
 | 
			
		||||
 | 
			
		||||
#include "util/export.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
/** Represents a TCP 'address' and port.
 | 
			
		||||
 *  This class is used by the TCP transmission component, to specify which sockets
 | 
			
		||||
 *  should be used to send/receive data, and to know on which socket incoming data
 | 
			
		||||
 *  was received.
 | 
			
		||||
 */
 | 
			
		||||
class QRTPLIB_API RTPTCPAddress: public RTPAddress
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    /** Creates an instance with which you can use a specific socket
 | 
			
		||||
     *  in the TCP transmitter (must be connected). */
 | 
			
		||||
    RTPTCPAddress(SocketType sock) :
 | 
			
		||||
            RTPAddress(TCPAddress)
 | 
			
		||||
    {
 | 
			
		||||
        m_socket = sock;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~RTPTCPAddress()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the socket that was specified in the constructor. */
 | 
			
		||||
    SocketType GetSocket() const
 | 
			
		||||
    {
 | 
			
		||||
        return m_socket;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RTPAddress *CreateCopy() const;
 | 
			
		||||
 | 
			
		||||
    // Note that these functions are only used for received packets
 | 
			
		||||
    bool IsSameAddress(const RTPAddress *addr) const;
 | 
			
		||||
    bool IsFromSameHost(const RTPAddress *addr) const;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    SocketType m_socket;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#endif // RTPTCPADDRESS_H
 | 
			
		||||
 | 
			
		||||
@ -1,831 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "rtptcptransmitter.h"
 | 
			
		||||
#include "rtprawpacket.h"
 | 
			
		||||
#include "rtptcpaddress.h"
 | 
			
		||||
#include "rtptimeutilities.h"
 | 
			
		||||
#include "rtpdefines.h"
 | 
			
		||||
#include "rtpstructs.h"
 | 
			
		||||
#include "rtpsocketutilinternal.h"
 | 
			
		||||
#include "rtpinternalutils.h"
 | 
			
		||||
#include "rtpselect.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
#define RTPTCPTRANS_MAXPACKSIZE	65535
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
RTPTCPTransmitter::RTPTCPTransmitter()
 | 
			
		||||
{
 | 
			
		||||
    m_created = false;
 | 
			
		||||
    m_init = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTPTCPTransmitter::~RTPTCPTransmitter()
 | 
			
		||||
{
 | 
			
		||||
    Destroy();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::Init(bool tsafe)
 | 
			
		||||
{
 | 
			
		||||
    if (m_init)
 | 
			
		||||
        return ERR_RTP_TCPTRANS_ALREADYINIT;
 | 
			
		||||
 | 
			
		||||
    if (tsafe)
 | 
			
		||||
        return ERR_RTP_NOTHREADSUPPORT;
 | 
			
		||||
 | 
			
		||||
    m_maxPackSize = RTPTCPTRANS_MAXPACKSIZE;
 | 
			
		||||
    m_init = true;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::Create(std::size_t maximumpacketsize __attribute__((unused)), const RTPTransmissionParams *transparams)
 | 
			
		||||
{
 | 
			
		||||
    const RTPTCPTransmissionParams *params, defaultparams;
 | 
			
		||||
    int status;
 | 
			
		||||
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (m_created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_TCPTRANS_ALREADYCREATED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Obtain transmission parameters
 | 
			
		||||
 | 
			
		||||
    if (transparams == 0)
 | 
			
		||||
        params = &defaultparams;
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        if (transparams->GetTransmissionProtocol() != RTPTransmitter::TCPProto)
 | 
			
		||||
        {
 | 
			
		||||
            return ERR_RTP_TCPTRANS_ILLEGALPARAMETERS;
 | 
			
		||||
        }
 | 
			
		||||
        params = static_cast<const RTPTCPTransmissionParams *>(transparams);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!params->GetCreatedAbortDescriptors())
 | 
			
		||||
    {
 | 
			
		||||
        if ((status = m_abortDesc.Init()) < 0)
 | 
			
		||||
        {
 | 
			
		||||
            return status;
 | 
			
		||||
        }
 | 
			
		||||
        m_pAbortDesc = &m_abortDesc;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        m_pAbortDesc = params->GetCreatedAbortDescriptors();
 | 
			
		||||
        if (!m_pAbortDesc->IsInitialized())
 | 
			
		||||
        {
 | 
			
		||||
            return ERR_RTP_ABORTDESC_NOTINIT;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m_waitingForData = false;
 | 
			
		||||
    m_created = true;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPTCPTransmitter::Destroy()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ClearDestSockets();
 | 
			
		||||
    FlushPackets();
 | 
			
		||||
    m_created = false;
 | 
			
		||||
 | 
			
		||||
    if (m_waitingForData)
 | 
			
		||||
    {
 | 
			
		||||
        m_pAbortDesc->SendAbortSignal();
 | 
			
		||||
        m_abortDesc.Destroy(); // Doesn't do anything if not initialized
 | 
			
		||||
        // to make sure that the WaitForIncomingData function ended
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
        m_abortDesc.Destroy(); // Doesn't do anything if not initialized
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTPTransmissionInfo *RTPTCPTransmitter::GetTransmissionInfo()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    RTPTransmissionInfo *tinf = new RTPTCPTransmissionInfo();
 | 
			
		||||
    return tinf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPTCPTransmitter::DeleteTransmissionInfo(RTPTransmissionInfo *i)
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    delete i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::GetLocalHostName(uint8_t *buffer, std::size_t *bufferlength)
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (m_localHostname.size() == 0)
 | 
			
		||||
    {
 | 
			
		||||
//
 | 
			
		||||
// TODO
 | 
			
		||||
// TODO
 | 
			
		||||
// TODO
 | 
			
		||||
// TODO
 | 
			
		||||
//
 | 
			
		||||
        m_localHostname.resize(9);
 | 
			
		||||
        memcpy(&m_localHostname[0], "localhost", m_localHostname.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((*bufferlength) < m_localHostname.size())
 | 
			
		||||
    {
 | 
			
		||||
        *bufferlength = m_localHostname.size(); // tell the application the required size of the buffer
 | 
			
		||||
        return ERR_RTP_TRANS_BUFFERLENGTHTOOSMALL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memcpy(buffer, &m_localHostname[0], m_localHostname.size());
 | 
			
		||||
    *bufferlength = m_localHostname.size();
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RTPTCPTransmitter::ComesFromThisTransmitter(const RTPAddress *addr)
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    if (addr == 0)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    if (addr->GetAddressType() != RTPAddress::TCPAddress)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    bool v = false;
 | 
			
		||||
 | 
			
		||||
    // TODO: for now, we're assuming that we can't just send to the same transmitter
 | 
			
		||||
 | 
			
		||||
    return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::Poll()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::map<SocketType, SocketData>::iterator it = m_destSockets.begin();
 | 
			
		||||
    std::map<SocketType, SocketData>::iterator end = m_destSockets.end();
 | 
			
		||||
    int status = 0;
 | 
			
		||||
 | 
			
		||||
    vector<SocketType> errSockets;
 | 
			
		||||
 | 
			
		||||
    while (it != end)
 | 
			
		||||
    {
 | 
			
		||||
        SocketType sock = it->first;
 | 
			
		||||
        status = PollSocket(sock, it->second);
 | 
			
		||||
        if (status < 0)
 | 
			
		||||
        {
 | 
			
		||||
            // Stop immediately on out of memory
 | 
			
		||||
            if (status == ERR_RTP_OUTOFMEM)
 | 
			
		||||
                break;
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                errSockets.push_back(sock);
 | 
			
		||||
                // Don't let this count as an error (due to a closed connection for example),
 | 
			
		||||
                // otherwise the poll thread (if used) will stop because of this. Since there
 | 
			
		||||
                // may be more than one connection, that's not desirable in general.
 | 
			
		||||
                status = 0;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        ++it;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (std::size_t i = 0; i < errSockets.size(); i++)
 | 
			
		||||
        OnReceiveError(errSockets[i]);
 | 
			
		||||
 | 
			
		||||
    return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::WaitForIncomingData(const RTPTime &delay, bool *dataavailable)
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
    if (m_waitingForData)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_TCPTRANS_ALREADYWAITING;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m_tmpSocks.resize(m_destSockets.size() + 1);
 | 
			
		||||
    m_tmpFlags.resize(m_tmpSocks.size());
 | 
			
		||||
    SocketType abortSocket = m_pAbortDesc->GetAbortSocket();
 | 
			
		||||
 | 
			
		||||
    std::map<SocketType, SocketData>::iterator it = m_destSockets.begin();
 | 
			
		||||
    std::map<SocketType, SocketData>::iterator end = m_destSockets.end();
 | 
			
		||||
    int idx = 0;
 | 
			
		||||
 | 
			
		||||
    while (it != end)
 | 
			
		||||
    {
 | 
			
		||||
        m_tmpSocks[idx] = it->first;
 | 
			
		||||
        m_tmpFlags[idx] = 0;
 | 
			
		||||
        ++it;
 | 
			
		||||
        idx++;
 | 
			
		||||
    }
 | 
			
		||||
    m_tmpSocks[idx] = abortSocket;
 | 
			
		||||
    m_tmpFlags[idx] = 0;
 | 
			
		||||
    int idxAbort = idx;
 | 
			
		||||
 | 
			
		||||
    m_waitingForData = true;
 | 
			
		||||
 | 
			
		||||
    //cout << "Waiting for " << delay.GetDouble() << " seconds for data on " << m_tmpSocks.size() << " sockets" << endl;
 | 
			
		||||
    int status = RTPSelect(&m_tmpSocks[0], &m_tmpFlags[0], m_tmpSocks.size(), delay);
 | 
			
		||||
    if (status < 0)
 | 
			
		||||
    {
 | 
			
		||||
        m_waitingForData = false;
 | 
			
		||||
 | 
			
		||||
        return status;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m_waitingForData = false;
 | 
			
		||||
    if (!m_created) // destroy called
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // if aborted, read from abort buffer
 | 
			
		||||
    if (m_tmpFlags[idxAbort])
 | 
			
		||||
        m_pAbortDesc->ReadSignallingByte();
 | 
			
		||||
 | 
			
		||||
    if (dataavailable != 0)
 | 
			
		||||
    {
 | 
			
		||||
        bool avail = false;
 | 
			
		||||
 | 
			
		||||
        for (std::size_t i = 0; i < m_tmpFlags.size(); i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (m_tmpFlags[i])
 | 
			
		||||
            {
 | 
			
		||||
                avail = true;
 | 
			
		||||
                //cout << "Data available!" << endl;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (avail)
 | 
			
		||||
            *dataavailable = true;
 | 
			
		||||
        else
 | 
			
		||||
            *dataavailable = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::AbortWait()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
    if (!m_waitingForData)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTWAITING;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m_pAbortDesc->SendAbortSignal();
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::SendRTPData(const void *data, std::size_t len)
 | 
			
		||||
{
 | 
			
		||||
    return SendRTPRTCPData(data, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::SendRTCPData(const void *data, std::size_t len)
 | 
			
		||||
{
 | 
			
		||||
    return SendRTPRTCPData(data, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::AddDestination(const RTPAddress &addr)
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (addr.GetAddressType() != RTPAddress::TCPAddress)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_TCPTRANS_INVALIDADDRESSTYPE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const RTPTCPAddress &a = static_cast<const RTPTCPAddress &>(addr);
 | 
			
		||||
    SocketType s = a.GetSocket();
 | 
			
		||||
    if (s == 0)
 | 
			
		||||
    {
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOSOCKETSPECIFIED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int status = ValidateSocket(s);
 | 
			
		||||
    if (status != 0)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return status;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::map<SocketType, SocketData>::iterator it = m_destSockets.find(s);
 | 
			
		||||
    if (it != m_destSockets.end())
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return ERR_RTP_TCPTRANS_SOCKETALREADYINDESTINATIONS;
 | 
			
		||||
    }
 | 
			
		||||
    m_destSockets[s] = SocketData();
 | 
			
		||||
 | 
			
		||||
    // Because the sockets are also used for incoming data, we'll abort a wait
 | 
			
		||||
    // that may be in progress, otherwise it could take a few seconds until the
 | 
			
		||||
    // new socket is monitored for incoming data
 | 
			
		||||
    m_pAbortDesc->SendAbortSignal();
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::DeleteDestination(const RTPAddress &addr)
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (addr.GetAddressType() != RTPAddress::TCPAddress)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return ERR_RTP_TCPTRANS_INVALIDADDRESSTYPE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const RTPTCPAddress &a = static_cast<const RTPTCPAddress &>(addr);
 | 
			
		||||
    SocketType s = a.GetSocket();
 | 
			
		||||
    if (s == 0)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOSOCKETSPECIFIED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::map<SocketType, SocketData>::iterator it = m_destSockets.find(s);
 | 
			
		||||
    if (it == m_destSockets.end())
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return ERR_RTP_TCPTRANS_SOCKETNOTFOUNDINDESTINATIONS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Clean up possibly allocated memory
 | 
			
		||||
    uint8_t *pBuf = it->second.ExtractDataBuffer();
 | 
			
		||||
    if (pBuf)
 | 
			
		||||
        delete[] pBuf;
 | 
			
		||||
 | 
			
		||||
    m_destSockets.erase(it);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPTCPTransmitter::ClearDestinations()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (m_created)
 | 
			
		||||
        ClearDestSockets();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RTPTCPTransmitter::SupportsMulticasting()
 | 
			
		||||
{
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::JoinMulticastGroup(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_TCPTRANS_NOMULTICASTSUPPORT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::LeaveMulticastGroup(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_TCPTRANS_NOMULTICASTSUPPORT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPTCPTransmitter::LeaveAllMulticastGroups()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::SetReceiveMode(RTPTransmitter::ReceiveMode m)
 | 
			
		||||
{
 | 
			
		||||
    if (m != RTPTransmitter::AcceptAll)
 | 
			
		||||
        return ERR_RTP_TCPTRANS_RECEIVEMODENOTSUPPORTED;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::AddToIgnoreList(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_TCPTRANS_RECEIVEMODENOTSUPPORTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::DeleteFromIgnoreList(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_TCPTRANS_RECEIVEMODENOTSUPPORTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPTCPTransmitter::ClearIgnoreList()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::AddToAcceptList(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_TCPTRANS_RECEIVEMODENOTSUPPORTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::DeleteFromAcceptList(const RTPAddress &)
 | 
			
		||||
{
 | 
			
		||||
    return ERR_RTP_TCPTRANS_RECEIVEMODENOTSUPPORTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPTCPTransmitter::ClearAcceptList()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::SetMaximumPacketSize(std::size_t s)
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
    if (s > RTPTCPTRANS_MAXPACKSIZE)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return ERR_RTP_TCPTRANS_SPECIFIEDSIZETOOBIG;
 | 
			
		||||
    }
 | 
			
		||||
    m_maxPackSize = s;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RTPTCPTransmitter::NewDataAvailable()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    bool v;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
        v = false;
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        if (m_rawpacketlist.empty())
 | 
			
		||||
            v = false;
 | 
			
		||||
        else
 | 
			
		||||
            v = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTPRawPacket *RTPTCPTransmitter::GetNextPacket()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    RTPRawPacket *p;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    if (m_rawpacketlist.empty())
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    p = *(m_rawpacketlist.begin());
 | 
			
		||||
    m_rawpacketlist.pop_front();
 | 
			
		||||
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Here the private functions start...
 | 
			
		||||
 | 
			
		||||
void RTPTCPTransmitter::FlushPackets()
 | 
			
		||||
{
 | 
			
		||||
    std::list<RTPRawPacket*>::const_iterator it;
 | 
			
		||||
 | 
			
		||||
    for (it = m_rawpacketlist.begin(); it != m_rawpacketlist.end(); ++it)
 | 
			
		||||
        delete *it;
 | 
			
		||||
    m_rawpacketlist.clear();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::PollSocket(SocketType sock, SocketData &sdata)
 | 
			
		||||
{
 | 
			
		||||
#ifdef RTP_SOCKETTYPE_WINSOCK
 | 
			
		||||
    unsigned long len;
 | 
			
		||||
#else
 | 
			
		||||
    std::size_t len;
 | 
			
		||||
#endif // RTP_SOCKETTYPE_WINSOCK
 | 
			
		||||
    bool dataavailable;
 | 
			
		||||
 | 
			
		||||
    do
 | 
			
		||||
    {
 | 
			
		||||
        len = 0;
 | 
			
		||||
        RTPIOCTL(sock, FIONREAD, &len);
 | 
			
		||||
 | 
			
		||||
        if (len <= 0)
 | 
			
		||||
            dataavailable = false;
 | 
			
		||||
        else
 | 
			
		||||
            dataavailable = true;
 | 
			
		||||
 | 
			
		||||
        if (dataavailable)
 | 
			
		||||
        {
 | 
			
		||||
            RTPTime curtime = RTPTime::CurrentTime();
 | 
			
		||||
            int relevantLen = RTPTCPTRANS_MAXPACKSIZE + 2;
 | 
			
		||||
 | 
			
		||||
            if ((int) len < relevantLen)
 | 
			
		||||
                relevantLen = (int) len;
 | 
			
		||||
 | 
			
		||||
            bool complete = false;
 | 
			
		||||
            int status = sdata.ProcessAvailableBytes(sock, relevantLen, complete);
 | 
			
		||||
            if (status < 0)
 | 
			
		||||
                return status;
 | 
			
		||||
 | 
			
		||||
            if (complete)
 | 
			
		||||
            {
 | 
			
		||||
                uint8_t *pBuf = sdata.ExtractDataBuffer();
 | 
			
		||||
                if (pBuf)
 | 
			
		||||
                {
 | 
			
		||||
                    int dataLength = sdata.m_dataLength;
 | 
			
		||||
                    sdata.Reset();
 | 
			
		||||
 | 
			
		||||
                    RTPTCPAddress *pAddr = new RTPTCPAddress(sock);
 | 
			
		||||
                    if (pAddr == 0)
 | 
			
		||||
                        return ERR_RTP_OUTOFMEM;
 | 
			
		||||
 | 
			
		||||
                    bool isrtp = true;
 | 
			
		||||
                    if (dataLength > (int) sizeof(RTCPCommonHeader))
 | 
			
		||||
                    {
 | 
			
		||||
                        RTCPCommonHeader *rtcpheader = (RTCPCommonHeader *) pBuf;
 | 
			
		||||
                        uint8_t packettype = rtcpheader->packettype;
 | 
			
		||||
 | 
			
		||||
                        if (packettype >= 200 && packettype <= 204)
 | 
			
		||||
                            isrtp = false;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    RTPRawPacket *pPack = new RTPRawPacket(pBuf, dataLength, pAddr, curtime, isrtp);
 | 
			
		||||
                    if (pPack == 0)
 | 
			
		||||
                    {
 | 
			
		||||
                        delete pAddr;
 | 
			
		||||
                        delete[] pBuf;
 | 
			
		||||
                        return ERR_RTP_OUTOFMEM;
 | 
			
		||||
                    }
 | 
			
		||||
                    m_rawpacketlist.push_back(pPack);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    } while (dataavailable);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::SendRTPRTCPData(const void *data, std::size_t len)
 | 
			
		||||
{
 | 
			
		||||
    if (!m_init)
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTINIT;
 | 
			
		||||
 | 
			
		||||
    if (!m_created)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return ERR_RTP_TCPTRANS_NOTCREATED;
 | 
			
		||||
    }
 | 
			
		||||
    if (len > RTPTCPTRANS_MAXPACKSIZE)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        return ERR_RTP_TCPTRANS_SPECIFIEDSIZETOOBIG;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::map<SocketType, SocketData>::iterator it = m_destSockets.begin();
 | 
			
		||||
    std::map<SocketType, SocketData>::iterator end = m_destSockets.end();
 | 
			
		||||
 | 
			
		||||
    vector<SocketType> errSockets;
 | 
			
		||||
    int flags = 0;
 | 
			
		||||
#ifdef RTP_HAVE_MSG_NOSIGNAL
 | 
			
		||||
    flags = MSG_NOSIGNAL;
 | 
			
		||||
#endif // RTP_HAVE_MSG_NOSIGNAL
 | 
			
		||||
 | 
			
		||||
    while (it != end)
 | 
			
		||||
    {
 | 
			
		||||
        uint8_t lengthBytes[2] =
 | 
			
		||||
        { (uint8_t) ((len >> 8) & 0xff), (uint8_t) (len & 0xff) };
 | 
			
		||||
        SocketType sock = it->first;
 | 
			
		||||
 | 
			
		||||
        if (send(sock, (const char *) lengthBytes, 2, flags) < 0 || send(sock, (const char *) data, len, flags) < 0)
 | 
			
		||||
            errSockets.push_back(sock);
 | 
			
		||||
        ++it;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (errSockets.size() != 0)
 | 
			
		||||
    {
 | 
			
		||||
        for (std::size_t i = 0; i < errSockets.size(); i++)
 | 
			
		||||
            OnSendError(errSockets[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Don't return an error code to avoid the poll thread exiting
 | 
			
		||||
    // due to one closed connection for example
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::ValidateSocket(SocketType)
 | 
			
		||||
{
 | 
			
		||||
    // TODO: should we even do a check (for a TCP socket)?
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPTCPTransmitter::ClearDestSockets()
 | 
			
		||||
{
 | 
			
		||||
    std::map<SocketType, SocketData>::iterator it = m_destSockets.begin();
 | 
			
		||||
    std::map<SocketType, SocketData>::iterator end = m_destSockets.end();
 | 
			
		||||
 | 
			
		||||
    while (it != end)
 | 
			
		||||
    {
 | 
			
		||||
        uint8_t *pBuf = it->second.ExtractDataBuffer();
 | 
			
		||||
        if (pBuf)
 | 
			
		||||
            delete[] pBuf;
 | 
			
		||||
 | 
			
		||||
        ++it;
 | 
			
		||||
    }
 | 
			
		||||
    m_destSockets.clear();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTPTCPTransmitter::SocketData::SocketData()
 | 
			
		||||
{
 | 
			
		||||
    Reset();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTPTCPTransmitter::SocketData::Reset()
 | 
			
		||||
{
 | 
			
		||||
    m_lengthBufferOffset = 0;
 | 
			
		||||
    m_dataLength = 0;
 | 
			
		||||
    m_dataBufferOffset = 0;
 | 
			
		||||
    m_pDataBuffer = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTPTCPTransmitter::SocketData::~SocketData()
 | 
			
		||||
{
 | 
			
		||||
    assert(m_pDataBuffer == 0); // Should be deleted externally to avoid storing a memory manager in the class
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTPTCPTransmitter::SocketData::ProcessAvailableBytes(SocketType sock, int availLen, bool &complete)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    const int numLengthBuffer = 2;
 | 
			
		||||
    if (m_lengthBufferOffset < numLengthBuffer) // first we need to get the length
 | 
			
		||||
    {
 | 
			
		||||
        assert(m_pDataBuffer == 0);
 | 
			
		||||
        int num = numLengthBuffer - m_lengthBufferOffset;
 | 
			
		||||
        if (num > availLen)
 | 
			
		||||
            num = availLen;
 | 
			
		||||
 | 
			
		||||
        int r = 0;
 | 
			
		||||
        if (num > 0)
 | 
			
		||||
        {
 | 
			
		||||
            r = (int) recv(sock, (char *) (m_lengthBuffer + m_lengthBufferOffset), num, 0);
 | 
			
		||||
            if (r < 0)
 | 
			
		||||
                return ERR_RTP_TCPTRANS_ERRORINRECV;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        m_lengthBufferOffset += r;
 | 
			
		||||
        availLen -= r;
 | 
			
		||||
 | 
			
		||||
        assert(m_lengthBufferOffset <= numLengthBuffer);
 | 
			
		||||
        if (m_lengthBufferOffset == numLengthBuffer) // we can constuct a length
 | 
			
		||||
        {
 | 
			
		||||
            int l = 0;
 | 
			
		||||
            for (int i = numLengthBuffer - 1, shift = 0; i >= 0; i--, shift += 8)
 | 
			
		||||
                l |= ((int) m_lengthBuffer[i]) << shift;
 | 
			
		||||
 | 
			
		||||
            m_dataLength = l;
 | 
			
		||||
            m_dataBufferOffset = 0;
 | 
			
		||||
 | 
			
		||||
//cout << "Expecting " << m_dataLength << " bytes" << endl;
 | 
			
		||||
 | 
			
		||||
// avoid allocation of length 0
 | 
			
		||||
            if (l == 0)
 | 
			
		||||
                l = 1;
 | 
			
		||||
 | 
			
		||||
// We don't yet know if it's an RTP or RTCP packet, so we'll stick to RTP
 | 
			
		||||
            m_pDataBuffer = new uint8_t[l];
 | 
			
		||||
            if (m_pDataBuffer == 0)
 | 
			
		||||
                return ERR_RTP_OUTOFMEM;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (m_lengthBufferOffset == numLengthBuffer && m_pDataBuffer) // the last one is to make sure we didn't run out of memory
 | 
			
		||||
    {
 | 
			
		||||
        if (m_dataBufferOffset < m_dataLength)
 | 
			
		||||
        {
 | 
			
		||||
            int num = m_dataLength - m_dataBufferOffset;
 | 
			
		||||
            if (num > availLen)
 | 
			
		||||
                num = availLen;
 | 
			
		||||
 | 
			
		||||
            int r = 0;
 | 
			
		||||
            if (num > 0)
 | 
			
		||||
            {
 | 
			
		||||
                r = (int) recv(sock, (char *) (m_pDataBuffer + m_dataBufferOffset), num, 0);
 | 
			
		||||
                if (r < 0)
 | 
			
		||||
                    return ERR_RTP_TCPTRANS_ERRORINRECV;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            m_dataBufferOffset += r;
 | 
			
		||||
            availLen -= r;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (m_dataBufferOffset == m_dataLength)
 | 
			
		||||
            complete = true;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
@ -1,229 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file rtptcptransmitter.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTPTCPTRANSMITTER_H
 | 
			
		||||
 | 
			
		||||
#define RTPTCPTRANSMITTER_H
 | 
			
		||||
 | 
			
		||||
#include "rtpconfig.h"
 | 
			
		||||
#include "rtptransmitter.h"
 | 
			
		||||
#include "rtpsocketutil.h"
 | 
			
		||||
#include "rtpabortdescriptors.h"
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <list>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include "util/export.h"
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
/** Parameters for the TCP transmitter. */
 | 
			
		||||
class QRTPLIB_API RTPTCPTransmissionParams: public RTPTransmissionParams
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPTCPTransmissionParams();
 | 
			
		||||
 | 
			
		||||
    /** If non null, the specified abort descriptors will be used to cancel
 | 
			
		||||
     *  the function that's waiting for packets to arrive; set to null (the default)
 | 
			
		||||
     *  to let the transmitter create its own instance. */
 | 
			
		||||
    void SetCreatedAbortDescriptors(RTPAbortDescriptors *desc)
 | 
			
		||||
    {
 | 
			
		||||
        m_pAbortDesc = desc;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** If non-null, this RTPAbortDescriptors instance will be used internally,
 | 
			
		||||
     *  which can be useful when creating your own poll thread for multiple
 | 
			
		||||
     *  sessions. */
 | 
			
		||||
    RTPAbortDescriptors *GetCreatedAbortDescriptors() const
 | 
			
		||||
    {
 | 
			
		||||
        return m_pAbortDesc;
 | 
			
		||||
    }
 | 
			
		||||
private:
 | 
			
		||||
    RTPAbortDescriptors *m_pAbortDesc;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline RTPTCPTransmissionParams::RTPTCPTransmissionParams() :
 | 
			
		||||
        RTPTransmissionParams(RTPTransmitter::TCPProto)
 | 
			
		||||
{
 | 
			
		||||
    m_pAbortDesc = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Additional information about the TCP transmitter. */
 | 
			
		||||
class RTPTCPTransmissionInfo: public RTPTransmissionInfo
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPTCPTransmissionInfo() :
 | 
			
		||||
            RTPTransmissionInfo(RTPTransmitter::TCPProto)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
    ~RTPTCPTransmissionInfo()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// TODO: this is for IPv4, and will only be valid if one  rtp packet is in one tcp frame
 | 
			
		||||
#define RTPTCPTRANS_HEADERSIZE						(20+20+2) // 20 IP, 20 TCP, 2 for framing (RFC 4571)
 | 
			
		||||
 | 
			
		||||
/** A TCP transmission component.
 | 
			
		||||
 *
 | 
			
		||||
 *  This class inherits the RTPTransmitter interface and implements a transmission component
 | 
			
		||||
 *  which uses TCP to send and receive RTP and RTCP data. The component's parameters
 | 
			
		||||
 *  are described by the class RTPTCPTransmissionParams. The functions which have an RTPAddress
 | 
			
		||||
 *  argument require an argument of RTPTCPAddress. The RTPTransmitter::GetTransmissionInfo member function
 | 
			
		||||
 *  returns an instance of type RTPTCPTransmissionInfo.
 | 
			
		||||
 *
 | 
			
		||||
 *  After this transmission component was created, no data will actually be sent or received
 | 
			
		||||
 *  yet. You can specify over which TCP connections (which must be established first) data
 | 
			
		||||
 *  should be transmitted by using the RTPTransmitter::AddDestination member function. This
 | 
			
		||||
 *  takes an argument of type RTPTCPAddress, with which relevant the socket descriptor can
 | 
			
		||||
 *  be passed to the transmitter.
 | 
			
		||||
 *
 | 
			
		||||
 *  These sockets will also be used to check for incoming RTP or RTCP data. The RTPTCPAddress
 | 
			
		||||
 *  instance that's associated with a received packet, will contain the socket descriptor
 | 
			
		||||
 *  on which the data was received. This descriptor can be obtained using RTPTCPAddress::GetSocket.
 | 
			
		||||
 *
 | 
			
		||||
 *  To get notified of an error when sending over or receiving from a socket, override the
 | 
			
		||||
 *  RTPTCPTransmitter::OnSendError and RTPTCPTransmitter::OnReceiveError member functions.
 | 
			
		||||
 */
 | 
			
		||||
class RTPTCPTransmitter : public RTPTransmitter
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPTCPTransmitter();
 | 
			
		||||
    ~RTPTCPTransmitter();
 | 
			
		||||
 | 
			
		||||
    int Init(bool treadsafe);
 | 
			
		||||
    int Create(std::size_t maxpacksize, const RTPTransmissionParams *transparams);
 | 
			
		||||
    void Destroy();
 | 
			
		||||
    RTPTransmissionInfo *GetTransmissionInfo();
 | 
			
		||||
    void DeleteTransmissionInfo(RTPTransmissionInfo *inf);
 | 
			
		||||
 | 
			
		||||
    int GetLocalHostName(uint8_t *buffer, std::size_t *bufferlength);
 | 
			
		||||
    bool ComesFromThisTransmitter(const RTPAddress *addr);
 | 
			
		||||
    std::size_t GetHeaderOverhead()
 | 
			
		||||
    {
 | 
			
		||||
        return RTPTCPTRANS_HEADERSIZE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int Poll();
 | 
			
		||||
    int WaitForIncomingData(const RTPTime &delay, bool *dataavailable = 0);
 | 
			
		||||
    int AbortWait();
 | 
			
		||||
 | 
			
		||||
    int SendRTPData(const void *data, std::size_t len);
 | 
			
		||||
    int SendRTCPData(const void *data, std::size_t len);
 | 
			
		||||
 | 
			
		||||
    int AddDestination(const RTPAddress &addr);
 | 
			
		||||
    int DeleteDestination(const RTPAddress &addr);
 | 
			
		||||
    void ClearDestinations();
 | 
			
		||||
 | 
			
		||||
    bool SupportsMulticasting();
 | 
			
		||||
    int JoinMulticastGroup(const RTPAddress &addr);
 | 
			
		||||
    int LeaveMulticastGroup(const RTPAddress &addr);
 | 
			
		||||
    void LeaveAllMulticastGroups();
 | 
			
		||||
 | 
			
		||||
    int SetReceiveMode(RTPTransmitter::ReceiveMode m);
 | 
			
		||||
    int AddToIgnoreList(const RTPAddress &addr);
 | 
			
		||||
    int DeleteFromIgnoreList(const RTPAddress &addr);
 | 
			
		||||
    void ClearIgnoreList();
 | 
			
		||||
    int AddToAcceptList(const RTPAddress &addr);
 | 
			
		||||
    int DeleteFromAcceptList(const RTPAddress &addr);
 | 
			
		||||
    void ClearAcceptList();
 | 
			
		||||
    int SetMaximumPacketSize(std::size_t s);
 | 
			
		||||
 | 
			
		||||
    bool NewDataAvailable();
 | 
			
		||||
    RTPRawPacket *GetNextPacket();
 | 
			
		||||
protected:
 | 
			
		||||
    /** By overriding this function you can be notified of an error when sending over a socket. */
 | 
			
		||||
    virtual void OnSendError(SocketType sock);
 | 
			
		||||
    /** By overriding this function you can be notified of an error when receiving from a socket. */
 | 
			
		||||
    virtual void OnReceiveError(SocketType sock);
 | 
			
		||||
private:
 | 
			
		||||
    class SocketData
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        SocketData();
 | 
			
		||||
        ~SocketData();
 | 
			
		||||
        void Reset();
 | 
			
		||||
 | 
			
		||||
        uint8_t m_lengthBuffer[2];
 | 
			
		||||
        int m_lengthBufferOffset;
 | 
			
		||||
        int m_dataLength;
 | 
			
		||||
        int m_dataBufferOffset;
 | 
			
		||||
        uint8_t *m_pDataBuffer;
 | 
			
		||||
 | 
			
		||||
        uint8_t *ExtractDataBuffer()
 | 
			
		||||
        {
 | 
			
		||||
            uint8_t *pTmp = m_pDataBuffer;
 | 
			
		||||
            m_pDataBuffer = 0;
 | 
			
		||||
            return pTmp;
 | 
			
		||||
        }
 | 
			
		||||
        int ProcessAvailableBytes(SocketType sock, int availLen, bool &complete);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    int SendRTPRTCPData(const void *data, std::size_t len);
 | 
			
		||||
    void FlushPackets();
 | 
			
		||||
    int PollSocket(SocketType sock, SocketData &sdata);
 | 
			
		||||
    void ClearDestSockets();
 | 
			
		||||
    int ValidateSocket(SocketType s);
 | 
			
		||||
 | 
			
		||||
    bool m_init;
 | 
			
		||||
    bool m_created;
 | 
			
		||||
    bool m_waitingForData;
 | 
			
		||||
 | 
			
		||||
    std::map<SocketType, SocketData> m_destSockets;
 | 
			
		||||
    std::vector<SocketType> m_tmpSocks;
 | 
			
		||||
    std::vector<int8_t> m_tmpFlags;
 | 
			
		||||
    std::vector<uint8_t> m_localHostname;
 | 
			
		||||
    std::size_t m_maxPackSize;
 | 
			
		||||
 | 
			
		||||
    std::list<RTPRawPacket*> m_rawpacketlist;
 | 
			
		||||
 | 
			
		||||
    RTPAbortDescriptors m_abortDesc;
 | 
			
		||||
    RTPAbortDescriptors *m_pAbortDesc; // in case an external one was specified
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline void RTPTCPTransmitter::OnSendError(SocketType)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
inline void RTPTCPTransmitter::OnReceiveError(SocketType)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#endif // RTPTCPTRANSMITTER_H
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,488 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file rtpudpv4transmitter.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTPUDPV4TRANSMITTER_H
 | 
			
		||||
 | 
			
		||||
#define RTPUDPV4TRANSMITTER_H
 | 
			
		||||
 | 
			
		||||
#include "rtpconfig.h"
 | 
			
		||||
#include "rtptransmitter.h"
 | 
			
		||||
#include "rtpipv4destination.h"
 | 
			
		||||
#include "rtphashtable.h"
 | 
			
		||||
#include "rtpkeyhashtable.h"
 | 
			
		||||
#include "rtpsocketutil.h"
 | 
			
		||||
#include "rtpabortdescriptors.h"
 | 
			
		||||
#include <list>
 | 
			
		||||
 | 
			
		||||
#include "util/export.h"
 | 
			
		||||
 | 
			
		||||
#define RTPUDPV4TRANS_HASHSIZE									8317
 | 
			
		||||
#define RTPUDPV4TRANS_DEFAULTPORTBASE								5000
 | 
			
		||||
 | 
			
		||||
#define RTPUDPV4TRANS_RTPRECEIVEBUFFER							32768
 | 
			
		||||
#define RTPUDPV4TRANS_RTCPRECEIVEBUFFER							32768
 | 
			
		||||
#define RTPUDPV4TRANS_RTPTRANSMITBUFFER							32768
 | 
			
		||||
#define RTPUDPV4TRANS_RTCPTRANSMITBUFFER						32768
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
/** Parameters for the UDP over IPv4 transmitter. */
 | 
			
		||||
class QRTPLIB_API RTPUDPv4TransmissionParams: public RTPTransmissionParams
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPUDPv4TransmissionParams();
 | 
			
		||||
 | 
			
		||||
    /** Sets the IP address which is used to bind the sockets to \c ip. */
 | 
			
		||||
    void SetBindIP(uint32_t ip)
 | 
			
		||||
    {
 | 
			
		||||
        bindIP = ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the multicast interface IP address. */
 | 
			
		||||
    void SetMulticastInterfaceIP(uint32_t ip)
 | 
			
		||||
    {
 | 
			
		||||
        mcastifaceIP = ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the RTP portbase to \c pbase, which has to be an even number
 | 
			
		||||
     *  unless RTPUDPv4TransmissionParams::SetAllowOddPortbase was called;
 | 
			
		||||
     *  a port number of zero will cause a port to be chosen automatically. */
 | 
			
		||||
    void SetPortbase(uint16_t pbase)
 | 
			
		||||
    {
 | 
			
		||||
        portbase = pbase;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the multicast TTL to be used to \c mcastTTL. */
 | 
			
		||||
    void SetMulticastTTL(uint8_t mcastTTL)
 | 
			
		||||
    {
 | 
			
		||||
        multicastTTL = mcastTTL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Passes a list of IP addresses which will be used as the local IP addresses. */
 | 
			
		||||
    void SetLocalIPList(std::list<uint32_t> &iplist)
 | 
			
		||||
    {
 | 
			
		||||
        localIPs = iplist;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Clears the list of local IP addresses.
 | 
			
		||||
     *  Clears the list of local IP addresses. An empty list will make the transmission
 | 
			
		||||
     *  component itself determine the local IP addresses.
 | 
			
		||||
     */
 | 
			
		||||
    void ClearLocalIPList()
 | 
			
		||||
    {
 | 
			
		||||
        localIPs.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the IP address which will be used to bind the sockets. */
 | 
			
		||||
    uint32_t GetBindIP() const
 | 
			
		||||
    {
 | 
			
		||||
        return bindIP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the multicast interface IP address. */
 | 
			
		||||
    uint32_t GetMulticastInterfaceIP() const
 | 
			
		||||
    {
 | 
			
		||||
        return mcastifaceIP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the RTP portbase which will be used (default is 5000). */
 | 
			
		||||
    uint16_t GetPortbase() const
 | 
			
		||||
    {
 | 
			
		||||
        return portbase;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the multicast TTL which will be used (default is 1). */
 | 
			
		||||
    uint8_t GetMulticastTTL() const
 | 
			
		||||
    {
 | 
			
		||||
        return multicastTTL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the list of local IP addresses. */
 | 
			
		||||
    const std::list<uint32_t> &GetLocalIPList() const
 | 
			
		||||
    {
 | 
			
		||||
        return localIPs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the RTP socket's send buffer size. */
 | 
			
		||||
    void SetRTPSendBuffer(int s)
 | 
			
		||||
    {
 | 
			
		||||
        rtpsendbuf = s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the RTP socket's receive buffer size. */
 | 
			
		||||
    void SetRTPReceiveBuffer(int s)
 | 
			
		||||
    {
 | 
			
		||||
        rtprecvbuf = s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the RTCP socket's send buffer size. */
 | 
			
		||||
    void SetRTCPSendBuffer(int s)
 | 
			
		||||
    {
 | 
			
		||||
        rtcpsendbuf = s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the RTCP socket's receive buffer size. */
 | 
			
		||||
    void SetRTCPReceiveBuffer(int s)
 | 
			
		||||
    {
 | 
			
		||||
        rtcprecvbuf = s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Enables or disables multiplexing RTCP traffic over the RTP channel, so that only a single port is used. */
 | 
			
		||||
    void SetRTCPMultiplexing(bool f)
 | 
			
		||||
    {
 | 
			
		||||
        rtcpmux = f;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Can be used to allow the RTP port base to be any number, not just even numbers. */
 | 
			
		||||
    void SetAllowOddPortbase(bool f)
 | 
			
		||||
    {
 | 
			
		||||
        allowoddportbase = f;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Force the RTCP socket to use a specific port, not necessarily one more than
 | 
			
		||||
     *  the RTP port (set this to zero to disable). */
 | 
			
		||||
    void SetForcedRTCPPort(uint16_t rtcpport)
 | 
			
		||||
    {
 | 
			
		||||
        forcedrtcpport = rtcpport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Use sockets that have already been created, no checks on port numbers
 | 
			
		||||
     *  will be done, and no buffer sizes will be set; you'll need to close
 | 
			
		||||
     *  the sockets yourself when done, it will **not** be done automatically. */
 | 
			
		||||
    void SetUseExistingSockets(SocketType rtpsocket, SocketType rtcpsocket)
 | 
			
		||||
    {
 | 
			
		||||
        rtpsock = rtpsocket;
 | 
			
		||||
        rtcpsock = rtcpsocket;
 | 
			
		||||
        useexistingsockets = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** If non null, the specified abort descriptors will be used to cancel
 | 
			
		||||
     *  the function that's waiting for packets to arrive; set to null (the default
 | 
			
		||||
     *  to let the transmitter create its own instance. */
 | 
			
		||||
    void SetCreatedAbortDescriptors(RTPAbortDescriptors *desc)
 | 
			
		||||
    {
 | 
			
		||||
        m_pAbortDesc = desc;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the RTP socket's send buffer size. */
 | 
			
		||||
    int GetRTPSendBuffer() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtpsendbuf;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the RTP socket's receive buffer size. */
 | 
			
		||||
    int GetRTPReceiveBuffer() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtprecvbuf;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the RTCP socket's send buffer size. */
 | 
			
		||||
    int GetRTCPSendBuffer() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtcpsendbuf;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the RTCP socket's receive buffer size. */
 | 
			
		||||
    int GetRTCPReceiveBuffer() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtcprecvbuf;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns a flag indicating if RTCP traffic will be multiplexed over the RTP channel. */
 | 
			
		||||
    bool GetRTCPMultiplexing() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtcpmux;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** If true, any RTP portbase will be allowed, not just even numbers. */
 | 
			
		||||
    bool GetAllowOddPortbase() const
 | 
			
		||||
    {
 | 
			
		||||
        return allowoddportbase;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** If non-zero, the specified port will be used to receive RTCP traffic. */
 | 
			
		||||
    uint16_t GetForcedRTCPPort() const
 | 
			
		||||
    {
 | 
			
		||||
        return forcedrtcpport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns true and fills in sockets if existing sockets were set
 | 
			
		||||
     *  using RTPUDPv4TransmissionParams::SetUseExistingSockets. */
 | 
			
		||||
    bool GetUseExistingSockets(SocketType &rtpsocket, SocketType &rtcpsocket) const
 | 
			
		||||
    {
 | 
			
		||||
        if (!useexistingsockets)
 | 
			
		||||
            return false;
 | 
			
		||||
        rtpsocket = rtpsock;
 | 
			
		||||
        rtcpsocket = rtcpsock;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** If non-null, this RTPAbortDescriptors instance will be used internally,
 | 
			
		||||
     *  which can be useful when creating your own poll thread for multiple
 | 
			
		||||
     *  sessions. */
 | 
			
		||||
    RTPAbortDescriptors *GetCreatedAbortDescriptors() const
 | 
			
		||||
    {
 | 
			
		||||
        return m_pAbortDesc;
 | 
			
		||||
    }
 | 
			
		||||
private:
 | 
			
		||||
    uint16_t portbase;
 | 
			
		||||
    uint32_t bindIP, mcastifaceIP;
 | 
			
		||||
    std::list<uint32_t> localIPs;
 | 
			
		||||
    uint8_t multicastTTL;
 | 
			
		||||
    int rtpsendbuf, rtprecvbuf;
 | 
			
		||||
    int rtcpsendbuf, rtcprecvbuf;
 | 
			
		||||
    bool rtcpmux;
 | 
			
		||||
    bool allowoddportbase;
 | 
			
		||||
    uint16_t forcedrtcpport;
 | 
			
		||||
 | 
			
		||||
    SocketType rtpsock, rtcpsock;
 | 
			
		||||
    bool useexistingsockets;
 | 
			
		||||
 | 
			
		||||
    RTPAbortDescriptors *m_pAbortDesc;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline RTPUDPv4TransmissionParams::RTPUDPv4TransmissionParams() :
 | 
			
		||||
        RTPTransmissionParams(RTPTransmitter::IPv4UDPProto)
 | 
			
		||||
{
 | 
			
		||||
    portbase = RTPUDPV4TRANS_DEFAULTPORTBASE;
 | 
			
		||||
    bindIP = 0;
 | 
			
		||||
    multicastTTL = 1;
 | 
			
		||||
    mcastifaceIP = 0;
 | 
			
		||||
    rtpsendbuf = RTPUDPV4TRANS_RTPTRANSMITBUFFER;
 | 
			
		||||
    rtprecvbuf = RTPUDPV4TRANS_RTPRECEIVEBUFFER;
 | 
			
		||||
    rtcpsendbuf = RTPUDPV4TRANS_RTCPTRANSMITBUFFER;
 | 
			
		||||
    rtcprecvbuf = RTPUDPV4TRANS_RTCPRECEIVEBUFFER;
 | 
			
		||||
    rtcpmux = false;
 | 
			
		||||
    allowoddportbase = false;
 | 
			
		||||
    forcedrtcpport = 0;
 | 
			
		||||
    useexistingsockets = false;
 | 
			
		||||
    rtpsock = 0;
 | 
			
		||||
    rtcpsock = 0;
 | 
			
		||||
    m_pAbortDesc = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Additional information about the UDP over IPv4 transmitter. */
 | 
			
		||||
class QRTPLIB_API RTPUDPv4TransmissionInfo: public RTPTransmissionInfo
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPUDPv4TransmissionInfo(std::list<uint32_t> iplist, SocketType rtpsock, SocketType rtcpsock, uint16_t rtpport, uint16_t rtcpport) :
 | 
			
		||||
            RTPTransmissionInfo(RTPTransmitter::IPv4UDPProto)
 | 
			
		||||
    {
 | 
			
		||||
        localIPlist = iplist;
 | 
			
		||||
        rtpsocket = rtpsock;
 | 
			
		||||
        rtcpsocket = rtcpsock;
 | 
			
		||||
        m_rtpPort = rtpport;
 | 
			
		||||
        m_rtcpPort = rtcpport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~RTPUDPv4TransmissionInfo()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the list of IPv4 addresses the transmitter considers to be the local IP addresses. */
 | 
			
		||||
    std::list<uint32_t> GetLocalIPList() const
 | 
			
		||||
    {
 | 
			
		||||
        return localIPlist;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the socket descriptor used for receiving and transmitting RTP packets. */
 | 
			
		||||
    SocketType GetRTPSocket() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtpsocket;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the socket descriptor used for receiving and transmitting RTCP packets. */
 | 
			
		||||
    SocketType GetRTCPSocket() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtcpsocket;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the port number that the RTP socket receives packets on. */
 | 
			
		||||
    uint16_t GetRTPPort() const
 | 
			
		||||
    {
 | 
			
		||||
        return m_rtpPort;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the port number that the RTCP socket receives packets on. */
 | 
			
		||||
    uint16_t GetRTCPPort() const
 | 
			
		||||
    {
 | 
			
		||||
        return m_rtcpPort;
 | 
			
		||||
    }
 | 
			
		||||
private:
 | 
			
		||||
    std::list<uint32_t> localIPlist;
 | 
			
		||||
    SocketType rtpsocket, rtcpsocket;
 | 
			
		||||
    uint16_t m_rtpPort, m_rtcpPort;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class RTPUDPv4Trans_GetHashIndex_IPv4Dest
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    static int GetIndex(const RTPIPv4Destination &d)
 | 
			
		||||
    {
 | 
			
		||||
        return d.GetIP() % RTPUDPV4TRANS_HASHSIZE;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class RTPUDPv4Trans_GetHashIndex_uint32_t
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    static int GetIndex(const uint32_t &k)
 | 
			
		||||
    {
 | 
			
		||||
        return k % RTPUDPV4TRANS_HASHSIZE;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define RTPUDPV4TRANS_HEADERSIZE						(20+8)
 | 
			
		||||
 | 
			
		||||
/** An UDP over IPv4 transmission component.
 | 
			
		||||
 *  This class inherits the RTPTransmitter interface and implements a transmission component
 | 
			
		||||
 *  which uses UDP over IPv4 to send and receive RTP and RTCP data. The component's parameters
 | 
			
		||||
 *  are described by the class RTPUDPv4TransmissionParams. The functions which have an RTPAddress
 | 
			
		||||
 *  argument require an argument of RTPIPv4Address. The GetTransmissionInfo member function
 | 
			
		||||
 *  returns an instance of type RTPUDPv4TransmissionInfo.
 | 
			
		||||
 */
 | 
			
		||||
class QRTPLIB_API RTPUDPv4Transmitter: public RTPTransmitter
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPUDPv4Transmitter();
 | 
			
		||||
    ~RTPUDPv4Transmitter();
 | 
			
		||||
 | 
			
		||||
    int Init(bool treadsafe);
 | 
			
		||||
    int Create(std::size_t maxpacksize, const RTPTransmissionParams *transparams);
 | 
			
		||||
    void Destroy();
 | 
			
		||||
    RTPTransmissionInfo *GetTransmissionInfo();
 | 
			
		||||
    void DeleteTransmissionInfo(RTPTransmissionInfo *inf);
 | 
			
		||||
 | 
			
		||||
    int GetLocalHostName(uint8_t *buffer, std::size_t *bufferlength);
 | 
			
		||||
    bool ComesFromThisTransmitter(const RTPAddress *addr);
 | 
			
		||||
    std::size_t GetHeaderOverhead()
 | 
			
		||||
    {
 | 
			
		||||
        return RTPUDPV4TRANS_HEADERSIZE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int Poll();
 | 
			
		||||
    int WaitForIncomingData(const RTPTime &delay, bool *dataavailable = 0);
 | 
			
		||||
    int AbortWait();
 | 
			
		||||
 | 
			
		||||
    int SendRTPData(const void *data, std::size_t len);
 | 
			
		||||
    int SendRTCPData(const void *data, std::size_t len);
 | 
			
		||||
 | 
			
		||||
    int AddDestination(const RTPAddress &addr);
 | 
			
		||||
    int DeleteDestination(const RTPAddress &addr);
 | 
			
		||||
    void ClearDestinations();
 | 
			
		||||
 | 
			
		||||
    bool SupportsMulticasting();
 | 
			
		||||
    int JoinMulticastGroup(const RTPAddress &addr);
 | 
			
		||||
    int LeaveMulticastGroup(const RTPAddress &addr);
 | 
			
		||||
    void LeaveAllMulticastGroups();
 | 
			
		||||
 | 
			
		||||
    int SetReceiveMode(RTPTransmitter::ReceiveMode m);
 | 
			
		||||
    int AddToIgnoreList(const RTPAddress &addr);
 | 
			
		||||
    int DeleteFromIgnoreList(const RTPAddress &addr);
 | 
			
		||||
    void ClearIgnoreList();
 | 
			
		||||
    int AddToAcceptList(const RTPAddress &addr);
 | 
			
		||||
    int DeleteFromAcceptList(const RTPAddress &addr);
 | 
			
		||||
    void ClearAcceptList();
 | 
			
		||||
    int SetMaximumPacketSize(std::size_t s);
 | 
			
		||||
 | 
			
		||||
    bool NewDataAvailable();
 | 
			
		||||
    RTPRawPacket *GetNextPacket();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    int CreateLocalIPList();
 | 
			
		||||
    bool GetLocalIPList_Interfaces();
 | 
			
		||||
    void GetLocalIPList_DNS();
 | 
			
		||||
    void AddLoopbackAddress();
 | 
			
		||||
    void FlushPackets();
 | 
			
		||||
    int PollSocket(bool rtp);
 | 
			
		||||
    int ProcessAddAcceptIgnoreEntry(uint32_t ip, uint16_t port);
 | 
			
		||||
    int ProcessDeleteAcceptIgnoreEntry(uint32_t ip, uint16_t port);
 | 
			
		||||
#ifdef RTP_SUPPORT_IPV4MULTICAST
 | 
			
		||||
    bool SetMulticastTTL(uint8_t ttl);
 | 
			
		||||
#endif // RTP_SUPPORT_IPV4MULTICAST
 | 
			
		||||
    bool ShouldAcceptData(uint32_t srcip, uint16_t srcport);
 | 
			
		||||
    void ClearAcceptIgnoreInfo();
 | 
			
		||||
 | 
			
		||||
    int GetAutoSockets(uint32_t bindIP, bool allowOdd, bool rtcpMux, SocketType *pRtpSock, SocketType *pRtcpSock, uint16_t *pRtpPort, uint16_t *pRtcpPort);
 | 
			
		||||
    static int GetIPv4SocketPort(SocketType s, uint16_t *pPort);
 | 
			
		||||
 | 
			
		||||
    bool init;
 | 
			
		||||
    bool created;
 | 
			
		||||
    bool waitingfordata;
 | 
			
		||||
    SocketType rtpsock, rtcpsock;
 | 
			
		||||
    uint32_t mcastifaceIP;
 | 
			
		||||
    std::list<uint32_t> localIPs;
 | 
			
		||||
    uint16_t m_rtpPort, m_rtcpPort;
 | 
			
		||||
    uint8_t multicastTTL;
 | 
			
		||||
    RTPTransmitter::ReceiveMode receivemode;
 | 
			
		||||
 | 
			
		||||
    uint8_t *localhostname;
 | 
			
		||||
    std::size_t localhostnamelength;
 | 
			
		||||
 | 
			
		||||
    RTPHashTable<const RTPIPv4Destination, RTPUDPv4Trans_GetHashIndex_IPv4Dest, RTPUDPV4TRANS_HASHSIZE> destinations;
 | 
			
		||||
#ifdef RTP_SUPPORT_IPV4MULTICAST
 | 
			
		||||
    RTPHashTable<const uint32_t, RTPUDPv4Trans_GetHashIndex_uint32_t, RTPUDPV4TRANS_HASHSIZE> multicastgroups;
 | 
			
		||||
#endif // RTP_SUPPORT_IPV4MULTICAST
 | 
			
		||||
    std::list<RTPRawPacket*> rawpacketlist;
 | 
			
		||||
 | 
			
		||||
    bool supportsmulticasting;
 | 
			
		||||
    std::size_t maxpacksize;
 | 
			
		||||
 | 
			
		||||
    class PortInfo
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        PortInfo()
 | 
			
		||||
        {
 | 
			
		||||
            all = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool all;
 | 
			
		||||
        std::list<uint16_t> portlist;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    RTPKeyHashTable<const uint32_t, PortInfo*, RTPUDPv4Trans_GetHashIndex_uint32_t, RTPUDPV4TRANS_HASHSIZE> acceptignoreinfo;
 | 
			
		||||
 | 
			
		||||
    bool closesocketswhendone;
 | 
			
		||||
    RTPAbortDescriptors m_abortDesc;
 | 
			
		||||
    RTPAbortDescriptors *m_pAbortDesc; // in case an external one was specified
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#endif // RTPUDPV4TRANSMITTER_H
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,492 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
 This file is a part of JRTPLIB
 | 
			
		||||
 Copyright (c) 1999-2017 Jori Liesenborgs
 | 
			
		||||
 | 
			
		||||
 Contact: jori.liesenborgs@gmail.com
 | 
			
		||||
 | 
			
		||||
 This library was developed at the Expertise Centre for Digital Media
 | 
			
		||||
 (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | 
			
		||||
 (http://www.uhasselt.be). The library is based upon work done for
 | 
			
		||||
 my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | 
			
		||||
 | 
			
		||||
 Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 to deal in the Software without restriction, including without limitation
 | 
			
		||||
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
 The above copyright notice and this permission notice shall be included
 | 
			
		||||
 in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file rtpudpv4transmitternobind.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTPUDPV4TRANSMITTERNOBIND_H
 | 
			
		||||
 | 
			
		||||
#define RTPUDPV4TRANSMITTERNOBIND_H
 | 
			
		||||
 | 
			
		||||
#include "rtpconfig.h"
 | 
			
		||||
#include "rtptransmitter.h"
 | 
			
		||||
#include "rtpipv4destination.h"
 | 
			
		||||
#include "rtphashtable.h"
 | 
			
		||||
#include "rtpkeyhashtable.h"
 | 
			
		||||
#include "rtpsocketutil.h"
 | 
			
		||||
#include "rtpabortdescriptors.h"
 | 
			
		||||
#include <list>
 | 
			
		||||
 | 
			
		||||
#include "util/export.h"
 | 
			
		||||
 | 
			
		||||
#define RTPUDPV4TRANSNOBIND_HASHSIZE							8317
 | 
			
		||||
#define RTPUDPV4TRANSNOBIND_DEFAULTPORTBASE						5000
 | 
			
		||||
 | 
			
		||||
#define RTPUDPV4TRANSNOBIND_RTPRECEIVEBUFFER					32768
 | 
			
		||||
#define RTPUDPV4TRANSNOBIND_RTCPRECEIVEBUFFER					32768
 | 
			
		||||
#define RTPUDPV4TRANSNOBIND_RTPTRANSMITBUFFER					32768
 | 
			
		||||
#define RTPUDPV4TRANSNOBIND_RTCPTRANSMITBUFFER					32768
 | 
			
		||||
 | 
			
		||||
namespace qrtplib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
/** Parameters for the UDP over IPv4 transmitter that does not automatically bind sockets */
 | 
			
		||||
class QRTPLIB_API RTPUDPv4TransmissionNoBindParams: public RTPTransmissionParams
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPUDPv4TransmissionNoBindParams();
 | 
			
		||||
 | 
			
		||||
    /** Sets the IP address which is used to bind the sockets to \c ip. */
 | 
			
		||||
    void SetBindIP(uint32_t ip)
 | 
			
		||||
    {
 | 
			
		||||
        bindIP = ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the multicast interface IP address. */
 | 
			
		||||
    void SetMulticastInterfaceIP(uint32_t ip)
 | 
			
		||||
    {
 | 
			
		||||
        mcastifaceIP = ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the RTP portbase to \c pbase, which has to be an even number
 | 
			
		||||
     *  unless RTPUDPv4TransmissionParams::SetAllowOddPortbase was called;
 | 
			
		||||
     *  a port number of zero will cause a port to be chosen automatically. */
 | 
			
		||||
    void SetPortbase(uint16_t pbase)
 | 
			
		||||
    {
 | 
			
		||||
        portbase = pbase;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the multicast TTL to be used to \c mcastTTL. */
 | 
			
		||||
    void SetMulticastTTL(uint8_t mcastTTL)
 | 
			
		||||
    {
 | 
			
		||||
        multicastTTL = mcastTTL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Passes a list of IP addresses which will be used as the local IP addresses. */
 | 
			
		||||
    void SetLocalIPList(std::list<uint32_t> &iplist)
 | 
			
		||||
    {
 | 
			
		||||
        localIPs = iplist;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Clears the list of local IP addresses.
 | 
			
		||||
     *  Clears the list of local IP addresses. An empty list will make the transmission
 | 
			
		||||
     *  component itself determine the local IP addresses.
 | 
			
		||||
     */
 | 
			
		||||
    void ClearLocalIPList()
 | 
			
		||||
    {
 | 
			
		||||
        localIPs.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the IP address which will be used to bind the sockets. */
 | 
			
		||||
    uint32_t GetBindIP() const
 | 
			
		||||
    {
 | 
			
		||||
        return bindIP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the multicast interface IP address. */
 | 
			
		||||
    uint32_t GetMulticastInterfaceIP() const
 | 
			
		||||
    {
 | 
			
		||||
        return mcastifaceIP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the RTP portbase which will be used (default is 5000). */
 | 
			
		||||
    uint16_t GetPortbase() const
 | 
			
		||||
    {
 | 
			
		||||
        return portbase;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the multicast TTL which will be used (default is 1). */
 | 
			
		||||
    uint8_t GetMulticastTTL() const
 | 
			
		||||
    {
 | 
			
		||||
        return multicastTTL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the list of local IP addresses. */
 | 
			
		||||
    const std::list<uint32_t> &GetLocalIPList() const
 | 
			
		||||
    {
 | 
			
		||||
        return localIPs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the RTP socket's send buffer size. */
 | 
			
		||||
    void SetRTPSendBuffer(int s)
 | 
			
		||||
    {
 | 
			
		||||
        rtpsendbuf = s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the RTP socket's receive buffer size. */
 | 
			
		||||
    void SetRTPReceiveBuffer(int s)
 | 
			
		||||
    {
 | 
			
		||||
        rtprecvbuf = s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the RTCP socket's send buffer size. */
 | 
			
		||||
    void SetRTCPSendBuffer(int s)
 | 
			
		||||
    {
 | 
			
		||||
        rtcpsendbuf = s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Sets the RTCP socket's receive buffer size. */
 | 
			
		||||
    void SetRTCPReceiveBuffer(int s)
 | 
			
		||||
    {
 | 
			
		||||
        rtcprecvbuf = s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Enables or disables multiplexing RTCP traffic over the RTP channel, so that only a single port is used. */
 | 
			
		||||
    void SetRTCPMultiplexing(bool f)
 | 
			
		||||
    {
 | 
			
		||||
        rtcpmux = f;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Can be used to allow the RTP port base to be any number, not just even numbers. */
 | 
			
		||||
    void SetAllowOddPortbase(bool f)
 | 
			
		||||
    {
 | 
			
		||||
        allowoddportbase = f;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Force the RTCP socket to use a specific port, not necessarily one more than
 | 
			
		||||
     *  the RTP port (set this to zero to disable). */
 | 
			
		||||
    void SetForcedRTCPPort(uint16_t rtcpport)
 | 
			
		||||
    {
 | 
			
		||||
        forcedrtcpport = rtcpport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Use sockets that have already been created, no checks on port numbers
 | 
			
		||||
     *  will be done, and no buffer sizes will be set; you'll need to close
 | 
			
		||||
     *  the sockets yourself when done, it will **not** be done automatically. */
 | 
			
		||||
    void SetUseExistingSockets(SocketType rtpsocket, SocketType rtcpsocket)
 | 
			
		||||
    {
 | 
			
		||||
        rtpsock = rtpsocket;
 | 
			
		||||
        rtcpsock = rtcpsocket;
 | 
			
		||||
        useexistingsockets = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** If non null, the specified abort descriptors will be used to cancel
 | 
			
		||||
     *  the function that's waiting for packets to arrive; set to null (the default
 | 
			
		||||
     *  to let the transmitter create its own instance. */
 | 
			
		||||
    void SetCreatedAbortDescriptors(RTPAbortDescriptors *desc)
 | 
			
		||||
    {
 | 
			
		||||
        m_pAbortDesc = desc;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the RTP socket's send buffer size. */
 | 
			
		||||
    int GetRTPSendBuffer() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtpsendbuf;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the RTP socket's receive buffer size. */
 | 
			
		||||
    int GetRTPReceiveBuffer() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtprecvbuf;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the RTCP socket's send buffer size. */
 | 
			
		||||
    int GetRTCPSendBuffer() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtcpsendbuf;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the RTCP socket's receive buffer size. */
 | 
			
		||||
    int GetRTCPReceiveBuffer() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtcprecvbuf;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns a flag indicating if RTCP traffic will be multiplexed over the RTP channel. */
 | 
			
		||||
    bool GetRTCPMultiplexing() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtcpmux;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** If true, any RTP portbase will be allowed, not just even numbers. */
 | 
			
		||||
    bool GetAllowOddPortbase() const
 | 
			
		||||
    {
 | 
			
		||||
        return allowoddportbase;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** If non-zero, the specified port will be used to receive RTCP traffic. */
 | 
			
		||||
    uint16_t GetForcedRTCPPort() const
 | 
			
		||||
    {
 | 
			
		||||
        return forcedrtcpport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns true and fills in sockets if existing sockets were set
 | 
			
		||||
     *  using RTPUDPv4TransmissionParams::SetUseExistingSockets. */
 | 
			
		||||
    bool GetUseExistingSockets(SocketType &rtpsocket, SocketType &rtcpsocket) const
 | 
			
		||||
    {
 | 
			
		||||
        if (!useexistingsockets)
 | 
			
		||||
            return false;
 | 
			
		||||
        rtpsocket = rtpsock;
 | 
			
		||||
        rtcpsocket = rtcpsock;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** If non-null, this RTPAbortDescriptors instance will be used internally,
 | 
			
		||||
     *  which can be useful when creating your own poll thread for multiple
 | 
			
		||||
     *  sessions. */
 | 
			
		||||
    RTPAbortDescriptors *GetCreatedAbortDescriptors() const
 | 
			
		||||
    {
 | 
			
		||||
        return m_pAbortDesc;
 | 
			
		||||
    }
 | 
			
		||||
private:
 | 
			
		||||
    uint16_t portbase;
 | 
			
		||||
    uint32_t bindIP, mcastifaceIP;
 | 
			
		||||
    std::list<uint32_t> localIPs;
 | 
			
		||||
    uint8_t multicastTTL;
 | 
			
		||||
    int rtpsendbuf, rtprecvbuf;
 | 
			
		||||
    int rtcpsendbuf, rtcprecvbuf;
 | 
			
		||||
    bool rtcpmux;
 | 
			
		||||
    bool allowoddportbase;
 | 
			
		||||
    uint16_t forcedrtcpport;
 | 
			
		||||
 | 
			
		||||
    SocketType rtpsock, rtcpsock;
 | 
			
		||||
    bool useexistingsockets;
 | 
			
		||||
 | 
			
		||||
    RTPAbortDescriptors *m_pAbortDesc;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline RTPUDPv4TransmissionNoBindParams::RTPUDPv4TransmissionNoBindParams() :
 | 
			
		||||
        RTPTransmissionParams(RTPTransmitter::IPv4UDPProto)
 | 
			
		||||
{
 | 
			
		||||
    portbase = RTPUDPV4TRANSNOBIND_DEFAULTPORTBASE;
 | 
			
		||||
    bindIP = 0;
 | 
			
		||||
    multicastTTL = 1;
 | 
			
		||||
    mcastifaceIP = 0;
 | 
			
		||||
    rtpsendbuf = RTPUDPV4TRANSNOBIND_RTPTRANSMITBUFFER;
 | 
			
		||||
    rtprecvbuf = RTPUDPV4TRANSNOBIND_RTPRECEIVEBUFFER;
 | 
			
		||||
    rtcpsendbuf = RTPUDPV4TRANSNOBIND_RTCPTRANSMITBUFFER;
 | 
			
		||||
    rtcprecvbuf = RTPUDPV4TRANSNOBIND_RTCPRECEIVEBUFFER;
 | 
			
		||||
    rtcpmux = false;
 | 
			
		||||
    allowoddportbase = false;
 | 
			
		||||
    forcedrtcpport = 0;
 | 
			
		||||
    useexistingsockets = false;
 | 
			
		||||
    rtpsock = 0;
 | 
			
		||||
    rtcpsock = 0;
 | 
			
		||||
    m_pAbortDesc = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Additional information about the UDP over IPv4 transmitter that does not automatically bind sockets. */
 | 
			
		||||
class QRTPLIB_API RTPUDPv4TransmissionNoBindInfo: public RTPTransmissionInfo
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPUDPv4TransmissionNoBindInfo(const QHostAddress& ip, SocketType rtpsock, SocketType rtcpsock, uint16_t rtpport, uint16_t rtcpport) :
 | 
			
		||||
            RTPTransmissionInfo(RTPTransmitter::IPv4UDPProto)
 | 
			
		||||
    {
 | 
			
		||||
        localIP = ip;
 | 
			
		||||
        rtpsocket = rtpsock;
 | 
			
		||||
        rtcpsocket = rtcpsock;
 | 
			
		||||
        m_rtpPort = rtpport;
 | 
			
		||||
        m_rtcpPort = rtcpport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~RTPUDPv4TransmissionNoBindInfo()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the list of IPv4 addresses the transmitter considers to be the local IP addresses. */
 | 
			
		||||
    QHostAddress GetLocalIP() const
 | 
			
		||||
    {
 | 
			
		||||
        return localIP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the socket descriptor used for receiving and transmitting RTP packets. */
 | 
			
		||||
    SocketType GetRTPSocket() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtpsocket;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the socket descriptor used for receiving and transmitting RTCP packets. */
 | 
			
		||||
    SocketType GetRTCPSocket() const
 | 
			
		||||
    {
 | 
			
		||||
        return rtcpsocket;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the port number that the RTP socket receives packets on. */
 | 
			
		||||
    uint16_t GetRTPPort() const
 | 
			
		||||
    {
 | 
			
		||||
        return m_rtpPort;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Returns the port number that the RTCP socket receives packets on. */
 | 
			
		||||
    uint16_t GetRTCPPort() const
 | 
			
		||||
    {
 | 
			
		||||
        return m_rtcpPort;
 | 
			
		||||
    }
 | 
			
		||||
private:
 | 
			
		||||
    QHostAddress localIP;
 | 
			
		||||
    SocketType rtpsocket, rtcpsocket;
 | 
			
		||||
    uint16_t m_rtpPort, m_rtcpPort;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class RTPUDPv4TransNoBind_GetHashIndex_IPv4Dest
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    static int GetIndex(const RTPIPv4Destination &d)
 | 
			
		||||
    {
 | 
			
		||||
        return d.GetIP() % RTPUDPV4TRANSNOBIND_HASHSIZE;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class RTPUDPv4TransNoBind_GetHashIndex_uint32_t
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    static int GetIndex(const uint32_t &k)
 | 
			
		||||
    {
 | 
			
		||||
        return k % RTPUDPV4TRANSNOBIND_HASHSIZE;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define RTPUDPV4TRANSNOBIND_HEADERSIZE						(20+8)
 | 
			
		||||
 | 
			
		||||
/** An UDP over IPv4 transmission component.
 | 
			
		||||
 *  This class inherits the RTPTransmitter interface and implements a transmission component
 | 
			
		||||
 *  which uses UDP over IPv4 to send and receive RTP and RTCP data. The component's parameters
 | 
			
		||||
 *  are described by the class RTPUDPv4TransmissionNoBindParams. The functions which have an RTPAddress
 | 
			
		||||
 *  argument require an argument of RTPIPv4Address. The GetTransmissionInfo member function
 | 
			
		||||
 *  returns an instance of type RTPUDPv4TransmissionNoBindInfo.
 | 
			
		||||
 *  This flavor of a RTPUDPv4Transmitter class does not automatically bind sockets. Use the
 | 
			
		||||
 *  BindSockets method to do so.
 | 
			
		||||
 */
 | 
			
		||||
class QRTPLIB_API RTPUDPv4TransmitterNoBind: public RTPTransmitter
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    RTPUDPv4TransmitterNoBind();
 | 
			
		||||
    ~RTPUDPv4TransmitterNoBind();
 | 
			
		||||
 | 
			
		||||
    int Init(bool treadsafe);
 | 
			
		||||
    int Create(std::size_t maxpacksize, const RTPTransmissionParams *transparams);
 | 
			
		||||
    /** Bind the RTP and RTCP sockets to ports defined in the transmission parameters */
 | 
			
		||||
    int BindSockets(const RTPTransmissionParams *transparams);
 | 
			
		||||
    void Destroy();
 | 
			
		||||
    RTPTransmissionInfo *GetTransmissionInfo();
 | 
			
		||||
    void DeleteTransmissionInfo(RTPTransmissionInfo *inf);
 | 
			
		||||
 | 
			
		||||
    int GetLocalHostName(uint8_t *buffer, std::size_t *bufferlength);
 | 
			
		||||
    bool ComesFromThisTransmitter(const RTPAddress *addr);
 | 
			
		||||
    std::size_t GetHeaderOverhead()
 | 
			
		||||
    {
 | 
			
		||||
        return RTPUDPV4TRANSNOBIND_HEADERSIZE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int Poll();
 | 
			
		||||
    int WaitForIncomingData(const RTPTime &delay, bool *dataavailable = 0);
 | 
			
		||||
    int AbortWait();
 | 
			
		||||
 | 
			
		||||
    int SendRTPData(const void *data, std::size_t len);
 | 
			
		||||
    int SendRTCPData(const void *data, std::size_t len);
 | 
			
		||||
 | 
			
		||||
    int AddDestination(const RTPAddress &addr);
 | 
			
		||||
    int DeleteDestination(const RTPAddress &addr);
 | 
			
		||||
    void ClearDestinations();
 | 
			
		||||
 | 
			
		||||
    bool SupportsMulticasting();
 | 
			
		||||
    int JoinMulticastGroup(const RTPAddress &addr);
 | 
			
		||||
    int LeaveMulticastGroup(const RTPAddress &addr);
 | 
			
		||||
    void LeaveAllMulticastGroups();
 | 
			
		||||
 | 
			
		||||
    int SetReceiveMode(RTPTransmitter::ReceiveMode m);
 | 
			
		||||
    int AddToIgnoreList(const RTPAddress &addr);
 | 
			
		||||
    int DeleteFromIgnoreList(const RTPAddress &addr);
 | 
			
		||||
    void ClearIgnoreList();
 | 
			
		||||
    int AddToAcceptList(const RTPAddress &addr);
 | 
			
		||||
    int DeleteFromAcceptList(const RTPAddress &addr);
 | 
			
		||||
    void ClearAcceptList();
 | 
			
		||||
    int SetMaximumPacketSize(std::size_t s);
 | 
			
		||||
 | 
			
		||||
    bool NewDataAvailable();
 | 
			
		||||
    RTPRawPacket *GetNextPacket();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    int CreateLocalIPList();
 | 
			
		||||
    bool GetLocalIPList_Interfaces();
 | 
			
		||||
    void GetLocalIPList_DNS();
 | 
			
		||||
    void AddLoopbackAddress();
 | 
			
		||||
    void FlushPackets();
 | 
			
		||||
    int PollSocket(bool rtp);
 | 
			
		||||
    int ProcessAddAcceptIgnoreEntry(uint32_t ip, uint16_t port);
 | 
			
		||||
    int ProcessDeleteAcceptIgnoreEntry(uint32_t ip, uint16_t port);
 | 
			
		||||
#ifdef RTP_SUPPORT_IPV4MULTICAST
 | 
			
		||||
    bool SetMulticastTTL(uint8_t ttl);
 | 
			
		||||
#endif // RTP_SUPPORT_IPV4MULTICAST
 | 
			
		||||
    bool ShouldAcceptData(uint32_t srcip, uint16_t srcport);
 | 
			
		||||
    void ClearAcceptIgnoreInfo();
 | 
			
		||||
 | 
			
		||||
    int GetAutoSockets(uint32_t bindIP, bool allowOdd, bool rtcpMux, SocketType *pRtpSock, SocketType *pRtcpSock, uint16_t *pRtpPort, uint16_t *pRtcpPort);
 | 
			
		||||
    static int GetIPv4SocketPort(SocketType s, uint16_t *pPort);
 | 
			
		||||
 | 
			
		||||
    bool init;
 | 
			
		||||
    bool created;
 | 
			
		||||
    bool waitingfordata;
 | 
			
		||||
    SocketType rtpsock, rtcpsock;
 | 
			
		||||
    uint32_t mcastifaceIP;
 | 
			
		||||
    std::list<uint32_t> localIPs;
 | 
			
		||||
    uint16_t m_rtpPort, m_rtcpPort;
 | 
			
		||||
    uint8_t multicastTTL;
 | 
			
		||||
    RTPTransmitter::ReceiveMode receivemode;
 | 
			
		||||
 | 
			
		||||
    uint8_t *localhostname;
 | 
			
		||||
    std::size_t localhostnamelength;
 | 
			
		||||
 | 
			
		||||
    RTPHashTable<const RTPIPv4Destination, RTPUDPv4TransNoBind_GetHashIndex_IPv4Dest, RTPUDPV4TRANSNOBIND_HASHSIZE> destinations;
 | 
			
		||||
#ifdef RTP_SUPPORT_IPV4MULTICAST
 | 
			
		||||
    RTPHashTable<const uint32_t, RTPUDPv4TransNoBind_GetHashIndex_uint32_t, RTPUDPV4TRANSNOBIND_HASHSIZE> multicastgroups;
 | 
			
		||||
#endif // RTP_SUPPORT_IPV4MULTICAST
 | 
			
		||||
    std::list<RTPRawPacket*> rawpacketlist;
 | 
			
		||||
 | 
			
		||||
    bool supportsmulticasting;
 | 
			
		||||
    std::size_t maxpacksize;
 | 
			
		||||
 | 
			
		||||
    class PortInfo
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        PortInfo()
 | 
			
		||||
        {
 | 
			
		||||
            all = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool all;
 | 
			
		||||
        std::list<uint16_t> portlist;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    RTPKeyHashTable<const uint32_t, PortInfo*, RTPUDPv4TransNoBind_GetHashIndex_uint32_t, RTPUDPV4TRANSNOBIND_HASHSIZE> acceptignoreinfo;
 | 
			
		||||
 | 
			
		||||
    bool closesocketswhendone;
 | 
			
		||||
    RTPAbortDescriptors m_abortDesc;
 | 
			
		||||
    RTPAbortDescriptors *m_pAbortDesc; // in case an external one was specified
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // end namespace
 | 
			
		||||
 | 
			
		||||
#endif // RTPUDPV4TRANSMITTERNOBIND_H
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user