summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/en/mplayer.122
-rw-r--r--Makefile4
-rw-r--r--cfg-mencoder.h17
-rwxr-xr-xconfigure38
-rw-r--r--libmpcodecs/Makefile5
-rw-r--r--mencoder.c94
6 files changed, 180 insertions, 0 deletions
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1
index 7e5739a29a..7ca96c0df6 100644
--- a/DOCS/man/en/mplayer.1
+++ b/DOCS/man/en/mplayer.1
@@ -5105,6 +5105,28 @@ print additional options and informations on presets settings.
.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.
diff --git a/Makefile b/Makefile
index 869bbd528d..84dd39ea6a 100644
--- a/Makefile
+++ b/Makefile
@@ -36,6 +36,10 @@ CODEC_LIBS = $(AV_LIB) $(FAME_LIB) $(MAD_LIB) $(VORBIS_LIB) $(THEORA_LIB) $(FAAD
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)
diff --git a/cfg-mencoder.h b/cfg-mencoder.h
index 0d158f9b3a..d0ec47be12 100644
--- a/cfg-mencoder.h
+++ b/cfg-mencoder.h
@@ -55,6 +55,10 @@ m_option_t lameopts_conf[]={
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 @@ m_option_t oac_conf[]={
#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 @@ m_option_t oac_conf[]={
#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 @@ m_option_t mencoder_opts[]={
#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
diff --git a/configure b/configure
index cead991775..e9e686fac4 100755
--- a/configure
+++ b/configure
@@ -212,6 +212,7 @@ Codecs:
--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 @@ multiple paths separated by ':'):
--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 @@ _esd=auto
_jack=auto
_liblzo=auto
_mad=auto
+_toolame=auto
_vorbis=auto
_theora=auto
_mp3lib=yes
@@ -1429,6 +1432,7 @@ for ac_option do
--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 @@ for ac_option do
--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 @@ else
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_PLUGINS = $_xmms
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_xdpms
$_def_aa
$_def_caca
$_def_tga
+$_def_toolame
/* used by GUI: */
$_def_xshape
diff --git a/libmpcodecs/Makefile b/libmpcodecs/Makefile
index 90db1a0f2c..7b4a69bb9a 100644
--- a/libmpcodecs/Makefile
+++ b/libmpcodecs/Makefile
@@ -39,6 +39,11 @@ ifeq ($(JPEG),yes)
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)
diff --git a/mencoder.c b/mencoder.c
index faa06ac65a..30f19d51c1 100644
--- a/mencoder.c
+++ b/mencoder.c
@@ -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 @@ extern int avcodec_inited;
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 @@ case ACODEC_LAVC:
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(sh_audio){
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){