diff --git a/daemon/codec.c b/daemon/codec.c index 0b1ba4b8f..c5d811f88 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -2472,12 +2472,11 @@ struct codec_packet *codec_packet_dup(struct codec_packet *p) { -rtp_payload_type *codec_make_payload_type(const str *codec_str, enum media_type type) { - +bool codec_parse_payload_type(rtp_payload_type *pt, const str *codec_str) { str codec_fmt = *codec_str; str codec, parms, chans, opts, extra_opts, fmt_params, codec_opts; if (!str_token_sep(&codec, &codec_fmt, '/')) - return NULL; + return false; str_token_sep(&parms, &codec_fmt, '/'); str_token_sep(&chans, &codec_fmt, '/'); str_token_sep(&opts, &codec_fmt, '/'); @@ -2493,8 +2492,6 @@ rtp_payload_type *codec_make_payload_type(const str *codec_str, enum media_type if (clockrate && !channels) channels = 1; - rtp_payload_type *pt = g_slice_alloc0(sizeof(*pt)); - pt->payload_type = -1; pt->encoding = codec; pt->clock_rate = clockrate; @@ -2504,6 +2501,17 @@ rtp_payload_type *codec_make_payload_type(const str *codec_str, enum media_type pt->format_parameters = fmt_params; pt->codec_opts = codec_opts; + return true; +} + +rtp_payload_type *codec_make_payload_type(const str *codec_str, enum media_type type) { + __auto_type pt = g_new0(rtp_payload_type, 1); + + if (!codec_parse_payload_type(pt, codec_str)) { + payload_type_free(pt); + return NULL; + } + codec_init_payload_type(pt, type); return pt; @@ -4664,7 +4672,7 @@ void payload_type_clear(rtp_payload_type *p) { } void payload_type_free(rtp_payload_type *p) { payload_type_clear(p); - g_slice_free1(sizeof(*p), p); + g_free(p); } void payload_type_destroy(rtp_payload_type **p) { if (*p) @@ -4688,7 +4696,7 @@ static void rtp_payload_type_copy(rtp_payload_type *dst, const rtp_payload_type } rtp_payload_type *rtp_payload_type_dup(const rtp_payload_type *pt) { - rtp_payload_type *pt_copy = g_slice_alloc0(sizeof(*pt)); + __auto_type pt_copy = g_new0(rtp_payload_type, 1); rtp_payload_type_copy(pt_copy, pt); return pt_copy; } diff --git a/daemon/sdp.c b/daemon/sdp.c index 0f34fc8e2..e1f912fd4 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -1514,7 +1514,7 @@ static int __rtp_payload_types(struct stream_params *sp, struct sdp_media *media ptrfc = rtp_get_rfc_payload_type(i); ptl = g_hash_table_lookup(ht_rtpmap, &i); - pt = g_slice_alloc0(sizeof(*pt)); + pt = g_new0(rtp_payload_type, 1); if (ptl) *pt = *ptl; else if (ptrfc) diff --git a/include/codec.h b/include/codec.h index 076128dab..fdfdb282f 100644 --- a/include/codec.h +++ b/include/codec.h @@ -173,8 +173,8 @@ rtp_payload_type *rtp_payload_type_dup(const rtp_payload_type *pt); G_DEFINE_AUTOPTR_CLEANUP_FUNC(rtp_payload_type, payload_type_free) -// special return value `(void *) 0x1` to signal type mismatch rtp_payload_type *codec_make_payload_type(const str *codec_str, enum media_type); +bool codec_parse_payload_type(rtp_payload_type *pt, const str *codec_str); // handle string allocation void codec_init_payload_type(rtp_payload_type *, enum media_type);