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
45 virtual const char *format(
char *buffer,
int len) = 0;
48 virtual int convert(
void *data,
int sampleCount) {
return sampleCount; }
51 virtual void begin(
AudioInfo info) { cfg = info; }
55 virtual AudioInfo audioInfo() {
return cfg; }
57 virtual const char *name() {
return name_str; }
59 void setName(
const char *name) { name_str = name; }
70 int samples_per_fragment =
72 return samples_per_fragment;
89 virtual bool useRfc2250Header()
const {
return false; }
92 const char *STD_URL_PRE_SUFFIX =
"trackID";
94 int fragment_size = DEFAULT_PCM_FRAGMENT_SIZE;
95 int timer_period_us = 10000;
96 AudioInfo cfg{16000, 1, 16};
97 const char *name_str =
"RTSPAudioTools";
141 const char *
format(
char *buffer,
int len)
override {
142 snprintf(buffer, len,
144 "c=IN IP4 0.0.0.0\r\n"
146 "m=audio 0 RTP/AVP %d\r\n"
150 LOGI(
"ftsp format: %s", buffer);
151 return (
const char *)buffer;
162 int16_t *pt_16 = (int16_t *)data;
163 for (
int j = 0; j < samples / 2; j++) {
164 pt_16[j] = htons(pt_16[j]);
171 AudioInfo defaultConfig()
override {
return AudioInfo(16000, 1, 16); }
175 switch (channels()) {
183 LOGE(
"unsupported audio type");
190 char payload_fromat[30];
193 int channels() {
return cfg.
channels; }
206 (samples_per_fragment * 1000000) / cfg.
sample_rate;
213 const char *payloadFormat() {
214 switch (channels()) {
217 sampleRate(), channels());
221 sampleRate(), channels());
224 LOGE(
"unsupported audio type");
227 return payload_fromat;
245 p_encoder = &encoder;
253 const char *format(
char *buffer,
int len)
override {
255 snprintf(buffer, len,
257 "c=IN IP4 0.0.0.0\r\n"
259 "m=audio 0 RTP/AVP 101\r\n"
260 "a=rtpmap:101 opus/%d/2\r\n"
261 "a=fmtp:101 stereo=1; sprop-stereo=%d\r\n",
263 return (
const char *)buffer;
265 AudioInfo defaultConfig() {
266 AudioInfo cfg(48000, 2, 16);
270 void begin(AudioInfo info)
override {
271 RTSPFormat::begin(info);
273 if (p_encoder !=
nullptr) {
280 AudioEncoder *p_encoder =
nullptr;
299 const char *format(
char *buffer,
int len)
override {
301 snprintf(buffer, len,
303 "c=IN IP4 0.0.0.0\r\n"
305 "m=audio 0 RTP/AVP 98\r\n"
306 "a=rtpmap:98 aptx/%d/%d\r\n"
307 "a=fmtp:98 variant=standard; bitresolution=%d\r\n",
309 return (
const char *)buffer;
317 RTSPFormat::begin(info);
322 int period = (samplesPerFragment * 1000000) / cfg.
sample_rate;
341 const char *
format(
char *buffer,
int len)
override {
346 snprintf(buffer, len,
348 "c=IN IP4 0.0.0.0\r\n"
350 "m=audio 0 RTP/AVP 3\r\n"
353 return (
const char *)buffer;
377 const char *
format(
char *buffer,
int len)
override {
385 "c=IN IP4 0.0.0.0\r\n"
387 "m=audio 0 RTP/AVP %d\r\n"
389 name(), getFormat());
390 return (
const char *)buffer;
403 uint8_t getFormat() {
return is_ulaw ? 0 : 8; }
418 const char *format(
char *buffer,
int len)
override {
420 snprintf(buffer, len,
422 "c=IN IP4 0.0.0.0\r\n"
424 "m=audio 0 RTP/AVP 96\r\n"
425 "a=rtpmap:96 l8/%d/%d\r\n",
427 return (
const char *)buffer;
435 RTSPFormat::begin(info);
438 int bytesPerSample = 1;
440 int period = (samplesPerFragment * 1000000) / cfg.
sample_rate;
466template <
class AudioEncoder>
474 p_encoder = &encoder;
487 const char *format(
char *buffer,
int len)
override {
491 int payload_type = 5;
506 LOGE(
"Unsupported sample rate for IMA ADPCM: %d", sr);
511 snprintf(buffer, len,
513 "c=IN IP4 0.0.0.0\r\n"
515 "m=audio 0 RTP/AVP %d\r\n"
516 "a=rtpmap:%d DVI4/%d\r\n",
517 name(), payload_type, payload_type, sr);
518 return (
const char *)buffer;
520 AudioInfo defaultConfig() {
521 AudioInfo cfg(22050, 1, 16);
525 void begin(AudioInfo info)
override {
526 RTSPFormat::begin(info);
527 if (p_encoder !=
nullptr) {
528 ((AudioInfoSupport *)p_encoder)->setAudioInfo(info);
533 int samplesPerFragment =
535 int period = (samplesPerFragment * 1000000) / cfg.
sample_rate;
541 AudioInfo audioInfo()
override {
542 if (p_encoder !=
nullptr)
543 return ((AudioInfoSupport *)p_encoder)->audioInfo();
544 return RTSPFormat::audioInfo();
548 AudioEncoder *p_encoder =
nullptr;
571 void setEncoder(
AudioEncoder &encoder) { p_encoder = &encoder; }
586 if (p_encoder !=
nullptr)
588 return RTSPFormat::audioInfo();
595 const char *format(
char *buffer,
int len)
override {
603 if (ptime_ms < 10) ptime_ms = 10;
605 snprintf(buffer, len,
606 "m=audio 0 RTP/AVP %d\r\n"
607 "a=rtpmap:%d MPA/90000\r\n"
608 "a=fmtp:%d layer=3\r\n"
610 payload_type, payload_type, payload_type, ptime_ms);
612 snprintf(buffer, len,
613 "m=audio 0 RTP/AVP %d\r\n"
614 "a=rtpmap:%d MPA/90000/%d\r\n"
615 "a=fmtp:%d layer=3\r\n"
617 payload_type, payload_type, ch, payload_type, ptime_ms);
619 return (
const char *)buffer;
629 void begin(AudioInfo info)
override {
630 RTSPFormat::begin(info);
632 int samplesPerFrame = 1152;
634 int period = (samplesPerFrame * 1000000) / cfg.
sample_rate;
644 if (use_rfc2250_header_) {
645 memset(buffer, 0, 4);
654 bool use_rfc2250_header_ =
false;
659 bool useRfc2250Header()
const override {
return use_rfc2250_header_; }
680 const char *format(
char *buffer,
int len)
override {
682 int payload_type = 96;
685 snprintf(buffer, len,
687 "c=IN IP4 0.0.0.0\r\n"
689 "m=audio 0 RTP/AVP %d\r\n"
690 "a=rtpmap:%d MPEG4-GENERIC/%d/%d\r\n"
691 "a=fmtp:%d streamtype=5; profile-level-id=1; mode=AAC-hbr;\r\n",
692 name(), payload_type, payload_type, sr, ch, payload_type);
693 return (
const char *)buffer;
701 RTSPFormat::begin(info);
703 int samplesPerFrame = 1024;
705 int period = (samplesPerFrame * 1000000) / cfg.
sample_rate;