aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--ChangeLog1
-rw-r--r--Makefile1
-rwxr-xr-xconfigure32
-rw-r--r--etc/codecs.conf8
-rw-r--r--libmpcodecs/Makefile4
-rw-r--r--libmpcodecs/ad.c4
-rw-r--r--libmpdemux/demux_ogg.c34
8 files changed, 84 insertions, 1 deletions
diff --git a/AUTHORS b/AUTHORS
index 85b7ae382b..cb1e4be00e 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -216,6 +216,7 @@ Döffinger, Reimar (reimar) <reimar.doeffinger@stud.uni-karlsruhe.de>
* made MMS over HTTP stream selection work and modified ASF header parsing
* reimplemented ao_jack without bio2jack dependency
* musepack demuxer and decoder, based on Reza's patch
+ * speex decoder via libspeex
* MPEG-2 in GXF demuxer
* vo_gl ported to windows
* gl_commmon.[ch] to decrease code duplication
diff --git a/ChangeLog b/ChangeLog
index 2eb188b266..c4f5e7dcaf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -34,6 +34,7 @@ MPlayer (1.0)
* support for dmb1 MJPEG files with ffmjpeg
* support for musepack audio (WARNING: when muxing into e.g. AVI you will
be able to seek, but you might get ear- and speaker-breaking noises)
+ * experimental speex support via libspeex
* On2 VP7 video decoder via binary DLL
* Duck/On2 TrueMotion2 (TM20) support via lavc
* support FLX and DTA extensions for flic files
diff --git a/Makefile b/Makefile
index 63b7d13018..c80cbb6de8 100644
--- a/Makefile
+++ b/Makefile
@@ -104,6 +104,7 @@ CODEC_LIBS = $(AV_LIB) \
$(XMMS_LIB) \
$(X264_LIB) \
$(MUSEPACK_LIB) \
+ $(SPEEX_LIB) \
COMMON_LIBS = libmpcodecs/libmpcodecs.a \
$(W32_LIB) \
diff --git a/configure b/configure
index 48e4fb5646..f504cfee26 100755
--- a/configure
+++ b/configure
@@ -243,6 +243,7 @@ Codecs:
--enable-tremor-low build with lower accuracy internal tremor [disabled]
--enable-external-tremor build with external tremor [disabled]
--disable-vorbis disable OggVorbis support entirely [autodetect]
+ --disable-speex disable Speex support [autodetect]
--enable-theora build with OggTheora support [autodetect]
--disable-internal-matroska disable internal Matroska support [enabled]
--enable-external-faad build with external FAAD2 (AAC) support [autodetect]
@@ -1486,6 +1487,7 @@ _twolame=auto
_tremor_internal=yes
_tremor_low=no
_vorbis=auto
+_speex=auto
_theora=auto
_mp3lib=yes
_liba52=yes
@@ -1679,6 +1681,8 @@ for ac_option do
--disable-liblzo) _liblzo=no ;;
--enable-vorbis) _vorbis=yes ;;
--disable-vorbis) _vorbis=no ;;
+ --enable-speex) _speex=yes ;;
+ --disable-speex) _speex=no ;;
--enable-internal-tremor) _tremor_internal=yes ;;
--disable-internal-tremor) _tremor_internal=no ;;
--enable-tremor-low) _tremor_low=yes ;;
@@ -5389,6 +5393,29 @@ elif test "$_vorbis" = yes -a "$_tremor" = yes ; then
fi
echores "$_vorbis"
+echocheck "libspeex (version >= 1.1 required)"
+if test "$_speex" = auto ; then
+ _speex=no
+ cat > $TMPC << EOF
+#include <speex/speex.h>
+int main(void) {
+ SpeexBits bits;
+ void *dec;
+ speex_decode_int(dec, &bits, dec);
+}
+EOF
+ cc_check -lspeex $_ld_lm && _speex=yes
+fi
+if test "$_speex" = yes ; then
+ _def_speex='#define HAVE_SPEEX 1'
+ _ld_speex='-lspeex'
+ _codecmodules="speex $_codecmodules"
+else
+ _def_speex='#undef HAVE_SPEEX'
+ _nocodecmodules="speex $_nocodecmodules"
+fi
+echores "$_speex"
+
echocheck "OggTheora support"
if test "$_theora" = auto ; then
_theora=no
@@ -6982,6 +7009,7 @@ LIBMPEG2 = $_libmpeg2
TREMOR = $_tremor_internal
TREMOR_FLAGS = $_tremor_flags
+SPEEX = $_speex
MUSEPACK = $_musepack
UNRARLIB = $_unrarlib
@@ -7091,6 +7119,7 @@ FRIBIDI_LIB = $_ld_fribidi
LIBLZO_LIB= $_ld_liblzo
MAD_LIB = $_ld_mad
VORBIS_LIB = $_ld_vorbis $_ld_libdv
+SPEEX_LIB = $_ld_speex
THEORA_LIB = $_ld_theora
FAAD_LIB = $_ld_faad
INTERNAL_FAAD = $_faad_internal
@@ -7669,6 +7698,9 @@ $_def_vorbis
/* enable Tremor as vorbis decoder */
$_def_tremor
+/* enable Speex support */
+$_def_speex
+
/* enable musepack support */
$_def_musepack
diff --git a/etc/codecs.conf b/etc/codecs.conf
index fa967011c3..44529be0e3 100644
--- a/etc/codecs.conf
+++ b/etc/codecs.conf
@@ -2628,6 +2628,14 @@ audiocodec vorbis
; driver acm
; dll "vorbis.acm"
+audiocodec speex
+ info "Speex Audio Decoder"
+ status working
+ comment "Speex driver using libspeex"
+ fourcc 'spx '
+ driver speex
+ dll "speex"
+
audiocodec vivoaudio
info "Vivo G.723/Siren Audio Codec"
status working
diff --git a/libmpcodecs/Makefile b/libmpcodecs/Makefile
index 74f0287dde..a41d9e73ea 100644
--- a/libmpcodecs/Makefile
+++ b/libmpcodecs/Makefile
@@ -209,6 +209,10 @@ ifeq ($(MUSEPACK),yes)
AUDIO_SRCS += ad_mpc.c
endif
+ifeq ($(SPEEX),yes)
+AUDIO_SRCS += ad_speex.c
+endif
+
ifeq ($(FAAC),yes)
ENCODER_SRCS += ae_faac.c
endif
diff --git a/libmpcodecs/ad.c b/libmpcodecs/ad.c
index c6d0b3291a..44f164cb5f 100644
--- a/libmpcodecs/ad.c
+++ b/libmpcodecs/ad.c
@@ -33,6 +33,7 @@ extern ad_functions_t mpcodecs_ad_acm;
extern ad_functions_t mpcodecs_ad_msgsm;
extern ad_functions_t mpcodecs_ad_faad;
extern ad_functions_t mpcodecs_ad_libvorbis;
+extern ad_functions_t mpcodecs_ad_speex;
extern ad_functions_t mpcodecs_ad_libmad;
extern ad_functions_t mpcodecs_ad_realaud;
extern ad_functions_t mpcodecs_ad_libdv;
@@ -78,6 +79,9 @@ ad_functions_t* mpcodecs_ad_drivers[] =
#ifdef HAVE_OGGVORBIS
&mpcodecs_ad_libvorbis,
#endif
+#ifdef HAVE_SPEEX
+ &mpcodecs_ad_speex,
+#endif
#ifdef USE_LIBMAD
&mpcodecs_ad_libmad,
#endif
diff --git a/libmpdemux/demux_ogg.c b/libmpdemux/demux_ogg.c
index be0e4c9899..e3f4965c40 100644
--- a/libmpdemux/demux_ogg.c
+++ b/libmpdemux/demux_ogg.c
@@ -16,6 +16,7 @@
#include "stheader.h"
#define FOURCC_VORBIS mmioFOURCC('v', 'r', 'b', 's')
+#define FOURCC_SPEEX mmioFOURCC('s', 'p', 'x', ' ')
#define FOURCC_THEORA mmioFOURCC('t', 'h', 'e', 'o')
#ifdef TREMOR
@@ -116,6 +117,7 @@ typedef struct ogg_stream {
ogg_stream_state stream;
int hdr_packets;
int vorbis;
+ int speex;
int theora;
int flac;
int text;
@@ -352,6 +354,8 @@ static unsigned char* demux_ogg_read_packet(ogg_stream_t* os,ogg_packet* pack,vo
os->lastsize = blocksize;
os->lastpos = pack->granulepos;
}
+ } else if (os->speex) {
+ data = pack->packet;
# ifdef HAVE_OGGTHEORA
} else if (os->theora) {
/* we pass complete packets to theora, mustn't strip the header! */
@@ -536,6 +540,13 @@ static int demux_ogg_add_packet(demux_stream_t* ds,ogg_stream_t* os,int id,ogg_p
demux_ogg_add_sub(os,pack);
return 0;
}
+ if (os->speex) {
+ // discard first two packets, they contain the header and comment
+ if (os->hdr_packets < 2) {
+ os->hdr_packets++;
+ return 0;
+ }
+ } else
// If packet is an header we jump it except for vorbis and theora
// (PACKET_TYPE_HEADER bit doesn't even exist for theora ?!)
// We jump nothing for FLAC. Ain't this great? Packet contents have to be
@@ -916,6 +927,27 @@ int demux_ogg_open(demuxer_t* demuxer) {
ogg_d->subs[ogg_d->num_sub].id = n_audio;
n_audio++;
mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (Vorbis), -aid %d\n",ogg_d->num_sub,n_audio-1);
+ } else if (pack.bytes >= 80 && !strncmp(pack.packet,"Speex", 5)) {
+ sh_a = new_sh_audio(demuxer, ogg_d->num_sub);
+ sh_a->wf = (WAVEFORMATEX*)calloc(1, sizeof(WAVEFORMATEX) + pack.bytes);
+ sh_a->format = FOURCC_SPEEX;
+ sh_a->samplerate = sh_a->wf->nSamplesPerSec = get_uint32(&pack.packet[36]);
+ sh_a->channels = sh_a->wf->nChannels = get_uint32(&pack.packet[48]);
+ sh_a->wf->wFormatTag = sh_a->format;
+ sh_a->wf->nAvgBytesPerSec = get_uint32(&pack.packet[52]);
+ sh_a->wf->nBlockAlign = 0;
+ sh_a->wf->wBitsPerSample = 16;
+ sh_a->samplesize = 2;
+ sh_a->wf->cbSize = pack.bytes;
+ memcpy(&sh_a->wf[1], pack.packet, pack.bytes);
+
+ ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate;
+ ogg_d->subs[ogg_d->num_sub].speex = 1;
+ if (identify)
+ mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_AUDIO_ID=%d\n", n_audio);
+ ogg_d->subs[ogg_d->num_sub].id = n_audio;
+ n_audio++;
+ mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (Speex), -aid %d\n",ogg_d->num_sub,n_audio-1);
// check for Theora
# ifdef HAVE_OGGTHEORA
@@ -1549,7 +1581,7 @@ static void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) {
break;
}
}
- if(!precision && (is_keyframe || os->vorbis) ) {
+ if(!precision && (is_keyframe || os->vorbis || os->speex) ) {
ogg_sub.lines = 0;
vo_sub = &ogg_sub;
vo_osd_changed(OSDTYPE_SUBTITLE);