Merged release 0.15.6 from branch 'v0.15.x'

Conflicts:

	NEWS
	configure.ac
This commit is contained in:
Max Kellermann 2009-11-19 19:59:34 +01:00
commit c33bbd947b
4 changed files with 36 additions and 10 deletions

9
NEWS
View File

@ -76,16 +76,23 @@ ver 0.16 (20??/??/??)
* require GLib 2.12 * require GLib 2.12
ver 0.15.6 (2009/??/??) ver 0.15.7 (2009/??/??)
ver 0.15.6 (2009/11/18)
* input: * input:
- lastfm: fixed variable name in GLib<2.16 code path - lastfm: fixed variable name in GLib<2.16 code path
- input/mms: require libmms 0.4 - input/mms: require libmms 0.4
* archive: * archive:
- zzip: require libzzip 0.13 - zzip: require libzzip 0.13
* tags:
- id3: allow 4 MB RIFF/AIFF tags
* decoders: * decoders:
- ffmpeg: convert metadata - ffmpeg: convert metadata
- ffmpeg: align the output buffer
- oggflac: rewind stream after FLAC detection - oggflac: rewind stream after FLAC detection
- flac: fixed CUE seeking range check - flac: fixed CUE seeking range check
- flac: fixed NULL pointer dereference in CUE code
* output_thread: check again if output is open on PAUSE * output_thread: check again if output is open on PAUSE
* update: delete ignored symlinks from database * update: delete ignored symlinks from database
* database: increased maximum line length to 32 kB * database: increased maximum line length to 32 kB

View File

@ -223,11 +223,11 @@ flac_vtrack_tnum(const char* fname)
* another/better way would be to use tag struct * another/better way would be to use tag struct
*/ */
char* ptr = strrchr(fname, '_'); char* ptr = strrchr(fname, '_');
if (ptr == NULL)
return 0;
// copy ascii tracknumber to int // copy ascii tracknumber to int
char vtrack[4]; return (unsigned int)strtol(++ptr, NULL, 10);
g_strlcpy(vtrack, ++ptr, 4);
return (unsigned int)strtol(vtrack, NULL, 10);
} }
#endif /* FLAC_API_VERSION_CURRENT >= 7 */ #endif /* FLAC_API_VERSION_CURRENT >= 7 */

View File

@ -210,6 +210,21 @@ ffmpeg_helper(struct input_stream *input,
return ret; return ret;
} }
/**
* On some platforms, libavcodec wants the output buffer aligned to 16
* bytes (because it uses SSE/Altivec internally). This function
* returns the aligned version of the specified buffer, and corrects
* the buffer size.
*/
static void *
align16(void *p, size_t *length_p)
{
unsigned add = 16 - (size_t)p % 16;
*length_p -= add;
return (char *)p + add;
}
static enum decoder_command static enum decoder_command
ffmpeg_send_packet(struct decoder *decoder, struct input_stream *is, ffmpeg_send_packet(struct decoder *decoder, struct input_stream *is,
const AVPacket *packet, const AVPacket *packet,
@ -218,7 +233,9 @@ ffmpeg_send_packet(struct decoder *decoder, struct input_stream *is,
{ {
enum decoder_command cmd = DECODE_COMMAND_NONE; enum decoder_command cmd = DECODE_COMMAND_NONE;
int position; int position;
uint8_t audio_buf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2]; uint8_t audio_buf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2 + 16];
int16_t *aligned_buffer;
size_t buffer_size;
int len, audio_size; int len, audio_size;
uint8_t *packet_data; uint8_t *packet_data;
int packet_size; int packet_size;
@ -226,11 +243,13 @@ ffmpeg_send_packet(struct decoder *decoder, struct input_stream *is,
packet_data = packet->data; packet_data = packet->data;
packet_size = packet->size; packet_size = packet->size;
buffer_size = sizeof(audio_buf);
aligned_buffer = align16(audio_buf, &buffer_size);
while ((packet_size > 0) && (cmd == DECODE_COMMAND_NONE)) { while ((packet_size > 0) && (cmd == DECODE_COMMAND_NONE)) {
audio_size = sizeof(audio_buf); audio_size = buffer_size;
len = avcodec_decode_audio2(codec_context, len = avcodec_decode_audio2(codec_context,
(int16_t *)audio_buf, aligned_buffer, &audio_size,
&audio_size,
packet_data, packet_size); packet_data, packet_size);
if (len < 0) { if (len < 0) {
@ -251,7 +270,7 @@ ffmpeg_send_packet(struct decoder *decoder, struct input_stream *is,
: 0; : 0;
cmd = decoder_data(decoder, is, cmd = decoder_data(decoder, is,
audio_buf, audio_size, aligned_buffer, audio_size,
position, position,
codec_context->bit_rate / 1000, NULL); codec_context->bit_rate / 1000, NULL);
} }

View File

@ -472,7 +472,7 @@ tag_id3_riff_aiff_load(FILE *file)
if (size == 0) if (size == 0)
return NULL; return NULL;
if (size > 256 * 1024) if (size > 4 * 1024 * 1024)
/* too large, don't allocate so much memory */ /* too large, don't allocate so much memory */
return NULL; return NULL;