From 0ec6ec10ae06e026d2b2450a63c797bf24936b54 Mon Sep 17 00:00:00 2001 From: Dragos Oancea Date: Sat, 25 Jan 2020 16:42:07 +0000 Subject: [PATCH] [mod_opusfile] fix play sample rate (don't use original rate, always use 48k), fix EOF, add unit-test. --- src/mod/formats/mod_opusfile/Makefile.am | 21 ++- src/mod/formats/mod_opusfile/mod_opusfile.c | 19 ++- .../formats/mod_opusfile/test/freeswitch.xml | 21 +++ .../formats/mod_opusfile/test/sounds/hi.opus | Bin 0 -> 8753 bytes .../formats/mod_opusfile/test/test_opusfile.c | 123 ++++++++++++++++++ 5 files changed, 176 insertions(+), 8 deletions(-) create mode 100644 src/mod/formats/mod_opusfile/test/freeswitch.xml create mode 100644 src/mod/formats/mod_opusfile/test/sounds/hi.opus create mode 100644 src/mod/formats/mod_opusfile/test/test_opusfile.c diff --git a/src/mod/formats/mod_opusfile/Makefile.am b/src/mod/formats/mod_opusfile/Makefile.am index abf251e700..f02f8212d7 100644 --- a/src/mod/formats/mod_opusfile/Makefile.am +++ b/src/mod/formats/mod_opusfile/Makefile.am @@ -1,15 +1,30 @@ include $(top_srcdir)/build/modmake.rulesam MODNAME=mod_opusfile +noinst_LTLIBRARIES = libopusfilemod.la + +libopusfilemod_la_SOURCES = mod_opusfile.c +libopusfilemod_la_CFLAGS = $(AM_CFLAGS) $(freeswitch_LDFLAGS) $(OPUSFILE_DECODE_CFLAGS) + mod_LTLIBRARIES = mod_opusfile.la -mod_opusfile_la_SOURCES = mod_opusfile.c -mod_opusfile_la_CFLAGS = $(AM_CFLAGS) -mod_opusfile_la_LIBADD = $(switch_builddir)/libfreeswitch.la +mod_opusfile_la_SOURCES = +mod_opusfile_la_CFLAGS = $(AM_CFLAGS) $(freeswitch_LDFLAGS) $(OPUSFILE_DECODE_CFLAGS) +mod_opusfile_la_LIBADD = libopusfilemod.la $(switch_builddir)/libfreeswitch.la mod_opusfile_la_LDFLAGS = -avoid-version -module -no-undefined -shared if HAVE_OPUSFILE_DECODE mod_opusfile_la_CFLAGS += $(OPUSFILE_DECODE_CFLAGS) mod_opusfile_la_LIBADD += $(OPUSFILE_DECODE_LIBS) + +noinst_PROGRAMS = test/test_opusfile + +test_test_opusfile_SOURCES = test/test_opusfile.c +test_test_opusfile_CFLAGS = $(AM_CFLAGS) -I./ -I../ -DSWITCH_TEST_BASE_DIR_FOR_CONF=\"${abs_builddir}/test\" -DSWITCH_TEST_BASE_DIR_OVERRIDE=\"${abs_builddir}/test\" $(OPUSFILE_DECODE_CFLAGS) +test_test_opusfile_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS) $(OPUSFILE_DECODE_LIBS) +test_test_opusfile_LDADD = libopusfilemod.la $(switch_builddir)/libfreeswitch.la + +TESTS = $(noinst_PROGRAMS) + endif if HAVE_OPUSFILE_ENCODE diff --git a/src/mod/formats/mod_opusfile/mod_opusfile.c b/src/mod/formats/mod_opusfile/mod_opusfile.c index 418628b8e4..51bcb720bb 100644 --- a/src/mod/formats/mod_opusfile/mod_opusfile.c +++ b/src/mod/formats/mod_opusfile/mod_opusfile.c @@ -148,7 +148,7 @@ static switch_status_t switch_opusfile_decode(opus_file_context *context, void * if (globals.debug) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[OGG/OPUS Decoder]: EOF reached [%d]\n", ret); } - context->eof = TRUE; + context->eof = SWITCH_TRUE; break; } else /* (ret > 0)*/ { /*The number of samples read per channel on success*/ @@ -161,7 +161,6 @@ static switch_status_t switch_opusfile_decode(opus_file_context *context, void * } } switch_mutex_unlock(context->audio_mutex); - context->eof = FALSE; // for next page return SWITCH_STATUS_SUCCESS; } @@ -266,6 +265,8 @@ static switch_status_t switch_opusfile_open(switch_file_handle_t *handle, const if(context->pcm_offset!=0){ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[OGG/OPUS File] Non-zero starting PCM offset: [%li]\n", (long)context->pcm_offset); } + + context->eof = SWITCH_FALSE; context->pcm_print_offset = context->pcm_offset - DEFAULT_RATE; context->bitrate = 0; context->buffer_seconds = 1; @@ -282,7 +283,6 @@ static switch_status_t switch_opusfile_open(switch_file_handle_t *handle, const switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "[OGG/OPUS File] Channels: %i\n", head->channel_count); if (head->input_sample_rate) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "[OGG/OPUS File] Original sampling rate: %lu Hz\n", (unsigned long)head->input_sample_rate); - handle->samplerate = context->samplerate = head->input_sample_rate; } } if (op_seekable(context->of)) { @@ -365,20 +365,29 @@ static switch_status_t switch_opusfile_read(switch_file_handle_t *handle, void * if (!handle->handler) { if (switch_opusfile_decode(context, data, bytes, handle->real_channels) == SWITCH_STATUS_FALSE) { - context->eof = 1; + context->eof = SWITCH_TRUE; } } switch_mutex_lock(context->audio_mutex); rb = switch_buffer_read(context->audio_buffer, data, bytes); switch_mutex_unlock(context->audio_mutex); + if (globals.debug) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[OGG/OPUS File] rb: [%lu] bytes: [%lu]\n", rb, bytes); + } + if (!rb && (context->eof)) { + if (globals.debug) { + // should be same as returned by op_pcm_total() + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[OGG/OPUS File] EOF. sample count: [%lu]\n", handle->sample_count); + } + *len = 0; return SWITCH_STATUS_FALSE; } if (rb) { *len = rb / sizeof(int16_t) / handle->real_channels; if (globals.debug) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[OGG/OPUS File] rb: [%d] *len: [%d]\n", (int)rb, (int)*len); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[OGG/OPUS File] rb: [%lu] *len: [%lu]\n", rb, *len); } } else { newbytes = (2 * handle->samplerate * handle->real_channels) * context->buffer_seconds; diff --git a/src/mod/formats/mod_opusfile/test/freeswitch.xml b/src/mod/formats/mod_opusfile/test/freeswitch.xml new file mode 100644 index 0000000000..80591e86ac --- /dev/null +++ b/src/mod/formats/mod_opusfile/test/freeswitch.xml @@ -0,0 +1,21 @@ + + +
+ + + + + + +
+ +
+ + + + + + + +
+
diff --git a/src/mod/formats/mod_opusfile/test/sounds/hi.opus b/src/mod/formats/mod_opusfile/test/sounds/hi.opus new file mode 100644 index 0000000000000000000000000000000000000000..ae13c23cca7f5cb56f79a02ae6d3262d546a92e4 GIT binary patch literal 8753 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 + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Dragos Oancea + * + * + * test_opusfile.c -- tests mod_opusfile + * + */ +#include +#include + +#include + + +FST_CORE_BEGIN(".") +{ + FST_SUITE_BEGIN(test_opusfile) + { + FST_SETUP_BEGIN() + { + fst_requires_module("mod_loopback"); + fst_requires_module("mod_opusfile"); + } + FST_SETUP_END() + + FST_TEARDOWN_BEGIN() + { + } + FST_TEARDOWN_END() + + FST_TEST_BEGIN(opusfile_read) + { + switch_core_session_t *session = NULL; + switch_channel_t *channel = NULL; + switch_status_t status; + switch_call_cause_t cause; + /* + $ mediainfo hi.opus + General + Complete name : hi.opus + Format : OGG + File size : 8.55 KiB + Duration : 2s 157ms + Overall bit rate : 32.5 Kbps + Writing application : opusenc from opus-tools 0.1.10 + + Audio + ID : 277454932 (0x1089A054) + Format : Opus + Duration : 2s 157ms + Channel(s) : 1 channel + Channel positions : Front: C + Sampling rate : 16.0 KHz + Compression mode : Lossy + Writing library : libopus 1.2~alpha2 + */ + static char filename[] = "sounds/hi.opus"; // duration in samples: 103200 + char path[4096]; + switch_file_handle_t fh = { 0 }; + int16_t *audiobuf; + switch_size_t len; + + sprintf(path, "%s%s%s", SWITCH_GLOBAL_dirs.conf_dir, SWITCH_PATH_SEPARATOR, filename); + + status = switch_ivr_originate(NULL, &session, &cause, "null/+15553334444", 2, NULL, NULL, NULL, NULL, NULL, SOF_NONE, NULL, NULL); + fst_requires(session); + fst_check(status == SWITCH_STATUS_SUCCESS); + + status = switch_core_file_open(&fh, path, 1, 48000, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL); + fst_check(status == SWITCH_STATUS_SUCCESS); + + len = 128 * 1024 * sizeof(*audiobuf); + switch_zmalloc(audiobuf, len); + + status = switch_core_file_read(&fh, audiobuf, &len); + fst_check(status == SWITCH_STATUS_SUCCESS); + + /* [INFO] mod_opusfile.c:292 [OGG/OPUS File] Duration (samples): 103200 */ + /* compare the read sample count with the one in the OGG/OPUS header. */ + fst_check(len == 103200); + + status = switch_core_file_close(&fh); + fst_check(status == SWITCH_STATUS_SUCCESS); + + switch_safe_free(audiobuf); + channel = switch_core_session_get_channel(session); + fst_requires(channel); + + switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); + fst_check(!switch_channel_ready(channel)); + + switch_core_session_rwunlock(session); + + switch_sleep(1000000); + } + + FST_TEST_END() + } + FST_SUITE_END() +} +FST_CORE_END() -- 2.47.2