TT#102450 fix AMR recording

closes #1112

Change-Id: If8378fa63ae1827aa3ab4c02d376ee75f34b8b9d
pull/1116/head
Richard Fuchs 5 years ago
parent 8ded0076da
commit a6022c9ab9

@ -808,6 +808,8 @@ static void setup_media_proc(struct call_media *media) {
struct rtp_payload_type *pt = l->data;
append_meta_chunk(recording, pt->encoding_with_params.s, pt->encoding_with_params.len,
"MEDIA %u PAYLOAD TYPE %u", media->unique_id, pt->payload_type);
append_meta_chunk(recording, pt->format_parameters.s, pt->format_parameters.len,
"MEDIA %u FMTP %u", media->unique_id, pt->payload_type);
}
g_list_free(pltypes);

@ -24,7 +24,7 @@ int resample_audio;
decode_t *decoder_new(const char *payload_str, int ptime, output_t *outp) {
decode_t *decoder_new(const char *payload_str, const char *format, int ptime, output_t *outp) {
str name;
char *slash = strchr(payload_str, '/');
if (!slash) {
@ -79,7 +79,10 @@ decode_t *decoder_new(const char *payload_str, int ptime, output_t *outp) {
outp->encoder->requested_format.format = out_format.format;
}
decoder_t *dec = decoder_new_fmt(def, rtp_clockrate, channels, ptime, &out_format);
str fmtp;
str_init(&fmtp, (char *) format);
decoder_t *dec = decoder_new_fmtp(def, rtp_clockrate, channels, ptime, &out_format, &fmtp, NULL);
if (!dec)
return NULL;
decode_t *deco = g_slice_alloc0(sizeof(decode_t));

@ -8,7 +8,7 @@
extern int resample_audio;
decode_t *decoder_new(const char *payload_str, int ptime, output_t *);
decode_t *decoder_new(const char *payload_str, const char *format, int ptime, output_t *);
int decoder_input(decode_t *, const str *, unsigned long ts, ssrc_t *);
void decoder_free(decode_t *);

@ -123,6 +123,23 @@ static void meta_rtp_payload_type(metafile_t *mf, unsigned long mnum, unsigned i
}
// mf is locked
static void meta_rtp_fmtp(metafile_t *mf, unsigned long mnum, unsigned int payload_num,
char *format)
{
if (payload_num >= 128) {
ilog(LOG_ERR, "Payload type number %u is invalid", payload_num);
return;
}
if (decoding_enabled) {
pthread_mutex_lock(&mf->payloads_lock);
mf->payload_formats[payload_num] = g_string_chunk_insert(mf->gsc,
format);
pthread_mutex_unlock(&mf->payloads_lock);
}
}
// mf is locked
static void meta_ptime(metafile_t *mf, unsigned long mnum, int ptime)
{
@ -161,6 +178,8 @@ static void meta_section(metafile_t *mf, char *section, char *content, unsigned
meta_stream_details(mf, lu, content);
else if (sscanf_match(section, "MEDIA %lu PAYLOAD TYPE %u", &lu, &u) == 2)
meta_rtp_payload_type(mf, lu, u, content);
else if (sscanf_match(section, "MEDIA %lu FMTP %u", &lu, &u) == 2)
meta_rtp_fmtp(mf, lu, u, content);
else if (sscanf_match(section, "MEDIA %lu PTIME %i", &lu, &i) == 2)
meta_ptime(mf, lu, i);
else if (sscanf_match(section, "TAG %lu", &lu) == 1)

@ -245,6 +245,7 @@ static void packet_decode(ssrc_t *ssrc, packet_t *packet) {
metafile_t *mf = ssrc->metafile;
pthread_mutex_lock(&mf->payloads_lock);
char *payload_str = mf->payload_types[payload_type];
char *format = mf->payload_formats[payload_type];
int ptime = mf->payload_ptimes[payload_type];
pthread_mutex_unlock(&mf->payloads_lock);
@ -265,7 +266,7 @@ static void packet_decode(ssrc_t *ssrc, packet_t *packet) {
outp = mf->mix_out;
else if (ssrc->output)
outp = ssrc->output;
ssrc->decoders[payload_type] = decoder_new(payload_str, ptime, outp);
ssrc->decoders[payload_type] = decoder_new(payload_str, format, ptime, outp);
pthread_mutex_unlock(&mf->mix_lock);
if (!ssrc->decoders[payload_type]) {
ilog(LOG_WARN, "Cannot decode RTP payload type %u (%s)",

@ -130,6 +130,7 @@ struct metafile_s {
pthread_mutex_t payloads_lock;
char *payload_types[128];
char *payload_formats[128];
int payload_ptimes[128];
int media_ptimes[4];

Loading…
Cancel
Save