Speex *should* now work on big-endian architectures.
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 12 Jun 2002 21:33:44 +0000 (21:33 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 12 Jun 2002 21:33:44 +0000 (21:33 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3384 0101bb08-14d6-0310-b084-bc0e0c8e3800

Makefile.am
configure.in
libspeex/modes.c
libspeex/post_filter.c
libspeex/sb_celp.c
libspeex/speex.h
src/speexdec.c
src/speexenc.c
src/wav_io.c

index 4c3ead5..17225eb 100644 (file)
@@ -5,4 +5,4 @@
 
 EXTRA_DIST = Speex.spec Speex.spec.in
 
-SUBDIRS = libspeex src
+SUBDIRS = libspeex @src@
index 5528203..554fcee 100644 (file)
@@ -32,9 +32,16 @@ dnl AC_DISABLE_STATIC
 AM_PROG_LIBTOOL
 
 AC_C_BIGENDIAN
-AC_CHECK_HEADERS(sys/soundcard.h ogg/ogg.h)
+AC_CHECK_HEADERS(sys/soundcard.h)
+src=src
+AC_CHECK_HEADERS(aogg/ogg.h, [], [src=])
 AC_CHECK_LIB(m, sin)
-AC_CHECK_LIB(ogg, ogg_stream_init, [LIB_OGG='-logg'; AC_SUBST(LIB_OGG)] , [ echo; echo "error: libogg is now required by speex"; echo "Get it from: http://www.ogg.org/ogg/index.html"; exit 1 ])
+
+AC_CHECK_LIB(ogg, ogg_stream_init, [LIB_OGG='-logg'; AC_SUBST(LIB_OGG)] , [ src=])
+AC_SUBST(src)
+
+dnl AC_CHECK_LIB(ogg, ogg_stream_init, [LIB_OGG='-logg'; AC_SUBST(LIB_OGG)] , [ echo; echo "error: libogg is now required by speex"; echo "Get it from: http://www.ogg.org/ogg/index.html"; exit 1 ])
+
 AC_FUNC_ALLOCA
 dnl AC_DEFINE(VERSION, "$VERSION")
 AC_DEFINE_UNQUOTED(VERSION, "${VERSION}")
@@ -43,3 +50,9 @@ dnl Output the makefiles and version.h.
 
 AC_OUTPUT([Makefile libspeex/Makefile src/Makefile Speex.spec ])
 
+if test "x$src" = "x"; then 
+echo "You don't seem to have libogg installed. Only the Speex library (libspeex) will be built (no encoder/decoder executable)"
+echo "You can get libogg from http://www.ogg.org/ogg/index.html"
+fi
+
+echo "Type \"make; make install\" to compile and install Speex";
index 6f13845..3b1d42f 100644 (file)
@@ -49,7 +49,7 @@ pf_params pf_params_nb = {
 /* Post-filter parameters for low bit-rate narrowband */
 pf_params pf_params_lbr = {
    0.65,      /* formant enhancement numerator */
-   0.7,      /* formant enhancement denominator */
+   0.72,      /* formant enhancement denominator */
    0.4       /* pitch enhancement factor */
 };
 
@@ -202,6 +202,7 @@ static SpeexNBMode low_sb_mode = {
 
 SpeexMode low_wb_mode = {
    &low_sb_mode,
+   "low sub-band (used internally)",
    -1,
    -1,
    &nb_encoder_init,
@@ -219,6 +220,7 @@ SpeexMode low_wb_mode = {
 
 SpeexMode speex_nb_mode = {
    &nb_mode,
+   "full-rate narrowband",
    0,
    0,
    &nb_encoder_init,
@@ -236,6 +238,7 @@ SpeexMode speex_nb_mode = {
 
 SpeexMode speex_nb_lbr_mode = {
    &nb_lbr_mode,
+   "low bit-rate narrowband",
    1,
    0,
    &nb_encoder_init,
@@ -276,6 +279,7 @@ static SpeexSBMode sb_wb_mode = {
 
 SpeexMode speex_wb_mode = {
    &sb_wb_mode,
+   "full-rate wideband (sub-band CELP)",
    2,
    0,
    &sb_encoder_init,
index 3e1eb71..479b078 100644 (file)
@@ -42,6 +42,7 @@ float *stack)
    float gain;
    pf_params *params;
    float *tmp_exc;
+   float formant_num, formant_den, voiced_fact;
 
    params = (pf_params*) par;
 
@@ -61,9 +62,18 @@ float *stack)
                                                );
    }
    
-   bw_lpc (params->formant_enh_num, ak, awk, p);
+   voiced_fact = pitch_gain[0]+pitch_gain[1]+pitch_gain[2];
+   if (voiced_fact<0)
+      voiced_fact=0;
+   if (voiced_fact>1)
+      voiced_fact=1;
+   formant_num = params->formant_enh_num;
+   formant_den =   voiced_fact    * params->formant_enh_den 
+                 + (1-voiced_fact)* params->formant_enh_num;
+
+   bw_lpc (formant_num, ak, awk, p);
    residue_mem(new_exc, awk, tmp_exc, nsf, p, mem);
-   bw_lpc (params->formant_enh_den, ak, awk, p);
+   bw_lpc (formant_den, ak, awk, p);
    syn_filt_mem(tmp_exc, awk, new_exc, nsf, p, mem2);
 
    for (i=0;i<nsf;i++)
index b9d258a..1977f4d 100644 (file)
@@ -40,37 +40,6 @@ extern float stoc[];
 
 #define sqr(x) ((x)*(x))
 
-float quant_high_gain[16]={
-   -2.387860,
-   -1.504710,
-   -0.988013,
-   -0.610249,
-   -0.310298,
-   -0.050495,
-   0.188963,
-   0.413744,
-   0.628971,
-   0.840555,
-   1.055630,
-   1.283410,
-   1.544990,
-   1.855790,
-   2.281910,
-   3.002660
-};
-
-
-float quant_high_gain2[8] = {
-   -1.51541,
-   -0.70324,
-   -0.17024,
-   0.26748,
-   0.67232,
-   1.08402,
-   1.56110,
-   2.25160,
-};
-
 
 #if 0
 #define QMF_ORDER 32
index 39ad026..b9f197f 100644 (file)
@@ -48,6 +48,9 @@ typedef struct SpeexMode {
    /** Pointer to the low-level mode data */
    void *mode;
 
+   /** The name of the mode (you should not rely on this to identify the mode)*/
+   char *modeName;
+
    /**ID of the mode*/
    int modeID;
 
index 020896e..bae1246 100644 (file)
@@ -36,6 +36,7 @@
 #include <string.h>
 #include "wav_io.h"
 #include "speex_header.h"
+#include "misc.h"
 
 #define MAX_FRAME_SIZE 2000
 
@@ -145,6 +146,9 @@ static void *process_header(ogg_packet *op, int pf_enabled, int *frame_size, int
    
    *rate = header->rate;
 
+   fprintf (stderr, "Decoding %d Hz audio at %d bps using %s mode\n", 
+            *rate, mode->bitrate, mode->modeName);
+
    free(header);
    return st;
 }
@@ -276,6 +280,7 @@ int main(int argc, char **argv)
                fout = out_file_open(outFile, rate);
 
             } else if (packet_count==1){
+               fprintf (stderr, "File comments: ");
                fwrite(op.packet, 1, op.bytes, stderr);
                fprintf (stderr, "\n");
             } else {
@@ -298,7 +303,7 @@ int main(int argc, char **argv)
                }
                /*Convert to short and save to output file*/
                for (i=0;i<frame_size;i++)
-                  out[i]=output[i];
+                  out[i]=(short)le_short(output[i]);
                fwrite(out, sizeof(short), frame_size, fout);
             }
             packet_count++;
index 1ec7369..d1cb147 100644 (file)
@@ -26,6 +26,7 @@
 #include <ogg/ogg.h>
 #include "wav_io.h"
 #include "speex_header.h"
+#include "misc.h"
 
 /*Write an Ogg page to a file pointer*/
 int oe_write_page(ogg_page *page, FILE *fp)
@@ -207,6 +208,9 @@ int main(int argc, char **argv)
 
    speex_init_header(&header, rate, 1, mode);
 
+   fprintf (stderr, "Encoding %d Hz audio at %d bps using %s mode\n", 
+            header.rate, mode->bitrate, mode->modeName);
+
    /*Initialize Speex encoder*/
    st = speex_encoder_init(mode);
 
@@ -274,7 +278,7 @@ int main(int argc, char **argv)
       if (feof(fin))
          break;
       for (i=0;i<frame_size;i++)
-         input[i]=in[i];
+         input[i]=(short)le_short(in[i]);
       /*Encode current frame*/
       speex_encode(st, input, &bits);
 
index a432883..e7204f1 100644 (file)
@@ -1,5 +1,6 @@
 /* Copyright (C) 2002 Jean-Marc Valin 
    File: wav_io.c
+   Routines to handle wav (RIFF) headers
 
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -18,6 +19,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include "misc.h"
 
 int read_wav_header(FILE *file, int *rate, int *channels, int *format, int *size)
 {
@@ -34,8 +36,7 @@ int read_wav_header(FILE *file, int *rate, int *channels, int *format, int *size
    }
 
    fread(&itmp, 4, 1, file);
-   /*FIXME: swap bytes*/
-   *size = itmp-36;
+   *size = le_int(itmp-36);
 
    fread(ch, 1, 4, file);
    if (strcmp(ch, "WAVE")!=0)
@@ -52,7 +53,7 @@ int read_wav_header(FILE *file, int *rate, int *channels, int *format, int *size
    }
    
    fread(&itmp, 4, 1, file);
-   /*FIXME: swap bytes*/
+   itmp = le_int(itmp);
    if (itmp!=16)
    {
       fprintf (stderr, "Only 16-bit PCM supported\n");
@@ -60,7 +61,7 @@ int read_wav_header(FILE *file, int *rate, int *channels, int *format, int *size
    }
 
    fread(&stmp, 2, 1, file);
-   /*FIXME: swap bytes*/
+   stmp = le_short(stmp);
    if (stmp!=1)
    {
       fprintf (stderr, "Only 16-bit PCM supported\n");
@@ -68,15 +69,15 @@ int read_wav_header(FILE *file, int *rate, int *channels, int *format, int *size
    }
 
    fread(&stmp, 2, 1, file);
-   /*FIXME: swap bytes*/
+   stmp = le_short(stmp);
    *channels = stmp;
 
    fread(&itmp, 4, 1, file);
-   /*FIXME: swap bytes*/
+   itmp = le_int(itmp);
    *rate = itmp;
 
    fread(&itmp, 4, 1, file);
-   /*FIXME: swap bytes*/
+   itmp = le_int(itmp);
    if (itmp!=*rate**channels*2)
    {
       fprintf (stderr, "Corrupted header: ByteRate mismatch\n");
@@ -84,7 +85,7 @@ int read_wav_header(FILE *file, int *rate, int *channels, int *format, int *size
    }
 
    fread(&stmp, 2, 1, file);
-   /*FIXME: swap bytes*/
+   stmp = le_short(stmp);
    if (stmp!=*channels*2)
    {
       fprintf (stderr, "Corrupted header: BlockAlign mismatch\n");
@@ -92,7 +93,7 @@ int read_wav_header(FILE *file, int *rate, int *channels, int *format, int *size
    }
 
    fread(&stmp, 2, 1, file);
-   /*FIXME: swap bytes*/
+   stmp = le_short(stmp);
    if (stmp!=16)
    {
       fprintf (stderr, "Only 16-bit linear supported\n");
@@ -108,7 +109,7 @@ int read_wav_header(FILE *file, int *rate, int *channels, int *format, int *size
 
    /*Ignore this for now*/
    fread(&itmp, 4, 1, file);
-   /*FIXME: swap bytes*/
+   itmp = le_int(itmp);
 
    *format=16;
 
@@ -132,30 +133,30 @@ void write_wav_header(FILE *file, int rate, int channels, int format, int size)
 
    fprintf (file, "WAVEfmt ");
 
-   itmp = 16;
+   itmp = le_int(16);
    fwrite(&itmp, 4, 1, file);
 
-   stmp = 1;
+   stmp = le_short(1);
    fwrite(&stmp, 2, 1, file);
 
-   stmp = channels;
+   stmp = le_short(channels);
    fwrite(&stmp, 2, 1, file);
 
-   itmp = rate;
+   itmp = le_int(rate);
    fwrite(&itmp, 4, 1, file);
 
-   itmp = rate*channels*2;
+   itmp = le_int(rate*channels*2);
    fwrite(&itmp, 4, 1, file);
 
-   stmp = 2*channels;
+   stmp = le_short(2*channels);
    fwrite(&stmp, 2, 1, file);
 
-   stmp = 16;
+   stmp = le_short(16);
    fwrite(&stmp, 2, 1, file);
 
    fprintf (file, "data");
 
-   itmp = 0x7fffffff;
+   itmp = le_int(0x7fffffff);
    fwrite(&itmp, 4, 1, file);