changeset 13426:0f92ad66bbb5

encoding to mp2 with libtoolame
author nicodvb
date Tue, 21 Sep 2004 19:50:54 +0000
parents a87f1a948a24
children 9d0b052c4f74
files DOCS/man/en/mplayer.1 Makefile cfg-mencoder.h configure libmpcodecs/Makefile mencoder.c
diffstat 6 files changed, 180 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/man/en/mplayer.1	Tue Sep 21 19:43:37 2004 +0000
+++ b/DOCS/man/en/mplayer.1	Tue Sep 21 19:50:54 2004 +0000
@@ -5105,6 +5105,28 @@
 .PD 1
 .
 .
+.SS toolame (\-toolameopts)
+.
+.TP
+.B br=<0\-384>
+specify bitrate in kBit (CBR only)
+.TP
+.B mode=<stereo  |  jstereo  |  mono  |  dual>
+(default: mono for 1-channel audio, stereo otherwise)
+.TP
+.B psy=<0\-3>
+psychoacoustic model, default is 2
+.TP
+.B errprot=<0 | 1>
+include error protection
+.TP
+.B debug=<0\-10>
+debug level
+.RE
+
+.PD 1
+.
+.
 .SS lavc (\-lavcopts)
 Many lavc options are very specialized and tersely documented.
 Read the source for full details.
--- a/Makefile	Tue Sep 21 19:43:37 2004 +0000
+++ b/Makefile	Tue Sep 21 19:50:54 2004 +0000
@@ -36,6 +36,10 @@
 COMMON_LIBS = libmpcodecs/libmpcodecs.a mp3lib/libMP3.a liba52/liba52.a libmpeg2/libmpeg2.a $(W32_LIB) $(DS_LIB) libaf/libaf.a libmpdemux/libmpdemux.a input/libinput.a postproc/libswscale.a osdep/libosdep.a $(DVDREAD_LIB) $(CODEC_LIBS) $(FREETYPE_LIB) $(TERMCAP_LIB) $(CDPARANOIA_LIB) $(MPLAYER_NETWORK_LIB) $(WIN32_LIB) $(GIF_LIB) $(MACOSX_FRAMEWORKS) $(SMBSUPPORT_LIB) $(FRIBIDI_LIB) $(FONTCONFIG_LIB) $(ENCA_LIB)
 
 CFLAGS = $(OPTFLAGS) -Ilibmpdemux -Iloader -Ilibvo $(FREETYPE_INC) $(EXTRA_INC) $(CDPARANOIA_INC) $(SDL_INC) $(X11_INC) $(FRIBIDI_INC) $(DVB_INC) $(XVID_INC) $(FONTCONFIG_INC) $(CACA_INC) # -Wall
+ifeq ($(TOOLAME),yes)
+CFLAGS += $(TOOLAME_EXTRAFLAGS) 
+CODEC_LIBS += $(TOOLAME_LIB)
+endif
 
 PARTS = libmpdemux libmpcodecs mp3lib liba52 libmpeg2 libavcodec libavformat libao2 drivers osdep postproc input libvo libaf
 ifeq ($(INTERNAL_FAAD),yes)
--- a/cfg-mencoder.h	Tue Sep 21 19:43:37 2004 +0000
+++ b/cfg-mencoder.h	Tue Sep 21 19:50:54 2004 +0000
@@ -55,6 +55,10 @@
 extern m_option_t lavcopts_conf[];
 #endif
 
+#ifdef HAVE_TOOLAME
+extern m_option_t toolameopts_conf[];
+#endif
+
 #ifdef USE_WIN32DLL
 extern m_option_t vfwopts_conf[];
 #endif
@@ -128,6 +132,11 @@
 #else
 	{"lavc", "MPlayer was compiled without libavcodec. See README or DOCS.\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},
 #endif
+#ifdef HAVE_TOOLAME
+	{"toolame", &out_audio_codec, CONF_TYPE_FLAG, 0, 0, ACODEC_TOOLAME, NULL},
+#else
+	{"toolame", "MPlayer was compiled without libtoolame. See README or DOCS.\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},
+#endif
 	{"help", "\nAvailable codecs:\n"
 	"   copy     - frame copy, without re-encoding (useful for AC3)\n"
 	"   pcm      - uncompressed PCM audio\n"
@@ -137,6 +146,9 @@
 #ifdef USE_LIBAVCODEC
 	"   lavc     - FFmpeg audio encoder (MP2, AC3, ...)\n"
 #endif
+#ifdef HAVE_TOOLAME
+	"   toolame  - Toolame MP2 audio encoder\n"
+#endif
 	"\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},
 	{NULL, NULL, 0, 0, 0, 0, NULL}
 };
@@ -241,6 +253,11 @@
 #else
 	{"lavcopts", "MPlayer was compiled without libavcodec. See README or DOCS.\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},
 #endif
+#ifdef HAVE_TOOLAME
+	{"toolameopts", toolameopts_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
+#else
+	{"toolameopts", "MPlayer was compiled without libtoolame. See README or DOCS.\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},
+#endif
 #ifdef USE_WIN32DLL
 	{"vfwopts", vfwopts_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
 #endif
--- a/configure	Tue Sep 21 19:43:37 2004 +0000
+++ b/configure	Tue Sep 21 19:50:54 2004 +0000
@@ -212,6 +212,7 @@
   --disable-internal-faad disable internal FAAD2 (AAC) support [autodetect]
   --disable-libdv        disable libdv 0.9.5 en/decoding support [autodetect]
   --disable-mad          disable libmad (MPEG audio) support [autodetect]
+  --disable-toolame      disable Toolame (MPEG layer 2 audio) support in mencoder [autodetect]
   --enable-xmms          build with XMMS inputplugin support [disabled]
   --disable-mp3lib       disable builtin mp3lib [enabled]
   --disable-liba52       disable builtin liba52 [enabled]
@@ -326,6 +327,7 @@
   --with-dtslibdir=DIR     libdts library in DIR  (*)
   --with-dtsincdir=DIR     libdts header in DIR (*)
   --with-livelibdir=DIR    LIVE.COM Streaming Media libraries in DIR
+  --with-toolamedir=DIR    path to Toolame library and include file
   --with-xmmsplugindir=DIR XMMS plugins in DIR
   --with-xmmslibdir=DIR    libxmms.so.1 in DIR
   --with-bio2jack=DIR      libbio2jack.a in DIR
@@ -1258,6 +1260,7 @@
 _jack=auto
 _liblzo=auto
 _mad=auto
+_toolame=auto
 _vorbis=auto
 _theora=auto
 _mp3lib=yes
@@ -1429,6 +1432,7 @@
   --disable-jack)	_jack=no	;;
   --enable-mad)		_mad=yes	;;
   --disable-mad)	_mad=no		;;
+  --disable-toolame)	_toolame=no	;;
   --enable-liblzo)	_liblzo=yes	;;
   --disable-liblzo)	_liblzo=no		;;
   --enable-vorbis)	_vorbis=yes	;;
@@ -1625,6 +1629,9 @@
   --with-livelibdir=*)
     _livelibdir=`echo $ac_option | cut -d '=' -f 2`
     ;;
+  --with-toolamedir=*)
+    _toolamedir=`echo $ac_option | cut -d '=' -f 2`
+    ;;
   --with-mlibdir=*)
     _mlibdir=`echo $ac_option | cut -d '=' -f 2`
     _mlib=yes
@@ -4844,6 +4851,33 @@
 fi
 echores "$_mad"
 
+echocheck "Toolame"
+if test "$_toolame" = auto ; then
+  cat > $TMPC <<EOF
+#include <toolame.h>
+int main(void) { toolame_init(); return 0; }
+EOF
+  _toolame=no
+  _toolame_extraflags=""
+  _toolame_lib="-ltoolame"
+  if test -n "$_toolamedir"; then
+    _toolame_extraflags="-I$_toolamedir -L$_toolamedir"
+  fi
+  cc_check $_toolame_extraflags $_toolame_lib -lm && _toolame=yes
+fi
+if test "$_toolame" = yes ; then
+  _def_toolame='#define HAVE_TOOLAME 1'
+  _codecmodules="$_codecmodules toolame"
+else
+  _def_toolame='#undef HAVE_TOOLAME'
+  _toolame_lib=""
+  _nocodecmodules="toolame $_nocodecmodules"
+fi
+if test -z "$_toolamedir" ; then
+  echores "$_toolame"
+else
+  echores "$_toolame (using $_toolamedir)"
+fi
 
 echocheck "OggVorbis support"
 if test "$_vorbis" = auto ; then
@@ -6351,6 +6385,9 @@
 XMMS_LIB = $_xmms_lib
 MACOSX = $_macosx
 MACOSX_FRAMEWORKS = $_macosx_frameworks
+TOOLAME=$_toolame
+TOOLAME_EXTRAFLAGS=$_toolame_extraflags
+TOOLAME_LIB=$_toolame_lib
 
 # --- Some stuff for autoconfigure ----
 $_target_arch
@@ -6966,6 +7003,7 @@
 $_def_aa
 $_def_caca
 $_def_tga
+$_def_toolame
 
 /* used by GUI: */
 $_def_xshape
--- a/libmpcodecs/Makefile	Tue Sep 21 19:43:37 2004 +0000
+++ b/libmpcodecs/Makefile	Tue Sep 21 19:50:54 2004 +0000
@@ -39,6 +39,11 @@
 VIDEO_SRCS += vd_ijpg.c
 endif
 
+ifeq ($(TOOLAME),yes)
+AUDIO_SRCS += ae_toolame.c
+EXTRA_INC += $(TOOLAME_EXTRAFLAGS)
+endif
+
 SRCS=$(AUDIO_SRCS) $(VIDEO_SRCS) $(VFILTER_SRCS) $(NATIVE_SRCS) img_format.c
 OBJS=$(SRCS:.c=.o)
 
--- a/mencoder.c	Tue Sep 21 19:43:37 2004 +0000
+++ b/mencoder.c	Tue Sep 21 19:50:54 2004 +0000
@@ -16,6 +16,7 @@
 #define ACODEC_VBRMP3 2
 #define ACODEC_NULL 3
 #define ACODEC_LAVC 4
+#define ACODEC_TOOLAME 5
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -95,6 +96,11 @@
 static uint32_t lavc_find_atag(char *codec);
 #endif
 
+#ifdef HAVE_TOOLAME
+#include "libmpcodecs/ae_toolame.h"
+static mpae_toolame_ctx *mpae_toolame;
+#endif
+
 int vo_doublebuffering=0;
 int vo_directrendering=0;
 int vo_config_count=0;
@@ -987,6 +993,70 @@
 
     break;
 #endif
+
+#ifdef HAVE_TOOLAME
+case ACODEC_TOOLAME:
+{
+    int cn = audio_output_channels ? audio_output_channels : sh_audio->channels;
+    int sr = force_srate ? force_srate : sh_audio->samplerate;
+    int br;
+
+    mpae_toolame = mpae_init_toolame(cn, sr);
+    if(mpae_toolame == NULL)
+    {
+	mp_msg(MSGT_MENCODER, MSGL_FATAL, "Couldn't open toolame codec, exiting\n");
+	exit(1);
+    }
+    
+    br = mpae_toolame->bitrate;
+
+    mux_a->wf = malloc(sizeof(WAVEFORMATEX)+256);
+    mux_a->wf->wFormatTag = 0x50;
+    mux_a->wf->nChannels = cn;
+    mux_a->wf->nSamplesPerSec = sr;
+    mux_a->wf->nAvgBytesPerSec = 1000 * (br / 8);
+    mux_a->h.dwRate = mux_a->wf->nAvgBytesPerSec;
+    mux_a->h.dwScale = (mux_a->wf->nAvgBytesPerSec * 1152)/ mux_a->wf->nSamplesPerSec; /* for cbr */
+
+    if ((mux_a->wf->nAvgBytesPerSec *
+	1152) % mux_a->wf->nSamplesPerSec) {
+	mux_a->h.dwScale = 1152;
+	mux_a->h.dwRate = sr;
+	mux_a->h.dwSampleSize = 0; // Blocksize not constant
+    } else {
+	mux_a->h.dwSampleSize = mux_a->h.dwScale;
+    }
+    mux_a->wf->nBlockAlign = mux_a->h.dwScale;
+    mux_a->h.dwSuggestedBufferSize = audio_preload*mux_a->wf->nAvgBytesPerSec;
+    mux_a->h.dwSuggestedBufferSize -= mux_a->h.dwSuggestedBufferSize % mux_a->wf->nBlockAlign;
+
+    mux_a->wf->cbSize = 12;
+    mux_a->wf->wBitsPerSample = 0; /* does not apply */
+    ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->wID = 1;
+    ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->fdwFlags = 2;
+    ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nBlockSize = mux_a->wf->nBlockAlign;
+    ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nFramesPerBlock = 1;
+    ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nCodecDelay = 0;
+	
+    // Fix allocation    
+    mux_a->wf = realloc(mux_a->wf, sizeof(WAVEFORMATEX)+mux_a->wf->cbSize);
+
+    // setup filter:
+    if (!init_audio_filters(
+	sh_audio,
+	sh_audio->samplerate, sh_audio->channels,
+	sh_audio->sample_format, sh_audio->samplesize,
+	mux_a->wf->nSamplesPerSec, mux_a->wf->nChannels,
+	AFMT_S16_NE, 2,
+	mux_a->h.dwSuggestedBufferSize,
+	mux_a->h.dwSuggestedBufferSize*2)) {
+	mp_msg(MSGT_CPLAYER, MSGL_ERR, "Couldn't find matching filter / ao format!\n");
+	exit(1);
+    }
+
+    break;
+}
+#endif
 }
 
 if (verbose>1) print_wave_header(mux_a->wf);
@@ -1146,6 +1216,30 @@
 	    if (mux_v->timer == 0) mux_a->h.dwInitialFrames++;
 	}
 #endif
+#ifdef HAVE_TOOLAME
+	if((mux_a->codec == ACODEC_TOOLAME) && (mpae_toolame != NULL)){
+	    int  size, rd_len;
+	    uint8_t buf[1152*2*2];
+	    size = 1152 * 2 * mux_a->wf->nChannels;
+
+	    rd_len = dec_audio(sh_audio, buf, size);
+	    if(rd_len != size)
+		break;
+
+	    // Encode one frame
+	    mux_a->buffer_len += mpae_encode_toolame(mpae_toolame, mux_a->buffer + mux_a->buffer_len, 1152, (void*)buf, mux_a->buffer_size-mux_a->buffer_len);
+	    if (mux_a->h.dwSampleSize) { /* CBR */
+		if (mux_a->buffer_len < mux_a->wf->nBlockAlign) {
+		    len = 0;
+		} else {
+		    len = mux_a->wf->nBlockAlign*(mux_a->buffer_len/mux_a->wf->nBlockAlign);
+		}
+	    } else { /* VBR */
+		len = mux_a->buffer_len;
+	    }
+	    if (mux_v->timer == 0) mux_a->h.dwInitialFrames++;
+	}
+#endif
 	if(mux_a->h.dwSampleSize){
 	    // CBR - copy 0.5 sec of audio
 	    switch(mux_a->codec){