Merged release 0.15.4 from branch 'v0.15.x'
Conflicts: NEWS configure.ac
This commit is contained in:
commit
7013f9fc31
4
NEWS
4
NEWS
|
@ -39,9 +39,11 @@ ver 0.16 (20??/??/??)
|
||||||
* obey $(sysconfdir) for default mpd.conf location
|
* obey $(sysconfdir) for default mpd.conf location
|
||||||
|
|
||||||
|
|
||||||
ver 0.15.4 (2009/??/??)
|
ver 0.15.4 (2009/10/03)
|
||||||
* decoders:
|
* decoders:
|
||||||
- vorbis: revert "faster tag scanning with ov_test_callback()"
|
- vorbis: revert "faster tag scanning with ov_test_callback()"
|
||||||
|
- faad: skip assertion failure on large ID3 tags
|
||||||
|
- ffmpeg: use the "artist" tag if "author" is not present
|
||||||
* output:
|
* output:
|
||||||
- osx: fix the OS X 10.6 build
|
- osx: fix the OS X 10.6 build
|
||||||
|
|
||||||
|
|
|
@ -162,6 +162,7 @@ faad_song_duration(struct decoder_buffer *buffer, struct input_stream *is)
|
||||||
size_t tagsize;
|
size_t tagsize;
|
||||||
const unsigned char *data;
|
const unsigned char *data;
|
||||||
size_t length;
|
size_t length;
|
||||||
|
bool success;
|
||||||
|
|
||||||
fileread = is->size >= 0 ? is->size : 0;
|
fileread = is->size >= 0 ? is->size : 0;
|
||||||
|
|
||||||
|
@ -179,8 +180,11 @@ faad_song_duration(struct decoder_buffer *buffer, struct input_stream *is)
|
||||||
|
|
||||||
tagsize += 10;
|
tagsize += 10;
|
||||||
|
|
||||||
decoder_buffer_consume(buffer, tagsize);
|
success = decoder_buffer_skip(buffer, tagsize) &&
|
||||||
decoder_buffer_fill(buffer);
|
decoder_buffer_fill(buffer);
|
||||||
|
if (!success)
|
||||||
|
return -1;
|
||||||
|
|
||||||
data = decoder_buffer_read(buffer, &length);
|
data = decoder_buffer_read(buffer, &length);
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -339,7 +339,7 @@ ffmpeg_decode(struct decoder *decoder, struct input_stream *input)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if LIBAVFORMAT_VERSION_INT >= ((52<<16)+(31<<8)+0)
|
#if LIBAVFORMAT_VERSION_INT >= ((52<<16)+(31<<8)+0)
|
||||||
static void
|
static bool
|
||||||
ffmpeg_copy_metadata(struct tag *tag, AVMetadata *m,
|
ffmpeg_copy_metadata(struct tag *tag, AVMetadata *m,
|
||||||
enum tag_type type, const char *name)
|
enum tag_type type, const char *name)
|
||||||
{
|
{
|
||||||
|
@ -347,6 +347,7 @@ ffmpeg_copy_metadata(struct tag *tag, AVMetadata *m,
|
||||||
|
|
||||||
while ((mt = av_metadata_get(m, name, mt, 0)) != NULL)
|
while ((mt = av_metadata_get(m, name, mt, 0)) != NULL)
|
||||||
tag_add_item(tag, type, mt->value);
|
tag_add_item(tag, type, mt->value);
|
||||||
|
return mt != NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -363,7 +364,9 @@ static bool ffmpeg_tag_internal(struct ffmpeg_context *ctx)
|
||||||
av_metadata_conv(f, NULL, f->iformat->metadata_conv);
|
av_metadata_conv(f, NULL, f->iformat->metadata_conv);
|
||||||
|
|
||||||
ffmpeg_copy_metadata(tag, f->metadata, TAG_ITEM_TITLE, "title");
|
ffmpeg_copy_metadata(tag, f->metadata, TAG_ITEM_TITLE, "title");
|
||||||
ffmpeg_copy_metadata(tag, f->metadata, TAG_ITEM_ARTIST, "author");
|
if (!ffmpeg_copy_metadata(tag, f->metadata, TAG_ITEM_ARTIST, "author"))
|
||||||
|
ffmpeg_copy_metadata(tag, f->metadata,
|
||||||
|
TAG_ITEM_ARTIST, "artist");
|
||||||
ffmpeg_copy_metadata(tag, f->metadata, TAG_ITEM_ALBUM, "album");
|
ffmpeg_copy_metadata(tag, f->metadata, TAG_ITEM_ALBUM, "album");
|
||||||
ffmpeg_copy_metadata(tag, f->metadata, TAG_ITEM_COMMENT, "comment");
|
ffmpeg_copy_metadata(tag, f->metadata, TAG_ITEM_COMMENT, "comment");
|
||||||
ffmpeg_copy_metadata(tag, f->metadata, TAG_ITEM_GENRE, "genre");
|
ffmpeg_copy_metadata(tag, f->metadata, TAG_ITEM_GENRE, "genre");
|
||||||
|
|
|
@ -138,3 +138,29 @@ decoder_buffer_consume(struct decoder_buffer *buffer, size_t nbytes)
|
||||||
|
|
||||||
assert(buffer->consumed <= buffer->length);
|
assert(buffer->consumed <= buffer->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
decoder_buffer_skip(struct decoder_buffer *buffer, size_t nbytes)
|
||||||
|
{
|
||||||
|
size_t length;
|
||||||
|
const void *data;
|
||||||
|
bool success;
|
||||||
|
|
||||||
|
/* this could probably be optimized by seeking */
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
data = decoder_buffer_read(buffer, &length);
|
||||||
|
if (data != NULL) {
|
||||||
|
if (length > nbytes)
|
||||||
|
length = nbytes;
|
||||||
|
decoder_buffer_consume(buffer, length);
|
||||||
|
nbytes -= length;
|
||||||
|
if (nbytes == 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
success = decoder_buffer_fill(buffer);
|
||||||
|
if (!success)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -93,4 +93,14 @@ decoder_buffer_read(const struct decoder_buffer *buffer, size_t *length_r);
|
||||||
void
|
void
|
||||||
decoder_buffer_consume(struct decoder_buffer *buffer, size_t nbytes);
|
decoder_buffer_consume(struct decoder_buffer *buffer, size_t nbytes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips the specified number of bytes, discarding its data.
|
||||||
|
*
|
||||||
|
* @param buffer the decoder_buffer object
|
||||||
|
* @param nbytes the number of bytes to skip
|
||||||
|
* @return true on success, false on error
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
decoder_buffer_skip(struct decoder_buffer *buffer, size_t nbytes);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#undef G_LOG_DOMAIN
|
#undef G_LOG_DOMAIN
|
||||||
#define G_LOG_DOMAIN "jack"
|
#define G_LOG_DOMAIN "input_mms"
|
||||||
|
|
||||||
struct input_mms {
|
struct input_mms {
|
||||||
mmsx_t *mms;
|
mmsx_t *mms;
|
||||||
|
|
Loading…
Reference in New Issue