diff --git a/daemon/codec.c b/daemon/codec.c index d0b2b90e0..9aff69f6c 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -438,14 +438,15 @@ static void __reset_sequencer(void *p, void *dummy) { g_hash_table_destroy(s->sequencers); s->sequencers = NULL; } -static void __make_transcoder_full(struct codec_handler *handler, rtp_payload_type *dest, +static bool __make_transcoder_full(struct codec_handler *handler, rtp_payload_type *dest, GHashTable *output_transcoders, int dtmf_payload_type, bool pcm_dtmf_detect, int cn_payload_type, int (*packet_decoded)(decoder_t *, AVFrame *, void *, void *), struct ssrc_entry *(*ssrc_handler_new_func)(void *p)) { - assert(handler->source_pt.codec_def != NULL); - - assert(dest->codec_def != NULL); + if (!handler->source_pt.codec_def) + return false; + if (!dest->codec_def) + return false; // don't reset handler if it already matches what we want if (!handler->transcoder) @@ -543,6 +544,8 @@ no_handler_reset: g_hash_table_insert(output_transcoders, GINT_TO_POINTER(dest->payload_type), handler); handler->output_handler = handler; // make sure we don't have a stale pointer } + + return true; } static void __make_transcoder(struct codec_handler *handler, rtp_payload_type *dest, GHashTable *output_transcoders, int dtmf_payload_type, bool pcm_dtmf_detect, @@ -551,10 +554,10 @@ static void __make_transcoder(struct codec_handler *handler, rtp_payload_type *d __make_transcoder_full(handler, dest, output_transcoders, dtmf_payload_type, pcm_dtmf_detect, cn_payload_type, packet_decoded_fifo, __ssrc_handler_transcode_new); } -static void __make_audio_player_decoder(struct codec_handler *handler, rtp_payload_type *dest, +static bool __make_audio_player_decoder(struct codec_handler *handler, rtp_payload_type *dest, bool pcm_dtmf_detect) { - __make_transcoder_full(handler, dest, NULL, -1, pcm_dtmf_detect, -1, packet_decoded_audio_player, + return __make_transcoder_full(handler, dest, NULL, -1, pcm_dtmf_detect, -1, packet_decoded_audio_player, __ssrc_handler_decode_new); } @@ -1481,26 +1484,25 @@ next: if (a.reset_transcoding && ms) ms->attrs.transcoding = 1; - if (!use_audio_player) { - // we have to translate RTCP packets - receiver->rtcp_handler = rtcp_transcode_handler; - - for (__auto_type l = receiver->codecs.codec_prefs.head; l; ) { - rtp_payload_type *pt = l->data; - - if (pt->codec_def) { - // supported - l = l->next; - continue; - } + for (__auto_type l = receiver->codecs.codec_prefs.head; l; ) { + rtp_payload_type *pt = l->data; - ilogs(codec, LOG_DEBUG, "Stripping unsupported codec " STR_FORMAT - " due to active transcoding", - STR_FMT(&pt->encoding)); - codec_touched(&receiver->codecs, pt); - l = __codec_store_delete_link(l, &receiver->codecs); + if (pt->codec_def) { + // supported + l = l->next; + continue; } + ilogs(codec, LOG_DEBUG, "Stripping unsupported codec " STR_FORMAT + " due to active transcoding", + STR_FMT(&pt->encoding)); + codec_touched(&receiver->codecs, pt); + l = __codec_store_delete_link(l, &receiver->codecs); + } + + if (!use_audio_player) { + // we have to translate RTCP packets + receiver->rtcp_handler = rtcp_transcode_handler; // at least some payload types will be transcoded, which will result in SSRC // change. for payload types which we don't actually transcode, we still @@ -1510,7 +1512,6 @@ next: __convert_passthrough_ssrc(handler); passthrough_handlers = g_slist_delete_link(passthrough_handlers, passthrough_handlers); - } } else { @@ -1520,7 +1521,8 @@ next: // change all passthrough handlers also to transcoders while (passthrough_handlers) { struct codec_handler *handler = passthrough_handlers->data; - __make_audio_player_decoder(handler, pref_dest_codec, false); + if (!__make_audio_player_decoder(handler, pref_dest_codec, false)) + __convert_passthrough_ssrc(handler); passthrough_handlers = g_slist_delete_link(passthrough_handlers, passthrough_handlers);