From 651e0884b7d9fdf64d5310c4e317d757d2357259 Mon Sep 17 00:00:00 2001 From: Pascal Quantin Date: Thu, 3 Dec 2015 21:32:25 +0100 Subject: Change codecs from static to dynamic library This allows to properly register codecs plugins. See https://www.wireshark.org/lists/wireshark-dev/201511/msg00202.html for details. Change-Id: Ibc13a19936abb7a2e81b86582a75fa424351565b Reviewed-on: https://code.wireshark.org/review/12385 Petri-Dish: Pascal Quantin Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris --- codecs/CMakeLists.txt | 35 ++++++++++- codecs/Makefile.am | 22 ++++--- codecs/Makefile.common | 2 +- codecs/Makefile.nmake | 39 ++++++++---- codecs/codecs.h | 18 +++--- codecs/speex/speex_resampler.h | 132 ++++++++++++++++++++--------------------- 6 files changed, 151 insertions(+), 97 deletions(-) (limited to 'codecs') diff --git a/codecs/CMakeLists.txt b/codecs/CMakeLists.txt index 63ac64d08d..9f4d64a1b2 100644 --- a/codecs/CMakeLists.txt +++ b/codecs/CMakeLists.txt @@ -44,9 +44,38 @@ if(SBC_FOUND) set(CODECS_FILES ${CODECS_FILES} sbc/sbc.c) endif() -add_library(codecs STATIC +set(codecs_LIBS + ${GMODULE2_LIBRARIES} + wsutil +) + +add_library(codecs ${LINK_MODE_LIB} ${CODECS_FILES} + ${CMAKE_BINARY_DIR}/image/libwscodecs.rc ) + +set(FULL_SO_VERSION "0.0.0") + set_target_properties(codecs PROPERTIES - LINK_FLAGS "${WS_LINK_FLAGS}" - FOLDER "Libs") + PREFIX "libws" + COMPILE_DEFINITIONS "WS_BUILD_DLL" + LINK_FLAGS "${WS_LINK_FLAGS}" + VERSION ${FULL_SO_VERSION} SOVERSION 0 + FOLDER "Libs" +) + +if(ENABLE_APPLICATION_BUNDLE) + set_target_properties(codecs PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/Frameworks + ) +endif() + +target_link_libraries(codecs ${codecs_LIBS}) + +if(NOT ${ENABLE_STATIC}) + install(TARGETS codecs + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) +endif() diff --git a/codecs/Makefile.am b/codecs/Makefile.am index 2d9698ed86..6d67087682 100644 --- a/codecs/Makefile.am +++ b/codecs/Makefile.am @@ -22,25 +22,31 @@ include Makefile.common include ../Makefile.am.inc +AM_CFLAGS =-DWS_BUILD_DLL + if HAVE_WARNINGS_AS_ERRORS -AM_CFLAGS = -Werror +AM_CFLAGS += -Werror endif -noinst_LIBRARIES = libcodec.a - CLEANFILES = \ - libcodec.a \ + libwscodec.la \ *~ MAINTAINERCLEANFILES = \ Makefile.in +lib_LTLIBRARIES = libwscodecs.la +# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html +libwscodecs_la_LDFLAGS = -version-info 0:0:0 @LDFLAGS_SHAREDLIB@ + # All sources that should be put in the source distribution tarball -libcodec_a_SOURCES = \ - $(LIBCODEC_SRC) \ +libwscodecs_la_SOURCES = \ + $(LIBCODECS_SRC) \ $(noinst_HEADERS) -libcodec_a_DEPENDENCIES = +libwscodecs_la_DEPENDENCIES = ${top_builddir}/wsutil/libwsutil.la + +libwscodecs_la_LIBADD = ${top_builddir}/wsutil/libwsutil.la # Common headers AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/wiretap @@ -48,7 +54,7 @@ AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/wiretap checkapi: $(PERL) $(top_srcdir)/tools/checkAPIs.pl -g abort -g termoutput -build \ -sourcedir=$(srcdir) \ - $(LIBCODEC_SRC) + $(LIBCODECS_SRC) EXTRA_DIST = \ CMakeLists.txt \ diff --git a/codecs/Makefile.common b/codecs/Makefile.common index e2510ba96d..f1af69f663 100644 --- a/codecs/Makefile.common +++ b/codecs/Makefile.common @@ -21,7 +21,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA -LIBCODEC_SRC = \ +LIBCODECS_SRC = \ codecs.c \ G711a/G711adecode.c \ G711u/G711udecode.c \ diff --git a/codecs/Makefile.nmake b/codecs/Makefile.nmake index 53aa69bda3..1cc2be66ba 100644 --- a/codecs/Makefile.nmake +++ b/codecs/Makefile.nmake @@ -1,17 +1,18 @@ -## Makefile for building codecs.lib with Microsoft C and nmake +## Makefile for building libcodecs.dll with Microsoft C and nmake ## Use: $(MAKE) /$(MAKEFLAGS) -f makefile.nmake # include ..\config.nmake +include include ..\Makefile.nmake.inc ############### no need to modify below this line ######### CFLAGS=/I.. $(WARNINGS_ARE_ERRORS) $(STANDARD_CFLAGS) \ - $(GLIB_CFLAGS) + $(GLIB_CFLAGS) -DWS_BUILD_DLL DIRTY_CFLAGS=/I.. $(STANDARD_CFLAGS) \ - $(GLIB_CFLAGS) + $(GLIB_CFLAGS) -DWS_BUILD_DLL .c.obj:: $(CC) $(CFLAGS) -Fd.\ -c $< @@ -20,11 +21,11 @@ include Makefile.common # if you add files here, be sure to include them also in Makefile.am EXTRA_DIST # XXX - if the codec files weren't in subdirectories, we could just do -# LIBCODEC_OBJECTS = $(LIBCODEC_SRC:.c=.obj), and wouldn't need rules +# LIBCODECS_OBJECTS = $(LIBCODECS_SRC:.c=.obj), and wouldn't need rules # for each of the codecs below # -LIBCODEC_OBJECTS= \ - codecs.obj \ +LIBCODECS_OBJECTS= \ + codecs.obj \ G711udecode.obj \ G711adecode.obj \ G722decode.obj \ @@ -32,8 +33,21 @@ LIBCODEC_OBJECTS= \ resample.obj \ sbc.obj -codecs.lib : $(LIBCODEC_OBJECTS) - link /lib /out:codecs.lib $(LIBCODEC_OBJECTS) +libcodecs_LIBS = \ + $(GLIB_LIBS) \ + ..\wsutil\libwsutil.lib + +libwscodecs.lib: libwscodecs.dll +libwscodecs.exp: libwscodecs.dll + +libwscodecs.dll : $(LIBCODECS_OBJECTS) ..\image\libwscodecs.res + @echo Linking libwscodecs.dll + $(link) $(dlllflags) $(conlibsdll) \ + $(LOCAL_LDFLAGS) $(DLL_LDFLAGS) \ + /OUT:libwscodecs.dll \ + /IMPLIB:libwscodecs.lib \ + ..\image\libwscodecs.res \ + $(LIBCODECS_OBJECTS) $(libcodecs_LIBS) codecs.obj: codecs.c codecs.h $(CC) $(CFLAGS) -Fd.\ -c codecs.c /Fo%|fF.obj @@ -57,7 +71,12 @@ sbc.obj: sbc\sbc.c sbc\sbc_private.h $(CC) $(CFLAGS) -Fd.\ -c sbc\sbc.c /Fo%|fF.obj clean: - rm -f $(LIBCODEC_OBJECTS) codecs.lib *.nativecodeanalysis.xml *.pdb *.sbr + rm -f $(LIBCODECS_OBJECTS) \ + libwscodecs.lib \ + libwscodecs.exp \ + libwscodecs.dll \ + libwscodecs.dll.manifest \ + *.nativecodeanalysis.xml *.pdb *.sbr distclean: clean @@ -65,4 +84,4 @@ maintainer-clean: distclean checkapi: $(PERL) ../tools/checkAPIs.pl -g abort -g termoutput -build \ - $(LIBCODEC_SRC) + $(LIBCODECS_SRC) diff --git a/codecs/codecs.h b/codecs/codecs.h index 7ba918ac30..5fb90e644b 100644 --- a/codecs/codecs.h +++ b/codecs/codecs.h @@ -33,8 +33,8 @@ extern "C" { #endif /* __cplusplus */ #ifdef HAVE_PLUGINS -extern void codec_register_plugin_types(void); -extern void register_all_codecs(void); +WS_DLL_PUBLIC void codec_register_plugin_types(void); +WS_DLL_PUBLIC void register_all_codecs(void); #endif struct codec_handle; @@ -47,15 +47,15 @@ typedef unsigned (*codec_get_frequency_fn)(void *context); typedef size_t (*codec_decode_fn)(void *context, const void *input, size_t inputSizeBytes, void *output, size_t *outputSizeBytes); -extern gboolean register_codec(const char *name, codec_init_fn init_fn, +WS_DLL_PUBLIC gboolean register_codec(const char *name, codec_init_fn init_fn, codec_release_fn release_fn, codec_get_channels_fn channels_fn, codec_get_frequency_fn frequency_fn, codec_decode_fn decode_fn); -extern codec_handle_t find_codec(const char *name); -extern void *codec_init(codec_handle_t codec); -extern void codec_release(codec_handle_t codec, void *context); -extern unsigned codec_get_channels(codec_handle_t codec, void *context); -extern unsigned codec_get_frequency(codec_handle_t codec, void *context); -extern size_t codec_decode(codec_handle_t codec, void *context, const void *input, +WS_DLL_PUBLIC codec_handle_t find_codec(const char *name); +WS_DLL_PUBLIC void *codec_init(codec_handle_t codec); +WS_DLL_PUBLIC void codec_release(codec_handle_t codec, void *context); +WS_DLL_PUBLIC unsigned codec_get_channels(codec_handle_t codec, void *context); +WS_DLL_PUBLIC unsigned codec_get_frequency(codec_handle_t codec, void *context); +WS_DLL_PUBLIC size_t codec_decode(codec_handle_t codec, void *context, const void *input, size_t inputSizeBytes, void *output, size_t *outputSizeBytes); #ifdef __cplusplus diff --git a/codecs/speex/speex_resampler.h b/codecs/speex/speex_resampler.h index a71cd4fb68..59eb307f6e 100644 --- a/codecs/speex/speex_resampler.h +++ b/codecs/speex/speex_resampler.h @@ -124,11 +124,11 @@ typedef struct SpeexResamplerState_ SpeexResamplerState; * @return Newly created resampler state * @retval NULL Error: not enough memory */ -SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, - spx_uint32_t in_rate, - spx_uint32_t out_rate, - int quality, - int *err); +WS_DLL_PUBLIC SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, + spx_uint32_t in_rate, + spx_uint32_t out_rate, + int quality, + int *err); /** Create a new resampler with fractional input/output rates. The sampling * rate ratio is an arbitrary rational number with both the numerator and @@ -143,18 +143,18 @@ SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, * @return Newly created resampler state * @retval NULL Error: not enough memory */ -SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, - spx_uint32_t ratio_num, - spx_uint32_t ratio_den, - spx_uint32_t in_rate, - spx_uint32_t out_rate, - int quality, - int *err); +WS_DLL_PUBLIC SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, + spx_uint32_t ratio_num, + spx_uint32_t ratio_den, + spx_uint32_t in_rate, + spx_uint32_t out_rate, + int quality, + int *err); /** Destroy a resampler state. * @param st Resampler state */ -void speex_resampler_destroy(SpeexResamplerState *st); +WS_DLL_PUBLIC void speex_resampler_destroy(SpeexResamplerState *st); /** Resample a float array. The input and output buffers must *not* overlap. * @param st Resampler state @@ -166,12 +166,12 @@ void speex_resampler_destroy(SpeexResamplerState *st); * @param out Output buffer * @param out_len Size of the output buffer. Returns the number of samples written */ -int speex_resampler_process_float(SpeexResamplerState *st, - spx_uint32_t channel_index, - const float *in, - spx_uint32_t *in_len, - float *out, - spx_uint32_t *out_len); +WS_DLL_PUBLIC int speex_resampler_process_float(SpeexResamplerState *st, + spx_uint32_t channel_index, + const float *in, + spx_uint32_t *in_len, + float *out, + spx_uint32_t *out_len); /** Resample an int array. The input and output buffers must *not* overlap. * @param st Resampler state @@ -183,12 +183,12 @@ int speex_resampler_process_float(SpeexResamplerState *st, * @param out Output buffer * @param out_len Size of the output buffer. Returns the number of samples written */ -int speex_resampler_process_int(SpeexResamplerState *st, - spx_uint32_t channel_index, - const spx_int16_t *in, - spx_uint32_t *in_len, - spx_int16_t *out, - spx_uint32_t *out_len); +WS_DLL_PUBLIC int speex_resampler_process_int(SpeexResamplerState *st, + spx_uint32_t channel_index, + const spx_int16_t *in, + spx_uint32_t *in_len, + spx_int16_t *out, + spx_uint32_t *out_len); /** Resample an interleaved float array. The input and output buffers must *not* overlap. * @param st Resampler state @@ -199,11 +199,11 @@ int speex_resampler_process_int(SpeexResamplerState *st, * @param out_len Size of the output buffer. Returns the number of samples written. * This is all per-channel. */ -int speex_resampler_process_interleaved_float(SpeexResamplerState *st, - const float *in, - spx_uint32_t *in_len, - float *out, - spx_uint32_t *out_len); +WS_DLL_PUBLIC int speex_resampler_process_interleaved_float(SpeexResamplerState *st, + const float *in, + spx_uint32_t *in_len, + float *out, + spx_uint32_t *out_len); /** Resample an interleaved int array. The input and output buffers must *not* overlap. * @param st Resampler state @@ -214,29 +214,29 @@ int speex_resampler_process_interleaved_float(SpeexResamplerState *st, * @param out_len Size of the output buffer. Returns the number of samples written. * This is all per-channel. */ -int speex_resampler_process_interleaved_int(SpeexResamplerState *st, - const spx_int16_t *in, - spx_uint32_t *in_len, - spx_int16_t *out, - spx_uint32_t *out_len); +WS_DLL_PUBLIC int speex_resampler_process_interleaved_int(SpeexResamplerState *st, + const spx_int16_t *in, + spx_uint32_t *in_len, + spx_int16_t *out, + spx_uint32_t *out_len); /** Set (change) the input/output sampling rates (integer value). * @param st Resampler state * @param in_rate Input sampling rate (integer number of Hz). * @param out_rate Output sampling rate (integer number of Hz). */ -int speex_resampler_set_rate(SpeexResamplerState *st, - spx_uint32_t in_rate, - spx_uint32_t out_rate); +WS_DLL_PUBLIC int speex_resampler_set_rate(SpeexResamplerState *st, + spx_uint32_t in_rate, + spx_uint32_t out_rate); /** Get the current input/output sampling rates (integer value). * @param st Resampler state * @param in_rate Input sampling rate (integer number of Hz) copied. * @param out_rate Output sampling rate (integer number of Hz) copied. */ -void speex_resampler_get_rate(SpeexResamplerState *st, - spx_uint32_t *in_rate, - spx_uint32_t *out_rate); +WS_DLL_PUBLIC void speex_resampler_get_rate(SpeexResamplerState *st, + spx_uint32_t *in_rate, + spx_uint32_t *out_rate); /** Set (change) the input/output sampling rates and resampling ratio * (fractional values in Hz supported). @@ -246,11 +246,11 @@ void speex_resampler_get_rate(SpeexResamplerState *st, * @param in_rate Input sampling rate rounded to the nearest integer (in Hz). * @param out_rate Output sampling rate rounded to the nearest integer (in Hz). */ -int speex_resampler_set_rate_frac(SpeexResamplerState *st, - spx_uint32_t ratio_num, - spx_uint32_t ratio_den, - spx_uint32_t in_rate, - spx_uint32_t out_rate); +WS_DLL_PUBLIC int speex_resampler_set_rate_frac(SpeexResamplerState *st, + spx_uint32_t ratio_num, + spx_uint32_t ratio_den, + spx_uint32_t in_rate, + spx_uint32_t out_rate); /** Get the current resampling ratio. This will be reduced to the least * common denominator. @@ -258,63 +258,63 @@ int speex_resampler_set_rate_frac(SpeexResamplerState *st, * @param ratio_num Numerator of the sampling rate ratio copied * @param ratio_den Denominator of the sampling rate ratio copied */ -void speex_resampler_get_ratio(SpeexResamplerState *st, - spx_uint32_t *ratio_num, - spx_uint32_t *ratio_den); +WS_DLL_PUBLIC void speex_resampler_get_ratio(SpeexResamplerState *st, + spx_uint32_t *ratio_num, + spx_uint32_t *ratio_den); /** Set (change) the conversion quality. * @param st Resampler state * @param quality Resampling quality between 0 and 10, where 0 has poor * quality and 10 has very high quality. */ -int speex_resampler_set_quality(SpeexResamplerState *st, - int quality); +WS_DLL_PUBLIC int speex_resampler_set_quality(SpeexResamplerState *st, + int quality); /** Get the conversion quality. * @param st Resampler state * @param quality Resampling quality between 0 and 10, where 0 has poor * quality and 10 has very high quality. */ -void speex_resampler_get_quality(SpeexResamplerState *st, - int *quality); +WS_DLL_PUBLIC void speex_resampler_get_quality(SpeexResamplerState *st, + int *quality); /** Set (change) the input stride. * @param st Resampler state * @param stride Input stride */ -void speex_resampler_set_input_stride(SpeexResamplerState *st, - spx_uint32_t stride); +WS_DLL_PUBLIC void speex_resampler_set_input_stride(SpeexResamplerState *st, + spx_uint32_t stride); /** Get the input stride. * @param st Resampler state * @param stride Input stride copied */ -void speex_resampler_get_input_stride(SpeexResamplerState *st, - spx_uint32_t *stride); +WS_DLL_PUBLIC void speex_resampler_get_input_stride(SpeexResamplerState *st, + spx_uint32_t *stride); /** Set (change) the output stride. * @param st Resampler state * @param stride Output stride */ -void speex_resampler_set_output_stride(SpeexResamplerState *st, - spx_uint32_t stride); +WS_DLL_PUBLIC void speex_resampler_set_output_stride(SpeexResamplerState *st, + spx_uint32_t stride); /** Get the output stride. * @param st Resampler state copied * @param stride Output stride */ -void speex_resampler_get_output_stride(SpeexResamplerState *st, - spx_uint32_t *stride); +WS_DLL_PUBLIC void speex_resampler_get_output_stride(SpeexResamplerState *st, + spx_uint32_t *stride); /** Get the latency introduced by the resampler measured in input samples. * @param st Resampler state */ -int speex_resampler_get_input_latency(SpeexResamplerState *st); +WS_DLL_PUBLIC int speex_resampler_get_input_latency(SpeexResamplerState *st); /** Get the latency introduced by the resampler measured in output samples. * @param st Resampler state */ -int speex_resampler_get_output_latency(SpeexResamplerState *st); +WS_DLL_PUBLIC int speex_resampler_get_output_latency(SpeexResamplerState *st); /** Make sure that the first samples to go out of the resamplers don't have * leading zeros. This is only useful before starting to use a newly created @@ -324,18 +324,18 @@ int speex_resampler_get_output_latency(SpeexResamplerState *st); * is the same for the first frame). * @param st Resampler state */ -int speex_resampler_skip_zeros(SpeexResamplerState *st); +WS_DLL_PUBLIC int speex_resampler_skip_zeros(SpeexResamplerState *st); /** Reset a resampler so a new (unrelated) stream can be processed. * @param st Resampler state */ -int speex_resampler_reset_mem(SpeexResamplerState *st); +WS_DLL_PUBLIC int speex_resampler_reset_mem(SpeexResamplerState *st); /** Returns the English meaning for an error code * @param err Error code * @return English string */ -const char *speex_resampler_strerror(int err); +WS_DLL_PUBLIC const char *speex_resampler_strerror(int err); #ifdef __cplusplus } -- cgit v1.2.3