2#include "AudioTools/AudioCodecs/AudioCodecsBase.h"
3#include "AudioTools/CoreAudio/AudioStreams.h"
4#include "AudioTools/CoreAudio/AudioTypes.h"
5#include "RTSPPlatform.h"
8#define DEFAULT_PCM_FRAGMENT_SIZE 640
44 virtual const char *format(
char *buffer,
int len) = 0;
47 virtual int convert(
void *data,
int sampleCount) {
return sampleCount; }
50 virtual void begin(
AudioInfo info) { cfg = info; }
54 virtual AudioInfo audioInfo() {
return cfg; }
56 virtual const char *name() {
return name_str; }
58 void setName(
const char *name) { name_str = name; }
69 int samples_per_fragment =
71 return samples_per_fragment;
88 virtual bool useRfc2250Header()
const {
return false; }
91 const char *STD_URL_PRE_SUFFIX =
"trackID";
93 int fragment_size = DEFAULT_PCM_FRAGMENT_SIZE;
94 int timer_period_us = 10000;
95 AudioInfo cfg{16000, 1, 16};
96 const char *name_str =
"RTSPAudioTools";
140 const char *
format(
char *buffer,
int len)
override {
141 snprintf(buffer, len,
143 "c=IN IP4 0.0.0.0\r\n"
145 "m=audio 0 RTP/AVP %d\r\n"
149 LOGI(
"ftsp format: %s", buffer);
150 return (
const char *)buffer;
161 int16_t *pt_16 = (int16_t *)data;
162 for (
int j = 0; j < samples / 2; j++) {
163 pt_16[j] = htons(pt_16[j]);
170 AudioInfo defaultConfig()
override {
return AudioInfo(16000, 1, 16); }
174 switch (channels()) {
182 LOGE(
"unsupported audio type");
189 char payload_fromat[30];
192 int channels() {
return cfg.
channels; }
205 (samples_per_fragment * 1000000) / cfg.
sample_rate;
212 const char *payloadFormat() {
213 switch (channels()) {
216 sampleRate(), channels());
220 sampleRate(), channels());
223 LOGE(
"unsupported audio type");
226 return payload_fromat;
244 p_encoder = &encoder;
252 const char *format(
char *buffer,
int len)
override {
254 snprintf(buffer, len,
256 "c=IN IP4 0.0.0.0\r\n"
258 "m=audio 0 RTP/AVP 101\r\n"
259 "a=rtpmap:101 opus/%d/2\r\n"
260 "a=fmtp:101 stereo=1; sprop-stereo=%d\r\n",
262 return (
const char *)buffer;
264 AudioInfo defaultConfig() {
265 AudioInfo cfg(48000, 2, 16);
269 void begin(AudioInfo info)
override {
270 RTSPFormat::begin(info);
272 if (p_encoder !=
nullptr) {
279 AudioEncoder *p_encoder =
nullptr;
298 const char *format(
char *buffer,
int len)
override {
300 snprintf(buffer, len,
302 "c=IN IP4 0.0.0.0\r\n"
304 "m=audio 0 RTP/AVP 98\r\n"
305 "a=rtpmap:98 aptx/%d/%d\r\n"
306 "a=fmtp:98 variant=standard; bitresolution=%d\r\n",
308 return (
const char *)buffer;
316 RTSPFormat::begin(info);
321 int period = (samplesPerFragment * 1000000) / cfg.
sample_rate;
340 const char *
format(
char *buffer,
int len)
override {
345 snprintf(buffer, len,
347 "c=IN IP4 0.0.0.0\r\n"
349 "m=audio 0 RTP/AVP 3\r\n"
352 return (
const char *)buffer;
376 const char *
format(
char *buffer,
int len)
override {
384 "c=IN IP4 0.0.0.0\r\n"
386 "m=audio 0 RTP/AVP %d\r\n"
388 name(), getFormat());
389 return (
const char *)buffer;
402 uint8_t getFormat() {
return is_ulaw ? 0 : 8; }
417 const char *format(
char *buffer,
int len)
override {
419 snprintf(buffer, len,
421 "c=IN IP4 0.0.0.0\r\n"
423 "m=audio 0 RTP/AVP 96\r\n"
424 "a=rtpmap:96 l8/%d/%d\r\n",
426 return (
const char *)buffer;
434 RTSPFormat::begin(info);
437 int bytesPerSample = 1;
439 int period = (samplesPerFragment * 1000000) / cfg.
sample_rate;
465template <
class AudioEncoder>
473 p_encoder = &encoder;
486 const char *format(
char *buffer,
int len)
override {
490 int payload_type = 5;
505 LOGE(
"Unsupported sample rate for IMA ADPCM: %d", sr);
510 snprintf(buffer, len,
512 "c=IN IP4 0.0.0.0\r\n"
514 "m=audio 0 RTP/AVP %d\r\n"
515 "a=rtpmap:%d DVI4/%d\r\n",
516 name(), payload_type, payload_type, sr);
517 return (
const char *)buffer;
519 AudioInfo defaultConfig() {
520 AudioInfo cfg(22050, 1, 16);
524 void begin(AudioInfo info)
override {
525 RTSPFormat::begin(info);
526 if (p_encoder !=
nullptr) {
527 ((AudioInfoSupport *)p_encoder)->setAudioInfo(info);
532 int samplesPerFragment =
534 int period = (samplesPerFragment * 1000000) / cfg.
sample_rate;
540 AudioInfo audioInfo()
override {
541 if (p_encoder !=
nullptr)
542 return ((AudioInfoSupport *)p_encoder)->audioInfo();
543 return RTSPFormat::audioInfo();
547 AudioEncoder *p_encoder =
nullptr;
570 void setEncoder(
AudioEncoder &encoder) { p_encoder = &encoder; }
585 if (p_encoder !=
nullptr)
587 return RTSPFormat::audioInfo();
594 const char *format(
char *buffer,
int len)
override {
602 if (ptime_ms < 10) ptime_ms = 10;
604 snprintf(buffer, len,
605 "m=audio 0 RTP/AVP %d\r\n"
606 "a=rtpmap:%d MPA/90000\r\n"
607 "a=fmtp:%d layer=3\r\n"
609 payload_type, payload_type, payload_type, ptime_ms);
611 snprintf(buffer, len,
612 "m=audio 0 RTP/AVP %d\r\n"
613 "a=rtpmap:%d MPA/90000/%d\r\n"
614 "a=fmtp:%d layer=3\r\n"
616 payload_type, payload_type, ch, payload_type, ptime_ms);
618 return (
const char *)buffer;
628 void begin(AudioInfo info)
override {
629 RTSPFormat::begin(info);
631 int samplesPerFrame = 1152;
633 int period = (samplesPerFrame * 1000000) / cfg.
sample_rate;
643 if (use_rfc2250_header_) {
644 memset(buffer, 0, 4);
653 bool use_rfc2250_header_ =
false;
658 bool useRfc2250Header()
const override {
return use_rfc2250_header_; }
679 const char *format(
char *buffer,
int len)
override {
681 int payload_type = 96;
684 snprintf(buffer, len,
686 "c=IN IP4 0.0.0.0\r\n"
688 "m=audio 0 RTP/AVP %d\r\n"
689 "a=rtpmap:%d MPEG4-GENERIC/%d/%d\r\n"
690 "a=fmtp:%d streamtype=5; profile-level-id=1; mode=AAC-hbr;\r\n",
691 name(), payload_type, payload_type, sr, ch, payload_type);
692 return (
const char *)buffer;
700 RTSPFormat::begin(info);
702 int samplesPerFrame = 1024;
704 int period = (samplesPerFrame * 1000000) / cfg.
sample_rate;