|
|
|
@ -57,6 +57,7 @@ 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 const char *cn_decoder_init(decoder_t *, const str *, const str *); |
|
|
|
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 *); |
|
|
|
@ -64,6 +65,10 @@ static int format_cmp_ignore(const struct rtp_payload_type *, const struct rtp_p |
|
|
|
static int generic_silence_dtx(decoder_t *, GQueue *, int); |
|
|
|
static int amr_dtx(decoder_t *, GQueue *, int); |
|
|
|
|
|
|
|
static int generic_cn_dtx_init(decoder_t *); |
|
|
|
static void generic_cn_dtx_cleanup(decoder_t *); |
|
|
|
static int generic_cn_dtx(decoder_t *, GQueue *, int); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -101,7 +106,7 @@ static const codec_type_t codec_type_dtmf = { |
|
|
|
}; |
|
|
|
static const codec_type_t codec_type_cn = { |
|
|
|
.def_init = avc_def_init, |
|
|
|
.decoder_init = avc_decoder_init, |
|
|
|
.decoder_init = cn_decoder_init, |
|
|
|
.decoder_input = cn_decoder_input, |
|
|
|
.decoder_close = avc_decoder_close, |
|
|
|
}; |
|
|
|
@ -109,6 +114,11 @@ static const codec_type_t codec_type_cn = { |
|
|
|
static const dtx_method_t dtx_method_silence = { |
|
|
|
.do_dtx = generic_silence_dtx, |
|
|
|
}; |
|
|
|
static const dtx_method_t dtx_method_cn = { |
|
|
|
.do_dtx = generic_cn_dtx, |
|
|
|
.init = generic_cn_dtx_init, |
|
|
|
.cleanup = generic_cn_dtx_cleanup, |
|
|
|
}; |
|
|
|
static const dtx_method_t dtx_method_amr = { |
|
|
|
.do_dtx = amr_dtx, |
|
|
|
}; |
|
|
|
@ -151,6 +161,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -166,6 +177,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -181,6 +193,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -196,6 +209,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -208,6 +222,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
#ifndef HAVE_BCG729 |
|
|
|
@ -223,6 +238,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -237,6 +253,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
#else |
|
|
|
@ -254,6 +271,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_bcg729, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -269,6 +287,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_bcg729, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
#endif |
|
|
|
@ -284,6 +303,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -298,6 +318,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -330,6 +351,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.set_enc_options = opus_set_enc_options, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -343,6 +365,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -354,6 +377,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -365,6 +389,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -376,6 +401,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -387,6 +413,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 0, 0) |
|
|
|
@ -399,6 +426,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -411,6 +439,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -423,6 +452,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.codec_type = &codec_type_avcodec, |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
#endif |
|
|
|
@ -445,6 +475,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_NATIVE] = &dtx_method_amr, |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -466,6 +497,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
.dtx_methods = { |
|
|
|
[DTX_NATIVE] = &dtx_method_amr, |
|
|
|
[DTX_SILENCE] = &dtx_method_silence, |
|
|
|
[DTX_CN] = &dtx_method_cn, |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
@ -523,6 +555,7 @@ static codec_def_t __codec_defs[] = { |
|
|
|
|
|
|
|
static GQueue __supplemental_codecs = G_QUEUE_INIT; |
|
|
|
const GQueue * const codec_supplemental_codecs = &__supplemental_codecs; |
|
|
|
static codec_def_t *codec_def_cn; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -973,6 +1006,9 @@ void codeclib_init(int print) { |
|
|
|
if (def->codec_type && def->codec_type->def_init) |
|
|
|
def->codec_type->def_init(def); |
|
|
|
|
|
|
|
if (!strcmp(def->rtpname, "CN")) |
|
|
|
codec_def_cn = def; |
|
|
|
|
|
|
|
if (print) { |
|
|
|
if (def->support_encoding && def->support_decoding) { |
|
|
|
if (def->default_channels > 0 && def->default_clockrate >= 0) |
|
|
|
@ -2274,6 +2310,27 @@ static int generic_silence_dtx(decoder_t *dec, GQueue *out, int ptime) { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int cn_append_frame(decoder_t *dec, AVFrame *f, void *u1, void *u2) { |
|
|
|
GQueue *out = u1; |
|
|
|
g_queue_push_tail(out, f); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int generic_cn_dtx(decoder_t *dec, GQueue *out, int ptime) { |
|
|
|
static const str cn_pl = { "\x10", 1 }; |
|
|
|
return decoder_input_data(dec->dtx.u.cn.cn_dec, &cn_pl, dec->rtp_ts, cn_append_frame, out, NULL); |
|
|
|
} |
|
|
|
|
|
|
|
static int generic_cn_dtx_init(decoder_t *dec) { |
|
|
|
dec->dtx.u.cn.cn_dec = decoder_new_fmt(codec_def_cn, 8000, 1, dec->ptime, &dec->dest_format); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static void generic_cn_dtx_cleanup(decoder_t *dec) { |
|
|
|
decoder_close(dec->dtx.u.cn.cn_dec); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_BCG729 |
|
|
|
@ -2495,6 +2552,12 @@ static int format_cmp_ignore(const struct rtp_payload_type *a, const struct rtp_ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const char *cn_decoder_init(decoder_t *dec, const str *fmtp, const str *opts) { |
|
|
|
// the ffmpeg cngdec always runs at 8000 |
|
|
|
dec->in_format.clockrate = 8000; |
|
|
|
dec->in_format.channels = 1; |
|
|
|
return avc_decoder_init(dec, fmtp, opts); |
|
|
|
} |
|
|
|
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; |
|
|
|
|