mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-11-02 13:03:33 +00:00
This patch adds optional parameters to pass the state file, the
destination address (default 127.0.0.1), the destination port
(default 4000), the source port (default 0). So it is called as
follows:
gst rtp_replay.st -a [FILE [HOST [SOURCEPORT [DESTPORT]]]]
In addition, nonexistant FILEs are no longer created but opened
read-only instead.
Sponsored-by: On-Waves ehf
119 lines
3.1 KiB
Smalltalk
119 lines
3.1 KiB
Smalltalk
"
|
|
Simple UDP replay from the state files
|
|
"
|
|
|
|
PackageLoader fileInPackage: #Sockets.
|
|
|
|
Object subclass: SDPUtils [
|
|
"Look into using PetitParser."
|
|
SDPUtils class >> findPort: aSDP [
|
|
aSDP linesDo: [:line |
|
|
(line startsWith: 'm=audio ') ifTrue: [
|
|
| stream |
|
|
stream := line readStream
|
|
skip: 'm=audio ' size;
|
|
yourself.
|
|
^ Number readFrom: stream.
|
|
]
|
|
].
|
|
|
|
^ self error: 'Not found'.
|
|
]
|
|
|
|
SDPUtils class >> findHost: aSDP [
|
|
aSDP linesDo: [:line |
|
|
(line startsWith: 'c=IN IP4 ') ifTrue: [
|
|
| stream |
|
|
^ stream := line readStream
|
|
skip: 'c=IN IP4 ' size;
|
|
upToEnd.
|
|
]
|
|
].
|
|
|
|
^ self error: 'Not found'.
|
|
]
|
|
]
|
|
|
|
Object subclass: RTPReplay [
|
|
| filename socket |
|
|
RTPReplay class >> on: aFile [
|
|
^ self new
|
|
initialize;
|
|
file: aFile; yourself
|
|
]
|
|
|
|
RTPReplay class >> on: aFile fromPort: aPort [
|
|
^ self new
|
|
initialize: aPort;
|
|
file: aFile; yourself
|
|
]
|
|
|
|
initialize [
|
|
self initialize: 0.
|
|
]
|
|
|
|
initialize: aPort [
|
|
socket := Sockets.DatagramSocket local: '0.0.0.0' port: aPort.
|
|
]
|
|
|
|
file: aFile [
|
|
filename := aFile
|
|
]
|
|
|
|
localPort [
|
|
^ socket port
|
|
]
|
|
|
|
streamAudio: aHost port: aPort [
|
|
| file last_time last_image udp_send dest |
|
|
|
|
last_time := nil.
|
|
last_image := nil.
|
|
file := FileStream open: filename mode: #read.
|
|
|
|
"Send the payload"
|
|
dest := Sockets.SocketAddress byName: aHost.
|
|
udp_send := [:payload | | datagram |
|
|
datagram := Sockets.Datagram data: payload contents address: dest port: aPort.
|
|
socket nextPut: datagram
|
|
].
|
|
|
|
[file atEnd] whileFalse: [
|
|
| lineStream time data now_image |
|
|
lineStream := file nextLine readStream.
|
|
|
|
"Read the time, skip the blank, parse the data"
|
|
time := Number readFrom: lineStream.
|
|
lineStream skip: 1.
|
|
|
|
data := WriteStream on: (ByteArray new: 30).
|
|
[lineStream atEnd] whileFalse: [
|
|
| hex |
|
|
hex := lineStream next: 2.
|
|
data nextPut: (Number readFrom: hex readStream radix: 16).
|
|
].
|
|
|
|
last_time isNil
|
|
ifTrue: [
|
|
"First time, send it right now"
|
|
last_time := time.
|
|
last_image := Time millisecondClockValue.
|
|
udp_send value: data.
|
|
]
|
|
ifFalse: [
|
|
| wait_image new_image_time |
|
|
|
|
"How long to wait?"
|
|
wait_image := last_image + ((time - last_time) * 1000).
|
|
[ wait_image > Time millisecondClockValue ]
|
|
whileTrue: [Processor yield].
|
|
|
|
udp_send value: data.
|
|
last_time := time.
|
|
last_image := wait_image.
|
|
]
|
|
]
|
|
]
|
|
]
|
|
|