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