Browse Source

TT#122401 add generic silence DTX generator

Change-Id: I673c1115b6678842d7d49febea3c4ecbb67f534a
rfuchs/1283
Richard Fuchs 5 years ago
parent
commit
11988524ab
1 changed files with 54 additions and 0 deletions
  1. +54
    -0
      lib/codeclib.c

+ 54
- 0
lib/codeclib.c View File

@ -61,6 +61,7 @@ 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 generic_silence_dtx(decoder_t *, GQueue *, int);
static int amr_dtx(decoder_t *, GQueue *, int);
@ -141,6 +142,7 @@ static codec_def_t __codec_defs[] = {
.bits_per_sample = 8,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "PCMU",
@ -153,6 +155,7 @@ static codec_def_t __codec_defs[] = {
.bits_per_sample = 8,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "G723",
@ -165,6 +168,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "G722",
@ -177,6 +181,7 @@ static codec_def_t __codec_defs[] = {
.bits_per_sample = 8,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "QCELP",
@ -186,6 +191,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
#ifndef HAVE_BCG729
{
@ -198,6 +204,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "G729a",
@ -209,6 +216,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
#else
{
@ -223,6 +231,7 @@ static codec_def_t __codec_defs[] = {
.bits_per_sample = 1, // 10 ms frame has 80 samples and encodes as (max) 10 bytes = 80 bits
.media_type = MT_AUDIO,
.codec_type = &codec_type_bcg729,
.dtx = generic_silence_dtx,
},
{
.rtpname = "G729a",
@ -235,6 +244,7 @@ static codec_def_t __codec_defs[] = {
.bits_per_sample = 1, // 10 ms frame has 80 samples and encodes as (max) 10 bytes = 80 bits
.media_type = MT_AUDIO,
.codec_type = &codec_type_bcg729,
.dtx = generic_silence_dtx,
},
#endif
{
@ -247,6 +257,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "GSM",
@ -258,6 +269,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "iLBC",
@ -287,6 +299,7 @@ static codec_def_t __codec_defs[] = {
.codec_type = &codec_type_avcodec,
.init = opus_init,
.set_enc_options = opus_set_enc_options,
.dtx = generic_silence_dtx,
},
{
.rtpname = "vorbis",
@ -297,6 +310,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "ac3",
@ -305,6 +319,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "eac3",
@ -313,6 +328,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "ATRAC3",
@ -321,6 +337,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "ATRAC-X",
@ -329,6 +346,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 0, 0)
{
@ -338,6 +356,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "EVRC0",
@ -347,6 +366,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
{
.rtpname = "EVRC1",
@ -356,6 +376,7 @@ static codec_def_t __codec_defs[] = {
.packetizer = packetizer_passthrough,
.media_type = MT_AUDIO,
.codec_type = &codec_type_avcodec,
.dtx = generic_silence_dtx,
},
#endif
{
@ -2128,6 +2149,39 @@ static int amr_dtx(decoder_t *dec, GQueue *out, int ptime) {
static int generic_silence_dtx(decoder_t *dec, GQueue *out, int ptime) {
if (dec->dec_out_format.format == -1)
return -1;
if (ptime <= 0)
ptime = 20;
int num_samples = ptime * dec->in_format.clockrate / 1000;
ilog(LOG_DEBUG, "pushing %i silence samples into %s decoder", num_samples, dec->def->rtpname);
// create dummy frame, fill with silence, pretend it was returned from the decoder
AVFrame *frame = av_frame_alloc();
frame->nb_samples = num_samples;
frame->format = dec->dec_out_format.format;
frame->sample_rate = dec->dec_out_format.clockrate;
frame->channel_layout = av_get_default_channel_layout(dec->dec_out_format.channels);
if (av_frame_get_buffer(frame, 0) < 0) {
av_frame_free(&frame);
return -1;
}
memset(frame->extended_data[0], 0, frame->linesize[0]);
// advance PTS
frame->pts = dec->u.avc.avpkt.pts;
dec->u.avc.avpkt.pts += frame->nb_samples;
g_queue_push_tail(out, frame);
return 0;
}
#ifdef HAVE_BCG729
static void bcg729_def_init(codec_def_t *def) {


Loading…
Cancel
Save