summaryrefslogtreecommitdiffstats
path: root/examples/example4.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/example4.cpp')
-rw-r--r--examples/example4.cpp144
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
+