Merge branch 'master' into v1.4.beta

This commit is contained in:
Ken Rice
2013-09-05 19:05:58 -05:00
92 changed files with 2026 additions and 877 deletions
+20
View File
@@ -572,6 +572,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcbt", "libs\win32\libcbt
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_cielab_luts", "libs\spandsp\src\msvc\make_cielab_luts.2010.vcxproj", "{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_t43_gray_code_tables", "libs\spandsp\src\msvc\make_t43_gray_code_tables.2010.vcxproj", "{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
All|Win32 = All|Win32
@@ -3810,6 +3812,23 @@ Global
{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64.Build.0 = All|Win32
{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64 Setup.ActiveCfg = All|Win32
{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x86 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.Build.0 = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|x64.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|x64 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|x86 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.Build.0 = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.Build.0 = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x86 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.Build.0 = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.Build.0 = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x86 Setup.ActiveCfg = All|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -3927,6 +3946,7 @@ Global
{9D04A840-CE18-4FF5-A6D3-0A2BB92FF2E6} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{77BC1DD2-C9A1-44D7-BFFA-1320370CACB9} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{EC3E5C7F-EE09-47E2-80FE-546363D14A98} = {B8F5B47B-8568-46EB-B320-64C17D2A98BC}
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {0C808854-54D1-4230-BFF5-77B5FD905000}
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF} = {0C808854-54D1-4230-BFF5-77B5FD905000}
+20
View File
@@ -577,6 +577,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcbt", "libs\win32\libcbt
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_cielab_luts", "libs\spandsp\src\msvc\make_cielab_luts.2012.vcxproj", "{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_t43_gray_code_tables", "libs\spandsp\src\msvc\make_t43_gray_code_tables.2012.vcxproj", "{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
All|Win32 = All|Win32
@@ -3820,6 +3822,23 @@ Global
{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64.Build.0 = All|Win32
{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64 Setup.ActiveCfg = All|Win32
{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x86 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.Build.0 = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|x64.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|x64 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|x86 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.Build.0 = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.Build.0 = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x86 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.Build.0 = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.Build.0 = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64 Setup.ActiveCfg = All|Win32
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x86 Setup.ActiveCfg = All|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -3937,6 +3956,7 @@ Global
{2386B892-35F5-46CF-A0F0-10394D2FBF9B} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{77BC1DD2-C9A1-44D7-BFFA-1320370CACB9} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{EC3E5C7F-EE09-47E2-80FE-546363D14A98} = {B8F5B47B-8568-46EB-B320-64C17D2A98BC}
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {0C808854-54D1-4230-BFF5-77B5FD905000}
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF} = {0C808854-54D1-4230-BFF5-77B5FD905000}
+2 -2
View File
@@ -98,8 +98,6 @@ static const char *EVENT_NAMES[] = {
"MESSAGE",
"PRESENCE_IN",
"NOTIFY_IN",
"PHONE_FEATURE",
"PHONE_FEATURE_SUBSCRIBE",
"PRESENCE_OUT",
"PRESENCE_PROBE",
"MESSAGE_WAITING",
@@ -118,6 +116,8 @@ static const char *EVENT_NAMES[] = {
"RE_SCHEDULE",
"RELOADXML",
"NOTIFY",
"PHONE_FEATURE",
"PHONE_FEATURE_SUBSCRIBE",
"SEND_MESSAGE",
"RECV_MESSAGE",
"REQUEST_PARAMS",
+3
View File
@@ -106,6 +106,8 @@ typedef enum {
ESL_EVENT_RE_SCHEDULE,
ESL_EVENT_RELOADXML,
ESL_EVENT_NOTIFY,
ESL_EVENT_PHONE_FEATURE,
ESL_EVENT_PHONE_FEATURE_SUBSCRIBE,
ESL_EVENT_SEND_MESSAGE,
ESL_EVENT_RECV_MESSAGE,
ESL_EVENT_REQUEST_PARAMS,
@@ -117,6 +119,7 @@ typedef enum {
ESL_EVENT_SERVER_DISCONNECTED,
ESL_EVENT_SEND_INFO,
ESL_EVENT_RECV_INFO,
ESL_EVENT_RECV_RTCP_MESSAGE,
ESL_EVENT_CALL_SECURE,
ESL_EVENT_NAT,
ESL_EVENT_RECORD_START,
+1 -1
View File
@@ -1 +1 @@
Fri Aug 23 04:09:44 CDT 2013
Thu Sep 5 20:55:45 CDT 2013
@@ -618,8 +618,10 @@ static void print_media(sdp_printer_t *p,
sdp_printf(p, " %s", l->l_text);
}
else {
sdp_printf(p, " 19"); /* SDP syntax requires at least one format.
19 is used by nobody, right?. */
/* SDP syntax requires at least one format. */
/* defaults to "19", or "t38" for image */
if (m->m_type == sdp_media_image) sdp_printf(p, " t38");
else sdp_printf(p, " 19");
}
@@ -435,6 +435,9 @@ int tport_ws_init_secondary(tport_t *self, int socket, int accepted,
self->tp_has_connection = 1;
/* override the default 30 minute timeout on tport connections */
self->tp_params->tpp_idle = UINT_MAX;
if (setsockopt(socket, SOL_TCP, TCP_NODELAY, (void *)&one, sizeof one) == -1)
return *return_reason = "TCP_NODELAY", -1;
+2 -1
View File
@@ -47,7 +47,8 @@ EXTRA_DIST = autogen.sh \
unpack_g726_data.sh \
unpack_gsm0610_data.sh \
unpack_v56ter_data.sh \
wrapper.xsl
wrapper.xsl \
yum-prepare.sh
if COND_DOC
MAYBE_DOC=doc
+44 -29
View File
@@ -19,7 +19,7 @@
# @start 1
AC_PREREQ([2.59])
AC_INIT([spandsp], [0.0.7])
AC_INIT([spandsp], [1.99.0])
SPANDSP_LT_CURRENT=3
SPANDSP_LT_REVISION=0
@@ -125,6 +125,9 @@ AC_TYPE_SIGNAL
AC_ARG_ENABLE(doc, [ --enable-doc Build the documentation])
AC_ARG_ENABLE(tests, [ --enable-tests Build the test programs])
AC_ARG_ENABLE(t43, [ --enable-t43 Enable T.43 support])
AC_ARG_ENABLE(v32bis, [ --enable-v32bis Enable V.32bis support])
AC_ARG_ENABLE(v34, [ --enable-v34 Enable V.34 support])
AC_ARG_ENABLE(mmx, [ --enable-mmx Enable MMX support])
AC_ARG_ENABLE(sse, [ --enable-sse Enable SSE support])
AC_ARG_ENABLE(sse2, [ --enable-sse2 Enable SSE2 support])
@@ -265,15 +268,6 @@ then
esac
fi
AC_DEFINE([SPANDSP_SUPPORT_T42], [1], [Support T.42 JPEG compression])
SPANDSP_SUPPORT_T42="#define SPANDSP_SUPPORT_T42 1"
AC_DEFINE([SPANDSP_SUPPORT_T43], [1], [Support T.43 JBIG gray and colour compression])
SPANDSP_SUPPORT_T43="#define SPANDSP_SUPPORT_T43 1"
#AC_DEFINE([SPANDSP_SUPPORT_V32BIS], [1], [Support the V.32bis modem])
SPANDSP_SUPPORT_V32BIS="#undef SPANDSP_SUPPORT_V32BIS"
#AC_DEFINE([SPANDSP_SUPPORT_V34], [1], [Support the V.34 FAX modem])
SPANDSP_SUPPORT_V34="#undef SPANDSP_SUPPORT_V34"
AC_CHECK_LIB([m], [cos])
# Some platforms still seem to lack the basic single precision trig and power related functions.
AC_SEARCH_LIBS([sinf], [m], AC_DEFINE([HAVE_SINF], [1], [Define to 1 if you have the sinf() function.]))
@@ -524,21 +518,6 @@ x86_64-* | i386-* | i686-*)
;;
esac
AM_CONDITIONAL([COND_DOC], [test "$enable_doc" = yes])
AM_CONDITIONAL([COND_TESTS], [test "$enable_tests" = yes])
AM_CONDITIONAL([COND_MMX], [test "$enable_mmx" = yes])
AM_CONDITIONAL([COND_SSE], [test "$enable_sse" = yes])
AM_CONDITIONAL([COND_SSE2], [test "$enable_sse2" = yes])
AM_CONDITIONAL([COND_SSE3], [test "$enable_sse3" = yes])
AM_CONDITIONAL([COND_SSSE3], [test "$enable_ssse3" = yes])
AM_CONDITIONAL([COND_SSE4_1], [test "$enable_sse4_1" = yes])
AM_CONDITIONAL([COND_SSE4_2], [test "$enable_sse4_2" = yes])
AM_CONDITIONAL([COND_SSE4A], [test "$enable_sse4a" = yes])
AM_CONDITIONAL([COND_SSE5], [test "$enable_sse5" = yes])
AM_CONDITIONAL([COND_AVX], [test "$enable_avx" = yes])
AM_CONDITIONAL([COND_AVX2], [test "$enable_avx2" = yes])
AM_CONDITIONAL([COND_NEON], [test "$enable_neon" = yes])
if test "$enable_builtin_tiff" = "yes" ; then
abs_tiffdir="`cd $srcdir/../tiff-4.0.2/ && pwd`"
save_CFLAGS=$CFLAGS
@@ -553,9 +532,7 @@ if test "$enable_builtin_tiff" = "yes" ; then
AC_DEFINE([HAVE_LIBTIFF], [1], [Define to 1 if you have the `tiff' library (-ltiff).])
else
AC_CHECK_HEADERS([tiffio.h])
AC_CHECK_HEADERS([tif_dir.h], [], [], [#include <tiffio.h>
])
AC_CHECK_LIB([tiff], [TIFFOpen], [TIFF_LIBS="-ltiff"], AC_MSG_ERROR("Cannot build without libtiff (does your system require a libtiff-devel package?)"), -lm)
AC_CHECK_LIB([tiff], [TIFFOpen], , AC_MSG_ERROR("Cannot build without libtiff (does your system require a libtiff-devel package?)"), -lm)
fi
AC_CHECK_LIB([tiff], [TIFFCreateCustomDirectory], [
@@ -574,6 +551,45 @@ LIBS="$LIBS $TIFF_LIBS $JPEG_LIBS"
TESTLIBS="$SIMLIBS $TESTLIBS"
if test "$enable_t43" = "yes" ; then
AC_DEFINE([SPANDSP_SUPPORT_T43], [1], [Support T.43 JBIG gray and colour compression])
SPANDSP_SUPPORT_T43="#define SPANDSP_SUPPORT_T43 1"
else
SPANDSP_SUPPORT_T43="#undef SPANDSP_SUPPORT_T43"
fi
if test "$enable_v32bis" = "yes" ; then
AC_DEFINE([SPANDSP_SUPPORT_V32BIS], [1], [Support the V.32bis modem])
SPANDSP_SUPPORT_V32BIS="#define SPANDSP_SUPPORT_V32BIS 1"
else
SPANDSP_SUPPORT_V32BIS="#undef SPANDSP_SUPPORT_V32BIS"
fi
if test "$enable_v34" = "yes" ; then
AC_DEFINE([SPANDSP_SUPPORT_V34], [1], [Support the V.34 FAX modem])
SPANDSP_SUPPORT_V34="#define SPANDSP_SUPPORT_V34 1"
else
SPANDSP_SUPPORT_V34="#undef SPANDSP_SUPPORT_V34"
fi
AM_CONDITIONAL([COND_DOC], [test "$enable_doc" = yes])
AM_CONDITIONAL([COND_TESTS], [test "$enable_tests" = yes])
AM_CONDITIONAL([COND_MMX], [test "$enable_mmx" = yes])
AM_CONDITIONAL([COND_SSE], [test "$enable_sse" = yes])
AM_CONDITIONAL([COND_SSE2], [test "$enable_sse2" = yes])
AM_CONDITIONAL([COND_SSE3], [test "$enable_sse3" = yes])
AM_CONDITIONAL([COND_SSSE3], [test "$enable_ssse3" = yes])
AM_CONDITIONAL([COND_SSE4_1], [test "$enable_sse4_1" = yes])
AM_CONDITIONAL([COND_SSE4_2], [test "$enable_sse4_2" = yes])
AM_CONDITIONAL([COND_SSE4A], [test "$enable_sse4a" = yes])
AM_CONDITIONAL([COND_SSE5], [test "$enable_sse5" = yes])
AM_CONDITIONAL([COND_AVX], [test "$enable_avx" = yes])
AM_CONDITIONAL([COND_AVX2], [test "$enable_avx2" = yes])
AM_CONDITIONAL([COND_NEON], [test "$enable_neon" = yes])
AM_CONDITIONAL([COND_V32BIS], [test yes = xyes])
AM_CONDITIONAL([COND_V34], [test yes = xyes])
AC_SUBST(SPANDSP_LT_CURRENT)
AC_SUBST(SPANDSP_LT_REVISION)
AC_SUBST(SPANDSP_LT_AGE)
@@ -586,7 +602,6 @@ AC_SUBST(TESTLIBS)
AC_SUBST(SPANDSP_USE_FIXED_POINT)
AC_SUBST(SPANDSP_MISALIGNED_ACCESS_FAILS)
AC_SUBST(SPANDSP_USE_EXPORT_CAPABILITY)
AC_SUBST(SPANDSP_SUPPORT_T42)
AC_SUBST(SPANDSP_SUPPORT_T43)
AC_SUBST(SPANDSP_SUPPORT_V32BIS)
AC_SUBST(SPANDSP_SUPPORT_V34)
+2 -2
View File
@@ -2,12 +2,12 @@
Summary: A DSP library for telephony.
Name: spandsp
Version: 0.0.7
Version: 1.99.0
Release: 1
License: LGPLv2 and GPLv2
Group: System Environment/Libraries
URL: http://www.soft-switch.org/spandsp
Source: http://www.soft-switch.org/downloads/spandsp/spandsp-0.0.7.tar.gz
Source: http://www.soft-switch.org/downloads/spandsp/spandsp-1.99.0.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: libtiff-devel%{?_isa}
+13 -1
View File
@@ -82,6 +82,16 @@ AM_CPPFLAGS = -I$(top_builddir)
lib_LTLIBRARIES = libspandsp.la
if COND_V32BIS
V32BIS_SOURCES = v32bis.c
endif
if COND_V34
V34_SOURCES = v34rx.c \
v34tx.c \
v34_logging.c
endif
libspandsp_la_SOURCES = ademco_contactid.c \
adsi.c \
alloc.c \
@@ -173,7 +183,9 @@ libspandsp_la_SOURCES = ademco_contactid.c \
v42bis.c \
v8.c \
vector_float.c \
vector_int.c
vector_int.c \
$(V32BIS_SOURCES) \
$(V34_SOURCES)
libspandsp_la_LDFLAGS = -version-info @SPANDSP_LT_CURRENT@:@SPANDSP_LT_REVISION@:@SPANDSP_LT_AGE@ $(COMP_VENDOR_LDFLAGS)
+47 -21
View File
@@ -50,21 +50,25 @@
#include "spandsp/telephony.h"
#include "spandsp/alloc.h"
#ifdef _MSC_VER
#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable:4232) /* address of dllimport is not static, identity not guaranteed */
#endif
#if defined(HAVE_ALIGNED_ALLOC)
static span_aligned_alloc_t __span_aligned_alloc = aligned_alloc;
static span_aligned_free_t __span_aligned_free = free;
#elif defined(HAVE_MEMALIGN)
static span_aligned_alloc_t __span_aligned_alloc = memalign;
#elif defined(HAVE_POSIX_MEMALIGN)
static void *fake_posix_memalign(size_t alignment, size_t size);
static span_aligned_alloc_t __span_aligned_alloc = fake_posix_memalign;
static span_aligned_free_t __span_aligned_free = free;
#elif defined(__MSVC__)
static void *fake_aligned_alloc(size_t alignment, size_t size);
static span_aligned_alloc_t __span_aligned_alloc = fake_aligned_alloc;
static span_aligned_free_t __span_aligned_free = _aligned_free;
#else
static void *fake_aligned_alloc(size_t alignment, size_t size);
static span_aligned_alloc_t __span_aligned_alloc = fake_aligned_alloc;
static span_aligned_free_t __span_aligned_free = free;
#endif
static span_alloc_t __span_alloc = malloc;
static span_realloc_t __span_realloc = realloc;
@@ -76,12 +80,19 @@ static span_free_t __span_free = free;
#if defined(HAVE_ALIGNED_ALLOC)
#elif defined(HAVE_MEMALIGN)
#elif defined(__MSVC__)
static void *fake_aligned_alloc(size_t alignment, size_t size)
{
/* Make Microsoft's _aligned_malloc() look like the C11 aligned_alloc */
return _aligned_malloc(size, alignment);
}
/*- End of function --------------------------------------------------------*/
#elif defined(HAVE_POSIX_MEMALIGN)
static void *fake_posix_memalign(size_t alignment, size_t size)
static void *fake_aligned_alloc(size_t alignment, size_t size)
{
void *ptr;
/* Make posix_memalign look like the more modern aligned_alloc */
/* Make posix_memalign() look like the C11 aligned_alloc */
posix_memalign(&ptr, alignment, size);
return ptr;
}
@@ -94,12 +105,6 @@ static void *fake_aligned_alloc(size_t alignment, size_t size)
/*- End of function --------------------------------------------------------*/
#endif
SPAN_DECLARE(void *) span_aligned_alloc(size_t alignment, size_t size)
{
return __span_aligned_alloc(alignment, size);
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(void *) span_alloc(size_t size)
{
return __span_alloc(size);
@@ -118,11 +123,28 @@ SPAN_DECLARE(void) span_free(void *ptr)
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) span_mem_allocators(span_aligned_alloc_t custom_aligned_alloc,
span_alloc_t custom_alloc,
span_realloc_t custom_realloc,
span_free_t custom_free)
SPAN_DECLARE(void *) span_aligned_alloc(size_t alignment, size_t size)
{
return __span_aligned_alloc(alignment, size);
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(void) span_aligned_free(void *ptr)
{
__span_aligned_free(ptr);
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) span_mem_allocators(span_alloc_t custom_alloc,
span_realloc_t custom_realloc,
span_free_t custom_free,
span_aligned_alloc_t custom_aligned_alloc,
span_aligned_free_t custom_aligned_free)
{
__span_alloc = (custom_alloc) ? custom_alloc : malloc;
__span_realloc = (custom_realloc) ? custom_realloc : realloc;
__span_free = (custom_free) ? custom_free : free;
__span_aligned_alloc = (custom_aligned_alloc)
?
custom_aligned_alloc
@@ -131,14 +153,18 @@ SPAN_DECLARE(int) span_mem_allocators(span_aligned_alloc_t custom_aligned_alloc,
aligned_alloc;
#elif defined(HAVE_MEMALIGN)
memalign;
#elif defined(HAVE_POSIX_MEMALIGN)
fake_posix_memalign;
#else
fake_aligned_alloc;
#endif
__span_alloc = (custom_alloc) ? custom_alloc : malloc;
__span_realloc = (custom_realloc) ? custom_realloc : realloc;
__span_free = (custom_free) ? custom_free : free;
__span_aligned_free = (custom_aligned_free)
?
custom_aligned_free
:
#if defined(__MSVC__)
_aligned_free;
#else
free;
#endif
return 0;
}
/*- End of function --------------------------------------------------------*/
-4
View File
@@ -84,9 +84,7 @@
#include "spandsp/t81_t82_arith_coding.h"
#include "spandsp/t85.h"
#include "spandsp/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
@@ -117,9 +115,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/image_translate.h"
+8
View File
@@ -56,6 +56,7 @@
#include "spandsp/alloc.h"
#include "spandsp/logging.h"
#include "spandsp/bit_operations.h"
#include "spandsp/bitstream.h"
#include "spandsp/dc_restore.h"
#include "spandsp/queue.h"
#include "spandsp/power_meter.h"
@@ -73,14 +74,21 @@
#include "spandsp/v27ter_rx.h"
#include "spandsp/v17tx.h"
#include "spandsp/v17rx.h"
#if defined(SPANDSP_SUPPORT_V34)
#include "spandsp/v34.h"
#endif
#include "spandsp/super_tone_rx.h"
#include "spandsp/modem_connect_tones.h"
#include "spandsp/fax_modems.h"
#include "spandsp/private/logging.h"
#include "spandsp/private/bitstream.h"
#include "spandsp/private/silence_gen.h"
#include "spandsp/private/power_meter.h"
#include "spandsp/private/fsk.h"
#if defined(SPANDSP_SUPPORT_V34)
#include "spandsp/private/v34.h"
#endif
#include "spandsp/private/v17tx.h"
#include "spandsp/private/v17rx.h"
#include "spandsp/private/v27ter_tx.h"
-4
View File
@@ -67,9 +67,7 @@
#include "spandsp/t81_t82_arith_coding.h"
#include "spandsp/t85.h"
#include "spandsp/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
#include "spandsp/image_translate.h"
@@ -78,9 +76,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/image_translate.h"
+7
View File
@@ -211,6 +211,7 @@
<ClCompile Include="super_tone_tx.c" />
<ClCompile Include="swept_tone.c" />
<ClCompile Include="t42.c" />
<ClCompile Include="t43.c" />
<ClCompile Include="t4_rx.c" />
<ClCompile Include="t4_t6_decode.c" />
<ClCompile Include="t4_t6_encode.c" />
@@ -294,6 +295,7 @@
<ClInclude Include="spandsp\private\ademco_contactid.h" />
<ClInclude Include="spandsp\private\image_translate.h" />
<ClInclude Include="spandsp\private\t42.h" />
<ClInclude Include="spandsp\private\t43.h" />
<ClInclude Include="spandsp\private\t81_t82_arith_coding.h" />
<ClInclude Include="spandsp\private\t85.h" />
<ClInclude Include="spandsp\queue.h" />
@@ -305,6 +307,7 @@
<ClInclude Include="spandsp\super_tone_tx.h" />
<ClInclude Include="spandsp\swept_tone.h" />
<ClInclude Include="spandsp\t42.h" />
<ClInclude Include="spandsp\t43.h" />
<ClInclude Include="spandsp\t4_rx.h" />
<ClInclude Include="spandsp\t4_tx.h" />
<ClInclude Include="spandsp\t4_t6_decode.h" />
@@ -438,6 +441,10 @@
<Project>{329a6fa0-0fcc-4435-a950-e670aefa9838}</Project>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
<ProjectReference Include="msvc\make_t43_gray_code_tables.2010.vcxproj">
<Project>{eddb8ab9-c53e-44c0-a620-0e86c2cbd5d5}</Project>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
@@ -286,6 +286,9 @@
<ClCompile Include="alloc.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="t43.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="spandsp\adsi.h">
@@ -725,6 +728,12 @@
<ClInclude Include="spandsp\private\image_translate.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="spandsp\t43.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="spandsp\private\t43.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="msvc\spandsp.h" />
+7
View File
@@ -215,6 +215,7 @@
<ClCompile Include="super_tone_tx.c" />
<ClCompile Include="swept_tone.c" />
<ClCompile Include="t42.c" />
<ClCompile Include="t43.c" />
<ClCompile Include="t4_rx.c" />
<ClCompile Include="t4_t6_decode.c" />
<ClCompile Include="t4_t6_encode.c" />
@@ -298,6 +299,7 @@
<ClInclude Include="spandsp\private\ademco_contactid.h" />
<ClInclude Include="spandsp\private\image_translate.h" />
<ClInclude Include="spandsp\private\t42.h" />
<ClInclude Include="spandsp\private\t43.h" />
<ClInclude Include="spandsp\private\t81_t82_arith_coding.h" />
<ClInclude Include="spandsp\private\t85.h" />
<ClInclude Include="spandsp\queue.h" />
@@ -309,6 +311,7 @@
<ClInclude Include="spandsp\super_tone_tx.h" />
<ClInclude Include="spandsp\swept_tone.h" />
<ClInclude Include="spandsp\t42.h" />
<ClInclude Include="spandsp\t43.h" />
<ClInclude Include="spandsp\t4_rx.h" />
<ClInclude Include="spandsp\t4_tx.h" />
<ClInclude Include="spandsp\t4_t6_decode.h" />
@@ -442,6 +445,10 @@
<Project>{329a6fa0-0fcc-4435-a950-e670aefa9838}</Project>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
<ProjectReference Include="msvc\make_t43_gray_code_tables.2012.vcxproj">
<Project>{eddb8ab9-c53e-44c0-a620-0e86c2cbd5d5}</Project>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
@@ -286,6 +286,9 @@
<ClCompile Include="alloc.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="t43.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="spandsp\adsi.h">
@@ -725,6 +728,12 @@
<ClInclude Include="spandsp\private\image_translate.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="spandsp\t43.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="spandsp\private\t43.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="msvc\spandsp.h" />
+1 -1
View File
@@ -41,7 +41,7 @@ int main(int argc, char *argv[])
int j;
int gray;
int new_gray;
int restore;
int restore = 0;
printf("static const int16_t gray_code[4096] =\n{\n");
for (i = 0; i < 4096; i++)
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="All|Win32">
<Configuration>All</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectName>make_t43_gray_code_tables</ProjectName>
<ProjectGuid>{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}</ProjectGuid>
<RootNamespace>make_t43_gray_code_tables</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='All|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='All|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
<OutDir Condition="'$(Configuration)|$(Platform)'=='All|Win32'">$(PlatformName)\$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='All|Win32'">$(PlatformName)\make_t43_gray_code_tables\$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='All|Win32'">false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='All|Win32'">
<BuildLog>
<Path>$(IntDir)BuildLog $(ProjectName).htm</Path>
</BuildLog>
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>.;.\spandsp;.\msvc;..\..\tiff-4.0.2\libtiff;.\generated;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<PostBuildEvent>
<Command>"$(TargetPath)" &gt;"$(ProjectDir)..\t43_gray_code_tables.h"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\make_t43_gray_code_tables.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\make_t43_gray_code_tables.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="All|Win32">
<Configuration>All</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectName>make_t43_gray_code_tables</ProjectName>
<ProjectGuid>{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}</ProjectGuid>
<RootNamespace>make_t43_gray_code_tables</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='All|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='All|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
<OutDir Condition="'$(Configuration)|$(Platform)'=='All|Win32'">$(PlatformName)\$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='All|Win32'">$(PlatformName)\make_t43_gray_code_tables\$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='All|Win32'">false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='All|Win32'">
<BuildLog>
<Path>$(IntDir)BuildLog $(ProjectName).htm</Path>
</BuildLog>
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>.;.\spandsp;.\msvc;..\..\tiff-4.0.2\libtiff;.\generated;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<PostBuildEvent>
<Command>"$(TargetPath)" &gt;"$(ProjectDir)..\t43_gray_code_tables.h"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\make_t43_gray_code_tables.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\make_t43_gray_code_tables.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
-2
View File
@@ -117,9 +117,7 @@
#include <spandsp/t81_t82_arith_coding.h>
#include <spandsp/t85.h>
#include <spandsp/t42.h>
#if defined(SPANDSP_SUPPORT_T43)
#include <spandsp/t43.h>
#endif
#include <spandsp/t30.h>
#include <spandsp/t30_api.h>
#include <spandsp/t30_fcf.h>
+5 -8
View File
@@ -33,7 +33,6 @@
@SPANDSP_USE_EXPORT_CAPABILITY@
@SPANDSP_SUPPORT_T42@
@SPANDSP_SUPPORT_T43@
@SPANDSP_SUPPORT_V32BIS@
@SPANDSP_SUPPORT_V34@
@@ -93,21 +92,21 @@
#include <spandsp/modem_connect_tones.h>
#include <spandsp/silence_gen.h>
#include <spandsp/v8.h>
#include <spandsp/v42.h>
#include <spandsp/v42bis.h>
#include <spandsp/v29rx.h>
#include <spandsp/v29tx.h>
#include <spandsp/v17rx.h>
#include <spandsp/v17tx.h>
#if defined(SPANDSP_SUPPORT_V32BIS)
#include <spandsp/v32bis.h>
#endif
#include <spandsp/v22bis.h>
#include <spandsp/v27ter_rx.h>
#include <spandsp/v27ter_tx.h>
#if defined(SPANDSP_SUPPORT_V32BIS)
#include <spandsp/v32bis.h>
#endif
#if defined(SPANDSP_SUPPORT_V34)
#include <spandsp/v34.h>
#endif
#include <spandsp/v42.h>
#include <spandsp/v42bis.h>
#include <spandsp/v18.h>
#include <spandsp/timezone.h>
#include <spandsp/t4_rx.h>
@@ -118,9 +117,7 @@
#include <spandsp/t81_t82_arith_coding.h>
#include <spandsp/t85.h>
#include <spandsp/t42.h>
#if defined(SPANDSP_SUPPORT_T43)
#include <spandsp/t43.h>
#endif
#include <spandsp/t30.h>
#include <spandsp/t30_api.h>
#include <spandsp/t30_fcf.h>
+19 -5
View File
@@ -28,7 +28,17 @@
#if !defined(_SPANDSP_ALLOC_H_)
#define _SPANDSP_ALLOC_H_
/* Notes:
- Most platforms don't have an aligned realloc function, so we don't try to
support an aligned realloc on any platform.
- Some platforms use a special free function for memory which was allocated
by alligned allocation functions. We use a separate aligned_free function
on all platforms, for compatibility, even though it may simply reduce to
free().
*/
typedef void *(*span_aligned_alloc_t)(size_t alignment, size_t size);
typedef void (*span_aligned_free_t)(void *ptr);
typedef void *(*span_alloc_t)(size_t size);
typedef void *(*span_realloc_t)(void *ptr, size_t size);
typedef void (*span_free_t)(void *ptr);
@@ -41,20 +51,24 @@ extern "C"
/* Allocate size bytes allocated to ALIGNMENT bytes. */
SPAN_DECLARE(void *) span_aligned_alloc(size_t alignment, size_t size);
/* Free a block allocated by span_aligned_alloc, or span_aligned_realloc. */
SPAN_DECLARE(void) span_aligned_free(void *ptr);
/* Allocate size bytes of memory. */
SPAN_DECLARE(void *) span_alloc(size_t size);
/* Re-allocate the previously allocated block in ptr, making the new block size bytes long. */
SPAN_DECLARE(void *) span_realloc(void *ptr, size_t size);
/* Free a block allocated by span_alloc, span_aligned_alloc, or span_realloc. */
/* Free a block allocated by span_alloc or span_realloc. */
SPAN_DECLARE(void) span_free(void *ptr);
SPAN_DECLARE(int) span_mem_allocators(span_aligned_alloc_t custom_aligned_alloc,
span_alloc_t custom_alloc,
SPAN_DECLARE(int) span_mem_allocators(span_alloc_t custom_alloc,
span_realloc_t custom_realloc,
span_free_t custom_free);
span_free_t custom_free,
span_aligned_alloc_t custom_aligned_alloc,
span_aligned_free_t custom_aligned_free);
#if defined(__cplusplus)
}
#endif
+6
View File
@@ -73,6 +73,12 @@
#include <spandsp/private/v27ter_tx.h>
#include <spandsp/private/v29rx.h>
#include <spandsp/private/v29tx.h>
#if defined(SPANDSP_SUPPORT_V32BIS)
#include <spandsp/private/v32bis.h>
#endif
#if defined(SPANDSP_SUPPORT_V34)
#include <spandsp/private/v34.h>
#endif
#include <spandsp/private/v42.h>
#include <spandsp/private/v42bis.h>
#include <spandsp/private/at_interpreter.h>
+12
View File
@@ -46,6 +46,9 @@ struct t30_state_s
/*! \brief True if behaving as the calling party */
bool calling_party;
/*! \brief True if bad quality pages should be kept */
bool keep_bad_pages;
/*! \brief Internet aware FAX mode bit mask. */
int iaf;
/*! \brief A bit mask of the currently supported modem types. */
@@ -139,6 +142,15 @@ struct t30_state_s
/*! \brief An opaque pointer passed to the transmitted HDLC frame handler. */
void *send_hdlc_user_data;
/*! \brief The document send handler. */
t30_document_get_handler_t document_get_handler;
/*! \brief An opaque pointer passed to the document send handler. */
void *document_get_user_data;
/*! \brief The document delivery handler. */
t30_document_put_handler_t document_put_handler;
/*! \brief An opaque pointer passed to the document delivery handler. */
void *document_put_user_data;
/*! \brief The DIS code for the minimum scan row time we require. This is usually 0ms,
but if we are trying to simulate another type of FAX machine, we may need a non-zero
value here. */
+8 -7
View File
@@ -91,6 +91,13 @@ typedef struct
const char *dcs;
} t4_rx_metadata_t;
typedef struct
{
uint8_t *buf;
int buf_len;
int buf_ptr;
} no_decoder_state_t;
/*!
T.4 FAX decompression descriptor. This defines the working state
for a single instance of a T.4 FAX decompression channel.
@@ -114,15 +121,14 @@ struct t4_rx_state_s
union
{
no_decoder_state_t no_decoder;
t4_t6_decode_state_t t4_t6;
t85_decode_state_t t85;
#if defined(SPANDSP_SUPPORT_T88)
t88_decode_state_t t88;
#endif
t42_decode_state_t t42;
#if defined(SPANDSP_SUPPORT_T43)
t43_decode_state_t t43;
#endif
#if defined(SPANDSP_SUPPORT_T45)
t45_decode_state_t t45;
#endif
@@ -132,11 +138,6 @@ struct t4_rx_state_s
int current_decoder;
uint8_t *pre_encoded_buf;
int pre_encoded_len;
int pre_encoded_ptr;
int pre_encoded_bit;
/* Supporting information, like resolutions, which the backend may want. */
t4_rx_metadata_t metadata;
+10 -6
View File
@@ -100,6 +100,14 @@ typedef struct
int resolution_code;
} t4_tx_metadata_t;
typedef struct
{
uint8_t *buf;
int buf_len;
int buf_ptr;
int bit;
} no_encoder_state_t;
/*!
T.4 FAX compression descriptor. This defines the working state
for a single instance of a T.4 FAX compression channel.
@@ -149,15 +157,14 @@ struct t4_tx_state_s
union
{
no_encoder_state_t no_encoder;
t4_t6_encode_state_t t4_t6;
t85_encode_state_t t85;
#if defined(SPANDSP_SUPPORT_T88)
t88_encode_state_t t88;
#endif
t42_encode_state_t t42;
#if defined(SPANDSP_SUPPORT_T43)
t43_encode_state_t t43;
#endif
#if defined(SPANDSP_SUPPORT_T45)
t45_encode_state_t t45;
#endif
@@ -176,10 +183,7 @@ struct t4_tx_state_s
int pack_row;
int pack_bit_mask;
uint8_t *pre_encoded_buf;
int pre_encoded_len;
int pre_encoded_ptr;
int pre_encoded_bit;
no_encoder_state_t no_encoder;
/*! \brief Supporting information, like resolutions, which the backend may want. */
t4_tx_metadata_t metadata;
+20
View File
@@ -223,6 +223,26 @@ typedef void (*t30_set_handler_t)(void *user_data, int type, int bit_rate, int s
*/
typedef void (*t30_send_hdlc_handler_t)(void *user_data, const uint8_t msg[], int len);
/*!
T.30 send document handler.
\brief T.30 send document handler.
\param user_data An opaque pointer.
\param msg The document chunk.
\param len The length of the chunk.
\return The actual length of the chunk.
*/
typedef int (*t30_document_get_handler_t)(void *user_data, uint8_t msg[], int len);
/*!
T.30 deliver document handler.
\brief T.30 deliver handler.
\param user_data An opaque pointer.
\param msg The document chunk.
\param len The length of the chunk.
\return The delivery status.
*/
typedef int (*t30_document_put_handler_t)(void *user_data, const uint8_t msg[], int len);
/*!
T.30 protocol completion codes, at phase E.
*/
+10
View File
@@ -225,6 +225,12 @@ SPAN_DECLARE(const char *) t30_get_tx_password(t30_state_t *s);
\return A pointer to the password. */
SPAN_DECLARE(const char *) t30_get_rx_password(t30_state_t *s);
/*! Set the save bad quality pages handling associated with a T.30 context.
\brief Set the save bad quality pages handling associated with a T.30 context.
\param s The T.30 context.
\param keep_bad_pages True to save bad quality pages. */
SPAN_DECLARE(void) t30_set_keep_bad_quality_pages(t30_state_t *s, bool keep_bad_pages);
/*! Set the transmitted TSA (i.e. the one we will send to the far
end) associated with a T.30 context.
\brief Set the transmitted TSA associated with a T.30 context.
@@ -543,6 +549,10 @@ SPAN_DECLARE(void) t30_set_document_handler(t30_state_t *s, t30_document_handler
\param user_data An opaque pointer passed to the callback function. */
SPAN_DECLARE(void) t30_set_real_time_frame_handler(t30_state_t *s, t30_real_time_frame_handler_t handler, void *user_data);
SPAN_DECLARE(void) t30_set_document_get_handler(t30_state_t *s, t30_document_get_handler_t handler, void *user_data);
SPAN_DECLARE(void) t30_set_document_put_handler(t30_state_t *s, t30_document_put_handler_t handler, void *user_data);
/*! Get a pointer to the logging context associated with a T.30 context.
\brief Get a pointer to the logging context associated with a T.30 context.
\param s The T.30 context.
+2
View File
@@ -76,6 +76,8 @@ SPAN_DECLARE(void) set_lab_gamut2(lab_params_t *s, int L_P, int L_Q, int a_P, in
SPAN_DECLARE(void) get_lab_gamut2(lab_params_t *s, int *L_P, int *L_Q, int *a_P, int *a_Q, int *b_P, int *b_Q);
SPAN_DECLARE(bool) t42_analyse_header(uint32_t *width, uint32_t *length, const uint8_t data[], size_t len);
SPAN_DECLARE(void) t42_encode_set_options(t42_encode_state_t *s, uint32_t l0, int quality, int options);
SPAN_DECLARE(int) t42_encode_set_image_width(t42_encode_state_t *s, uint32_t image_width);
+2 -1
View File
@@ -175,7 +175,8 @@ ImageLayer(34732) LONG
*/
/* Define the TIFF/FX tags to extend libtiff, when using a version of libtiff where this
stuff has not been merged. */
stuff has not been merged. We only need to define these things for older versions of
libtiff. */
#if defined(SPANDSP_SUPPORT_TIFF_FX) && !defined(TIFFTAG_FAXPROFILE)
#define TIFFTAG_INDEXED 346
#define TIFFTAG_GLOBALPARAMETERSIFD 400
+2
View File
@@ -64,6 +64,8 @@ extern "C"
{
#endif
SPAN_DECLARE(bool) t85_analyse_header(uint32_t *width, uint32_t *length, const uint8_t data[], size_t len);
/*! \brief Check if we are at the end of the current document page.
\param s The T.85 context.
\return 0 for more data to come. SIG_STATUS_END_OF_DATA for no more data. */
+82 -120
View File
@@ -71,9 +71,7 @@
#include "spandsp/t81_t82_arith_coding.h"
#include "spandsp/t85.h"
#include "spandsp/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
#include "spandsp/t30_fcf.h"
@@ -87,9 +85,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/image_translate.h"
@@ -789,9 +785,13 @@ static int get_partial_ecm_page(t30_state_t *s)
/* These frames contain a frame sequence number within the partial page (one octet) followed
by some image data. */
s->ecm_data[i][3] = (uint8_t) i;
if ((len = t4_tx_get(&s->t4.tx, &s->ecm_data[i][4], s->octets_per_ecm_frame)) < s->octets_per_ecm_frame)
if (s->document_get_handler)
len = s->document_get_handler(s->document_get_user_data, &s->ecm_data[i][4], s->octets_per_ecm_frame);
else
len = t4_tx_get(&s->t4.tx, &s->ecm_data[i][4], s->octets_per_ecm_frame);
if (len < s->octets_per_ecm_frame)
{
/* The image is not big enough to fill the entire buffer */
/* The document is not big enough to fill the entire buffer */
/* We need to pad to a full frame, as most receivers expect that. */
if (len > 0)
{
@@ -799,7 +799,7 @@ static int get_partial_ecm_page(t30_state_t *s)
s->ecm_len[i++] = (int16_t) (s->octets_per_ecm_frame + 4);
}
s->ecm_frames = i;
span_log(&s->logging, SPAN_LOG_FLOW, "Partial page buffer contains %d frames (%d per frame)\n", i, s->octets_per_ecm_frame);
span_log(&s->logging, SPAN_LOG_FLOW, "Partial document buffer contains %d frames (%d per frame)\n", i, s->octets_per_ecm_frame);
s->ecm_at_page_end = true;
return i;
}
@@ -1498,19 +1498,15 @@ static int build_dcs(t30_state_t *s)
set_ctrl_bits(s->dcs_frame, T30_MIN_SCAN_0MS, T30_DCS_BIT_MIN_SCAN_LINE_TIME_1);
use_bilevel = false;
break;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
set_ctrl_bit(s->dcs_frame, T30_DCS_BIT_T43_MODE);
if (image_type == T4_IMAGE_TYPE_COLOUR_8BIT || image_type == T4_IMAGE_TYPE_COLOUR_12BIT)
set_ctrl_bit(s->dcs_frame, T30_DCS_BIT_FULL_COLOUR_MODE);
if (image_type == T4_IMAGE_TYPE_GRAY_12BIT || image_type == T4_IMAGE_TYPE_COLOUR_12BIT)
set_ctrl_bit(s->dcs_frame, T30_DCS_BIT_12BIT_COMPONENT);
//if (???????? & T4_COMPRESSION_NO_SUBSAMPLING))
// set_ctrl_bit(s->dcs_frame, T30_DCS_BIT_NO_SUBSAMPLING);
set_ctrl_bits(s->dcs_frame, T30_MIN_SCAN_0MS, T30_DCS_BIT_MIN_SCAN_LINE_TIME_1);
use_bilevel = false;
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
use_bilevel = false;
@@ -1788,25 +1784,12 @@ static int analyze_rx_dis_dtc(t30_state_t *s, const uint8_t *msg, int len)
s->mutual_colour_resolutions &= ~T4_RESOLUTION_300_300;
}
if (!test_ctrl_bit(s->far_dis_dtc_frame, T30_DIS_BIT_200_400_CAPABLE))
{
if (!test_ctrl_bit(s->far_dis_dtc_frame, T30_DIS_BIT_INCH_RESOLUTION_PREFERRED))
s->mutual_bilevel_resolutions &= ~T4_RESOLUTION_200_400;
if (!test_ctrl_bit(s->far_dis_dtc_frame, T30_DIS_BIT_METRIC_RESOLUTION_PREFERRED))
s->mutual_bilevel_resolutions &= ~T4_RESOLUTION_R8_SUPERFINE;
}
s->mutual_bilevel_resolutions &= ~(T4_RESOLUTION_200_400 | T4_RESOLUTION_R8_SUPERFINE);
if (!test_ctrl_bit(s->far_dis_dtc_frame, T30_DIS_BIT_200_200_CAPABLE))
{
if (!test_ctrl_bit(s->far_dis_dtc_frame, T30_DIS_BIT_INCH_RESOLUTION_PREFERRED))
s->mutual_bilevel_resolutions &= ~T4_RESOLUTION_200_200;
if (!test_ctrl_bit(s->far_dis_dtc_frame, T30_DIS_BIT_METRIC_RESOLUTION_PREFERRED))
s->mutual_bilevel_resolutions &= ~T4_RESOLUTION_R8_FINE;
s->mutual_bilevel_resolutions &= ~(T4_RESOLUTION_200_200 | T4_RESOLUTION_R8_FINE);
s->mutual_colour_resolutions &= ~T4_RESOLUTION_200_200;
}
else
{
//if (!test_ctrl_bit(s->far_dis_dtc_frame, T30_DIS_BIT_INCH_RESOLUTION_PREFERRED))
// s->mutual_colour_resolutions &= ~T4_RESOLUTION_200_200;
}
if (!test_ctrl_bit(s->far_dis_dtc_frame, T30_DIS_BIT_INCH_RESOLUTION_PREFERRED))
s->mutual_bilevel_resolutions &= ~T4_RESOLUTION_200_100;
/* Never suppress T4_RESOLUTION_R8_STANDARD */
@@ -2853,6 +2836,7 @@ static int process_rx_pps(t30_state_t *s, const uint8_t *msg, int len)
int first_bad_frame;
int first;
int expected_len;
int res;
if (len < 7)
{
@@ -2986,11 +2970,18 @@ static int process_rx_pps(t30_state_t *s, const uint8_t *msg, int len)
if (s->rx_ecm_block_ok)
{
span_log(&s->logging, SPAN_LOG_FLOW, "Partial page OK - committing block %d, %d frames\n", s->ecm_block, s->ecm_frames);
/* Deliver the ECM data */
for (i = 0; i < s->ecm_frames; i++)
{
if (t4_rx_put(&s->t4.rx, s->ecm_data[i], s->ecm_len[i]))
if (s->document_put_handler)
res = s->document_put_handler(s->document_put_user_data, s->ecm_data[i], s->ecm_len[i]);
else
res = t4_rx_put(&s->t4.rx, s->ecm_data[i], s->ecm_len[i]);
if (res != T4_DECODE_MORE_DATA)
{
/* This is the end of the document */
if (res != T4_DECODE_OK)
span_log(&s->logging, SPAN_LOG_FLOW, "Document ended with status %d\n", res);
break;
}
}
@@ -3642,6 +3633,53 @@ static void process_state_f_doc_non_ecm(t30_state_t *s, const uint8_t *msg, int
}
/*- End of function --------------------------------------------------------*/
static void assess_copy_quality(t30_state_t *s, uint8_t fcf)
{
int quality;
quality = copy_quality(s);
switch (quality)
{
case T30_COPY_QUALITY_PERFECT:
case T30_COPY_QUALITY_GOOD:
rx_end_page(s);
break;
case T30_COPY_QUALITY_POOR:
rx_end_page(s);
break;
case T30_COPY_QUALITY_BAD:
/* Some people want to keep even the bad pages */
if (s->keep_bad_pages)
rx_end_page(s);
break;
}
if (s->phase_d_handler)
s->phase_d_handler(s, s->phase_d_user_data, fcf);
if (fcf == T30_EOP)
terminate_operation_in_progress(s);
else
rx_start_page(s);
switch (quality)
{
case T30_COPY_QUALITY_PERFECT:
case T30_COPY_QUALITY_GOOD:
set_state(s, T30_STATE_III_Q_MCF);
send_simple_frame(s, T30_MCF);
break;
case T30_COPY_QUALITY_POOR:
set_state(s, T30_STATE_III_Q_RTP);
send_simple_frame(s, T30_RTP);
break;
case T30_COPY_QUALITY_BAD:
set_state(s, T30_STATE_III_Q_RTN);
send_simple_frame(s, T30_RTN);
break;
}
}
/*- End of function --------------------------------------------------------*/
static void process_state_f_post_doc_non_ecm(t30_state_t *s, const uint8_t *msg, int len)
{
uint8_t fcf;
@@ -3657,33 +3695,7 @@ static void process_state_f_post_doc_non_ecm(t30_state_t *s, const uint8_t *msg,
case T30_MPS:
s->next_rx_step = fcf;
queue_phase(s, T30_PHASE_D_TX);
switch (copy_quality(s))
{
case T30_COPY_QUALITY_PERFECT:
case T30_COPY_QUALITY_GOOD:
rx_end_page(s);
if (s->phase_d_handler)
s->phase_d_handler(s, s->phase_d_user_data, fcf);
rx_start_page(s);
set_state(s, T30_STATE_III_Q_MCF);
send_simple_frame(s, T30_MCF);
break;
case T30_COPY_QUALITY_POOR:
rx_end_page(s);
if (s->phase_d_handler)
s->phase_d_handler(s, s->phase_d_user_data, fcf);
rx_start_page(s);
set_state(s, T30_STATE_III_Q_RTP);
send_simple_frame(s, T30_RTP);
break;
case T30_COPY_QUALITY_BAD:
if (s->phase_d_handler)
s->phase_d_handler(s, s->phase_d_user_data, fcf);
rx_start_page(s);
set_state(s, T30_STATE_III_Q_RTN);
send_simple_frame(s, T30_RTN);
break;
}
assess_copy_quality(s, fcf);
break;
case T30_PRI_EOM:
if (s->remote_interrupts_allowed)
@@ -3695,33 +3707,7 @@ static void process_state_f_post_doc_non_ecm(t30_state_t *s, const uint8_t *msg,
s->next_rx_step = fcf;
/* Return to phase B */
queue_phase(s, T30_PHASE_B_TX);
switch (copy_quality(s))
{
case T30_COPY_QUALITY_PERFECT:
case T30_COPY_QUALITY_GOOD:
rx_end_page(s);
if (s->phase_d_handler)
s->phase_d_handler(s, s->phase_d_user_data, fcf);
rx_start_page(s);
set_state(s, T30_STATE_III_Q_MCF);
send_simple_frame(s, T30_MCF);
break;
case T30_COPY_QUALITY_POOR:
rx_end_page(s);
if (s->phase_d_handler)
s->phase_d_handler(s, s->phase_d_user_data, fcf);
rx_start_page(s);
set_state(s, T30_STATE_III_Q_RTP);
send_simple_frame(s, T30_RTP);
break;
case T30_COPY_QUALITY_BAD:
if (s->phase_d_handler)
s->phase_d_handler(s, s->phase_d_user_data, fcf);
rx_start_page(s);
set_state(s, T30_STATE_III_Q_RTN);
send_simple_frame(s, T30_RTN);
break;
}
assess_copy_quality(s, fcf);
break;
case T30_PRI_EOP:
if (s->remote_interrupts_allowed)
@@ -3733,37 +3719,7 @@ static void process_state_f_post_doc_non_ecm(t30_state_t *s, const uint8_t *msg,
s->end_of_procedure_detected = true;
s->next_rx_step = fcf;
queue_phase(s, T30_PHASE_D_TX);
switch (copy_quality(s))
{
case T30_COPY_QUALITY_PERFECT:
case T30_COPY_QUALITY_GOOD:
rx_end_page(s);
if (s->phase_d_handler)
s->phase_d_handler(s, s->phase_d_user_data, fcf);
terminate_operation_in_progress(s);
set_state(s, T30_STATE_III_Q_MCF);
send_simple_frame(s, T30_MCF);
break;
case T30_COPY_QUALITY_POOR:
rx_end_page(s);
if (s->phase_d_handler)
s->phase_d_handler(s, s->phase_d_user_data, fcf);
terminate_operation_in_progress(s);
set_state(s, T30_STATE_III_Q_RTP);
send_simple_frame(s, T30_RTP);
break;
case T30_COPY_QUALITY_BAD:
#if 0
/* Some people want to keep even the bad pages */
if (s->keep_bad_pages)
rx_end_page(s);
#endif
if (s->phase_d_handler)
s->phase_d_handler(s, s->phase_d_user_data, fcf);
set_state(s, T30_STATE_III_Q_RTN);
send_simple_frame(s, T30_RTN);
break;
}
assess_copy_quality(s, fcf);
break;
case T30_DCN:
t30_set_status(s, T30_ERR_RX_DCNFAX);
@@ -5827,6 +5783,7 @@ static void t30_non_ecm_rx_status(void *user_data, int status)
SPAN_DECLARE_NONSTD(void) t30_non_ecm_put_bit(void *user_data, int bit)
{
t30_state_t *s;
int res;
if (bit < 0)
{
@@ -5851,10 +5808,12 @@ SPAN_DECLARE_NONSTD(void) t30_non_ecm_put_bit(void *user_data, int bit)
}
break;
case T30_STATE_F_DOC_NON_ECM:
/* Document transfer */
if (t4_rx_put_bit(&s->t4.rx, bit) == T4_DECODE_OK)
/* Image transfer */
if ((res = t4_rx_put_bit(&s->t4.rx, bit)) != T4_DECODE_MORE_DATA)
{
/* That is the end of the document */
/* This is the end of the image */
if (res != T4_DECODE_OK)
span_log(&s->logging, SPAN_LOG_FLOW, "Page ended with status %d\n", res);
set_state(s, T30_STATE_F_POST_DOC_NON_ECM);
queue_phase(s, T30_PHASE_D_RX);
timer_t2_start(s);
@@ -5868,6 +5827,7 @@ SPAN_DECLARE(void) t30_non_ecm_put(void *user_data, const uint8_t buf[], int len
{
t30_state_t *s;
int i;
int res;
s = (t30_state_t *) user_data;
switch (s->state)
@@ -5891,10 +5851,12 @@ SPAN_DECLARE(void) t30_non_ecm_put(void *user_data, const uint8_t buf[], int len
}
break;
case T30_STATE_F_DOC_NON_ECM:
/* Document transfer */
if (t4_rx_put(&s->t4.rx, buf, len))
/* Image transfer */
if ((res = t4_rx_put(&s->t4.rx, buf, len)) != T4_DECODE_MORE_DATA)
{
/* That is the end of the document */
/* This is the end of the image */
if (res != T4_DECODE_OK)
span_log(&s->logging, SPAN_LOG_FLOW, "Page ended with status %d\n", res);
set_state(s, T30_STATE_F_POST_DOC_NON_ECM);
queue_phase(s, T30_PHASE_D_RX);
timer_t2_start(s);
@@ -6706,8 +6668,8 @@ SPAN_DECLARE(t30_state_t *) t30_init(t30_state_t *s,
| T4_SUPPORT_LENGTH_A4
| T4_SUPPORT_LENGTH_B4
| T4_SUPPORT_LENGTH_UNLIMITED;
/* Set the output encoding to something safe. For bi-level images ost things get
1D and 2D encoding right. Quite a lot get other things wrong. */
/* Set the output encoding to something safe. For bi-level images most things
get 1D and 2D encoding right. Quite a lot get other things wrong. */
s->supported_output_compressions = T4_COMPRESSION_T4_2D | T4_COMPRESSION_JPEG;
s->local_min_scan_time_code = T30_MIN_SCAN_0MS;
span_log_init(&s->logging, SPAN_LOG_NONE, NULL);
+42 -4
View File
@@ -71,9 +71,7 @@
#include "spandsp/t81_t82_arith_coding.h"
#include "spandsp/t85.h"
#include "spandsp/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
#include "spandsp/t30_fcf.h"
@@ -87,9 +85,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/image_translate.h"
@@ -652,8 +648,36 @@ SPAN_DECLARE(int) t30_set_ecm_capability(t30_state_t *s, bool enabled)
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(void) t30_set_keep_bad_quality_pages(t30_state_t *s, bool keep_bad_pages)
{
s->keep_bad_pages = keep_bad_pages;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) t30_set_supported_output_compressions(t30_state_t *s, int supported_compressions)
{
/* Mask out the ones we actually support today. */
supported_compressions &= T4_COMPRESSION_T4_1D
| T4_COMPRESSION_T4_2D
| T4_COMPRESSION_T6
| T4_COMPRESSION_T85
| T4_COMPRESSION_T85_L0
#if defined(SPANDSP_SUPPORT_T88)
| T4_COMPRESSION_T88
#endif
| T4_COMPRESSION_T42_T81
#if defined(SPANDSP_SUPPORT_SYCC_T81)
| T4_COMPRESSION_SYCC_T81
#endif
#if defined(SPANDSP_SUPPORT_T43)
| T4_COMPRESSION_T43
#endif
#if defined(SPANDSP_SUPPORT_T45)
| T4_COMPRESSION_T45
#endif
| T4_COMPRESSION_UNCOMPRESSED
| T4_COMPRESSION_JPEG
| 0;
s->supported_output_compressions = supported_compressions;
return 0;
}
@@ -841,6 +865,20 @@ SPAN_DECLARE(void) t30_set_real_time_frame_handler(t30_state_t *s, t30_real_time
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(void) t30_set_document_get_handler(t30_state_t *s, t30_document_get_handler_t handler, void *user_data)
{
s->document_get_handler = handler;
s->document_get_user_data = user_data;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(void) t30_set_document_put_handler(t30_state_t *s, t30_document_put_handler_t handler, void *user_data)
{
s->document_put_handler = handler;
s->document_put_user_data = user_data;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(logging_state_t *) t30_get_logging_state(t30_state_t *s)
{
return &s->logging;
-4
View File
@@ -70,9 +70,7 @@
#include "spandsp/t81_t82_arith_coding.h"
#include "spandsp/t85.h"
#include "spandsp/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
#include "spandsp/t30_fcf.h"
@@ -85,9 +83,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/image_translate.h"
-4
View File
@@ -84,9 +84,7 @@
#include "spandsp/t81_t82_arith_coding.h"
#include "spandsp/t85.h"
#include "spandsp/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
#include "spandsp/t30_fcf.h"
@@ -115,9 +113,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/image_translate.h"
-4
View File
@@ -74,9 +74,7 @@
#include "spandsp/t81_t82_arith_coding.h"
#include "spandsp/t85.h"
#include "spandsp/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
#include "spandsp/t30_fcf.h"
@@ -92,9 +90,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/image_translate.h"
+33 -1
View File
@@ -72,7 +72,7 @@
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
/* The open_memstream() and fmemopen() in older versions of glibc seems quirky */
/* The open_memstream() and fmemopen() in older versions of glibc seem quirky */
#if defined(__GLIBC__) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 12))
#undef OPEN_MEMSTREAM
#endif
@@ -230,6 +230,38 @@ static __inline__ int unpack_16(uint8_t *s, uint16_t value)
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(bool) t42_analyse_header(uint32_t *width, uint32_t *length, const uint8_t data[], size_t len)
{
int type;
int seg;
int pos;
/* Search the image data for its width and length */
*length = 0;
*width = 0;
pos = 0;
if (pack_16(&data[pos]) != 0xFFD8)
return false;
pos += 2;
while (pos < len)
{
type = pack_16(&data[pos]);
pos += 2;
seg = pack_16(&data[pos]) - 2;
pos += 2;
if (type == 0xFFC0)
{
*length = pack_16(&data[pos + 1]);
*width = pack_16(&data[pos + 3]);
return true;
}
pos += seg;
}
return false;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) xyz_to_corrected_color_temp(float *temp, float xyz[3])
{
float us;
+4 -2
View File
@@ -865,7 +865,8 @@ SPAN_DECLARE(int) t43_decode_restart(t43_decode_state_t *s)
{
/* ITULAB */
/* Illuminant D50 */
set_lab_illuminant(&s->lab, 96.422f, 100.000f, 82.521f);
//set_lab_illuminant(&s->lab, 96.422f, 100.000f, 82.521f);
set_lab_illuminant(&s->lab, 100.0f, 100.0f, 100.0f);
set_lab_gamut(&s->lab, 0, 100, -85, 85, -75, 125, false);
s->t85.min_bit_planes = 1;
@@ -898,7 +899,8 @@ SPAN_DECLARE(t43_decode_state_t *) t43_decode_init(t43_decode_state_t *s,
/* ITULAB */
/* Illuminant D50 */
set_lab_illuminant(&s->lab, 96.422f, 100.000f, 82.521f);
//set_lab_illuminant(&s->lab, 96.422f, 100.000f, 82.521f);
set_lab_illuminant(&s->lab, 100.0f, 100.0f, 100.0f);
set_lab_gamut(&s->lab, 0, 100, -85, 85, -75, 125, false);
s->t85.min_bit_planes = 1;
+190 -97
View File
@@ -64,9 +64,7 @@
#include "spandsp/t81_t82_arith_coding.h"
#include "spandsp/t85.h"
#include "spandsp/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
#include "spandsp/version.h"
@@ -75,9 +73,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/image_translate.h"
@@ -94,8 +90,10 @@ typedef struct
} packer_t;
#if defined(SPANDSP_SUPPORT_TIFF_FX)
#if TIFFLIB_VERSION >= 20120615
extern TIFFFieldArray tiff_fx_field_array;
#endif
#endif
SPAN_DECLARE(const char *) t4_compression_to_str(int compression)
{
@@ -213,6 +211,8 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
int bits_per_sample;
int samples_per_pixel;
int photometric;
uint32_t width;
uint32_t length;
t = &s->tiff;
/* Prepare the directory entry fully before writing the image, or libtiff complains */
@@ -242,7 +242,6 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
output_compression = COMPRESSION_T88;
break;
#endif
#if defined(SPANDSP_SUPPORT_T42)
case T4_COMPRESSION_JPEG:
output_compression = COMPRESSION_JPEG;
bits_per_sample = 8;
@@ -274,18 +273,23 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
case T4_COMPRESSION_SYCC_T81:
output_compression = COMPRESSION_JPEG;
bits_per_sample = 8;
samples_per_pixel = 3;
photometric = PHOTOMETRIC_YCBCR;
if (t->image_type == T4_IMAGE_TYPE_COLOUR_8BIT)
{
samples_per_pixel = 3;
photometric = PHOTOMETRIC_YCBCR;
}
else
{
samples_per_pixel = 1;
photometric = PHOTOMETRIC_MINISBLACK;
}
break;
#endif
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
output_compression = COMPRESSION_T43;
bits_per_sample = 8;
samples_per_pixel = 3;
photometric = PHOTOMETRIC_ITULAB;
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
output_compression = COMPRESSION_T45;
@@ -313,11 +317,9 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
case COMPRESSION_JPEG:
TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
break;
#if defined(SPANDSP_SUPPORT_T43)
case COMPRESSION_T43:
TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
break;
#endif
}
TIFFSetField(t->tiff_file, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(t->tiff_file, TIFFTAG_BITSPERSAMPLE, bits_per_sample);
@@ -399,7 +401,21 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
switch (s->current_decoder)
{
case 0:
s->metadata.image_length = 1024;
switch (t->compression)
{
case T4_COMPRESSION_T42_T81:
case T4_COMPRESSION_SYCC_T81:
t42_analyse_header(&width, &length, s->decoder.no_decoder.buf, s->decoder.no_decoder.buf_ptr);
s->metadata.image_width = width;
s->metadata.image_length = length;
break;
case T4_COMPRESSION_T85:
case T4_COMPRESSION_T85_L0:
t85_analyse_header(&width, &length, s->decoder.no_decoder.buf, s->decoder.no_decoder.buf_ptr);
s->metadata.image_width = width;
s->metadata.image_length = length;
break;
}
break;
case T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D | T4_COMPRESSION_T6:
if ((s->metadata.compression & (T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D)))
@@ -432,11 +448,9 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
case T4_COMPRESSION_T42_T81:
s->metadata.image_length = t42_decode_get_image_length(&s->decoder.t42);
break;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
s->metadata.image_length = t43_decode_get_image_length(&s->decoder.t43);
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
s->metadata.image_length = t45_decode_get_image_length(&s->decoder.t45);
@@ -555,7 +569,6 @@ static int write_tiff_t85_image(t4_rx_state_t *s)
}
/*- End of function --------------------------------------------------------*/
#if defined(SPANDSP_SUPPORT_T43)
static int write_tiff_t43_image(t4_rx_state_t *s)
{
uint8_t *buf;
@@ -597,7 +610,6 @@ static int write_tiff_t43_image(t4_rx_state_t *s)
return 0;
}
/*- End of function --------------------------------------------------------*/
#endif
static int write_tiff_image(t4_rx_state_t *s)
{
@@ -607,7 +619,7 @@ static int write_tiff_image(t4_rx_state_t *s)
#endif
t = &s->tiff;
if (s->pre_encoded_ptr <= 0 && (t->image_buffer == NULL || t->image_size <= 0))
if (s->decoder.no_decoder.buf_ptr <= 0 && (t->image_buffer == NULL || t->image_size <= 0))
return -1;
/* Set up the TIFF directory info... */
set_tiff_directory_info(s);
@@ -616,9 +628,9 @@ static int write_tiff_image(t4_rx_state_t *s)
//if (!TIFFCheckpointDirectory(t->tiff_file))
// span_log(&s->logging, SPAN_LOG_WARNING, "%s: Failed to checkpoint directory for page %d.\n", t->file, s->current_page);
/* ...and write out the image... */
if (s->pre_encoded_ptr > 0)
if (s->current_decoder == 0)
{
if (TIFFWriteRawStrip(s->tiff.tiff_file, 0, s->pre_encoded_buf, s->pre_encoded_ptr) < 0)
if (TIFFWriteRawStrip(s->tiff.tiff_file, 0, s->decoder.no_decoder.buf, s->decoder.no_decoder.buf_ptr) < 0)
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Error writing TIFF strip.\n", s->tiff.file);
}
else
@@ -638,13 +650,11 @@ static int write_tiff_image(t4_rx_state_t *s)
return -1;
break;
#endif
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
/* We need to perform this compression here, as libtiff does not understand it. */
if (write_tiff_t43_image(s) < 0)
return -1;
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
/* We need to perform this compression here, as libtiff does not understand it. */
@@ -752,30 +762,57 @@ SPAN_DECLARE(int) t4_rx_put_bit(t4_rx_state_t *s, int bit)
}
/*- End of function --------------------------------------------------------*/
static void pre_encoded_restart(no_decoder_state_t *s)
{
s->buf_ptr = 0;
}
/*- End of function --------------------------------------------------------*/
static void pre_encoded_init(no_decoder_state_t *s)
{
s->buf = NULL;
s->buf_len = 0;
s->buf_ptr = 0;
}
/*- End of function --------------------------------------------------------*/
static int pre_encoded_release(no_decoder_state_t *s)
{
if (s->buf)
span_free(s->buf);
return 0;
}
/*- End of function --------------------------------------------------------*/
static int pre_encoded_put(no_decoder_state_t *s, const uint8_t data[], size_t len)
{
uint8_t *buf;
if (s->buf_len < s->buf_ptr + len)
{
s->buf_len += 65536;
if ((buf = span_realloc(s->buf, s->buf_len)) == NULL)
{
if (s->buf)
{
span_free(s->buf);
s->buf = NULL;
s->buf_len = 0;
}
return -1;
}
s->buf = buf;
}
memcpy(&s->buf[s->buf_ptr], data, len);
s->buf_ptr += len;
return T4_DECODE_MORE_DATA;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) t4_rx_put(t4_rx_state_t *s, const uint8_t buf[], size_t len)
{
uint8_t *buf2;
s->line_image_size += 8*len;
if (s->pre_encoded_len > 0)
{
if (s->pre_encoded_len < s->pre_encoded_ptr + 65536)
{
s->pre_encoded_len += 65536;
if ((buf2 = span_realloc(s->pre_encoded_buf, s->pre_encoded_len)) == NULL)
{
if (s->pre_encoded_buf)
span_free(s->pre_encoded_buf);
return -1;
}
s->pre_encoded_buf = buf2;
}
memcpy(&s->pre_encoded_buf[s->pre_encoded_ptr], buf, len);
s->pre_encoded_ptr += len;
return T4_DECODE_MORE_DATA;
}
if (s->image_put_handler)
return s->image_put_handler((void *) &s->decoder, buf, len);
@@ -825,13 +862,26 @@ SPAN_DECLARE(void) t4_rx_set_model(t4_rx_state_t *s, const char *model)
}
/*- End of function --------------------------------------------------------*/
static void select_tiff_compression(t4_rx_state_t *s, int output_image_type)
static bool select_tiff_compression(t4_rx_state_t *s, int output_image_type)
{
s->tiff.image_type = output_image_type;
/* The only compression schemes where we can really avoid decoding and
recoding the images are those where the width an length of the image
can be readily extracted from the image data (e.g. from its header) */
if ((s->metadata.compression & (s->supported_tiff_compressions & (T4_COMPRESSION_T85 | T4_COMPRESSION_T85_L0 | T4_COMPRESSION_T42_T81 | T4_COMPRESSION_SYCC_T81))))
{
span_log(&s->logging, SPAN_LOG_FLOW, "Image can be written without recoding\n");
s->tiff.compression = s->metadata.compression;
return false;
}
if (output_image_type == T4_IMAGE_TYPE_BILEVEL)
{
/* Only provide for one form of coding throughout the file, even though the
coding on the wire could change between pages. */
if ((s->supported_tiff_compressions & T4_COMPRESSION_T85))
if ((s->supported_tiff_compressions & T4_COMPRESSION_T88))
s->tiff.compression = T4_COMPRESSION_T88;
else if ((s->supported_tiff_compressions & T4_COMPRESSION_T85))
s->tiff.compression = T4_COMPRESSION_T85;
else if ((s->supported_tiff_compressions & T4_COMPRESSION_T6))
s->tiff.compression = T4_COMPRESSION_T6;
@@ -848,22 +898,44 @@ static void select_tiff_compression(t4_rx_state_t *s, int output_image_type)
s->tiff.compression = T4_COMPRESSION_T42_T81;
else if ((s->supported_tiff_compressions & T4_COMPRESSION_T43))
s->tiff.compression = T4_COMPRESSION_T43;
else if ((s->supported_tiff_compressions & T4_COMPRESSION_T45))
s->tiff.compression = T4_COMPRESSION_T45;
else if ((s->supported_tiff_compressions & T4_COMPRESSION_UNCOMPRESSED))
s->tiff.compression = T4_COMPRESSION_UNCOMPRESSED;
}
s->tiff.image_type = output_image_type;
return true;
}
/*- End of function --------------------------------------------------------*/
static int release_current_decoder(t4_rx_state_t *s)
{
switch (s->current_decoder)
{
case 0:
return pre_encoded_release(&s->decoder.no_decoder);
case T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D | T4_COMPRESSION_T6:
return t4_t6_decode_release(&s->decoder.t4_t6);
case T4_COMPRESSION_T85 | T4_COMPRESSION_T85_L0:
return t85_decode_release(&s->decoder.t85);
#if defined(SPANDSP_SUPPORT_T88)
case T4_COMPRESSION_T88:
return t88_decode_release(&s->decoder.t88);
#endif
case T4_COMPRESSION_T42_T81:
return t42_decode_release(&s->decoder.t42);
case T4_COMPRESSION_T43:
return t43_decode_release(&s->decoder.t43);
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
return t45_decode_release(&s->decoder.t45);
#endif
}
return 0;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int compression)
{
#if 0
output_image_type = T4_IMAGE_TYPE_BILEVEL;
s->metadata.compression = compression;
select_tiff_compression(s, T4_IMAGE_TYPE_BILEVEL);
s->current_decoder = 0;
return 0;
#else
switch (compression)
{
case T4_COMPRESSION_T4_1D:
@@ -876,12 +948,18 @@ SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int compression)
case T4_COMPRESSION_T6:
break;
default:
release_current_decoder(s);
t4_t6_decode_init(&s->decoder.t4_t6, compression, s->metadata.image_width, s->row_handler, s->row_handler_user_data);
s->current_decoder = T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D | T4_COMPRESSION_T6;
break;
}
s->metadata.compression = compression;
select_tiff_compression(s, T4_IMAGE_TYPE_BILEVEL);
if (!select_tiff_compression(s, T4_IMAGE_TYPE_BILEVEL))
{
release_current_decoder(s);
s->current_decoder = 0;
pre_encoded_init(&s->decoder.no_decoder);
}
return t4_t6_decode_set_encoding(&s->decoder.t4_t6, compression);
case T4_COMPRESSION_T85:
case T4_COMPRESSION_T85_L0:
@@ -891,6 +969,7 @@ SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int compression)
case T4_COMPRESSION_T85_L0:
break;
default:
release_current_decoder(s);
t85_decode_init(&s->decoder.t85, s->row_handler, s->row_handler_user_data);
s->current_decoder = T4_COMPRESSION_T85 | T4_COMPRESSION_T85_L0;
/* Constrain received images to the maximum width of any FAX. This will
@@ -900,7 +979,12 @@ SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int compression)
break;
}
s->metadata.compression = compression;
select_tiff_compression(s, T4_IMAGE_TYPE_BILEVEL);
if (!select_tiff_compression(s, T4_IMAGE_TYPE_BILEVEL))
{
release_current_decoder(s);
s->current_decoder = 0;
pre_encoded_init(&s->decoder.no_decoder);
}
return 0;
#if defined(SPANDSP_SUPPORT_T88)
case T4_COMPRESSION_T88:
@@ -909,12 +993,18 @@ SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int compression)
case T4_COMPRESSION_T88:
break;
default:
release_current_decoder(s);
t88_decode_init(&s->decoder.t88, s->row_handler, s->row_handler_user_data);
s->current_decoder = T4_COMPRESSION_T88;
break;
}
s->metadata.compression = compression;
select_tiff_compression(s, T4_IMAGE_TYPE_BILEVEL);
if (!select_tiff_compression(s, T4_IMAGE_TYPE_BILEVEL))
{
release_current_decoder(s);
s->current_decoder = 0;
pre_encoded_init(&s->decoder.no_decoder);
}
return 0;
#endif
case T4_COMPRESSION_T42_T81:
@@ -925,6 +1015,7 @@ SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int compression)
case T4_COMPRESSION_SYCC_T81:
break;
default:
release_current_decoder(s);
t42_decode_init(&s->decoder.t42, s->row_handler, s->row_handler_user_data);
s->current_decoder = T4_COMPRESSION_T42_T81;
/* Constrain received images to the maximum width of any FAX. This will
@@ -934,15 +1025,20 @@ SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int compression)
break;
}
s->metadata.compression = compression;
select_tiff_compression(s, T4_IMAGE_TYPE_COLOUR_8BIT);
if (!select_tiff_compression(s, T4_IMAGE_TYPE_COLOUR_8BIT))
{
release_current_decoder(s);
s->current_decoder = 0;
pre_encoded_init(&s->decoder.no_decoder);
}
return 0;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
switch (s->metadata.compression)
{
case T4_COMPRESSION_T43:
break;
default:
release_current_decoder(s);
t43_decode_init(&s->decoder.t43, s->row_handler, s->row_handler_user_data);
s->current_decoder = T4_COMPRESSION_T43;
/* Constrain received images to the maximum width of any FAX. This will
@@ -952,9 +1048,13 @@ SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int compression)
break;
}
s->metadata.compression = compression;
select_tiff_compression(s, T4_IMAGE_TYPE_COLOUR_8BIT);
if (!select_tiff_compression(s, T4_IMAGE_TYPE_COLOUR_8BIT))
{
release_current_decoder(s);
s->current_decoder = 0;
pre_encoded_init(&s->decoder.no_decoder);
}
return 0;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
switch (s->metadata.compression)
@@ -962,18 +1062,23 @@ SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int compression)
case T4_COMPRESSION_T45:
break;
default:
release_current_decoder(s);
t45_decode_init(&s->decoder.t45, s->row_handler, s->row_handler_user_data);
s->current_decoder = T4_COMPRESSION_T45;
break;
}
s->metadata.compression = compression;
select_tiff_compression(s, T4_IMAGE_TYPE_COLOUR_8BIT);
if (!select_tiff_compression(s, T4_IMAGE_TYPE_COLOUR_8BIT))
{
release_current_decoder(s);
s->current_decoder = 0;
pre_encoded_init(&s->decoder.no_decoder);
}
return 0;
#endif
}
return -1;
#endif
}
/*- End of function --------------------------------------------------------*/
@@ -999,10 +1104,8 @@ SPAN_DECLARE(int) t4_rx_set_row_write_handler(t4_rx_state_t *s, t4_row_write_han
#endif
case T4_COMPRESSION_T42_T81:
return t42_decode_set_row_write_handler(&s->decoder.t42, handler, user_data);
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
return t43_decode_set_row_write_handler(&s->decoder.t43, handler, user_data);
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
return t45_decode_set_row_write_handler(&s->decoder.t45, handler, user_data);
@@ -1026,6 +1129,15 @@ SPAN_DECLARE(void) t4_rx_get_transfer_statistics(t4_rx_state_t *s, t4_stats_t *t
t->compression = s->metadata.compression;
switch (s->current_decoder)
{
case 0:
t->type = 0;
t->width = s->metadata.image_width;
t->length = s->metadata.image_length;
t->image_type = 0;
t->image_width = t->width;
t->image_length = t->length;
t->line_image_size = s->line_image_size;
break;
case T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D | T4_COMPRESSION_T6:
t->type = T4_IMAGE_TYPE_BILEVEL;
t->width = t4_t6_decode_get_image_width(&s->decoder.t4_t6);
@@ -1059,7 +1171,6 @@ SPAN_DECLARE(void) t4_rx_get_transfer_statistics(t4_rx_state_t *s, t4_stats_t *t
t->image_length = t->length;
t->line_image_size = t42_decode_get_compressed_image_size(&s->decoder.t42)/8;
break;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
t->type = T4_IMAGE_TYPE_COLOUR_8BIT;
t->width = t43_decode_get_image_width(&s->decoder.t43);
@@ -1069,7 +1180,6 @@ SPAN_DECLARE(void) t4_rx_get_transfer_statistics(t4_rx_state_t *s, t4_stats_t *t
t->image_length = t->length;
t->line_image_size = t43_decode_get_compressed_image_size(&s->decoder.t43)/8;
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
break;
@@ -1085,9 +1195,8 @@ SPAN_DECLARE(int) t4_rx_start_page(t4_rx_state_t *s)
switch (s->current_decoder)
{
case 0:
s->pre_encoded_ptr = 0;
s->pre_encoded_len = 0;
s->image_put_handler = NULL;
pre_encoded_restart(&s->decoder.no_decoder);
s->image_put_handler = (t4_image_put_handler_t) pre_encoded_put;
break;
case T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D | T4_COMPRESSION_T6:
t4_t6_decode_restart(&s->decoder.t4_t6, s->metadata.image_width);
@@ -1107,12 +1216,10 @@ SPAN_DECLARE(int) t4_rx_start_page(t4_rx_state_t *s)
t42_decode_restart(&s->decoder.t42);
s->image_put_handler = (t4_image_put_handler_t) t42_decode_put;
break;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
t43_decode_restart(&s->decoder.t43);
s->image_put_handler = (t4_image_put_handler_t) t43_decode_put;
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
t45_decode_restart(&s->decoder.t45);
@@ -1163,7 +1270,7 @@ SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s)
switch (s->current_decoder)
{
case 0:
length = s->pre_encoded_ptr;
length = s->decoder.no_decoder.buf_ptr;
break;
case T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D | T4_COMPRESSION_T6:
length = t4_t6_decode_get_image_length(&s->decoder.t4_t6);
@@ -1179,15 +1286,13 @@ SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s)
case T4_COMPRESSION_T42_T81:
length = t42_decode_get_image_length(&s->decoder.t42);
if (s->decoder.t42.samples_per_pixel == 3)
select_tiff_compression(s, T4_IMAGE_TYPE_COLOUR_8BIT);
s->tiff.image_type = T4_IMAGE_TYPE_COLOUR_8BIT;
else
select_tiff_compression(s, T4_IMAGE_TYPE_GRAY_8BIT);
s->tiff.image_type = T4_IMAGE_TYPE_GRAY_8BIT;
break;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
length = t43_decode_get_image_length(&s->decoder.t43);
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
length = t45_decode_get_image_length(&s->decoder.t45);
@@ -1203,7 +1308,6 @@ SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s)
if (write_tiff_image(s) == 0)
s->current_page++;
s->tiff.image_size = 0;
s->pre_encoded_ptr = 0;
}
else
{
@@ -1240,6 +1344,15 @@ SPAN_DECLARE(t4_rx_state_t *) t4_rx_init(t4_rx_state_t *s, const char *file, int
span_log(&s->logging, SPAN_LOG_FLOW, "Start rx document\n");
s->supported_tiff_compressions = supported_output_compressions;
#if !defined(SPANDSP_SUPPORT_T88)
s->supported_tiff_compressions &= ~T4_COMPRESSION_T88;
#endif
#if !defined(SPANDSP_SUPPORT_T43)
s->supported_tiff_compressions &= ~T4_COMPRESSION_T43;
#endif
#if !defined(SPANDSP_SUPPORT_T45)
s->supported_tiff_compressions &= ~T4_COMPRESSION_T45;
#endif
/* Set some default values */
s->metadata.x_resolution = T4_X_RESOLUTION_R8;
@@ -1272,27 +1385,7 @@ SPAN_DECLARE(int) t4_rx_release(t4_rx_state_t *s)
{
if (s->tiff.file)
tiff_rx_release(s);
switch (s->current_decoder)
{
case T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D | T4_COMPRESSION_T6:
return t4_t6_decode_release(&s->decoder.t4_t6);
case T4_COMPRESSION_T85 | T4_COMPRESSION_T85_L0:
return t85_decode_release(&s->decoder.t85);
#if defined(SPANDSP_SUPPORT_T88)
case T4_COMPRESSION_T88:
return t88_decode_release(&s->decoder.t88);
#endif
case T4_COMPRESSION_T42_T81:
return t42_decode_release(&s->decoder.t42);
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
return t43_decode_release(&s->decoder.t43);
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
return t45_decode_release(&s->decoder.t45);
#endif
}
release_current_decoder(s);
return -1;
}
/*- End of function --------------------------------------------------------*/
-4
View File
@@ -95,9 +95,7 @@
#include "spandsp/t81_t82_arith_coding.h"
#include "spandsp/t85.h"
#include "spandsp/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
@@ -105,9 +103,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/image_translate.h"
-4
View File
@@ -92,9 +92,7 @@
#include "spandsp/t81_t82_arith_coding.h"
#include "spandsp/t85.h"
#include "spandsp/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
@@ -102,9 +100,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/image_translate.h"
+104 -172
View File
@@ -64,9 +64,7 @@
#include "spandsp/t81_t82_arith_coding.h"
#include "spandsp/t85.h"
#include "spandsp/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
@@ -74,9 +72,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
#include "spandsp/private/t42.h"
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/image_translate.h"
@@ -168,7 +164,7 @@ static const TIFFFieldInfo tiff_fx_tiff_field_info[] =
{TIFFTAG_IMAGELAYER, 2, 2, TIFF_LONG, FIELD_CUSTOM, false, false, (char *) "ImageLayer"},
};
#if 1
#if TIFFLIB_VERSION >= 20120615
static TIFFField tiff_fx_tiff_fields[] =
{
{ TIFFTAG_INDEXED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, (char *) "Indexed" },
@@ -420,7 +416,7 @@ static int get_tiff_directory_info(t4_tx_state_t *s)
float bmax;
uint8_t parm8;
#endif
#if defined(TIFFTAG_INDEXED)
#if defined(SPANDSP_SUPPORT_TIFF_FX)
uint16_t parm16;
#endif
uint32_t parm32;
@@ -457,7 +453,7 @@ static int get_tiff_directory_info(t4_tx_state_t *s)
else
return -1;
#if defined(TIFFTAG_INDEXED)
#if defined(SPANDSP_SUPPORT_TIFF_FX)
parm16 = 0;
if (TIFFGetField(t->tiff_file, TIFFTAG_INDEXED, &parm16))
{
@@ -526,11 +522,9 @@ static int get_tiff_directory_info(t4_tx_state_t *s)
case COMPRESSION_T85:
span_log(&s->logging, SPAN_LOG_FLOW, "T.85\n");
break;
#if defined(SPANDSP_SUPPORT_T43)
case COMPRESSION_T43:
span_log(&s->logging, SPAN_LOG_FLOW, "T.43\n");
break;
#endif
case COMPRESSION_JPEG:
span_log(&s->logging, SPAN_LOG_FLOW, "JPEG\n");
if (t->photo_metric == PHOTOMETRIC_ITULAB)
@@ -873,20 +867,20 @@ static int read_tiff_raw_image(t4_tx_state_t *s)
total_len = 0;
for (i = 0; i < num_strips; i++)
total_len += TIFFRawStripSize(s->tiff.tiff_file, i);
if ((s->pre_encoded_buf = span_realloc(s->pre_encoded_buf, total_len)) == NULL)
if ((s->no_encoder.buf = span_realloc(s->no_encoder.buf, total_len)) == NULL)
return -1;
total_len = 0;
for (i = 0; i < num_strips; i++, total_len += len)
{
len = TIFFRawStripSize(s->tiff.tiff_file, i);
if ((len = TIFFReadRawStrip(s->tiff.tiff_file, i, &s->pre_encoded_buf[total_len], len)) < 0)
if ((len = TIFFReadRawStrip(s->tiff.tiff_file, i, &s->no_encoder.buf[total_len], len)) < 0)
{
span_log(&s->logging, SPAN_LOG_WARNING, "%s: TIFFReadRawStrip error.\n", s->tiff.file);
return -1;
}
}
s->pre_encoded_len = total_len;
s->pre_encoded_ptr = 0;
s->no_encoder.buf_len = total_len;
s->no_encoder.buf_ptr = 0;
return 0;
}
/*- End of function --------------------------------------------------------*/
@@ -933,7 +927,7 @@ static int read_tiff_t85_image(t4_tx_state_t *s)
pack.row = 0;
t85_decode_init(&t85, packing_row_write_handler, &pack);
t85_decode_set_comment_handler(&t85, 1000, embedded_comment_handler, s);
t85_decode_set_image_size_constraints(&t85, s->tiff.image_width, s->tiff.image_length);
result = -1;
for (i = 0; i < num_strips; i++)
{
@@ -944,8 +938,7 @@ static int read_tiff_t85_image(t4_tx_state_t *s)
span_free(raw_data);
return -1;
}
result = t85_decode_put(&t85, raw_data, len);
if (result != T4_DECODE_MORE_DATA)
if ((result = t85_decode_put(&t85, raw_data, len)) != T4_DECODE_MORE_DATA)
break;
}
if (result == T4_DECODE_MORE_DATA)
@@ -959,7 +952,6 @@ static int read_tiff_t85_image(t4_tx_state_t *s)
}
/*- End of function --------------------------------------------------------*/
#if defined(SPANDSP_SUPPORT_T43)
static int read_tiff_t43_image(t4_tx_state_t *s)
{
int biggest;
@@ -1007,6 +999,7 @@ static int read_tiff_t43_image(t4_tx_state_t *s)
t43_decode_init(&t43, packing_row_write_handler, &pack);
t43_decode_set_comment_handler(&t43, 1000, embedded_comment_handler, NULL);
t43_decode_set_image_size_constraints(&t43, s->tiff.image_width, s->tiff.image_length);
logging = t43_decode_get_logging_state(&t43);
span_log_set_level(logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
@@ -1025,8 +1018,7 @@ static int read_tiff_t43_image(t4_tx_state_t *s)
span_free(raw_data);
return -1;
}
result = t43_decode_put(&t43, raw_data, len);
if (result != T4_DECODE_MORE_DATA)
if ((result = t43_decode_put(&t43, raw_data, len)) != T4_DECODE_MORE_DATA)
break;
}
if (result == T4_DECODE_MORE_DATA)
@@ -1037,7 +1029,6 @@ static int read_tiff_t43_image(t4_tx_state_t *s)
return s->tiff.image_size;
}
/*- End of function --------------------------------------------------------*/
#endif
static int read_tiff_t42_t81_image(t4_tx_state_t *s)
{
@@ -1168,36 +1159,38 @@ static int read_tiff_image(t4_tx_state_t *s)
int total_len;
int i;
int len;
int alter_image;
uint8_t *t;
if (s->metadata.image_type != s->tiff.image_type || s->metadata.image_width != s->tiff.image_width)
{
/* We need to rework the image, so it can't pass directly through */
alter_image = true;
image_translate_restart(&s->translator, s->tiff.image_length);
s->metadata.image_length = image_translate_get_output_length(&s->translator);
image_translate_set_row_read_handler(&s->translator, translate_row_read2, s);
}
else
{
alter_image = false;
s->metadata.image_length = s->tiff.image_length;
}
s->pack_buf = NULL;
s->pack_ptr = 0;
s->pack_row = 0;
s->apply_lab = false;
if (s->tiff.image_type != T4_IMAGE_TYPE_BILEVEL)
{
/* If colour/gray scale is supported we may be able to send the image as it is, perhaps after
a resizing. Otherwise we need to resize it, and squash it to a bilevel image. */
if (s->tiff.compression == COMPRESSION_JPEG && s->tiff.photo_metric == PHOTOMETRIC_ITULAB)
{
if (s->metadata.image_type != s->tiff.image_type || s->metadata.image_width != s->tiff.image_width)
if (alter_image)
{
if (read_tiff_t42_t81_image(s) < 0)
return -1;
s->pack_buf = s->tiff.image_buffer;
s->pack_ptr = 0;
s->pack_row = 0;
image_translate_set_row_read_handler(&s->translator, translate_row_read2, s);
}
else
{
@@ -1209,15 +1202,11 @@ static int read_tiff_image(t4_tx_state_t *s)
#if defined(SPANDSP_SUPPORT_T43)
else if (s->tiff.compression == COMPRESSION_T43)
{
if (s->metadata.image_type != s->tiff.image_type || s->metadata.image_width != s->tiff.image_width)
if (alter_image)
{
if ((len = read_tiff_t43_image(s)) < 0)
return -1;
s->pack_buf = s->tiff.image_buffer;
s->pack_ptr = 0;
s->pack_row = 0;
image_translate_set_row_read_handler(&s->translator, translate_row_read2, s);
}
else
{
@@ -1230,15 +1219,11 @@ static int read_tiff_image(t4_tx_state_t *s)
#if defined(SPANDSP_SUPPORT_T45)
else if (s->tiff.compression == COMPRESSION_T45)
{
if (s->metadata.image_type != s->tiff.image_type || s->metadata.image_width != s->tiff.image_width)
if (alter_image)
{
if (read_tiff_t45_image(s) < 0)
return -1;
s->pack_buf = s->tiff.image_buffer;
s->pack_ptr = 0;
s->pack_row = 0;
image_translate_set_row_read_handler(&s->translator, translate_row_read2, s);
}
else
{
@@ -1252,7 +1237,7 @@ static int read_tiff_image(t4_tx_state_t *s)
{
/* Let libtiff handle the decompression */
TIFFSetField(s->tiff.tiff_file, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
if (s->metadata.image_type != s->tiff.image_type || s->metadata.image_width != s->tiff.image_width)
if (alter_image)
{
image_translate_set_row_read_handler(&s->translator, translate_row_read, s);
}
@@ -1262,6 +1247,7 @@ static int read_tiff_image(t4_tx_state_t *s)
return -1;
}
}
set_image_width(s, s->metadata.image_width);
set_image_length(s, s->metadata.image_length);
t4_tx_set_image_type(s, s->metadata.image_type);
@@ -1292,9 +1278,6 @@ static int read_tiff_image(t4_tx_state_t *s)
set_lab_gamut(&s->lab_params, 0, 100, -85, 85, -75, 125, false);
s->apply_lab = true;
break;
default:
s->apply_lab = false;
break;
}
total_len = 0;
for (i = 0; i < s->metadata.image_length; i++)
@@ -1305,7 +1288,7 @@ static int read_tiff_image(t4_tx_state_t *s)
}
else
{
if (s->metadata.image_type != s->tiff.image_type || s->metadata.image_width != s->tiff.image_width)
if (alter_image)
{
total_len = 0;
s->tiff.image_buffer = span_realloc(s->tiff.image_buffer, s->metadata.image_width*s->metadata.image_length*3);
@@ -1435,10 +1418,8 @@ static int set_row_read_handler(t4_tx_state_t *s, t4_row_read_handler_t handler,
case T4_COMPRESSION_T42_T81:
case T4_COMPRESSION_SYCC_T81:
return t42_encode_set_row_read_handler(&s->encoder.t42, handler, user_data);
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
return t43_encode_set_row_read_handler(&s->encoder.t43, handler, user_data);
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
return t45_encode_set_row_read_handler(&s->encoder.t45, handler, user_data);
@@ -1674,7 +1655,7 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
int width_code;
int res_code; /* Correct resolution code */
int alt_res_code; /* Fallback resolution code, where a metric/inch swap is possible */
} width_info[] =
} width_and_res_info[] =
{
{ T4_WIDTH_100_A4, T4_SUPPORT_WIDTH_215MM, T4_RESOLUTION_100_100, 0},
{ T4_WIDTH_100_B4, T4_SUPPORT_WIDTH_255MM, T4_RESOLUTION_100_100, 0},
@@ -1777,7 +1758,9 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
int entry;
int compression;
int res;
int supported_colour_compressions;
supported_colour_compressions = supported_compressions & (T4_COMPRESSION_T42_T81 | T4_COMPRESSION_T43 | T4_COMPRESSION_T45 | T4_COMPRESSION_SYCC_T81);
compression = -1;
s->metadata.image_type = s->tiff.image_type;
if (s->tiff.image_type != T4_IMAGE_TYPE_BILEVEL)
@@ -1786,7 +1769,7 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
/* Can we send this page as it is? */
if (supported_colour_resolutions
&&
(supported_compressions & (T4_COMPRESSION_T42_T81 | T4_COMPRESSION_T43 | T4_COMPRESSION_T45 | T4_COMPRESSION_SYCC_T81))
supported_colour_compressions
&&
(((s->tiff.image_type == T4_IMAGE_TYPE_COLOUR_BILEVEL || s->tiff.image_type == T4_IMAGE_TYPE_COLOUR_8BIT || s->tiff.image_type == T4_IMAGE_TYPE_COLOUR_12BIT)
&&
@@ -1798,28 +1781,6 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
{
/* Gray-scale/colour is possible */
span_log(&s->logging, SPAN_LOG_FLOW, "Gray-scale/colour is allowed\n");
if (s->tiff.image_type == T4_IMAGE_TYPE_COLOUR_BILEVEL
||
s->tiff.image_type == T4_IMAGE_TYPE_COLOUR_8BIT
||
s->tiff.image_type == T4_IMAGE_TYPE_COLOUR_12BIT)
{
if (!(supported_compressions & T4_COMPRESSION_COLOUR))
{
span_log(&s->logging, SPAN_LOG_FLOW, "Colour is not allowed\n");
return T4_IMAGE_FORMAT_INCOMPATIBLE;
}
}
else if (s->tiff.image_type == T4_IMAGE_TYPE_GRAY_8BIT
||
s->tiff.image_type == T4_IMAGE_TYPE_GRAY_12BIT)
{
if (!(supported_compressions & T4_COMPRESSION_GRAYSCALE))
{
span_log(&s->logging, SPAN_LOG_FLOW, "Gray-scale is not allowed\n");
return T4_IMAGE_FORMAT_INCOMPATIBLE;
}
}
/* Choose the best gray-scale/colour encoding available to us */
if (s->tiff.image_type == T4_IMAGE_TYPE_COLOUR_BILEVEL && (supported_compressions & T4_COMPRESSION_T43))
compression = T4_COMPRESSION_T43;
@@ -1838,32 +1799,29 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
{
/* Gray-scale/colour is not possible. Can we flatten the image to send it? */
span_log(&s->logging, SPAN_LOG_FLOW, "Gray-scale/colour is not allowed\n");
if (s->tiff.image_type == T4_IMAGE_TYPE_COLOUR_BILEVEL
||
s->tiff.image_type == T4_IMAGE_TYPE_COLOUR_8BIT
||
s->tiff.image_type == T4_IMAGE_TYPE_COLOUR_12BIT)
switch (s->tiff.image_type)
{
case T4_IMAGE_TYPE_COLOUR_BILEVEL:
case T4_IMAGE_TYPE_COLOUR_8BIT:
case T4_IMAGE_TYPE_COLOUR_12BIT:
if (!(supported_compressions & T4_COMPRESSION_COLOUR_TO_BILEVEL))
{
span_log(&s->logging, SPAN_LOG_FLOW, "Flattening is not allowed\n");
return T4_IMAGE_FORMAT_INCOMPATIBLE;
}
s->metadata.image_type = T4_IMAGE_TYPE_BILEVEL;
}
else if (s->tiff.image_type == T4_IMAGE_TYPE_GRAY_8BIT
||
s->tiff.image_type == T4_IMAGE_TYPE_GRAY_12BIT)
{
break;
case T4_IMAGE_TYPE_GRAY_8BIT:
case T4_IMAGE_TYPE_GRAY_12BIT:
if (!(supported_compressions & T4_COMPRESSION_GRAY_TO_BILEVEL))
{
span_log(&s->logging, SPAN_LOG_FLOW, "Flattening is not allowed\n");
return T4_IMAGE_FORMAT_INCOMPATIBLE;
}
s->metadata.image_type = T4_IMAGE_TYPE_BILEVEL;
break;
}
/* Squashing to a bi-level image is possible */
span_log(&s->logging, SPAN_LOG_FLOW, "The image may be flattened to %d\n", s->metadata.image_type);
s->metadata.image_type = T4_IMAGE_TYPE_BILEVEL;
span_log(&s->logging, SPAN_LOG_FLOW, "The image will be flattened to %s\n", t4_image_type_to_str(s->metadata.image_type));
}
}
@@ -1884,26 +1842,20 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
/* Deal with the image width/resolution combination. */
/* Look for a pattern that matches the image */
res = T4_IMAGE_FORMAT_NOSIZESUPPORT;
for (entry = 0; s->tiff.image_width >= width_info[entry].width; entry++)
s->metadata.width_code = -1;
for (entry = 0; s->tiff.image_width >= width_and_res_info[entry].width; entry++)
{
if (s->tiff.image_width == width_info[entry].width && s->tiff.resolution_code == width_info[entry].res_code)
if (s->tiff.image_width == width_and_res_info[entry].width && s->tiff.resolution_code == width_and_res_info[entry].res_code)
{
res = T4_IMAGE_FORMAT_OK;
s->metadata.width_code = width_and_res_info[entry].width_code;
break;
}
}
s->metadata.width_code = width_info[entry].width_code;
res = T4_IMAGE_FORMAT_NOSIZESUPPORT;
s->row_squashing_ratio = 1;
if (res == T4_IMAGE_FORMAT_OK)
if (s->metadata.width_code >= 0 && (supported_image_sizes & s->metadata.width_code))
{
/* We have a valid width/resolution combination */
/* Check if this width/resolution combination is supported */
if (!(supported_image_sizes & width_info[entry].width_code))
return T4_IMAGE_FORMAT_NOSIZESUPPORT;
/* We have a valid and supported width/resolution combination */
/* No resize necessary */
s->metadata.image_width = s->tiff.image_width;
@@ -1912,7 +1864,7 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
res = T4_IMAGE_FORMAT_NORESSUPPORT;
if (s->metadata.image_type == T4_IMAGE_TYPE_BILEVEL)
{
if ((width_info[entry].res_code & supported_bilevel_resolutions))
if ((width_and_res_info[entry].res_code & supported_bilevel_resolutions))
{
/* We can use the resolution of the original image */
s->metadata.resolution_code = s->tiff.resolution_code;
@@ -1920,56 +1872,51 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
s->metadata.y_resolution = code_to_y_resolution(s->metadata.resolution_code);
res = T4_IMAGE_FORMAT_OK;
}
else if ((width_and_res_info[entry].alt_res_code & supported_bilevel_resolutions))
{
/* We can do a metric/imperial swap, and have a usable resolution */
span_log(&s->logging,
SPAN_LOG_FLOW,
"Image resolution %s falls back to %s\n",
t4_image_resolution_to_str(s->tiff.resolution_code),
t4_image_resolution_to_str(width_and_res_info[entry].alt_res_code));
s->metadata.resolution_code = width_and_res_info[entry].alt_res_code;
s->metadata.x_resolution = code_to_x_resolution(s->metadata.resolution_code);
s->metadata.y_resolution = code_to_y_resolution(s->metadata.resolution_code);
res = T4_IMAGE_FORMAT_OK;
}
else
{
/* The resolution is not supported, but there might be an approximation, or a length
squashing that might work. */
if ((width_info[entry].alt_res_code & supported_bilevel_resolutions))
if (s->tiff.image_type == T4_IMAGE_TYPE_BILEVEL)
{
/* We can do a metric/imperial swap, and have a usable resolution */
span_log(&s->logging,
SPAN_LOG_FLOW,
"Image resolution %s falls back to %s\n",
t4_image_resolution_to_str(s->tiff.resolution_code),
t4_image_resolution_to_str(width_info[entry].alt_res_code));
s->metadata.resolution_code = width_info[entry].alt_res_code;
s->metadata.x_resolution = code_to_x_resolution(s->metadata.resolution_code);
s->metadata.y_resolution = code_to_y_resolution(s->metadata.resolution_code);
res = T4_IMAGE_FORMAT_OK;
}
else
{
if (s->tiff.image_type == T4_IMAGE_TYPE_BILEVEL)
if ((s->tiff.resolution_code & (T4_RESOLUTION_200_400 | T4_RESOLUTION_200_200 | T4_RESOLUTION_R8_SUPERFINE | T4_RESOLUTION_R8_FINE)))
{
if ((s->tiff.resolution_code & (T4_RESOLUTION_200_400 | T4_RESOLUTION_200_200 | T4_RESOLUTION_R8_SUPERFINE | T4_RESOLUTION_R8_FINE)))
/* This might be a resolution we can squash down to something which is supported */
for (i = 0; i < 4; i++)
{
/* This might be a resolution we can squash down to something which is supported */
for (i = 0; i < 4; i++)
if ((s->tiff.resolution_code & squashable[i].resolution))
break;
}
if (i < 4)
{
/* This is a squashable resolution, so let's see if there is a valid
fallback we can squash the image to, scanning through the entries
in their order of preference. */
for (j = 0; j < 4; j++)
{
if ((s->tiff.resolution_code & squashable[i].resolution))
break;
}
if (i < 4)
{
/* This is a squashable resolution, so let's see if there is a valid
fallback we can squash the image to, scanning through the entries
in their order of preference. */
for (j = 0; j < 4; j++)
if ((supported_bilevel_resolutions & squashable[i].fallback[j].resolution))
{
if ((supported_bilevel_resolutions & squashable[i].fallback[j].resolution))
{
span_log(&s->logging,
SPAN_LOG_FLOW,
"Image resolution %s falls back to %s\n",
t4_image_resolution_to_str(s->tiff.resolution_code),
t4_image_resolution_to_str(squashable[i].fallback[j].resolution));
s->row_squashing_ratio = squashable[i].fallback[j].squashing_factor;
s->metadata.resolution_code = squashable[i].fallback[j].resolution;
s->metadata.x_resolution = code_to_x_resolution(s->metadata.resolution_code);
s->metadata.y_resolution = code_to_y_resolution(s->metadata.resolution_code);
res = T4_IMAGE_FORMAT_OK;
break;
}
span_log(&s->logging,
SPAN_LOG_FLOW,
"Image resolution %s falls back to %s\n",
t4_image_resolution_to_str(s->tiff.resolution_code),
t4_image_resolution_to_str(squashable[i].fallback[j].resolution));
s->row_squashing_ratio = squashable[i].fallback[j].squashing_factor;
s->metadata.resolution_code = squashable[i].fallback[j].resolution;
s->metadata.x_resolution = code_to_x_resolution(s->metadata.resolution_code);
s->metadata.y_resolution = code_to_y_resolution(s->metadata.resolution_code);
res = T4_IMAGE_FORMAT_OK;
break;
}
}
}
@@ -1977,25 +1924,25 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
}
}
/* If we have not succeeded in matching up the size and resolution, the next step will
depend on whether the original was a bi-level image. If it was we are stuck, as you can't
depend on whether the original was a bi-level image. If it was, we are stuck, as you can't
really resize those. If it was not, a resize might be possible */
if (res != T4_IMAGE_FORMAT_OK)
{
if (s->tiff.image_type == T4_IMAGE_TYPE_BILEVEL)
return T4_IMAGE_FORMAT_NORESSUPPORT;
if (!(supported_compressions & T4_COMPRESSION_RESCALING))
return T4_IMAGE_FORMAT_NORESSUPPORT;
return T4_IMAGE_FORMAT_NOSIZESUPPORT;
}
/* TODO */
}
else
{
if ((width_info[entry].res_code & supported_bilevel_resolutions))
if ((width_and_res_info[entry].res_code & supported_bilevel_resolutions))
{
if ((s->tiff.resolution_code & supported_colour_resolutions))
{
/* We can use the resolution of the original image */
s->metadata.resolution_code = width_info[entry].res_code;
s->metadata.resolution_code = width_and_res_info[entry].res_code;
s->metadata.x_resolution = code_to_x_resolution(s->metadata.resolution_code);
s->metadata.y_resolution = code_to_y_resolution(s->metadata.resolution_code);
res = T4_IMAGE_FORMAT_OK;
@@ -2007,12 +1954,13 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
{
/* Can we rework the image to fit? */
/* We can't rework a bilevel image that fits none of the patterns */
if (s->tiff.image_type == T4_IMAGE_TYPE_BILEVEL)
if (s->tiff.image_type == T4_IMAGE_TYPE_BILEVEL || s->tiff.image_type == T4_IMAGE_TYPE_COLOUR_BILEVEL)
return T4_IMAGE_FORMAT_NORESSUPPORT;
if (!(supported_compressions & T4_COMPRESSION_RESCALING))
return T4_IMAGE_FORMAT_NORESSUPPORT;
res = T4_IMAGE_FORMAT_OK;
return T4_IMAGE_FORMAT_NOSIZESUPPORT;
/* Any other kind of image might be resizable */
res = T4_IMAGE_FORMAT_OK;
/* TODO: use more sophisticated resizing */
s->metadata.image_width = T4_WIDTH_200_A4;
s->metadata.resolution_code = T4_RESOLUTION_200_200;
s->metadata.x_resolution = code_to_x_resolution(s->metadata.resolution_code);
@@ -2103,7 +2051,6 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
s->metadata.compression = compression;
res = T4_IMAGE_FORMAT_OK;
break;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
switch (s->metadata.compression)
{
@@ -2116,7 +2063,6 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s,
s->metadata.compression = compression;
res = T4_IMAGE_FORMAT_OK;
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
switch (s->metadata.compression)
@@ -2215,11 +2161,9 @@ static void set_image_width(t4_tx_state_t *s, uint32_t image_width)
case T4_COMPRESSION_SYCC_T81:
t42_encode_set_image_width(&s->encoder.t42, image_width);
break;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
t43_encode_set_image_width(&s->encoder.t43, image_width);
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
t45_encode_set_image_width(&s->encoder.t45, image_width);
@@ -2252,11 +2196,9 @@ static void set_image_length(t4_tx_state_t *s, uint32_t image_length)
case T4_COMPRESSION_SYCC_T81:
t42_encode_set_image_length(&s->encoder.t42, image_length);
break;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
t43_encode_set_image_length(&s->encoder.t43, image_length);
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
t45_encode_set_image_length(&s->encoder.t45, image_length);
@@ -2280,11 +2222,9 @@ static void t4_tx_set_image_type(t4_tx_state_t *s, int image_type)
case T4_COMPRESSION_SYCC_T81:
t42_encode_set_image_type(&s->encoder.t42, image_type);
break;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
t43_encode_set_image_type(&s->encoder.t43, image_type);
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
t45_encode_set_image_type(&s->encoder.t45, image_type);
@@ -2410,13 +2350,11 @@ SPAN_DECLARE(void) t4_tx_get_transfer_statistics(t4_tx_state_t *s, t4_stats_t *t
t->length = t42_encode_get_image_length(&s->encoder.t42);
t->line_image_size = t42_encode_get_compressed_image_size(&s->encoder.t42)/8;
break;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
t->width = t43_encode_get_image_width(&s->encoder.t43);
t->length = t43_encode_get_image_length(&s->encoder.t43);
t->line_image_size = t43_encode_get_compressed_image_size(&s->encoder.t43)/8;
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
t->width = t45_encode_get_image_width(&s->encoder.t45);
@@ -2430,9 +2368,9 @@ SPAN_DECLARE(void) t4_tx_get_transfer_statistics(t4_tx_state_t *s, t4_stats_t *t
SPAN_DECLARE(int) t4_tx_image_complete(t4_tx_state_t *s)
{
if (s->pre_encoded_len > 0)
if (s->no_encoder.buf_len > 0)
{
if (s->pre_encoded_ptr >= s->pre_encoded_len)
if (s->no_encoder.buf_ptr >= s->no_encoder.buf_len)
return SIG_STATUS_END_OF_DATA;
return 0;
}
@@ -2453,10 +2391,8 @@ SPAN_DECLARE(int) t4_tx_image_complete(t4_tx_state_t *s)
case T4_COMPRESSION_T42_T81:
case T4_COMPRESSION_SYCC_T81:
return t42_encode_image_complete(&s->encoder.t42);
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
return t43_encode_image_complete(&s->encoder.t43);
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
return t45_encode_image_complete(&s->encoder.t45);
@@ -2471,15 +2407,15 @@ SPAN_DECLARE(int) t4_tx_get_bit(t4_tx_state_t *s)
int bit;
/* We only get bit by bit for T.4 1D and T.4 2-D. */
if (s->pre_encoded_len > 0)
if (s->no_encoder.buf_len > 0)
{
if (s->pre_encoded_ptr >= s->pre_encoded_len)
if (s->no_encoder.buf_ptr >= s->no_encoder.buf_len)
return SIG_STATUS_END_OF_DATA;
bit = (s->pre_encoded_buf[s->pre_encoded_ptr] >> s->pre_encoded_bit) & 1;
if (++s->pre_encoded_bit >= 8)
bit = (s->no_encoder.buf[s->no_encoder.buf_ptr] >> s->no_encoder.bit) & 1;
if (++s->no_encoder.bit >= 8)
{
s->pre_encoded_bit = 0;
s->pre_encoded_ptr++;
s->no_encoder.bit = 0;
s->no_encoder.buf_ptr++;
}
return bit;
}
@@ -2489,12 +2425,12 @@ SPAN_DECLARE(int) t4_tx_get_bit(t4_tx_state_t *s)
SPAN_DECLARE(int) t4_tx_get(t4_tx_state_t *s, uint8_t buf[], size_t max_len)
{
if (s->pre_encoded_len > 0)
if (s->no_encoder.buf_len > 0)
{
if (max_len > (s->pre_encoded_len - s->pre_encoded_ptr))
max_len = s->pre_encoded_len - s->pre_encoded_ptr;
memcpy(buf, &s->pre_encoded_buf[s->pre_encoded_ptr], max_len);
s->pre_encoded_ptr += max_len;
if (max_len > (s->no_encoder.buf_len - s->no_encoder.buf_ptr))
max_len = s->no_encoder.buf_len - s->no_encoder.buf_ptr;
memcpy(buf, &s->no_encoder.buf[s->no_encoder.buf_ptr], max_len);
s->no_encoder.buf_ptr += max_len;
return max_len;
}
@@ -2547,12 +2483,10 @@ SPAN_DECLARE(int) t4_tx_start_page(t4_tx_state_t *s)
t42_encode_restart(&s->encoder.t42, s->metadata.image_width, s->metadata.image_length);
s->image_get_handler = (t4_image_get_handler_t) t42_encode_get;
break;
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
t43_encode_restart(&s->encoder.t43, s->metadata.image_width, s->metadata.image_length);
s->image_get_handler = (t4_image_get_handler_t) t43_encode_get;
break;
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
t45_encode_restart(&s->encoder.t45, s->metadata.image_width, s->metadata.image_length);
@@ -2684,10 +2618,8 @@ SPAN_DECLARE(int) t4_tx_release(t4_tx_state_t *s)
case T4_COMPRESSION_T42_T81:
case T4_COMPRESSION_SYCC_T81:
return t42_encode_release(&s->encoder.t42);
#if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43:
return t43_encode_release(&s->encoder.t43);
#endif
#if defined(SPANDSP_SUPPORT_T45)
case T4_COMPRESSION_T45:
return t45_encode_release(&s->encoder.t45);
+37 -5
View File
@@ -53,7 +53,7 @@
#include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h"
static __inline__ int32_t pack_32(uint8_t *s)
static __inline__ int32_t pack_32(const uint8_t *s)
{
int32_t value;
@@ -265,6 +265,16 @@ static int finish_sde(t85_decode_state_t *s)
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(bool) t85_analyse_header(uint32_t *width, uint32_t *length, const uint8_t data[], size_t len)
{
if (len < 20)
return false;
*width = pack_32(&data[6]);
*length = pack_32(&data[10]);
return true;
}
/*- End of function --------------------------------------------------------*/
static int check_bih(t85_decode_state_t *s)
{
/* Check that the fixed parameters have the values they are expected to be
@@ -289,12 +299,14 @@ static int check_bih(t85_decode_state_t *s)
#endif
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. Fixed bytes do not contain expected values.\n");
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
/* P - Number of bit planes */
if (s->buffer[2] < s->min_bit_planes || s->buffer[2] > s->max_bit_planes)
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. %d bit planes. Should be %d to %d.\n", s->buffer[2], s->min_bit_planes, s->max_bit_planes);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
s->bit_planes = s->buffer[2];
@@ -305,6 +317,7 @@ static int check_bih(t85_decode_state_t *s)
if (s->xd == 0 || (s->max_xd && s->xd > s->max_xd))
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. Width is %" PRIu32 "\n", s->xd);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
/* YD - Vertical image size at layer D */
@@ -312,6 +325,7 @@ static int check_bih(t85_decode_state_t *s)
if (s->yd == 0 || (s->max_yd && s->yd > s->max_yd))
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. Length is %" PRIu32 "\n", s->yd);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
/* L0 - Rows per stripe, at the lowest resolution */
@@ -319,6 +333,7 @@ static int check_bih(t85_decode_state_t *s)
if (s->l0 == 0)
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. L0 is %" PRIu32 "\n", s->l0);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
/* MX - Maximum horizontal offset allowed for AT pixel */
@@ -326,6 +341,7 @@ static int check_bih(t85_decode_state_t *s)
if (s->mx > 127)
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. MX is %d\n", s->mx);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
/* Options byte */
@@ -333,6 +349,7 @@ static int check_bih(t85_decode_state_t *s)
if ((s->options & 0x97))
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. Options are 0x%X\n", s->options);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
span_log(&s->logging, SPAN_LOG_FLOW, "BIH is OK. Image is %" PRIu32 "x%" PRIu32 " pixels\n", s->xd, s->yd);
@@ -378,6 +395,8 @@ SPAN_DECLARE(int) t85_decode_put(t85_decode_state_t *s, const uint8_t data[], si
{
if (s->y >= s->yd)
return T4_DECODE_OK;
if (s->end_of_data > 0)
return T4_DECODE_INVALID_DATA;
/* This is the end of image condition */
s->end_of_data = 1;
}
@@ -492,7 +511,6 @@ SPAN_DECLARE(int) t85_decode_put(t85_decode_state_t *s, const uint8_t data[], si
the commonest thing for us to hit here. */
decode_pscd(s, s->buffer, 2);
s->buf_len = 0;
if (s->interrupt)
return T4_DECODE_INTERRUPT;
break;
@@ -523,9 +541,11 @@ SPAN_DECLARE(int) t85_decode_put(t85_decode_state_t *s, const uint8_t data[], si
continue;
s->buf_needed = 2;
s->buf_len = 0;
if (s->at_moves >= T85_ATMOVES_MAX)
{
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
s->at_row[s->at_moves] = pack_32(&s->buffer[2]);
s->at_tx[s->at_moves] = s->buffer[6];
if (s->at_tx[s->at_moves] > s->mx
@@ -534,6 +554,7 @@ SPAN_DECLARE(int) t85_decode_put(t85_decode_state_t *s, const uint8_t data[], si
||
s->buffer[7] != 0)
{
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
s->at_moves++;
@@ -544,14 +565,19 @@ SPAN_DECLARE(int) t85_decode_put(t85_decode_state_t *s, const uint8_t data[], si
continue;
s->buf_needed = 2;
s->buf_len = 0;
if (!(s->options & T85_VLENGTH))
{
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
s->options &= ~T85_VLENGTH;
y = pack_32(&s->buffer[2]);
/* An update to the image length is not allowed to stretch it. */
if (y > s->yd)
{
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
s->yd = y;
break;
case T82_SDNORM:
@@ -633,7 +659,10 @@ SPAN_DECLARE(int) t85_decode_put(t85_decode_state_t *s, const uint8_t data[], si
y = pack_32(&s->buffer[4]);
/* An update to the image length is not allowed to stretch it. */
if (y > s->yd)
{
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
/* Things look OK, so accept this new length, and proceed. */
s->yd = y;
/* Now process the T82_SDNORM or T82_SDRST */
@@ -647,6 +676,7 @@ SPAN_DECLARE(int) t85_decode_put(t85_decode_state_t *s, const uint8_t data[], si
break;
default:
s->buf_len = 0;
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
}
@@ -663,10 +693,12 @@ SPAN_DECLARE(int) t85_decode_put(t85_decode_state_t *s, const uint8_t data[], si
/* We should only have stopped processing PSCD if
we ran out of data, or hit a T82_ESC */
if (cnt < len && data[cnt] != T82_ESC)
{
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
}
}
return T4_DECODE_MORE_DATA;
}
/*- End of function --------------------------------------------------------*/
+26 -1
View File
@@ -50,6 +50,14 @@ AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_builddir)/spandsp-sim -DDATADIR="\"$
LIBDIR = -L$(top_builddir)/src
if COND_V32BIS
V32BIS_PROGS = v32bis_tests
endif
if COND_V34
V34_PROGS = v34_tests
endif
noinst_PROGRAMS = ademco_contactid_tests \
adsi_tests \
alloc_tests \
@@ -94,6 +102,7 @@ noinst_PROGRAMS = ademco_contactid_tests \
playout_tests \
plc_tests \
power_meter_tests \
pseudo_terminal_tests \
queue_tests \
r2_mf_rx_tests \
r2_mf_tx_tests \
@@ -130,7 +139,9 @@ noinst_PROGRAMS = ademco_contactid_tests \
v42bis_tests \
v8_tests \
vector_float_tests \
vector_int_tests
vector_int_tests \
$(V32BIS_PROGS) \
$(V34_PROGS)
noinst_HEADERS = echo_monitor.h \
fax_tester.h \
@@ -139,6 +150,7 @@ noinst_HEADERS = echo_monitor.h \
media_monitor.h \
modem_monitor.h \
pcap_parse.h \
pseudo_terminals.h \
udptl.h
ademco_contactid_tests_SOURCES = ademco_contactid_tests.c
@@ -273,6 +285,9 @@ plc_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspands
power_meter_tests_SOURCES = power_meter_tests.c
power_meter_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp
pseudo_terminal_tests_SOURCES = pseudo_terminal_tests.c fax_utils.c pseudo_terminals.c
pseudo_terminal_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim -lspandsp -lutil
queue_tests_SOURCES = queue_tests.c
queue_tests_LDADD = $(LIBDIR) -lspandsp
@@ -369,6 +384,16 @@ v27ter_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspa
v29_tests_SOURCES = v29_tests.c line_model_monitor.cpp modem_monitor.cpp
v29_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp
if COND_V32BIS
v32bis_tests_SOURCES = v32bis_tests.c line_model_monitor.cpp modem_monitor.cpp
v32bis_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp
endif
if COND_V34
v34_tests_SOURCES = v34_tests.c line_model_monitor.cpp modem_monitor.cpp
v34_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp
endif
v42_tests_SOURCES = v42_tests.c
v42_tests_LDADD = $(LIBDIR) -lspandsp
+4 -3
View File
@@ -58,9 +58,10 @@ int main(int argc, char *argv[])
void *b;
void *c;
if (span_mem_allocators(memalign,
malloc,
if (span_mem_allocators(malloc,
realloc,
free,
memalign,
free))
{
printf("Failed\n");
@@ -70,7 +71,7 @@ int main(int argc, char *argv[])
b = span_alloc(42);
c = span_realloc(NULL, 42);
printf("%p %p %p\n", a, b, c);
span_free(a);
span_aligned_free(a);
span_free(b);
span_free(c);
}
+33 -10
View File
@@ -463,8 +463,8 @@ int main(int argc, char *argv[])
int outframes;
SNDFILE *wave_handle;
SNDFILE *input_wave_handle;
int use_ecm;
int use_tep;
bool use_ecm;
bool use_tep;
int feedback_audio;
int use_transmit_on_idle;
int t38_version;
@@ -479,7 +479,6 @@ int main(int argc, char *argv[])
double tx_when;
double rx_when;
int supported_modems;
int remove_fill_bits;
int opt;
int start_page;
int end_page;
@@ -490,8 +489,11 @@ int main(int argc, char *argv[])
int noise_level;
int code_to_look_up;
int scan_line_time;
int allowed_bilevel_resolutions;
int colour_enabled;
int allowed_bilevel_resolutions[2];
int allowed;
bool remove_fill_bits;
bool colour_enabled;
bool t37_like_output;
t38_stats_t t38_stats;
t30_stats_t t30_stats;
logging_state_t *logging;
@@ -530,15 +532,22 @@ int main(int argc, char *argv[])
scan_line_time = 0;
decode_file_name = NULL;
code_to_look_up = -1;
allowed_bilevel_resolutions = 0;
allowed_bilevel_resolutions[0] = 0;
allowed_bilevel_resolutions[1] = 0;
allowed = 0;
colour_enabled = false;
t37_like_output = false;
t38_transport = T38_TRANSPORT_UDPTL;
while ((opt = getopt(argc, argv, "b:c:Cd:D:efFgH:i:Ilm:M:n:p:s:S:tT:u:v:z:")) != -1)
while ((opt = getopt(argc, argv, "7b:c:Cd:D:efFgH:i:Ilm:M:n:p:s:S:tT:u:v:z:")) != -1)
{
switch (opt)
{
case '7':
t37_like_output = true;
break;
case 'b':
allowed_bilevel_resolutions = atoi(optarg);
allowed_bilevel_resolutions[allowed] = atoi(optarg);
allowed ^= 1;
break;
case 'c':
code_to_look_up = atoi(optarg);
@@ -855,7 +864,7 @@ int main(int argc, char *argv[])
| T4_SUPPORT_LENGTH_US_LETTER
| T4_SUPPORT_LENGTH_US_LEGAL
| T4_SUPPORT_LENGTH_UNLIMITED);
switch (allowed_bilevel_resolutions)
switch (allowed_bilevel_resolutions[i])
{
case 0:
/* Allow anything */
@@ -926,7 +935,21 @@ int main(int argc, char *argv[])
{
t30_set_supported_colour_resolutions(t30_state[i], 0);
}
t30_set_supported_output_compressions(t30_state[i], T4_COMPRESSION_T6 | T4_COMPRESSION_JPEG);
if (t37_like_output)
{
t30_set_supported_output_compressions(t30_state[i],
T4_COMPRESSION_T85
| T4_COMPRESSION_T85_L0
| T4_COMPRESSION_T6
| T4_COMPRESSION_T42_T81);
}
else
{
t30_set_supported_output_compressions(t30_state[i],
T4_COMPRESSION_T6
| T4_COMPRESSION_JPEG);
}
t30_set_ecm_capability(t30_state[i], use_ecm);
t30_set_supported_compressions(t30_state[i],
T4_COMPRESSION_T4_1D
+23 -28
View File
@@ -28,7 +28,7 @@ run_fax_test()
fi
# Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t
# option means the normal differences in tags will be ignored.
tiffcmp -t ${FILE} fax_tests.tif >/dev/null
${TIFFCMP} -t ${FILE} fax_tests.tif >/dev/null
RETVAL=$?
if [ $RETVAL != 0 ]
then
@@ -43,7 +43,7 @@ run_fax_squash_test()
{
# Test with lengthwise squashing of a bilevel image
rm -f fax_tests.tif
echo ./fax_tests -b ${SQ} ${OPTS} -i ${IN_FILE}
echo ./fax_tests -b ${SQ} -b ${SQ} ${OPTS} -i ${IN_FILE}
./fax_tests -b ${SQ} ${OPTS} -i ${IN_FILE} >xyzzy 2>xyzzy2
RETVAL=$?
if [ $RETVAL != 0 ]
@@ -53,7 +53,7 @@ run_fax_squash_test()
fi
# Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t
# option means the normal differences in tags will be ignored.
tiffcmp -t ${OUT_FILE} fax_tests.tif >/dev/null
${TIFFCMP} -t ${OUT_FILE} fax_tests.tif >/dev/null
RETVAL=$?
if [ $RETVAL != 0 ]
then
@@ -77,7 +77,7 @@ run_colour_fax_test()
fi
# Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t
# option means the normal differences in tags will be ignored.
tiffcmp -t ${OUT_FILE} fax_tests.tif >/dev/null
${TIFFCMP} -t ${OUT_FILE} fax_tests.tif >/dev/null
RETVAL=$?
if [ $RETVAL != 0 ]
then
@@ -91,40 +91,35 @@ run_colour_fax_test()
ITUTESTS_DIR=../test-data/itu/fax
TIFFFX_DIR=../test-data/itu/tiff-fx
LOCALTESTS_DIR=../test-data/local
TIFFCMP=tiffcmp
# Colour/gray -> bilevel by not allowing ECM
for OPTS in "-p AA" "-p TT" "-p GG" "-p TG" "-p GT"
do
echo Colour to bi-level tests disabled
# IN_FILE="${LOCALTESTS_DIR}/lenna-colour.tif"
# OUT_FILE="${LOCALTESTS_DIR}/lenna-colour-bilevel.tif"
# run_colour_fax_test
IN_FILE="${LOCALTESTS_DIR}/lenna-colour.tif"
OUT_FILE="${LOCALTESTS_DIR}/lenna-colour-bilevel.tif"
run_colour_fax_test
# IN_FILE="${LOCALTESTS_DIR}/lenna-bw.tif"
# OUT_FILE="${LOCALTESTS_DIR}/lenna-bw-bilevel.tif"
# run_colour_fax_test
IN_FILE="${LOCALTESTS_DIR}/lenna-bw.tif"
OUT_FILE="${LOCALTESTS_DIR}/lenna-bw-bilevel.tif"
run_colour_fax_test
# IN_FILE="${LOCALTESTS_DIR}/lenna-colour.tif"
# OUT_FILE="${LOCALTESTS_DIR}/lenna-bw-bilevel.tif"
# run_colour_fax_test
IN_FILE="${TIFFFX_DIR}/c03x_02x.tif"
OUT_FILE="${TIFFFX_DIR}/c03x_02x-bilevel.tif"
run_colour_fax_test
# IN_FILE="${TIFFFX_DIR}/c03x_02x.tif"
# OUT_FILE="${TIFFFX_DIR}/c03x_02x.tif"
# run_colour_fax_test
IN_FILE="${TIFFFX_DIR}/l02x_02x.tif"
OUT_FILE="${TIFFFX_DIR}/l02x_02x-bilevel.tif"
run_colour_fax_test
# IN_FILE="${TIFFFX_DIR}/l02x_02x.tif"
# OUT_FILE="${TIFFFX_DIR}/l02x_02x.tif"
# run_colour_fax_test
# IN_FILE="${TIFFFX_DIR}/l04x_02x.tif"
# OUT_FILE="${TIFFFX_DIR}/l04x_02x.tif"
# run_colour_fax_test
IN_FILE="${TIFFFX_DIR}/l04x_02x.tif"
OUT_FILE="${TIFFFX_DIR}/l04x_02x-bilevel.tif"
run_colour_fax_test
done
# Colour/gray -> colour/gray
for OPTS in "-p AA -C -e" "-p TT -C -e" "-p GG -C -e" "-p TG -C -e" "-p GT -C -e"
do
echo Colour to colour tests disabled
# IN_FILE="${LOCALTESTS_DIR}/lenna-colour.tif"
# OUT_FILE="${LOCALTESTS_DIR}/lenna-colour-out.tif"
# run_colour_fax_test
@@ -137,9 +132,9 @@ do
# OUT_FILE="${TIFFFX_DIR}/c03x_02x-out.tif"
# run_colour_fax_test
# IN_FILE="${TIFFFX_DIR}/l02x_02x.tif"
# OUT_FILE="${TIFFFX_DIR}/l02x_02x.tif"
# run_colour_fax_test
IN_FILE="${TIFFFX_DIR}/l02x_02x.tif"
OUT_FILE="${TIFFFX_DIR}/l02x_02x.tif"
run_colour_fax_test
# IN_FILE="${TIFFFX_DIR}/l04x_02x.tif"
# OUT_FILE="${TIFFFX_DIR}/l04x_02x.tif"
@@ -1,7 +1,7 @@
/*
* SpanDSP - a series of DSP components for telephony
*
* pseudo_terminals_tests.c - pseudo terminal handling tests.
* pseudo_terminal_tests.c - pseudo terminal handling tests.
*
* Written by Steve Underwood <steveu@coppice.org>
*
@@ -31,7 +31,6 @@
#else
#if defined(__APPLE__)
#include <util.h>
#include <sys/ioctl.h>
#elif defined(__FreeBSD__)
#include <libutil.h>
#include <termios.h>
@@ -39,33 +38,113 @@
#else
#include <pty.h>
#endif
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <poll.h>
#include <errno.h>
#endif
#include "spandsp.h"
#include "spandsp/t30_fcf.h"
#include "spandsp-sim.h"
#undef SPANDSP_EXPOSE_INTERNAL_STRUCTURES
#include "pseudo_terminals.h"
int main(int argc, char *argv[])
static int master(void)
{
modem_t modem[10];
char buf[1024];
int len;
int i;
for (i = 0; i < 10; i++)
{
if (psuedo_terminal_create(&modem[i]))
{
printf("Failure\n");
exit(2);
}
printf("%s %s\n", modem[i].devlink, modem[i].stty);
}
getchar();
for (;;)
{
for (i = 0; i < 10; i++)
{
len = read(modem[i].master, buf, 4);
if (len >= 0)
{
buf[len] = '\0';
printf("%d %d '%s' %s\n", i, len, buf, strerror(errno));
}
}
}
for (i = 0; i < 10; i++)
{
if (psuedo_terminal_close(&modem[i]))
{
printf("Failure\n");
exit(2);
}
}
return 0;
}
/*- End of function --------------------------------------------------------*/
static int slave(void)
{
int fd[10];
char name[64];
int i;
int j;
for (i = 0; i < 10; i++)
{
sprintf(name, "/dev/spandsp/%d", i);
if ((fd[i] = open(name, O_RDWR)) < 0)
{
printf("Failed to open %s\n", name);
exit(2);
}
printf("%s\n", name);
}
for (j = 0; j < 10; j++)
{
for (i = 0; i < 10; i++)
{
write(fd[i], "FRED", 4);
}
}
for (i = 0; i < 10; i++)
{
if (close(fd[i]))
{
printf("Failed to close %d\n", i);
exit(2);
}
}
return 0;
}
/*- End of function --------------------------------------------------------*/
int main(int argc, char *argv[])
{
if (argc < 2)
master();
else
slave();
return 0;
}
/*- End of function --------------------------------------------------------*/
/*- End of file ------------------------------------------------------------*/
+2 -1
View File
@@ -51,6 +51,7 @@
#include "pseudo_terminals.h"
int next_id = 0;
const char *device_root_name = "/dev/spandsp";
int psuedo_terminal_close(modem_t *modem)
{
@@ -175,7 +176,7 @@ int psuedo_terminal_create(modem_t *modem)
modem->threadAbort = CreateEvent(NULL, true, false, NULL);
#else
modem->slot = next_id++;
snprintf(modem->devlink, sizeof(modem->devlink), "/dev/spandsp/%d", modem->slot);
snprintf(modem->devlink, sizeof(modem->devlink), "%s/%d", device_root_name, modem->slot);
/* Remove any stale link which might be present */
unlink(modem->devlink);
@@ -47,8 +47,6 @@
#include "spandsp.h"
#include "spandsp/t30_fcf.h"
#include "spandsp-sim.h"
#undef SPANDSP_EXPOSE_INTERNAL_STRUCTURES
+60 -2
View File
@@ -440,7 +440,36 @@ int main(int argc, char *argv[])
t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'A');
t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'A');
t30_set_ecm_capability(t30, use_ecm);
t30_set_supported_compressions(t30, T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D | T4_COMPRESSION_T6 | T4_COMPRESSION_T85);
t30_set_supported_compressions(t30,
T4_COMPRESSION_T4_1D
| T4_COMPRESSION_T4_2D
| T4_COMPRESSION_T6
| T4_COMPRESSION_T85
| T4_COMPRESSION_T85_L0
| T4_COMPRESSION_T42_T81
| T4_COMPRESSION_COLOUR);
t30_set_supported_bilevel_resolutions(t30,
T4_RESOLUTION_R8_STANDARD
| T4_RESOLUTION_R8_FINE
| T4_RESOLUTION_R8_SUPERFINE
| T4_RESOLUTION_R16_SUPERFINE
| T4_RESOLUTION_200_100
| T4_RESOLUTION_200_200
| T4_RESOLUTION_200_400
| T4_RESOLUTION_300_300
| T4_RESOLUTION_300_600
| T4_RESOLUTION_400_400
| T4_RESOLUTION_400_800
| T4_RESOLUTION_600_600
| T4_RESOLUTION_600_1200
| T4_RESOLUTION_1200_1200);
t30_set_supported_colour_resolutions(t30,
T4_RESOLUTION_100_100
| T4_RESOLUTION_200_200
| T4_RESOLUTION_300_300
| T4_RESOLUTION_400_400
| T4_RESOLUTION_600_600
| T4_RESOLUTION_1200_1200);
if (pcap_scan_pkts(input_file_name, src_addr, src_port, dest_addr, dest_port, t38_terminal_timing_update, process_packet, NULL))
exit(2);
@@ -497,7 +526,36 @@ int main(int argc, char *argv[])
t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'B');
t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'B');
t30_set_ecm_capability(t30, use_ecm);
t30_set_supported_compressions(t30, T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D | T4_COMPRESSION_T6);
t30_set_supported_compressions(t30,
T4_COMPRESSION_T4_1D
| T4_COMPRESSION_T4_2D
| T4_COMPRESSION_T6
| T4_COMPRESSION_T85
| T4_COMPRESSION_T85_L0
| T4_COMPRESSION_T42_T81
| T4_COMPRESSION_COLOUR);
t30_set_supported_bilevel_resolutions(t30,
T4_RESOLUTION_R8_STANDARD
| T4_RESOLUTION_R8_FINE
| T4_RESOLUTION_R8_SUPERFINE
| T4_RESOLUTION_R16_SUPERFINE
| T4_RESOLUTION_200_100
| T4_RESOLUTION_200_200
| T4_RESOLUTION_200_400
| T4_RESOLUTION_300_300
| T4_RESOLUTION_300_600
| T4_RESOLUTION_400_400
| T4_RESOLUTION_400_800
| T4_RESOLUTION_600_600
| T4_RESOLUTION_600_1200
| T4_RESOLUTION_1200_1200);
t30_set_supported_colour_resolutions(t30,
T4_RESOLUTION_100_100
| T4_RESOLUTION_200_200
| T4_RESOLUTION_300_300
| T4_RESOLUTION_400_400
| T4_RESOLUTION_600_600
| T4_RESOLUTION_1200_1200);
logging = fax_get_logging_state(fax_state);
span_log_set_level(logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME);
+5 -5
View File
@@ -300,7 +300,7 @@ int main(int argc, char *argv[])
memcpy(data, jpeg_table, jpeg_table_len - 2);
if (total_len != total_image_len)
printf("Size mismatch %ld %ld\n", total_len, total_image_len);
printf("Size mismatch %ld %ld\n", (long int) total_len, (long int) total_image_len);
off = total_len;
switch (compression)
{
@@ -309,7 +309,7 @@ int main(int argc, char *argv[])
case COMPRESSION_CCITT_T6:
break;
case COMPRESSION_T85:
printf("T.85 image %ld bytes\n", total_len);
printf("T.85 image %ld bytes\n", (long int) total_len);
for (i = 0; i < 16; i++)
printf("0x%02x\n", data[i]);
t85_decode_init(&t85_dec, t85_row_write_handler, NULL);
@@ -322,7 +322,7 @@ int main(int argc, char *argv[])
t85_decode_release(&t85_dec);
return 0;
case COMPRESSION_T43:
printf("T.43 image %ld bytes\n", total_len);
printf("T.43 image %ld bytes\n", (long int) total_len);
if (pack_16(data) == 0xFFA8)
{
data += 2;
@@ -447,7 +447,7 @@ int main(int argc, char *argv[])
return 1;
off += bytes_per_row;
}
printf("total %u, off %ld\n", totdata, off);
printf("total %u, off %ld\n", totdata, (long int) off);
/* We now have the image in memory in RGB form */
@@ -497,7 +497,7 @@ int main(int argc, char *argv[])
}
TIFFClose(tif);
printf("XXX - image is %d by %d, %ld bytes\n", w, h, off);
printf("XXX - image is %d by %d, %ld bytes\n", w, h, (long int) off);
/* We now have the image in memory in ITULAB form */
-4
View File
@@ -288,20 +288,16 @@ int main(int argc, char *argv[])
compression_step = -1;
}
#endif
#if defined(SPANDSP_SUPPORT_T42)
else if (strcmp(optarg, "T81") == 0)
{
compression = T4_COMPRESSION_T42_T81;
compression_step = -1;
}
#endif
#if defined(SPANDSP_SUPPORT_T43)
else if (strcmp(optarg, "T43") == 0)
{
compression = T4_COMPRESSION_T43;
compression_step = -1;
}
#endif
#if defined(SPANDSP_SUPPORT_T45)
else if (strcmp(optarg, "T45") == 0)
{
+26
View File
@@ -0,0 +1,26 @@
:
#
# Install the things which need adding to a fresh Fedora or Centos install to make it ready to build
# spandsp and its test suite
#
yum groupinstall "Development tools"
yum install fftw-devel \
libtiff-tools \
libtiff-devel \
libjpeg-turbo-devel \
libpcap-devel \
libxml2-devel \
libsndfile-devel \
fltk-devel \
fltk-fluid \
libstdc++-devel \
libstdc++-static \
sox \
gcc-c++ \
libtool \
autconf \
automake \
m4 \
netpbm \
netpbm-progs
+1 -1
View File
@@ -367,7 +367,7 @@ void stfu_n_reset(stfu_instance_t *i)
i->last_rd_ts = 0;
i->miss_count = 0;
i->packet_count = 0;
i->ts_offset = 0;
}
+1
View File
@@ -275,6 +275,7 @@ struct switch_runtime {
char *core_db_post_trans_execute;
char *core_db_inner_pre_trans_execute;
char *core_db_inner_post_trans_execute;
int events_use_dispatch;
};
extern struct switch_runtime runtime;
+1
View File
@@ -65,6 +65,7 @@ typedef struct switch_thread_data_s {
switch_thread_start_t func;
void *obj;
int alloc;
switch_memory_pool_t *pool;
} switch_thread_data_t;
typedef struct switch_hold_record_s {
+72 -41
View File
@@ -1630,63 +1630,94 @@ typedef uint32_t switch_io_flag_t;
<pre>
SWITCH_EVENT_CUSTOM - A custom event
SWITCH_EVENT_CLONE - A cloned event
SWITCH_EVENT_CHANNEL_CREATE - A channel has been created
SWITCH_EVENT_CHANNEL_DESTROY - A channel has been destroyed
SWITCH_EVENT_CHANNEL_STATE - A channel has changed state
SWITCH_EVENT_CHANNEL_CALLSTATE - A channel has changed call state
SWITCH_EVENT_CHANNEL_ANSWER - A channel has been answered
SWITCH_EVENT_CHANNEL_HANGUP - A channel has been hungup
SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE - A channel has completed the hangup
SWITCH_EVENT_CHANNEL_EXECUTE - A channel has executed a module's application
SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE - A channel has finshed executing a module's application
SWITCH_EVENT_CHANNEL_BRIDGE - A channel has bridged to another channel
SWITCH_EVENT_CHANNEL_UNBRIDGE - A channel has unbridged from another channel
SWITCH_EVENT_CHANNEL_HOLD - A channel has been put on hold
SWITCH_EVENT_CHANNEL_UNHOLD - A channel has been unheld
SWITCH_EVENT_CHANNEL_BRIDGE - A channel has bridged to another channel
SWITCH_EVENT_CHANNEL_UNBRIDGE - A channel has unbridged from another channel
SWITCH_EVENT_CHANNEL_PROGRESS - A channel has started ringing
SWITCH_EVENT_CHANNEL_PROGRESS_MEDIA - A channel has started early media
SWITCH_EVENT_CHANNEL_OUTGOING - A channel has been unparked
SWITCH_EVENT_CHANNEL_PARK - A channel has been parked
SWITCH_EVENT_CHANNEL_UNPARK - A channel has been unparked
SWITCH_EVENT_CHANNEL_APPLICATION- A channel has called and event from an application
SWITCH_EVENT_CHANNEL_ORIGINATE - A channel has been originated
SWITCH_EVENT_CHANNEL_UUID - A channel has changed uuid
SWITCH_EVENT_CHANNEL_PARK - A channel has been parked
SWITCH_EVENT_CHANNEL_UNPARK - A channel has been unparked
SWITCH_EVENT_CHANNEL_APPLICATION- A channel has called and event from an application
SWITCH_EVENT_CHANNEL_ORIGINATE - A channel has been originated
SWITCH_EVENT_CHANNEL_UUID - A channel has changed uuid
SWITCH_EVENT_API - An API call has been executed
SWITCH_EVENT_LOG - A LOG event has been triggered
SWITCH_EVENT_INBOUND_CHAN - A new inbound channel has been created
SWITCH_EVENT_OUTBOUND_CHAN - A new outbound channel has been created
SWITCH_EVENT_STARTUP - The system has been started
SWITCH_EVENT_SHUTDOWN - The system has been shutdown
SWITCH_EVENT_PUBLISH - Publish
SWITCH_EVENT_UNPUBLISH - UnPublish
SWITCH_EVENT_TALK - Talking Detected
SWITCH_EVENT_NOTALK - Not Talking Detected
SWITCH_EVENT_SESSION_CRASH - Session Crashed
SWITCH_EVENT_MODULE_LOAD - Module was loaded
SWITCH_EVENT_MODULE_UNLOAD - Module was unloaded
SWITCH_EVENT_DTMF - DTMF was sent
SWITCH_EVENT_MESSAGE - A Basic Message
SWITCH_EVENT_PRESENCE_IN - Presence in
SWITCH_EVENT_NOTIFY_IN - Received incoming NOTIFY from gateway subscription
SWITCH_EVENT_PRESENCE_OUT - Presence out
SWITCH_EVENT_PRESENCE_PROBE - Presence probe
SWITCH_EVENT_MESSAGE_WAITING - A message is waiting
SWITCH_EVENT_MESSAGE_QUERY - A query for MESSAGE_WAITING events
SWITCH_EVENT_CODEC - Codec Change
SWITCH_EVENT_BACKGROUND_JOB - Background Job
SWITCH_EVENT_DETECTED_SPEECH - Detected Speech
SWITCH_EVENT_DETECTED_TONE - Detected Tone
SWITCH_EVENT_PRIVATE_COMMAND - A private command event
SWITCH_EVENT_HEARTBEAT - Machine is alive
SWITCH_EVENT_TRAP - Error Trap
SWITCH_EVENT_ADD_SCHEDULE - Something has been scheduled
SWITCH_EVENT_DEL_SCHEDULE - Something has been unscheduled
SWITCH_EVENT_EXE_SCHEDULE - Something scheduled has been executed
SWITCH_EVENT_RE_SCHEDULE - Something scheduled has been rescheduled
SWITCH_EVENT_RELOADXML - XML registry has been reloaded
SWITCH_EVENT_NOTIFY - Notification
SWITCH_EVENT_PHONE_FEATURE - Notification (DND/CFWD/etc)
SWITCH_EVENT_PHONE_FEATURE_SUBSCRIBE - Phone feature subscription
SWITCH_EVENT_SEND_MESSAGE - Message
SWITCH_EVENT_RECV_MESSAGE - Message
SWITCH_EVENT_NAT - NAT Management (new/del/status)
SWITCH_EVENT_FAILURE - A failure occurred which might impact the normal functioning of the switch
SWITCH_EVENT_PUBLISH - Publish
SWITCH_EVENT_UNPUBLISH - UnPublish
SWITCH_EVENT_TALK - Talking Detected
SWITCH_EVENT_NOTALK - Not Talking Detected
SWITCH_EVENT_SESSION_CRASH - Session Crashed
SWITCH_EVENT_MODULE_LOAD - Module was loaded
SWITCH_EVENT_MODULE_UNLOAD - Module was unloaded
SWITCH_EVENT_DTMF - DTMF was sent
SWITCH_EVENT_MESSAGE - A Basic Message
SWITCH_EVENT_PRESENCE_IN - Presence in
SWITCH_EVENT_NOTIFY_IN - Received incoming NOTIFY from gateway subscription
SWITCH_EVENT_PRESENCE_OUT - Presence out
SWITCH_EVENT_PRESENCE_PROBE - Presence probe
SWITCH_EVENT_MESSAGE_WAITING - A message is waiting
SWITCH_EVENT_MESSAGE_QUERY - A query for MESSAGE_WAITING events
SWITCH_EVENT_ROSTER - ?
SWITCH_EVENT_CODEC - Codec Change
SWITCH_EVENT_BACKGROUND_JOB - Background Job
SWITCH_EVENT_DETECTED_SPEECH - Detected Speech
SWITCH_EVENT_DETECTED_TONE - Detected Tone
SWITCH_EVENT_PRIVATE_COMMAND - A private command event
SWITCH_EVENT_HEARTBEAT - Machine is alive
SWITCH_EVENT_TRAP - Error Trap
SWITCH_EVENT_ADD_SCHEDULE - Something has been scheduled
SWITCH_EVENT_DEL_SCHEDULE - Something has been unscheduled
SWITCH_EVENT_EXE_SCHEDULE - Something scheduled has been executed
SWITCH_EVENT_RE_SCHEDULE - Something scheduled has been rescheduled
SWITCH_EVENT_RELOADXML - XML registry has been reloaded
SWITCH_EVENT_NOTIFY - Notification
SWITCH_EVENT_PHONE_FEATURE - Notification (DND/CFWD/etc)
SWITCH_EVENT_PHONE_FEATURE_SUBSCRIBE - Phone feature subscription
SWITCH_EVENT_SEND_MESSAGE - Message
SWITCH_EVENT_RECV_MESSAGE - Message
SWITCH_EVENT_REQUEST_PARAMS
SWITCH_EVENT_CHANNEL_DATA
SWITCH_EVENT_GENERAL
SWITCH_EVENT_COMMAND
SWITCH_EVENT_SESSION_HEARTBEAT
SWITCH_EVENT_CLIENT_DISCONNECTED
SWITCH_EVENT_SERVER_DISCONNECTED
SWITCH_EVENT_SEND_INFO
SWITCH_EVENT_RECV_INFO
SWITCH_EVENT_RECV_RTCP_MESSAGE
SWITCH_EVENT_CALL_SECURE
SWITCH_EVENT_NAT - NAT Management (new/del/status)
SWITCH_EVENT_RECORD_START
SWITCH_EVENT_RECORD_STOP
SWITCH_EVENT_PLAYBACK_START
SWITCH_EVENT_PLAYBACK_STOP
SWITCH_EVENT_CALL_UPDATE
SWITCH_EVENT_FAILURE - A failure occurred which might impact the normal functioning of the switch
SWITCH_EVENT_SOCKET_DATA
SWITCH_EVENT_MEDIA_BUG_START
SWITCH_EVENT_MEDIA_BUG_STOP
SWITCH_EVENT_CONFERENCE_DATA_QUERY
SWITCH_EVENT_CONFERENCE_DATA
SWITCH_EVENT_CALL_SETUP_REQ
SWITCH_EVENT_CALL_SETUP_RESULT
SWITCH_EVENT_CALL_DETAIL
SWITCH_EVENT_DEVICE_STATE
SWITCH_EVENT_ALL - All events at once
</pre>
+1 -1
View File
@@ -939,7 +939,7 @@ SWITCH_DECLARE(char *) switch_util_quote_shell_arg(const char *string);
SWITCH_DECLARE(char *) switch_util_quote_shell_arg_pool(const char *string, switch_memory_pool_t *pool);
#define SWITCH_READ_ACCEPTABLE(status) (status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK)
#define SWITCH_READ_ACCEPTABLE(status) (status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK || status == SWITCH_STATUS_INUSE)
SWITCH_DECLARE(char *) switch_url_encode(const char *url, char *buf, size_t len);
SWITCH_DECLARE(char *) switch_url_decode(char *s);
SWITCH_DECLARE(switch_bool_t) switch_simple_email(const char *to,
@@ -1459,6 +1459,7 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe
if (switch_channel_test_flag(channel, CF_VIDEO)) {
if (switch_test_flag(conference, CFLAG_VIDEO_BRIDGE)) {
switch_channel_set_flag(channel, CF_VIDEO_ECHO);
switch_channel_clear_flag(channel, CF_VIDEO_PASSIVE);
} else {
switch_channel_clear_flag(channel, CF_VIDEO_ECHO);
}
@@ -1618,7 +1619,7 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf
if (member) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "Adding video floor %s\n",
switch_channel_get_name(member->channel));
switch_channel_set_flag(member->channel, CF_VIDEO_PASSIVE);
//switch_channel_set_flag(member->channel, CF_VIDEO_PASSIVE);
switch_core_session_refresh_video(member->session);
conference->video_floor_holder = member;
} else {
@@ -1627,7 +1628,7 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf
if (old_member) {
old_id = old_member->id;
switch_channel_clear_flag(old_member->channel, CF_VIDEO_PASSIVE);
//switch_channel_clear_flag(old_member->channel, CF_VIDEO_PASSIVE);
}
switch_set_flag(conference, CFLAG_FLOOR_CHANGE);
@@ -7488,6 +7489,7 @@ SWITCH_STANDARD_APP(conference_function)
switch_core_session_video_reset(session);
switch_channel_set_flag(channel, CF_CONFERENCE);
switch_channel_set_flag(channel, CF_VIDEO_PASSIVE);
if (switch_channel_answer(channel) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Channel answer failed.\n");
@@ -8042,6 +8044,7 @@ SWITCH_STANDARD_APP(conference_function)
end:
switch_channel_clear_flag(channel, CF_CONFERENCE);
switch_channel_clear_flag(channel, CF_VIDEO_PASSIVE);
switch_core_session_video_reset(session);
}
+3
View File
@@ -1689,6 +1689,9 @@ static void *SWITCH_THREAD_FUNC o_thread_run(switch_thread_t *thread, void *obj)
switch_channel_set_state(channel, CS_EXECUTE);
switch_core_session_rwunlock(session);
sql = switch_mprintf("update fifo_outbound set ring_count=ring_count-1 where uuid='%q' and ring_count > 0", h->uuid);
fifo_execute_sql_queued(&sql, SWITCH_TRUE, SWITCH_TRUE);
end:
switch_event_destroy(&ovars);
@@ -12,15 +12,18 @@
<profiles>
<profile name="s3">
<!-- Credentials for AWS account. Reference by name when sending HTTP request -->
<!-- http_get {profile=s3}http://bucket.s3.amazonaws.com/object.wav -->
<!-- http_put {profile=s3}http://bucket.s3.amazonaws.com/object.wav /tmp/file.wav -->
<!-- Credentials for AWS account. -->
<aws-s3>
<!-- 20 character key identifier -->
<access-key-id><![CDATA[AKIAIOSFODNN7EXAMPLE]]></access-key-id>
<!-- 40 character secret -->
<secret-access-key><![CDATA[wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY]]></secret-access-key>
</aws-s3>
<!-- Domains that this profile applies to -->
<domains>
<domain name="bucket.s3.amazonaws.com"/>
<domain name="bucket2.s3.amazonaws.com"/>
</domains>
</profile>
</profiles>
@@ -36,6 +36,9 @@
#include <switch_curl.h>
#include "aws.h"
/* 253 max domain size + '/' + NUL byte */
#define DOMAIN_BUF_SIZE 255
/* Defines module interface to FreeSWITCH */
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_http_cache_shutdown);
SWITCH_MODULE_LOAD_FUNCTION(mod_http_cache_load);
@@ -151,6 +154,8 @@ struct url_cache {
char *location;
/** HTTP profiles */
switch_hash_t *profiles;
/** profiles mapped by FQDN */
switch_hash_t *fqdn_profiles;
/** Cache mapped by URL */
switch_hash_t *map;
/** Cached URLs queued for replacement */
@@ -195,10 +200,41 @@ static void url_cache_lock(url_cache_t *cache, switch_core_session_t *session);
static void url_cache_unlock(url_cache_t *cache, switch_core_session_t *session);
static void url_cache_clear(url_cache_t *cache, switch_core_session_t *session);
static http_profile_t *url_cache_http_profile_find(url_cache_t *cache, const char *name);
static void url_cache_http_profile_add(url_cache_t *cache, const char *name, const char *aws_s3_access_key_id, const char *aws_s3_secret_access_key);
static http_profile_t *url_cache_http_profile_find_by_fqdn(url_cache_t *cache, const char *url);
static http_profile_t *url_cache_http_profile_add(url_cache_t *cache, const char *name, const char *aws_s3_access_key_id, const char *aws_s3_secret_access_key);
static switch_curl_slist_t *append_aws_s3_headers(switch_curl_slist_t *headers, http_profile_t *profile, const char *verb, const char *content_type, const char *url);
/**
* Parse FQDN from URL
*/
static void parse_domain(const char *url, char *domain_buf, int domain_buf_len)
{
char *end;
char *start;
domain_buf[0] = '\0';
if (zstr(url)) {
return;
}
start = strstr(url, "://");
if (!start) {
return;
}
start += 3;
if (!*start) {
return;
}
strncpy(domain_buf, start, domain_buf_len);
end = strchr(domain_buf, '/');
if (end) {
*end = '\0';
} else {
/* bad URL */
domain_buf[0] = '\0';
}
}
/**
* Put a file to the URL
* @param cache the cache
@@ -233,6 +269,12 @@ static switch_status_t http_put(url_cache_t *cache, http_profile_t *profile, swi
}
buf = switch_mprintf("Content-Type: %s", mime_type);
/* find profile for domain */
if (!profile) {
profile = url_cache_http_profile_find_by_fqdn(cache, url);
}
headers = switch_curl_slist_append(headers, buf);
headers = append_aws_s3_headers(headers, profile, "PUT", mime_type, url);
@@ -732,10 +774,25 @@ static http_profile_t *url_cache_http_profile_find(url_cache_t *cache, const cha
return NULL;
}
/**
* Find a profile by domain name
*/
static http_profile_t *url_cache_http_profile_find_by_fqdn(url_cache_t *cache, const char *url)
{
if (cache && !zstr(url)) {
char fqdn[DOMAIN_BUF_SIZE];
parse_domain(url, fqdn, DOMAIN_BUF_SIZE);
if (!zstr_buf(fqdn)) {
return (http_profile_t *)switch_core_hash_find(cache->fqdn_profiles, fqdn);
}
}
return NULL;
}
/**
* Add a profile to the cache
*/
static void url_cache_http_profile_add(url_cache_t *cache, const char *name, const char *aws_s3_access_key_id, const char *aws_s3_secret_access_key)
static http_profile_t *url_cache_http_profile_add(url_cache_t *cache, const char *name, const char *aws_s3_access_key_id, const char *aws_s3_secret_access_key)
{
http_profile_t *profile = switch_core_alloc(cache->pool, sizeof(*profile));
profile->name = switch_core_strdup(cache->pool, name);
@@ -746,6 +803,7 @@ static void url_cache_http_profile_add(url_cache_t *cache, const char *name, con
profile->aws_s3_secret_access_key = switch_core_strdup(cache->pool, aws_s3_secret_access_key);
}
switch_core_hash_insert(cache->profiles, profile->name, profile);
return profile;
}
/**
@@ -901,6 +959,11 @@ static switch_status_t http_get(url_cache_t *cache, http_profile_t *profile, cac
get_data.fd = 0;
get_data.url = url;
/* find profile for domain */
if (!profile) {
profile = url_cache_http_profile_find_by_fqdn(cache, url->url);
}
/* add optional AWS S3 headers if necessary */
headers = append_aws_s3_headers(headers, profile, "GET", "", url->url);
@@ -1329,6 +1392,8 @@ static switch_status_t do_config(url_cache_t *cache)
for (profile = switch_xml_child(profiles, "profile"); profile; profile = profile->next) {
const char *name = switch_xml_attr_soft(profile, "name");
if (!zstr(name)) {
http_profile_t *profile_obj;
switch_xml_t domains;
switch_xml_t s3 = switch_xml_child(profile, "aws-s3");
const char *access_key_id = NULL;
const char *secret_access_key = NULL;
@@ -1348,7 +1413,21 @@ static switch_status_t do_config(url_cache_t *cache)
}
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Adding profile \"%s\" to cache\n", name);
url_cache_http_profile_add(cache, name, access_key_id, secret_access_key);
profile_obj = url_cache_http_profile_add(cache, name, access_key_id, secret_access_key);
domains = switch_xml_child(profile, "domains");
if (domains) {
switch_xml_t domain;
for (domain = switch_xml_child(domains, "domain"); domain; domain = domain->next) {
const char *fqdn = switch_xml_attr_soft(domain, "name");
if (!zstr(fqdn)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Adding profile \"%s\" domain \"%s\" to cache\n", name, fqdn);
switch_core_hash_insert(cache->fqdn_profiles, fqdn, profile_obj);
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "HTTP profile domain missing name!\n");
}
}
}
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "HTTP profile missing name\n");
}
@@ -1554,6 +1633,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_http_cache_load)
gcache.pool = pool;
switch_core_hash_init(&gcache.map, gcache.pool);
switch_core_hash_init(&gcache.profiles, gcache.pool);
switch_core_hash_init_nocase(&gcache.fqdn_profiles, gcache.pool);
switch_mutex_init(&gcache.mutex, SWITCH_MUTEX_UNNESTED, gcache.pool);
switch_thread_rwlock_create(&gcache.shutdown_lock, gcache.pool);
@@ -1626,6 +1706,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_http_cache_shutdown)
url_cache_clear(&gcache, NULL);
switch_core_hash_destroy(&gcache.map);
switch_core_hash_destroy(&gcache.profiles);
switch_core_hash_destroy(&gcache.fqdn_profiles);
switch_mutex_destroy(gcache.mutex);
return SWITCH_STATUS_SUCCESS;
}
@@ -1658,16 +1658,35 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
char content2[1000];
SMSMessageRef sms;
DEBUGA_GSMOPEN("about to decode\n", GSMOPEN_P_LOG);
try {
sms = SMSMessage::decode(tech_pvt->line_array.result[i]); // dataCodingScheme = 8 , text=ciao 123 belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大
}
catch(...) {
ERRORA("GsmException\n", GSMOPEN_P_LOG);
gsmopen_sleep(5000);
return -1;
}
DEBUGA_GSMOPEN("SMS=\n%s\n", GSMOPEN_P_LOG, sms->toString().c_str());
DEBUGA_GSMOPEN("after decode\n", GSMOPEN_P_LOG);
#if 0
char letsee[1024];
memset(letsee, '\0', sizeof(letsee));
DEBUGA_GSMOPEN("about to letsee\n", GSMOPEN_P_LOG);
try {
sprintf(letsee, "|%s|\n", sms->toString().c_str());
}
catch(...) {
ERRORA("GsmException\n", GSMOPEN_P_LOG);
sleep(5);
return -1;
}
DEBUGA_GSMOPEN("after letsee\n", GSMOPEN_P_LOG);
DEBUGA_GSMOPEN("SMS=\n%s\n", GSMOPEN_P_LOG, letsee);
#endif //0
memset(content2, '\0', sizeof(content2));
if (sms->dataCodingScheme().getAlphabet() == DCS_DEFAULT_ALPHABET) {
iso_8859_1_to_utf8(tech_pvt, (char *) sms->userData().c_str(), content2, sizeof(content2));
@@ -1701,6 +1720,7 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
}
catch(...) {
ERRORA("GsmException\n", GSMOPEN_P_LOG);
gsmopen_sleep(5000);
return -1;
}
+1 -5
View File
@@ -250,7 +250,6 @@ switch_status_t rtmp_on_hangup(switch_core_session_t *session)
rtmp_private_t *tech_pvt = NULL;
rtmp_session_t *rsession = NULL;
switch_core_session_write_lock(session);
channel = switch_core_session_get_channel(session);
assert(channel != NULL);
@@ -311,7 +310,6 @@ switch_status_t rtmp_on_hangup(switch_core_session_t *session)
switch_thread_rwlock_unlock(rsession->rwlock);
done:
switch_core_session_rwunlock(session);
return SWITCH_STATUS_SUCCESS;
}
@@ -851,15 +849,13 @@ switch_status_t rtmp_session_destroy(rtmp_session_t **rsession)
/* At this point we don't know if the session still exists, so request a fresh pointer to it from the core. */
if ( (session = switch_core_session_locate((char *)key)) != NULL ) {
switch_core_session_rwunlock(session);
/*
* This is here so that if the FS session still exists and has the FS session write(or read) lock, then we won't destroy the rsession
* until the FS session is finished with it. But if the rsession is able to get the FS session
* write lock, before the FS session is hungup, then once the FS session does get the write lock
* the rsession pointer will be null, and the FS session will never try and touch the already destroyed rsession.
*/
switch_core_session_write_lock(session);
channel = switch_core_session_get_channel(session);
tech_pvt = switch_core_session_get_private(session);
if ( tech_pvt && tech_pvt->rtmp_session ) {
+63
View File
@@ -757,10 +757,73 @@ switch_status_t channel_on_routing(switch_core_session_t *session)
return SWITCH_STATUS_SUCCESS;
}
struct channel_on_execute_helper {
private_t *tech_pvt;
listener_t *listener;
uint32_t line_instance;
};
int channel_on_execute_callback(void *pArg, int argc, char **argv, char **columnNames)
{
struct channel_on_routing_helper *helper = pArg;
listener_t *listener = NULL;
char *device_name = argv[0];
uint32_t device_instance = atoi(argv[1]);
/* uint32_t position = atoi(argv[2]); */
uint32_t line_instance = atoi(argv[3]);
/* char *label = argv[4]; */
/* char *value = argv[5]; */
/* char *caller_name = argv[6]; */
/* uint32_t ring_on_idle = atoi(argv[7]); */
/* uint32_t ring_on_active = atoi(argv[8]); */
/* uint32_t busy_trigger = atoi(argv[9]); */
/* char *forward_all = argv[10]; */
/* char *forward_busy = argv[11]; */
/* char *forward_noanswer = argv[12]; */
/* uint32_t noanswer_duration = atoi(argv[13]); */
/* char *channel_uuid = argv[14]; */
/* uint32_t call_id = atoi(argv[15]); */
/* uint32_t call_state = atoi(argv[16]); */
skinny_profile_find_listener_by_device_name_and_instance(helper->tech_pvt->profile, device_name, device_instance, &listener);
if(listener) {
if(!strcmp(device_name, helper->listener->device_name)
&& (device_instance == helper->listener->device_instance)
&& (line_instance == helper->line_instance)) {/* the calling line */
helper->tech_pvt->caller_profile->dialplan = switch_core_strdup(helper->tech_pvt->caller_profile->pool, listener->profile->dialplan);
helper->tech_pvt->caller_profile->context = switch_core_strdup(helper->tech_pvt->caller_profile->pool, listener->profile->context);
send_stop_tone(listener, line_instance, helper->tech_pvt->call_id);
} else {
}
}
return 0;
}
switch_status_t channel_on_execute(switch_core_session_t *session)
{
switch_channel_t *channel = switch_core_session_get_channel(session);
if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_INBOUND) {
private_t *tech_pvt = switch_core_session_get_private(session);
listener_t *listener = NULL;
struct channel_on_execute_helper helper = {0};
skinny_profile_find_listener_by_device_name_and_instance(tech_pvt->profile,
switch_channel_get_variable(channel, "skinny_device_name"),
atoi(switch_channel_get_variable(channel, "skinny_device_instance")), &listener);
if (listener) {
helper.tech_pvt = tech_pvt;
helper.listener = listener;
helper.line_instance = atoi(switch_channel_get_variable(channel, "skinny_line_instance"));
skinny_session_walk_lines(tech_pvt->profile, switch_core_session_get_uuid(session), channel_on_execute_callback, &helper);
} else {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Could not find listener %s:%s for Channel %s\n",
switch_channel_get_variable(channel, "skinny_device_name"), switch_channel_get_variable(channel, "skinny_device_instance"),
switch_channel_get_name(channel));
}
}
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s CHANNEL EXECUTE\n", switch_channel_get_name(channel));
return SWITCH_STATUS_SUCCESS;
+5 -1
View File
@@ -2716,8 +2716,12 @@ static void xml_gateway_status(sofia_gateway_t *gp, switch_stream_handle_t *stre
stream->write_function(stream, " <freq>%d</freq>\n", gp->freq);
stream->write_function(stream, " <ping>%d</ping>\n", gp->ping);
stream->write_function(stream, " <pingfreq>%d</pingfreq>\n", gp->ping_freq);
stream->write_function(stream, " <pingmin>%d</pingmin>\n", gp->ping_min);
stream->write_function(stream, " <pingcount>%d</pingcount>\n", gp->ping_count);
stream->write_function(stream, " <pingmax>%d</pingmax>\n", gp->ping_max);
stream->write_function(stream, " <pinging>%d</pinging>\n", gp->pinging);
stream->write_function(stream, " <state>%s</state>\n", sofia_state_names[gp->state]);
stream->write_function(stream, " <status>%s%s</status>\n", status_names[gp->status], gp->pinging ? " (ping)" : "");
stream->write_function(stream, " <status>%s</status>\n", status_names[gp->status]);
stream->write_function(stream, " <calls-in>%u</calls-in>\n", gp->ib_calls);
stream->write_function(stream, " <calls-out>%u</calls-out>\n", gp->ob_calls);
stream->write_function(stream, " <failed-calls-in>%u</failed-calls-in>\n", gp->ib_failed_calls);
+40 -12
View File
@@ -8525,6 +8525,7 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia
call_info = call_info->ci_next;
}
call_info = sip_call_info(sip);
} else if (sofia_test_pflag(profile, PFLAG_MANAGE_SHARED_APPEARANCE)) {
char buf[128] = "";
@@ -8694,6 +8695,8 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia
profile_dup_clean(dialplan, tech_pvt->caller_profile->dialplan, tech_pvt->caller_profile->pool);
profile_dup_clean(displayname, tech_pvt->caller_profile->caller_id_name, tech_pvt->caller_profile->pool);
profile_dup_clean(from_user, tech_pvt->caller_profile->caller_id_number, tech_pvt->caller_profile->pool);
profile_dup_clean(displayname, tech_pvt->caller_profile->orig_caller_id_name, tech_pvt->caller_profile->pool);
profile_dup_clean(from_user, tech_pvt->caller_profile->orig_caller_id_number, tech_pvt->caller_profile->pool);
profile_dup_clean(network_ip, tech_pvt->caller_profile->network_addr, tech_pvt->caller_profile->pool);
profile_dup_clean(from_user, tech_pvt->caller_profile->ani, tech_pvt->caller_profile->pool);
profile_dup_clean(aniii, tech_pvt->caller_profile->aniii, tech_pvt->caller_profile->pool);
@@ -8716,14 +8719,21 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia
if ((b_session = switch_core_session_locate(b_private->uuid))) {
switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
const char *bridge_uuid;
switch_caller_profile_t *orig_cp;
switch_caller_profile_t *orig_cp, *cp;
//const char *sent_name, *sent_number;
orig_cp = switch_channel_get_caller_profile(b_channel);
tech_pvt->caller_profile->callee_id_name = switch_core_strdup(tech_pvt->caller_profile->pool, orig_cp->callee_id_name);
tech_pvt->caller_profile->callee_id_number = switch_core_strdup(tech_pvt->caller_profile->pool, orig_cp->callee_id_number);
tech_pvt->caller_profile->caller_id_name = switch_core_strdup(tech_pvt->caller_profile->pool, orig_cp->caller_id_name);
tech_pvt->caller_profile->caller_id_number = switch_core_strdup(tech_pvt->caller_profile->pool, orig_cp->caller_id_number);
if (!call_info) {
tech_pvt->caller_profile->caller_id_name = switch_core_strdup(tech_pvt->caller_profile->pool, orig_cp->caller_id_name);
tech_pvt->caller_profile->caller_id_number = switch_core_strdup(tech_pvt->caller_profile->pool, orig_cp->caller_id_number);
}
if (orig_cp) {
cp = switch_caller_profile_dup(tech_pvt->caller_profile->pool, orig_cp);
switch_channel_set_originator_caller_profile(channel, cp);
}
#if 0
sent_name = switch_channel_get_variable(b_channel, "last_sent_callee_id_name");
@@ -8775,19 +8785,37 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia
tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool,
"%sanswer,intercept:%s", codec_str, bridge_uuid);
} else {
const char *name = NULL, *num = NULL;
switch_caller_profile_t *bcp = switch_channel_get_caller_profile(b_channel);
if (switch_channel_test_flag(b_channel, CF_BRIDGE_ORIGINATOR) || !switch_channel_test_flag(b_channel, CF_BRIDGED)) {
name = bcp->callee_id_name;
num = bcp->callee_id_number;
} else {
name = bcp->caller_id_name;
num = bcp->caller_id_number;
if (switch_channel_test_flag(b_channel, CF_BRIDGE_ORIGINATOR)) {
switch_channel_set_flag(tech_pvt->channel, CF_BRIDGE_ORIGINATOR);
}
tech_pvt->caller_profile->callee_id_name = switch_core_strdup(tech_pvt->caller_profile->pool, name);
tech_pvt->caller_profile->callee_id_number = switch_core_strdup(tech_pvt->caller_profile->pool, num);
if (!zstr(bcp->callee_id_name)) {
tech_pvt->caller_profile->callee_id_name = switch_core_strdup(tech_pvt->caller_profile->pool, bcp->callee_id_name);
}
if (!zstr(bcp->callee_id_number)) {
tech_pvt->caller_profile->callee_id_number = switch_core_strdup(tech_pvt->caller_profile->pool, bcp->callee_id_number);
}
if (!zstr(bcp->caller_id_name)) {
tech_pvt->caller_profile->caller_id_name = switch_core_strdup(tech_pvt->caller_profile->pool, bcp->caller_id_name);
}
if (!zstr(bcp->caller_id_number)) {
tech_pvt->caller_profile->caller_id_number = switch_core_strdup(tech_pvt->caller_profile->pool, bcp->caller_id_number);
}
if (bcp->originatee_caller_profile) {
switch_caller_profile_t *cp;
cp = switch_caller_profile_dup(tech_pvt->caller_profile->pool,
bcp->originatee_caller_profile);
switch_channel_set_originatee_caller_profile(tech_pvt->channel, cp);
}
tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool,
"%sanswer,sofia_sla:%s", codec_str, b_private->uuid);
+11 -10
View File
@@ -1346,18 +1346,18 @@ static switch_event_t *actual_sofia_presence_event_handler(switch_event_t *event
"((sip_from_user='%q' and sip_from_host='%q') or presence_id='%q@%q') order by rcd desc",
uuid, mod_sofia_globals.hostname, profile->name, euser, host, euser, host);
}
sofia_glue_execute_sql_callback(profile, profile->dbh_mutex, sql, sofia_presence_dialog_callback, &dh);
if (mod_sofia_globals.debug_presence > 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "CHECK SQL: %s@%s [%s]\nhits: %d\n", euser, host, sql, dh.hits);
}
sofia_glue_execute_sql_callback(profile, profile->dbh_mutex, sql, sofia_presence_dialog_callback, &dh);
switch_safe_free(sql);
#if 0
if (hup && dh.hits > 0) {
/* sigh, mangle this packet to simulate a call that is up instead of hungup */
hup = 0;
event->flags |= EF_UNIQ_HEADERS;
if (!strcasecmp(dh.state, "early")) {
@@ -1386,7 +1386,7 @@ static switch_event_t *actual_sofia_presence_event_handler(switch_event_t *event
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "answer-state", "confirmed");
}
}
#endif
if (zstr(call_id) && (dh.hits && presence_source && (!strcasecmp(presence_source, "register") || switch_stristr("register", status)))) {
@@ -2553,7 +2553,8 @@ static int sofia_presence_sub_callback(void *pArg, int argc, char **argv, char *
char *open_closed = NULL;
char *dialog_status = NULL;
char *dialog_rpid = NULL;
char *default_dialog = "partial";
//char *default_dialog = "partial";
char *default_dialog = "full";
const char *ct = "no/idea";
char *to = NULL;
@@ -2731,9 +2732,9 @@ static int sofia_presence_sub_callback(void *pArg, int argc, char **argv, char *
}
if (user_agent && switch_stristr("snom", user_agent) && uuid) {
default_dialog = "full" ;
}
//if (user_agent && switch_stristr("snom", user_agent) && uuid) {
// default_dialog = "full" ;
//}
if (call_state && !strcasecmp(call_state, "cs_hangup")) {
astate = "hangup";
@@ -1737,7 +1737,7 @@ SWITCH_STANDARD_API(erlang_cmd)
stream->write_function(stream, "directory\n");
} else if (ptr->section == SWITCH_XML_SECTION_DIALPLAN) {
stream->write_function(stream, "dialplan\n");
} else if (ptr->section == SWITCH_XML_SECTION_PHRASES) {
} else if (ptr->section == SWITCH_XML_SECTION_LANGUAGES) {
stream->write_function(stream, "phrases\n");
} else if (ptr->section == SWITCH_XML_SECTION_CHATPLAN) {
stream->write_function(stream, "chatplan\n");
+14 -6
View File
@@ -397,9 +397,10 @@ static int isdtmf(const char digit)
/**
* Construct an NLSML result for digit match
* @param digits the matching digits
* @param interpretation the optional digit interpretation
* @return the NLSML <result>
*/
iks *nlsml_create_dtmf_match(const char *digits)
iks *nlsml_create_dtmf_match(const char *digits, const char *interpretation)
{
iks *result = iks_new("result");
iks_insert_attrib(result, "xmlns", NLSML_NS);
@@ -410,10 +411,11 @@ iks *nlsml_create_dtmf_match(const char *digits)
int num_digits = strlen(digits);
switch_stream_handle_t stream = { 0 };
iks *interpretation = iks_insert(result, "interpretation");
iks *input = iks_insert(interpretation, "input");
iks_insert_attrib(input, "mode", "dtmf");
iks_insert_attrib(input, "confidence", "100");
iks *interpretation_node = iks_insert(result, "interpretation");
iks *input_node = iks_insert(interpretation_node, "input");
iks *instance_node = iks_insert(interpretation_node, "instance");
iks_insert_attrib(input_node, "mode", "dtmf");
iks_insert_attrib(input_node, "confidence", "100");
SWITCH_STANDARD_STREAM(stream);
for (i = 0; i < num_digits; i++) {
@@ -426,7 +428,13 @@ iks *nlsml_create_dtmf_match(const char *digits)
}
}
}
iks_insert_cdata(input, stream.data, strlen(stream.data));
iks_insert_cdata(input_node, stream.data, strlen(stream.data));
if (zstr(interpretation)) {
iks_insert_cdata(instance_node, stream.data, strlen(stream.data));
} else {
iks_insert_cdata(instance_node, interpretation, strlen(interpretation));
}
switch_safe_free(stream.data);
}
return result;
+1 -1
View File
@@ -42,7 +42,7 @@ enum nlsml_match_type {
extern int nlsml_init(void);
enum nlsml_match_type nlsml_parse(const char *result, const char *uuid);
iks *nlsml_normalize(const char *result);
extern iks *nlsml_create_dtmf_match(const char *digits);
extern iks *nlsml_create_dtmf_match(const char *digits, const char *interpretation);
#endif
@@ -157,6 +157,7 @@ static switch_status_t input_component_on_dtmf(switch_core_session_t *session, c
int is_term_digit = 0;
struct input_component *component;
enum srgs_match_type match;
const char *interpretation = NULL;
switch_mutex_lock(handler->mutex);
@@ -179,7 +180,7 @@ static switch_status_t input_component_on_dtmf(switch_core_session_t *session, c
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Collected term digit = \"%c\"\n", dtmf->digit);
}
match = srgs_grammar_match(component->grammar, component->digits);
match = srgs_grammar_match(component->grammar, component->digits, &interpretation);
/* adjust result if terminating digit was pressed */
if (is_term_digit) {
@@ -208,7 +209,7 @@ static switch_status_t input_component_on_dtmf(switch_core_session_t *session, c
break;
}
case SMT_MATCH_END: {
iks *result = nlsml_create_dtmf_match(component->digits);
iks *result = nlsml_create_dtmf_match(component->digits, interpretation);
/* notify of match and remove input component */
handler->dtmf_component = NULL;
switch_core_media_bug_remove(session, &handler->bug);
@@ -248,13 +249,14 @@ static switch_bool_t input_component_bug_callback(switch_media_bug_t *bug, void
int elapsed_ms = (switch_micro_time_now() - component->last_digit_time) / 1000;
if (component->num_digits && component->inter_digit_timeout > 0 && elapsed_ms > component->inter_digit_timeout) {
enum srgs_match_type match;
const char *interpretation = NULL;
handler->dtmf_component = NULL;
switch_core_media_bug_set_flag(bug, SMBF_PRUNE);
/* we got some input, check for match */
match = srgs_grammar_match(component->grammar, component->digits);
match = srgs_grammar_match(component->grammar, component->digits, &interpretation);
if (match == SMT_MATCH || match == SMT_MATCH_END) {
iks *result = nlsml_create_dtmf_match(component->digits);
iks *result = nlsml_create_dtmf_match(component->digits, interpretation);
/* notify of match */
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "MATCH = %s\n", component->digits);
send_match_event(RAYO_COMPONENT(component), result);
+63 -9
View File
@@ -33,6 +33,7 @@
#include "srgs.h"
#define MAX_RECURSION 100
#define MAX_TAGS 30
/** function to handle tag attributes */
typedef int (* tag_attribs_fn)(struct srgs_grammar *, char **);
@@ -111,6 +112,7 @@ struct item_value {
int repeat_min;
int repeat_max;
const char *weight;
int tag;
};
/**
@@ -161,6 +163,10 @@ struct srgs_grammar {
struct srgs_node *cur;
/** rule names mapped to node */
switch_hash_t *rules;
/** possible matching tags */
const char *tags[MAX_TAGS + 1];
/** number of tags */
int tag_count;
/** grammar encoding */
char *encoding;
/** grammar language */
@@ -708,6 +714,32 @@ static int tag_hook(void *user_data, char *name, char **atts, int type)
return result;
}
/**
* Process <tag> CDATA
* @param grammar the grammar
* @param data the CDATA
* @param len the CDATA length
* @return IKS_OK
*/
static int process_cdata_tag(struct srgs_grammar *grammar, char *data, size_t len)
{
struct srgs_node *item = grammar->cur->parent;
if (item && item->type == SNT_ITEM) {
if (grammar->tag_count < MAX_TAGS) {
/* grammar gets the tag name, item gets the unique tag number */
char *tag = switch_core_alloc(grammar->pool, sizeof(char) * (len + 1));
tag[len] = '\0';
strncpy(tag, data, len);
grammar->tags[++grammar->tag_count] = tag;
item->value.item.tag = grammar->tag_count;
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "too many <tag>s\n");
return IKS_BADXML;
}
}
return IKS_OK;
}
/**
* Process CDATA grammar tokens
* @param grammar the grammar
@@ -956,8 +988,12 @@ static int create_regexes(struct srgs_grammar *grammar, struct srgs_node *node,
case SNT_ITEM:
if (node->child) {
struct srgs_node *item = node->child;
if (node->value.item.repeat_min != 1 || node->value.item.repeat_max != 1) {
stream->write_function(stream, "%s", "(?:");
if (node->value.item.repeat_min != 1 || node->value.item.repeat_max != 1 || node->value.item.tag) {
if (node->value.item.tag) {
stream->write_function(stream, "(?P<%d>", node->value.item.tag);
} else {
stream->write_function(stream, "%s", "(?:");
}
}
for(; item; item = item->next) {
if (!create_regexes(grammar, item, stream)) {
@@ -980,6 +1016,8 @@ static int create_regexes(struct srgs_grammar *grammar, struct srgs_node *node,
} else {
stream->write_function(stream, "){%i}", node->value.item.repeat_min);
}
} else if (node->value.item.tag) {
stream->write_function(stream, "%s", ")");
}
}
break;
@@ -1171,7 +1209,7 @@ struct srgs_grammar *srgs_parse(struct srgs_parser *parser, const char *document
}
#define MAX_INPUT_SIZE 128
#define OVECTOR_SIZE 30
#define OVECTOR_SIZE MAX_TAGS
#define WORKSPACE_SIZE 1024
/**
@@ -1214,15 +1252,17 @@ static int is_match_end(pcre *compiled_regex, const char *input)
* Find a match
* @param grammar the grammar to match
* @param input the input to compare
* @param interpretation the (optional) interpretation of the input result
* @return the match result
*/
enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char *input)
enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char *input, const char **interpretation)
{
int result = 0;
int ovector[OVECTOR_SIZE];
int workspace[WORKSPACE_SIZE];
pcre *compiled_regex;
*interpretation = NULL;
if (zstr(input)) {
return SMT_NO_MATCH;
}
@@ -1234,12 +1274,26 @@ enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char
if (!(compiled_regex = get_compiled_regex(grammar))) {
return SMT_NO_MATCH;
}
result = pcre_dfa_exec(compiled_regex, NULL, input, strlen(input), 0, PCRE_PARTIAL,
ovector, sizeof(ovector) / sizeof(ovector[0]),
workspace, sizeof(workspace) / sizeof(workspace[0]));
result = pcre_exec(compiled_regex, NULL, input, strlen(input), 0, PCRE_PARTIAL,
ovector, OVECTOR_SIZE);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "match = %i\n", result);
if (result > 0) {
int i;
char buffer[MAX_INPUT_SIZE + 1];
buffer[MAX_INPUT_SIZE] = '\0';
/* find matching instance... */
for (i = 1; i <= grammar->tag_count; i++) {
char substring_name[16] = { 0 };
buffer[0] = '\0';
snprintf(substring_name, 16, "%d", i);
if (pcre_copy_named_substring(compiled_regex, input, ovector, result, substring_name, buffer, MAX_INPUT_SIZE) != PCRE_ERROR_NOSUBSTRING && !zstr_buf(buffer)) {
*interpretation = grammar->tags[i];
break;
}
}
if (is_match_end(compiled_regex, input)) {
return SMT_MATCH_END;
}
@@ -1562,7 +1616,7 @@ int srgs_init(void)
add_root_tag_def("grammar", process_grammar, process_cdata_bad, "meta,metadata,lexicon,tag,rule");
add_tag_def("ruleref", process_ruleref, process_cdata_bad, "");
add_tag_def("token", process_attribs_ignore, process_cdata_ignore, "");
add_tag_def("tag", process_attribs_ignore, process_cdata_ignore, "");
add_tag_def("tag", process_attribs_ignore, process_cdata_tag, "");
add_tag_def("one-of", process_attribs_ignore, process_cdata_tokens, "item");
add_tag_def("item", process_item, process_cdata_tokens, "token,ruleref,item,one-of,tag");
add_tag_def("rule", process_rule, process_cdata_tokens, "token,ruleref,item,one-of,tag,example");
+1 -1
View File
@@ -51,7 +51,7 @@ extern struct srgs_grammar *srgs_parse(struct srgs_parser *parser, const char *d
extern const char *srgs_grammar_to_regex(struct srgs_grammar *grammar);
extern const char *srgs_grammar_to_jsgf(struct srgs_grammar *grammar);
extern const char *srgs_grammar_to_jsgf_file(struct srgs_grammar *grammar, const char *basedir, const char *ext);
extern enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char *input);
extern enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char *input, const char **interpretation);
extern void srgs_parser_destroy(struct srgs_parser *parser);
#endif
@@ -245,14 +245,15 @@ static const char *nlsml_dtmf_result =
"<result xmlns='http://www.ietf.org/xml/ns/mrcpv2' "
"xmlns:xf='http://www.w3.org/2000/xforms'><interpretation>"
"<input mode='dtmf' confidence='100'>1 2 3 4</input>"
"<instance>1 2 3 4</instance>"
"</interpretation></result>";
/**
* Test parsing NLSML example results
* Test creating DTMF match result
*/
static void test_create_dtmf_match(void)
{
iks *result = nlsml_create_dtmf_match("1234");
iks *result = nlsml_create_dtmf_match("1234", NULL);
char *result_str;
ASSERT_NOT_NULL(result);
result_str = iks_string(NULL, result);
@@ -260,6 +261,26 @@ static void test_create_dtmf_match(void)
iks_free(result_str);
}
static const char *nlsml_dtmf_instance_result =
"<result xmlns='http://www.ietf.org/xml/ns/mrcpv2' "
"xmlns:xf='http://www.w3.org/2000/xforms'><interpretation>"
"<input mode='dtmf' confidence='100'>1</input>"
"<instance>foo</instance>"
"</interpretation></result>";
/**
* Test creating DTMF match result with instance interpretation
*/
static void test_create_dtmf_instance(void)
{
iks *result = nlsml_create_dtmf_match("1", "foo");
char *result_str;
ASSERT_NOT_NULL(result);
result_str = iks_string(NULL, result);
ASSERT_STRING_EQUALS(nlsml_dtmf_instance_result, result_str);
iks_free(result_str);
}
static const char *nlsml_good_normalized =
"<result x-model='http://theYesNoModel'"
" xmlns:xf='http://www.w3.org/2000/xforms'"
@@ -295,6 +316,7 @@ int main(int argc, char **argv)
nlsml_init();
TEST(test_parse_nlsml_examples);
TEST(test_create_dtmf_match);
TEST(test_create_dtmf_instance);
TEST(test_normalize);
return 0;
}
+270 -139
View File
@@ -5,6 +5,127 @@
#include "srgs.h"
static const char *adhearsion_menu_grammar =
"<grammar xmlns=\"http://www.w3.org/2001/06/grammar\" version=\"1.0\" xml:lang=\"en-US\" mode=\"dtmf\" root=\"options\" tag-format=\"semantics/1.0-literals\">"
" <rule id=\"options\" scope=\"public\">\n"
" <one-of>\n"
" <item><tag>0</tag>1</item>\n"
" <item><tag>1</tag>5</item>\n"
" <item><tag>2</tag>7</item>\n"
" <item><tag>3</tag>9</item>\n"
" </one-of>\n"
" </rule>\n"
"</grammar>\n";
/**
* Test matching against adhearsion menu grammar
*/
static void test_match_adhearsion_menu_grammar(void)
{
struct srgs_parser *parser;
struct srgs_grammar *grammar;
const char *interpretation;
parser = srgs_parser_new("1234");
ASSERT_NOT_NULL((grammar = srgs_parse(parser, adhearsion_menu_grammar)));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1", &interpretation));
ASSERT_STRING_EQUALS("0", interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "2", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "3", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5", &interpretation));
ASSERT_STRING_EQUALS("1", interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "6", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "7", &interpretation));
ASSERT_STRING_EQUALS("2", interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "8", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9", &interpretation));
ASSERT_STRING_EQUALS("3", interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "*", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
ASSERT_NULL(interpretation);
srgs_parser_destroy(parser);
}
static const char *duplicate_tag_grammar =
"<grammar xmlns=\"http://www.w3.org/2001/06/grammar\" version=\"1.0\" xml:lang=\"en-US\" mode=\"dtmf\" root=\"options\" tag-format=\"semantics/1.0-literals\">"
" <rule id=\"options\" scope=\"public\">\n"
" <one-of>\n"
" <item><tag>2</tag>1</item>\n"
" <item><tag>2</tag>5</item>\n"
" <item><tag>4</tag>7</item>\n"
" <item><tag>4</tag>9</item>\n"
" </one-of>\n"
" </rule>\n"
"</grammar>\n";
/**
* Test matching with duplicate tags
*/
static void test_match_duplicate_tag_grammar(void)
{
struct srgs_parser *parser;
struct srgs_grammar *grammar;
const char *interpretation;
parser = srgs_parser_new("1234");
ASSERT_NOT_NULL((grammar = srgs_parse(parser, duplicate_tag_grammar)));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1", &interpretation));
ASSERT_STRING_EQUALS("2", interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "2", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "3", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5", &interpretation));
ASSERT_STRING_EQUALS("2", interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "6", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "7", &interpretation));
ASSERT_STRING_EQUALS("4", interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "8", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9", &interpretation));
ASSERT_STRING_EQUALS("4", interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "*", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
ASSERT_NULL(interpretation);
srgs_parser_destroy(parser);
}
static const char *adhearsion_ask_grammar =
"<grammar xmlns=\"http://www.w3.org/2001/06/grammar\" version=\"1.0\" xml:lang=\"en-US\" mode=\"dtmf\" root=\"inputdigits\">"
" <rule id=\"inputdigits\" scope=\"public\">\n"
@@ -32,26 +153,28 @@ static void test_match_adhearsion_ask_grammar(void)
{
struct srgs_parser *parser;
struct srgs_grammar *grammar;
const char *interpretation;
parser = srgs_parser_new("1234");
ASSERT_NOT_NULL((grammar = srgs_parse(parser, adhearsion_ask_grammar)));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "0"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "2"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "3"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "4"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "6"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "7"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "8"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "*"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "0", &interpretation));
ASSERT_NULL(interpretation);
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "2", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "3", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "4", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "6", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "7", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "8", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "*", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
srgs_parser_destroy(parser);
}
@@ -84,26 +207,27 @@ static void test_match_multi_digit_grammar(void)
{
struct srgs_parser *parser;
struct srgs_grammar *grammar;
const char *interpretation;
parser = srgs_parser_new("1234");
ASSERT_NOT_NULL((grammar = srgs_parse(parser, multi_digit_grammar)));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "27"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "223"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "27", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "223", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
srgs_parser_destroy(parser);
}
@@ -137,26 +261,27 @@ static void test_match_multi_rule_grammar(void)
{
struct srgs_parser *parser;
struct srgs_grammar *grammar;
const char *interpretation;
parser = srgs_parser_new("1234");
ASSERT_NOT_NULL((grammar = srgs_parse(parser, multi_rule_grammar)));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "27"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "223"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "27", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "223", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
srgs_parser_destroy(parser);
}
@@ -200,28 +325,29 @@ static void test_match_rayo_example_grammar(void)
{
struct srgs_parser *parser;
struct srgs_grammar *grammar;
const char *interpretation;
parser = srgs_parser_new("1234");
ASSERT_NOT_NULL((grammar = srgs_parse(parser, rayo_example_grammar)));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "4"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "*9"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "2321#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "27"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "223"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "4", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "*9", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "2321#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "27", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "223", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
srgs_parser_destroy(parser);
}
@@ -566,6 +692,7 @@ static void test_repeat_item_grammar(void)
{
struct srgs_parser *parser;
struct srgs_grammar *grammar;
const char *interpretation;
parser = srgs_parser_new("1234");
ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad));
@@ -575,74 +702,74 @@ static void test_repeat_item_grammar(void)
ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad5));
ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad6));
ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_grammar)));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115", &interpretation));
ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_range_grammar)));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567", &interpretation));
ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_optional_grammar)));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1234#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1234"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "111156#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "111156"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, ""));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1234#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1234", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "111156#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "111156", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_plus_grammar)));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111157#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111157"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, ""));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111157#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111157", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_star_grammar)));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111157#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111157"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#"));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, ""));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#"));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111157#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111157", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#", &interpretation));
ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
srgs_parser_destroy(parser);
}
@@ -678,12 +805,13 @@ static void test_repeat_item_range_ambiguous_grammar(void)
{
struct srgs_parser *parser;
struct srgs_grammar *grammar;
const char *interpretation;
parser = srgs_parser_new("1234");
ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_range_ambiguous_grammar)));
ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "1"));
ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "12"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "123"));
ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "1", &interpretation));
ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "12", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "123", &interpretation));
}
static const char *repeat_item_range_optional_pound_grammar =
@@ -722,14 +850,15 @@ static void test_repeat_item_range_optional_pound_grammar(void)
{
struct srgs_parser *parser;
struct srgs_grammar *grammar;
const char *interpretation;
parser = srgs_parser_new("1234");
ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_range_optional_pound_grammar)));
ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "1"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#"));
ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "12"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "12#"));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "123"));
ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "1", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation));
ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "12", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "12#", &interpretation));
ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "123", &interpretation));
}
/*
@@ -955,6 +1084,8 @@ int main(int argc, char **argv)
TEST_INIT
srgs_init();
TEST(test_parse_grammar);
TEST(test_match_adhearsion_menu_grammar);
TEST(test_match_duplicate_tag_grammar);
TEST(test_match_adhearsion_ask_grammar);
TEST(test_match_multi_digit_grammar);
TEST(test_match_multi_rule_grammar);
+1 -1
View File
@@ -481,7 +481,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load)
/* parse the config */
if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Open of %s failed\n", cf);
return SWITCH_STATUS_TERM;
return SWITCH_STATUS_FALSE;
}
if ((settings = switch_xml_child(cfg, "settings"))) {
+2
View File
@@ -141,6 +141,8 @@ SWITCH_DECLARE(switch_caller_profile_t *) switch_caller_profile_dup(switch_memor
if (tocopy->times) {
profile->old_times = (switch_channel_timetable_t *) switch_core_alloc(profile->pool, sizeof(switch_channel_timetable_t));
*profile->old_times = *tocopy->times;
} else {
tocopy->times = (switch_channel_timetable_t *) switch_core_alloc(tocopy->pool, sizeof(*tocopy->times));
}
if (tocopy->soft) {
+10 -1
View File
@@ -1963,9 +1963,18 @@ static void switch_load_core_config(const char *file)
switch_core_min_idle_cpu(atof(val));
} else if (!strcasecmp(var, "tipping-point") && !zstr(val)) {
runtime.tipping_point = atoi(val);
} else if (!strcasecmp(var, "events-use-dispatch") && !zstr(val)) {
runtime.events_use_dispatch = 1;
} else if (!strcasecmp(var, "initial-event-threads") && !zstr(val)) {
int tmp = atoi(val);
int tmp;
if (!runtime.events_use_dispatch) {
runtime.events_use_dispatch = 1;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING,
"Implicitly setting events-use-dispatch based on usage of this initial-event-threads parameter.\n");
}
tmp = atoi(val);
if (tmp > runtime.cpu_count / 2) {
tmp = runtime.cpu_count / 2;
+12
View File
@@ -79,6 +79,12 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_video_frame(switch_core
}
}
if (status == SWITCH_STATUS_INUSE) {
*frame = &runtime.dummy_cng_frame;
switch_yield(20000);
return SWITCH_STATUS_SUCCESS;
}
if (status != SWITCH_STATUS_SUCCESS) {
goto done;
}
@@ -229,6 +235,12 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
}
}
if (status == SWITCH_STATUS_INUSE) {
*frame = &runtime.dummy_cng_frame;
switch_yield(20000);
return SWITCH_STATUS_SUCCESS;
}
if (!SWITCH_READ_ACCEPTABLE(status) || !session->read_codec || !switch_core_codec_ready(session->read_codec)) {
*frame = NULL;
return SWITCH_STATUS_FALSE;
+3 -7
View File
@@ -1231,14 +1231,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_read_frame(switch_core_session
if (switch_mutex_trylock(engine->read_mutex) != SWITCH_STATUS_SUCCESS) {
/* return CNG, another thread is already reading */
*frame = &engine->read_frame;
switch_set_flag((*frame), SFF_CNG);
(*frame)->datalen = engine->read_impl.encoded_bytes_per_packet;
memset((*frame)->data, 0, (*frame)->datalen);
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG1, "%s is already being read for %s\n",
switch_channel_get_name(session->channel), type2str(type));
switch_yield(10000);
return SWITCH_STATUS_SUCCESS;
return SWITCH_STATUS_INUSE;
}
@@ -3890,7 +3885,8 @@ static void *SWITCH_THREAD_FUNC video_helper_thread(switch_thread_t *thread, voi
mh->up = 1;
switch_mutex_lock(mh->cond_mutex);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Video thread started\n", switch_channel_get_name(session->channel));
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Video thread started. Echo is %s\n",
switch_channel_get_name(session->channel), switch_channel_test_flag(channel, CF_VIDEO_ECHO) ? "on" : "off");
switch_core_session_refresh_video(session);
while (switch_channel_up_nosig(channel)) {
+18 -15
View File
@@ -1586,9 +1586,9 @@ static void *SWITCH_THREAD_FUNC switch_core_session_thread_pool_worker(switch_th
switch_mutex_lock(session_manager.mutex);
session_manager.running++;
switch_mutex_unlock(session_manager.mutex);
#ifdef DEBUG_THREAD_POOL
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Worker Thread %ld Started\n", (long) thread);
#endif
while(session_manager.ready) {
switch_status_t check_status;
@@ -1616,18 +1616,22 @@ static void *SWITCH_THREAD_FUNC switch_core_session_thread_pool_worker(switch_th
switch_mutex_lock(session_manager.mutex);
session_manager.busy++;
switch_mutex_unlock(session_manager.mutex);
#ifdef DEBUG_THREAD_POOL
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Worker Thread %ld Processing\n", (long) thread);
#endif
td->func(thread, td->obj);
if (td->alloc) {
if (td->pool) {
switch_memory_pool_t *pool = td->pool;
td = NULL;
switch_core_destroy_memory_pool(&pool);
} else if (td->alloc) {
free(td);
}
#ifdef DEBUG_THREAD_POOL
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Worker Thread %ld Done Processing\n", (long) thread);
#endif
switch_mutex_lock(session_manager.mutex);
session_manager.busy--;
switch_mutex_unlock(session_manager.mutex);
@@ -1639,9 +1643,9 @@ static void *SWITCH_THREAD_FUNC switch_core_session_thread_pool_worker(switch_th
check++;
}
}
#ifdef DEBUG_THREAD_POOL
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Worker Thread %ld Ended\n", (long) thread);
#endif
switch_mutex_lock(session_manager.mutex);
session_manager.running--;
switch_mutex_unlock(session_manager.mutex);
@@ -1725,9 +1729,10 @@ static void *SWITCH_THREAD_FUNC switch_core_session_thread_pool_manager(switch_t
if (++x == 300) {
if (session_manager.popping) {
#ifdef DEBUG_THREAD_POOL
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10,
"Thread pool: running:%d busy:%d popping:%d\n", session_manager.running, session_manager.busy, session_manager.popping);
#endif
switch_queue_interrupt_all(session_manager.thread_queue);
x--;
@@ -2523,11 +2528,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_execute_application_async(sw
SWITCH_DECLARE(void) switch_core_session_video_reset(switch_core_session_t *session)
{
if (switch_channel_test_flag(session->channel, CF_VIDEO)) {
switch_channel_set_flag(session->channel, CF_VIDEO_ECHO);
switch_channel_clear_flag(session->channel, CF_VIDEO_PASSIVE);
switch_core_session_refresh_video(session);
}
switch_channel_set_flag(session->channel, CF_VIDEO_ECHO);
switch_channel_clear_flag(session->channel, CF_VIDEO_PASSIVE);
switch_core_session_refresh_video(session);
}
SWITCH_DECLARE(switch_status_t) switch_core_session_execute_application_get_flags(switch_core_session_t *session, const char *app,
+63 -23
View File
@@ -36,6 +36,7 @@
#include <switch.h>
#include <switch_event.h>
#include "tpl.h"
#include "private/switch_core_pvt.h"
//#define SWITCH_EVENT_RECYCLE
#define DISPATCH_QUEUE_LEN 10000
@@ -154,8 +155,6 @@ static char *EVENT_NAMES[] = {
"MESSAGE",
"PRESENCE_IN",
"NOTIFY_IN",
"PHONE_FEATURE",
"PHONE_FEATURE_SUBSCRIBE",
"PRESENCE_OUT",
"PRESENCE_PROBE",
"MESSAGE_WAITING",
@@ -174,6 +173,8 @@ static char *EVENT_NAMES[] = {
"RE_SCHEDULE",
"RELOADXML",
"NOTIFY",
"PHONE_FEATURE",
"PHONE_FEATURE_SUBSCRIBE",
"SEND_MESSAGE",
"RECV_MESSAGE",
"REQUEST_PARAMS",
@@ -244,6 +245,34 @@ static int switch_events_match(switch_event_t *event, switch_event_node_t *node)
return match;
}
static void *SWITCH_THREAD_FUNC switch_event_deliver_thread(switch_thread_t *thread, void *obj)
{
switch_event_t *event = (switch_event_t *) obj;
switch_event_deliver(&event);
return NULL;
}
static void switch_event_deliver_thread_pool(switch_event_t **event)
{
switch_thread_data_t *td;
td = malloc(sizeof(*td));
switch_assert(td);
td->alloc = 1;
td->func = switch_event_deliver_thread;
td->obj = *event;
td->pool = NULL;
*event = NULL;
switch_thread_pool_launch_thread(&td);
}
static void *SWITCH_THREAD_FUNC switch_event_dispatch_thread(switch_thread_t *thread, void *obj)
{
switch_queue_t *queue = (switch_queue_t *) obj;
@@ -489,19 +518,22 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void)
SYSTEM_RUNNING = 0;
switch_mutex_unlock(EVENT_QUEUE_MUTEX);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping dispatch queues\n");
if (runtime.events_use_dispatch) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping dispatch queues\n");
for(x = 0; x < (uint32_t)DISPATCH_THREAD_COUNT; x++) {
switch_queue_trypush(EVENT_DISPATCH_QUEUE, NULL);
}
for(x = 0; x < (uint32_t)DISPATCH_THREAD_COUNT; x++) {
switch_queue_trypush(EVENT_DISPATCH_QUEUE, NULL);
}
switch_queue_interrupt_all(EVENT_DISPATCH_QUEUE);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping dispatch threads\n");
for(x = 0; x < (uint32_t)DISPATCH_THREAD_COUNT; x++) {
switch_status_t st;
switch_thread_join(&st, EVENT_DISPATCH_QUEUE_THREADS[x]);
switch_queue_interrupt_all(EVENT_DISPATCH_QUEUE);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping dispatch threads\n");
for(x = 0; x < (uint32_t)DISPATCH_THREAD_COUNT; x++) {
switch_status_t st;
switch_thread_join(&st, EVENT_DISPATCH_QUEUE_THREADS[x]);
}
}
x = 0;
@@ -513,7 +545,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void)
last = THREAD_COUNT;
}
{
if (runtime.events_use_dispatch) {
void *pop = NULL;
switch_event_t *event = NULL;
@@ -622,19 +654,21 @@ SWITCH_DECLARE(switch_status_t) switch_event_init(switch_memory_pool_t *pool)
//switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
switch_queue_create(&EVENT_DISPATCH_QUEUE, DISPATCH_QUEUE_LEN * MAX_DISPATCH, pool);
switch_event_launch_dispatch_threads(1);
if (runtime.events_use_dispatch) {
switch_queue_create(&EVENT_DISPATCH_QUEUE, DISPATCH_QUEUE_LEN * MAX_DISPATCH, pool);
switch_event_launch_dispatch_threads(1);
}
//switch_thread_create(&EVENT_QUEUE_THREADS[0], thd_attr, switch_event_thread, EVENT_QUEUE[0], RUNTIME_POOL);
//switch_thread_create(&EVENT_QUEUE_THREADS[1], thd_attr, switch_event_thread, EVENT_QUEUE[1], RUNTIME_POOL);
//switch_thread_create(&EVENT_QUEUE_THREADS[2], thd_attr, switch_event_thread, EVENT_QUEUE[2], RUNTIME_POOL);
while (!THREAD_COUNT) {
switch_cond_next();
if (runtime.events_use_dispatch) {
while (!THREAD_COUNT) {
switch_cond_next();
}
}
switch_mutex_lock(EVENT_QUEUE_MUTEX);
SYSTEM_RUNNING = 1;
switch_mutex_unlock(EVENT_QUEUE_MUTEX);
@@ -1884,9 +1918,15 @@ SWITCH_DECLARE(switch_status_t) switch_event_fire_detailed(const char *file, con
(*event)->event_user_data = user_data;
}
if (switch_event_queue_dispatch_event(event) != SWITCH_STATUS_SUCCESS) {
switch_event_destroy(event);
return SWITCH_STATUS_FALSE;
if (runtime.events_use_dispatch) {
if (switch_event_queue_dispatch_event(event) != SWITCH_STATUS_SUCCESS) {
switch_event_destroy(event);
return SWITCH_STATUS_FALSE;
}
} else {
switch_event_deliver_thread_pool(event);
}
return SWITCH_STATUS_SUCCESS;
-3
View File
@@ -1711,9 +1711,6 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_session(switch_core_session
name = cp->caller_id_name;
num = cp->caller_id_number;
}
my_cp->callee_id_name = switch_core_strdup(my_cp->pool, name);
my_cp->callee_id_number = switch_core_strdup(my_cp->pool, num);
}
sanity = 300;
+1
View File
@@ -5920,6 +5920,7 @@ SWITCH_DECLARE(int) switch_rtp_write_frame(switch_rtp_t *rtp_session, switch_fra
}
send_msg->header.ssrc = htonl(rtp_session->ssrc);
send_msg->header.seq = htons(++rtp_session->seq);
}
if (switch_socket_sendto(rtp_session->sock_output, rtp_session->remote_addr, 0, frame->packet, &bytes) != SWITCH_STATUS_SUCCESS) {
+10 -6
View File
@@ -2244,6 +2244,7 @@ SWITCH_DECLARE(switch_status_t) switch_xml_set_open_root_function(switch_xml_ope
SWITCH_DECLARE(switch_xml_t) switch_xml_open_root(uint8_t reload, const char **err)
{
switch_xml_t root = NULL;
switch_event_t *event;
switch_mutex_lock(XML_LOCK);
@@ -2252,6 +2253,15 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_open_root(uint8_t reload, const char **e
}
switch_mutex_unlock(XML_LOCK);
if (root) {
if (switch_event_create(&event, SWITCH_EVENT_RELOADXML) == SWITCH_STATUS_SUCCESS) {
if (switch_event_fire(&event) != SWITCH_STATUS_SUCCESS) {
switch_event_destroy(&event);
}
}
}
return root;
}
@@ -2288,12 +2298,6 @@ SWITCH_DECLARE_NONSTD(switch_xml_t) __switch_xml_open_root(uint8_t reload, const
}
if (errcnt == 0) {
switch_event_t *event;
if (switch_event_create(&event, SWITCH_EVENT_RELOADXML) == SWITCH_STATUS_SUCCESS) {
if (switch_event_fire(&event) != SWITCH_STATUS_SUCCESS) {
switch_event_destroy(&event);
}
}
r = switch_xml_root();
}