From c5667e3bf7269a6483534911f0533aedee5ad62a Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 12 Nov 2020 13:52:39 -0500 Subject: [PATCH] TT#100200 add CN decoder Change-Id: Ic4ff122745569e3892f1a95fedb36ce9d2495349 --- lib/codeclib.c | 39 +++++ t/auto-daemon-tests.pl | 350 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 389 insertions(+) diff --git a/lib/codeclib.c b/lib/codeclib.c index 76b92ad3d..c75b8762c 100644 --- a/lib/codeclib.c +++ b/lib/codeclib.c @@ -63,6 +63,8 @@ static int ilbc_decoder_input(decoder_t *dec, const str *data, GQueue *out); static const char *dtmf_decoder_init(decoder_t *, const str *, const str *); static int dtmf_decoder_input(decoder_t *dec, const str *data, GQueue *out); +static int cn_decoder_input(decoder_t *dec, const str *data, GQueue *out); + static int format_cmp_ignore(const struct rtp_payload_type *, const struct rtp_payload_type *); static int amr_packet_lost(decoder_t *, GQueue *); @@ -102,6 +104,12 @@ static const codec_type_t codec_type_dtmf = { .decoder_init = dtmf_decoder_init, .decoder_input = dtmf_decoder_input, }; +static const codec_type_t codec_type_cn = { + .def_init = avc_def_init, + .decoder_init = avc_decoder_init, + .decoder_input = cn_decoder_input, + .decoder_close = avc_decoder_close, +}; #ifdef HAVE_BCG729 static packetizer_f packetizer_g729; // aggregate some frames into packets @@ -407,6 +415,20 @@ static codec_def_t __codec_defs[] = { .support_encoding = 1, .support_decoding = 1, }, + { + .rtpname = "CN", + .avcodec_id = AV_CODEC_ID_COMFORT_NOISE, + .avcodec_name_enc = "comfortnoise", + .avcodec_name_dec = "comfortnoise", + .packetizer = packetizer_passthrough, + .media_type = MT_AUDIO, + .supplemental = 1, + .default_clockrate = 8000, + .default_channels = 1, + .default_ptime = 20, + .format_cmp = format_cmp_ignore, + .codec_type = &codec_type_cn, + }, // for file reading and writing { .rtpname = "PCM-S16LE", @@ -2314,3 +2336,20 @@ static int dtmf_decoder_input(decoder_t *dec, const str *data, GQueue *out) { static int format_cmp_ignore(const struct rtp_payload_type *a, const struct rtp_payload_type *b) { return 0; } + + + +static int cn_decoder_input(decoder_t *dec, const str *data, GQueue *out) { + // generate one set of ptime worth of samples + int ptime = dec->ptime; + if (!ptime) + ptime = 20; // ? + int samples = dec->in_format.clockrate * ptime / 1000; + dec->u.avc.avcctx->frame_size = samples; + int ret = avc_decoder_input(dec, data, out); + if (ret) + return ret; + if (!out->length) + return -1; + return 0; +} diff --git a/t/auto-daemon-tests.pl b/t/auto-daemon-tests.pl index 1f5a35968..5672ba663 100755 --- a/t/auto-daemon-tests.pl +++ b/t/auto-daemon-tests.pl @@ -36,6 +36,356 @@ my ($sock_a, $sock_b, $sock_c, $sock_d, $port_a, $port_b, $ssrc, $resp, + + + +# CN tests + +($sock_a, $sock_b) = new_call([qw(198.51.101.1 3000)], [qw(198.51.101.3 4000)]); + +($port_a) = offer('add CN', + { ICE => 'remove', replace => ['origin'], codec => { transcode => ['CN'] } }, < 'remove', replace => ['origin'] }, < 'remove', replace => ['origin'], codec => { transcode => ['G722'] } }, < 'remove', replace => ['origin'] }, < 'remove', replace => ['origin'], codec => { transcode => ['G722'] } }, < 'remove', replace => ['origin'], flags => ['symmetric-codecs'] }, < 'remove', replace => ['origin'], codec => { transcode => ['CN'] } }, < 'remove', replace => ['origin'] }, < 'remove', replace => ['origin'], codec => { transcode => ['CN'] } }, < 'remove', replace => ['origin'] }, < 'remove', replace => ['origin'], codec => { transcode => ['PCMU', 'CN'] } }, < 'remove', replace => ['origin'] }, <