added possibility to specify maximum bitrate for Ogg Vorbis streams

This commit is contained in:
darkeye 2002-08-20 19:35:37 +00:00
parent ec84730730
commit 9257e95c08
6 changed files with 134 additions and 67 deletions

View File

@ -1,5 +1,6 @@
DarkIce next version
o added possibility to specify maximum bitrate for Ogg Vorbis streams
o added HTTP Basic authentication for icecast2 logins
o added mp3 streaming for icecast2
o added possibility to stream in mono even when recording in stereo,

View File

@ -1,4 +1,4 @@
.TH darkice.cfg 5 "August 3, 2002" "DarkIce" "DarkIce live audio streamer"
.TH darkice.cfg 5 "August 20, 2002" "DarkIce" "DarkIce live audio streamer"
.SH NAME
darkice.cfg \- configuration file for darkice
.SH DESCRIPTION
@ -191,7 +191,7 @@ Required values:
.I format
Format of the stream sent to the
.B IceCast2
server. Currently the only supported value here is 'vorbis'.
server. Supported formats are 'vorbis' and 'mp3'.
.TP
.I bitrateMode
The bit rate mode of the encoding, either "cbr", "abr" or "vbr",
@ -206,7 +206,8 @@ abr bit rate modes are specified.
.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 vbr
bit rate mode is specified.
bit rate mode is specified for Ogg Vorbis format, or in vbr and abr
modes for mp3 format.
.TP
.I server
The
@ -232,6 +233,10 @@ Optional values:
The sample rate of the encoded mp3 output. If not specified, defaults
to the value of the input sample rate.
.TP
.I maxBitrate
The maximum bitrate of the stream. Only used when in cbr mode and in
Ogg Vorbis format.
.TP
.I name
Name of the stream
.TP

View File

@ -395,7 +395,7 @@ class AudioEncoder : public Sink, public virtual Referable
*
* @return the bit rate of the output.
*/
inline int
inline unsigned int
getOutBitrate ( void ) const throw ()
{
return outBitrate;
@ -456,6 +456,9 @@ class AudioEncoder : public Sink, public virtual Referable
$Source$
$Log$
Revision 1.8 2002/08/20 19:35:37 darkeye
added possibility to specify maximum bitrate for Ogg Vorbis streams
Revision 1.7 2002/04/13 11:26:00 darkeye
added cbr, abr and vbr setting feature with encoding quality

View File

@ -361,6 +361,7 @@ DarkIce :: configIceCast2 ( const Config & config,
unsigned int sampleRate = 0;
AudioEncoder::BitrateMode bitrateMode;
unsigned int bitrate = 0;
unsigned int maxBitrate = 0;
double quality = 0.0;
const char * server = 0;
unsigned int port = 0;
@ -390,6 +391,8 @@ DarkIce :: configIceCast2 ( const Config & config,
// determine fixed bitrate or variable bitrate quality
str = cs->get( "bitrate");
bitrate = str ? Util::strToL( str) : 0;
str = cs->get( "maxBitrate");
maxBitrate = str ? Util::strToL( str) : 0;
str = cs->get( "quality");
quality = str ? Util::strToD( str) : 0.0;
@ -499,7 +502,8 @@ DarkIce :: configIceCast2 ( const Config & config,
bitrate,
quality,
sampleRate,
dsp->getChannel() );
dsp->getChannel(),
maxBitrate);
#endif // HAVE_VORBIS_LIB
break;
@ -960,6 +964,9 @@ DarkIce :: run ( void ) throw ( Exception )
$Source$
$Log$
Revision 1.31 2002/08/20 19:35:37 darkeye
added possibility to specify maximum bitrate for Ogg Vorbis streams
Revision 1.30 2002/08/20 18:37:49 darkeye
added mp3 streaming possibility for icecast2

View File

@ -58,6 +58,56 @@ static const char fileid[] = "$Id$";
/* ============================================================= module code */
/*------------------------------------------------------------------------------
* Initialize the encoder
*----------------------------------------------------------------------------*/
void
VorbisLibEncoder :: init ( Sink * sink,
unsigned int outMaxBitrate )
throw ( Exception )
{
this->sink = sink;
this->outMaxBitrate = outMaxBitrate;
if ( getInBitsPerSample() != 16 && getInBitsPerSample() != 8 ) {
throw Exception( __FILE__, __LINE__,
"specified bits per sample not supported",
getInBitsPerSample() );
}
if ( getInChannel() != 1 && getInChannel() != 2 ) {
throw Exception( __FILE__, __LINE__,
"unsupported number of channels for the encoder",
getInChannel() );
}
if ( getInChannel() != getOutChannel() ) {
throw Exception( __FILE__, __LINE__,
"different number of input and output channels",
getOutChannel() );
}
if ( getOutSampleRate() == getInSampleRate() ) {
resampleRatio = 1;
converter = 0;
} else {
resampleRatio = ( (double) getOutSampleRate() /
(double) getInSampleRate() );
// open the aflibConverter in
// - high quality
// - not linear (quadratic) interpolation
// - not filter interpolation
converter = new aflibConverter( true, true, false);
}
if ( getInChannel() != getOutChannel() ) {
throw Exception( __FILE__, __LINE__,
"different in and out channels not supported");
}
encoderOpen = false;
}
/*------------------------------------------------------------------------------
* Open an encoding session
*----------------------------------------------------------------------------*/
@ -75,14 +125,31 @@ VorbisLibEncoder :: open ( void )
switch ( getOutBitrateMode() ) {
case cbr:
case cbr: {
int maxBitrate = getOutMaxBitrate() * 1000;
if ( !maxBitrate ) {
maxBitrate = -1;
}
if ( (ret = vorbis_encode_init( &vorbisInfo,
getInChannel(),
getOutSampleRate(),
-1,
getOutBitrate() * 1000,
maxBitrate)) ) {
throw Exception( __FILE__, __LINE__,
"vorbis encode init error", ret);
}
} break;
case abr:
/* set non-managed VBR around the average bitrate */
ret = vorbis_encode_setup_managed( &vorbisInfo,
getInChannel(),
getOutSampleRate(),
-1,
getOutBitrate() * 1000,
-1 )
|| vorbis_encode_ctl( &vorbisInfo, OV_ECTL_RATEMANAGE_AVG, NULL)
|| vorbis_encode_ctl( &vorbisInfo, OV_ECTL_RATEMANAGE_SET, NULL)
|| vorbis_encode_setup_init( &vorbisInfo);
if ( ret ) {
throw Exception( __FILE__, __LINE__,
@ -90,18 +157,6 @@ VorbisLibEncoder :: open ( void )
}
break;
case abr:
if ( (ret = vorbis_encode_init( &vorbisInfo,
getInChannel(),
getOutSampleRate(),
-1,
getOutBitrate() * 1000,
-1 )) ) {
throw Exception( __FILE__, __LINE__,
"vorbis encode init error", ret);
}
break;
case vbr:
if ( (ret = vorbis_encode_init_vbr( &vorbisInfo,
getInChannel(),
@ -184,12 +239,6 @@ VorbisLibEncoder :: write ( const void * buf,
unsigned int bitsPerSample = getInBitsPerSample();
unsigned int channels = getInChannel();
if ( channels != 1 && channels != 2 ) {
throw Exception( __FILE__, __LINE__,
"unsupported number of channels for the encoder",
channels );
}
unsigned int sampleSize = (bitsPerSample / 8) * channels;
unsigned char * b = (unsigned char*) buf;
unsigned int processed = len - (len % sampleSize);
@ -319,6 +368,9 @@ VorbisLibEncoder :: close ( void ) throw ( Exception )
$Source$
$Log$
Revision 1.13 2002/08/20 19:35:37 darkeye
added possibility to specify maximum bitrate for Ogg Vorbis streams
Revision 1.12 2002/08/03 10:30:46 darkeye
resampling bugs fixed for vorbis streams

View File

@ -105,10 +105,15 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
ogg_stream_state oggStreamState;
/**
* The Sink to dump mp3 data to
* The Sink to dump encoded data to
*/
Ref<Sink> sink;
/**
* Maximum bitrate of the output in kbits/sec. If 0, don't care.
*/
unsigned int outMaxBitrate;
/**
* Resample ratio
*/
@ -122,40 +127,13 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
/**
* Initialize the object.
*
* @param sink the sink to send mp3 output to
* @param sink the sink to send encoded output to
* @param the maximum bit rate
* @exception Exception
*/
inline void
init ( Sink * sink ) throw ( Exception )
{
this->sink = sink;
if ( getInBitsPerSample() != 16 && getInBitsPerSample() != 8 ) {
throw Exception( __FILE__, __LINE__,
"specified bits per sample not supported",
getInBitsPerSample() );
}
if ( getOutSampleRate() == getInSampleRate() ) {
resampleRatio = 1;
converter = 0;
} else {
resampleRatio = ( (double) getOutSampleRate() /
(double) getInSampleRate() );
// open the aflibConverter in
// - high quality
// - not linear (quadratic) interpolation
// - not filter interpolation
converter = new aflibConverter( true, true, false);
}
if ( getInChannel() != getOutChannel() ) {
throw Exception( __FILE__, __LINE__,
"different in and out channels not supported");
}
encoderOpen = false;
}
void
init ( Sink * sink,
unsigned int outMaxBitrate ) throw ( Exception );
/**
* De-initialize the object.
@ -193,7 +171,7 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
/**
* Constructor.
*
* @param sink the sink to send mp3 output to
* @param sink the sink to send encoded 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.
@ -203,6 +181,8 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
* @param outQuality the quality of the stream.
* @param outSampleRate sample rate of the output.
* If 0, inSampleRate is used.
* @param outMaxBitrate maximum output bitrate.
* 0 if not used.
* @param outChannel number of channels of the output.
* If 0, inChannel is used.
* @exception Exception
@ -217,7 +197,8 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
unsigned int outBitrate,
double outQuality,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0 )
unsigned int outChannel = 0,
unsigned int outMaxBitrate = 0 )
throw ( Exception )
: AudioEncoder ( inSampleRate,
@ -230,13 +211,13 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
outSampleRate,
outChannel )
{
init( sink);
init( sink, outMaxBitrate);
}
/**
* Constructor.
*
* @param sink the sink to send mp3 output to
* @param sink the sink to send encoded 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.
@ -244,6 +225,8 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
* @param outQuality the quality of the stream.
* @param outSampleRate sample rate of the output.
* If 0, input sample rate is used.
* @param outMaxBitrate maximum output bitrate.
* 0 if not used.
* @param outChannel number of channels of the output.
* If 0, input channel is used.
* @exception Exception
@ -255,7 +238,8 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
unsigned int outBitrate,
double outQuality,
unsigned int outSampleRate = 0,
unsigned int outChannel = 0 )
unsigned int outChannel = 0,
unsigned int outMaxBitrate = 0 )
throw ( Exception )
: AudioEncoder ( as,
@ -265,7 +249,7 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
outSampleRate,
outChannel )
{
init( sink);
init( sink, outMaxBitrate);
}
/**
@ -281,7 +265,7 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
if( encoder.isOpen() ) {
throw Exception(__FILE__, __LINE__, "don't copy open encoders");
}
init( encoder.sink.get());
init( encoder.sink.get(), encoder.getOutMaxBitrate() );
}
/**
@ -315,12 +299,24 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
if ( this != &encoder ) {
strip();
AudioEncoder::operator=( encoder);
init( encoder.sink.get());
init( encoder.sink.get(), encoder.getOutMaxBitrate() );
}
return *this;
}
/**
* Get the maximum bit rate of the output in kbits/sec,
* for fixed / average bitrate encodings.
*
* @return the maximum bit rate of the output, or 0 if not set.
*/
inline unsigned int
getOutMaxBitrate ( void ) const throw ()
{
return outMaxBitrate;
}
/**
* Check wether encoding is in progress.
*
@ -445,6 +441,9 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
$Source$
$Log$
Revision 1.7 2002/08/20 19:35:37 darkeye
added possibility to specify maximum bitrate for Ogg Vorbis streams
Revision 1.6 2002/07/20 16:37:06 darkeye
added fault tolerance in case a server connection is dropped