From 905807b959dcb05e866672e060ce2420ac74afa1 Mon Sep 17 00:00:00 2001 From: Pav Lucistnik Date: Mon, 24 Jan 2011 15:32:47 +0000 Subject: - Update to work with libaacplus.2 PR: ports/153519 Submitted by: Takefu Feature safe: yes --- audio/darkice/Makefile | 22 +- audio/darkice/distinfo | 1 - audio/darkice/files/patch-configure.in | 11 + audio/darkice/files/patch-darkice.cfg | 10 + audio/darkice/files/patch-src_aacPlusEncoder.cpp | 328 +++++++++++++++++++++++ audio/darkice/files/patch-src_aacPlusEncoder.h | 194 ++++++++++++++ 6 files changed, 552 insertions(+), 14 deletions(-) create mode 100644 audio/darkice/files/patch-configure.in create mode 100644 audio/darkice/files/patch-darkice.cfg create mode 100644 audio/darkice/files/patch-src_aacPlusEncoder.cpp create mode 100644 audio/darkice/files/patch-src_aacPlusEncoder.h (limited to 'audio') diff --git a/audio/darkice/Makefile b/audio/darkice/Makefile index 8cd7fcff6686..fa10aef9ee9b 100644 --- a/audio/darkice/Makefile +++ b/audio/darkice/Makefile @@ -8,21 +8,23 @@ PORTNAME= darkice PORTVERSION= 1.0 -PORTREVISION= 2 +PORTREVISION= 3 CATEGORIES= audio net MASTER_SITES= GOOGLE_CODE MAINTAINER= ports@FreeBSD.org COMMENT= An IceCast, IceCast2 and ShoutCast live audio streamer +LICENSE= GPLv3 + OPTIONS= VORBIS "Ogg Vorbis support" on \ LAME "LAME support for MP3" off \ TWOLAME "TwoLAME support for MP2" off \ FAAC "FAAC support for AAC" off \ JACK "Jack support" off \ - AACPLUS "AAC HEv2 support" off \ - SAMPLERATE "Libsamplerate support" off + AACPLUS "AAC HEv2 and libsamplerate support" off +USE_AUTOTOOLS= aclocal autoconf GNU_CONFIGURE= yes CONFIGURE_ENV= CPPFLAGS="${PTHREAD_CFLAGS}" LDFLAGS="${PTHREAD_LIBS}" \ ac_cv_prog_acx_pthread_config=no @@ -73,17 +75,11 @@ CONFIGURE_ARGS+= --without-jack .endif .if defined(WITH_AACPLUS) -LIB_DEPENDS+= aacplus.1:${PORTSDIR}/audio/libaacplus -CONFIGURE_ARGS+= --with-aacplus-prefix=${LOCALBASE} -.else -CONFIGURE_ARGS+= --without-aacplus -.endif - -.if defined(WITH_SAMPLERATE) -LIB_DEPENDS+= samplerate.1:${PORTSDIR}/audio/libsamplerate -CONFIGURE_ARGS+= --with-samplerate-prefix=${LOCALBASE} +LIB_DEPENDS+= aacplus.2:${PORTSDIR}/audio/libaacplus \ + samplerate.1:${PORTSDIR}/audio/libsamplerate +CONFIGURE_ARGS+= --with-aacplus-prefix=${LOCALBASE} --with-samplerate-prefix=${LOCALBASE} .else -CONFIGURE_ARGS+= --without-samplerate +CONFIGURE_ARGS+= --without-aacplus --without-samplerate .endif post-patch: diff --git a/audio/darkice/distinfo b/audio/darkice/distinfo index b7d8a1feca49..6b18851d1d25 100644 --- a/audio/darkice/distinfo +++ b/audio/darkice/distinfo @@ -1,3 +1,2 @@ -MD5 (darkice-1.0.tar.gz) = 1804e63d42a9703d01fe378c9a77c473 SHA256 (darkice-1.0.tar.gz) = 61a05c4dab206c22c3e3d5570ee4841f9c8875241098adf687717e7dcc6df332 SIZE (darkice-1.0.tar.gz) = 311567 diff --git a/audio/darkice/files/patch-configure.in b/audio/darkice/files/patch-configure.in new file mode 100644 index 000000000000..2e48f4b16bbe --- /dev/null +++ b/audio/darkice/files/patch-configure.in @@ -0,0 +1,11 @@ +--- configure.in.orig 2010-05-10 06:38:57.000000000 +0900 ++++ configure.in 2010-12-29 19:11:40.000000000 +0900 +@@ -166,7 +166,7 @@ + + if test "x${USE_AACPLUS}" = "xyes" ; then + AC_MSG_CHECKING( [for aacplus library at ${CONFIG_AACPLUS_PREFIX}] ) +- LA_SEARCH_LIB( AACPLUS_LIB_LOC, AACPLUS_INC_LOC, libaacplus.a libaacplus.so, sbr_main.h, ++ LA_SEARCH_LIB( AACPLUS_LIB_LOC, AACPLUS_INC_LOC, libaacplus.a libaacplus.so, aacplus.h, + ${CONFIG_AACPLUS_PREFIX}) + if test "x${AACPLUS_LIB_LOC}" != "x" ; then + AC_DEFINE( HAVE_AACPLUS_LIB, 1, [build with aacplus library] ) diff --git a/audio/darkice/files/patch-darkice.cfg b/audio/darkice/files/patch-darkice.cfg new file mode 100644 index 000000000000..59354fe2410d --- /dev/null +++ b/audio/darkice/files/patch-darkice.cfg @@ -0,0 +1,10 @@ +--- darkice.cfg.orig 2010-05-10 05:26:19.000000000 +0900 ++++ darkice.cfg 2010-12-29 19:17:57.000000000 +0900 +@@ -6,6 +6,7 @@ + duration = 60 # duration of encoding, in seconds. 0 means forever + bufferSecs = 5 # size of internal slip buffer, in seconds + reconnect = yes # reconnect to the server(s) if disconnected ++realtime = yes # run the encoder with POSIX realtime priority + + # this section describes the audio input that will be streamed + [input] diff --git a/audio/darkice/files/patch-src_aacPlusEncoder.cpp b/audio/darkice/files/patch-src_aacPlusEncoder.cpp new file mode 100644 index 000000000000..2093b16877f7 --- /dev/null +++ b/audio/darkice/files/patch-src_aacPlusEncoder.cpp @@ -0,0 +1,328 @@ +--- src/aacPlusEncoder.cpp.orig 2010-05-10 00:18:48.000000000 +0200 ++++ src/aacPlusEncoder.cpp 2011-01-20 13:39:21.000000000 +0100 +@@ -5,8 +5,8 @@ + Tyrell DarkIce + + File : aacPlusEncoder.cpp +- Version : $Revision: 474 $ +- Author : $Author: rafael@riseup.net $ ++ Version : $Revision$ ++ Author : $Author$ + Location : $HeadURL$ + + Copyright notice: +@@ -51,7 +51,7 @@ + /*------------------------------------------------------------------------------ + * File identity + *----------------------------------------------------------------------------*/ +-static const char fileid[] = "$Id: aacPlusEncoder.cpp 474 2010-05-10 01:18:15Z rafael@riseup.net $"; ++static const char fileid[] = "$Id$"; + + + /* =============================================== local function prototypes */ +@@ -76,82 +76,27 @@ + "aacplus lib opening underlying sink error"); + } + +- reportEvent(1, "Using aacplus codec version", "720 3gpp"); ++ reportEvent(1, "Using aacplus codec"); + +- bitrate = getOutBitrate() * 1000; +- bandwidth = 0; +- useParametricStereo = 0; +- numAncDataBytes=0; +- coreWriteOffset = 0; +- envReadOffset = 0; +- writeOffset = INPUT_DELAY*MAX_CHANNELS; +- writtenSamples = 0; +- aacEnc = NULL; +- hEnvEnc=NULL; +- +- /* set up basic parameters for aacPlus codec */ +- AacInitDefaultConfig(&config); +- nChannelsAAC = nChannelsSBR = getOutChannel(); +- +- if ( (getInChannel() == 2) && (bitrate >= 16000) && (bitrate < 44001) ) { +- useParametricStereo = 1; +- nChannelsAAC = 1; +- nChannelsSBR = 2; +- +- reportEvent(10, "use Parametric Stereo"); +- +- envReadOffset = (MAX_DS_FILTER_DELAY + INPUT_DELAY)*MAX_CHANNELS; +- coreWriteOffset = CORE_INPUT_OFFSET_PS; +- writeOffset = envReadOffset; +- } else { +- /* set up 2:1 downsampling */ +- InitIIR21_Resampler(&(IIR21_reSampler[0])); +- InitIIR21_Resampler(&(IIR21_reSampler[1])); +- +- if(IIR21_reSampler[0].delay > MAX_DS_FILTER_DELAY) +- throw Exception(__FILE__, __LINE__, "IIR21 resampler delay is bigger then MAX_DS_FILTER_DELAY"); +- writeOffset += IIR21_reSampler[0].delay*MAX_CHANNELS; ++ encoderHandle = aacplusEncOpen(getOutSampleRate(), ++ getInChannel(), ++ &inputSamples, ++ &maxOutputBytes); ++ ++ aacplusEncConfiguration * aacplusConfig; ++ ++ aacplusConfig = aacplusEncGetCurrentConfiguration(encoderHandle); ++ ++ aacplusConfig->bitRate = getOutBitrate() * 1000; ++ aacplusConfig->bandWidth = lowpass; ++ aacplusConfig->outputFormat = 1; ++ aacplusConfig->inputFormat = AACPLUS_INPUT_16BIT; ++ aacplusConfig->nChannelsOut = getOutChannel(); ++ ++ if (!aacplusEncSetConfiguration(encoderHandle, aacplusConfig)) { ++ throw Exception(__FILE__, __LINE__, ++ "error configuring libaacplus library"); + } +- +- sampleRateAAC = getOutSampleRate(); +- config.bitRate = bitrate; +- config.nChannelsIn=getInChannel(); +- config.nChannelsOut=nChannelsAAC; +- config.bandWidth=bandwidth; +- +- /* set up SBR configuration */ +- if(!IsSbrSettingAvail(bitrate, nChannelsAAC, sampleRateAAC, &sampleRateAAC)) +- throw Exception(__FILE__, __LINE__, "No valid SBR configuration found"); +- +- InitializeSbrDefaults (&sbrConfig); +- sbrConfig.usePs = useParametricStereo; +- +- AdjustSbrSettings( &sbrConfig, +- bitrate, +- nChannelsAAC, +- sampleRateAAC, +- AACENC_TRANS_FAC, +- 24000); +- +- EnvOpen( &hEnvEnc, +- inBuf + coreWriteOffset, +- &sbrConfig, +- &config.bandWidth); +- +- /* set up AAC encoder, now that samling rate is known */ +- config.sampleRate = sampleRateAAC; +- if (AacEncOpen(&aacEnc, config) != 0){ +- AacEncClose(aacEnc); +- throw Exception(__FILE__, __LINE__, "Initialisation of AAC failed !"); +- } +- +- init_plans(); +- +- /* create the ADTS header */ +- adts_hdr(outBuf, &config); +- +- inSamples = AACENC_BLOCKSIZE * getInChannel() * 2; +- + + // initialize the resampling coverter if needed + if ( converter ) { +@@ -159,8 +104,8 @@ + converterData.input_frames = 4096/((getInBitsPerSample() / 8) * getInChannel()); + converterData.data_in = new float[converterData.input_frames*getInChannel()]; + converterData.output_frames = (int) (converterData.input_frames * resampleRatio + 1); +- if ((int) inSamples > getInChannel() * converterData.output_frames) { +- resampledOffset = new float[2 * inSamples]; ++ if ((int) inputSamples > getInChannel() * converterData.output_frames) { ++ resampledOffset = new float[2 * inputSamples]; + } else { + resampledOffset = new float[2 * getInChannel() * converterData.input_frames]; + } +@@ -178,13 +123,9 @@ + } + + aacplusOpen = true; +- reportEvent(10, "bitrate=", bitrate); +- reportEvent(10, "nChannelsIn", getInChannel()); +- reportEvent(10, "nChannelsOut", getOutChannel()); +- reportEvent(10, "nChannelsSBR", nChannelsSBR); +- reportEvent(10, "nChannelsAAC", nChannelsAAC); +- reportEvent(10, "sampleRateAAC", sampleRateAAC); +- reportEvent(10, "inSamples", inSamples); ++ reportEvent(10, "nChannelsAAC", aacplusConfig->nChannelsOut); ++ reportEvent(10, "sampleRateAAC", aacplusConfig->sampleRate); ++ reportEvent(10, "inSamples", inputSamples); + return true; + } + +@@ -199,21 +140,23 @@ + if ( !isOpen() || len == 0) { + return 0; + } +- ++ + unsigned int channels = getInChannel(); + unsigned int bitsPerSample = getInBitsPerSample(); + unsigned int sampleSize = (bitsPerSample / 8) * channels; ++ unsigned char * b = (unsigned char*) buf; + unsigned int processed = len - (len % sampleSize); + unsigned int nSamples = processed / sampleSize; +- unsigned int samples = (unsigned int) nSamples * channels; +- int processedSamples = 0; +- +- ++ unsigned char * aacplusBuf = new unsigned char[maxOutputBytes]; ++ int samples = (int) nSamples * channels; ++ int processedSamples = 0; ++ ++ + + if ( converter ) { + unsigned int converted; + #ifdef HAVE_SRC_LIB +- src_short_to_float_array ((short *) buf, converterData.data_in, samples); ++ src_short_to_float_array ((short *) b, converterData.data_in, samples); + converterData.input_frames = nSamples; + converterData.data_out = resampledOffset + (resampledOffsetSize * channels); + int srcError = src_process (converter, &converterData); +@@ -224,7 +167,6 @@ + int inCount = nSamples; + short int * shortBuffer = new short int[samples]; + int outCount = (int) (inCount * resampleRatio); +- unsigned char * b = (unsigned char*) buf; + Util::conv( bitsPerSample, b, processed, shortBuffer, isInBigEndian()); + converted = converter->resample( inCount, + outCount+1, +@@ -235,18 +177,27 @@ + resampledOffsetSize += converted; + + // encode samples (if enough) +- while(resampledOffsetSize - processedSamples >= inSamples/channels) { ++ while(resampledOffsetSize - processedSamples >= inputSamples/channels) { ++ int outputBytes; + #ifdef HAVE_SRC_LIB +- short *shortData = new short[inSamples]; ++ short *shortData = new short[inputSamples]; + src_float_to_short_array(resampledOffset + (processedSamples * channels), +- shortData, inSamples) ; +- +- encodeAacSamples (shortData, inSamples, channels); ++ shortData, inputSamples) ; ++ outputBytes = aacplusEncEncode(encoderHandle, ++ (int32_t*) shortData, ++ inputSamples, ++ aacplusBuf, ++ maxOutputBytes); + delete [] shortData; + #else +- encodeAacSamples (&resampledOffset[processedSamples*channels], inSamples, channels); ++ outputBytes = aacplusEncEncode(encoderHandle, ++ (int32_t*) &resampledOffset[processedSamples*channels], ++ inputSamples, ++ aacplusBuf, ++ maxOutputBytes); + #endif +- processedSamples+=inSamples/channels; ++ getSink()->write(aacplusBuf, outputBytes); ++ processedSamples+=inputSamples/channels; + } + + if (processedSamples && (int) resampledOffsetSize >= processedSamples) { +@@ -262,70 +213,27 @@ + #endif + } + } else { +- encodeAacSamples ((short *) buf, samples, channels); +- } ++ while (processedSamples < samples) { ++ int outputBytes; ++ int inSamples = samples - processedSamples < (int) inputSamples ++ ? samples - processedSamples ++ : inputSamples; ++ ++ outputBytes = aacplusEncEncode(encoderHandle, ++ (int32_t*) (b + processedSamples/sampleSize), ++ inSamples, ++ aacplusBuf, ++ maxOutputBytes); ++ getSink()->write(aacplusBuf, outputBytes); + +- return samples; +-} +- +-void +-aacPlusEncoder :: encodeAacSamples (short *TimeDataPcm, unsigned int samples, int channels) +- throw ( Exception ) +-{ +- unsigned int i; +- int ch, outSamples, numOutBytes; +- +- for (i=0; iwrite(outBuf, numOutBytes+ADTS_HEADER_SIZE); ++ processedSamples += inSamples; ++ } + } +- +- writtenSamples=0; + +- return; ++ delete[] aacplusBuf; ++ ++// return processedSamples; ++ return samples; + } + + /*------------------------------------------------------------------------------ +@@ -352,12 +260,7 @@ + if ( isOpen() ) { + flush(); + +- destroy_plans(); +- AacEncClose(aacEnc); +- if (hEnvEnc) { +- EnvClose(hEnvEnc); +- } +- ++ aacplusEncClose(encoderHandle); + aacplusOpen = false; + + sink->close(); diff --git a/audio/darkice/files/patch-src_aacPlusEncoder.h b/audio/darkice/files/patch-src_aacPlusEncoder.h new file mode 100644 index 000000000000..b77150ce5a15 --- /dev/null +++ b/audio/darkice/files/patch-src_aacPlusEncoder.h @@ -0,0 +1,194 @@ +--- src/aacPlusEncoder.h.orig 2010-05-10 00:18:48.000000000 +0200 ++++ src/aacPlusEncoder.h 2011-01-20 13:41:06.000000000 +0100 +@@ -5,8 +5,8 @@ + Tyrell DarkIce + + File : aacPlusEncoder.h +- Version : $Revision: 474 $ +- Author : $Author: rafael@riseup.net $ ++ Version : $Revision$ ++ Author : $Author$ + Location : $HeadURL$ + + Copyright notice: +@@ -41,18 +41,7 @@ + #endif + + #ifdef HAVE_AACPLUS_LIB +-extern "C" { +-#include +-#include +-#include +-#include +- +-#include +- +-#include +-#include +-#include +-} ++#include + #else + #error configure with aacplus + #endif +@@ -83,16 +72,10 @@ + /** + * A class representing aacplus AAC+ encoder. + * +- * @author $Author: rafael@riseup.net $ +- * @version $Revision: 474 $ ++ * @author $Author$ ++ * @version $Revision$ + */ + +-#define CORE_DELAY (1600) +-#define INPUT_DELAY ((CORE_DELAY)*2 +6*64-2048+1) /* ((1600 (core codec)*2 (multi rate) + 6*64 (sbr dec delay) - 2048 (sbr enc delay) + magic*/ +-#define MAX_DS_FILTER_DELAY 16 /* the additional max resampler filter delay (source fs)*/ +- +-#define CORE_INPUT_OFFSET_PS (0) /* (96-64) makes AAC still some 64 core samples too early wrt SBR ... maybe -32 would be even more correct, but 1024-32 would need additional SBR bitstream delay by one frame */ +- + class aacPlusEncoder : public AudioEncoder, public virtual Reporter + { + private: +@@ -124,31 +107,26 @@ + */ + Ref sink; + +- float inBuf[(AACENC_BLOCKSIZE*2 + MAX_DS_FILTER_DELAY + INPUT_DELAY)*MAX_CHANNELS]; +- char outBuf[(6144/8)*MAX_CHANNELS+ADTS_HEADER_SIZE]; +- IIR21_RESAMPLER IIR21_reSampler[MAX_CHANNELS]; +- +- AACENC_CONFIG config; +- +- int nChannelsAAC, nChannelsSBR; +- unsigned int sampleRateAAC; +- +- int bitrate; +- int bandwidth; +- +- unsigned int numAncDataBytes; +- unsigned char ancDataBytes[MAX_PAYLOAD_SIZE]; +- +- bool useParametricStereo; +- int coreWriteOffset; +- int envReadOffset; +- int writeOffset; +- struct AAC_ENCODER *aacEnc; +- unsigned int inSamples; +- unsigned int writtenSamples; +- +- HANDLE_SBR_ENCODER hEnvEnc; +- sbrConfiguration sbrConfig; ++ /** ++ * The handle to the AAC+ encoder instance. ++ */ ++ aacplusEncHandle encoderHandle; ++ ++ /** ++ * The maximum number of input samples to supply to the encoder. ++ */ ++ unsigned long inputSamples; ++ ++ /** ++ * The maximum number of output bytes the encoder returns in one call. ++ */ ++ unsigned long maxOutputBytes; ++ ++ /** ++ * Lowpass filter. Sound frequency in Hz, from where up the ++ * input is cut. ++ */ ++ int lowpass; + + /** + * Initialize the object. +@@ -157,10 +135,11 @@ + * @exception Exception + */ + inline void +- init ( Sink * sink) throw (Exception) ++ init ( Sink * sink, int lowpass) throw (Exception) + { + this->aacplusOpen = false; + this->sink = sink; ++ this->lowpass = lowpass; + + /* TODO: if we have float as input, we don't need conversion */ + if ( getInBitsPerSample() != 16 && getInBitsPerSample() != 32 ) { +@@ -179,11 +158,6 @@ + "unsupported number of output channels for the encoder", + getOutChannel() ); + } +- /* TODO: this will be neede when we implement mono aac+ encoding */ +- if ( getInChannel() != getOutChannel() ) { +- throw Exception( __FILE__, __LINE__, +- "input channels and output channels do not match"); +- } + + if ( getOutSampleRate() == getInSampleRate() ) { + resampleRatio = 1; +@@ -237,17 +211,6 @@ + "specified bits per sample with samplerate conversion not supported", + getInBitsPerSample() ); + } +- +- bitrate = getOutBitrate() * 1000; +- bandwidth = 0; +- useParametricStereo = 0; +- numAncDataBytes=0; +- coreWriteOffset = 0; +- envReadOffset = 0; +- writeOffset = INPUT_DELAY*MAX_CHANNELS; +- writtenSamples = 0; +- aacEnc = NULL; +- hEnvEnc=NULL; + } + + /** +@@ -269,10 +232,6 @@ + } + } + +- void +- encodeAacSamples (short *TimeDataPcm, unsigned int samples, int channels) +- throw ( Exception ); +- + protected: + + /** +@@ -335,7 +294,7 @@ + outSampleRate, + outChannel ) + { +- init( sink); ++ init( sink, lowpass); + } + + /** +@@ -376,7 +335,7 @@ + outSampleRate, + outChannel ) + { +- init( sink); ++ init( sink, lowpass ); + } + + /** +@@ -389,7 +348,7 @@ + throw ( Exception ) + : AudioEncoder( encoder ) + { +- init( encoder.sink.get()); ++ init( encoder.sink.get(), encoder.lowpass); + } + + +@@ -420,7 +379,7 @@ + if ( this != &encoder ) { + strip(); + AudioEncoder::operator=( encoder); +- init( encoder.sink.get()); ++ init( encoder.sink.get(), encoder.lowpass); + } + + return *this; -- cgit v1.2.3