Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
JRTPLIB Run Test
#include "rtpsession.h"
#include "rtppacket.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtpsessionparams.h"
#include "rtperrors.h"
#include "rtpmemorymanager.h"
#ifndef WIN32
#include <netinet/in.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#endif // WIN32
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
using namespace jrtplib;
using namespace std::chrono;
void checkerror(int rtperr)
{
if (rtperr < 0)
{
std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
exit(-1);
}
}
int main(int argc, char** argv)
{
#ifdef WIN32
WSADATA dat;
WSAStartup(MAKEWORD(2, 2), &dat);
#endif // WIN32
//引数が足りない時は使い方を表示
if (argc <= 2)
{
std::cout << "Usage:\njrtpdriver destip destport srcport" << std::endl;
return 0;
}
RTPSession sess;
uint16_t portbase, destport;
uint32_t destip;
int status;
#ifndef WIN32
destip = inet_addr(argv[1]);
#else
{
struct in_addr addr;
InetPtonA(AF_INET, argv[1], &addr);
destip = addr.S_un.S_addr;
}
#endif
//変なIPアドレスだよ
if (destip == INADDR_NONE)
{
std::cerr << "Bad IP address specified" << std::endl;
return -1;
}
//ネットワークバイトオーダーへ変換
destip = ntohl(destip);
//ポートを数値へ変換
destport = static_cast<uint16_t>(std::stoi(argv[2]));
portbase = static_cast<uint16_t>(std::stoi(argv[3]));
RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;
//RTCPも使って正確に同期を取りたい時に使う値 ここでは使わないけど一応設定
sessparams.SetOwnTimestampUnit(1.0 / 10.0);
//よくわかんないけど例にあるのでtrue
sessparams.SetAcceptOwnPackets(true);
//RTPUDP以下略のインスタンスにportを設定 ここで設定したポートが送信時に使われる
transparams.SetPortbase(portbase);
//RTPSessionのインスタンスに値を設定
status = sess.Create(sessparams, &transparams);
checkerror(status);
//アドレスに関する値を設定
RTPIPv4Address addr(destip, destport);
//RTPSessionインスタンスに適用 これで通信が開始される
status = sess.AddDestination(addr);
checkerror(status);
std::cout << "start RTP..." << std::endl;
int n = 0;
//死にたいときはCtrl+Cとかで死んでね☆
while (true)
{
//データを送る 数字も入れてみたりする
std::string buf = std::to_string(n) + ":Hello World!!!!!!!!!!!!!";
++n;
status = sess.SendPacket(buf.c_str(), buf.length(), 0, false, 10);
checkerror(status);
//JRTPTHREADを使う場合はこれがいらないらしい 今回は使ってないので必要
sess.Poll();
//パケットデータを取得するときはこいつを実行してバッファをブロッキングする
sess.BeginDataAccess();
if (sess.GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
while ((pack = sess.GetNextPacket()) != nullptr)
{
//受信したパケットの内容を知りたい場合はGetPayloadData()を使う
char* p = reinterpret_cast<char*>(pack->GetPayloadData());
//パケットの長さを知るにはGetPayloadLength()を使う なんでvectorとかじゃなかったんだろう
std::string recv_str(p, p + pack->GetPayloadLength() - 1);
//受信したデータを表示
std::cout << recv_str << std::endl;
//使い終わったパケットはDeleteしましょう
sess.DeletePacket(pack);
}
} while (sess.GotoNextSourceWithData());
}
//データ取得を終了するときはこいつでブロッキングを解除
sess.EndDataAccess();
//0.5秒待つ
std::this_thread::sleep_for(milliseconds(500));
}
sess.BYEDestroy(RTPTime(10, 0), 0, 0);
#ifdef WIN32
WSACleanup();
#endif // WIN32
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment