It's great to see that rtpengine now supports transcoding. I always watched rtpproxy (for so many years) to see when it might happen.
I have some questions. I could not find on ffmpeg.org specific mention of:
-advanced audio jitter buffer capability -advanced RTP related RFCs, eg. RFC 8108 -advanced codec capability, eg. G711 Appendix II (DTX and CNG)
In particular, it's not clear to me where jitter buffer and RTP RFCs are handled -- inside rtpgengine or ffmpeg. I don't see any mention of jitter buffer on the rtpengine web and github pages. In general ffmpeg's focus is on content delivery and not bidirectional real-time communication. My questions:
1) Is there an rtpengine-ffmpeg software architecture or data flow diagram available ?
2) Is it possible to connect libraries besides ffmpeg to the "other side" of rtpengine ? For example, using the rtpengine interface, send and receive a UDP/RTP packet stream to/from a third-party library and let it handle jitter buffer, encoding/decoding, ptime mismatch (transrating), and more ?
3) If architecturally that's a do-able thing, is there a spec on how rtpengine is currently interfacing to ffmpeg ? Which APIs are being used ? (I assume the command line interface is not being used). Re. ffmpeg APIs I found this:
but maybe there is something more recent or rtpengine source code we can look at.
Thanks.
-Jeff
On 2018-02-20 04:45 PM, Jeff Brower wrote:
It's great to see that rtpengine now supports transcoding. I always watched rtpproxy (for so many years) to see when it might happen.
I have some questions. I could not find on ffmpeg.org specific mention of:
-advanced audio jitter buffer capability
For the time being, rtpengine does not try to play nice on jitter. Audio data is decoded as soon as it arrives, passed to the encoder, and encoded data is sent out as soon as it's available. Depending on which codecs and packet sizes are involved, this may turn out transparent jitter-wise, or it may introduce considerable additional jitter. Dealing with jitter is thus left up to the endpoints.
-advanced RTP related RFCs, eg. RFC 8108
This would have to be handled in rtpengine itself and isn't directly related to transcoding.
-advanced codec capability, eg. G711 Appendix II (DTX and CNG)
This would also have to be handled in rtpengine as ffmpeg doesn't really support G.711 per se, but rather supports PCM a-Law und ยต-Law as raw audio codecs. RFC 4733 will be handled in the near future.
In particular, it's not clear to me where jitter buffer and RTP RFCs are handled -- inside rtpgengine or ffmpeg. I don't see any mention of jitter buffer on the rtpengine web and github pages. In general ffmpeg's focus is on content delivery and not bidirectional real-time communication.
While I do believe that ffmpeg supports RTP in some way, this is not used by rtpengine -- ffmpeg is used only for raw codec support (and resampling).
- Is there an rtpengine-ffmpeg software architecture or data flow diagram available ?
No, but you're welcome to submit one. :)
- Is it possible to connect libraries besides ffmpeg to the "other side" of rtpengine ? For example, using the rtpengine interface, send and
receive a UDP/RTP packet stream to/from a third-party library and let it handle jitter buffer, encoding/decoding, ptime mismatch (transrating), and more ?
Well, it's just software, so anything is possible, right? :)
While this wasn't something we had on the radar when implementing this, I don't see why such a tie-in shouldn't be possible. At least non-ffmpeg codecs can be tied in relatively easily, which is what we did with bcg729.
- If architecturally that's a do-able thing, is there a spec on how rtpengine is currently interfacing to ffmpeg ? Which APIs are being used ? (I
assume the command line interface is not being used). Re. ffmpeg APIs I found this:
but maybe there is something more recent or rtpengine source code we can look at.
The most relevant API is the avcodec API, described at https://ffmpeg.org/doxygen/trunk/avcodec_8h.html together with the related structures (AVFrame and AVPacket).
Also used is avresample/swresample from https://ffmpeg.org/doxygen/trunk/avresample_8h.html and the audio FIFO API https://ffmpeg.org/doxygen/trunk/audio__fifo_8h.html
The guts of how rtpengine ties into avcodec are https://github.com/sipwise/rtpengine/blob/master/lib/codeclib.c and most of the interfaces to the rest of rtpengine (SDP and control stuff) are at https://github.com/sipwise/rtpengine/blob/master/daemon/codec.c
HTH Cheers