diff --git a/daemon/recording.c b/daemon/recording.c index c158cfc6c..8dc19da29 100644 --- a/daemon/recording.c +++ b/daemon/recording.c @@ -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); diff --git a/recording-daemon/decoder.c b/recording-daemon/decoder.c index 42d4ebcbc..2f846c471 100644 --- a/recording-daemon/decoder.c +++ b/recording-daemon/decoder.c @@ -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)); diff --git a/recording-daemon/decoder.h b/recording-daemon/decoder.h index 302ece1fe..50a247650 100644 --- a/recording-daemon/decoder.h +++ b/recording-daemon/decoder.h @@ -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 *); diff --git a/recording-daemon/metafile.c b/recording-daemon/metafile.c index 989f4d9a6..121bf8f7d 100644 --- a/recording-daemon/metafile.c +++ b/recording-daemon/metafile.c @@ -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) diff --git a/recording-daemon/packet.c b/recording-daemon/packet.c index 27826bec7..7f7817c43 100644 --- a/recording-daemon/packet.c +++ b/recording-daemon/packet.c @@ -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)", diff --git a/recording-daemon/types.h b/recording-daemon/types.h index d43214818..fabd3c09e 100644 --- a/recording-daemon/types.h +++ b/recording-daemon/types.h @@ -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];