Subject: pkg/32059: 64-bit bug and fix for audio/faad2 pkg
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: Parag Patel <parag@codegen.com>
List: pkgsrc-bugs
Date: 11/12/2005 23:36:00
>Number: 32059
>Category: pkg
>Synopsis: 64-bit bug and fix for audio/faad2 pkg
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: pkg-manager
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sat Nov 12 23:36:00 +0000 2005
>Originator: Parag Patel
>Release: NetBSD 2.1.0_STABLE
>Organization:
CodeGen, Inc.
>Environment:
System: NetBSD hammerhead.parag.codegen.com 2.1.0_STABLE NetBSD 2.1.0_STABLE (GENERIC) #0: Sat Nov 5 05:11:30 UTC 2005 parag@hammerhead.parag.codegen.com:/usr/src/sys/arch/amd64/compile/GENERIC amd64
Architecture: x86_64
Machine: amd64
>Description:
The pkg audio/faad2 fails to run correctly on amd64 and likely on other
64-bit systems. Instead of converting the source m4a file, it fills the
screen with "Warning: Pulse coding not allowed in short blocks".
>How-To-Repeat:
Build audio/faad2 on a 64-bit machine, esp. on amd64 and try to run it
on a known good m4a (AAC) format sound file.
>Fix:
This seems to be a known problem on Linux/amd64:
<http://forums.suselinuxsupport.de/index.php?act=ST&f=3&t=16372>
This pointed to a couple of patches:
<http://bugs.gentoo.org/attachment.cgi?id=58582&action=view>
and
<http://votewithabullet.org:11000/random/patch-faad2-amd64.patch>
The second patched cleanly and seems to work, with AAC files nicely
converted to WAV. I slightly altered the patch so that it would apply
cleanly under pkgsrc, and I append this patch (and its SHA1 sig) below.
SHA1 (patch-am) = f879880cd86fd01ccfe1d92b7ecfedd16ba78160
diff -urN include/faad.h faad2-patched/include/faad.h
--- include/faad.h 2004-02-06 02:23:28.000000000 -0800
+++ faad2-patched/include/faad.h 2005-07-02 13:03:03.799075488 -0700
@@ -43,6 +43,10 @@
#endif
#endif
+/* needed for standard integer types */
+#define __STDC_LIMIT_MACROS
+#include <stdint.h>
+
#define FAAD2_VERSION "2.0 "
/* object types for AAC */
@@ -112,86 +116,86 @@
typedef struct mp4AudioSpecificConfig
{
/* Audio Specific Info */
- unsigned char objectTypeIndex;
- unsigned char samplingFrequencyIndex;
- unsigned long samplingFrequency;
- unsigned char channelsConfiguration;
+ uint8_t objectTypeIndex;
+ uint8_t samplingFrequencyIndex;
+ uint32_t samplingFrequency;
+ uint8_t channelsConfiguration;
/* GA Specific Info */
- unsigned char frameLengthFlag;
- unsigned char dependsOnCoreCoder;
- unsigned short coreCoderDelay;
- unsigned char extensionFlag;
- unsigned char aacSectionDataResilienceFlag;
- unsigned char aacScalefactorDataResilienceFlag;
- unsigned char aacSpectralDataResilienceFlag;
- unsigned char epConfig;
+ uint8_t frameLengthFlag;
+ uint8_t dependsOnCoreCoder;
+ uint16_t coreCoderDelay;
+ uint8_t extensionFlag;
+ uint8_t aacSectionDataResilienceFlag;
+ uint8_t aacScalefactorDataResilienceFlag;
+ uint8_t aacSpectralDataResilienceFlag;
+ uint8_t epConfig;
- char sbr_present_flag;
- char forceUpSampling;
+ int8_t sbr_present_flag;
+ int8_t forceUpSampling;
} mp4AudioSpecificConfig;
typedef struct faacDecConfiguration
{
- unsigned char defObjectType;
- unsigned long defSampleRate;
- unsigned char outputFormat;
- unsigned char downMatrix;
- unsigned char useOldADTSFormat;
- unsigned char dontUpSampleImplicitSBR;
+ uint8_t defObjectType;
+ uint8_t defSampleRate;
+ uint8_t outputFormat;
+ uint8_t downMatrix;
+ uint8_t useOldADTSFormat;
+ uint8_t dontUpSampleImplicitSBR;
} faacDecConfiguration, *faacDecConfigurationPtr;
typedef struct faacDecFrameInfo
{
- unsigned long bytesconsumed;
- unsigned long samples;
- unsigned char channels;
- unsigned char error;
- unsigned long samplerate;
+ uint32_t bytesconsumed;
+ uint32_t samples;
+ uint8_t channels;
+ uint8_t error;
+ uint32_t samplerate;
/* SBR: 0: off, 1: on; upsample, 2: on; downsampled, 3: off; upsampled */
- unsigned char sbr;
+ uint8_t sbr;
/* MPEG-4 ObjectType */
- unsigned char object_type;
+ uint8_t object_type;
/* AAC header type; MP4 will be signalled as RAW also */
- unsigned char header_type;
+ uint8_t header_type;
/* multichannel configuration */
- unsigned char num_front_channels;
- unsigned char num_side_channels;
- unsigned char num_back_channels;
- unsigned char num_lfe_channels;
- unsigned char channel_position[64];
+ uint8_t num_front_channels;
+ uint8_t num_side_channels;
+ uint8_t num_back_channels;
+ uint8_t num_lfe_channels;
+ uint8_t channel_position[64];
} faacDecFrameInfo;
-char* FAADAPI faacDecGetErrorMessage(unsigned char errcode);
+int8_t* FAADAPI faacDecGetErrorMessage(uint8_t errcode);
-unsigned long FAADAPI faacDecGetCapabilities(void);
+uint32_t FAADAPI faacDecGetCapabilities(void);
faacDecHandle FAADAPI faacDecOpen(void);
faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder);
-unsigned char FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder,
+uint8_t FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder,
faacDecConfigurationPtr config);
/* 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);
+ uint8_t *buffer,
+ uint32_t buffer_size,
+ uint32_t *samplerate,
+ uint8_t *channels);
/* Init the library using a DecoderSpecificInfo */
-char FAADAPI faacDecInit2(faacDecHandle hDecoder, unsigned char *pBuffer,
- unsigned long SizeOfDecoderSpecificInfo,
- unsigned long *samplerate, unsigned char *channels);
+int8_t FAADAPI faacDecInit2(faacDecHandle hDecoder, uint8_t *pBuffer,
+ uint32_t SizeOfDecoderSpecificInfo,
+ uint32_t *samplerate, uint8_t *channels);
/* Init the library for DRM */
-char FAADAPI faacDecInitDRM(faacDecHandle hDecoder, unsigned long samplerate,
- unsigned char channels);
+int8_t FAADAPI faacDecInitDRM(faacDecHandle hDecoder, uint32_t samplerate,
+ uint8_t channels);
void FAADAPI faacDecPostSeekReset(faacDecHandle hDecoder, long frame);
@@ -199,12 +203,12 @@
void* FAADAPI faacDecDecode(faacDecHandle hDecoder,
faacDecFrameInfo *hInfo,
- unsigned char *buffer,
- unsigned long buffer_size);
+ uint8_t *buffer,
+ uint32_t buffer_size);
-char FAADAPI AudioSpecificConfig(unsigned char *pBuffer,
- unsigned long buffer_size,
- mp4AudioSpecificConfig *mp4ASC);
+int8_t FAADAPI AudioSpecificConfig(uint8_t *pBuffer,
+ uint32_t buffer_size,
+ mp4AudioSpecificConfig *mp4ASC);
#ifdef _WIN32
#pragma pack(pop)
diff -urN libfaad/common.h faad2-patched/libfaad/common.h
--- libfaad/common.h 2004-02-06 04:55:24.000000000 -0800
+++ faad2-patched/libfaad/common.h 2005-07-02 13:03:03.799075488 -0700
@@ -197,8 +197,16 @@
#else
# if HAVE_STDINT_H
# include <stdint.h>
-# else
-/* we need these... */
+# elif defined(__x86_64__)
+typedef unsigned long uint64_t;
+typedef unsigned int uint32_t;
+typedef unsigned short uint16_t;
+typedef unsigned char uint8_t;
+typedef long int64_t;
+typedef int int32_t;
+typedef short int16_t;
+typedef char int8_t;
+#else
typedef unsigned long long uint64_t;
typedef unsigned long uint32_t;
typedef unsigned short uint16_t;
diff -urN plugins/mpeg4ip/aa_file.cpp faad2-patched/plugins/mpeg4ip/aa_file.cpp
--- plugins/mpeg4ip/aa_file.cpp 2004-01-05 06:05:12.000000000 -0800
+++ faad2-patched/plugins/mpeg4ip/aa_file.cpp 2005-07-02 13:03:03.799075488 -0700
@@ -56,8 +56,8 @@
aac->m_buffer_size_max,
aac->m_ifile);
- unsigned long freq;
- unsigned char chans;
+ uint32_t freq;
+ uint8_t chans;
faacDecInit(aac->m_info, (unsigned char *)aac->m_buffer,
aac->m_buffer_size, &freq, &chans);
diff -urN plugins/mpeg4ip/faad2.cpp faad2-patched/plugins/mpeg4ip/faad2.cpp
--- plugins/mpeg4ip/faad2.cpp 2004-01-05 06:05:12.000000000 -0800
+++ faad2-patched/plugins/mpeg4ip/faad2.cpp 2005-07-02 13:03:03.799075488 -0700
@@ -76,8 +76,8 @@
}
aac->m_info = faacDecOpen();
- unsigned long srate;
- unsigned char chan;
+ uint32_t srate;
+ uint8_t chan;
if ((userdata == NULL && fmtp == NULL) ||
(faacDecInit2(aac->m_info,
(uint8_t *)userdata,
@@ -156,7 +156,7 @@
void *userdata)
{
aac_codec_t *aac = (aac_codec_t *)ptr;
- unsigned long bytes_consummed;
+ uint32_t bytes_consummed;
int bits = -1;
// struct timezone tz;
@@ -188,8 +188,8 @@
* If not initialized, do so.
*/
abort();
- unsigned long freq;
- unsigned char chans;
+ uint32_t freq;
+ uint8_t chans;
faacDecInit(aac->m_info,
(unsigned char *)buffer,
@@ -202,7 +202,7 @@
}
uint8_t *buff;
- unsigned long samples;
+ uint32_t samples;
bytes_consummed = buflen;
//aa_message(LOG_DEBUG, aaclib, "decoding %d bits", buflen * 8);
faacDecFrameInfo frame_info;
@@ -237,7 +237,7 @@
aac->m_vft->audio_configure(aac->m_ifptr,
aac->m_freq,
aac->m_chans,
- AUDIO_S16SYS,
+ AUDIO_FMT_S16,
aac->m_output_frame_size);
uint8_t *now = aac->m_vft->audio_get_buffer(aac->m_ifptr);
aac->m_audio_inited = 1;
diff -urN plugins/xmms/src/libmp4.c faad2-patched/plugins/xmms/src/libmp4.c
--- plugins/xmms/src/libmp4.c 2003-12-03 10:37:56.000000000 -0800
+++ faad2-patched/plugins/xmms/src/libmp4.c 2005-07-02 13:06:08.253034224 -0700
@@ -22,6 +22,9 @@
#define MP4_ABOUT "Written by ciberfred"
#define BUFFER_SIZE FAAD_MIN_STREAMSIZE*64
+extern void getMP4info(char* file);
+extern int getAACTrack(MP4FileHandle file);
+
static void mp4_init(void);
static void mp4_about(void);
static void mp4_play(char *);
@@ -112,13 +115,13 @@
gchar* extention;
extention = strrchr(filename, '.');
- if (extention &&
- !strcasecmp(extention, ".mp4") || // official extention
- !strcasecmp(extention, ".m4a") || // Apple mp4 extention
- !strcasecmp(extention, ".aac") // old MPEG2/4-AAC extention
- ){
- return (1);
- }
+
+ if (extention)
+ if( (!strcasecmp(extention, ".mp4") || // official extention
+ !strcasecmp(extention, ".m4a") || // Apple mp4 extention
+ !strcasecmp(extention, ".aac") // old MPEG2/4-AAC extention
+ ))
+ return(1);
}
return(0);
}
--
__
/__)_ _ _ _ Ask five economists and you'll get five different
/ (// (/(/ explanations (six if one went to Harvard). -- Edgar R.
_/ Fiedler