diff options
Diffstat (limited to 'examples/example4.cpp')
-rw-r--r-- | examples/example4.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/examples/example4.cpp b/examples/example4.cpp new file mode 100644 index 0000000..56d03f5 --- /dev/null +++ b/examples/example4.cpp @@ -0,0 +1,144 @@ +/* + This IPv4 example uses the background thread itself to process all packets. + You can use example one to send data to the session that's created in this + example. +*/ + +#include "rtpsession.h" +#include "rtppacket.h" +#include "rtpudpv4transmitter.h" +#include "rtpipv4address.h" +#include "rtpsessionparams.h" +#include "rtperrors.h" +#ifndef WIN32 + #include <netinet/in.h> + #include <arpa/inet.h> +#else + #include <winsock2.h> +#endif // WIN32 +#include "rtpsourcedata.h" +#include <stdlib.h> +#include <stdio.h> +#include <iostream> +#include <string> + +#ifdef RTP_SUPPORT_THREAD + +// +// This function checks if there was a RTP error. If so, it displays an error +// message and exists. +// + +void checkerror(int rtperr) +{ + if (rtperr < 0) + { + std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl; + exit(-1); + } +} + +// +// The new class routine +// + +class MyRTPSession : public RTPSession +{ +protected: + void OnPollThreadStep(); + void ProcessRTPPacket(const RTPSourceData &srcdat,const RTPPacket &rtppack); +}; + +void MyRTPSession::OnPollThreadStep() +{ + BeginDataAccess(); + + // check incoming packets + if (GotoFirstSourceWithData()) + { + do + { + RTPPacket *pack; + RTPSourceData *srcdat; + + srcdat = GetCurrentSourceInfo(); + + while ((pack = GetNextPacket()) != NULL) + { + ProcessRTPPacket(*srcdat,*pack); + DeletePacket(pack); + } + } while (GotoNextSourceWithData()); + } + + EndDataAccess(); +} + +void MyRTPSession::ProcessRTPPacket(const RTPSourceData &srcdat,const RTPPacket &rtppack) +{ + // You can inspect the packet and the source's info here + std::cout << "Got packet " << rtppack.GetExtendedSequenceNumber() << " from SSRC " << srcdat.GetSSRC() << std::endl; +} + +// +// The main routine +// + +int main(void) +{ +#ifdef WIN32 + WSADATA dat; + WSAStartup(MAKEWORD(2,2),&dat); +#endif // WIN32 + + MyRTPSession sess; + uint16_t portbase; + std::string ipstr; + int status,num; + + // First, we'll ask for the necessary information + + std::cout << "Enter local portbase:" << std::endl; + std::cin >> portbase; + std::cout << std::endl; + + std::cout << std::endl; + std::cout << "Number of seconds you wish to wait:" << std::endl; + std::cin >> num; + + // Now, we'll create a RTP session, set the destination + // and poll for incoming data. + + RTPUDPv4TransmissionParams transparams; + RTPSessionParams sessparams; + + // IMPORTANT: The local timestamp unit MUST be set, otherwise + // RTCP Sender Report info will be calculated wrong + // In this case, we'll be just use 8000 samples per second. + sessparams.SetOwnTimestampUnit(1.0/8000.0); + + transparams.SetPortbase(portbase); + status = sess.Create(sessparams,&transparams); + checkerror(status); + + // Wait a number of seconds + RTPTime::Wait(RTPTime(num,0)); + + sess.BYEDestroy(RTPTime(10,0),0,0); + +#ifdef WIN32 + WSACleanup(); +#endif // WIN32 + return 0; +} + +#else + +int main(void) +{ + std::cerr << "Thread support is required for this example" << std::endl; + return 0; +} + +#endif // RTP_SUPPORT_THREAD + |