mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-01 09:21:03 +00:00
Rename files and types from speexresample to audioresample
Rename files and types from speexresample to audioresample to finish the move and to prevent any confusion.
This commit is contained in:
parent
e327bbcd7d
commit
5dfcb63252
73 changed files with 2774 additions and 6090 deletions
|
@ -305,7 +305,7 @@ AG_GST_CHECK_PLUGIN(audiotestsrc)
|
||||||
AG_GST_CHECK_PLUGIN(ffmpegcolorspace)
|
AG_GST_CHECK_PLUGIN(ffmpegcolorspace)
|
||||||
AG_GST_CHECK_PLUGIN(gdp)
|
AG_GST_CHECK_PLUGIN(gdp)
|
||||||
AG_GST_CHECK_PLUGIN(playback)
|
AG_GST_CHECK_PLUGIN(playback)
|
||||||
AG_GST_CHECK_PLUGIN(speexresample)
|
AG_GST_CHECK_PLUGIN(audioresample)
|
||||||
AG_GST_CHECK_PLUGIN(subparse)
|
AG_GST_CHECK_PLUGIN(subparse)
|
||||||
AG_GST_CHECK_PLUGIN(tcp)
|
AG_GST_CHECK_PLUGIN(tcp)
|
||||||
AG_GST_CHECK_PLUGIN(typefind)
|
AG_GST_CHECK_PLUGIN(typefind)
|
||||||
|
@ -690,7 +690,7 @@ gst/audiotestsrc/Makefile
|
||||||
gst/ffmpegcolorspace/Makefile
|
gst/ffmpegcolorspace/Makefile
|
||||||
gst/gdp/Makefile
|
gst/gdp/Makefile
|
||||||
gst/playback/Makefile
|
gst/playback/Makefile
|
||||||
gst/speexresample/Makefile
|
gst/audioresample/Makefile
|
||||||
gst/subparse/Makefile
|
gst/subparse/Makefile
|
||||||
gst/tcp/Makefile
|
gst/tcp/Makefile
|
||||||
gst/typefind/Makefile
|
gst/typefind/Makefile
|
||||||
|
|
|
@ -106,7 +106,7 @@ EXTRA_HFILES = \
|
||||||
$(top_srcdir)/gst/gdp/gstgdpdepay.h \
|
$(top_srcdir)/gst/gdp/gstgdpdepay.h \
|
||||||
$(top_srcdir)/gst/gdp/gstgdppay.h \
|
$(top_srcdir)/gst/gdp/gstgdppay.h \
|
||||||
$(top_srcdir)/gst/playback/gstplay-enum.h \
|
$(top_srcdir)/gst/playback/gstplay-enum.h \
|
||||||
$(top_srcdir)/gst/speexresample/gstspeexresample.h \
|
$(top_srcdir)/gst/audioresample/gstaudioresample.h \
|
||||||
$(top_srcdir)/gst/tcp/gstmultifdsink.h \
|
$(top_srcdir)/gst/tcp/gstmultifdsink.h \
|
||||||
$(top_srcdir)/gst/tcp/gsttcpclientsrc.h \
|
$(top_srcdir)/gst/tcp/gsttcpclientsrc.h \
|
||||||
$(top_srcdir)/gst/tcp/gsttcpclientsink.h \
|
$(top_srcdir)/gst/tcp/gsttcpclientsink.h \
|
||||||
|
|
|
@ -107,15 +107,15 @@ audio_convert_prepare_context
|
||||||
<SECTION>
|
<SECTION>
|
||||||
<FILE>element-audioresample</FILE>
|
<FILE>element-audioresample</FILE>
|
||||||
<TITLE>audioresample</TITLE>
|
<TITLE>audioresample</TITLE>
|
||||||
GstSpeexResample
|
GstAudioResample
|
||||||
<SUBSECTION Standard>
|
<SUBSECTION Standard>
|
||||||
GST_SPEEX_RESAMPLE
|
GST_AUDIO_RESAMPLE
|
||||||
GST_IS_SPEEX_RESAMPLE
|
GST_IS_AUDIO_RESAMPLE
|
||||||
GST_TYPE_SPEEX_RESAMPLE
|
GST_TYPE_AUDIO_RESAMPLE
|
||||||
gst_speex_resample_get_type
|
gst_audio_resample_get_type
|
||||||
GST_SPEEX_RESAMPLE_CLASS
|
GST_AUDIO_RESAMPLE_CLASS
|
||||||
GST_IS_SPEEX_RESAMPLE_CLASS
|
GST_IS_AUDIO_RESAMPLE_CLASS
|
||||||
GstSpeexResampleClass
|
GstAudioResampleClass
|
||||||
</SECTION>
|
</SECTION>
|
||||||
|
|
||||||
<SECTION>
|
<SECTION>
|
||||||
|
|
|
@ -641,7 +641,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstMultiFdSink::buffers-max</NAME>
|
<NAME>GstMultiFdSink::buffers-max</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Buffers max</NICK>
|
<NICK>Buffers max</NICK>
|
||||||
<BLURB>max number of buffers to queue for a client (-1 = no limit).</BLURB>
|
<BLURB>max number of buffers to queue for a client (-1 = no limit).</BLURB>
|
||||||
|
@ -661,7 +661,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstMultiFdSink::buffers-soft-max</NAME>
|
<NAME>GstMultiFdSink::buffers-soft-max</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Buffers soft max</NICK>
|
<NICK>Buffers soft max</NICK>
|
||||||
<BLURB>Recover client when going over this limit (-1 = no limit).</BLURB>
|
<BLURB>Recover client when going over this limit (-1 = no limit).</BLURB>
|
||||||
|
@ -751,7 +751,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstMultiFdSink::buffers-min</NAME>
|
<NAME>GstMultiFdSink::buffers-min</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Buffers min</NICK>
|
<NICK>Buffers min</NICK>
|
||||||
<BLURB>min number of buffers to queue (-1 = as few as possible).</BLURB>
|
<BLURB>min number of buffers to queue (-1 = as few as possible).</BLURB>
|
||||||
|
@ -781,7 +781,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstMultiFdSink::bytes-min</NAME>
|
<NAME>GstMultiFdSink::bytes-min</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Bytes min</NICK>
|
<NICK>Bytes min</NICK>
|
||||||
<BLURB>min number of bytes to queue (-1 = as little as possible).</BLURB>
|
<BLURB>min number of bytes to queue (-1 = as little as possible).</BLURB>
|
||||||
|
@ -791,7 +791,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstMultiFdSink::time-min</NAME>
|
<NAME>GstMultiFdSink::time-min</NAME>
|
||||||
<TYPE>gint64</TYPE>
|
<TYPE>gint64</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Time min</NICK>
|
<NICK>Time min</NICK>
|
||||||
<BLURB>min number of time to queue (-1 = as little as possible).</BLURB>
|
<BLURB>min number of time to queue (-1 = as little as possible).</BLURB>
|
||||||
|
@ -811,7 +811,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstMultiFdSink::units-max</NAME>
|
<NAME>GstMultiFdSink::units-max</NAME>
|
||||||
<TYPE>gint64</TYPE>
|
<TYPE>gint64</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Units max</NICK>
|
<NICK>Units max</NICK>
|
||||||
<BLURB>max number of units to queue (-1 = no limit).</BLURB>
|
<BLURB>max number of units to queue (-1 = no limit).</BLURB>
|
||||||
|
@ -821,7 +821,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstMultiFdSink::units-soft-max</NAME>
|
<NAME>GstMultiFdSink::units-soft-max</NAME>
|
||||||
<TYPE>gint64</TYPE>
|
<TYPE>gint64</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Units soft max</NICK>
|
<NICK>Units soft max</NICK>
|
||||||
<BLURB>Recover client when going over this limit (-1 = no limit).</BLURB>
|
<BLURB>Recover client when going over this limit (-1 = no limit).</BLURB>
|
||||||
|
@ -831,7 +831,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstMultiFdSink::qos-dscp</NAME>
|
<NAME>GstMultiFdSink::qos-dscp</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>[-1,63]</RANGE>
|
<RANGE>[G_MAXULONG,63]</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>QoS diff srv code point</NICK>
|
<NICK>QoS diff srv code point</NICK>
|
||||||
<BLURB>Quality of Service, differentiated services code point (-1 default).</BLURB>
|
<BLURB>Quality of Service, differentiated services code point (-1 default).</BLURB>
|
||||||
|
@ -981,7 +981,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstVorbisEnc::bitrate</NAME>
|
<NAME>GstVorbisEnc::bitrate</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>[-1,250001]</RANGE>
|
<RANGE>[G_MAXULONG,250001]</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Target Bitrate</NICK>
|
<NICK>Target Bitrate</NICK>
|
||||||
<BLURB>Attempt to encode at a bitrate averaging this (in bps). This uses the bitrate management engine, and is not recommended for most users. Quality is a better alternative. (-1 == disabled).</BLURB>
|
<BLURB>Attempt to encode at a bitrate averaging this (in bps). This uses the bitrate management engine, and is not recommended for most users. Quality is a better alternative. (-1 == disabled).</BLURB>
|
||||||
|
@ -1011,7 +1011,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstVorbisEnc::max-bitrate</NAME>
|
<NAME>GstVorbisEnc::max-bitrate</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>[-1,250001]</RANGE>
|
<RANGE>[G_MAXULONG,250001]</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Maximum Bitrate</NICK>
|
<NICK>Maximum Bitrate</NICK>
|
||||||
<BLURB>Specify a maximum bitrate (in bps). Useful for streaming applications. (-1 == disabled).</BLURB>
|
<BLURB>Specify a maximum bitrate (in bps). Useful for streaming applications. (-1 == disabled).</BLURB>
|
||||||
|
@ -1021,7 +1021,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstVorbisEnc::min-bitrate</NAME>
|
<NAME>GstVorbisEnc::min-bitrate</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>[-1,250001]</RANGE>
|
<RANGE>[G_MAXULONG,250001]</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Minimum Bitrate</NICK>
|
<NICK>Minimum Bitrate</NICK>
|
||||||
<BLURB>Specify a minimum bitrate (in bps). Useful for encoding for a fixed-size channel. (-1 == disabled).</BLURB>
|
<BLURB>Specify a minimum bitrate (in bps). Useful for encoding for a fixed-size channel. (-1 == disabled).</BLURB>
|
||||||
|
@ -1861,7 +1861,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstCdParanoiaSrc::read-speed</NAME>
|
<NAME>GstCdParanoiaSrc::read-speed</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Read speed</NICK>
|
<NICK>Read speed</NICK>
|
||||||
<BLURB>Read from device at specified speed.</BLURB>
|
<BLURB>Read from device at specified speed.</BLURB>
|
||||||
|
@ -1871,7 +1871,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstCdParanoiaSrc::search-overlap</NAME>
|
<NAME>GstCdParanoiaSrc::search-overlap</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>[-1,75]</RANGE>
|
<RANGE>[G_MAXULONG,75]</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Search overlap</NICK>
|
<NICK>Search overlap</NICK>
|
||||||
<BLURB>Force minimum overlap search during verification to n sectors.</BLURB>
|
<BLURB>Force minimum overlap search during verification to n sectors.</BLURB>
|
||||||
|
@ -2011,7 +2011,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstURIDecodeBin::buffer-duration</NAME>
|
<NAME>GstURIDecodeBin::buffer-duration</NAME>
|
||||||
<TYPE>gint64</TYPE>
|
<TYPE>gint64</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Buffer duration (ns)</NICK>
|
<NICK>Buffer duration (ns)</NICK>
|
||||||
<BLURB>Buffer duration when buffering network streams.</BLURB>
|
<BLURB>Buffer duration when buffering network streams.</BLURB>
|
||||||
|
@ -2021,7 +2021,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstURIDecodeBin::buffer-size</NAME>
|
<NAME>GstURIDecodeBin::buffer-size</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Buffer size (bytes)</NICK>
|
<NICK>Buffer size (bytes)</NICK>
|
||||||
<BLURB>Buffer size when buffering network streams.</BLURB>
|
<BLURB>Buffer size when buffering network streams.</BLURB>
|
||||||
|
@ -2181,7 +2181,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstPlayBin2::current-audio</NAME>
|
<NAME>GstPlayBin2::current-audio</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Current audio</NICK>
|
<NICK>Current audio</NICK>
|
||||||
<BLURB>Currently playing audio stream (-1 = auto).</BLURB>
|
<BLURB>Currently playing audio stream (-1 = auto).</BLURB>
|
||||||
|
@ -2191,7 +2191,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstPlayBin2::current-text</NAME>
|
<NAME>GstPlayBin2::current-text</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Current Text</NICK>
|
<NICK>Current Text</NICK>
|
||||||
<BLURB>Currently playing text stream (-1 = auto).</BLURB>
|
<BLURB>Currently playing text stream (-1 = auto).</BLURB>
|
||||||
|
@ -2201,7 +2201,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstPlayBin2::current-video</NAME>
|
<NAME>GstPlayBin2::current-video</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Current Video</NICK>
|
<NICK>Current Video</NICK>
|
||||||
<BLURB>Currently playing video stream (-1 = auto).</BLURB>
|
<BLURB>Currently playing video stream (-1 = auto).</BLURB>
|
||||||
|
@ -2361,7 +2361,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstPlayBin2::buffer-duration</NAME>
|
<NAME>GstPlayBin2::buffer-duration</NAME>
|
||||||
<TYPE>gint64</TYPE>
|
<TYPE>gint64</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Buffer duration (ns)</NICK>
|
<NICK>Buffer duration (ns)</NICK>
|
||||||
<BLURB>Buffer duration when buffering network streams.</BLURB>
|
<BLURB>Buffer duration when buffering network streams.</BLURB>
|
||||||
|
@ -2371,7 +2371,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstPlayBin2::buffer-size</NAME>
|
<NAME>GstPlayBin2::buffer-size</NAME>
|
||||||
<TYPE>gint</TYPE>
|
<TYPE>gint</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Buffer size (bytes)</NICK>
|
<NICK>Buffer size (bytes)</NICK>
|
||||||
<BLURB>Buffer size when buffering network streams.</BLURB>
|
<BLURB>Buffer size when buffering network streams.</BLURB>
|
||||||
|
@ -2711,7 +2711,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstAppSrc::max-latency</NAME>
|
<NAME>GstAppSrc::max-latency</NAME>
|
||||||
<TYPE>gint64</TYPE>
|
<TYPE>gint64</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Max Latency</NICK>
|
<NICK>Max Latency</NICK>
|
||||||
<BLURB>The maximum latency (-1 = unlimited).</BLURB>
|
<BLURB>The maximum latency (-1 = unlimited).</BLURB>
|
||||||
|
@ -2721,7 +2721,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstAppSrc::min-latency</NAME>
|
<NAME>GstAppSrc::min-latency</NAME>
|
||||||
<TYPE>gint64</TYPE>
|
<TYPE>gint64</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Min Latency</NICK>
|
<NICK>Min Latency</NICK>
|
||||||
<BLURB>The minimum latency (-1 = default).</BLURB>
|
<BLURB>The minimum latency (-1 = default).</BLURB>
|
||||||
|
@ -2731,7 +2731,7 @@
|
||||||
<ARG>
|
<ARG>
|
||||||
<NAME>GstAppSrc::size</NAME>
|
<NAME>GstAppSrc::size</NAME>
|
||||||
<TYPE>gint64</TYPE>
|
<TYPE>gint64</TYPE>
|
||||||
<RANGE>>= -1</RANGE>
|
<RANGE>>= G_MAXULONG</RANGE>
|
||||||
<FLAGS>rw</FLAGS>
|
<FLAGS>rw</FLAGS>
|
||||||
<NICK>Size</NICK>
|
<NICK>Size</NICK>
|
||||||
<BLURB>The size of the data stream in bytes (-1 if unknown).</BLURB>
|
<BLURB>The size of the data stream in bytes (-1 if unknown).</BLURB>
|
||||||
|
@ -2748,3 +2748,23 @@
|
||||||
<DEFAULT>Stream</DEFAULT>
|
<DEFAULT>Stream</DEFAULT>
|
||||||
</ARG>
|
</ARG>
|
||||||
|
|
||||||
|
<ARG>
|
||||||
|
<NAME>GstAudioResample::filter-length</NAME>
|
||||||
|
<TYPE>gint</TYPE>
|
||||||
|
<RANGE>>= 0</RANGE>
|
||||||
|
<FLAGS>rwx</FLAGS>
|
||||||
|
<NICK>Filter length</NICK>
|
||||||
|
<BLURB>DEPRECATED, DON'T USE THIS! Length of the resample filter.</BLURB>
|
||||||
|
<DEFAULT>64</DEFAULT>
|
||||||
|
</ARG>
|
||||||
|
|
||||||
|
<ARG>
|
||||||
|
<NAME>GstAudioResample::quality</NAME>
|
||||||
|
<TYPE>gint</TYPE>
|
||||||
|
<RANGE>[0,10]</RANGE>
|
||||||
|
<FLAGS>rwx</FLAGS>
|
||||||
|
<NICK>Quality</NICK>
|
||||||
|
<BLURB>Resample quality with 0 being the lowest and 10 being the best.</BLURB>
|
||||||
|
<DEFAULT>4</DEFAULT>
|
||||||
|
</ARG>
|
||||||
|
|
||||||
|
|
|
@ -12,28 +12,9 @@ GObject
|
||||||
GstPlayBaseBin
|
GstPlayBaseBin
|
||||||
GstPlayBin
|
GstPlayBin
|
||||||
GstPlayBin2
|
GstPlayBin2
|
||||||
|
GstDecodeBin
|
||||||
GstDecodeBin2
|
GstDecodeBin2
|
||||||
GstURIDecodeBin
|
GstURIDecodeBin
|
||||||
GstDecodeBin
|
|
||||||
GstBaseSrc
|
|
||||||
GstPushSrc
|
|
||||||
GstCddaBaseSrc
|
|
||||||
GstCdParanoiaSrc
|
|
||||||
GstBaseAudioSrc
|
|
||||||
GstAudioSrc
|
|
||||||
GstAlsaSrc
|
|
||||||
GstV4lElement
|
|
||||||
GstV4lSrc
|
|
||||||
GstTCPClientSrc
|
|
||||||
GstTCPServerSrc
|
|
||||||
GstVideoTestSrc
|
|
||||||
GstGnomeVFSSrc
|
|
||||||
GstAppSrc
|
|
||||||
GstAudioTestSrc
|
|
||||||
GstVorbisEnc
|
|
||||||
GstVorbisDec
|
|
||||||
GstVorbisParse
|
|
||||||
GstVorbisTag
|
|
||||||
GstOggDemux
|
GstOggDemux
|
||||||
GstOggMux
|
GstOggMux
|
||||||
GstOgmParse
|
GstOgmParse
|
||||||
|
@ -43,49 +24,74 @@ GObject
|
||||||
GstOggParse
|
GstOggParse
|
||||||
GstOggAviParse
|
GstOggAviParse
|
||||||
GstBaseSink
|
GstBaseSink
|
||||||
GstGnomeVFSSink
|
GstGioBaseSink
|
||||||
|
GstGioSink
|
||||||
|
GstGioStreamSink
|
||||||
GstBaseAudioSink
|
GstBaseAudioSink
|
||||||
GstAudioSink
|
GstAudioSink
|
||||||
GstAlsaSink
|
GstAlsaSink
|
||||||
|
GstGnomeVFSSink
|
||||||
GstVideoSink
|
GstVideoSink
|
||||||
GstXvImageSink
|
GstXvImageSink
|
||||||
GstXImageSink
|
GstXImageSink
|
||||||
|
GstAppSink
|
||||||
GstTCPClientSink
|
GstTCPClientSink
|
||||||
GstMultiFdSink
|
GstMultiFdSink
|
||||||
GstTCPServerSink
|
GstTCPServerSink
|
||||||
GstAppSink
|
GstBaseSrc
|
||||||
GstVisual
|
GstGioBaseSrc
|
||||||
GstVisualbumpscope
|
GstGioSrc
|
||||||
GstVisualcorona
|
GstGioStreamSrc
|
||||||
GstVisualinfinite
|
GstPushSrc
|
||||||
GstVisualjakdaw
|
GstBaseAudioSrc
|
||||||
GstVisualjess
|
GstAudioSrc
|
||||||
GstVisuallv_analyzer
|
GstAlsaSrc
|
||||||
GstVisuallv_scope
|
GstCddaBaseSrc
|
||||||
GstVisualoinksie
|
GstCdParanoiaSrc
|
||||||
GstTheoraDec
|
GstV4lElement
|
||||||
GstTheoraEnc
|
GstV4lSrc
|
||||||
GstTheoraParse
|
GstTCPClientSrc
|
||||||
|
GstTCPServerSrc
|
||||||
|
GstVideoTestSrc
|
||||||
|
GstGnomeVFSSrc
|
||||||
|
GstAudioTestSrc
|
||||||
|
GstAppSrc
|
||||||
|
GstVorbisEnc
|
||||||
|
GstVorbisDec
|
||||||
|
GstVorbisParse
|
||||||
|
GstVorbisTag
|
||||||
GstTextOverlay
|
GstTextOverlay
|
||||||
GstTimeOverlay
|
GstTimeOverlay
|
||||||
GstClockOverlay
|
GstClockOverlay
|
||||||
GstTextRender
|
GstTextRender
|
||||||
|
GstTheoraDec
|
||||||
|
GstTheoraEnc
|
||||||
|
GstTheoraParse
|
||||||
GstAlsaMixerElement
|
GstAlsaMixerElement
|
||||||
GstGDPDepay
|
GstVisual
|
||||||
GstGDPPay
|
GstVisualjess
|
||||||
GstBaseTransform
|
GstVisualbumpscope
|
||||||
GstFFMpegCsp
|
GstVisualcorona
|
||||||
GstVideoScale
|
GstVisualinfinite
|
||||||
GstAudioFilter
|
GstVisualjakdaw
|
||||||
GstVolume
|
GstVisuallv_analyzer
|
||||||
GstSpeexResample
|
GstVisuallv_scope
|
||||||
GstAudioConvert
|
GstVisualoinksie
|
||||||
GstSubParse
|
GstSubParse
|
||||||
GstSsaParse
|
GstSsaParse
|
||||||
|
GstAudioRate
|
||||||
|
GstBaseTransform
|
||||||
|
GstAudioConvert
|
||||||
|
GstFFMpegCsp
|
||||||
|
GstAudioFilter
|
||||||
|
GstVolume
|
||||||
|
GstAudioResample
|
||||||
|
GstVideoScale
|
||||||
GstAdder
|
GstAdder
|
||||||
|
GstGDPDepay
|
||||||
|
GstGDPPay
|
||||||
GstStreamSelector
|
GstStreamSelector
|
||||||
GstQueue2
|
GstQueue2
|
||||||
GstAudioRate
|
|
||||||
GstVideoRate
|
GstVideoRate
|
||||||
GstBus
|
GstBus
|
||||||
GstTask
|
GstTask
|
||||||
|
@ -96,26 +102,62 @@ GObject
|
||||||
GstRegistry
|
GstRegistry
|
||||||
GstRingBuffer
|
GstRingBuffer
|
||||||
GstSignalObject
|
GstSignalObject
|
||||||
GConfClient
|
GFileMonitor
|
||||||
|
GLocalDirectoryMonitor
|
||||||
|
GFamDirectoryMonitor
|
||||||
|
GInotifyDirectoryMonitor
|
||||||
|
GLocalFileMonitor
|
||||||
|
GFamFileMonitor
|
||||||
|
GInotifyFileMonitor
|
||||||
|
GVolumeMonitor
|
||||||
|
GNativeVolumeMonitor
|
||||||
|
GProxyVolumeMonitor
|
||||||
|
GProxyVolumeMonitorHal
|
||||||
|
GProxyVolumeMonitorGPhoto2
|
||||||
|
GUnixVolumeMonitor
|
||||||
|
GDaemonVolumeMonitor
|
||||||
|
GVfs
|
||||||
|
GDaemonVfs
|
||||||
|
GLocalVfs
|
||||||
|
GTypeModule
|
||||||
|
GIOModule
|
||||||
|
GVfsUriMapper
|
||||||
|
GVfsUriMapperSmb
|
||||||
|
GVfsUriMapperHttp
|
||||||
|
GAppLookupGConf
|
||||||
|
GProxyDrive
|
||||||
|
GProxyMount
|
||||||
|
GProxyVolume
|
||||||
|
GOutputStream
|
||||||
|
GInputStream
|
||||||
PangoFontMap
|
PangoFontMap
|
||||||
PangoFcFontMap
|
PangoFcFontMap
|
||||||
PangoFT2FontMap
|
PangoFT2FontMap
|
||||||
PangoContext
|
PangoContext
|
||||||
GstMixerTrack
|
LinkConnection
|
||||||
GstMixerOptions
|
GIOPConnection
|
||||||
|
LinkServer
|
||||||
|
GIOPServer
|
||||||
|
GConfClient
|
||||||
|
GstColorBalanceChannel
|
||||||
GstTunerNorm
|
GstTunerNorm
|
||||||
GstTunerChannel
|
GstTunerChannel
|
||||||
GstColorBalanceChannel
|
GstMixerTrack
|
||||||
GstStreamInfo
|
GstStreamInfo
|
||||||
GInterface
|
GInterface
|
||||||
GTypePlugin
|
GTypePlugin
|
||||||
GstChildProxy
|
GstChildProxy
|
||||||
GstURIHandler
|
GstURIHandler
|
||||||
|
GFile
|
||||||
|
GDesktopAppInfoLookup
|
||||||
|
GDrive
|
||||||
|
GMount
|
||||||
|
GVolume
|
||||||
GstTagSetter
|
GstTagSetter
|
||||||
GstImplementsInterface
|
GstImplementsInterface
|
||||||
GstMixer
|
GstMixer
|
||||||
GstPropertyProbe
|
GstPropertyProbe
|
||||||
GstTuner
|
GstNavigation
|
||||||
GstXOverlay
|
GstXOverlay
|
||||||
GstColorBalance
|
GstColorBalance
|
||||||
GstNavigation
|
GstTuner
|
||||||
|
|
|
@ -3,21 +3,29 @@ GstPipeline GstChildProxy
|
||||||
GstPlayBaseBin GstChildProxy
|
GstPlayBaseBin GstChildProxy
|
||||||
GstPlayBin GstChildProxy
|
GstPlayBin GstChildProxy
|
||||||
GstPlayBin2 GstChildProxy
|
GstPlayBin2 GstChildProxy
|
||||||
|
GstDecodeBin GstChildProxy
|
||||||
GstDecodeBin2 GstChildProxy
|
GstDecodeBin2 GstChildProxy
|
||||||
GstURIDecodeBin GstChildProxy
|
GstURIDecodeBin GstChildProxy
|
||||||
GstDecodeBin GstChildProxy
|
GstGioSink GstURIHandler
|
||||||
|
GstAlsaSink GstPropertyProbe
|
||||||
|
GstGnomeVFSSink GstURIHandler
|
||||||
|
GstXvImageSink GstImplementsInterface GstPropertyProbe GstNavigation GstXOverlay GstColorBalance
|
||||||
|
GstXImageSink GstImplementsInterface GstNavigation GstXOverlay
|
||||||
|
GstGioSrc GstURIHandler
|
||||||
|
GstAlsaSrc GstImplementsInterface GstMixer GstPropertyProbe
|
||||||
GstCddaBaseSrc GstURIHandler
|
GstCddaBaseSrc GstURIHandler
|
||||||
GstCdParanoiaSrc GstURIHandler
|
GstCdParanoiaSrc GstURIHandler
|
||||||
GstAlsaSrc GstImplementsInterface GstMixer GstPropertyProbe
|
GstV4lElement GstImplementsInterface GstPropertyProbe GstXOverlay GstColorBalance GstTuner
|
||||||
GstV4lElement GstImplementsInterface GstPropertyProbe GstTuner GstXOverlay GstColorBalance
|
GstV4lSrc GstImplementsInterface GstPropertyProbe GstXOverlay GstColorBalance GstTuner
|
||||||
GstV4lSrc GstImplementsInterface GstPropertyProbe GstTuner GstXOverlay GstColorBalance
|
|
||||||
GstGnomeVFSSrc GstURIHandler
|
GstGnomeVFSSrc GstURIHandler
|
||||||
GstAppSrc GstURIHandler
|
GstAppSrc GstURIHandler
|
||||||
GstVorbisEnc GstTagSetter
|
GstVorbisEnc GstTagSetter
|
||||||
GstVorbisTag GstTagSetter
|
GstVorbisTag GstTagSetter
|
||||||
GstGnomeVFSSink GstURIHandler
|
|
||||||
GstAlsaSink GstPropertyProbe
|
|
||||||
GstXvImageSink GstImplementsInterface GstPropertyProbe GstXOverlay GstColorBalance GstNavigation
|
|
||||||
GstXImageSink GstImplementsInterface GstXOverlay GstNavigation
|
|
||||||
GstAlsaMixerElement GstImplementsInterface GstMixer GstPropertyProbe
|
GstAlsaMixerElement GstImplementsInterface GstMixer GstPropertyProbe
|
||||||
GstVolume GstImplementsInterface GstMixer
|
GstVolume GstImplementsInterface GstMixer
|
||||||
|
GTypeModule GTypePlugin
|
||||||
|
GIOModule GTypePlugin
|
||||||
|
GAppLookupGConf GDesktopAppInfoLookup
|
||||||
|
GProxyDrive GDrive
|
||||||
|
GProxyMount GMount
|
||||||
|
GProxyVolume GVolume
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
GstChildProxy GstObject
|
GstChildProxy GstObject
|
||||||
|
GFile GObject
|
||||||
|
GDesktopAppInfoLookup GObject
|
||||||
|
GDrive GObject
|
||||||
|
GMount GObject
|
||||||
|
GVolume GObject
|
||||||
GstTagSetter GstObject GstElement
|
GstTagSetter GstObject GstElement
|
||||||
GstImplementsInterface GstObject GstElement
|
GstImplementsInterface GstObject GstElement
|
||||||
GstMixer GstObject GstImplementsInterface GstElement
|
GstMixer GstObject GstImplementsInterface GstElement
|
||||||
GstTuner GstObject GstImplementsInterface GstElement
|
|
||||||
GstXOverlay GstObject GstImplementsInterface GstElement
|
GstXOverlay GstObject GstImplementsInterface GstElement
|
||||||
GstColorBalance GstObject GstImplementsInterface GstElement
|
GstColorBalance GstObject GstImplementsInterface GstElement
|
||||||
|
GstTuner GstObject GstImplementsInterface GstElement
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Adds multiple streams</description>
|
<description>Adds multiple streams</description>
|
||||||
<filename>../../gst/adder/.libs/libgstadder.so</filename>
|
<filename>../../gst/adder/.libs/libgstadder.so</filename>
|
||||||
<basename>libgstadder.so</basename>
|
<basename>libgstadder.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>ALSA plugin library</description>
|
<description>ALSA plugin library</description>
|
||||||
<filename>../../ext/alsa/.libs/libgstalsa.so</filename>
|
<filename>../../ext/alsa/.libs/libgstalsa.so</filename>
|
||||||
<basename>libgstalsa.so</basename>
|
<basename>libgstalsa.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Elements used to communicate with applications</description>
|
<description>Elements used to communicate with applications</description>
|
||||||
<filename>../../gst/app/.libs/libgstapp.so</filename>
|
<filename>../../gst/app/.libs/libgstapp.so</filename>
|
||||||
<basename>libgstapp.so</basename>
|
<basename>libgstapp.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Convert audio to different formats</description>
|
<description>Convert audio to different formats</description>
|
||||||
<filename>../../gst/audioconvert/.libs/libgstaudioconvert.so</filename>
|
<filename>../../gst/audioconvert/.libs/libgstaudioconvert.so</filename>
|
||||||
<basename>libgstaudioconvert.so</basename>
|
<basename>libgstaudioconvert.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Adjusts audio frames</description>
|
<description>Adjusts audio frames</description>
|
||||||
<filename>../../gst/audiorate/.libs/libgstaudiorate.so</filename>
|
<filename>../../gst/audiorate/.libs/libgstaudiorate.so</filename>
|
||||||
<basename>libgstaudiorate.so</basename>
|
<basename>libgstaudiorate.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
<plugin>
|
<plugin>
|
||||||
<name>audioresample</name>
|
<name>audioresample</name>
|
||||||
<description>Resamples audio</description>
|
<description>Resamples audio</description>
|
||||||
<filename>../../gst/speexresample/.libs/libgstaudioresample.so</filename>
|
<filename>../../gst/audioresample/.libs/libgstaudioresample.so</filename>
|
||||||
<basename>libgstaudioresample.so</basename>
|
<basename>libgstaudioresample.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Creates audio test signals of given frequency and volume</description>
|
<description>Creates audio test signals of given frequency and volume</description>
|
||||||
<filename>../../gst/audiotestsrc/.libs/libgstaudiotestsrc.so</filename>
|
<filename>../../gst/audiotestsrc/.libs/libgstaudiotestsrc.so</filename>
|
||||||
<basename>libgstaudiotestsrc.so</basename>
|
<basename>libgstaudiotestsrc.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Read audio from CD in paranoid mode</description>
|
<description>Read audio from CD in paranoid mode</description>
|
||||||
<filename>../../ext/cdparanoia/.libs/libgstcdparanoia.so</filename>
|
<filename>../../ext/cdparanoia/.libs/libgstcdparanoia.so</filename>
|
||||||
<basename>libgstcdparanoia.so</basename>
|
<basename>libgstcdparanoia.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>GPL</license>
|
<license>GPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>decoder bin</description>
|
<description>decoder bin</description>
|
||||||
<filename>../../gst/playback/.libs/libgstdecodebin.so</filename>
|
<filename>../../gst/playback/.libs/libgstdecodebin.so</filename>
|
||||||
<basename>libgstdecodebin.so</basename>
|
<basename>libgstdecodebin.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<description>colorspace conversion copied from FFMpeg 0.4.9-pre1</description>
|
<description>colorspace conversion copied from FFMpeg 0.4.9-pre1</description>
|
||||||
<filename>../../gst/ffmpegcolorspace/.libs/libgstffmpegcolorspace.so</filename>
|
<filename>../../gst/ffmpegcolorspace/.libs/libgstffmpegcolorspace.so</filename>
|
||||||
<basename>libgstffmpegcolorspace.so</basename>
|
<basename>libgstffmpegcolorspace.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>FFMpeg</package>
|
<package>FFMpeg</package>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Payload/depayload GDP packets</description>
|
<description>Payload/depayload GDP packets</description>
|
||||||
<filename>../../gst/gdp/.libs/libgstgdp.so</filename>
|
<filename>../../gst/gdp/.libs/libgstgdp.so</filename>
|
||||||
<basename>libgstgdp.so</basename>
|
<basename>libgstgdp.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<description>GIO elements</description>
|
<description>GIO elements</description>
|
||||||
<filename>../../ext/gio/.libs/libgstgio.so</filename>
|
<filename>../../ext/gio/.libs/libgstgio.so</filename>
|
||||||
<basename>libgstgio.so</basename>
|
<basename>libgstgio.so</basename>
|
||||||
<version>0.10.21.1</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>elements to read from and write to Gnome-VFS uri's</description>
|
<description>elements to read from and write to Gnome-VFS uri's</description>
|
||||||
<filename>../../ext/gnomevfs/.libs/libgstgnomevfs.so</filename>
|
<filename>../../ext/gnomevfs/.libs/libgstgnomevfs.so</filename>
|
||||||
<basename>libgstgnomevfs.so</basename>
|
<basename>libgstgnomevfs.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>libvisual visualization plugins</description>
|
<description>libvisual visualization plugins</description>
|
||||||
<filename>../../ext/libvisual/.libs/libgstlibvisual.so</filename>
|
<filename>../../ext/libvisual/.libs/libgstlibvisual.so</filename>
|
||||||
<basename>libgstlibvisual.so</basename>
|
<basename>libgstlibvisual.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>ogg stream manipulation (info about ogg: http://xiph.org)</description>
|
<description>ogg stream manipulation (info about ogg: http://xiph.org)</description>
|
||||||
<filename>../../ext/ogg/.libs/libgstogg.so</filename>
|
<filename>../../ext/ogg/.libs/libgstogg.so</filename>
|
||||||
<basename>libgstogg.so</basename>
|
<basename>libgstogg.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Pango-based text rendering and overlay</description>
|
<description>Pango-based text rendering and overlay</description>
|
||||||
<filename>../../ext/pango/.libs/libgstpango.so</filename>
|
<filename>../../ext/pango/.libs/libgstpango.so</filename>
|
||||||
<basename>libgstpango.so</basename>
|
<basename>libgstpango.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>various playback elements</description>
|
<description>various playback elements</description>
|
||||||
<filename>../../gst/playback/.libs/libgstplaybin.so</filename>
|
<filename>../../gst/playback/.libs/libgstplaybin.so</filename>
|
||||||
<basename>libgstplaybin.so</basename>
|
<basename>libgstplaybin.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Queue newer version</description>
|
<description>Queue newer version</description>
|
||||||
<filename>../../gst/playback/.libs/libgstqueue2.so</filename>
|
<filename>../../gst/playback/.libs/libgstqueue2.so</filename>
|
||||||
<basename>libgstqueue2.so</basename>
|
<basename>libgstqueue2.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Subtitle parsing</description>
|
<description>Subtitle parsing</description>
|
||||||
<filename>../../gst/subparse/.libs/libgstsubparse.so</filename>
|
<filename>../../gst/subparse/.libs/libgstsubparse.so</filename>
|
||||||
<basename>libgstsubparse.so</basename>
|
<basename>libgstsubparse.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>transfer data over the network via TCP</description>
|
<description>transfer data over the network via TCP</description>
|
||||||
<filename>../../gst/tcp/.libs/libgsttcp.so</filename>
|
<filename>../../gst/tcp/.libs/libgsttcp.so</filename>
|
||||||
<basename>libgsttcp.so</basename>
|
<basename>libgsttcp.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Theora plugin library</description>
|
<description>Theora plugin library</description>
|
||||||
<filename>../../ext/theora/.libs/libgsttheora.so</filename>
|
<filename>../../ext/theora/.libs/libgsttheora.so</filename>
|
||||||
<basename>libgsttheora.so</basename>
|
<basename>libgsttheora.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>default typefind functions</description>
|
<description>default typefind functions</description>
|
||||||
<filename>../../gst/typefind/.libs/libgsttypefindfunctions.so</filename>
|
<filename>../../gst/typefind/.libs/libgsttypefindfunctions.so</filename>
|
||||||
<basename>libgsttypefindfunctions.so</basename>
|
<basename>libgsttypefindfunctions.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>URI Decoder bin</description>
|
<description>URI Decoder bin</description>
|
||||||
<filename>../../gst/playback/.libs/libgstdecodebin2.so</filename>
|
<filename>../../gst/playback/.libs/libgstdecodebin2.so</filename>
|
||||||
<basename>libgstdecodebin2.so</basename>
|
<basename>libgstdecodebin2.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>elements for Video 4 Linux</description>
|
<description>elements for Video 4 Linux</description>
|
||||||
<filename>../../sys/v4l/.libs/libgstvideo4linux.so</filename>
|
<filename>../../sys/v4l/.libs/libgstvideo4linux.so</filename>
|
||||||
<basename>libgstvideo4linux.so</basename>
|
<basename>libgstvideo4linux.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Adjusts video frames</description>
|
<description>Adjusts video frames</description>
|
||||||
<filename>../../gst/videorate/.libs/libgstvideorate.so</filename>
|
<filename>../../gst/videorate/.libs/libgstvideorate.so</filename>
|
||||||
<basename>libgstvideorate.so</basename>
|
<basename>libgstvideorate.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Resizes video</description>
|
<description>Resizes video</description>
|
||||||
<filename>../../gst/videoscale/.libs/libgstvideoscale.so</filename>
|
<filename>../../gst/videoscale/.libs/libgstvideoscale.so</filename>
|
||||||
<basename>libgstvideoscale.so</basename>
|
<basename>libgstvideoscale.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Creates a test video stream</description>
|
<description>Creates a test video stream</description>
|
||||||
<filename>../../gst/videotestsrc/.libs/libgstvideotestsrc.so</filename>
|
<filename>../../gst/videotestsrc/.libs/libgstvideotestsrc.so</filename>
|
||||||
<basename>libgstvideotestsrc.so</basename>
|
<basename>libgstvideotestsrc.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>plugin for controlling audio volume</description>
|
<description>plugin for controlling audio volume</description>
|
||||||
<filename>../../gst/volume/.libs/libgstvolume.so</filename>
|
<filename>../../gst/volume/.libs/libgstvolume.so</filename>
|
||||||
<basename>libgstvolume.so</basename>
|
<basename>libgstvolume.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>Vorbis plugin library</description>
|
<description>Vorbis plugin library</description>
|
||||||
<filename>../../ext/vorbis/.libs/libgstvorbis.so</filename>
|
<filename>../../ext/vorbis/.libs/libgstvorbis.so</filename>
|
||||||
<basename>libgstvorbis.so</basename>
|
<basename>libgstvorbis.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>X11 video output element based on standard Xlib calls</description>
|
<description>X11 video output element based on standard Xlib calls</description>
|
||||||
<filename>../../sys/ximage/.libs/libgstximagesink.so</filename>
|
<filename>../../sys/ximage/.libs/libgstximagesink.so</filename>
|
||||||
<basename>libgstximagesink.so</basename>
|
<basename>libgstximagesink.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<description>XFree86 video output plugin using Xv extension</description>
|
<description>XFree86 video output plugin using Xv extension</description>
|
||||||
<filename>../../sys/xvimage/.libs/libgstxvimagesink.so</filename>
|
<filename>../../sys/xvimage/.libs/libgstxvimagesink.so</filename>
|
||||||
<basename>libgstxvimagesink.so</basename>
|
<basename>libgstxvimagesink.so</basename>
|
||||||
<version>0.10.22</version>
|
<version>0.10.22.1</version>
|
||||||
<license>LGPL</license>
|
<license>LGPL</license>
|
||||||
<source>gst-plugins-base</source>
|
<source>gst-plugins-base</source>
|
||||||
<package>GStreamer Base Plug-ins source release</package>
|
<package>GStreamer Base Plug-ins CVS/prerelease</package>
|
||||||
<origin>Unknown package origin</origin>
|
<origin>Unknown package origin</origin>
|
||||||
<elements>
|
<elements>
|
||||||
<element>
|
<element>
|
||||||
|
|
|
@ -1,21 +1,37 @@
|
||||||
plugin_LTLIBRARIES = libgstaudioresample.la
|
plugin_LTLIBRARIES = libgstaudioresample.la
|
||||||
|
|
||||||
resample_SOURCES = \
|
libgstaudioresample_la_SOURCES = \
|
||||||
functable.c \
|
gstaudioresample.c \
|
||||||
resample.c \
|
speex_resampler_int.c \
|
||||||
resample_functable.c \
|
speex_resampler_float.c \
|
||||||
resample_ref.c \
|
speex_resampler_double.c
|
||||||
resample_chunk.c \
|
|
||||||
resample.h \
|
libgstaudioresample_la_CFLAGS = \
|
||||||
buffer.c
|
$(GST_PLUGINS_BASE_CFLAGS) \
|
||||||
|
$(GST_BASE_CFLAGS) \
|
||||||
|
$(GST_CFLAGS) \
|
||||||
|
$(LIBOIL_CFLAGS)
|
||||||
|
|
||||||
|
libgstaudioresample_la_LIBADD = \
|
||||||
|
$(GST_PLUGINS_BASE_LIBS) \
|
||||||
|
$(GST_BASE_LIBS) \
|
||||||
|
$(GST_LIBS) \
|
||||||
|
$(LIBOIL_LIBS) \
|
||||||
|
$(LIBM)
|
||||||
|
|
||||||
|
libgstaudioresample_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
||||||
|
libgstaudioresample_la_LIBTOOLFLAGS = --tag=disable-static
|
||||||
|
|
||||||
noinst_HEADERS = \
|
noinst_HEADERS = \
|
||||||
|
arch.h \
|
||||||
|
fixed_arm4.h \
|
||||||
|
fixed_arm5e.h \
|
||||||
|
fixed_bfin.h \
|
||||||
|
fixed_debug.h \
|
||||||
|
fixed_generic.h \
|
||||||
gstaudioresample.h \
|
gstaudioresample.h \
|
||||||
functable.h \
|
resample.c \
|
||||||
debug.h \
|
resample_sse.h \
|
||||||
buffer.h
|
speex_resampler.h \
|
||||||
|
speex_resampler_wrapper.h
|
||||||
|
|
||||||
libgstaudioresample_la_SOURCES = gstaudioresample.c $(resample_SOURCES)
|
|
||||||
libgstaudioresample_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(LIBOIL_CFLAGS)
|
|
||||||
libgstaudioresample_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(LIBOIL_LIBS)
|
|
||||||
libgstaudioresample_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
|
||||||
|
|
|
@ -1,253 +0,0 @@
|
||||||
|
|
||||||
#ifndef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "buffer.h"
|
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
static void audioresample_buffer_free_mem (AudioresampleBuffer * buffer,
|
|
||||||
void *);
|
|
||||||
static void audioresample_buffer_free_subbuffer (AudioresampleBuffer * buffer,
|
|
||||||
void *priv);
|
|
||||||
|
|
||||||
|
|
||||||
AudioresampleBuffer *
|
|
||||||
audioresample_buffer_new (void)
|
|
||||||
{
|
|
||||||
AudioresampleBuffer *buffer;
|
|
||||||
|
|
||||||
buffer = g_new0 (AudioresampleBuffer, 1);
|
|
||||||
buffer->ref_count = 1;
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioresampleBuffer *
|
|
||||||
audioresample_buffer_new_and_alloc (int size)
|
|
||||||
{
|
|
||||||
AudioresampleBuffer *buffer = audioresample_buffer_new ();
|
|
||||||
|
|
||||||
buffer->data = g_malloc (size);
|
|
||||||
buffer->length = size;
|
|
||||||
buffer->free = audioresample_buffer_free_mem;
|
|
||||||
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioresampleBuffer *
|
|
||||||
audioresample_buffer_new_with_data (void *data, int size)
|
|
||||||
{
|
|
||||||
AudioresampleBuffer *buffer = audioresample_buffer_new ();
|
|
||||||
|
|
||||||
buffer->data = data;
|
|
||||||
buffer->length = size;
|
|
||||||
buffer->free = audioresample_buffer_free_mem;
|
|
||||||
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioresampleBuffer *
|
|
||||||
audioresample_buffer_new_subbuffer (AudioresampleBuffer * buffer, int offset,
|
|
||||||
int length)
|
|
||||||
{
|
|
||||||
AudioresampleBuffer *subbuffer = audioresample_buffer_new ();
|
|
||||||
|
|
||||||
if (buffer->parent) {
|
|
||||||
audioresample_buffer_ref (buffer->parent);
|
|
||||||
subbuffer->parent = buffer->parent;
|
|
||||||
} else {
|
|
||||||
audioresample_buffer_ref (buffer);
|
|
||||||
subbuffer->parent = buffer;
|
|
||||||
}
|
|
||||||
subbuffer->data = buffer->data + offset;
|
|
||||||
subbuffer->length = length;
|
|
||||||
subbuffer->free = audioresample_buffer_free_subbuffer;
|
|
||||||
|
|
||||||
return subbuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
audioresample_buffer_ref (AudioresampleBuffer * buffer)
|
|
||||||
{
|
|
||||||
buffer->ref_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
audioresample_buffer_unref (AudioresampleBuffer * buffer)
|
|
||||||
{
|
|
||||||
buffer->ref_count--;
|
|
||||||
if (buffer->ref_count == 0) {
|
|
||||||
if (buffer->free)
|
|
||||||
buffer->free (buffer, buffer->priv);
|
|
||||||
g_free (buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
audioresample_buffer_free_mem (AudioresampleBuffer * buffer, void *priv)
|
|
||||||
{
|
|
||||||
g_free (buffer->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
audioresample_buffer_free_subbuffer (AudioresampleBuffer * buffer, void *priv)
|
|
||||||
{
|
|
||||||
audioresample_buffer_unref (buffer->parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
AudioresampleBufferQueue *
|
|
||||||
audioresample_buffer_queue_new (void)
|
|
||||||
{
|
|
||||||
return g_new0 (AudioresampleBufferQueue, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
audioresample_buffer_queue_get_depth (AudioresampleBufferQueue * queue)
|
|
||||||
{
|
|
||||||
return queue->depth;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
audioresample_buffer_queue_get_offset (AudioresampleBufferQueue * queue)
|
|
||||||
{
|
|
||||||
return queue->offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
audioresample_buffer_queue_free (AudioresampleBufferQueue * queue)
|
|
||||||
{
|
|
||||||
GList *g;
|
|
||||||
|
|
||||||
for (g = g_list_first (queue->buffers); g; g = g_list_next (g)) {
|
|
||||||
audioresample_buffer_unref ((AudioresampleBuffer *) g->data);
|
|
||||||
}
|
|
||||||
g_list_free (queue->buffers);
|
|
||||||
g_free (queue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
audioresample_buffer_queue_push (AudioresampleBufferQueue * queue,
|
|
||||||
AudioresampleBuffer * buffer)
|
|
||||||
{
|
|
||||||
queue->buffers = g_list_append (queue->buffers, buffer);
|
|
||||||
queue->depth += buffer->length;
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioresampleBuffer *
|
|
||||||
audioresample_buffer_queue_pull (AudioresampleBufferQueue * queue, int length)
|
|
||||||
{
|
|
||||||
GList *g;
|
|
||||||
AudioresampleBuffer *newbuffer;
|
|
||||||
AudioresampleBuffer *buffer;
|
|
||||||
AudioresampleBuffer *subbuffer;
|
|
||||||
|
|
||||||
g_return_val_if_fail (length > 0, NULL);
|
|
||||||
|
|
||||||
if (queue->depth < length) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
RESAMPLE_LOG ("pulling %d, %d available", length, queue->depth);
|
|
||||||
|
|
||||||
g = g_list_first (queue->buffers);
|
|
||||||
buffer = g->data;
|
|
||||||
|
|
||||||
if (buffer->length > length) {
|
|
||||||
newbuffer = audioresample_buffer_new_subbuffer (buffer, 0, length);
|
|
||||||
|
|
||||||
subbuffer = audioresample_buffer_new_subbuffer (buffer, length,
|
|
||||||
buffer->length - length);
|
|
||||||
g->data = subbuffer;
|
|
||||||
audioresample_buffer_unref (buffer);
|
|
||||||
} else {
|
|
||||||
int offset = 0;
|
|
||||||
|
|
||||||
newbuffer = audioresample_buffer_new_and_alloc (length);
|
|
||||||
|
|
||||||
while (offset < length) {
|
|
||||||
g = g_list_first (queue->buffers);
|
|
||||||
buffer = g->data;
|
|
||||||
|
|
||||||
if (buffer->length > length - offset) {
|
|
||||||
int n = length - offset;
|
|
||||||
|
|
||||||
memcpy (newbuffer->data + offset, buffer->data, n);
|
|
||||||
subbuffer =
|
|
||||||
audioresample_buffer_new_subbuffer (buffer, n, buffer->length - n);
|
|
||||||
g->data = subbuffer;
|
|
||||||
audioresample_buffer_unref (buffer);
|
|
||||||
offset += n;
|
|
||||||
} else {
|
|
||||||
memcpy (newbuffer->data + offset, buffer->data, buffer->length);
|
|
||||||
|
|
||||||
queue->buffers = g_list_delete_link (queue->buffers, g);
|
|
||||||
offset += buffer->length;
|
|
||||||
audioresample_buffer_unref (buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
queue->depth -= length;
|
|
||||||
queue->offset += length;
|
|
||||||
|
|
||||||
return newbuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioresampleBuffer *
|
|
||||||
audioresample_buffer_queue_peek (AudioresampleBufferQueue * queue, int length)
|
|
||||||
{
|
|
||||||
GList *g;
|
|
||||||
AudioresampleBuffer *newbuffer;
|
|
||||||
AudioresampleBuffer *buffer;
|
|
||||||
int offset = 0;
|
|
||||||
|
|
||||||
g_return_val_if_fail (length > 0, NULL);
|
|
||||||
|
|
||||||
if (queue->depth < length) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
RESAMPLE_LOG ("peeking %d, %d available", length, queue->depth);
|
|
||||||
|
|
||||||
g = g_list_first (queue->buffers);
|
|
||||||
buffer = g->data;
|
|
||||||
if (buffer->length > length) {
|
|
||||||
newbuffer = audioresample_buffer_new_subbuffer (buffer, 0, length);
|
|
||||||
} else {
|
|
||||||
newbuffer = audioresample_buffer_new_and_alloc (length);
|
|
||||||
while (offset < length) {
|
|
||||||
buffer = g->data;
|
|
||||||
|
|
||||||
if (buffer->length > length - offset) {
|
|
||||||
int n = length - offset;
|
|
||||||
|
|
||||||
memcpy (newbuffer->data + offset, buffer->data, n);
|
|
||||||
offset += n;
|
|
||||||
} else {
|
|
||||||
memcpy (newbuffer->data + offset, buffer->data, buffer->length);
|
|
||||||
offset += buffer->length;
|
|
||||||
}
|
|
||||||
g = g_list_next (g);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return newbuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
audioresample_buffer_queue_flush (AudioresampleBufferQueue * queue)
|
|
||||||
{
|
|
||||||
GList *g;
|
|
||||||
|
|
||||||
for (g = g_list_first (queue->buffers); g; g = g_list_next (g)) {
|
|
||||||
audioresample_buffer_unref ((AudioresampleBuffer *) g->data);
|
|
||||||
}
|
|
||||||
g_list_free (queue->buffers);
|
|
||||||
queue->buffers = NULL;
|
|
||||||
queue->depth = 0;
|
|
||||||
queue->offset = 0;
|
|
||||||
}
|
|
|
@ -1,51 +0,0 @@
|
||||||
|
|
||||||
#ifndef __AUDIORESAMPLE_BUFFER_H__
|
|
||||||
#define __AUDIORESAMPLE_BUFFER_H__
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
|
|
||||||
typedef struct _AudioresampleBuffer AudioresampleBuffer;
|
|
||||||
typedef struct _AudioresampleBufferQueue AudioresampleBufferQueue;
|
|
||||||
|
|
||||||
struct _AudioresampleBuffer
|
|
||||||
{
|
|
||||||
unsigned char *data;
|
|
||||||
int length;
|
|
||||||
|
|
||||||
int ref_count;
|
|
||||||
|
|
||||||
AudioresampleBuffer *parent;
|
|
||||||
|
|
||||||
void (*free) (AudioresampleBuffer *, void *);
|
|
||||||
void *priv;
|
|
||||||
void *priv2;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _AudioresampleBufferQueue
|
|
||||||
{
|
|
||||||
GList *buffers;
|
|
||||||
int depth;
|
|
||||||
int offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
AudioresampleBuffer * audioresample_buffer_new (void);
|
|
||||||
AudioresampleBuffer * audioresample_buffer_new_and_alloc (int size);
|
|
||||||
AudioresampleBuffer * audioresample_buffer_new_with_data (void *data, int size);
|
|
||||||
AudioresampleBuffer * audioresample_buffer_new_subbuffer (AudioresampleBuffer * buffer,
|
|
||||||
int offset,
|
|
||||||
int length);
|
|
||||||
void audioresample_buffer_ref (AudioresampleBuffer * buffer);
|
|
||||||
void audioresample_buffer_unref (AudioresampleBuffer * buffer);
|
|
||||||
|
|
||||||
AudioresampleBufferQueue *
|
|
||||||
audioresample_buffer_queue_new (void);
|
|
||||||
void audioresample_buffer_queue_free (AudioresampleBufferQueue * queue);
|
|
||||||
int audioresample_buffer_queue_get_depth (AudioresampleBufferQueue * queue);
|
|
||||||
int audioresample_buffer_queue_get_offset (AudioresampleBufferQueue * queue);
|
|
||||||
void audioresample_buffer_queue_push (AudioresampleBufferQueue * queue,
|
|
||||||
AudioresampleBuffer * buffer);
|
|
||||||
AudioresampleBuffer * audioresample_buffer_queue_pull (AudioresampleBufferQueue * queue, int len);
|
|
||||||
AudioresampleBuffer * audioresample_buffer_queue_peek (AudioresampleBufferQueue * queue, int len);
|
|
||||||
void audioresample_buffer_queue_flush (AudioresampleBufferQueue * queue);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,65 +0,0 @@
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <debug.h>
|
|
||||||
|
|
||||||
static const char *resample_debug_level_names[] = {
|
|
||||||
"NONE",
|
|
||||||
"ERROR",
|
|
||||||
"WARNING",
|
|
||||||
"INFO",
|
|
||||||
"DEBUG",
|
|
||||||
"LOG"
|
|
||||||
};
|
|
||||||
|
|
||||||
static int resample_debug_level = RESAMPLE_LEVEL_ERROR;
|
|
||||||
|
|
||||||
void
|
|
||||||
resample_debug_log (int level, const char *file, const char *function,
|
|
||||||
int line, const char *format, ...)
|
|
||||||
{
|
|
||||||
#ifndef GLIB_COMPAT
|
|
||||||
va_list varargs;
|
|
||||||
char *s;
|
|
||||||
|
|
||||||
if (level > resample_debug_level)
|
|
||||||
return;
|
|
||||||
|
|
||||||
va_start (varargs, format);
|
|
||||||
s = g_strdup_vprintf (format, varargs);
|
|
||||||
va_end (varargs);
|
|
||||||
|
|
||||||
fprintf (stderr, "RESAMPLE: %s: %s(%d): %s: %s\n",
|
|
||||||
resample_debug_level_names[level], file, line, function, s);
|
|
||||||
g_free (s);
|
|
||||||
#else
|
|
||||||
va_list varargs;
|
|
||||||
char s[1000];
|
|
||||||
|
|
||||||
if (level > resample_debug_level)
|
|
||||||
return;
|
|
||||||
|
|
||||||
va_start (varargs, format);
|
|
||||||
vsnprintf (s, 999, format, varargs);
|
|
||||||
va_end (varargs);
|
|
||||||
|
|
||||||
fprintf (stderr, "RESAMPLE: %s: %s(%d): %s: %s\n",
|
|
||||||
resample_debug_level_names[level], file, line, function, s);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
resample_debug_set_level (int level)
|
|
||||||
{
|
|
||||||
resample_debug_level = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
resample_debug_get_level (void)
|
|
||||||
{
|
|
||||||
return resample_debug_level;
|
|
||||||
}
|
|
|
@ -1,51 +0,0 @@
|
||||||
|
|
||||||
#ifndef __RESAMPLE_DEBUG_H__
|
|
||||||
#define __RESAMPLE_DEBUG_H__
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
RESAMPLE_LEVEL_NONE = 0,
|
|
||||||
RESAMPLE_LEVEL_ERROR,
|
|
||||||
RESAMPLE_LEVEL_WARNING,
|
|
||||||
RESAMPLE_LEVEL_INFO,
|
|
||||||
RESAMPLE_LEVEL_DEBUG,
|
|
||||||
RESAMPLE_LEVEL_LOG
|
|
||||||
};
|
|
||||||
|
|
||||||
#define RESAMPLE_ERROR(...) \
|
|
||||||
RESAMPLE_DEBUG_LEVEL(RESAMPLE_LEVEL_ERROR, __VA_ARGS__)
|
|
||||||
#define RESAMPLE_WARNING(...) \
|
|
||||||
RESAMPLE_DEBUG_LEVEL(RESAMPLE_LEVEL_WARNING, __VA_ARGS__)
|
|
||||||
#define RESAMPLE_INFO(...) \
|
|
||||||
RESAMPLE_DEBUG_LEVEL(RESAMPLE_LEVEL_INFO, __VA_ARGS__)
|
|
||||||
#define RESAMPLE_DEBUG(...) \
|
|
||||||
RESAMPLE_DEBUG_LEVEL(RESAMPLE_LEVEL_DEBUG, __VA_ARGS__)
|
|
||||||
#define RESAMPLE_LOG(...) \
|
|
||||||
RESAMPLE_DEBUG_LEVEL(RESAMPLE_LEVEL_LOG, __VA_ARGS__)
|
|
||||||
|
|
||||||
#define RESAMPLE_DEBUG_LEVEL(level,...) \
|
|
||||||
resample_debug_log ((level), __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
|
|
||||||
|
|
||||||
void resample_debug_log (int level, const char *file, const char *function,
|
|
||||||
int line, const char *format, ...);
|
|
||||||
void resample_debug_set_level (int level);
|
|
||||||
int resample_debug_get_level (void);
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_EXTERN (libaudioresample_debug);
|
|
||||||
#define GST_CAT_DEFAULT libaudioresample_debug
|
|
||||||
|
|
||||||
#define RESAMPLE_ERROR GST_ERROR
|
|
||||||
#define RESAMPLE_WARNING GST_WARNING
|
|
||||||
#define RESAMPLE_INFO GST_INFO
|
|
||||||
#define RESAMPLE_DEBUG GST_DEBUG
|
|
||||||
#define RESAMPLE_LOG GST_LOG
|
|
||||||
|
|
||||||
#define resample_debug_set_level(x) do { } while (0)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,254 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David A. Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "functable.h"
|
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_func_sinc (double *fx, double *dfx, double x, void *closure)
|
|
||||||
{
|
|
||||||
if (x == 0) {
|
|
||||||
*fx = 1;
|
|
||||||
*dfx = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
*fx = sin (x) / x;
|
|
||||||
*dfx = (cos (x) - sin (x) / x) / x;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_func_boxcar (double *fx, double *dfx, double x, void *closure)
|
|
||||||
{
|
|
||||||
double width = *(double *) closure;
|
|
||||||
|
|
||||||
if (x < width && x > -width) {
|
|
||||||
*fx = 1;
|
|
||||||
} else {
|
|
||||||
*fx = 0;
|
|
||||||
}
|
|
||||||
*dfx = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_func_hanning (double *fx, double *dfx, double x, void *closure)
|
|
||||||
{
|
|
||||||
double width = *(double *) closure;
|
|
||||||
|
|
||||||
if (x < width && x > -width) {
|
|
||||||
x /= width;
|
|
||||||
*fx = (1 - x * x) * (1 - x * x);
|
|
||||||
*dfx = -2 * 2 * x / width * (1 - x * x);
|
|
||||||
} else {
|
|
||||||
*fx = 0;
|
|
||||||
*dfx = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Functable *
|
|
||||||
functable_new (void)
|
|
||||||
{
|
|
||||||
Functable *ft;
|
|
||||||
|
|
||||||
ft = malloc (sizeof (Functable));
|
|
||||||
memset (ft, 0, sizeof (Functable));
|
|
||||||
|
|
||||||
return ft;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_free (Functable * ft)
|
|
||||||
{
|
|
||||||
free (ft);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_set_length (Functable * t, int length)
|
|
||||||
{
|
|
||||||
t->length = length;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_set_offset (Functable * t, double offset)
|
|
||||||
{
|
|
||||||
t->offset = offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_set_multiplier (Functable * t, double multiplier)
|
|
||||||
{
|
|
||||||
t->multiplier = multiplier;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_calculate (Functable * t, FunctableFunc func, void *closure)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
if (t->fx)
|
|
||||||
free (t->fx);
|
|
||||||
if (t->dfx)
|
|
||||||
free (t->dfx);
|
|
||||||
|
|
||||||
t->fx = malloc (sizeof (double) * (t->length + 1));
|
|
||||||
t->dfx = malloc (sizeof (double) * (t->length + 1));
|
|
||||||
|
|
||||||
t->inv_multiplier = 1.0 / t->multiplier;
|
|
||||||
|
|
||||||
for (i = 0; i < t->length + 1; i++) {
|
|
||||||
x = t->offset + t->multiplier * i;
|
|
||||||
|
|
||||||
func (&t->fx[i], &t->dfx[i], x, closure);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_calculate_multiply (Functable * t, FunctableFunc func, void *closure)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (i = 0; i < t->length + 1; i++) {
|
|
||||||
double afx, adfx, bfx, bdfx;
|
|
||||||
|
|
||||||
afx = t->fx[i];
|
|
||||||
adfx = t->dfx[i];
|
|
||||||
x = t->offset + t->multiplier * i;
|
|
||||||
func (&bfx, &bdfx, x, closure);
|
|
||||||
t->fx[i] = afx * bfx;
|
|
||||||
t->dfx[i] = afx * bdfx + adfx * bfx;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
functable_evaluate (Functable * t, double x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double f0, f1, w0, w1;
|
|
||||||
double x2, x3;
|
|
||||||
double w;
|
|
||||||
|
|
||||||
if (x < t->offset || x > (t->offset + t->length * t->multiplier)) {
|
|
||||||
RESAMPLE_DEBUG ("x out of range %g", x);
|
|
||||||
}
|
|
||||||
|
|
||||||
x -= t->offset;
|
|
||||||
x *= t->inv_multiplier;
|
|
||||||
i = floor (x);
|
|
||||||
x -= i;
|
|
||||||
|
|
||||||
x2 = x * x;
|
|
||||||
x3 = x2 * x;
|
|
||||||
|
|
||||||
f1 = 3 * x2 - 2 * x3;
|
|
||||||
f0 = 1 - f1;
|
|
||||||
w0 = (x - 2 * x2 + x3) * t->multiplier;
|
|
||||||
w1 = (-x2 + x3) * t->multiplier;
|
|
||||||
|
|
||||||
w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->dfx[i] * w0 + t->dfx[i + 1] * w1;
|
|
||||||
|
|
||||||
/*w = t->fx[i] * (1-x) + t->fx[i+1] * x; */
|
|
||||||
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
double
|
|
||||||
functable_fir (Functable * t, double x, int n, double *data, int len)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
double f0, f1, w0, w1;
|
|
||||||
double x2, x3;
|
|
||||||
double w;
|
|
||||||
double sum;
|
|
||||||
|
|
||||||
x -= t->offset;
|
|
||||||
x /= t->multiplier;
|
|
||||||
i = floor (x);
|
|
||||||
x -= i;
|
|
||||||
|
|
||||||
x2 = x * x;
|
|
||||||
x3 = x2 * x;
|
|
||||||
|
|
||||||
f1 = 3 * x2 - 2 * x3;
|
|
||||||
f0 = 1 - f1;
|
|
||||||
w0 = (x - 2 * x2 + x3) * t->multiplier;
|
|
||||||
w1 = (-x2 + x3) * t->multiplier;
|
|
||||||
|
|
||||||
sum = 0;
|
|
||||||
for (j = 0; j < len; j++) {
|
|
||||||
w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->dfx[i] * w0 + t->dfx[i + 1] * w1;
|
|
||||||
sum += data[j * 2] * w;
|
|
||||||
i += n;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_fir2 (Functable * t, double *r0, double *r1, double x,
|
|
||||||
int n, double *data, int len)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
double f0, f1, w0, w1;
|
|
||||||
double x2, x3;
|
|
||||||
double w;
|
|
||||||
double sum0, sum1;
|
|
||||||
double floor_x;
|
|
||||||
|
|
||||||
x -= t->offset;
|
|
||||||
x *= t->inv_multiplier;
|
|
||||||
floor_x = floor (x);
|
|
||||||
i = floor_x;
|
|
||||||
x -= floor_x;
|
|
||||||
|
|
||||||
x2 = x * x;
|
|
||||||
x3 = x2 * x;
|
|
||||||
|
|
||||||
f1 = 3 * x2 - 2 * x3;
|
|
||||||
f0 = 1 - f1;
|
|
||||||
w0 = (x - 2 * x2 + x3) * t->multiplier;
|
|
||||||
w1 = (-x2 + x3) * t->multiplier;
|
|
||||||
|
|
||||||
sum0 = 0;
|
|
||||||
sum1 = 0;
|
|
||||||
for (j = 0; j < len; j++) {
|
|
||||||
w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->dfx[i] * w0 + t->dfx[i + 1] * w1;
|
|
||||||
sum0 += data[j * 2] * w;
|
|
||||||
sum1 += data[j * 2 + 1] * w;
|
|
||||||
i += n;
|
|
||||||
}
|
|
||||||
|
|
||||||
*r0 = sum0;
|
|
||||||
*r1 = sum1;
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __FUNCTABLE_H__
|
|
||||||
#define __FUNCTABLE_H__
|
|
||||||
|
|
||||||
typedef void FunctableFunc (double *fx, double *dfx, double x, void *closure);
|
|
||||||
|
|
||||||
typedef struct _Functable Functable;
|
|
||||||
struct _Functable {
|
|
||||||
int length;
|
|
||||||
|
|
||||||
double offset;
|
|
||||||
double multiplier;
|
|
||||||
|
|
||||||
double inv_multiplier;
|
|
||||||
|
|
||||||
double *fx;
|
|
||||||
double *dfx;
|
|
||||||
};
|
|
||||||
|
|
||||||
Functable *functable_new (void);
|
|
||||||
void functable_setup (Functable *t);
|
|
||||||
void functable_free (Functable *t);
|
|
||||||
|
|
||||||
void functable_set_length (Functable *t, int length);
|
|
||||||
void functable_set_offset (Functable *t, double offset);
|
|
||||||
void functable_set_multiplier (Functable *t, double multiplier);
|
|
||||||
void functable_calculate (Functable *t, FunctableFunc func, void *closure);
|
|
||||||
void functable_calculate_multiply (Functable *t, FunctableFunc func, void *closure);
|
|
||||||
|
|
||||||
|
|
||||||
double functable_evaluate (Functable *t,double x);
|
|
||||||
|
|
||||||
double functable_fir(Functable *t,double x0,int n,double *data,int len);
|
|
||||||
void functable_fir2(Functable *t,double *r0, double *r1, double x0,
|
|
||||||
int n,double *data,int len);
|
|
||||||
|
|
||||||
void functable_func_sinc(double *fx, double *dfx, double x, void *closure);
|
|
||||||
void functable_func_boxcar(double *fx, double *dfx, double x, void *closure);
|
|
||||||
void functable_func_hanning(double *fx, double *dfx, double x, void *closure);
|
|
||||||
|
|
||||||
#endif /* __PRIVATE_H__ */
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,5 +1,6 @@
|
||||||
/* GStreamer
|
/* GStreamer
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
||||||
|
* Copyright (C) <2007-2008> Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Library General Public
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
@ -18,62 +19,72 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __AUDIORESAMPLE_H__
|
#ifndef __AUDIO_RESAMPLE_H__
|
||||||
#define __AUDIORESAMPLE_H__
|
#define __AUDIO_RESAMPLE_H__
|
||||||
|
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
#include <gst/base/gstbasetransform.h>
|
#include <gst/base/gstbasetransform.h>
|
||||||
|
#include <gst/audio/audio.h>
|
||||||
|
|
||||||
#include "resample.h"
|
#include "speex_resampler_wrapper.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define GST_TYPE_AUDIORESAMPLE \
|
#define GST_TYPE_AUDIO_RESAMPLE \
|
||||||
(gst_audioresample_get_type())
|
(gst_audio_resample_get_type())
|
||||||
#define GST_AUDIORESAMPLE(obj) \
|
#define GST_AUDIO_RESAMPLE(obj) \
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIORESAMPLE,GstAudioresample))
|
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_RESAMPLE,GstAudioResample))
|
||||||
#define GST_AUDIORESAMPLE_CLASS(klass) \
|
#define GST_AUDIO_RESAMPLE_CLASS(klass) \
|
||||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIORESAMPLE,GstAudioresampleClass))
|
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_RESAMPLE,GstAudioResampleClass))
|
||||||
#define GST_IS_AUDIORESAMPLE(obj) \
|
#define GST_IS_AUDIO_RESAMPLE(obj) \
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIORESAMPLE))
|
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_RESAMPLE))
|
||||||
#define GST_IS_AUDIORESAMPLE_CLASS(klass) \
|
#define GST_IS_AUDIO_RESAMPLE_CLASS(klass) \
|
||||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIORESAMPLE))
|
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_RESAMPLE))
|
||||||
|
|
||||||
typedef struct _GstAudioresample GstAudioresample;
|
typedef struct _GstAudioResample GstAudioResample;
|
||||||
typedef struct _GstAudioresampleClass GstAudioresampleClass;
|
typedef struct _GstAudioResampleClass GstAudioResampleClass;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GstAudioresample:
|
* GstAudioResample:
|
||||||
*
|
*
|
||||||
* Opaque data structure.
|
* Opaque data structure.
|
||||||
*/
|
*/
|
||||||
struct _GstAudioresample {
|
struct _GstAudioResample {
|
||||||
GstBaseTransform element;
|
GstBaseTransform element;
|
||||||
|
|
||||||
|
/* <private> */
|
||||||
|
|
||||||
GstCaps *srccaps, *sinkcaps;
|
GstCaps *srccaps, *sinkcaps;
|
||||||
|
|
||||||
gboolean passthru;
|
|
||||||
gboolean need_discont;
|
gboolean need_discont;
|
||||||
|
|
||||||
guint64 offset;
|
guint64 next_offset;
|
||||||
guint64 ts_offset;
|
|
||||||
GstClockTime next_ts;
|
GstClockTime next_ts;
|
||||||
GstClockTime prev_ts, prev_duration;
|
GstClockTime next_upstream_ts;
|
||||||
int channels;
|
|
||||||
|
|
||||||
int i_rate;
|
gint channels;
|
||||||
int o_rate;
|
gint inrate;
|
||||||
int filter_length;
|
gint outrate;
|
||||||
|
gint quality;
|
||||||
|
gint width;
|
||||||
|
gboolean fp;
|
||||||
|
|
||||||
ResampleState * resample;
|
guint8 *tmp_in;
|
||||||
|
guint tmp_in_size;
|
||||||
|
|
||||||
|
guint8 *tmp_out;
|
||||||
|
guint tmp_out_size;
|
||||||
|
|
||||||
|
SpeexResamplerState *state;
|
||||||
|
const SpeexResampleFuncs *funcs;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstAudioresampleClass {
|
struct _GstAudioResampleClass {
|
||||||
GstBaseTransformClass parent_class;
|
GstBaseTransformClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
GType gst_audioresample_get_type(void);
|
GType gst_audio_resample_get_type(void);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __AUDIORESAMPLE_H__ */
|
#endif /* __AUDIO_RESAMPLE_H__ */
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,128 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __RESAMPLE_H__
|
|
||||||
#define __RESAMPLE_H__
|
|
||||||
|
|
||||||
#include "functable.h"
|
|
||||||
#include "buffer.h"
|
|
||||||
|
|
||||||
#ifndef M_PI
|
|
||||||
#define M_PI 3.14159265358979323846
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#define rint(x) (floor((x)+0.5))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
RESAMPLE_FORMAT_S16 = 0,
|
|
||||||
RESAMPLE_FORMAT_S32,
|
|
||||||
RESAMPLE_FORMAT_F32,
|
|
||||||
RESAMPLE_FORMAT_F64
|
|
||||||
} ResampleFormat;
|
|
||||||
|
|
||||||
typedef void (*ResampleCallback) (void *);
|
|
||||||
|
|
||||||
typedef struct _ResampleState ResampleState;
|
|
||||||
|
|
||||||
struct _ResampleState {
|
|
||||||
/* parameters */
|
|
||||||
|
|
||||||
int n_channels;
|
|
||||||
ResampleFormat format;
|
|
||||||
|
|
||||||
int filter_length;
|
|
||||||
|
|
||||||
double i_rate;
|
|
||||||
double o_rate;
|
|
||||||
|
|
||||||
int method;
|
|
||||||
|
|
||||||
/* internal parameters */
|
|
||||||
|
|
||||||
int need_reinit;
|
|
||||||
|
|
||||||
double halftaps;
|
|
||||||
|
|
||||||
/* filter state */
|
|
||||||
|
|
||||||
unsigned char *o_buf;
|
|
||||||
int o_size;
|
|
||||||
|
|
||||||
AudioresampleBufferQueue *queue;
|
|
||||||
int eos;
|
|
||||||
int started;
|
|
||||||
|
|
||||||
int sample_size;
|
|
||||||
|
|
||||||
unsigned char *buffer;
|
|
||||||
int buffer_len;
|
|
||||||
int buffer_filled;
|
|
||||||
|
|
||||||
double i_start;
|
|
||||||
double o_start;
|
|
||||||
|
|
||||||
double i_inc;
|
|
||||||
double o_inc;
|
|
||||||
|
|
||||||
double sinc_scale;
|
|
||||||
|
|
||||||
double i_end;
|
|
||||||
double o_end;
|
|
||||||
|
|
||||||
int i_samples;
|
|
||||||
int o_samples;
|
|
||||||
|
|
||||||
//void *i_buf;
|
|
||||||
|
|
||||||
Functable *ft;
|
|
||||||
|
|
||||||
double *out_tmp;
|
|
||||||
};
|
|
||||||
|
|
||||||
void resample_init (void);
|
|
||||||
void resample_cleanup (void);
|
|
||||||
|
|
||||||
ResampleState *resample_new (void);
|
|
||||||
void resample_free (ResampleState *state);
|
|
||||||
|
|
||||||
void resample_add_input_data (ResampleState * r, void *data, int size,
|
|
||||||
ResampleCallback free_func, void *closure);
|
|
||||||
void resample_input_eos (ResampleState *r);
|
|
||||||
void resample_input_flush (ResampleState *r);
|
|
||||||
void resample_input_pushthrough (ResampleState *r);
|
|
||||||
|
|
||||||
int resample_get_output_size_for_input (ResampleState * r, int size);
|
|
||||||
int resample_get_input_size_for_output (ResampleState * r, int size);
|
|
||||||
|
|
||||||
int resample_get_output_size (ResampleState *r);
|
|
||||||
int resample_get_output_data (ResampleState *r, void *data, int size);
|
|
||||||
|
|
||||||
void resample_set_filter_length (ResampleState *r, int length);
|
|
||||||
void resample_set_input_rate (ResampleState *r, double rate);
|
|
||||||
void resample_set_output_rate (ResampleState *r, double rate);
|
|
||||||
void resample_set_n_channels (ResampleState *r, int n_channels);
|
|
||||||
void resample_set_format (ResampleState *r, ResampleFormat format);
|
|
||||||
void resample_set_method (ResampleState *r, int method);
|
|
||||||
int resample_format_size (ResampleFormat format);
|
|
||||||
|
|
||||||
#endif /* __RESAMPLE_H__ */
|
|
||||||
|
|
|
@ -1,209 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David A. Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <liboil/liboil.h>
|
|
||||||
|
|
||||||
#include "resample.h"
|
|
||||||
#include "buffer.h"
|
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
|
|
||||||
static double
|
|
||||||
resample_sinc_window (double x, double halfwidth, double scale)
|
|
||||||
{
|
|
||||||
double y;
|
|
||||||
|
|
||||||
if (x == 0)
|
|
||||||
return 1.0;
|
|
||||||
if (x < -halfwidth || x > halfwidth)
|
|
||||||
return 0.0;
|
|
||||||
|
|
||||||
y = sin (x * M_PI * scale) / (x * M_PI * scale) * scale;
|
|
||||||
|
|
||||||
x /= halfwidth;
|
|
||||||
y *= (1 - x * x) * (1 - x * x);
|
|
||||||
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
resample_scale_chunk (ResampleState * r)
|
|
||||||
{
|
|
||||||
if (r->need_reinit) {
|
|
||||||
RESAMPLE_DEBUG ("sample size %d", r->sample_size);
|
|
||||||
|
|
||||||
if (r->buffer)
|
|
||||||
free (r->buffer);
|
|
||||||
r->buffer_len = r->sample_size * 1000;
|
|
||||||
r->buffer = malloc (r->buffer_len);
|
|
||||||
memset (r->buffer, 0, r->buffer_len);
|
|
||||||
|
|
||||||
r->i_inc = r->o_rate / r->i_rate;
|
|
||||||
r->o_inc = r->i_rate / r->o_rate;
|
|
||||||
RESAMPLE_DEBUG ("i_inc %g o_inc %g", r->i_inc, r->o_inc);
|
|
||||||
|
|
||||||
r->i_start = -r->i_inc * r->filter_length;
|
|
||||||
|
|
||||||
r->need_reinit = 0;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (r->i_inc < 1.0) {
|
|
||||||
r->sinc_scale = r->i_inc;
|
|
||||||
if (r->sinc_scale == 0.5) {
|
|
||||||
/* strange things happen at integer multiples */
|
|
||||||
r->sinc_scale = 1.0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
r->sinc_scale = 1.0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
r->sinc_scale = 1.0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
while (r->o_size > 0) {
|
|
||||||
double midpoint;
|
|
||||||
int i;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
RESAMPLE_DEBUG ("i_start %g", r->i_start);
|
|
||||||
midpoint = r->i_start + (r->filter_length - 1) * 0.5 * r->i_inc;
|
|
||||||
if (midpoint > 0.5 * r->i_inc) {
|
|
||||||
RESAMPLE_ERROR ("inconsistent state");
|
|
||||||
}
|
|
||||||
while (midpoint < -0.5 * r->i_inc) {
|
|
||||||
AudioresampleBuffer *buffer;
|
|
||||||
|
|
||||||
buffer = audioresample_buffer_queue_pull (r->queue, r->sample_size);
|
|
||||||
if (buffer == NULL) {
|
|
||||||
RESAMPLE_ERROR ("buffer_queue_pull returned NULL");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
r->i_start += r->i_inc;
|
|
||||||
RESAMPLE_DEBUG ("pulling (i_start = %g)", r->i_start);
|
|
||||||
|
|
||||||
midpoint += r->i_inc;
|
|
||||||
memmove (r->buffer, r->buffer + r->sample_size,
|
|
||||||
r->buffer_len - r->sample_size);
|
|
||||||
|
|
||||||
memcpy (r->buffer + r->buffer_len - r->sample_size, buffer->data,
|
|
||||||
r->sample_size);
|
|
||||||
audioresample_buffer_unref (buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (r->format) {
|
|
||||||
case RESAMPLE_FORMAT_S16:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(int16_t *) (r->buffer + i * sizeof (int16_t) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc +=
|
|
||||||
resample_sinc_window (offset, r->filter_length * 0.5,
|
|
||||||
r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
if (acc < -32768.0)
|
|
||||||
acc = -32768.0;
|
|
||||||
if (acc > 32767.0)
|
|
||||||
acc = 32767.0;
|
|
||||||
|
|
||||||
*(int16_t *) (r->o_buf + i * sizeof (int16_t)) = rint (acc);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RESAMPLE_FORMAT_S32:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(int32_t *) (r->buffer + i * sizeof (int32_t) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc +=
|
|
||||||
resample_sinc_window (offset, r->filter_length * 0.5,
|
|
||||||
r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
if (acc < -2147483648.0)
|
|
||||||
acc = -2147483648.0;
|
|
||||||
if (acc > 2147483647.0)
|
|
||||||
acc = 2147483647.0;
|
|
||||||
|
|
||||||
*(int32_t *) (r->o_buf + i * sizeof (int32_t)) = rint (acc);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RESAMPLE_FORMAT_F32:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(float *) (r->buffer + i * sizeof (float) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc +=
|
|
||||||
resample_sinc_window (offset, r->filter_length * 0.5,
|
|
||||||
r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
*(float *) (r->o_buf + i * sizeof (float)) = acc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RESAMPLE_FORMAT_F64:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(double *) (r->buffer + i * sizeof (double) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc +=
|
|
||||||
resample_sinc_window (offset, r->filter_length * 0.5,
|
|
||||||
r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
*(double *) (r->o_buf + i * sizeof (double)) = acc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
r->i_start -= 1.0;
|
|
||||||
r->o_buf += r->sample_size;
|
|
||||||
r->o_size -= r->sample_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,271 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David A. Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <liboil/liboil.h>
|
|
||||||
|
|
||||||
#include "resample.h"
|
|
||||||
#include "buffer.h"
|
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
func_sinc (double *fx, double *dfx, double x, void *closure)
|
|
||||||
{
|
|
||||||
//double scale = *(double *)closure;
|
|
||||||
double scale = M_PI;
|
|
||||||
|
|
||||||
if (x == 0) {
|
|
||||||
*fx = 1;
|
|
||||||
*dfx = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
x *= scale;
|
|
||||||
*fx = sin (x) / x;
|
|
||||||
*dfx = scale * (cos (x) - sin (x) / x) / x;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
func_hanning (double *fx, double *dfx, double x, void *closure)
|
|
||||||
{
|
|
||||||
double width = *(double *) closure;
|
|
||||||
|
|
||||||
if (x < width && x > -width) {
|
|
||||||
x /= width;
|
|
||||||
*fx = (1 - x * x) * (1 - x * x);
|
|
||||||
*dfx = -2 * 2 * x / width * (1 - x * x);
|
|
||||||
} else {
|
|
||||||
*fx = 0;
|
|
||||||
*dfx = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static double
|
|
||||||
resample_sinc_window (double x, double halfwidth, double scale)
|
|
||||||
{
|
|
||||||
double y;
|
|
||||||
|
|
||||||
if (x == 0)
|
|
||||||
return 1.0;
|
|
||||||
if (x < -halfwidth || x > halfwidth)
|
|
||||||
return 0.0;
|
|
||||||
|
|
||||||
y = sin (x * M_PI * scale) / (x * M_PI * scale) * scale;
|
|
||||||
|
|
||||||
x /= halfwidth;
|
|
||||||
y *= (1 - x * x) * (1 - x * x);
|
|
||||||
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void
|
|
||||||
functable_test (Functable * ft, double halfwidth)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (i = 0; i < 100; i++) {
|
|
||||||
x = i * 0.1;
|
|
||||||
printf ("%d %g %g\n", i, resample_sinc_window (x, halfwidth, 1.0),
|
|
||||||
functable_evaluate (ft, x));
|
|
||||||
}
|
|
||||||
exit (0);
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
resample_scale_functable (ResampleState * r)
|
|
||||||
{
|
|
||||||
if (r->need_reinit) {
|
|
||||||
double hanning_width;
|
|
||||||
|
|
||||||
RESAMPLE_DEBUG ("sample size %d", r->sample_size);
|
|
||||||
|
|
||||||
if (r->buffer)
|
|
||||||
free (r->buffer);
|
|
||||||
r->buffer_len = r->sample_size * r->filter_length;
|
|
||||||
r->buffer = malloc (r->buffer_len);
|
|
||||||
memset (r->buffer, 0, r->buffer_len);
|
|
||||||
|
|
||||||
r->i_inc = r->o_rate / r->i_rate;
|
|
||||||
r->o_inc = r->i_rate / r->o_rate;
|
|
||||||
RESAMPLE_DEBUG ("i_inc %g o_inc %g", r->i_inc, r->o_inc);
|
|
||||||
|
|
||||||
r->i_start = -r->i_inc * r->filter_length;
|
|
||||||
|
|
||||||
if (r->ft) {
|
|
||||||
functable_free (r->ft);
|
|
||||||
}
|
|
||||||
r->ft = functable_new ();
|
|
||||||
functable_set_length (r->ft, r->filter_length * 16);
|
|
||||||
functable_set_offset (r->ft, -r->filter_length / 2);
|
|
||||||
functable_set_multiplier (r->ft, 1 / 16.0);
|
|
||||||
|
|
||||||
hanning_width = r->filter_length / 2;
|
|
||||||
functable_calculate (r->ft, func_sinc, NULL);
|
|
||||||
functable_calculate_multiply (r->ft, func_hanning, &hanning_width);
|
|
||||||
|
|
||||||
//functable_test(r->ft, 0.5 * r->filter_length);
|
|
||||||
#if 0
|
|
||||||
if (r->i_inc < 1.0) {
|
|
||||||
r->sinc_scale = r->i_inc;
|
|
||||||
if (r->sinc_scale == 0.5) {
|
|
||||||
/* strange things happen at integer multiples */
|
|
||||||
r->sinc_scale = 1.0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
r->sinc_scale = 1.0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
r->sinc_scale = 1.0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
r->need_reinit = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (r->o_size > 0) {
|
|
||||||
double midpoint;
|
|
||||||
int i;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
RESAMPLE_DEBUG ("i_start %g", r->i_start);
|
|
||||||
midpoint = r->i_start + (r->filter_length - 1) * 0.5 * r->i_inc;
|
|
||||||
if (midpoint > 0.5 * r->i_inc) {
|
|
||||||
RESAMPLE_ERROR ("inconsistent state");
|
|
||||||
}
|
|
||||||
while (midpoint < -0.5 * r->i_inc) {
|
|
||||||
AudioresampleBuffer *buffer;
|
|
||||||
|
|
||||||
buffer = audioresample_buffer_queue_pull (r->queue, r->sample_size);
|
|
||||||
if (buffer == NULL) {
|
|
||||||
RESAMPLE_ERROR ("buffer_queue_pull returned NULL");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
r->i_start += r->i_inc;
|
|
||||||
RESAMPLE_DEBUG ("pulling (i_start = %g)", r->i_start);
|
|
||||||
|
|
||||||
midpoint += r->i_inc;
|
|
||||||
memmove (r->buffer, r->buffer + r->sample_size,
|
|
||||||
r->buffer_len - r->sample_size);
|
|
||||||
|
|
||||||
memcpy (r->buffer + r->buffer_len - r->sample_size, buffer->data,
|
|
||||||
r->sample_size);
|
|
||||||
audioresample_buffer_unref (buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (r->format) {
|
|
||||||
case RESAMPLE_FORMAT_S16:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(int16_t *) (r->buffer + i * sizeof (int16_t) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc += functable_evaluate (r->ft, offset) * x;
|
|
||||||
//acc += resample_sinc_window (offset, r->filter_length * 0.5, r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
if (acc < -32768.0)
|
|
||||||
acc = -32768.0;
|
|
||||||
if (acc > 32767.0)
|
|
||||||
acc = 32767.0;
|
|
||||||
|
|
||||||
*(int16_t *) (r->o_buf + i * sizeof (int16_t)) = rint (acc);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RESAMPLE_FORMAT_S32:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(int32_t *) (r->buffer + i * sizeof (int32_t) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc += functable_evaluate (r->ft, offset) * x;
|
|
||||||
//acc += resample_sinc_window (offset, r->filter_length * 0.5, r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
if (acc < -2147483648.0)
|
|
||||||
acc = -2147483648.0;
|
|
||||||
if (acc > 2147483647.0)
|
|
||||||
acc = 2147483647.0;
|
|
||||||
|
|
||||||
*(int32_t *) (r->o_buf + i * sizeof (int32_t)) = rint (acc);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RESAMPLE_FORMAT_F32:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(float *) (r->buffer + i * sizeof (float) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc += functable_evaluate (r->ft, offset) * x;
|
|
||||||
//acc += resample_sinc_window (offset, r->filter_length * 0.5, r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
*(float *) (r->o_buf + i * sizeof (float)) = acc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RESAMPLE_FORMAT_F64:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(double *) (r->buffer + i * sizeof (double) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc += functable_evaluate (r->ft, offset) * x;
|
|
||||||
//acc += resample_sinc_window (offset, r->filter_length * 0.5, r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
*(double *) (r->o_buf + i * sizeof (double)) = acc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
r->i_start -= 1.0;
|
|
||||||
r->o_buf += r->sample_size;
|
|
||||||
r->o_size -= r->sample_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,223 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David A. Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <liboil/liboil.h>
|
|
||||||
|
|
||||||
#include "resample.h"
|
|
||||||
#include "buffer.h"
|
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
|
|
||||||
static double
|
|
||||||
resample_sinc_window (double x, double halfwidth, double scale)
|
|
||||||
{
|
|
||||||
double y;
|
|
||||||
|
|
||||||
if (x == 0)
|
|
||||||
return 1.0;
|
|
||||||
if (x < -halfwidth || x > halfwidth)
|
|
||||||
return 0.0;
|
|
||||||
|
|
||||||
y = sin (x * M_PI * scale) / (x * M_PI * scale) * scale;
|
|
||||||
|
|
||||||
x /= halfwidth;
|
|
||||||
y *= (1 - x * x) * (1 - x * x);
|
|
||||||
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
resample_scale_ref (ResampleState * r)
|
|
||||||
{
|
|
||||||
if (r->need_reinit) {
|
|
||||||
RESAMPLE_DEBUG ("sample size %d", r->sample_size);
|
|
||||||
|
|
||||||
if (r->buffer)
|
|
||||||
free (r->buffer);
|
|
||||||
r->buffer_len = r->sample_size * r->filter_length;
|
|
||||||
r->buffer = malloc (r->buffer_len);
|
|
||||||
memset (r->buffer, 0, r->buffer_len);
|
|
||||||
r->buffer_filled = 0;
|
|
||||||
|
|
||||||
r->i_inc = r->o_rate / r->i_rate;
|
|
||||||
r->o_inc = r->i_rate / r->o_rate;
|
|
||||||
RESAMPLE_DEBUG ("i_inc %g o_inc %g", r->i_inc, r->o_inc);
|
|
||||||
|
|
||||||
r->i_start = -r->i_inc * r->filter_length;
|
|
||||||
|
|
||||||
r->need_reinit = 0;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (r->i_inc < 1.0) {
|
|
||||||
r->sinc_scale = r->i_inc;
|
|
||||||
if (r->sinc_scale == 0.5) {
|
|
||||||
/* strange things happen at integer multiples */
|
|
||||||
r->sinc_scale = 1.0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
r->sinc_scale = 1.0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
r->sinc_scale = 1.0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
RESAMPLE_DEBUG ("asked to resample %d bytes", r->o_size);
|
|
||||||
RESAMPLE_DEBUG ("%d bytes in queue",
|
|
||||||
audioresample_buffer_queue_get_depth (r->queue));
|
|
||||||
|
|
||||||
while (r->o_size >= r->sample_size) {
|
|
||||||
double midpoint;
|
|
||||||
int i;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
midpoint = r->i_start + (r->filter_length - 1) * 0.5 * r->i_inc;
|
|
||||||
RESAMPLE_DEBUG
|
|
||||||
("still need to output %d bytes, %d input left, i_start %g, midpoint %f",
|
|
||||||
r->o_size, audioresample_buffer_queue_get_depth (r->queue), r->i_start,
|
|
||||||
midpoint);
|
|
||||||
if (midpoint > 0.5 * r->i_inc) {
|
|
||||||
RESAMPLE_ERROR ("inconsistent state");
|
|
||||||
}
|
|
||||||
while (midpoint < -0.5 * r->i_inc) {
|
|
||||||
AudioresampleBuffer *buffer;
|
|
||||||
|
|
||||||
RESAMPLE_DEBUG ("midpoint %f < %f, r->i_inc %f", midpoint,
|
|
||||||
-0.5 * r->i_inc, r->i_inc);
|
|
||||||
buffer = audioresample_buffer_queue_pull (r->queue, r->sample_size);
|
|
||||||
if (buffer == NULL) {
|
|
||||||
/* FIXME: for the first buffer, this isn't necessarily an error,
|
|
||||||
* since because of the filter length we'll output less buffers.
|
|
||||||
* deal with that so we don't print to console */
|
|
||||||
RESAMPLE_ERROR ("buffer_queue_pull returned NULL");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
r->i_start += r->i_inc;
|
|
||||||
RESAMPLE_DEBUG ("pulling (i_start = %g)", r->i_start);
|
|
||||||
|
|
||||||
midpoint += r->i_inc;
|
|
||||||
memmove (r->buffer, r->buffer + r->sample_size,
|
|
||||||
r->buffer_len - r->sample_size);
|
|
||||||
|
|
||||||
memcpy (r->buffer + r->buffer_len - r->sample_size, buffer->data,
|
|
||||||
r->sample_size);
|
|
||||||
r->buffer_filled = MIN (r->buffer_filled + r->sample_size, r->buffer_len);
|
|
||||||
|
|
||||||
audioresample_buffer_unref (buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (r->format) {
|
|
||||||
case RESAMPLE_FORMAT_S16:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(int16_t *) (r->buffer + i * sizeof (int16_t) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc +=
|
|
||||||
resample_sinc_window (offset, r->filter_length * 0.5,
|
|
||||||
r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
if (acc < -32768.0)
|
|
||||||
acc = -32768.0;
|
|
||||||
if (acc > 32767.0)
|
|
||||||
acc = 32767.0;
|
|
||||||
|
|
||||||
*(int16_t *) (r->o_buf + i * sizeof (int16_t)) = rint (acc);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RESAMPLE_FORMAT_S32:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(int32_t *) (r->buffer + i * sizeof (int32_t) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc +=
|
|
||||||
resample_sinc_window (offset, r->filter_length * 0.5,
|
|
||||||
r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
if (acc < -2147483648.0)
|
|
||||||
acc = -2147483648.0;
|
|
||||||
if (acc > 2147483647.0)
|
|
||||||
acc = 2147483647.0;
|
|
||||||
|
|
||||||
*(int32_t *) (r->o_buf + i * sizeof (int32_t)) = rint (acc);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RESAMPLE_FORMAT_F32:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(float *) (r->buffer + i * sizeof (float) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc +=
|
|
||||||
resample_sinc_window (offset, r->filter_length * 0.5,
|
|
||||||
r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
*(float *) (r->o_buf + i * sizeof (float)) = acc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RESAMPLE_FORMAT_F64:
|
|
||||||
for (i = 0; i < r->n_channels; i++) {
|
|
||||||
double acc = 0;
|
|
||||||
double offset;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
offset = (r->i_start + j * r->i_inc) * r->o_inc;
|
|
||||||
x = *(double *) (r->buffer + i * sizeof (double) +
|
|
||||||
j * r->sample_size);
|
|
||||||
acc +=
|
|
||||||
resample_sinc_window (offset, r->filter_length * 0.5,
|
|
||||||
r->sinc_scale) * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
*(double *) (r->o_buf + i * sizeof (double)) = acc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
r->i_start -= 1.0;
|
|
||||||
r->o_buf += r->sample_size;
|
|
||||||
r->o_size -= r->sample_size;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
plugin_LTLIBRARIES = libgstaudioresample.la
|
|
||||||
|
|
||||||
libgstaudioresample_la_SOURCES = \
|
|
||||||
gstspeexresample.c \
|
|
||||||
speex_resampler_int.c \
|
|
||||||
speex_resampler_float.c \
|
|
||||||
speex_resampler_double.c
|
|
||||||
|
|
||||||
libgstaudioresample_la_CFLAGS = \
|
|
||||||
$(GST_PLUGINS_BASE_CFLAGS) \
|
|
||||||
$(GST_BASE_CFLAGS) \
|
|
||||||
$(GST_CFLAGS) \
|
|
||||||
$(LIBOIL_CFLAGS)
|
|
||||||
|
|
||||||
libgstaudioresample_la_LIBADD = \
|
|
||||||
$(GST_PLUGINS_BASE_LIBS) \
|
|
||||||
$(GST_BASE_LIBS) \
|
|
||||||
$(GST_LIBS) \
|
|
||||||
$(LIBOIL_LIBS) \
|
|
||||||
$(LIBM)
|
|
||||||
|
|
||||||
libgstaudioresample_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
|
||||||
libgstaudioresample_la_LIBTOOLFLAGS = --tag=disable-static
|
|
||||||
|
|
||||||
noinst_HEADERS = \
|
|
||||||
arch.h \
|
|
||||||
fixed_arm4.h \
|
|
||||||
fixed_arm5e.h \
|
|
||||||
fixed_bfin.h \
|
|
||||||
fixed_debug.h \
|
|
||||||
fixed_generic.h \
|
|
||||||
gstspeexresample.h \
|
|
||||||
resample.c \
|
|
||||||
resample_sse.h \
|
|
||||||
speex_resampler.h \
|
|
||||||
speex_resampler_wrapper.h
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,90 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
* Copyright (C) <2007-2008> Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __SPEEX_RESAMPLE_H__
|
|
||||||
#define __SPEEX_RESAMPLE_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gst/base/gstbasetransform.h>
|
|
||||||
#include <gst/audio/audio.h>
|
|
||||||
|
|
||||||
#include "speex_resampler_wrapper.h"
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_SPEEX_RESAMPLE \
|
|
||||||
(gst_speex_resample_get_type())
|
|
||||||
#define GST_SPEEX_RESAMPLE(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPEEX_RESAMPLE,GstSpeexResample))
|
|
||||||
#define GST_SPEEX_RESAMPLE_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPEEX_RESAMPLE,GstSpeexResampleClass))
|
|
||||||
#define GST_IS_SPEEX_RESAMPLE(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPEEX_RESAMPLE))
|
|
||||||
#define GST_IS_SPEEX_RESAMPLE_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPEEX_RESAMPLE))
|
|
||||||
|
|
||||||
typedef struct _GstSpeexResample GstSpeexResample;
|
|
||||||
typedef struct _GstSpeexResampleClass GstSpeexResampleClass;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GstSpeexResample:
|
|
||||||
*
|
|
||||||
* Opaque data structure.
|
|
||||||
*/
|
|
||||||
struct _GstSpeexResample {
|
|
||||||
GstBaseTransform element;
|
|
||||||
|
|
||||||
/* <private> */
|
|
||||||
|
|
||||||
GstCaps *srccaps, *sinkcaps;
|
|
||||||
|
|
||||||
gboolean need_discont;
|
|
||||||
|
|
||||||
guint64 next_offset;
|
|
||||||
GstClockTime next_ts;
|
|
||||||
GstClockTime next_upstream_ts;
|
|
||||||
|
|
||||||
gint channels;
|
|
||||||
gint inrate;
|
|
||||||
gint outrate;
|
|
||||||
gint quality;
|
|
||||||
gint width;
|
|
||||||
gboolean fp;
|
|
||||||
|
|
||||||
guint8 *tmp_in;
|
|
||||||
guint tmp_in_size;
|
|
||||||
|
|
||||||
guint8 *tmp_out;
|
|
||||||
guint tmp_out_size;
|
|
||||||
|
|
||||||
SpeexResamplerState *state;
|
|
||||||
const SpeexResampleFuncs *funcs;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GstSpeexResampleClass {
|
|
||||||
GstBaseTransformClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
GType gst_speex_resample_get_type(void);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __SPEEX_RESAMPLE_H__ */
|
|
File diff suppressed because it is too large
Load diff
|
@ -412,6 +412,7 @@ mid_type_find (GstTypeFind * tf, gpointer unused)
|
||||||
&& data[3] == 'd')
|
&& data[3] == 'd')
|
||||||
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MID_CAPS);
|
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MID_CAPS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** audio/mobile-xmf ***/
|
/*** audio/mobile-xmf ***/
|
||||||
|
|
||||||
static GstStaticCaps mxmf_caps = GST_STATIC_CAPS ("audio/mobile-xmf");
|
static GstStaticCaps mxmf_caps = GST_STATIC_CAPS ("audio/mobile-xmf");
|
||||||
|
@ -422,21 +423,21 @@ mxmf_type_find (GstTypeFind * tf, gpointer unused)
|
||||||
{
|
{
|
||||||
guint8 *data = NULL;
|
guint8 *data = NULL;
|
||||||
|
|
||||||
/* Search FileId "XMF_" 4 bytes */
|
/* Search FileId "XMF_" 4 bytes */
|
||||||
data = gst_type_find_peek (tf, 0, 4);
|
data = gst_type_find_peek (tf, 0, 4);
|
||||||
if (data && data[0] == 'X' && data[1] == 'M' && data[2] == 'F'
|
if (data && data[0] == 'X' && data[1] == 'M' && data[2] == 'F'
|
||||||
&& data[3] == '_') {
|
&& data[3] == '_') {
|
||||||
/* Search Format version "2.00" 4 bytes */
|
/* Search Format version "2.00" 4 bytes */
|
||||||
data = gst_type_find_peek (tf, 4, 4);
|
data = gst_type_find_peek (tf, 4, 4);
|
||||||
if (data && data[0] == '2' && data[1] == '.' && data[2] == '0'
|
if (data && data[0] == '2' && data[1] == '.' && data[2] == '0'
|
||||||
&& data[3] == '0') {
|
&& data[3] == '0') {
|
||||||
/* Search TypeId 2 1 byte */
|
/* Search TypeId 2 1 byte */
|
||||||
data = gst_type_find_peek (tf, 11, 1);
|
data = gst_type_find_peek (tf, 11, 1);
|
||||||
if (data && data[0] == 2 ) {
|
if (data && data[0] == 2) {
|
||||||
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MXMF_CAPS);
|
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MXMF_CAPS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3208,8 +3209,8 @@ plugin_init (GstPlugin * plugin)
|
||||||
#endif
|
#endif
|
||||||
TYPE_FIND_REGISTER (plugin, "audio/midi", GST_RANK_PRIMARY, mid_type_find,
|
TYPE_FIND_REGISTER (plugin, "audio/midi", GST_RANK_PRIMARY, mid_type_find,
|
||||||
mid_exts, MID_CAPS, NULL, NULL);
|
mid_exts, MID_CAPS, NULL, NULL);
|
||||||
TYPE_FIND_REGISTER (plugin, "audio/mobile-xmf", GST_RANK_PRIMARY, mxmf_type_find,
|
TYPE_FIND_REGISTER (plugin, "audio/mobile-xmf", GST_RANK_PRIMARY,
|
||||||
mxmf_exts, MXMF_CAPS, NULL, NULL);
|
mxmf_type_find, mxmf_exts, MXMF_CAPS, NULL, NULL);
|
||||||
TYPE_FIND_REGISTER (plugin, "video/x-fli", GST_RANK_MARGINAL, flx_type_find,
|
TYPE_FIND_REGISTER (plugin, "video/x-fli", GST_RANK_MARGINAL, flx_type_find,
|
||||||
flx_exts, FLX_CAPS, NULL, NULL);
|
flx_exts, FLX_CAPS, NULL, NULL);
|
||||||
TYPE_FIND_REGISTER (plugin, "application/x-id3v2", GST_RANK_PRIMARY + 103,
|
TYPE_FIND_REGISTER (plugin, "application/x-id3v2", GST_RANK_PRIMARY + 103,
|
||||||
|
@ -3241,8 +3242,8 @@ plugin_init (GstPlugin * plugin)
|
||||||
mpeg4_video_type_find, m4v_exts, MPEG_VIDEO_CAPS, NULL, NULL);
|
mpeg4_video_type_find, m4v_exts, MPEG_VIDEO_CAPS, NULL, NULL);
|
||||||
TYPE_FIND_REGISTER (plugin, "video/x-h264", GST_RANK_PRIMARY,
|
TYPE_FIND_REGISTER (plugin, "video/x-h264", GST_RANK_PRIMARY,
|
||||||
h264_video_type_find, h264_exts, MPEG_VIDEO_CAPS, NULL, NULL);
|
h264_video_type_find, h264_exts, MPEG_VIDEO_CAPS, NULL, NULL);
|
||||||
TYPE_FIND_REGISTER (plugin, "video/x-nuv", GST_RANK_SECONDARY,
|
TYPE_FIND_REGISTER (plugin, "video/x-nuv", GST_RANK_SECONDARY, nuv_type_find,
|
||||||
nuv_type_find, nuv_exts, NUV_CAPS, NULL, NULL);
|
nuv_exts, NUV_CAPS, NULL, NULL);
|
||||||
|
|
||||||
/* ISO formats */
|
/* ISO formats */
|
||||||
TYPE_FIND_REGISTER (plugin, "audio/x-m4a", GST_RANK_PRIMARY, m4a_type_find,
|
TYPE_FIND_REGISTER (plugin, "audio/x-m4a", GST_RANK_PRIMARY, m4a_type_find,
|
||||||
|
|
|
@ -91,6 +91,7 @@ check_PROGRAMS = \
|
||||||
elements/adder \
|
elements/adder \
|
||||||
elements/audioconvert \
|
elements/audioconvert \
|
||||||
elements/audiorate \
|
elements/audiorate \
|
||||||
|
elements/audioresample \
|
||||||
elements/audiotestsrc \
|
elements/audiotestsrc \
|
||||||
elements/decodebin \
|
elements/decodebin \
|
||||||
elements/ffmpegcolorspace \
|
elements/ffmpegcolorspace \
|
||||||
|
@ -99,7 +100,6 @@ check_PROGRAMS = \
|
||||||
elements/multifdsink \
|
elements/multifdsink \
|
||||||
elements/playbin \
|
elements/playbin \
|
||||||
$(check_subparse) \
|
$(check_subparse) \
|
||||||
elements/speexresample \
|
|
||||||
elements/videorate \
|
elements/videorate \
|
||||||
elements/videotestsrc \
|
elements/videotestsrc \
|
||||||
elements/volume \
|
elements/volume \
|
||||||
|
@ -241,12 +241,12 @@ elements_decodebin_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
|
||||||
elements_subparse_LDADD = $(LDADD)
|
elements_subparse_LDADD = $(LDADD)
|
||||||
elements_subparse_CFLAGS = $(CFLAGS) $(AM_CFLAGS)
|
elements_subparse_CFLAGS = $(CFLAGS) $(AM_CFLAGS)
|
||||||
|
|
||||||
elements_speexresample_CFLAGS = \
|
elements_audioresample_CFLAGS = \
|
||||||
$(GST_PLUGINS_BASE_CFLAGS) \
|
$(GST_PLUGINS_BASE_CFLAGS) \
|
||||||
$(GST_BASE_CFLAGS) \
|
$(GST_BASE_CFLAGS) \
|
||||||
$(AM_CFLAGS)
|
$(AM_CFLAGS)
|
||||||
|
|
||||||
elements_speexresample_LDADD = \
|
elements_audioresample_LDADD = \
|
||||||
$(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
|
$(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
|
||||||
$(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
|
$(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
|
||||||
$(GST_BASE_LIBS) \
|
$(GST_BASE_LIBS) \
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* GStreamer
|
/* GStreamer
|
||||||
*
|
*
|
||||||
* unit test for audioresample
|
* unit test for audioresample, based on the audioresample unit test
|
||||||
*
|
*
|
||||||
* Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
|
* Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
* Copyright (C) <2006> Tim-Philipp Müller <tim at centricular net>
|
* Copyright (C) <2006> Tim-Philipp Müller <tim at centricular net>
|
||||||
|
@ -25,13 +25,21 @@
|
||||||
|
|
||||||
#include <gst/check/gstcheck.h>
|
#include <gst/check/gstcheck.h>
|
||||||
|
|
||||||
|
#include <gst/audio/audio.h>
|
||||||
|
|
||||||
/* For ease of programming we use globals to keep refs for our floating
|
/* For ease of programming we use globals to keep refs for our floating
|
||||||
* src and sink pads we create; otherwise we always have to do get_pad,
|
* src and sink pads we create; otherwise we always have to do get_pad,
|
||||||
* get_peer, and then remove references in every test function */
|
* get_peer, and then remove references in every test function */
|
||||||
static GstPad *mysrcpad, *mysinkpad;
|
static GstPad *mysrcpad, *mysinkpad;
|
||||||
|
|
||||||
|
#define RESAMPLE_CAPS_FLOAT \
|
||||||
|
"audio/x-raw-float, " \
|
||||||
|
"channels = (int) [ 1, MAX ], " \
|
||||||
|
"rate = (int) [ 1, MAX ], " \
|
||||||
|
"endianness = (int) BYTE_ORDER, " \
|
||||||
|
"width = (int) { 32, 64 }"
|
||||||
|
|
||||||
#define RESAMPLE_CAPS_TEMPLATE_STRING \
|
#define RESAMPLE_CAPS_INT \
|
||||||
"audio/x-raw-int, " \
|
"audio/x-raw-int, " \
|
||||||
"channels = (int) [ 1, MAX ], " \
|
"channels = (int) [ 1, MAX ], " \
|
||||||
"rate = (int) [ 1, MAX ], " \
|
"rate = (int) [ 1, MAX ], " \
|
||||||
|
@ -40,6 +48,10 @@ static GstPad *mysrcpad, *mysinkpad;
|
||||||
"depth = (int) 16, " \
|
"depth = (int) 16, " \
|
||||||
"signed = (bool) TRUE"
|
"signed = (bool) TRUE"
|
||||||
|
|
||||||
|
#define RESAMPLE_CAPS_TEMPLATE_STRING \
|
||||||
|
RESAMPLE_CAPS_FLOAT " ; " \
|
||||||
|
RESAMPLE_CAPS_INT
|
||||||
|
|
||||||
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
GST_PAD_SINK,
|
GST_PAD_SINK,
|
||||||
GST_PAD_ALWAYS,
|
GST_PAD_ALWAYS,
|
||||||
|
@ -52,7 +64,8 @@ static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
|
||||||
);
|
);
|
||||||
|
|
||||||
static GstElement *
|
static GstElement *
|
||||||
setup_audioresample (int channels, int inrate, int outrate)
|
setup_audioresample (int channels, int inrate, int outrate, int width,
|
||||||
|
gboolean fp)
|
||||||
{
|
{
|
||||||
GstElement *audioresample;
|
GstElement *audioresample;
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
@ -61,10 +74,15 @@ setup_audioresample (int channels, int inrate, int outrate)
|
||||||
GST_DEBUG ("setup_audioresample");
|
GST_DEBUG ("setup_audioresample");
|
||||||
audioresample = gst_check_setup_element ("audioresample");
|
audioresample = gst_check_setup_element ("audioresample");
|
||||||
|
|
||||||
caps = gst_caps_from_string (RESAMPLE_CAPS_TEMPLATE_STRING);
|
if (fp)
|
||||||
|
caps = gst_caps_from_string (RESAMPLE_CAPS_FLOAT);
|
||||||
|
else
|
||||||
|
caps = gst_caps_from_string (RESAMPLE_CAPS_INT);
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
structure = gst_caps_get_structure (caps, 0);
|
||||||
gst_structure_set (structure, "channels", G_TYPE_INT, channels,
|
gst_structure_set (structure, "channels", G_TYPE_INT, channels,
|
||||||
"rate", G_TYPE_INT, inrate, NULL);
|
"rate", G_TYPE_INT, inrate, "width", G_TYPE_INT, width, NULL);
|
||||||
|
if (!fp)
|
||||||
|
gst_structure_set (structure, "depth", G_TYPE_INT, width, NULL);
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
fail_unless (gst_caps_is_fixed (caps));
|
||||||
|
|
||||||
fail_unless (gst_element_set_state (audioresample,
|
fail_unless (gst_element_set_state (audioresample,
|
||||||
|
@ -75,10 +93,15 @@ setup_audioresample (int channels, int inrate, int outrate)
|
||||||
gst_pad_set_caps (mysrcpad, caps);
|
gst_pad_set_caps (mysrcpad, caps);
|
||||||
gst_caps_unref (caps);
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
caps = gst_caps_from_string (RESAMPLE_CAPS_TEMPLATE_STRING);
|
if (fp)
|
||||||
|
caps = gst_caps_from_string (RESAMPLE_CAPS_FLOAT);
|
||||||
|
else
|
||||||
|
caps = gst_caps_from_string (RESAMPLE_CAPS_INT);
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
structure = gst_caps_get_structure (caps, 0);
|
||||||
gst_structure_set (structure, "channels", G_TYPE_INT, channels,
|
gst_structure_set (structure, "channels", G_TYPE_INT, channels,
|
||||||
"rate", G_TYPE_INT, outrate, NULL);
|
"rate", G_TYPE_INT, outrate, "width", G_TYPE_INT, width, NULL);
|
||||||
|
if (!fp)
|
||||||
|
gst_structure_set (structure, "depth", G_TYPE_INT, width, NULL);
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
fail_unless (gst_caps_is_fixed (caps));
|
||||||
|
|
||||||
mysinkpad = gst_check_setup_sink_pad (audioresample, &sinktemplate, caps);
|
mysinkpad = gst_check_setup_sink_pad (audioresample, &sinktemplate, caps);
|
||||||
|
@ -90,6 +113,8 @@ setup_audioresample (int channels, int inrate, int outrate)
|
||||||
gst_pad_set_active (mysinkpad, TRUE);
|
gst_pad_set_active (mysinkpad, TRUE);
|
||||||
gst_pad_set_active (mysrcpad, TRUE);
|
gst_pad_set_active (mysrcpad, TRUE);
|
||||||
|
|
||||||
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
return audioresample;
|
return audioresample;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,7 +178,7 @@ test_perfect_stream_instance (int inrate, int outrate, int samples,
|
||||||
int i, j;
|
int i, j;
|
||||||
gint16 *p;
|
gint16 *p;
|
||||||
|
|
||||||
audioresample = setup_audioresample (2, inrate, outrate);
|
audioresample = setup_audioresample (2, inrate, outrate, 16, FALSE);
|
||||||
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
fail_unless (gst_caps_is_fixed (caps));
|
||||||
|
|
||||||
|
@ -164,7 +189,7 @@ test_perfect_stream_instance (int inrate, int outrate, int samples,
|
||||||
for (j = 1; j <= numbuffers; ++j) {
|
for (j = 1; j <= numbuffers; ++j) {
|
||||||
|
|
||||||
inbuffer = gst_buffer_new_and_alloc (samples * 4);
|
inbuffer = gst_buffer_new_and_alloc (samples * 4);
|
||||||
GST_BUFFER_DURATION (inbuffer) = samples * GST_SECOND / inrate;
|
GST_BUFFER_DURATION (inbuffer) = GST_FRAMES_TO_CLOCK_TIME (samples, inrate);
|
||||||
GST_BUFFER_TIMESTAMP (inbuffer) = GST_BUFFER_DURATION (inbuffer) * (j - 1);
|
GST_BUFFER_TIMESTAMP (inbuffer) = GST_BUFFER_DURATION (inbuffer) * (j - 1);
|
||||||
GST_BUFFER_OFFSET (inbuffer) = offset;
|
GST_BUFFER_OFFSET (inbuffer) = offset;
|
||||||
offset += samples;
|
offset += samples;
|
||||||
|
@ -240,7 +265,7 @@ test_discont_stream_instance (int inrate, int outrate, int samples,
|
||||||
GST_DEBUG ("inrate:%d outrate:%d samples:%d numbuffers:%d",
|
GST_DEBUG ("inrate:%d outrate:%d samples:%d numbuffers:%d",
|
||||||
inrate, outrate, samples, numbuffers);
|
inrate, outrate, samples, numbuffers);
|
||||||
|
|
||||||
audioresample = setup_audioresample (2, inrate, outrate);
|
audioresample = setup_audioresample (2, inrate, outrate, 16, FALSE);
|
||||||
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
fail_unless (gst_caps_is_fixed (caps));
|
||||||
|
|
||||||
|
@ -326,7 +351,7 @@ GST_START_TEST (test_reuse)
|
||||||
GstBuffer *inbuffer;
|
GstBuffer *inbuffer;
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
|
||||||
audioresample = setup_audioresample (1, 9343, 48000);
|
audioresample = setup_audioresample (1, 9343, 48000, 16, FALSE);
|
||||||
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
fail_unless (gst_caps_is_fixed (caps));
|
||||||
|
|
||||||
|
@ -477,6 +502,7 @@ live_switch_push (int rate, GstCaps * caps)
|
||||||
|
|
||||||
desired = gst_caps_copy (caps);
|
desired = gst_caps_copy (caps);
|
||||||
gst_caps_set_simple (desired, "rate", G_TYPE_INT, rate, NULL);
|
gst_caps_set_simple (desired, "rate", G_TYPE_INT, rate, NULL);
|
||||||
|
gst_pad_set_caps (mysrcpad, desired);
|
||||||
|
|
||||||
fail_unless (gst_pad_alloc_buffer_and_set_caps (mysrcpad,
|
fail_unless (gst_pad_alloc_buffer_and_set_caps (mysrcpad,
|
||||||
GST_BUFFER_OFFSET_NONE, rate * 4, desired, &inbuffer) == GST_FLOW_OK);
|
GST_BUFFER_OFFSET_NONE, rate * 4, desired, &inbuffer) == GST_FLOW_OK);
|
||||||
|
@ -485,6 +511,8 @@ live_switch_push (int rate, GstCaps * caps)
|
||||||
* returns a buffer with exactly the same caps as we requested so the actual
|
* returns a buffer with exactly the same caps as we requested so the actual
|
||||||
* renegotiation (if needed) will be done in the _chain*/
|
* renegotiation (if needed) will be done in the _chain*/
|
||||||
fail_unless (inbuffer != NULL);
|
fail_unless (inbuffer != NULL);
|
||||||
|
GST_DEBUG ("desired: %" GST_PTR_FORMAT ".... got: %" GST_PTR_FORMAT,
|
||||||
|
desired, GST_BUFFER_CAPS (inbuffer));
|
||||||
fail_unless (gst_caps_is_equal (desired, GST_BUFFER_CAPS (inbuffer)));
|
fail_unless (gst_caps_is_equal (desired, GST_BUFFER_CAPS (inbuffer)));
|
||||||
|
|
||||||
memset (GST_BUFFER_DATA (inbuffer), 0, GST_BUFFER_SIZE (inbuffer));
|
memset (GST_BUFFER_DATA (inbuffer), 0, GST_BUFFER_SIZE (inbuffer));
|
||||||
|
@ -516,7 +544,7 @@ GST_START_TEST (test_live_switch)
|
||||||
GstEvent *newseg;
|
GstEvent *newseg;
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
|
||||||
audioresample = setup_audioresample (4, 48000, 48000);
|
audioresample = setup_audioresample (4, 48000, 48000, 16, FALSE);
|
||||||
|
|
||||||
/* Let the sinkpad act like something that can only handle things of
|
/* Let the sinkpad act like something that can only handle things of
|
||||||
* rate 48000- and can only allocate buffers for that rate, but if someone
|
* rate 48000- and can only allocate buffers for that rate, but if someone
|
||||||
|
@ -525,6 +553,8 @@ GST_START_TEST (test_live_switch)
|
||||||
gst_pad_set_bufferalloc_function (mysinkpad, live_switch_alloc_only_48000);
|
gst_pad_set_bufferalloc_function (mysinkpad, live_switch_alloc_only_48000);
|
||||||
gst_pad_set_getcaps_function (mysinkpad, live_switch_get_sink_caps);
|
gst_pad_set_getcaps_function (mysinkpad, live_switch_get_sink_caps);
|
||||||
|
|
||||||
|
gst_pad_use_fixed_caps (mysrcpad);
|
||||||
|
|
||||||
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
fail_unless (gst_caps_is_fixed (caps));
|
||||||
|
|
||||||
|
@ -549,7 +579,104 @@ GST_START_TEST (test_live_switch)
|
||||||
gst_caps_unref (caps);
|
gst_caps_unref (caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_END_TEST static Suite *
|
GST_END_TEST;
|
||||||
|
|
||||||
|
#ifndef GST_DISABLE_PARSE
|
||||||
|
|
||||||
|
static GMainLoop *loop;
|
||||||
|
static gint messages = 0;
|
||||||
|
|
||||||
|
static void
|
||||||
|
element_message_cb (GstBus * bus, GstMessage * message, gpointer user_data)
|
||||||
|
{
|
||||||
|
gchar *s;
|
||||||
|
|
||||||
|
s = gst_structure_to_string (gst_message_get_structure (message));
|
||||||
|
GST_DEBUG ("Received message: %s", s);
|
||||||
|
g_free (s);
|
||||||
|
|
||||||
|
messages++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
eos_message_cb (GstBus * bus, GstMessage * message, gpointer user_data)
|
||||||
|
{
|
||||||
|
GST_DEBUG ("Received eos");
|
||||||
|
g_main_loop_quit (loop);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_pipeline (gint width, gboolean fp, gint inrate, gint outrate, gint quality)
|
||||||
|
{
|
||||||
|
GstElement *pipeline;
|
||||||
|
GstBus *bus;
|
||||||
|
GError *error = NULL;
|
||||||
|
gchar *pipe_str;
|
||||||
|
|
||||||
|
pipe_str =
|
||||||
|
g_strdup_printf
|
||||||
|
("audiotestsrc num-buffers=10 ! audioconvert ! audio/x-raw-%s,rate=%d,width=%d,channels=2 ! audioresample quality=%d ! audio/x-raw-%s,rate=%d,width=%d ! identity check-imperfect-timestamp=TRUE ! fakesink",
|
||||||
|
(fp) ? "float" : "int", inrate, width, quality, (fp) ? "float" : "int",
|
||||||
|
outrate, width);
|
||||||
|
|
||||||
|
pipeline = gst_parse_launch (pipe_str, &error);
|
||||||
|
fail_unless (pipeline != NULL, "Error parsing pipeline: %s",
|
||||||
|
error ? error->message : "(invalid error)");
|
||||||
|
g_free (pipe_str);
|
||||||
|
|
||||||
|
bus = gst_element_get_bus (pipeline);
|
||||||
|
fail_if (bus == NULL);
|
||||||
|
gst_bus_add_signal_watch (bus);
|
||||||
|
g_signal_connect (bus, "message::element", (GCallback) element_message_cb,
|
||||||
|
NULL);
|
||||||
|
g_signal_connect (bus, "message::eos", (GCallback) eos_message_cb, NULL);
|
||||||
|
|
||||||
|
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||||
|
|
||||||
|
/* run until we receive EOS */
|
||||||
|
loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
|
||||||
|
g_main_loop_run (loop);
|
||||||
|
|
||||||
|
g_main_loop_unref (loop);
|
||||||
|
loop = NULL;
|
||||||
|
|
||||||
|
gst_element_set_state (pipeline, GST_STATE_NULL);
|
||||||
|
|
||||||
|
fail_if (messages > 0, "Received imperfect timestamp messages");
|
||||||
|
gst_object_unref (pipeline);
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_START_TEST (test_pipelines)
|
||||||
|
{
|
||||||
|
gint quality;
|
||||||
|
|
||||||
|
/* Test qualities 0, 5 and 10 */
|
||||||
|
for (quality = 0; quality < 11; quality += 5) {
|
||||||
|
test_pipeline (8, FALSE, 44100, 48000, quality);
|
||||||
|
test_pipeline (8, FALSE, 48000, 44100, quality);
|
||||||
|
|
||||||
|
test_pipeline (16, FALSE, 44100, 48000, quality);
|
||||||
|
test_pipeline (16, FALSE, 48000, 44100, quality);
|
||||||
|
|
||||||
|
test_pipeline (24, FALSE, 44100, 48000, quality);
|
||||||
|
test_pipeline (24, FALSE, 48000, 44100, quality);
|
||||||
|
|
||||||
|
test_pipeline (32, FALSE, 44100, 48000, quality);
|
||||||
|
test_pipeline (32, FALSE, 48000, 44100, quality);
|
||||||
|
|
||||||
|
test_pipeline (32, TRUE, 44100, 48000, quality);
|
||||||
|
test_pipeline (32, TRUE, 48000, 44100, quality);
|
||||||
|
|
||||||
|
test_pipeline (64, TRUE, 44100, 48000, quality);
|
||||||
|
test_pipeline (64, TRUE, 48000, 44100, quality);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_END_TEST;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static Suite *
|
||||||
audioresample_suite (void)
|
audioresample_suite (void)
|
||||||
{
|
{
|
||||||
Suite *s = suite_create ("audioresample");
|
Suite *s = suite_create ("audioresample");
|
||||||
|
@ -562,6 +689,11 @@ audioresample_suite (void)
|
||||||
tcase_add_test (tc_chain, test_shutdown);
|
tcase_add_test (tc_chain, test_shutdown);
|
||||||
tcase_add_test (tc_chain, test_live_switch);
|
tcase_add_test (tc_chain, test_live_switch);
|
||||||
|
|
||||||
|
#ifndef GST_DISABLE_PARSE
|
||||||
|
tcase_set_timeout (tc_chain, 360);
|
||||||
|
tcase_add_test (tc_chain, test_pipelines);
|
||||||
|
#endif
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,700 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
*
|
|
||||||
* unit test for speexresample, based on the audioresample unit test
|
|
||||||
*
|
|
||||||
* Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
|
|
||||||
* Copyright (C) <2006> Tim-Philipp Müller <tim at centricular net>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <gst/check/gstcheck.h>
|
|
||||||
|
|
||||||
#include <gst/audio/audio.h>
|
|
||||||
|
|
||||||
/* For ease of programming we use globals to keep refs for our floating
|
|
||||||
* src and sink pads we create; otherwise we always have to do get_pad,
|
|
||||||
* get_peer, and then remove references in every test function */
|
|
||||||
static GstPad *mysrcpad, *mysinkpad;
|
|
||||||
|
|
||||||
#define RESAMPLE_CAPS_FLOAT \
|
|
||||||
"audio/x-raw-float, " \
|
|
||||||
"channels = (int) [ 1, MAX ], " \
|
|
||||||
"rate = (int) [ 1, MAX ], " \
|
|
||||||
"endianness = (int) BYTE_ORDER, " \
|
|
||||||
"width = (int) { 32, 64 }"
|
|
||||||
|
|
||||||
#define RESAMPLE_CAPS_INT \
|
|
||||||
"audio/x-raw-int, " \
|
|
||||||
"channels = (int) [ 1, MAX ], " \
|
|
||||||
"rate = (int) [ 1, MAX ], " \
|
|
||||||
"endianness = (int) BYTE_ORDER, " \
|
|
||||||
"width = (int) 16, " \
|
|
||||||
"depth = (int) 16, " \
|
|
||||||
"signed = (bool) TRUE"
|
|
||||||
|
|
||||||
#define RESAMPLE_CAPS_TEMPLATE_STRING \
|
|
||||||
RESAMPLE_CAPS_FLOAT " ; " \
|
|
||||||
RESAMPLE_CAPS_INT
|
|
||||||
|
|
||||||
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
|
||||||
GST_PAD_SINK,
|
|
||||||
GST_PAD_ALWAYS,
|
|
||||||
GST_STATIC_CAPS (RESAMPLE_CAPS_TEMPLATE_STRING)
|
|
||||||
);
|
|
||||||
static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
|
|
||||||
GST_PAD_SRC,
|
|
||||||
GST_PAD_ALWAYS,
|
|
||||||
GST_STATIC_CAPS (RESAMPLE_CAPS_TEMPLATE_STRING)
|
|
||||||
);
|
|
||||||
|
|
||||||
static GstElement *
|
|
||||||
setup_speexresample (int channels, int inrate, int outrate, int width,
|
|
||||||
gboolean fp)
|
|
||||||
{
|
|
||||||
GstElement *speexresample;
|
|
||||||
GstCaps *caps;
|
|
||||||
GstStructure *structure;
|
|
||||||
|
|
||||||
GST_DEBUG ("setup_speexresample");
|
|
||||||
speexresample = gst_check_setup_element ("audioresample");
|
|
||||||
|
|
||||||
if (fp)
|
|
||||||
caps = gst_caps_from_string (RESAMPLE_CAPS_FLOAT);
|
|
||||||
else
|
|
||||||
caps = gst_caps_from_string (RESAMPLE_CAPS_INT);
|
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
|
||||||
gst_structure_set (structure, "channels", G_TYPE_INT, channels,
|
|
||||||
"rate", G_TYPE_INT, inrate, "width", G_TYPE_INT, width, NULL);
|
|
||||||
if (!fp)
|
|
||||||
gst_structure_set (structure, "depth", G_TYPE_INT, width, NULL);
|
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
|
||||||
|
|
||||||
fail_unless (gst_element_set_state (speexresample,
|
|
||||||
GST_STATE_PAUSED) == GST_STATE_CHANGE_SUCCESS,
|
|
||||||
"could not set to paused");
|
|
||||||
|
|
||||||
mysrcpad = gst_check_setup_src_pad (speexresample, &srctemplate, caps);
|
|
||||||
gst_pad_set_caps (mysrcpad, caps);
|
|
||||||
gst_caps_unref (caps);
|
|
||||||
|
|
||||||
if (fp)
|
|
||||||
caps = gst_caps_from_string (RESAMPLE_CAPS_FLOAT);
|
|
||||||
else
|
|
||||||
caps = gst_caps_from_string (RESAMPLE_CAPS_INT);
|
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
|
||||||
gst_structure_set (structure, "channels", G_TYPE_INT, channels,
|
|
||||||
"rate", G_TYPE_INT, outrate, "width", G_TYPE_INT, width, NULL);
|
|
||||||
if (!fp)
|
|
||||||
gst_structure_set (structure, "depth", G_TYPE_INT, width, NULL);
|
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
|
||||||
|
|
||||||
mysinkpad = gst_check_setup_sink_pad (speexresample, &sinktemplate, caps);
|
|
||||||
/* this installs a getcaps func that will always return the caps we set
|
|
||||||
* later */
|
|
||||||
gst_pad_set_caps (mysinkpad, caps);
|
|
||||||
gst_pad_use_fixed_caps (mysinkpad);
|
|
||||||
|
|
||||||
gst_pad_set_active (mysinkpad, TRUE);
|
|
||||||
gst_pad_set_active (mysrcpad, TRUE);
|
|
||||||
|
|
||||||
gst_caps_unref (caps);
|
|
||||||
|
|
||||||
return speexresample;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
cleanup_speexresample (GstElement * speexresample)
|
|
||||||
{
|
|
||||||
GST_DEBUG ("cleanup_speexresample");
|
|
||||||
|
|
||||||
fail_unless (gst_element_set_state (speexresample,
|
|
||||||
GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to NULL");
|
|
||||||
|
|
||||||
gst_pad_set_active (mysrcpad, FALSE);
|
|
||||||
gst_pad_set_active (mysinkpad, FALSE);
|
|
||||||
gst_check_teardown_src_pad (speexresample);
|
|
||||||
gst_check_teardown_sink_pad (speexresample);
|
|
||||||
gst_check_teardown_element (speexresample);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
fail_unless_perfect_stream (void)
|
|
||||||
{
|
|
||||||
guint64 timestamp = 0L, duration = 0L;
|
|
||||||
guint64 offset = 0L, offset_end = 0L;
|
|
||||||
|
|
||||||
GList *l;
|
|
||||||
GstBuffer *buffer;
|
|
||||||
|
|
||||||
for (l = buffers; l; l = l->next) {
|
|
||||||
buffer = GST_BUFFER (l->data);
|
|
||||||
ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1);
|
|
||||||
GST_DEBUG ("buffer timestamp %" G_GUINT64_FORMAT ", duration %"
|
|
||||||
G_GUINT64_FORMAT " offset %" G_GUINT64_FORMAT " offset_end %"
|
|
||||||
G_GUINT64_FORMAT,
|
|
||||||
GST_BUFFER_TIMESTAMP (buffer),
|
|
||||||
GST_BUFFER_DURATION (buffer),
|
|
||||||
GST_BUFFER_OFFSET (buffer), GST_BUFFER_OFFSET_END (buffer));
|
|
||||||
|
|
||||||
fail_unless_equals_uint64 (timestamp, GST_BUFFER_TIMESTAMP (buffer));
|
|
||||||
fail_unless_equals_uint64 (offset, GST_BUFFER_OFFSET (buffer));
|
|
||||||
duration = GST_BUFFER_DURATION (buffer);
|
|
||||||
offset_end = GST_BUFFER_OFFSET_END (buffer);
|
|
||||||
|
|
||||||
timestamp += duration;
|
|
||||||
offset = offset_end;
|
|
||||||
gst_buffer_unref (buffer);
|
|
||||||
}
|
|
||||||
g_list_free (buffers);
|
|
||||||
buffers = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this tests that the output is a perfect stream if the input is */
|
|
||||||
static void
|
|
||||||
test_perfect_stream_instance (int inrate, int outrate, int samples,
|
|
||||||
int numbuffers)
|
|
||||||
{
|
|
||||||
GstElement *speexresample;
|
|
||||||
GstBuffer *inbuffer, *outbuffer;
|
|
||||||
GstCaps *caps;
|
|
||||||
guint64 offset = 0;
|
|
||||||
|
|
||||||
int i, j;
|
|
||||||
gint16 *p;
|
|
||||||
|
|
||||||
speexresample = setup_speexresample (2, inrate, outrate, 16, FALSE);
|
|
||||||
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
|
||||||
|
|
||||||
fail_unless (gst_element_set_state (speexresample,
|
|
||||||
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
|
|
||||||
"could not set to playing");
|
|
||||||
|
|
||||||
for (j = 1; j <= numbuffers; ++j) {
|
|
||||||
|
|
||||||
inbuffer = gst_buffer_new_and_alloc (samples * 4);
|
|
||||||
GST_BUFFER_DURATION (inbuffer) = GST_FRAMES_TO_CLOCK_TIME (samples, inrate);
|
|
||||||
GST_BUFFER_TIMESTAMP (inbuffer) = GST_BUFFER_DURATION (inbuffer) * (j - 1);
|
|
||||||
GST_BUFFER_OFFSET (inbuffer) = offset;
|
|
||||||
offset += samples;
|
|
||||||
GST_BUFFER_OFFSET_END (inbuffer) = offset;
|
|
||||||
|
|
||||||
gst_buffer_set_caps (inbuffer, caps);
|
|
||||||
|
|
||||||
p = (gint16 *) GST_BUFFER_DATA (inbuffer);
|
|
||||||
|
|
||||||
/* create a 16 bit signed ramp */
|
|
||||||
for (i = 0; i < samples; ++i) {
|
|
||||||
*p = -32767 + i * (65535 / samples);
|
|
||||||
++p;
|
|
||||||
*p = -32767 + i * (65535 / samples);
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* pushing gives away my reference ... */
|
|
||||||
fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
|
|
||||||
/* ... but it ends up being collected on the global buffer list */
|
|
||||||
fail_unless_equals_int (g_list_length (buffers), j);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME: we should make speexresample handle eos by flushing out the last
|
|
||||||
* samples, which will give us one more, small, buffer */
|
|
||||||
fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
|
|
||||||
ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1);
|
|
||||||
|
|
||||||
fail_unless_perfect_stream ();
|
|
||||||
|
|
||||||
/* cleanup */
|
|
||||||
gst_caps_unref (caps);
|
|
||||||
cleanup_speexresample (speexresample);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* make sure that outgoing buffers are contiguous in timestamp/duration and
|
|
||||||
* offset/offsetend
|
|
||||||
*/
|
|
||||||
GST_START_TEST (test_perfect_stream)
|
|
||||||
{
|
|
||||||
/* integral scalings */
|
|
||||||
test_perfect_stream_instance (48000, 24000, 500, 20);
|
|
||||||
test_perfect_stream_instance (48000, 12000, 500, 20);
|
|
||||||
test_perfect_stream_instance (12000, 24000, 500, 20);
|
|
||||||
test_perfect_stream_instance (12000, 48000, 500, 20);
|
|
||||||
|
|
||||||
/* non-integral scalings */
|
|
||||||
test_perfect_stream_instance (44100, 8000, 500, 20);
|
|
||||||
test_perfect_stream_instance (8000, 44100, 500, 20);
|
|
||||||
|
|
||||||
/* wacky scalings */
|
|
||||||
test_perfect_stream_instance (12345, 54321, 500, 20);
|
|
||||||
test_perfect_stream_instance (101, 99, 500, 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_END_TEST;
|
|
||||||
|
|
||||||
/* this tests that the output is a correct discontinuous stream
|
|
||||||
* if the input is; ie input drops in time come out the same way */
|
|
||||||
static void
|
|
||||||
test_discont_stream_instance (int inrate, int outrate, int samples,
|
|
||||||
int numbuffers)
|
|
||||||
{
|
|
||||||
GstElement *speexresample;
|
|
||||||
GstBuffer *inbuffer, *outbuffer;
|
|
||||||
GstCaps *caps;
|
|
||||||
GstClockTime ints;
|
|
||||||
|
|
||||||
int i, j;
|
|
||||||
gint16 *p;
|
|
||||||
|
|
||||||
GST_DEBUG ("inrate:%d outrate:%d samples:%d numbuffers:%d",
|
|
||||||
inrate, outrate, samples, numbuffers);
|
|
||||||
|
|
||||||
speexresample = setup_speexresample (2, inrate, outrate, 16, FALSE);
|
|
||||||
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
|
||||||
|
|
||||||
fail_unless (gst_element_set_state (speexresample,
|
|
||||||
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
|
|
||||||
"could not set to playing");
|
|
||||||
|
|
||||||
for (j = 1; j <= numbuffers; ++j) {
|
|
||||||
|
|
||||||
inbuffer = gst_buffer_new_and_alloc (samples * 4);
|
|
||||||
GST_BUFFER_DURATION (inbuffer) = samples * GST_SECOND / inrate;
|
|
||||||
/* "drop" half the buffers */
|
|
||||||
ints = GST_BUFFER_DURATION (inbuffer) * 2 * (j - 1);
|
|
||||||
GST_BUFFER_TIMESTAMP (inbuffer) = ints;
|
|
||||||
GST_BUFFER_OFFSET (inbuffer) = (j - 1) * 2 * samples;
|
|
||||||
GST_BUFFER_OFFSET_END (inbuffer) = j * 2 * samples + samples;
|
|
||||||
|
|
||||||
gst_buffer_set_caps (inbuffer, caps);
|
|
||||||
|
|
||||||
p = (gint16 *) GST_BUFFER_DATA (inbuffer);
|
|
||||||
|
|
||||||
/* create a 16 bit signed ramp */
|
|
||||||
for (i = 0; i < samples; ++i) {
|
|
||||||
*p = -32767 + i * (65535 / samples);
|
|
||||||
++p;
|
|
||||||
*p = -32767 + i * (65535 / samples);
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_DEBUG ("Sending Buffer time:%" G_GUINT64_FORMAT " duration:%"
|
|
||||||
G_GINT64_FORMAT " discont:%d offset:%" G_GUINT64_FORMAT " offset_end:%"
|
|
||||||
G_GUINT64_FORMAT, GST_BUFFER_TIMESTAMP (inbuffer),
|
|
||||||
GST_BUFFER_DURATION (inbuffer), GST_BUFFER_IS_DISCONT (inbuffer),
|
|
||||||
GST_BUFFER_OFFSET (inbuffer), GST_BUFFER_OFFSET_END (inbuffer));
|
|
||||||
/* pushing gives away my reference ... */
|
|
||||||
fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
|
|
||||||
|
|
||||||
/* check if the timestamp of the pushed buffer matches the incoming one */
|
|
||||||
outbuffer = g_list_nth_data (buffers, g_list_length (buffers) - 1);
|
|
||||||
fail_if (outbuffer == NULL);
|
|
||||||
fail_unless_equals_uint64 (ints, GST_BUFFER_TIMESTAMP (outbuffer));
|
|
||||||
GST_DEBUG ("Got Buffer time:%" G_GUINT64_FORMAT " duration:%"
|
|
||||||
G_GINT64_FORMAT " discont:%d offset:%" G_GUINT64_FORMAT " offset_end:%"
|
|
||||||
G_GUINT64_FORMAT, GST_BUFFER_TIMESTAMP (outbuffer),
|
|
||||||
GST_BUFFER_DURATION (outbuffer), GST_BUFFER_IS_DISCONT (outbuffer),
|
|
||||||
GST_BUFFER_OFFSET (outbuffer), GST_BUFFER_OFFSET_END (outbuffer));
|
|
||||||
if (j > 1) {
|
|
||||||
fail_unless (GST_BUFFER_IS_DISCONT (outbuffer),
|
|
||||||
"expected discont for buffer #%d", j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cleanup */
|
|
||||||
gst_caps_unref (caps);
|
|
||||||
cleanup_speexresample (speexresample);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_START_TEST (test_discont_stream)
|
|
||||||
{
|
|
||||||
/* integral scalings */
|
|
||||||
test_discont_stream_instance (48000, 24000, 500, 20);
|
|
||||||
test_discont_stream_instance (48000, 12000, 500, 20);
|
|
||||||
test_discont_stream_instance (12000, 24000, 500, 20);
|
|
||||||
test_discont_stream_instance (12000, 48000, 500, 20);
|
|
||||||
|
|
||||||
/* non-integral scalings */
|
|
||||||
test_discont_stream_instance (44100, 8000, 500, 20);
|
|
||||||
test_discont_stream_instance (8000, 44100, 500, 20);
|
|
||||||
|
|
||||||
/* wacky scalings */
|
|
||||||
test_discont_stream_instance (12345, 54321, 500, 20);
|
|
||||||
test_discont_stream_instance (101, 99, 500, 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_END_TEST;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GST_START_TEST (test_reuse)
|
|
||||||
{
|
|
||||||
GstElement *speexresample;
|
|
||||||
GstEvent *newseg;
|
|
||||||
GstBuffer *inbuffer;
|
|
||||||
GstCaps *caps;
|
|
||||||
|
|
||||||
speexresample = setup_speexresample (1, 9343, 48000, 16, FALSE);
|
|
||||||
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
|
||||||
|
|
||||||
fail_unless (gst_element_set_state (speexresample,
|
|
||||||
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
|
|
||||||
"could not set to playing");
|
|
||||||
|
|
||||||
newseg = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0);
|
|
||||||
fail_unless (gst_pad_push_event (mysrcpad, newseg) != FALSE);
|
|
||||||
|
|
||||||
inbuffer = gst_buffer_new_and_alloc (9343 * 4);
|
|
||||||
memset (GST_BUFFER_DATA (inbuffer), 0, GST_BUFFER_SIZE (inbuffer));
|
|
||||||
GST_BUFFER_DURATION (inbuffer) = GST_SECOND;
|
|
||||||
GST_BUFFER_TIMESTAMP (inbuffer) = 0;
|
|
||||||
GST_BUFFER_OFFSET (inbuffer) = 0;
|
|
||||||
gst_buffer_set_caps (inbuffer, caps);
|
|
||||||
|
|
||||||
/* pushing gives away my reference ... */
|
|
||||||
fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
|
|
||||||
|
|
||||||
/* ... but it ends up being collected on the global buffer list */
|
|
||||||
fail_unless_equals_int (g_list_length (buffers), 1);
|
|
||||||
|
|
||||||
/* now reset and try again ... */
|
|
||||||
fail_unless (gst_element_set_state (speexresample,
|
|
||||||
GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to NULL");
|
|
||||||
|
|
||||||
fail_unless (gst_element_set_state (speexresample,
|
|
||||||
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
|
|
||||||
"could not set to playing");
|
|
||||||
|
|
||||||
newseg = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0);
|
|
||||||
fail_unless (gst_pad_push_event (mysrcpad, newseg) != FALSE);
|
|
||||||
|
|
||||||
inbuffer = gst_buffer_new_and_alloc (9343 * 4);
|
|
||||||
memset (GST_BUFFER_DATA (inbuffer), 0, GST_BUFFER_SIZE (inbuffer));
|
|
||||||
GST_BUFFER_DURATION (inbuffer) = GST_SECOND;
|
|
||||||
GST_BUFFER_TIMESTAMP (inbuffer) = 0;
|
|
||||||
GST_BUFFER_OFFSET (inbuffer) = 0;
|
|
||||||
gst_buffer_set_caps (inbuffer, caps);
|
|
||||||
|
|
||||||
fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
|
|
||||||
|
|
||||||
/* ... it also ends up being collected on the global buffer list. If we
|
|
||||||
* now have more than 2 buffers, then speexresample probably didn't clean
|
|
||||||
* up its internal buffer properly and tried to push the remaining samples
|
|
||||||
* when it got the second NEWSEGMENT event */
|
|
||||||
fail_unless_equals_int (g_list_length (buffers), 2);
|
|
||||||
|
|
||||||
cleanup_speexresample (speexresample);
|
|
||||||
gst_caps_unref (caps);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_END_TEST;
|
|
||||||
|
|
||||||
GST_START_TEST (test_shutdown)
|
|
||||||
{
|
|
||||||
GstElement *pipeline, *src, *cf1, *ar, *cf2, *sink;
|
|
||||||
GstCaps *caps;
|
|
||||||
guint i;
|
|
||||||
|
|
||||||
/* create pipeline, force speexresample to actually resample */
|
|
||||||
pipeline = gst_pipeline_new (NULL);
|
|
||||||
|
|
||||||
src = gst_check_setup_element ("audiotestsrc");
|
|
||||||
cf1 = gst_check_setup_element ("capsfilter");
|
|
||||||
ar = gst_check_setup_element ("audioresample");
|
|
||||||
cf2 = gst_check_setup_element ("capsfilter");
|
|
||||||
g_object_set (cf2, "name", "capsfilter2", NULL);
|
|
||||||
sink = gst_check_setup_element ("fakesink");
|
|
||||||
|
|
||||||
caps =
|
|
||||||
gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, 11025, NULL);
|
|
||||||
g_object_set (cf1, "caps", caps, NULL);
|
|
||||||
gst_caps_unref (caps);
|
|
||||||
|
|
||||||
caps =
|
|
||||||
gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, 48000, NULL);
|
|
||||||
g_object_set (cf2, "caps", caps, NULL);
|
|
||||||
gst_caps_unref (caps);
|
|
||||||
|
|
||||||
/* don't want to sync against the clock, the more throughput the better */
|
|
||||||
g_object_set (src, "is-live", FALSE, NULL);
|
|
||||||
g_object_set (sink, "sync", FALSE, NULL);
|
|
||||||
|
|
||||||
gst_bin_add_many (GST_BIN (pipeline), src, cf1, ar, cf2, sink, NULL);
|
|
||||||
fail_if (!gst_element_link_many (src, cf1, ar, cf2, sink, NULL));
|
|
||||||
|
|
||||||
/* now, wait until pipeline is running and then shut it down again; repeat */
|
|
||||||
for (i = 0; i < 20; ++i) {
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PAUSED);
|
|
||||||
gst_element_get_state (pipeline, NULL, NULL, -1);
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
|
||||||
g_usleep (100);
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_object_unref (pipeline);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_END_TEST;
|
|
||||||
|
|
||||||
static GstFlowReturn
|
|
||||||
live_switch_alloc_only_48000 (GstPad * pad, guint64 offset,
|
|
||||||
guint size, GstCaps * caps, GstBuffer ** buf)
|
|
||||||
{
|
|
||||||
GstStructure *structure;
|
|
||||||
gint rate;
|
|
||||||
gint channels;
|
|
||||||
GstCaps *desired;
|
|
||||||
|
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
|
||||||
fail_unless (gst_structure_get_int (structure, "rate", &rate));
|
|
||||||
fail_unless (gst_structure_get_int (structure, "channels", &channels));
|
|
||||||
|
|
||||||
if (rate < 48000)
|
|
||||||
return GST_FLOW_NOT_NEGOTIATED;
|
|
||||||
|
|
||||||
desired = gst_caps_copy (caps);
|
|
||||||
gst_caps_set_simple (desired, "rate", G_TYPE_INT, 48000, NULL);
|
|
||||||
|
|
||||||
*buf = gst_buffer_new_and_alloc (channels * 48000);
|
|
||||||
gst_buffer_set_caps (*buf, desired);
|
|
||||||
gst_caps_unref (desired);
|
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstCaps *
|
|
||||||
live_switch_get_sink_caps (GstPad * pad)
|
|
||||||
{
|
|
||||||
GstCaps *result;
|
|
||||||
|
|
||||||
result = gst_caps_copy (GST_PAD_CAPS (pad));
|
|
||||||
|
|
||||||
gst_caps_set_simple (result,
|
|
||||||
"rate", GST_TYPE_INT_RANGE, 48000, G_MAXINT, NULL);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
live_switch_push (int rate, GstCaps * caps)
|
|
||||||
{
|
|
||||||
GstBuffer *inbuffer;
|
|
||||||
GstCaps *desired;
|
|
||||||
GList *l;
|
|
||||||
|
|
||||||
desired = gst_caps_copy (caps);
|
|
||||||
gst_caps_set_simple (desired, "rate", G_TYPE_INT, rate, NULL);
|
|
||||||
gst_pad_set_caps (mysrcpad, desired);
|
|
||||||
|
|
||||||
fail_unless (gst_pad_alloc_buffer_and_set_caps (mysrcpad,
|
|
||||||
GST_BUFFER_OFFSET_NONE, rate * 4, desired, &inbuffer) == GST_FLOW_OK);
|
|
||||||
|
|
||||||
/* When the basetransform hits the non-configured case it always
|
|
||||||
* returns a buffer with exactly the same caps as we requested so the actual
|
|
||||||
* renegotiation (if needed) will be done in the _chain*/
|
|
||||||
fail_unless (inbuffer != NULL);
|
|
||||||
GST_DEBUG ("desired: %" GST_PTR_FORMAT ".... got: %" GST_PTR_FORMAT,
|
|
||||||
desired, GST_BUFFER_CAPS (inbuffer));
|
|
||||||
fail_unless (gst_caps_is_equal (desired, GST_BUFFER_CAPS (inbuffer)));
|
|
||||||
|
|
||||||
memset (GST_BUFFER_DATA (inbuffer), 0, GST_BUFFER_SIZE (inbuffer));
|
|
||||||
GST_BUFFER_DURATION (inbuffer) = GST_SECOND;
|
|
||||||
GST_BUFFER_TIMESTAMP (inbuffer) = 0;
|
|
||||||
GST_BUFFER_OFFSET (inbuffer) = 0;
|
|
||||||
|
|
||||||
/* pushing gives away my reference ... */
|
|
||||||
fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
|
|
||||||
|
|
||||||
/* ... but it ends up being collected on the global buffer list */
|
|
||||||
fail_unless_equals_int (g_list_length (buffers), 1);
|
|
||||||
|
|
||||||
for (l = buffers; l; l = l->next) {
|
|
||||||
GstBuffer *buffer = GST_BUFFER (l->data);
|
|
||||||
|
|
||||||
gst_buffer_unref (buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_list_free (buffers);
|
|
||||||
buffers = NULL;
|
|
||||||
|
|
||||||
gst_caps_unref (desired);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_START_TEST (test_live_switch)
|
|
||||||
{
|
|
||||||
GstElement *speexresample;
|
|
||||||
GstEvent *newseg;
|
|
||||||
GstCaps *caps;
|
|
||||||
|
|
||||||
speexresample = setup_speexresample (4, 48000, 48000, 16, FALSE);
|
|
||||||
|
|
||||||
/* Let the sinkpad act like something that can only handle things of
|
|
||||||
* rate 48000- and can only allocate buffers for that rate, but if someone
|
|
||||||
* tries to get a buffer with a rate higher then 48000 tries to renegotiate
|
|
||||||
* */
|
|
||||||
gst_pad_set_bufferalloc_function (mysinkpad, live_switch_alloc_only_48000);
|
|
||||||
gst_pad_set_getcaps_function (mysinkpad, live_switch_get_sink_caps);
|
|
||||||
|
|
||||||
gst_pad_use_fixed_caps (mysrcpad);
|
|
||||||
|
|
||||||
caps = gst_pad_get_negotiated_caps (mysrcpad);
|
|
||||||
fail_unless (gst_caps_is_fixed (caps));
|
|
||||||
|
|
||||||
fail_unless (gst_element_set_state (speexresample,
|
|
||||||
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
|
|
||||||
"could not set to playing");
|
|
||||||
|
|
||||||
newseg = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0);
|
|
||||||
fail_unless (gst_pad_push_event (mysrcpad, newseg) != FALSE);
|
|
||||||
|
|
||||||
/* downstream can provide the requested rate, a buffer alloc will be passed
|
|
||||||
* on */
|
|
||||||
live_switch_push (48000, caps);
|
|
||||||
|
|
||||||
/* Downstream can never accept this rate, buffer alloc isn't passed on */
|
|
||||||
live_switch_push (40000, caps);
|
|
||||||
|
|
||||||
/* Downstream can provide the requested rate but will re-negotiate */
|
|
||||||
live_switch_push (50000, caps);
|
|
||||||
|
|
||||||
cleanup_speexresample (speexresample);
|
|
||||||
gst_caps_unref (caps);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_END_TEST;
|
|
||||||
|
|
||||||
#ifndef GST_DISABLE_PARSE
|
|
||||||
|
|
||||||
static GMainLoop *loop;
|
|
||||||
static gint messages = 0;
|
|
||||||
|
|
||||||
static void
|
|
||||||
element_message_cb (GstBus * bus, GstMessage * message, gpointer user_data)
|
|
||||||
{
|
|
||||||
gchar *s;
|
|
||||||
|
|
||||||
s = gst_structure_to_string (gst_message_get_structure (message));
|
|
||||||
GST_DEBUG ("Received message: %s", s);
|
|
||||||
g_free (s);
|
|
||||||
|
|
||||||
messages++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eos_message_cb (GstBus * bus, GstMessage * message, gpointer user_data)
|
|
||||||
{
|
|
||||||
GST_DEBUG ("Received eos");
|
|
||||||
g_main_loop_quit (loop);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
test_pipeline (gint width, gboolean fp, gint inrate, gint outrate, gint quality)
|
|
||||||
{
|
|
||||||
GstElement *pipeline;
|
|
||||||
GstBus *bus;
|
|
||||||
GError *error = NULL;
|
|
||||||
gchar *pipe_str;
|
|
||||||
|
|
||||||
pipe_str =
|
|
||||||
g_strdup_printf
|
|
||||||
("audiotestsrc num-buffers=10 ! audioconvert ! audio/x-raw-%s,rate=%d,width=%d,channels=2 ! audioresample quality=%d ! audio/x-raw-%s,rate=%d,width=%d ! identity check-imperfect-timestamp=TRUE ! fakesink",
|
|
||||||
(fp) ? "float" : "int", inrate, width, quality, (fp) ? "float" : "int",
|
|
||||||
outrate, width);
|
|
||||||
|
|
||||||
pipeline = gst_parse_launch (pipe_str, &error);
|
|
||||||
fail_unless (pipeline != NULL, "Error parsing pipeline: %s",
|
|
||||||
error ? error->message : "(invalid error)");
|
|
||||||
g_free (pipe_str);
|
|
||||||
|
|
||||||
bus = gst_element_get_bus (pipeline);
|
|
||||||
fail_if (bus == NULL);
|
|
||||||
gst_bus_add_signal_watch (bus);
|
|
||||||
g_signal_connect (bus, "message::element", (GCallback) element_message_cb,
|
|
||||||
NULL);
|
|
||||||
g_signal_connect (bus, "message::eos", (GCallback) eos_message_cb, NULL);
|
|
||||||
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
|
||||||
|
|
||||||
/* run until we receive EOS */
|
|
||||||
loop = g_main_loop_new (NULL, FALSE);
|
|
||||||
|
|
||||||
g_main_loop_run (loop);
|
|
||||||
|
|
||||||
g_main_loop_unref (loop);
|
|
||||||
loop = NULL;
|
|
||||||
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_NULL);
|
|
||||||
|
|
||||||
fail_if (messages > 0, "Received imperfect timestamp messages");
|
|
||||||
gst_object_unref (pipeline);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_START_TEST (test_pipelines)
|
|
||||||
{
|
|
||||||
gint quality;
|
|
||||||
|
|
||||||
/* Test qualities 0, 5 and 10 */
|
|
||||||
for (quality = 0; quality < 11; quality += 5) {
|
|
||||||
test_pipeline (8, FALSE, 44100, 48000, quality);
|
|
||||||
test_pipeline (8, FALSE, 48000, 44100, quality);
|
|
||||||
|
|
||||||
test_pipeline (16, FALSE, 44100, 48000, quality);
|
|
||||||
test_pipeline (16, FALSE, 48000, 44100, quality);
|
|
||||||
|
|
||||||
test_pipeline (24, FALSE, 44100, 48000, quality);
|
|
||||||
test_pipeline (24, FALSE, 48000, 44100, quality);
|
|
||||||
|
|
||||||
test_pipeline (32, FALSE, 44100, 48000, quality);
|
|
||||||
test_pipeline (32, FALSE, 48000, 44100, quality);
|
|
||||||
|
|
||||||
test_pipeline (32, TRUE, 44100, 48000, quality);
|
|
||||||
test_pipeline (32, TRUE, 48000, 44100, quality);
|
|
||||||
|
|
||||||
test_pipeline (64, TRUE, 44100, 48000, quality);
|
|
||||||
test_pipeline (64, TRUE, 48000, 44100, quality);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_END_TEST;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static Suite *
|
|
||||||
speexresample_suite (void)
|
|
||||||
{
|
|
||||||
Suite *s = suite_create ("speexresample");
|
|
||||||
TCase *tc_chain = tcase_create ("general");
|
|
||||||
|
|
||||||
suite_add_tcase (s, tc_chain);
|
|
||||||
tcase_add_test (tc_chain, test_perfect_stream);
|
|
||||||
tcase_add_test (tc_chain, test_discont_stream);
|
|
||||||
tcase_add_test (tc_chain, test_reuse);
|
|
||||||
tcase_add_test (tc_chain, test_shutdown);
|
|
||||||
tcase_add_test (tc_chain, test_live_switch);
|
|
||||||
|
|
||||||
#ifndef GST_DISABLE_PARSE
|
|
||||||
tcase_set_timeout (tc_chain, 360);
|
|
||||||
tcase_add_test (tc_chain, test_pipelines);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_CHECK_MAIN (speexresample);
|
|
Loading…
Reference in a new issue