From dccbb13ec82b80db31a73fb842707494530b60a5 Mon Sep 17 00:00:00 2001 From: Chema Gonzalez Date: Thu, 19 Aug 2021 09:30:13 -0700 Subject: [PATCH 1/4] opusenc: Add --bandwidth option --- man/opusenc.1 | 3 +++ src/opusenc.c | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/man/opusenc.1 b/man/opusenc.1 index 27f652b..44726ac 100644 --- a/man/opusenc.1 +++ b/man/opusenc.1 @@ -50,6 +50,9 @@ In CVBR and Hard-CBR mode it specifies the specific output bitrate. The default for input with a sample rate of 44.1 kHz or higher is 64 kbit/s per mono stream and 96 kbit/s per coupled pair. .TP +.BI --bandwidth " N" +Set audio bandwidth (NB, MB, WB, SWB, FB, default: auto). +.TP .B --vbr Use variable bitrate encoding (default). In VBR mode the bitrate may go up and down freely depending on the content diff --git a/src/opusenc.c b/src/opusenc.c index 06838e5..a239f70 100644 --- a/src/opusenc.c +++ b/src/opusenc.c @@ -138,6 +138,7 @@ static void usage(void) printf(" --quiet Enable quiet mode\n"); printf("\nEncoding options:\n"); printf(" --bitrate n.nnn Set target bitrate in kbit/s (6-256/channel)\n"); + printf(" --bandwidth Set audio bandwidth (NB, MB, WB, SWB, FB)\n"); printf(" --vbr Use variable bitrate encoding (default)\n"); printf(" --cvbr Use constrained variable bitrate encoding\n"); printf(" --hard-cbr Use hard constant bitrate encoding\n"); @@ -367,6 +368,7 @@ int main(int argc, char **argv) { {"quiet", no_argument, NULL, 0}, {"bitrate", required_argument, NULL, 0}, + {"bandwidth", required_argument, NULL, 0}, {"hard-cbr",no_argument,NULL, 0}, {"vbr",no_argument,NULL, 0}, {"cvbr",no_argument,NULL, 0}, @@ -433,6 +435,7 @@ int main(int argc, char **argv) /*Settings*/ int quiet=0; opus_int32 bitrate=-1; + int bandwidth=OPUS_AUTO; opus_int32 rate=48000; opus_int32 frame_size=960; opus_int32 opus_frame_param = OPUS_FRAMESIZE_20_MS; @@ -535,6 +538,21 @@ int main(int argc, char **argv) save_cmd=0; } else if (strcmp(optname, "bitrate")==0) { bitrate=(opus_int32)(atof(optarg)*1000.); + } else if (strcmp(optname, "bandwidth")==0) { + if (strcmp(optarg, "NB")==0) { + bandwidth = OPUS_BANDWIDTH_NARROWBAND; + } else if (strcmp(optarg, "MB")==0) { + bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; + } else if (strcmp(optarg, "WB")==0) { + bandwidth = OPUS_BANDWIDTH_WIDEBAND; + } else if (strcmp(optarg, "SWB")==0) { + bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; + } else if (strcmp(optarg, "FB")==0) { + bandwidth = OPUS_BANDWIDTH_FULLBAND; + } else { + fatal("Unknown bandwidth %s. Supported are NB, MB, WB, SWB, FB.\n", + optarg); + } } else if (strcmp(optname, "hard-cbr")==0) { with_hard_cbr=1; with_cvbr=0; @@ -965,6 +983,14 @@ int main(int argc, char **argv) if (ret != OPE_OK) { fatal("Error: OPUS_SET_BITRATE %d failed: %s\n", bitrate, ope_strerror(ret)); } + + if (bandwidth!=OPUS_AUTO) { + ret = ope_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bandwidth)); + if (ret != OPE_OK) { + fatal("Error: OPUS_SET_BANDWIDTH %d failed: %s\n", bandwidth, ope_strerror(ret)); + } + } + ret = ope_encoder_ctl(enc, OPUS_SET_VBR(!with_hard_cbr)); if (ret != OPE_OK) { fatal("Error: OPUS_SET_VBR %d failed: %s\n", !with_hard_cbr, ope_strerror(ret)); From 9b5303288e5f35f5e7c712eb61d0565ceffa234e Mon Sep 17 00:00:00 2001 From: Chema Gonzalez Date: Thu, 19 Aug 2021 09:36:22 -0700 Subject: [PATCH 2/4] opusenc: Add --dtx option --- man/opusenc.1 | 3 +++ src/opusenc.c | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/man/opusenc.1 b/man/opusenc.1 index 44726ac..1c183b9 100644 --- a/man/opusenc.1 +++ b/man/opusenc.1 @@ -109,6 +109,9 @@ Downmix to mono. .B --downmix-stereo Downmix multichannel speaker configurations to stereo. .TP +.B --dtx +Enable SILK DTX. +.TP .B --no-phase-inv Disable use of phase inversion for intensity stereo. This trades some stereo quality for a higher quality mono downmix, diff --git a/src/opusenc.c b/src/opusenc.c index a239f70..440e8b9 100644 --- a/src/opusenc.c +++ b/src/opusenc.c @@ -144,6 +144,7 @@ static void usage(void) printf(" --hard-cbr Use hard constant bitrate encoding\n"); printf(" --music Tune low bitrates for music (override automatic detection)\n"); printf(" --speech Tune low bitrates for speech (override automatic detection)\n"); + printf(" --dtx Enable DTX mode (default disabled)\n"); printf(" --comp n Set encoding complexity (0-10, default: 10 (slowest))\n"); printf(" --framesize n Set maximum frame size in milliseconds\n"); printf(" (2.5, 5, 10, 20, 40, 60, default: 20)\n"); @@ -374,6 +375,7 @@ int main(int argc, char **argv) {"cvbr",no_argument,NULL, 0}, {"music", no_argument, NULL, 0}, {"speech", no_argument, NULL, 0}, + {"dtx",no_argument,NULL, 0}, {"comp", required_argument, NULL, 0}, {"complexity", required_argument, NULL, 0}, {"framesize", required_argument, NULL, 0}, @@ -442,6 +444,7 @@ int main(int argc, char **argv) int chan=2; int with_hard_cbr=0; int with_cvbr=0; + int with_dtx=0; int signal_type=OPUS_AUTO; int expect_loss=0; int complexity=10; @@ -562,6 +565,8 @@ int main(int argc, char **argv) } else if (strcmp(optname, "vbr")==0) { with_cvbr=0; with_hard_cbr=0; + } else if (strcmp(optname, "dtx")==0) { + with_dtx=1; } else if (strcmp(optname, "help")==0) { usage(); exit(0); @@ -1006,6 +1011,13 @@ int main(int argc, char **argv) if (ret != OPE_OK) { fatal("Error: OPUS_SET_SIGNAL failed: %s\n", ope_strerror(ret)); } + if (with_dtx) { + ret = ope_encoder_ctl(enc, OPUS_SET_DTX(with_dtx)); + if (ret != OPE_OK) { + fatal("Error: OPUS_SET_DTX %d failed: %s\n", + with_dtx, ope_strerror(ret)); + } + } ret = ope_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity)); if (ret != OPE_OK) { fatal("Error: OPUS_SET_COMPLEXITY %d failed: %s\n", complexity, ope_strerror(ret)); From 8c3be20fafed02c2b3d5a4dad216ab74824e8341 Mon Sep 17 00:00:00 2001 From: Chema Gonzalez Date: Thu, 19 Aug 2021 14:04:03 -0700 Subject: [PATCH 3/4] opusenc: Add --inbandfec option --- man/opusenc.1 | 3 +++ src/opusenc.c | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/man/opusenc.1 b/man/opusenc.1 index 1c183b9..140ff2e 100644 --- a/man/opusenc.1 +++ b/man/opusenc.1 @@ -112,6 +112,9 @@ Downmix multichannel speaker configurations to stereo. .B --dtx Enable SILK DTX. .TP +.B --inbandfec +Enable in-band FEC. +.TP .B --no-phase-inv Disable use of phase inversion for intensity stereo. This trades some stereo quality for a higher quality mono downmix, diff --git a/src/opusenc.c b/src/opusenc.c index 440e8b9..ebb0b54 100644 --- a/src/opusenc.c +++ b/src/opusenc.c @@ -145,6 +145,7 @@ static void usage(void) printf(" --music Tune low bitrates for music (override automatic detection)\n"); printf(" --speech Tune low bitrates for speech (override automatic detection)\n"); printf(" --dtx Enable DTX mode (default disabled)\n"); + printf(" --inbandfec Enable enable SILK inband FEC (default disabled)\n"); printf(" --comp n Set encoding complexity (0-10, default: 10 (slowest))\n"); printf(" --framesize n Set maximum frame size in milliseconds\n"); printf(" (2.5, 5, 10, 20, 40, 60, default: 20)\n"); @@ -376,6 +377,7 @@ int main(int argc, char **argv) {"music", no_argument, NULL, 0}, {"speech", no_argument, NULL, 0}, {"dtx",no_argument,NULL, 0}, + {"inbandfec",no_argument,NULL, 0}, {"comp", required_argument, NULL, 0}, {"complexity", required_argument, NULL, 0}, {"framesize", required_argument, NULL, 0}, @@ -445,6 +447,7 @@ int main(int argc, char **argv) int with_hard_cbr=0; int with_cvbr=0; int with_dtx=0; + int with_inbandfec=0; int signal_type=OPUS_AUTO; int expect_loss=0; int complexity=10; @@ -567,6 +570,8 @@ int main(int argc, char **argv) with_hard_cbr=0; } else if (strcmp(optname, "dtx")==0) { with_dtx=1; + } else if (strcmp(optname, "inbandfec")==0) { + with_inbandfec=1; } else if (strcmp(optname, "help")==0) { usage(); exit(0); @@ -1018,6 +1023,13 @@ int main(int argc, char **argv) with_dtx, ope_strerror(ret)); } } + if (with_inbandfec) { + ret = ope_encoder_ctl(enc, OPUS_SET_INBAND_FEC(with_inbandfec)); + if (ret != OPE_OK) { + fatal("Error: OPUS_SET_INBAND_FEC %d failed: %s\n", + with_inbandfec, ope_strerror(ret)); + } + } ret = ope_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity)); if (ret != OPE_OK) { fatal("Error: OPUS_SET_COMPLEXITY %d failed: %s\n", complexity, ope_strerror(ret)); From 570d19b3450ca07adce25c5a6ecd0d2412e3ab6a Mon Sep 17 00:00:00 2001 From: Chema Gonzalez Date: Thu, 19 Aug 2021 14:25:46 -0700 Subject: [PATCH 4/4] opusenc: Add --application option --- man/opusenc.1 | 3 +++ src/opusenc.c | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/man/opusenc.1 b/man/opusenc.1 index 140ff2e..e6a42a3 100644 --- a/man/opusenc.1 +++ b/man/opusenc.1 @@ -53,6 +53,9 @@ The default for input with a sample rate of 44.1 kHz or higher is .BI --bandwidth " N" Set audio bandwidth (NB, MB, WB, SWB, FB, default: auto). .TP +.BI --application " N" +Set audio application (voip, audio, lowdelay, default: auto). +.TP .B --vbr Use variable bitrate encoding (default). In VBR mode the bitrate may go up and down freely depending on the content diff --git a/src/opusenc.c b/src/opusenc.c index ebb0b54..8abb685 100644 --- a/src/opusenc.c +++ b/src/opusenc.c @@ -139,6 +139,7 @@ static void usage(void) printf("\nEncoding options:\n"); printf(" --bitrate n.nnn Set target bitrate in kbit/s (6-256/channel)\n"); printf(" --bandwidth Set audio bandwidth (NB, MB, WB, SWB, FB)\n"); + printf(" --application Set audio application (voip, audio, lowdelay)\n"); printf(" --vbr Use variable bitrate encoding (default)\n"); printf(" --cvbr Use constrained variable bitrate encoding\n"); printf(" --hard-cbr Use hard constant bitrate encoding\n"); @@ -371,6 +372,7 @@ int main(int argc, char **argv) {"quiet", no_argument, NULL, 0}, {"bitrate", required_argument, NULL, 0}, {"bandwidth", required_argument, NULL, 0}, + {"application", required_argument, NULL, 0}, {"hard-cbr",no_argument,NULL, 0}, {"vbr",no_argument,NULL, 0}, {"cvbr",no_argument,NULL, 0}, @@ -440,6 +442,7 @@ int main(int argc, char **argv) int quiet=0; opus_int32 bitrate=-1; int bandwidth=OPUS_AUTO; + int application=OPUS_AUTO; opus_int32 rate=48000; opus_int32 frame_size=960; opus_int32 opus_frame_param = OPUS_FRAMESIZE_20_MS; @@ -559,6 +562,17 @@ int main(int argc, char **argv) fatal("Unknown bandwidth %s. Supported are NB, MB, WB, SWB, FB.\n", optarg); } + } else if (strcmp(optname, "application")==0) { + if (strcmp(optarg, "voip")==0) { + application = OPUS_APPLICATION_VOIP; + } else if (strcmp(optarg, "audio")==0) { + application = OPUS_APPLICATION_AUDIO; + } else if (strcmp(optarg, "lowdelay")==0) { + application = OPUS_APPLICATION_RESTRICTED_LOWDELAY; + } else { + fatal("Unknown application %s. Supported are voip, audio, lowdelay.\n", + optarg); + } } else if (strcmp(optname, "hard-cbr")==0) { with_hard_cbr=1; with_cvbr=0; @@ -1001,6 +1015,13 @@ int main(int argc, char **argv) } } + if (application!=OPUS_AUTO) { + ret = ope_encoder_ctl(enc, OPUS_SET_APPLICATION(application)); + if (ret != OPE_OK) { + fatal("Error: OPUS_SET_APPLICATION %d failed: %s\n", application, ope_strerror(ret)); + } + } + ret = ope_encoder_ctl(enc, OPUS_SET_VBR(!with_hard_cbr)); if (ret != OPE_OK) { fatal("Error: OPUS_SET_VBR %d failed: %s\n", !with_hard_cbr, ope_strerror(ret));