~ft/aacdec

7193768ac9ff3236ce7615b866f6d0e0ba53c5dc — menno 18 years ago 2d23618
Small changes to the decoder interface:
every function that has a buffer as input now also has a parameter to give the size of that buffer.
M aacDECdrop/aacDECdrop/aacDECdrop.vcproj => aacDECdrop/aacDECdrop/aacDECdrop.vcproj +2 -1
@@ 30,6 30,7 @@
				OptimizeForWindowsApplication="TRUE"
				AdditionalIncludeDirectories="..\..\include,..\..\common\libsndfile\src,..\..\common\mp4v2,..\..\common\libsndfile\win32"
				PreprocessorDefinitions="WIN32,NDEBUG,_WINDOWS"
				StringPooling="TRUE"
				RuntimeLibrary="0"
				UsePrecompiledHeader="2"
				PrecompiledHeaderFile=".\Release/aacDECdrop.pch"


@@ 48,7 49,7 @@
				OutputFile=".\Release/aacDECdrop.exe"
				LinkIncremental="1"
				SuppressStartupBanner="TRUE"
				IgnoreDefaultLibraryNames="LIBCMT.lib"
				IgnoreDefaultLibraryNames=""
				ProgramDatabaseFile=".\Release/aacDECdrop.pdb"
				SubSystem="2"/>
			<Tool

M aacDECdrop/decode.c => aacDECdrop/decode.c +15 -12
@@ 16,8 16,8 @@
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: decode.c,v 1.10 2002/08/15 17:32:51 menno Exp $
** $Id: decode.c,v 1.10 2002/08/15 17:32:51 menno Exp $
** $Id: decode.c,v 1.11 2002/11/01 11:19:34 menno Exp $
** $Id: decode.c,v 1.11 2002/11/01 11:19:34 menno Exp $
**/

#ifdef _WIN32


@@ 50,7 50,8 @@
#define DEC_BUFF_VARS \
    int fileread, bytesconsumed, k; \
    int buffercount = 0, buffer_index = 0; \
    unsigned char *buffer;
    unsigned char *buffer; \
    unsigned int bytes_in_buffer = 0;

/* initialise buffering */
#define INIT_BUFF(file) \


@@ 59,28 60,29 @@
    fseek(file, 0, SEEK_SET); \
    buffer = (unsigned char*)malloc(FAAD_MIN_STREAMSIZE*MAX_CHANNELS); \
    memset(buffer, 0, FAAD_MIN_STREAMSIZE*MAX_CHANNELS); \
    fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, file);
    bytes_in_buffer = fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, file);

/* skip bytes in buffer */
#define UPDATE_BUFF_SKIP(bytes) \
    fseek(infile, bytes, SEEK_SET); \
    buffer_index += bytes; \
    buffercount = 0; \
    fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, infile);
    bytes_in_buffer = fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, infile);

/* update buffer */
#define UPDATE_BUFF_READ \
    if (bytesconsumed > 0) { \
        for (k = 0; k < (FAAD_MIN_STREAMSIZE*MAX_CHANNELS - bytesconsumed); k++) \
            buffer[k] = buffer[k + bytesconsumed]; \
        fread(buffer + (FAAD_MIN_STREAMSIZE*MAX_CHANNELS) - bytesconsumed, 1, bytesconsumed, infile); \
        bytes_in_buffer += fread(buffer + (FAAD_MIN_STREAMSIZE*MAX_CHANNELS) - bytesconsumed, 1, bytesconsumed, infile); \
        bytesconsumed = 0; \
    }

/* update buffer indices after faacDecDecode */
#define UPDATE_BUFF_IDX(frame) \
    bytesconsumed += frame.bytesconsumed; \
    buffer_index += frame.bytesconsumed;
    buffer_index += frame.bytesconsumed; \
    bytes_in_buffer -= frame.bytesconsumed;

/* true if decoding has to stop because of EOF */
#define IS_FILE_END buffer_index >= fileread


@@ 169,7 171,8 @@ int decodeAACfile(char *sndfile, int def_srate, aac_dec_opt *opt)

    faacDecSetConfiguration(hDecoder, config);

    if((bytesconsumed = faacDecInit(hDecoder, buffer, &samplerate, &channels)) < 0)
    if ((bytesconsumed = faacDecInit(hDecoder, buffer, bytes_in_buffer,
        &samplerate, &channels)) < 0)
    {
        /* If some error initializing occured, skip the file */
        error_handler("Error initializing decoder library.\n");


@@ 185,7 188,7 @@ int decodeAACfile(char *sndfile, int def_srate, aac_dec_opt *opt)
        /* update buffer */
        UPDATE_BUFF_READ

        sample_buffer = faacDecDecode(hDecoder, &frameInfo, buffer);
        sample_buffer = faacDecDecode(hDecoder, &frameInfo, buffer, bytes_in_buffer);

        /* update buffer indices */
        UPDATE_BUFF_IDX(frameInfo)


@@ 284,8 287,8 @@ int GetAACTrack(MP4FileHandle infile)

            if (buff)
            {
                rc = AudioSpecificConfig(buff, &dummy1_32, &dummy2_8, &dummy3_8,
                    &dummy4_8, &dummy5_8, &dummy6_8, &dummy7_8, &dummy8_8);
                rc = AudioSpecificConfig(buff, buff_size, &dummy1_32, &dummy2_8,
                    &dummy3_8, &dummy4_8, &dummy5_8, &dummy6_8, &dummy7_8, &dummy8_8);
                free(buff);

                if (rc < 0)


@@ 376,7 379,7 @@ int decodeMP4file(char *sndfile, aac_dec_opt *opt)
            return 1;
        }

        sample_buffer = faacDecDecode(hDecoder, &frameInfo, buffer);
        sample_buffer = faacDecDecode(hDecoder, &frameInfo, buffer, buffer_size);

        if (buffer)
            free(buffer);

M common/id3lib/libprj/id3lib.vcproj => common/id3lib/libprj/id3lib.vcproj +3 -3
@@ 70,7 70,7 @@
				AdditionalIncludeDirectories=".\,..\,..\include,..\include\id3,..\zlib\include,..\win32"
				PreprocessorDefinitions="NDEBUG,WIN32,_LIB,_WINDOWS,HAVE_CONFIG_H,ID3LIB_COMPILATION"
				StringPooling="TRUE"
				RuntimeLibrary="4"
				RuntimeLibrary="0"
				EnableFunctionLevelLinking="TRUE"
				UsePrecompiledHeader="2"
				PrecompiledHeaderFile=".\Release/id3lib.pch"


@@ 192,10 192,10 @@
				RelativePath="E:\Program Files\Microsoft Visual Studio\VC98\Include\BASETSD.H">
			</File>
			<File
				RelativePath="..\win32\config.h">
				RelativePath="..\config.h">
			</File>
			<File
				RelativePath="..\config.h">
				RelativePath="..\win32\config.h">
			</File>
			<File
				RelativePath="..\include\id3\error.h">

M common/id3lib/zlib/prj/zlib.vcproj => common/id3lib/zlib/prj/zlib.vcproj +1 -1
@@ 112,7 112,7 @@
				AdditionalIncludeDirectories="..\include"
				PreprocessorDefinitions="WIN32,NDEBUG,_WINDOWS"
				StringPooling="TRUE"
				RuntimeLibrary="4"
				RuntimeLibrary="0"
				EnableFunctionLevelLinking="TRUE"
				UsePrecompiledHeader="2"
				PrecompiledHeaderFile=".\Release/zlib.pch"

M common/mp4v2/libmp4v2_st60.vcproj => common/mp4v2/libmp4v2_st60.vcproj +1 -1
@@ 23,7 23,7 @@
				AdditionalIncludeDirectories=".\"
				PreprocessorDefinitions="WIN32,NDEBUG,_WINDOWS"
				StringPooling="TRUE"
				RuntimeLibrary="4"
				RuntimeLibrary="0"
				EnableFunctionLevelLinking="TRUE"
				UsePrecompiledHeader="2"
				PrecompiledHeaderFile=".\ST_Release/libmp4v2_st60.pch"

M frontend/faad.vcproj => frontend/faad.vcproj +1 -1
@@ 24,7 24,7 @@
				AdditionalIncludeDirectories="../include,../common/mp4v2,../common/faad"
				PreprocessorDefinitions="WIN32,_DEBUG,_CONSOLE"
				BasicRuntimeChecks="3"
				RuntimeLibrary="5"
				RuntimeLibrary="1"
				UsePrecompiledHeader="2"
				PrecompiledHeaderFile=".\Debug/faad.pch"
				AssemblerListingLocation=".\Debug/"

M frontend/main.c => frontend/main.c +15 -12
@@ 16,7 16,7 @@
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: main.c,v 1.24 2002/09/24 09:23:55 menno Exp $
** $Id: main.c,v 1.25 2002/11/01 11:19:35 menno Exp $
**/

#ifdef _WIN32


@@ 47,7 47,8 @@
#define DEC_BUFF_VARS \
    int fileread, bytesconsumed, k; \
    int buffercount = 0, buffer_index = 0; \
    unsigned char *buffer;
    unsigned char *buffer; \
    unsigned int bytes_in_buffer = 0;

/* initialise buffering */
#define INIT_BUFF(file) \


@@ 56,28 57,29 @@
    fseek(file, 0, SEEK_SET); \
    buffer = (unsigned char*)malloc(FAAD_MIN_STREAMSIZE*MAX_CHANNELS); \
    memset(buffer, 0, FAAD_MIN_STREAMSIZE*MAX_CHANNELS); \
    fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, file);
    bytes_in_buffer = fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, file);

/* skip bytes in buffer */
#define UPDATE_BUFF_SKIP(bytes) \
    fseek(infile, bytes, SEEK_SET); \
    buffer_index += bytes; \
    buffercount = 0; \
    fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, infile);
    bytes_in_buffer = fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, infile);

/* update buffer */
#define UPDATE_BUFF_READ \
    if (bytesconsumed > 0) { \
        for (k = 0; k < (FAAD_MIN_STREAMSIZE*MAX_CHANNELS - bytesconsumed); k++) \
            buffer[k] = buffer[k + bytesconsumed]; \
        fread(buffer + (FAAD_MIN_STREAMSIZE*MAX_CHANNELS) - bytesconsumed, 1, bytesconsumed, infile); \
        bytes_in_buffer += fread(buffer + (FAAD_MIN_STREAMSIZE*MAX_CHANNELS) - bytesconsumed, 1, bytesconsumed, infile); \
        bytesconsumed = 0; \
    }

/* update buffer indices after faacDecDecode */
#define UPDATE_BUFF_IDX(frame) \
    bytesconsumed += frame.bytesconsumed; \
    buffer_index += frame.bytesconsumed;
    buffer_index += frame.bytesconsumed; \
    bytes_in_buffer -= frame.bytesconsumed;

/* true if decoding has to stop because of EOF */
#define IS_FILE_END buffer_index >= fileread


@@ 204,8 206,8 @@ int decodeAACfile(char *aacfile, char *sndfile, int to_stdout,

    faacDecSetConfiguration(hDecoder, config);

    if((bytesconsumed = faacDecInit(hDecoder, buffer, &samplerate,
        &channels)) < 0)
    if ((bytesconsumed = faacDecInit(hDecoder, buffer, bytes_in_buffer,
        &samplerate, &channels)) < 0)
    {
        /* If some error initializing occured, skip the file */
        fprintf(stderr, "Error initializing decoder library.\n");


@@ 221,7 223,8 @@ int decodeAACfile(char *aacfile, char *sndfile, int to_stdout,
        /* update buffer */
        UPDATE_BUFF_READ

        sample_buffer = faacDecDecode(hDecoder, &frameInfo, buffer);
        sample_buffer = faacDecDecode(hDecoder, &frameInfo,
            buffer, bytes_in_buffer);

        /* update buffer indices */
        UPDATE_BUFF_IDX(frameInfo)


@@ 309,8 312,8 @@ int GetAACTrack(MP4FileHandle infile)

            if (buff)
            {
                rc = AudioSpecificConfig(buff, &dummy1_32, &dummy2_8, &dummy3_8,
                    &dummy4_8, &dummy5_8, &dummy6_8, &dummy7_8, &dummy8_8);
                rc = AudioSpecificConfig(buff, buff_size, &dummy1_32, &dummy2_8,
                    &dummy3_8, &dummy4_8, &dummy5_8, &dummy6_8, &dummy7_8, &dummy8_8);
                free(buff);

                if (rc < 0)


@@ 412,7 415,7 @@ int decodeMP4file(char *mp4file, char *sndfile, int to_stdout,
            return 1;
		}

        sample_buffer = faacDecDecode(hDecoder, &frameInfo, buffer);
        sample_buffer = faacDecDecode(hDecoder, &frameInfo, buffer, buffer_size);

        if (buffer) free(buffer);


M include/faad.h => include/faad.h +5 -2
@@ 16,7 16,7 @@
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: faad.h,v 1.15 2002/10/11 18:05:01 menno Exp $
** $Id: faad.h,v 1.16 2002/11/01 11:19:35 menno Exp $
**/

#ifndef __AACDEC_H__


@@ 99,6 99,7 @@ unsigned char FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder,
/* Init the library based on info from the AAC file (ADTS/ADIF) */
long FAADAPI faacDecInit(faacDecHandle hDecoder,
                        unsigned char *buffer,
                        unsigned long buffer_size,
                        unsigned long *samplerate,
                        unsigned char *channels);



@@ 111,9 112,11 @@ void FAADAPI faacDecClose(faacDecHandle hDecoder);

void* FAADAPI faacDecDecode(faacDecHandle hDecoder,
                            faacDecFrameInfo *hInfo,
                            unsigned char *buffer);
                            unsigned char *buffer,
                            unsigned long buffer_size);

char FAADAPI AudioSpecificConfig(unsigned char *pBuffer,
                                 unsigned long buffer_size,
                                 unsigned long *samplerate,
                                 unsigned char *channels,
                                 unsigned char *sf_index,

M libfaad/bits.c => libfaad/bits.c +9 -4
@@ 16,19 16,20 @@
** along with this program; if not, write to the Free Software 
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: bits.c,v 1.13 2002/10/26 11:43:11 menno Exp $
** $Id: bits.c,v 1.14 2002/11/01 11:19:35 menno Exp $
**/

#include "common.h"
#include <stdlib.h>
#include <memory.h>
#include "bits.h"

/* initialize buffer, call once before first getbits or showbits */
void faad_initbits(bitfile *ld, void *buffer)
void faad_initbits(bitfile *ld, void *buffer, uint32_t buffer_size)
{
    uint32_t tmp;

    ld->start = (uint32_t*)buffer;
    ld->buffer_size = buffer_size;

    tmp = *(uint32_t*)buffer;
#ifndef ARCH_IS_BIG_ENDIAN


@@ 42,8 43,10 @@ void faad_initbits(bitfile *ld, void *buffer)
#endif
    ld->bufb = tmp;

    ld->bits_left = 32;
    ld->start = (uint32_t*)buffer;
    ld->tail = ((uint32_t*)buffer + 2);

    ld->bits_left = 32;
}

uint32_t faad_get_processed_bits(bitfile *ld)


@@ 95,6 98,8 @@ void faad_initbits_rev(bitfile *ld, void *buffer,
    uint32_t tmp;
    int32_t index;

    ld->buffer_size = bit2byte(bits_in_buffer);

    index = (bits_in_buffer+31)/32 - 1;

    ld->start = (uint32_t*)buffer + index - 2;

M libfaad/bits.h => libfaad/bits.h +3 -2
@@ 16,7 16,7 @@
** along with this program; if not, write to the Free Software 
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: bits.h,v 1.10 2002/09/28 21:57:37 menno Exp $
** $Id: bits.h,v 1.11 2002/11/01 11:19:35 menno Exp $
**/

#ifndef __BITS_H__


@@ 40,6 40,7 @@ typedef struct _bitfile
    uint32_t bufa;
    uint32_t bufb;
    uint32_t bits_left;
    uint32_t buffer_size; /* size of the buffer in bytes */
    uint32_t *tail;
    uint32_t *start;
} bitfile;


@@ 62,7 63,7 @@ static uint32_t bitmask[] = {
    0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF
};

void faad_initbits(bitfile *ld, void *buffer);
void faad_initbits(bitfile *ld, void *buffer, uint32_t buffer_size);
void faad_initbits_rev(bitfile *ld, void *buffer,
                       uint32_t bits_in_buffer);
uint8_t faad_byte_align(bitfile *ld);

M libfaad/decoder.c => libfaad/decoder.c +7 -5
@@ 16,7 16,7 @@
** along with this program; if not, write to the Free Software 
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: decoder.c,v 1.37 2002/10/16 19:18:09 menno Exp $
** $Id: decoder.c,v 1.38 2002/11/01 11:19:35 menno Exp $
**/

#include <stdlib.h>


@@ 123,6 123,7 @@ uint8_t FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder,
}

int32_t FAADAPI faacDecInit(faacDecHandle hDecoder, uint8_t *buffer,
                            uint32_t buffer_size,
                        uint32_t *samplerate, uint8_t *channels)
{
    uint32_t bits = 0;


@@ 137,7 138,7 @@ int32_t FAADAPI faacDecInit(faacDecHandle hDecoder, uint8_t *buffer,

    if (buffer != NULL)
    {
        faad_initbits(&ld, buffer);
        faad_initbits(&ld, buffer, buffer_size);

#ifdef DRM
        if (hDecoder->object_type != DRM_ER_LC)


@@ 213,7 214,8 @@ int8_t FAADAPI faacDecInit2(faacDecHandle hDecoder, uint8_t *pBuffer,
        return -1;
    }

    rc = AudioSpecificConfig(pBuffer, samplerate, channels,
    rc = AudioSpecificConfig(pBuffer, SizeOfDecoderSpecificInfo,
        samplerate, channels,
        &hDecoder->sf_index, &hDecoder->object_type,
#ifdef ERROR_RESILIENCE
        &hDecoder->aacSectionDataResilienceFlag,


@@ 281,7 283,7 @@ void FAADAPI faacDecClose(faacDecHandle hDecoder)

void* FAADAPI faacDecDecode(faacDecHandle hDecoder,
                            faacDecFrameInfo *hInfo,
                            uint8_t *buffer)
                            uint8_t *buffer, uint32_t buffer_size)
{
    int32_t i;
    uint8_t ch;


@@ 334,7 336,7 @@ void* FAADAPI faacDecDecode(faacDecHandle hDecoder,
    memset(hInfo, 0, sizeof(faacDecFrameInfo));

    /* initialize the bitstream */
    faad_initbits(ld, buffer);
    faad_initbits(ld, buffer, buffer_size);

    if (hDecoder->adts_header_present)
    {

M libfaad/decoder.h => libfaad/decoder.h +7 -5
@@ 16,7 16,7 @@
** along with this program; if not, write to the Free Software 
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: decoder.h,v 1.16 2002/09/27 08:37:22 menno Exp $
** $Id: decoder.h,v 1.17 2002/11/01 11:19:35 menno Exp $
**/

#ifndef __DECODER_H__


@@ 124,9 124,10 @@ uint8_t FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder,

/* Init the library based on info from the AAC file (ADTS/ADIF) */
int32_t FAADAPI faacDecInit(faacDecHandle hDecoder,
                        uint8_t *buffer,
                        uint32_t *samplerate,
                        uint8_t *channels);
                            uint8_t *buffer,
                            uint32_t buffer_size,
                            uint32_t *samplerate,
                            uint8_t *channels);

/* Init the library using a DecoderSpecificInfo */
int8_t FAADAPI faacDecInit2(faacDecHandle hDecoder, uint8_t *pBuffer,


@@ 137,7 138,8 @@ void FAADAPI faacDecClose(faacDecHandle hDecoder);

void* FAADAPI faacDecDecode(faacDecHandle hDecoder,
                            faacDecFrameInfo *hInfo,
                            uint8_t *buffer);
                            uint8_t *buffer,
                            uint32_t buffer_size);

/* these functions are in syntax.c */
element *decode_sce_lfe(faacDecHandle hDecoder,

M libfaad/libfaad.vcproj => libfaad/libfaad.vcproj +1 -19
@@ 70,7 70,7 @@
				AdditionalIncludeDirectories="fftw"
				PreprocessorDefinitions="NDEBUG,WIN32,_LIB,FFTW_ENABLE_FLOAT"
				StringPooling="TRUE"
				RuntimeLibrary="4"
				RuntimeLibrary="0"
				EnableFunctionLevelLinking="TRUE"
				UsePrecompiledHeader="2"
				PrecompiledHeaderFile=".\Release/libfaad.pch"


@@ 250,9 250,6 @@
				RelativePath=".\error.h">
			</File>
			<File
				RelativePath=".\fftw\f77_func.h">
			</File>
			<File
				RelativePath=".\filtbank.h">
			</File>
			<File


@@ 295,21 292,6 @@
				RelativePath=".\rvlc_scale_factors.h">
			</File>
			<File
				RelativePath=".\sbr_dec.h">
			</File>
			<File
				RelativePath=".\sbr_huff.h">
			</File>
			<File
				RelativePath=".\sbr_qmf.h">
			</File>
			<File
				RelativePath=".\sbr_syntax.h">
			</File>
			<File
				RelativePath=".\sbr_util.h">
			</File>
			<File
				RelativePath=".\specrec.h">
			</File>
			<File

M libfaad/mp4.c => libfaad/mp4.c +3 -2
@@ 16,7 16,7 @@
** along with this program; if not, write to the Free Software 
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: mp4.c,v 1.11 2002/09/27 08:37:22 menno Exp $
** $Id: mp4.c,v 1.12 2002/11/01 11:19:35 menno Exp $
**/

#include "common.h"


@@ 95,6 95,7 @@ static uint8_t ObjectTypesTable[32] = {

/* Table 1.6.1 */
int8_t FAADAPI AudioSpecificConfig(uint8_t *pBuffer,
                                   uint32_t buffer_size,
                                   uint32_t *samplerate,
                                   uint8_t *channels,
                                   uint8_t *sf_index,


@@ 107,7 108,7 @@ int8_t FAADAPI AudioSpecificConfig(uint8_t *pBuffer,
    bitfile ld;
    uint8_t ObjectTypeIndex, SamplingFrequencyIndex, ChannelsConfiguration;

    faad_initbits(&ld, pBuffer);
    faad_initbits(&ld, pBuffer, buffer_size);
    faad_byte_align(&ld);

    ObjectTypeIndex = (uint8_t)faad_getbits(&ld, 5

M libfaad/mp4.h => libfaad/mp4.h +2 -1
@@ 16,7 16,7 @@
** along with this program; if not, write to the Free Software 
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: mp4.h,v 1.5 2002/06/13 11:03:27 menno Exp $
** $Id: mp4.h,v 1.6 2002/11/01 11:19:36 menno Exp $
**/

#ifndef __MP4_H__


@@ 29,6 29,7 @@ extern "C" {
#include "decoder.h"

int8_t FAADAPI AudioSpecificConfig(uint8_t *pBuffer,
                                   uint32_t buffer_size,
                                   uint32_t *samplerate,
                                   uint8_t *channels,
                                   uint8_t *sf_index,

M libfaad/rvlc_scale_factors.c => libfaad/rvlc_scale_factors.c +3 -3
@@ 16,7 16,7 @@
** along with this program; if not, write to the Free Software 
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: rvlc_scale_factors.c,v 1.5 2002/09/29 10:34:00 menno Exp $
** $Id: rvlc_scale_factors.c,v 1.6 2002/11/01 11:19:36 menno Exp $
**/

/* RVLC scalefactor decoding


@@ 102,7 102,7 @@ uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld)
        rvlc_sf_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_sf
            DEBUGVAR(1,156,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_sf"));

        faad_initbits(&ld_rvlc_sf, (void*)rvlc_sf_buffer);
        faad_initbits(&ld_rvlc_sf, (void*)rvlc_sf_buffer, bit2byte(ics->length_of_rvlc_sf));
//        faad_initbits_rev(&ld_rvlc_sf_rev, (void*)rvlc_sf_buffer,
//            ics->length_of_rvlc_sf);
    }


@@ 115,7 115,7 @@ uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld)
        rvlc_esc_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_escapes
            DEBUGVAR(1,157,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_escapes"));

        faad_initbits(&ld_rvlc_esc, (void*)rvlc_esc_buffer);
        faad_initbits(&ld_rvlc_esc, (void*)rvlc_esc_buffer, bit2byte(ics->length_of_rvlc_escapes));
//        faad_initbits_rev(&ld_rvlc_esc_rev, (void*)rvlc_esc_buffer,
//            ics->length_of_rvlc_escapes);
    }

M plugins/in_mp4/in_mp4.c => plugins/in_mp4/in_mp4.c +7 -4
@@ 16,7 16,7 @@
** along with this program; if not, write to the Free Software 
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: in_mp4.c,v 1.19 2002/09/03 21:22:53 menno Exp $
** $Id: in_mp4.c,v 1.20 2002/11/01 11:19:36 menno Exp $
**/

#define WIN32_LEAN_AND_MEAN


@@ 491,7 491,8 @@ int play(char *fn)
        }

        if ((mp4state.bytes_consumed = faacDecInit(mp4state.hDecoder,
            mp4state.buffer+tagsize, &mp4state.samplerate, &mp4state.channels)) < 0)
            mp4state.buffer+tagsize, mp4state.bytes_into_buffer,
            &mp4state.samplerate, &mp4state.channels)) < 0)
        {
            show_error(module.hMainWindow, "Can't initialize library.");
            faacDecClose(mp4state.hDecoder);


@@ 832,7 833,8 @@ DWORD WINAPI MP4PlayThread(void *b)
                    sample_buffer = NULL;
                    frameInfo.samples = 0;
                } else {
                    sample_buffer = faacDecDecode(mp4state.hDecoder, &frameInfo, buffer);
                    sample_buffer = faacDecDecode(mp4state.hDecoder, &frameInfo,
                        buffer, buffer_size);
                }
                if (frameInfo.error > 0)
                {


@@ 988,7 990,8 @@ DWORD WINAPI AACPlayThread(void *b)
                        }
                    }

                    sample_buffer = faacDecDecode(mp4state.hDecoder, &frameInfo, buffer);
                    sample_buffer = faacDecDecode(mp4state.hDecoder, &frameInfo,
                        buffer, mp4state.bytes_into_buffer);

                    mp4state.bytes_consumed += frameInfo.bytesconsumed;
                    mp4state.bytes_into_buffer -= mp4state.bytes_consumed;

M plugins/in_mp4/utils.c => plugins/in_mp4/utils.c +3 -3
@@ 16,7 16,7 @@
** along with this program; if not, write to the Free Software 
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: utils.c,v 1.3 2002/08/15 17:41:44 menno Exp $
** $Id: utils.c,v 1.4 2002/11/01 11:19:36 menno Exp $
**/

#define WIN32_LEAN_AND_MEAN


@@ 63,8 63,8 @@ int GetAACTrack(MP4FileHandle infile)

            if (buff)
            {
                rc = AudioSpecificConfig(buff, &dummy1_32, &dummy2_8, &dummy3_8, &dummy4_8,
                    &dummy5_8, &dummy6_8, &dummy7_8, &dummy8_8);
                rc = AudioSpecificConfig(buff, buff_size, &dummy1_32, &dummy2_8,
                    &dummy3_8, &dummy4_8, &dummy5_8, &dummy6_8, &dummy7_8, &dummy8_8);
                free(buff);

                if (rc < 0)

M plugins/winamp/in_faad.c => plugins/winamp/in_faad.c +7 -5
@@ 16,7 16,7 @@
** along with this program; if not, write to the Free Software 
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: in_faad.c,v 1.3 2002/02/18 10:01:05 menno Exp $
** $Id: in_faad.c,v 1.4 2002/11/01 11:19:36 menno Exp $
**/

#define WIN32_LEAN_AND_MEAN


@@ 343,7 343,8 @@ int play_memmap(char *fn)
	/* Copy the configuration dialog setting and use it as the default */
	/* initialize the decoder, and get samplerate and channel info */

    if((buffercount = faacDecInit(hDecoder, memmap_buffer + memmap_index, &samplerate, &channels)) < 0)
    if ((buffercount = faacDecInit(hDecoder, memmap_buffer + memmap_index,
        fileread - memmap_index - 1, &samplerate, &channels)) < 0)
    {
		MessageBox(mod.hMainWindow, "Error opening input file\n", "FAAD Error", MB_OK);
		return 1;


@@ 403,7 404,7 @@ int play_file(char *fn)
	/* Copy the configuration dialog setting and use it as the default */
	/* initialize the decoder, and get samplerate and channel info */

    if((buffercount = faacDecInit(hDecoder, buffer, &samplerate, &channels)) < 0)
    if((buffercount = faacDecInit(hDecoder, buffer, 768*2, &samplerate, &channels)) < 0)
    {
		MessageBox(mod.hMainWindow, "Error opening input file\n", "FAAD Error", MB_OK);
		return 1;


@@ 781,7 782,8 @@ int last_frame;

int PlayThread_memmap()
{
    sample_buffer = (char*)faacDecDecode(hDecoder, &frameInfo, memmap_buffer + memmap_index);
    sample_buffer = (char*)faacDecDecode(hDecoder, &frameInfo,
        memmap_buffer + memmap_index, fileread - memmap_index - 1);
    if (frameInfo.error)
    {
        MessageBox(NULL, faacDecGetErrorMessage(frameInfo.error), "FAAD Error", MB_OK);


@@ 807,7 809,7 @@ int PlayThread_file()
        buffercount = 0;
    }

    sample_buffer = (char*)faacDecDecode(hDecoder, &frameInfo, buffer);
    sample_buffer = (char*)faacDecDecode(hDecoder, &frameInfo, buffer, 768*2);
    if (frameInfo.error)
    {
        MessageBox(NULL, faacDecGetErrorMessage(frameInfo.error), "FAAD Error", MB_OK);

M plugins/winamp/in_faad.vcproj => plugins/winamp/in_faad.vcproj +1 -1
@@ 84,7 84,7 @@
				AdditionalIncludeDirectories="..\..\include,..\..\common\faad,..\..\plugins\winamp,..\..\common\id3lib\include"
				PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;ID3LIB_COMPILATION"
				StringPooling="TRUE"
				RuntimeLibrary="4"
				RuntimeLibrary="0"
				EnableFunctionLevelLinking="TRUE"
				UsePrecompiledHeader="2"
				PrecompiledHeaderFile=".\Release/in_faad.pch"

M plugins/winamp3/FAAD.cpp => plugins/winamp3/FAAD.cpp +9 -7
@@ 138,8 138,8 @@ int numTracks = MP4GetNumberOfTracks(infile, NULL, 0);

            if (buff)
            {
                rc = AudioSpecificConfig(buff, &dummy1_32, &dummy2_8, &dummy3_8, &dummy4_8,
                    &dummy5_8, &dummy6_8, &dummy7_8, &dummy8_8);
                rc = AudioSpecificConfig(buff, buff_size,&dummy1_32, &dummy2_8,
                    &dummy3_8, &dummy4_8, &dummy5_8, &dummy6_8, &dummy7_8, &dummy8_8);
                free(buff);

                if (rc < 0)


@@ 235,7 235,8 @@ DWORD	tmp;
		MP4GetTrackESConfiguration(mp4File, track, (unsigned __int8 **)&buffer, &buffer_size);
		if(!buffer)
			ERROR_getInfos("MP4GetTrackESConfiguration");
		AudioSpecificConfig(buffer, &timeScale, &Channels, &sf, &type, &dummy8, &dummy8, &dummy8, &dummy8);
		AudioSpecificConfig(buffer, buffer_size, &timeScale, &Channels, &sf, &type,
            &dummy8, &dummy8, &dummy8, &dummy8);
		if(faacDecInit2(hDecoder, buffer, buffer_size, &Samplerate, &Channels) < 0)
			ERROR_getInfos("Error initializing decoder library");
		FREE_ARRAY(buffer);


@@ 379,7 380,8 @@ DWORD	tmp;
			DWORD	Samples,
					BytesConsumed;

				if((bytes_consumed=faacDecInit(hDecoder, buffer, &Samplerate, &Channels))<0)
				if((bytes_consumed=faacDecInit(hDecoder, buffer, bytes_into_buffer,
                    &Samplerate, &Channels))<0)
					ERROR_getInfos("Can't init library");
				bytes_into_buffer-=bytes_consumed;
				if(!processData(infos,0,0))


@@ 396,7 398,7 @@ DWORD	tmp;
			}
		}

		if((bytes_consumed=faacDecInit(hDecoder, buffer, &Samplerate, &Channels))<0)
		if((bytes_consumed=faacDecInit(hDecoder, buffer, bytes_into_buffer, &Samplerate, &Channels))<0)
			ERROR_getInfos("faacDecInit failed!")
		bytes_into_buffer-=bytes_consumed;



@@ 472,7 474,7 @@ svc_fileReader *reader = infos->getReader();
				ERROR_processData("MP4ReadSample")
			}

			bufout=(char *)faacDecDecode(hDecoder,&frameInfo,buffer);
			bufout=(char *)faacDecDecode(hDecoder,&frameInfo,buffer,buffer_size);
			BytesDecoded=frameInfo.samples*sizeof(short);
			FREE_ARRAY(buffer);
			// to update the slider


@@ 536,7 538,7 @@ svc_fileReader *reader = infos->getReader();
				else
					ERROR_processData(0);

			bufout=(char *)faacDecDecode(hDecoder,&frameInfo,buffer);
			bufout=(char *)faacDecDecode(hDecoder,&frameInfo,buffer,bytes_into_buffer);
			BytesDecoded=frameInfo.samples*sizeof(short);
			bytes_consumed+=frameInfo.bytesconsumed;
			bytes_into_buffer-=bytes_consumed;

M plugins/xmms/src/libaac.c => plugins/xmms/src/libaac.c +202 -202
@@ 1,14 1,14 @@
/*
**			  AAC plugin for XMMS 1.2.7
**				by ciberfred
**		------------------------------------------------
**            AAC plugin for XMMS 1.2.7
**              by ciberfred
**      ------------------------------------------------
** The version of the plugin match the version of XMMS
** for identifie different version use the date :)
**
**			version 1.2.7 (23 august 2002)
**          version 1.2.7 (23 august 2002)
**
**
**	       need faad2 package from http://www.audiocoding.com
**         need faad2 package from http://www.audiocoding.com
**
*/



@@ 25,10 25,10 @@
#include "xmms/configfile.h"
#include "xmms/titlestring.h"

#define AAC_DESCRIPTION	"MPEG2/4 AAC player - 1.2.7"
#define AAC_VERSION	"AAC player - 23 Agust 2002"
#define AAC_ABOUT	"Writen from scratch by ciberfred from France"
#define BUFFER_SIZE	FAAD_MIN_STREAMSIZE*64
#define AAC_DESCRIPTION "MPEG2/4 AAC player - 1.2.7"
#define AAC_VERSION "AAC player - 23 Agust 2002"
#define AAC_ABOUT   "Writen from scratch by ciberfred from France"
#define BUFFER_SIZE FAAD_MIN_STREAMSIZE*64

static void aac_init(void);
static void aac_play(char*);


@@ 55,47 55,47 @@ extern void clearWindowDatas(void);

InputPlugin aac_ip =
{
	0,		// handle
	0,		// filename
	AAC_DESCRIPTION,// description
	aac_init,	// init_func
	aac_about,	// aboutbox
	0,		// configuration
	aac_isFile,	// ???
	0,		// scan dir
	aac_play,	// when play button
	aac_stop,	// when stop
	aac_pause,	// when pause
	aac_seek,	// when seek
	0,		// set equalizer
	aac_getTime,	// ???
	0,		// get volume
	0,		// set volume
	aac_cleanup,	// the cleanup function :)
	0,		// obsolete (???)
	0,		// send visualisation data
	0,		// set player window info
	0,		// set song title text
	0,	// get song title text to show on Playlist
	aac_getSongInfo,// file info box
	0		// pointer to outputPlugin
    0,      // handle
    0,      // filename
    AAC_DESCRIPTION,// description
    aac_init,   // init_func
    aac_about,  // aboutbox
    0,      // configuration
    aac_isFile, // ???
    0,      // scan dir
    aac_play,   // when play button
    aac_stop,   // when stop
    aac_pause,  // when pause
    aac_seek,   // when seek
    0,      // set equalizer
    aac_getTime,    // ???
    0,      // get volume
    0,      // set volume
    aac_cleanup,    // the cleanup function :)
    0,      // obsolete (???)
    0,      // send visualisation data
    0,      // set player window info
    0,      // set song title text
    0,  // get song title text to show on Playlist
    aac_getSongInfo,// file info box
    0       // pointer to outputPlugin
};
static gboolean 	bPlaying = FALSE;
static gboolean	bOutputOpen = FALSE;
static pthread_t	decodeThread;
static gint		seek_pos = -1; // the track position
static pthread_mutex_t	mutex = PTHREAD_MUTEX_INITIALIZER;
static gboolean     bPlaying = FALSE;
static gboolean bOutputOpen = FALSE;
static pthread_t    decodeThread;
static gint     seek_pos = -1; // the track position
static pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER;

/******************************************************************************/

InputPlugin	*get_iplugin_info(void)
InputPlugin *get_iplugin_info(void)
{
	return (&aac_ip);
    return (&aac_ip);
}

static void aac_init(void)
{
	memset(&decodeThread, 0, sizeof(pthread_t));
    memset(&decodeThread, 0, sizeof(pthread_t));
}

static void aac_cleanup(void)


@@ 104,208 104,208 @@ static void aac_cleanup(void)

static void aac_play(char *filename)
{
	printf("play\n");
	bPlaying = TRUE;
	pthread_create(&decodeThread, 0, aac_decode, g_strdup(filename));
	return;
    printf("play\n");
    bPlaying = TRUE;
    pthread_create(&decodeThread, 0, aac_decode, g_strdup(filename));
    return;
}

static void aac_stop(void)
{
	printf("stop\n");
	if (bPlaying){
		bPlaying = FALSE;
		pthread_join(decodeThread, NULL);
		memset(&decodeThread, 0, sizeof(pthread_t));
		aac_ip.output->close_audio();
		clearWindowDatas();
	}
    printf("stop\n");
    if (bPlaying){
        bPlaying = FALSE;
        pthread_join(decodeThread, NULL);
        memset(&decodeThread, 0, sizeof(pthread_t));
        aac_ip.output->close_audio();
        clearWindowDatas();
    }
}

static void aac_pause(short paused)
{
	printf("pause\n");
	if(bOutputOpen){
		aac_ip.output->pause(paused);
	}
    printf("pause\n");
    if(bOutputOpen){
        aac_ip.output->pause(paused);
    }
}

static int aac_getTime(void)
{
	if (!bPlaying){
		return (-1);
	}
	else{
		return (aac_ip.output->output_time());
	}
    if (!bPlaying){
        return (-1);
    }
    else{
        return (aac_ip.output->output_time());
    }
}


static void aac_seek(int time)
{
	printf("seek\n");
    printf("seek\n");
}

static void aac_getSongInfo(char *filename)
{
	infoBoxWindow = createDialogInfo();
	gtk_widget_show(infoBoxWindow);
    infoBoxWindow = createDialogInfo();
    gtk_widget_show(infoBoxWindow);
}

static void *aac_decode(void *args)
{
	char 			*filename = args;
	char			*xmmstitle=NULL;
	FILE 			*file = NULL;
	faacDecHandle		decoder = 0;
	unsigned char		*buffer = 0;
	unsigned long		bufferconsumed = 0;
	unsigned long		samplerate = 0;
	char			channels;
	unsigned long		buffervalid = 0;
	TitleInput		*input;
	char 			*temp = g_strdup(filename);
	char			*ext  = strrchr(temp, '.');
    char            *filename = args;
    char            *xmmstitle=NULL;
    FILE            *file = NULL;
    faacDecHandle       decoder = 0;
    unsigned char       *buffer = 0;
    unsigned long       bufferconsumed = 0;
    unsigned long       samplerate = 0;
    char            channels;
    unsigned long       buffervalid = 0;
    TitleInput      *input;
    char            *temp = g_strdup(filename);
    char            *ext  = strrchr(temp, '.');

	printf("decoding...\n");
	pthread_mutex_lock(&mutex);
	clearWindowDatas();
	if ((file = fopen(filename, "rb")) == 0){
		printf("can't find file %s\n", filename);
		pthread_mutex_unlock(&mutex);
		pthread_exit(NULL);
	}
	if ((decoder = faacDecOpen()) == NULL){
		printf("Open Decoder Error\n");
		fclose(file);
		pthread_mutex_unlock(&mutex);
		pthread_exit(NULL);
	}
	if ((buffer = g_malloc(BUFFER_SIZE)) == NULL)
		printf("error g_malloc\n");
	buffervalid = fread(buffer, 1, BUFFER_SIZE, file);
    printf("decoding...\n");
    pthread_mutex_lock(&mutex);
    clearWindowDatas();
    if ((file = fopen(filename, "rb")) == 0){
        printf("can't find file %s\n", filename);
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
    }
    if ((decoder = faacDecOpen()) == NULL){
        printf("Open Decoder Error\n");
        fclose(file);
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
    }
    if ((buffer = g_malloc(BUFFER_SIZE)) == NULL)
        printf("error g_malloc\n");
    buffervalid = fread(buffer, 1, BUFFER_SIZE, file);
// check for ID3 tag
		XMMS_NEW_TITLEINPUT(input);
		input->file_name = g_basename(temp);
		input->file_ext = ext ? ext+1 : NULL;
		input->file_path = temp;
	if (!strncmp(buffer, "ID3", 3)){
		int size = 0;
        XMMS_NEW_TITLEINPUT(input);
        input->file_name = g_basename(temp);
        input->file_ext = ext ? ext+1 : NULL;
        input->file_path = temp;
    if (!strncmp(buffer, "ID3", 3)){
        int size = 0;

		printf("Song with a ID3Tagv2\n");
		readID3tag(filename);
		if(title)
		input->track_name = g_strdup(title);
		if(artist)
		input->performer = g_strdup(artist);
		if(genre)
		input->genre = g_strdup(genre);
		if(track)
		input->track_number = atoi(track);
		fseek(file, 0, SEEK_SET);
        printf("Song with a ID3Tagv2\n");
        readID3tag(filename);
        if(title)
        input->track_name = g_strdup(title);
        if(artist)
        input->performer = g_strdup(artist);
        if(genre)
        input->genre = g_strdup(genre);
        if(track)
        input->track_number = atoi(track);
        fseek(file, 0, SEEK_SET);
/*
** hum .. horrible hack taken from the winamp plugin to jump
** the tag, is there any id3 function to do this ???? hum... seems not :(
*/
		size = (buffer[6]<<21) | (buffer[7]<<14) | (buffer[8]<<7) | buffer[9];
		size+=10;
		fread(buffer, 1, size, file);
		buffervalid = fread(buffer, 1, BUFFER_SIZE, file);
	}
	xmmstitle = xmms_get_titlestring(xmms_get_gentitle_format(), input);
	if(xmmstitle == NULL)
		xmmstitle = g_strdup(input->file_name);
	g_free(temp);
	g_free(input->performer);
	g_free(input->album_name);
	g_free(input->track_name);
	g_free(input->genre);
	g_free(input);
	bufferconsumed = faacDecInit(decoder, buffer, &samplerate, &channels);
//	printf("song with %d channels at %d Hz\n", channels, samplerate);
	if((bOutputOpen = aac_ip.output->open_audio(FMT_S16_NE, samplerate, channels)) == FALSE){
		printf("Output Error\n");
		g_free(buffer);
		buffer=0;
		faacDecClose(decoder);
		fclose(file);
		aac_ip.output->close_audio();
		pthread_mutex_unlock(&mutex);
		pthread_exit(NULL);
	}
	aac_ip.set_info(xmmstitle, -1, -1, samplerate, channels);
	aac_ip.output->flush(0);
        size = (buffer[6]<<21) | (buffer[7]<<14) | (buffer[8]<<7) | buffer[9];
        size+=10;
        fread(buffer, 1, size, file);
        buffervalid = fread(buffer, 1, BUFFER_SIZE, file);
    }
    xmmstitle = xmms_get_titlestring(xmms_get_gentitle_format(), input);
    if(xmmstitle == NULL)
        xmmstitle = g_strdup(input->file_name);
    g_free(temp);
    g_free(input->performer);
    g_free(input->album_name);
    g_free(input->track_name);
    g_free(input->genre);
    g_free(input);
    bufferconsumed = faacDecInit(decoder, buffer, buffervalid, &samplerate, &channels);
//  printf("song with %d channels at %d Hz\n", channels, samplerate);
    if((bOutputOpen = aac_ip.output->open_audio(FMT_S16_NE, samplerate, channels)) == FALSE){
        printf("Output Error\n");
        g_free(buffer);
        buffer=0;
        faacDecClose(decoder);
        fclose(file);
        aac_ip.output->close_audio();
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
    }
    aac_ip.set_info(xmmstitle, -1, -1, samplerate, channels);
    aac_ip.output->flush(0);

	while(bPlaying && buffervalid > 0){
		faacDecFrameInfo	finfo;
		unsigned long		samplesdecoded;
		char			*sample_buffer = NULL;
    while(bPlaying && buffervalid > 0){
        faacDecFrameInfo    finfo;
        unsigned long       samplesdecoded;
        char            *sample_buffer = NULL;

		if(bufferconsumed > 0){
		memmove(buffer, &buffer[bufferconsumed], buffervalid-bufferconsumed);
			buffervalid -= bufferconsumed;
			buffervalid += fread(&buffer[buffervalid], 1, BUFFER_SIZE-buffervalid, file);
			bufferconsumed = 0;
		}
		sample_buffer = faacDecDecode(decoder, &finfo, buffer);
		if(finfo.error){
			buffervalid = 0;
			printf("FAAD2 Error %s\n", faacDecGetErrorMessage(finfo.error));
			printf("---Use Psystrip.exe on the file to avoid the ADTS error---\n");
		}
		bufferconsumed += finfo.bytesconsumed;
		samplesdecoded = finfo.samples;
		if((samplesdecoded<=0) && !sample_buffer){
			printf("error\n");
		}
		while(bPlaying && aac_ip.output->buffer_free() < (samplesdecoded<<1)){
			xmms_usleep(10000);
		}
		aac_ip.add_vis_pcm(aac_ip.output->written_time(), FMT_S16_LE, channels, samplesdecoded<<1, sample_buffer);
		aac_ip.output->write_audio(sample_buffer, samplesdecoded<<1);
	}
	while(bPlaying && aac_ip.output->buffer_playing()){
		xmms_usleep(10000);
	}
//	aac_ip.output->flush(0);
	aac_ip.output->buffer_free();
	aac_ip.output->close_audio();
	bPlaying = FALSE;
	bOutputOpen = FALSE;
	g_free(buffer);
	faacDecClose(decoder);
	g_free(xmmstitle);
	fclose(file);
	printf("...ended\n");
	seek_pos = -1;
	pthread_mutex_unlock(&mutex);
	pthread_exit(NULL);
        if(bufferconsumed > 0){
        memmove(buffer, &buffer[bufferconsumed], buffervalid-bufferconsumed);
            buffervalid -= bufferconsumed;
            buffervalid += fread(&buffer[buffervalid], 1, BUFFER_SIZE-buffervalid, file);
            bufferconsumed = 0;
        }
        sample_buffer = faacDecDecode(decoder, &finfo, buffer, buffervalid);
        if(finfo.error){
            buffervalid = 0;
            printf("FAAD2 Error %s\n", faacDecGetErrorMessage(finfo.error));
            printf("---Use Psystrip.exe on the file to avoid the ADTS error---\n");
        }
        bufferconsumed += finfo.bytesconsumed;
        samplesdecoded = finfo.samples;
        if((samplesdecoded<=0) && !sample_buffer){
            printf("error\n");
        }
        while(bPlaying && aac_ip.output->buffer_free() < (samplesdecoded<<1)){
            xmms_usleep(10000);
        }
        aac_ip.add_vis_pcm(aac_ip.output->written_time(), FMT_S16_LE, channels, samplesdecoded<<1, sample_buffer);
        aac_ip.output->write_audio(sample_buffer, samplesdecoded<<1);
    }
    while(bPlaying && aac_ip.output->buffer_playing()){
        xmms_usleep(10000);
    }
//  aac_ip.output->flush(0);
    aac_ip.output->buffer_free();
    aac_ip.output->close_audio();
    bPlaying = FALSE;
    bOutputOpen = FALSE;
    g_free(buffer);
    faacDecClose(decoder);
    g_free(xmmstitle);
    fclose(file);
    printf("...ended\n");
    seek_pos = -1;
    pthread_mutex_unlock(&mutex);
    pthread_exit(NULL);
}

static int aac_isFile(char *filename)
{
	char *extention = strrchr(filename, '.');
	if (extention && !strcasecmp(extention, ".aac")){
		return (1);
	}
	return(0);
    char *extention = strrchr(filename, '.');
    if (extention && !strcasecmp(extention, ".aac")){
        return (1);
    }
    return(0);
}

static void aac_about(void)
{
	GtkWidget *dialog, *button, *label, *label2;
    GtkWidget *dialog, *button, *label, *label2;

	dialog = gtk_dialog_new();
	gtk_window_set_title(GTK_WINDOW(dialog), "About FAAD2 plugin");
	label = gtk_label_new(AAC_ABOUT);
	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label, TRUE, TRUE, 0);
	gtk_widget_show(label);
	label2 = gtk_label_new(AAC_VERSION);
	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label2, TRUE, TRUE, 0);
	gtk_widget_show(label2);
	button = gtk_button_new_with_label("close");
	gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(dialog));
	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, FALSE, FALSE, 0);
	gtk_widget_show(button);
	gtk_widget_show(dialog);
    dialog = gtk_dialog_new();
    gtk_window_set_title(GTK_WINDOW(dialog), "About FAAD2 plugin");
    label = gtk_label_new(AAC_ABOUT);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label, TRUE, TRUE, 0);
    gtk_widget_show(label);
    label2 = gtk_label_new(AAC_VERSION);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label2, TRUE, TRUE, 0);
    gtk_widget_show(label2);
    button = gtk_button_new_with_label("close");
    gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(dialog));
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, FALSE, FALSE, 0);
    gtk_widget_show(button);
    gtk_widget_show(dialog);
}