diff --git a/daemon/codec.c b/daemon/codec.c index 622b008fb..6f4b04a36 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -442,9 +442,9 @@ static bool __make_transcoder_full(struct codec_handler *handler, rtp_payload_ty int cn_payload_type, int (*packet_decoded)(decoder_t *, AVFrame *, void *, void *), struct ssrc_entry *(*ssrc_handler_new_func)(void *p)) { - if (!handler->source_pt.codec_def) + if (!codec_def_supported(handler->source_pt.codec_def)) return false; - if (!dest->codec_def) + if (!codec_def_supported(dest->codec_def)) return false; // don't reset handler if it already matches what we want @@ -676,7 +676,7 @@ static void __check_codec_list(GHashTable **supplemental_sinks, rtp_payload_type for (__auto_type l = sink->codecs.codec_prefs.head; l; l = l->next) { rtp_payload_type *pt = l->data; ensure_codec_def(pt, sink); - if (!pt->codec_def) // not supported, next + if (!codec_def_supported(pt->codec_def)) // not supported, next continue; // fix up ptime @@ -904,7 +904,7 @@ static void __check_t38_gateway(struct call_media *pcm_media, struct call_media for (__auto_type l = pcm_media->codecs.codec_prefs.head; l; l = l->next) { rtp_payload_type *pt = l->data; struct codec_handler *handler = __get_pt_handler(pcm_media, pt, t38_media); - if (!pt->codec_def) { + if (!codec_def_supported(pt->codec_def)) { // should not happen ilogs(codec, LOG_WARN, "Unsupported codec " STR_FORMAT "/" STR_FORMAT " for T.38 transcoding", @@ -1186,7 +1186,7 @@ void __codec_handlers_update(struct call_media *receiver, struct call_media *sin struct codec_handler *handler = __get_pt_handler(receiver, pt, sink); // check our own support for this codec - if (!pt->codec_def) { + if (!codec_def_supported(pt->codec_def)) { // not supported ilogs(codec, LOG_DEBUG, "No codec support for " STR_FORMAT "/" STR_FORMAT, STR_FMT(&pt->encoding_with_params), @@ -1483,7 +1483,7 @@ next: for (__auto_type l = receiver->codecs.codec_prefs.head; l; ) { rtp_payload_type *pt = l->data; - if (pt->codec_def) { + if (codec_def_supported(pt->codec_def)) { // supported l = l->next; continue; @@ -3864,7 +3864,7 @@ static bool __ssrc_handler_decode_common(struct codec_ssrc_handler *ch, struct c static struct ssrc_entry *__ssrc_handler_transcode_new(void *p) { struct codec_handler *h = p; - if (!h->source_pt.codec_def || !h->dest_pt.codec_def) + if (!codec_def_supported(h->source_pt.codec_def) || !codec_def_supported(h->dest_pt.codec_def)) return NULL; ilogs(codec, LOG_DEBUG, "Creating SSRC transcoder from %s/%u/%i to " @@ -5464,7 +5464,7 @@ int codec_store_accept_one(struct codec_store *cs, str_q *accept, bool accept_an rtp_payload_type *pt = l->data; if (!accept_any) { ensure_codec_def(pt, cs->media); - if (!pt->codec_def) + if (!codec_def_supported(pt->codec_def)) continue; } accept_pt = pt; @@ -5762,7 +5762,7 @@ void codec_store_synthesise(struct codec_store *dst, struct codec_store *opposit // we already have a list of codecs - make sure they're all supported by us for (__auto_type l = dst->codec_prefs.head; l;) { rtp_payload_type *pt = l->data; - if (pt->codec_def) { + if (codec_def_supported(pt->codec_def)) { l = l->next; continue; } diff --git a/daemon/media_player.c b/daemon/media_player.c index 5759fa8f4..ee4956a50 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -821,7 +821,7 @@ static rtp_payload_type *media_player_get_dst_pt(struct media_player *mp) { for (__auto_type l = mp->media->codecs.codec_prefs.head; l; l = l->next) { dst_pt = l->data; ensure_codec_def(dst_pt, mp->media); - if (dst_pt->codec_def && !dst_pt->codec_def->supplemental) + if (codec_def_supported(dst_pt->codec_def) && !dst_pt->codec_def->supplemental) goto found; } if (!dst_pt) { @@ -912,7 +912,7 @@ static int __ensure_codec_handler(struct media_player *mp, const rtp_payload_typ // synthesise rtp payload type rtp_payload_type src_pt = { .payload_type = -1 }; src_pt.codec_def = codec_find_by_av(mp->coder.avstream->CODECPAR->codec_id); - if (!src_pt.codec_def) { + if (!src_pt.codec_def || !src_pt.codec_def->support_decoding) { ilog(LOG_ERR, "Attempting to play media from an unsupported file format/codec"); return -1; } diff --git a/daemon/t38.c b/daemon/t38.c index f07c4232e..af973425e 100644 --- a/daemon/t38.c +++ b/daemon/t38.c @@ -400,7 +400,7 @@ int t38_gateway_pair(struct call_media *t38_media, struct call_media *pcm_media, err = "Failed to init PCM codec"; ensure_codec_def(&tg->pcm_pt, pcm_media); - if (!tg->pcm_pt.codec_def) + if (!codec_def_supported(tg->pcm_pt.codec_def)) goto err; err = "Failed to create spandsp T.38 gateway"; diff --git a/lib/codeclib.h b/lib/codeclib.h index a06cacd0c..c9640c94c 100644 --- a/lib/codeclib.h +++ b/lib/codeclib.h @@ -490,6 +490,11 @@ INLINE int decoder_event(decoder_t *dec, enum codec_event event, void *ptr) { return 0; return dec->event_func(event, ptr, dec->event_data); } +INLINE bool codec_def_supported(codec_def_t *def) { + if (!def) + return false; + return def->support_encoding && def->support_decoding; +} #else @@ -521,6 +526,9 @@ INLINE codec_def_t *codec_find(const str *name, enum media_type type) { INLINE void packet_sequencer_destroy(packet_sequencer_t *p) { return; } +INLINE bool codec_def_supported(codec_def_t *def) { + return false; +} #endif