File: pcm_rtp_test.pl

package info (click to toggle)
rtpengine 13.5.1.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,676 kB
  • sloc: ansic: 86,775; perl: 59,422; python: 3,193; sh: 1,037; makefile: 687; asm: 211
file content (59 lines) | stat: -rwxr-xr-x 1,437 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/usr/bin/perl

use strict;
use warnings;
use IPC::Open3;
use IO::Socket;
use IO::Socket::IP;

my $laddr = shift or die;
my $lport = shift or die;
my $raddr = shift or die;
my $rport = shift or die;

my $sock = IO::Socket::IP->new(Type => &SOCK_DGRAM, Proto => 'udp',
		LocalHost => $laddr, LocalPort => $lport,
		PeerHost => $raddr, PeerPort => $rport,
	)
		or die;

my ($src, $sink);
my $pid = open3($sink, $src, '>&STDERR', @ARGV) or die;

my ($playsrc, $playsink);
open($playsrc, '|-', qw(play -q -c 1 -e a-law -r 8000 -t raw -)) or die;
open($playsink, '|-', qw(play -q -c 1 -e a-law -r 8000 -t raw -)) or die;

my $lseq = rand(65536);
my $lssrc = rand(65536);
my $lts = rand(2*32);
my $lpt = 8; # PCMA
my $lmark = 0x80;
my $rseq = -1;
my $rts = -1;

while (1) {
	my $buf;

	last unless sysread($src, $buf = '', 160);
	syswrite($playsrc, $buf);

	my $rtp = pack('CCnNN a*', 0x80, $lpt | $lmark, $lseq, $lts, $lssrc, $buf);
	last unless $sock->syswrite($rtp) or last;
	$lseq++;
	$lts += 160;
	$lmark = 0x00;

	last unless $sock->sysread($buf = '', 0xffff);

	my ($ver, $rpt, $seq, $ts, $rssrc, $payload) = unpack('CCnNN a*', $buf);
	die unless length($payload) == 160;
	die unless ($rpt & 0x7f) == $lpt;
	die unless ($rseq == -1 || (($rseq + 1) & 0xffff) == $seq);
	die unless ($rts == -1 || (($rts + 160) & 0xffffffff) == $ts);
	syswrite($playsink, $payload);
	$rseq = $seq;
	$rts = $ts;

	last unless syswrite($sink, $payload);
}