added cbr, abr and vbr setting feature with encoding quality

This commit is contained in:
darkeye 2002-04-13 11:26:00 +00:00
parent ae1f874cea
commit 7e9555b97c
11 changed files with 535 additions and 297 deletions

View File

@ -1,3 +1,9 @@
DarkIce 0.10
o added possibility to select constant, average and variable bit rate
encoding modes with specifying encoding quality as well.
thanks to Nicu Pavel <npavel@ituner.com>
09-04-2002: DarkIce 0.9.1 released
o bugfix: a memory leak was introduced in 0.9, which is fixed thanks to

View File

@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT(src/DarkIce.cpp)
AM_INIT_AUTOMAKE(darkice, 0.9.1)
AM_INIT_AUTOMAKE(darkice, 0.10beta)
AM_CONFIG_HEADER(config.h)

View File

@ -17,7 +17,9 @@ channel = 2 # channels. 1 = mono, 2 = stereo
# there may be up to 8 of these sections, named [icecast-0] ... [icecast-7]
# these can be mixed with [icecast2-x] and [shoutcast-x] sections
[icecast-0]
bitrateMode = cbr # constant bit rate
bitrate = 96 # bitrate of the mp3 stream sent to the server
quality = 0.8 # encoding quality
server = yp.yourserver.com
# host name of the server
port = 8000 # port of the IceCast server, usually 8000
@ -36,6 +38,7 @@ public = yes # advertise this stream?
# there may be up to 8 of these sections, named [icecast2-0] ... [icecast2-7]
# these can be mixed with [icecast-x] and [shoutcast-x] sections
[icecast2-0]
bitrateMode = abr # average bit rate
format = vorbis # format of the stream: ogg vorbis
bitrate = 96 # bitrate of the stream sent to the server
server = yp.yourserver.com
@ -56,7 +59,8 @@ public = yes # advertise this stream?
# there may be up to 8 of these sections, named [shoutcast-0] ... [shoutcast-7]
# these can be mixed with [icecast-x] and [icecast2-x] sections
[shoutcast-0]
bitrate = 96 # bitrate of the mp3 stream sent to the server
bitrateMode = vbr # variable bit rate mode
quality = 0.5 # encoding quality
server = yp.yourserver.com
# host name of the server
port = 8001 # source port of the ShoutCast server, usually 8001

View File

@ -1,4 +1,4 @@
.TH darkice 1 "September 18, 2001" "DarkIce" "DarkIce live audio streamer"
.TH darkice 1 "April 13, 2002" "DarkIce" "DarkIce live audio streamer"
.SH NAME
darkice \- an icecast / shoutcast live audio streamer
.SH SYNOPSIS
@ -81,6 +81,9 @@ Ogg Vorbis encoding code based on the contribution of aNa|0Gue
BSD porting help from Robin P. Blanchard
.I <Robin_Blanchard@gactr.uga.edu>
CBR, ABR and VBR and encoding quality setting feature from Nicu Pavel
.I <npavel@ituner.com>
.SH LINKS
Project homepage:

View File

@ -1,4 +1,4 @@
.TH darkice.cfg 5 "March 28, 2002" "DarkIce" "DarkIce live audio streamer"
.TH darkice.cfg 5 "April 13, 2002" "DarkIce" "DarkIce live audio streamer"
.SH NAME
darkice.cfg \- configuration file for darkice
.SH DESCRIPTION
@ -86,9 +86,21 @@ The stream will be reachable at
Required values:
.TP
.I bitrateMode
The bit rate mode of the encoding, either "cbr", "abr" or "vbr",
standing for constant bit rate, average bit rate and variable bit
respectively. Use the bitrate and/or quality values to specify details
of the appropriate bit rate mode.
.TP
.I bitrate
Bit rate to encode to in kBits / sec (e.g. 96)
Bit rate to encode to in kBits / sec (e.g. 96). Only used when cbr or
abr bit rate modes are specified.
.TP
.I quality
The quality of encoding a value between 0.0 .. 1.0 (e.g. 0.8), with 1.0 being
the highest quality. Use a value greater than 0.0. Only used when cbr or vbr
bit rate modes are specified.
.TP
.I server
The
@ -177,14 +189,20 @@ Format of the stream sent to the
.B IceCast2
server. Currently the only supported value here is 'vorbis'.
.TP
.I bitrateMode
The bit rate mode of the encoding, either "cbr", "abr" or "vbr",
standing for constant bit rate, average bit rate and variable bit
respectively. Use the bitrate and/or quality values to specify details
of the appropriate bit rate mode.
.TP
.I bitrate
Bit rate to encode to in kBits / sec (e.g. 96)
If specified, the quality field may not be specified.
Bit rate to encode to in kBits / sec (e.g. 96). Only used when cbr or
abr bit rate modes are specified.
.TP
.I quality
Quality of a variable bitrate stream, a number between 0.0 ... 1.0
(e.g. 0.8).
If specified, the bitrate field may not be specified.
The quality of encoding a value between 0.0 .. 1.0 (e.g. 0.8), with 1.0 being
the highest quality. Use a value greater than 0.0. Only used when cbr or vbr
bit rate modes are specified.
.TP
.I server
The
@ -244,9 +262,21 @@ The stream will be reachable at
Required values:
.TP
.I bitrateMode
The bit rate mode of the encoding, either "cbr", "abr" or "vbr",
standing for constant bit rate, average bit rate and variable bit
respectively. Use the bitrate and/or quality values to specify details
of the appropriate bit rate mode.
.TP
.I bitrate
Bit rate to encode to in kBits / sec (e.g. 96)
Bit rate to encode to in kBits / sec (e.g. 96). Only used when cbr or
abr bit rate modes are specified.
.TP
.I quality
The quality of encoding a value between 0.0 .. 1.0 (e.g. 0.8), with 1.0 being
the highest quality. Use a value greater than 0.0. Only used when cbr or vbr
bit rate modes are specified.
.TP
.I server
The
@ -319,8 +349,20 @@ Required values:
.I format
Format to encode in. Must be either 'mp3' or 'vorbis'.
.TP
.I bitrateMode
The bit rate mode of the encoding, either "cbr", "abr" or "vbr",
standing for constant bit rate, average bit rate and variable bit
respectively. Use the bitrate and/or quality values to specify details
of the appropriate bit rate mode.
.TP
.I bitrate
Bit rate to encode to in kBits / sec (e.g. 96)
Bit rate to encode to in kBits / sec (e.g. 96). Only used when cbr or
abr bit rate modes are specified.
.TP
.I quality
The quality of encoding a value between 0.0 .. 1.0 (e.g. 0.8), with 1.0 being
the highest quality. Use a value greater than 0.0. Only used when cbr or vbr
bit rate modes are specified.
.TP
.I fileName
The name of the local file to save the encoded data into.
@ -355,7 +397,8 @@ at 22.05kHz, 16 bit stereo.
It will build up a connection to the
.B IceCast
server yp.yourserver.com on port 8000 with the password "hackme".
The stream will be encoded to 96 kb/s mp3, and will be reachable at
The stream will be encoded to 96 kb/s mp3 with quality 0.8, and will be
reachable at
.I http://yp.yourserver.com:8000/live96
to mp3 players.
The encoding session will be stored by
@ -380,7 +423,9 @@ bitsPerSample = 16
channel = 2
[icecast-0]
bitrateMode = cbr
bitrate = 96
quality = 0.8
server = yp.yourserver.com
port = 8000
password = hackme
@ -397,8 +442,8 @@ localDumpFile = /tmp/encoder-dump.mp3
.PP
The following sample configuration file simply encodes the 16 bit stereo
44.1 kHz sound card input into Ogg Vorbis at 96 kb/s for 60 seconds, and saves
it in the local file at /tmp/save.ogg.
44.1 kHz sound card input into Ogg Vorbis at average bit rate 96 kb/s for 60
seconds, and saves it in the local file at /tmp/save.ogg.
.nf
[general]
@ -413,6 +458,7 @@ channel = 2
[file-0]
format = vorbis
bitrateMode = abr
bitrate = 96
fileName = /tmp/save.ogg
.fi
@ -429,7 +475,8 @@ It will build up a connection to an
.B IceCast
server yp.your-ice-server.com on port 8000 with the password "ice-hackme".
The sound for this stream will be cut at 10500 Hz from above.
The stream will be encoded to 96 kb/s mp3 and resampled to 22.05kHz.
The stream will be encoded to average bit rate 96 kb/s mp3 and resampled to
22.05kHz.
The stream will be reachable at
.I http://yp.your-ice-server.com:8000/live96
to mp3 players.
@ -442,7 +489,8 @@ on the server side.
It will also connect to a
.I ShoutCast
server at yp.your-shout-server.com on port 8001 with the password "shout-hackme"
This stream will be encoded to 128 kb/s mp3, and will be reachable at
This stream will be encoded to constant bit rate 128 kb/s mp3 with quality
0.8, and will be reachable at
.I http://yp.your-shout-server.com:8000
to mp3 players.
@ -459,6 +507,7 @@ channel = 2
[icecast-0]
sampleRate = 22050
bitrateMode = abr
bitrate = 96
lowpass = 10500
server = yp.your-ice-server.com
@ -473,7 +522,9 @@ public = yes
remoteDumpFile = /tmp/live96.mp3
[shoutcast-0]
bitrateMode = cbr
bitrate = 128
quality = 0.8
server = yp.your-shout-server.com
port = 8001
password = shout-hackme

View File

@ -57,6 +57,18 @@
*/
class AudioEncoder : public Sink, public virtual Referable
{
public:
/**
* Type to specify bitrate mode. Possible values:
* - cbr - constant bitrate mode
* described by bitrate
* - abr - average bitrate mode
* described by an average bitrate and quality
* - vbr - variable bitrate mode
* described by quality
*/
enum BitrateMode { cbr, abr, vbr };
private:
/**
@ -79,6 +91,11 @@ class AudioEncoder : public Sink, public virtual Referable
*/
bool inBigEndian;
/**
* The bitrate mode of the encoder
*/
BitrateMode outBitrateMode;
/**
* Bit rate of the output in kbits/sec, for fixed bitrate encodings.
*/
@ -105,7 +122,8 @@ class AudioEncoder : public Sink, public virtual Referable
* @param inSampleRate sample rate of the input.
* @param inBitsPerSample number of bits per sample of the input.
* @param inChannel number of channels of the input.
* @param inBigEndian shows if the input is big or little endian
* @param inBigEndian shows if the input is big or little endian.
* @param outBitrateMode the bit rate mode of the output.
* @param outBitrate bit rate of the output.
* @param outSampleRate sample rate of the output.
* @param outChannel number of channels of the output.
@ -116,8 +134,9 @@ class AudioEncoder : public Sink, public virtual Referable
unsigned int inBitsPerSample,
unsigned int inChannel,
bool inBigEndian,
BitrateMode outBitrateMode,
unsigned int outBitrate,
float outQuality,
double outQuality,
unsigned int outSampleRate,
unsigned int outChannel ) throw ( Exception )
{
@ -125,10 +144,15 @@ class AudioEncoder : public Sink, public virtual Referable
this->inBitsPerSample = inBitsPerSample;
this->inChannel = inChannel;
this->inBigEndian = inBigEndian;
this->outBitrateMode = outBitrateMode;
this->outBitrate = outBitrate;
this->outQuality = outQuality;
this->outSampleRate = outSampleRate;
this->outChannel = outChannel;
if ( outQuality < 0 || 1.0 < outQuality ) {
throw Exception( __FILE__, __LINE__, "invalid encoder quality");
}
}
/**
@ -156,46 +180,14 @@ class AudioEncoder : public Sink, public virtual Referable
}
/**
* Constructor for fixed bitrate encoding.
* Constructor.
*
* @param inSampleRate sample rate of the input.
* @param inBitsPerSample number of bits per sample of the input.
* @param inChannel number of channels of the input.
* @param inBigEndian shows if the input is big or little endian
* @param outBitrateMode the bit rate mode of the output.
* @param outBitrate bit rate of the output (kbits/sec).
* @param outSampleRate sample rate of the output.
* If 0, inSampleRate is used.
* @param outChannel number of channels of the output.
* If 0, inChannel is used.
* @exception Exception
*/
inline
AudioEncoder ( unsigned int inSampleRate,
unsigned int inBitsPerSample,
unsigned int inChannel,
bool inBigEndian,
unsigned int outBitrate,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0 )
throw ( Exception )
{
init ( inSampleRate,
inBitsPerSample,
inChannel,
inBigEndian,
outBitrate,
0.0,
outSampleRate ? outSampleRate : inSampleRate,
outChannel ? outChannel : inChannel );
}
/**
* Constructor for variable bitrate encoding.
*
* @param inSampleRate sample rate of the input.
* @param inBitsPerSample number of bits per sample of the input.
* @param inChannel number of channels of the input.
* @param inBigEndian shows if the input is big or little endian
* @param outQuality the quality of the stream.
* @param outSampleRate sample rate of the output.
* If 0, inSampleRate is used.
@ -208,6 +200,8 @@ class AudioEncoder : public Sink, public virtual Referable
unsigned int inBitsPerSample,
unsigned int inChannel,
bool inBigEndian,
BitrateMode outBitrateMode,
unsigned int outBitrate,
double outQuality,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0 )
@ -217,46 +211,20 @@ class AudioEncoder : public Sink, public virtual Referable
inBitsPerSample,
inChannel,
inBigEndian,
0,
outBitrateMode,
outBitrate,
outQuality,
outSampleRate ? outSampleRate : inSampleRate,
outChannel ? outChannel : inChannel );
}
/**
* Constructor for fixed bitrate encoding.
* Constructor.
*
* @param as get input sample rate, bits per sample and channels
* from this AudioSource.
* @param outBitrateMode the bit rate mode of the output.
* @param outBitrate bit rate of the output (kbits/sec).
* @param outSampleRate sample rate of the output.
* If 0, input sample rate is used.
* @param outChannel number of channels of the output.
* If 0, input channel is used.
* @exception Exception
*/
inline
AudioEncoder ( const AudioSource * as,
unsigned int outBitrate,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0 )
throw ( Exception)
{
init( as->getSampleRate(),
as->getBitsPerSample(),
as->getChannel(),
as->isBigEndian(),
outBitrate,
0.0,
outSampleRate ? outSampleRate : as->getSampleRate(),
outChannel ? outChannel : as->getChannel() );
}
/**
* Constructor for variable bitrate encoding.
*
* @param as get input sample rate, bits per sample and channels
* from this AudioSource.
* @param outQuality the quality of the stream.
* @param outSampleRate sample rate of the output.
* If 0, input sample rate is used.
@ -266,6 +234,8 @@ class AudioEncoder : public Sink, public virtual Referable
*/
inline
AudioEncoder ( const AudioSource * as,
BitrateMode outBitrateMode,
unsigned int outBitrate,
double outQuality,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0 )
@ -274,8 +244,9 @@ class AudioEncoder : public Sink, public virtual Referable
init( as->getSampleRate(),
as->getBitsPerSample(),
as->getChannel(),
as->isBigEndian(),
0,
as->isBigEndian(),
outBitrateMode,
outBitrate,
outQuality,
outSampleRate ? outSampleRate : as->getSampleRate(),
outChannel ? outChannel : as->getChannel() );
@ -293,6 +264,7 @@ class AudioEncoder : public Sink, public virtual Referable
encoder.inBitsPerSample,
encoder.inChannel,
encoder.inBigEndian,
encoder.outBitrateMode,
encoder.outBitrate,
encoder.outQuality,
encoder.outSampleRate,
@ -316,6 +288,7 @@ class AudioEncoder : public Sink, public virtual Referable
encoder.inBitsPerSample,
encoder.inChannel,
encoder.inBigEndian,
encoder.outBitrateMode,
encoder.outBitrate,
encoder.outQuality,
encoder.outSampleRate,
@ -405,6 +378,17 @@ class AudioEncoder : public Sink, public virtual Referable
return outSampleRate;
}
/**
* Get the bit rate mode of the output.
*
* @return the bit rate mode of the output.
*/
inline BitrateMode
getOutBitrateMode ( void ) const throw ()
{
return outBitrateMode;
}
/**
* Get the bit rate of the output in kbits/sec, for fixed bitrate
* encodings.
@ -429,18 +413,6 @@ class AudioEncoder : public Sink, public virtual Referable
return outQuality;
}
/**
* Tell if this encoding is fixed bitrate or variable bitrate.
*
* @return <code>true</code> if this encoding is variable bitrate,
* <code>false</code> if fixed bitrate.
*/
inline bool
isVBR ( void ) const throw ()
{
return outBitrate == 0;
}
/**
* Check wether encoding is in progress.
*
@ -484,6 +456,9 @@ class AudioEncoder : public Sink, public virtual Referable
$Source$
$Log$
Revision 1.7 2002/04/13 11:26:00 darkeye
added cbr, abr and vbr setting feature with encoding quality
Revision 1.6 2002/03/28 16:39:32 darkeye
added interface for variable bitrate encoding

View File

@ -198,29 +198,68 @@ DarkIce :: configIceCast ( const Config & config,
stream);
#else
const char * str;
const char * str;
unsigned int sampleRate = 0;
unsigned int bitrate = 0;
const char * server = 0;
unsigned int port = 0;
const char * password = 0;
const char * mountPoint = 0;
const char * remoteDumpFile = 0;
const char * name = 0;
const char * description = 0;
const char * url = 0;
const char * genre = 0;
bool isPublic = false;
int lowpass = 0;
int highpass = 0;
const char * localDumpName = 0;
FileSink * localDumpFile = 0;
unsigned int sampleRate = 0;
AudioEncoder::BitrateMode bitrateMode;
unsigned int bitrate = 0;
double quality = 0.0;
const char * server = 0;
unsigned int port = 0;
const char * password = 0;
const char * mountPoint = 0;
const char * remoteDumpFile = 0;
const char * name = 0;
const char * description = 0;
const char * url = 0;
const char * genre = 0;
bool isPublic = false;
int lowpass = 0;
int highpass = 0;
const char * localDumpName = 0;
FileSink * localDumpFile = 0;
str = cs->get( "sampleRate");
sampleRate = str ? Util::strToL( str) : dsp->getSampleRate();
str = cs->getForSure("bitrate", " missing in section ", stream);
bitrate = Util::strToL( str);
str = cs->get( "bitrate");
bitrate = str ? Util::strToL( str) : 0;
str = cs->get( "quality");
quality = str ? Util::strToD( str) : 0.0;
str = cs->getForSure( "bitrateMode",
" not specified in section ",
stream);
if ( Util::strEq( str, "cbr") ) {
bitrateMode = AudioEncoder::cbr;
if ( bitrate == 0 ) {
throw Exception( __FILE__, __LINE__,
"bitrate not specified for CBR encoding");
}
if ( quality == 0 ) {
throw Exception( __FILE__, __LINE__,
"quality not specified for CBR encoding");
}
} else if ( Util::strEq( str, "abr") ) {
bitrateMode = AudioEncoder::abr;
if ( bitrate == 0 ) {
throw Exception( __FILE__, __LINE__,
"bitrate not specified for ABR encoding");
}
} else if ( Util::strEq( str, "vbr") ) {
bitrateMode = AudioEncoder::vbr;
if ( quality == 0 ) {
throw Exception( __FILE__, __LINE__,
"quality not specified for VBR encoding");
}
} else {
throw Exception( __FILE__, __LINE__,
"invalid bitrate mode: ", str);
}
server = cs->getForSure( "server", " missing in section ", stream);
str = cs->getForSure( "port", " missing in section ", stream);
port = Util::strToL( str);
@ -239,6 +278,7 @@ DarkIce :: configIceCast ( const Config & config,
lowpass = str ? Util::strToL( str) : 0;
str = cs->get( "highpass");
highpass = str ? Util::strToL( str) : 0;
localDumpName = cs->get( "localDumpFile");
// go on and create the things
@ -278,7 +318,9 @@ DarkIce :: configIceCast ( const Config & config,
audioOuts[u].encoder = new LameLibEncoder( audioOuts[u].server.get(),
dsp.get(),
bitrateMode,
bitrate,
quality,
sampleRate,
dsp->getChannel(),
lowpass,
@ -316,23 +358,24 @@ DarkIce :: configIceCast2 ( const Config & config,
break;
}
const char * str;
const char * str;
IceCast2::StreamFormat format;
unsigned int sampleRate = 0;
unsigned int bitrate = 0;
double quality = 0.0;
const char * server = 0;
unsigned int port = 0;
const char * password = 0;
const char * mountPoint = 0;
const char * name = 0;
const char * description = 0;
const char * url = 0;
const char * genre = 0;
bool isPublic = false;
const char * localDumpName = 0;
FileSink * localDumpFile = 0;
IceCast2::StreamFormat format;
unsigned int sampleRate = 0;
AudioEncoder::BitrateMode bitrateMode;
unsigned int bitrate = 0;
double quality = 0.0;
const char * server = 0;
unsigned int port = 0;
const char * password = 0;
const char * mountPoint = 0;
const char * name = 0;
const char * description = 0;
const char * url = 0;
const char * genre = 0;
bool isPublic = false;
const char * localDumpName = 0;
FileSink * localDumpFile = 0;
str = cs->getForSure( "format", " missing in section ", stream);
if ( Util::strEq( str, "vorbis") ) {
@ -356,18 +399,40 @@ DarkIce :: configIceCast2 ( const Config & config,
bitrate = str ? Util::strToL( str) : 0;
str = cs->get( "quality");
quality = str ? Util::strToD( str) : 0.0;
if ( bitrate == 0 && quality == 0.0 ) {
throw Exception( __FILE__, __LINE__,
"neither fixed bitrate nor VBR quality specified in ",
stream);
}
if ( bitrate != 0 && quality != 0.0 ) {
throw Exception( __FILE__, __LINE__,
"both fixed bitrate and VBR quality specified in ",
stream);
}
str = cs->getForSure( "bitrateMode",
" not specified in section ",
stream);
if ( Util::strEq( str, "cbr") ) {
bitrateMode = AudioEncoder::cbr;
if ( bitrate == 0 ) {
throw Exception( __FILE__, __LINE__,
"bitrate not specified for CBR encoding");
}
if ( quality == 0 ) {
throw Exception( __FILE__, __LINE__,
"quality not specified for CBR encoding");
}
} else if ( Util::strEq( str, "abr") ) {
bitrateMode = AudioEncoder::abr;
if ( bitrate == 0 ) {
throw Exception( __FILE__, __LINE__,
"bitrate not specified for ABR encoding");
}
} else if ( Util::strEq( str, "vbr") ) {
bitrateMode = AudioEncoder::vbr;
if ( quality == 0 ) {
throw Exception( __FILE__, __LINE__,
"quality not specified for VBR encoding");
}
} else {
throw Exception( __FILE__, __LINE__,
"invalid bitrate mode: ", str);
}
server = cs->getForSure( "server", " missing in section ", stream);
str = cs->getForSure( "port", " missing in section ", stream);
port = Util::strToL( str);
@ -429,7 +494,9 @@ DarkIce :: configIceCast2 ( const Config & config,
audioOuts[u].encoder = new LameLibEncoder(
audioOuts[u].server.get(),
dsp.get(),
bitrateMode,
bitrate,
quality,
sampleRate,
dsp->getChannel() );
#endif // HAVE_LAME_LIB
@ -442,21 +509,14 @@ DarkIce :: configIceCast2 ( const Config & config,
"thus can't Ogg Vorbis stream: ",
stream);
#else
if ( bitrate != 0 ) {
audioOuts[u].encoder = new VorbisLibEncoder(
audioOuts[u].server.get(),
dsp.get(),
bitrate,
sampleRate,
dsp->getChannel() );
} else {
audioOuts[u].encoder = new VorbisLibEncoder(
audioOuts[u].server.get(),
dsp.get(),
quality,
sampleRate,
dsp->getChannel() );
}
audioOuts[u].encoder = new VorbisLibEncoder(
audioOuts[u].server.get(),
dsp.get(),
bitrateMode,
bitrate,
quality,
sampleRate,
dsp->getChannel() );
#endif // HAVE_VORBIS_LIB
break;
@ -480,7 +540,7 @@ DarkIce :: configShoutCast ( const Config & config,
unsigned int bufferSecs )
throw ( Exception )
{
// look for IceCast encoder output streams,
// look for Shoutcast encoder output streams,
// sections [shoutcast-0], [shoutcast-1], ...
char stream[] = "shoutcast- ";
size_t streamLen = Util::strLen( stream);
@ -503,29 +563,68 @@ DarkIce :: configShoutCast ( const Config & config,
stream);
#else
const char * str;
const char * str;
unsigned int sampleRate = 0;
unsigned int bitrate = 0;
const char * server = 0;
unsigned int port = 0;
const char * password = 0;
const char * name = 0;
const char * url = 0;
const char * genre = 0;
bool isPublic = false;
int lowpass = 0;
int highpass = 0;
const char * irc = 0;
const char * aim = 0;
const char * icq = 0;
const char * localDumpName = 0;
FileSink * localDumpFile = 0;
unsigned int sampleRate = 0;
AudioEncoder::BitrateMode bitrateMode;
unsigned int bitrate = 0;
double quality = 0.0;
const char * server = 0;
unsigned int port = 0;
const char * password = 0;
const char * name = 0;
const char * url = 0;
const char * genre = 0;
bool isPublic = false;
int lowpass = 0;
int highpass = 0;
const char * irc = 0;
const char * aim = 0;
const char * icq = 0;
const char * localDumpName = 0;
FileSink * localDumpFile = 0;
str = cs->get( "sampleRate");
sampleRate = str ? Util::strToL( str) : dsp->getSampleRate();
str = cs->getForSure("bitrate", " missing in section ", stream);
bitrate = Util::strToL( str);
str = cs->get( "bitrate");
bitrate = str ? Util::strToL( str) : 0;
str = cs->get( "quality");
quality = str ? Util::strToD( str) : 0.0;
str = cs->getForSure( "bitrateMode",
" not specified in section ",
stream);
if ( Util::strEq( str, "cbr") ) {
bitrateMode = AudioEncoder::cbr;
if ( bitrate == 0 ) {
throw Exception( __FILE__, __LINE__,
"bitrate not specified for CBR encoding");
}
if ( quality == 0 ) {
throw Exception( __FILE__, __LINE__,
"quality not specified for CBR encoding");
}
} else if ( Util::strEq( str, "abr") ) {
bitrateMode = AudioEncoder::abr;
if ( bitrate == 0 ) {
throw Exception( __FILE__, __LINE__,
"bitrate not specified for ABR encoding");
}
} else if ( Util::strEq( str, "vbr") ) {
bitrateMode = AudioEncoder::vbr;
if ( quality == 0 ) {
throw Exception( __FILE__, __LINE__,
"quality not specified for VBR encoding");
}
} else {
throw Exception( __FILE__, __LINE__,
"invalid bitrate mode: ", str);
}
server = cs->getForSure( "server", " missing in section ", stream);
str = cs->getForSure( "port", " missing in section ", stream);
port = Util::strToL( str);
@ -581,7 +680,9 @@ DarkIce :: configShoutCast ( const Config & config,
audioOuts[u].encoder = new LameLibEncoder( audioOuts[u].server.get(),
dsp.get(),
bitrateMode,
bitrate,
quality,
sampleRate,
dsp->getChannel(),
lowpass,
@ -618,14 +719,16 @@ DarkIce :: configFileCast ( const Config & config )
break;
}
const char * str;
const char * str;
const char * format = 0;
unsigned int bitrate = 0;
const char * targetFileName = 0;
unsigned int sampleRate = 0;
int lowpass = 0;
int highpass = 0;
const char * format = 0;
AudioEncoder::BitrateMode bitrateMode;
unsigned int bitrate = 0;
double quality = 0.0;
const char * targetFileName = 0;
unsigned int sampleRate = 0;
int lowpass = 0;
int highpass = 0;
format = cs->getForSure( "format", " missing in section ", stream);
if ( !Util::strEq( format, "vorbis") && !Util::strEq( format, "mp3") ) {
@ -640,6 +743,45 @@ DarkIce :: configFileCast ( const Config & config )
stream);
str = cs->get( "sampleRate");
sampleRate = str ? Util::strToL( str) : dsp->getSampleRate();
str = cs->get( "bitrate");
bitrate = str ? Util::strToL( str) : 0;
str = cs->get( "quality");
quality = str ? Util::strToD( str) : 0.0;
str = cs->getForSure( "bitrateMode",
" not specified in section ",
stream);
if ( Util::strEq( str, "cbr") ) {
bitrateMode = AudioEncoder::cbr;
if ( bitrate == 0 ) {
throw Exception( __FILE__, __LINE__,
"bitrate not specified for CBR encoding");
}
if ( quality == 0 ) {
throw Exception( __FILE__, __LINE__,
"quality not specified for CBR encoding");
}
} else if ( Util::strEq( str, "abr") ) {
bitrateMode = AudioEncoder::abr;
if ( bitrate == 0 ) {
throw Exception( __FILE__, __LINE__,
"bitrate not specified for ABR encoding");
}
} else if ( Util::strEq( str, "vbr") ) {
bitrateMode = AudioEncoder::vbr;
if ( quality == 0 ) {
throw Exception( __FILE__, __LINE__,
"quality not specified for VBR encoding");
}
} else {
throw Exception( __FILE__, __LINE__,
"invalid bitrate mode: ", str);
}
str = cs->get( "lowpass");
lowpass = str ? Util::strToL( str) : 0;
str = cs->get( "highpass");
@ -670,7 +812,9 @@ DarkIce :: configFileCast ( const Config & config )
audioOuts[u].encoder = new LameLibEncoder(
audioOuts[u].server.get(),
dsp.get(),
bitrateMode,
bitrate,
quality,
sampleRate,
dsp->getChannel(),
lowpass,
@ -686,7 +830,9 @@ DarkIce :: configFileCast ( const Config & config )
audioOuts[u].encoder = new VorbisLibEncoder(
audioOuts[u].server.get(),
dsp.get(),
bitrateMode,
bitrate,
quality,
dsp->getSampleRate(),
dsp->getChannel() );
#endif // HAVE_VORBIS_LIB
@ -834,6 +980,9 @@ DarkIce :: run ( void ) throw ( Exception )
$Source$
$Log$
Revision 1.27 2002/04/13 11:26:00 darkeye
added cbr, abr and vbr setting feature with encoding quality
Revision 1.26 2002/03/28 16:43:11 darkeye
enabled resampling and variable bitrates for vorbis (icecast2) streams

View File

@ -37,6 +37,7 @@
#ifdef HAVE_LAME_LIB
#include "Exception.h"
#include "Util.h"
#include "LameLibEncoder.h"
@ -117,14 +118,82 @@ LameLibEncoder :: open ( void )
"set lame out sample rate",
lame_get_out_samplerate( lameGlobalFlags));
if ( 0 > lame_set_brate( lameGlobalFlags, getOutBitrate()) ) {
throw Exception( __FILE__, __LINE__,
"lame lib setting output bit rate error",
getOutBitrate() );
switch ( getOutBitrateMode() ) {
case cbr: {
if ( 0 > lame_set_brate( lameGlobalFlags, getOutBitrate()) ) {
throw Exception( __FILE__, __LINE__,
"lame lib setting output bit rate error",
getOutBitrate() );
}
reportEvent( 5,
"set lame bit rate",
lame_get_brate( lameGlobalFlags));
double d = (1.0 - getOutQuality()) * 10.0;
int q = int (d + 0.499999);
if ( 0 > lame_set_quality( lameGlobalFlags, q) ) {
throw Exception( __FILE__, __LINE__,
"lame lib setting quality error", q);
}
reportEvent( 5,
"set lame quality",
lame_get_quality( lameGlobalFlags));
} break;
case abr:
if ( 0 > lame_set_VBR( lameGlobalFlags,vbr_abr)) {
throw Exception( __FILE__, __LINE__,
"lame lib setting abr error", vbr_abr);
}
reportEvent( 5,
"set lame abr bitrate",
lame_get_VBR( lameGlobalFlags));
if ( 0 > lame_set_VBR_mean_bitrate_kbps( lameGlobalFlags,
getOutBitrate())) {
throw Exception( __FILE__, __LINE__,
"lame lib setting abr mean bitrate error",
getOutBitrate());
}
reportEvent( 5,
"set lame abr mean bitrate",
lame_get_VBR_mean_bitrate_kbps( lameGlobalFlags));
break;
case vbr: {
if ( 0 > lame_set_VBR( lameGlobalFlags, vbr_mtrh)) {
throw Exception( __FILE__, __LINE__,
"lame lib setting vbr error", vbr_mtrh );
}
reportEvent( 5,
"set lame vbr bitrate",
lame_get_VBR( lameGlobalFlags));
double d = (1.0 - getOutQuality()) * 10.0;
int q = int (d + 0.499999);
if ( 0 > lame_set_VBR_q( lameGlobalFlags, q) ) {
throw Exception( __FILE__, __LINE__,
"lame lib setting vbr quality error", q);
}
reportEvent( 5,
"set lame vbr quality",
lame_get_VBR_q( lameGlobalFlags));
} break;
}
reportEvent( 5, "set lame bit rate", lame_get_brate( lameGlobalFlags));
if ( 0 > lame_set_lowpassfreq( lameGlobalFlags, lowpass) ) {
throw Exception( __FILE__, __LINE__,
"lame lib setting lowpass frequency error",
@ -145,15 +214,10 @@ LameLibEncoder :: open ( void )
"set lame highpass frequency",
lame_get_highpassfreq( lameGlobalFlags));
// not configurable lame settings
if ( 0 > lame_set_quality( lameGlobalFlags, 2) ) {
throw Exception( __FILE__, __LINE__,
"lame lib setting quality error",
2 );
}
reportEvent( 5, "set lame quality", lame_get_quality( lameGlobalFlags));
if ( 0 > lame_set_exp_nspsytune( lameGlobalFlags, 1) ) {
throw Exception( __FILE__, __LINE__,
@ -315,6 +379,9 @@ LameLibEncoder :: close ( void ) throw ( Exception )
$Source$
$Log$
Revision 1.11 2002/04/13 11:26:00 darkeye
added cbr, abr and vbr setting feature with encoding quality
Revision 1.10 2002/03/28 16:38:37 darkeye
moved functions conv8() and conv16() to class Util

View File

@ -112,11 +112,11 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
inline void
init ( Sink * sink,
int lowpass,
int highpass ) throw ( Exception )
int highpass ) throw ( Exception )
{
this->sink = sink;
this->lowpass = lowpass;
this->highpass = highpass;
this->sink = sink;
this->lowpass = lowpass;
this->highpass = highpass;
if ( getInBitsPerSample() != 16 && getInBitsPerSample() != 8 ) {
throw Exception( __FILE__, __LINE__,
@ -164,11 +164,14 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
* @param inSampleRate sample rate of the input.
* @param inBitsPerSample number of bits per sample of the input.
* @param inChannel number of channels of the input.
* @param outBitrate bit rate of the output (bits/sec).
* @param outBitrateMode the bit rate mode of the output.
* @param outBitrate bit rate of the output (kbits/sec).
* @param outQuality the quality of the stream.
* @param outSampleRate sample rate of the output.
* If 0, inSampleRate is used.
* @param outChannel number of channels of the output.
* If 0, inChannel is used.
* @param inBigEndian shows if the input is big or little endian
* @param lowpass frequency threshold for the lowpass filter.
* Input above this frequency is cut.
* If 0, lame's default values are used,
@ -184,7 +187,10 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
unsigned int inSampleRate,
unsigned int inBitsPerSample,
unsigned int inChannel,
bool inBigEndian,
BitrateMode outBitrateMode,
unsigned int outBitrate,
double outQuality,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0,
int lowpass = 0,
@ -193,12 +199,15 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
: AudioEncoder ( inSampleRate,
inBitsPerSample,
inChannel,
inChannel,
inBigEndian,
outBitrateMode,
outBitrate,
outQuality,
outSampleRate,
outChannel )
{
init( sink, lowpass, highpass );
init( sink, lowpass, highpass);
}
/**
@ -207,7 +216,9 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
* @param sink the sink to send mp3 output to
* @param as get input sample rate, bits per sample and channels
* from this AudioSource.
* @param outBitrate bit rate of the output (bits/sec).
* @param outBitrateMode the bit rate mode of the output.
* @param outBitrate bit rate of the output (kbits/sec).
* @param outQuality the quality of the stream.
* @param outSampleRate sample rate of the output.
* If 0, input sample rate is used.
* @param outChannel number of channels of the output.
@ -225,7 +236,9 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
inline
LameLibEncoder ( Sink * sink,
const AudioSource * as,
BitrateMode outBitrateMode,
unsigned int outBitrate,
double outQuality,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0,
int lowpass = 0,
@ -233,11 +246,13 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
throw ( Exception )
: AudioEncoder ( as,
outBitrateMode,
outBitrate,
outQuality,
outSampleRate,
outChannel )
{
init( sink, lowpass, highpass );
init( sink, lowpass, highpass);
}
/**
@ -252,6 +267,7 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
{
init( encoder.sink.get(), encoder.lowpass, encoder.highpass );
}
/**
* Destructor.
@ -420,6 +436,9 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
$Source$
$Log$
Revision 1.12 2002/04/13 11:26:00 darkeye
added cbr, abr and vbr setting feature with encoding quality
Revision 1.11 2002/03/28 16:38:37 darkeye
moved functions conv8() and conv16() to class Util

View File

@ -73,37 +73,43 @@ VorbisLibEncoder :: open ( void )
vorbis_info_init( &vorbisInfo);
if ( isVBR() ) {
switch ( getOutBitrateMode() ) {
if ( (ret = vorbis_encode_init_vbr( &vorbisInfo,
case cbr:
case abr:
#ifdef VORBIS_LIB_RC3
if ( (ret = vorbis_encode_init( &vorbisInfo,
getInChannel(),
getOutSampleRate(),
getOutQuality() )) ) {
throw Exception( __FILE__, __LINE__,
"vorbis encode init error", ret);
}
} else {
#ifdef VORBIS_LIB_RC3
if ( (ret = vorbis_encode_init( &vorbisInfo,
getInChannel(),
getOutSampleRate(),
getOutBitrate() * 1024,
getOutBitrate() * 1024,
-1 )) ) {
throw Exception( __FILE__, __LINE__,
"vorbis encode init error", ret);
}
getOutBitrate() * 1000,
getOutBitrate() * 1000,
-1 )) ) {
throw Exception( __FILE__, __LINE__,
"vorbis encode init error", ret);
}
#else
if ( (ret = vorbis_encode_init( &vorbisInfo,
getInChannel(),
getOutSampleRate(),
-1,
getOutBitrate() * 1024,
-1 )) ) {
throw Exception( __FILE__, __LINE__,
"vorbis encode init error", ret);
}
if ( (ret = vorbis_encode_init( &vorbisInfo,
getInChannel(),
getOutSampleRate(),
-1,
getOutBitrate() * 1000,
-1 )) ) {
throw Exception( __FILE__, __LINE__,
"vorbis encode init error", ret);
}
#endif
break;
case vbr:
if ( (ret = vorbis_encode_init_vbr( &vorbisInfo,
getInChannel(),
getOutSampleRate(),
getOutQuality() )) ) {
throw Exception( __FILE__, __LINE__,
"vorbis encode init error", ret);
}
break;
}
if ( (ret = vorbis_analysis_init( &vorbisDspState, &vorbisInfo)) ) {
@ -310,6 +316,9 @@ VorbisLibEncoder :: close ( void ) throw ( Exception )
$Source$
$Log$
Revision 1.8 2002/04/13 11:26:00 darkeye
added cbr, abr and vbr setting feature with encoding quality
Revision 1.7 2002/03/28 16:47:38 darkeye
moved functions conv8() and conv16() to class Util (as conv())
added resampling functionality

View File

@ -191,13 +191,16 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
public:
/**
* Constructor for fixed bitrate encoding.
* Constructor.
*
* @param sink the sink to send mp3 output to
* @param inSampleRate sample rate of the input.
* @param inBitsPerSample number of bits per sample of the input.
* @param inChannel number of channels of the input.
* @param inBigEndian shows if the input is big or little endian
* @param outBitrateMode the bit rate mode of the output.
* @param outBitrate bit rate of the output (kbits/sec).
* @param outQuality the quality of the stream.
* @param outSampleRate sample rate of the output.
* If 0, inSampleRate is used.
* @param outChannel number of channels of the output.
@ -209,40 +212,9 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
unsigned int inSampleRate,
unsigned int inBitsPerSample,
unsigned int inChannel,
bool inBigEndian,
BitrateMode outBitrateMode,
unsigned int outBitrate,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0 )
throw ( Exception )
: AudioEncoder ( inSampleRate,
inBitsPerSample,
inChannel,
outBitrate,
outSampleRate,
outChannel )
{
init( sink);
}
/**
* Constructor for variable bitrate encoding.
*
* @param sink the sink to send mp3 output to
* @param inSampleRate sample rate of the input.
* @param inBitsPerSample number of bits per sample of the input.
* @param inChannel number of channels of the input.
* @param outQuality the quality of the stream (0.0 .. 1.0).
* @param outSampleRate sample rate of the output.
* If 0, inSampleRate is used.
* @param outChannel number of channels of the output.
* If 0, inChannel is used.
* @exception Exception
*/
inline
VorbisLibEncoder ( Sink * sink,
unsigned int inSampleRate,
unsigned int inBitsPerSample,
unsigned int inChannel,
double outQuality,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0 )
@ -251,6 +223,9 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
: AudioEncoder ( inSampleRate,
inBitsPerSample,
inChannel,
inBigEndian,
outBitrateMode,
outBitrate,
outQuality,
outSampleRate,
outChannel )
@ -259,12 +234,14 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
}
/**
* Constructor for fixed bitrate encoding.
* Constructor.
*
* @param sink the sink to send mp3 output to
* @param as get input sample rate, bits per sample and channels
* from this AudioSource.
* @param outBitrateMode the bit rate mode of the output.
* @param outBitrate bit rate of the output (kbits/sec).
* @param outQuality the quality of the stream.
* @param outSampleRate sample rate of the output.
* If 0, input sample rate is used.
* @param outChannel number of channels of the output.
@ -274,41 +251,16 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
inline
VorbisLibEncoder ( Sink * sink,
const AudioSource * as,
BitrateMode outBitrateMode,
unsigned int outBitrate,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0 )
throw ( Exception )
: AudioEncoder ( as,
outBitrate,
outSampleRate,
outChannel )
{
init( sink);
}
/**
* Constructor for variable bitrate encoding.
*
* @param sink the sink to send mp3 output to
* @param as get input sample rate, bits per sample and channels
* from this AudioSource.
* @param outQuality the quality of the stream (0.0 .. 1.0).
* @param outSampleRate sample rate of the output.
* If 0, input sample rate is used.
* @param outChannel number of channels of the output.
* If 0, input channel is used.
* @exception Exception
*/
inline
VorbisLibEncoder ( Sink * sink,
const AudioSource * as,
double outQuality,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0 )
throw ( Exception )
: AudioEncoder ( as,
outBitrateMode,
outBitrate,
outQuality,
outSampleRate,
outChannel )
@ -493,6 +445,9 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
$Source$
$Log$
Revision 1.5 2002/04/13 11:26:00 darkeye
added cbr, abr and vbr setting feature with encoding quality
Revision 1.4 2002/03/28 16:47:38 darkeye
moved functions conv8() and conv16() to class Util (as conv())
added resampling functionality