diff options
Diffstat (limited to 'src/demuxers/id3.c')
-rw-r--r-- | src/demuxers/id3.c | 80 |
1 files changed, 24 insertions, 56 deletions
diff --git a/src/demuxers/id3.c b/src/demuxers/id3.c index b707166b6..843b4e9e3 100644 --- a/src/demuxers/id3.c +++ b/src/demuxers/id3.c @@ -227,47 +227,15 @@ static int id3v2_parse_genre(char* dest, char *src, int len) { return 1; } -#if 0 -/* parse an unsynchronized 16bits integer */ -static uint16_t BE_16_synchsafe(uint8_t buf[2]) { - return ((uint16_t)(buf[0] & 0x7F) << 7) | - (uint16_t)(buf[1] & 0x7F); -} -#endif - -/* parse an unsynchronized 24bits integer */ -static uint32_t BE_24_synchsafe(uint8_t buf[3]) { - return ((uint32_t)(buf[0] & 0x7F) << 14) | - ((uint32_t)(buf[1] & 0x7F) << 7) | - (uint32_t)(buf[2] & 0x7F); -} - -/* parse an unsynchronized 32bits integer */ -static uint32_t BE_32_synchsafe(uint8_t buf[4]) { - return ((uint32_t)(buf[0] & 0x7F) << 21) | - ((uint32_t)(buf[1] & 0x7F) << 14) | - ((uint32_t)(buf[2] & 0x7F) << 7) | - (uint32_t)(buf[3] & 0x7F); -} - -/* parse an unsynchronized 35bits integer */ -static uint32_t BE_35_synchsafe(uint8_t buf[5]) { - return ((uint32_t)(buf[0] & 0x07) << 28) | - ((uint32_t)(buf[1] & 0x7F) << 21) | - ((uint32_t)(buf[2] & 0x7F) << 14) | - ((uint32_t)(buf[3] & 0x7F) << 7) | - (uint32_t)(buf[4] & 0x7F); -} - static int id3v2_parse_header(input_plugin_t *input, uint8_t *mp3_frame_header, id3v2_header_t *tag_header) { uint8_t buf[6]; - tag_header->id = BE_32(mp3_frame_header); + tag_header->id = _X_BE_32(mp3_frame_header); if (input->read (input, buf, 6) == 6) { tag_header->revision = buf[0]; tag_header->flags = buf[1]; - tag_header->size = BE_32_synchsafe(&buf[2]); + tag_header->size = _X_BE_32_synchsafe(&buf[2]); lprintf("tag: ID3 v2.%d.%d\n", mp3_frame_header[3], tag_header->revision); lprintf("flags: %d\n", tag_header->flags); @@ -289,7 +257,7 @@ static int id3v22_parse_frame_header(input_plugin_t *input, if (len == ID3V22_FRAME_HEADER_SIZE) { frame_header->id = (buf[0] << 16) + (buf[1] << 8) + buf[2]; - frame_header->size = BE_24_synchsafe(&buf[3]); + frame_header->size = _X_BE_24_synchsafe(&buf[3]); lprintf("frame: %c%c%c: size: %d\n", buf[0], buf[1], buf[2], frame_header->size); @@ -369,7 +337,7 @@ static int id3v22_interp_frame(input_plugin_t *input, int id3v22_parse_tag(input_plugin_t *input, xine_stream_t *stream, - int8_t *mp3_frame_header) { + uint8_t *mp3_frame_header) { id3v2_header_t tag_header; id3v22_frame_header_t tag_frame_header; int pos = 0; @@ -379,7 +347,7 @@ int id3v22_parse_tag(input_plugin_t *input, if (tag_header.flags & ID3V22_ZERO_FLAG) { /* invalid flags */ xprintf(stream->xine, XINE_VERBOSITY_DEBUG, - "id3: invalid header flags\n"); + "id3: invalid header flags (%02x)\n", tag_header.flags); input->seek (input, tag_header.size - pos, SEEK_CUR); return 0; } @@ -441,9 +409,9 @@ static int id3v23_parse_frame_header(input_plugin_t *input, len = input->read (input, buf, ID3V23_FRAME_HEADER_SIZE); if (len == ID3V23_FRAME_HEADER_SIZE) { - frame_header->id = BE_32(buf); - frame_header->size = BE_32(&buf[4]); - frame_header->flags = BE_16(buf + 8); + frame_header->id = _X_BE_32(buf); + frame_header->size = _X_BE_32(&buf[4]); + frame_header->flags = _X_BE_16(buf + 8); lprintf("frame: %c%c%c%c, size: %d, flags: %X\n", buf[0], buf[1], buf[2], buf[3], frame_header->size, frame_header->flags); @@ -460,12 +428,12 @@ static int id3v23_parse_frame_ext_header(input_plugin_t *input, if (input->read (input, buf, 4) == 4) { - frame_ext_header->size = BE_32_synchsafe(&buf[0]); + frame_ext_header->size = _X_BE_32_synchsafe(&buf[0]); if (frame_ext_header->size == 6) { if (input->read (input, buf + 4, 6) == 6) { - frame_ext_header->flags = BE_16(buf + 4); - frame_ext_header->padding_size = BE_32(buf + 6); + frame_ext_header->flags = _X_BE_16(buf + 4); + frame_ext_header->padding_size = _X_BE_32(buf + 6); frame_ext_header->crc = 0; } else { return 0; @@ -473,9 +441,9 @@ static int id3v23_parse_frame_ext_header(input_plugin_t *input, } else if (frame_ext_header->size == 10) { if (input->read (input, buf + 4, 10) == 10) { - frame_ext_header->flags = BE_16(buf + 4); - frame_ext_header->padding_size = BE_32(buf + 6); - frame_ext_header->crc = BE_32(buf + 10); + frame_ext_header->flags = _X_BE_16(buf + 4); + frame_ext_header->padding_size = _X_BE_32(buf + 6); + frame_ext_header->crc = _X_BE_32(buf + 10); } else { return 0; } @@ -562,7 +530,7 @@ static int id3v23_interp_frame(input_plugin_t *input, int id3v23_parse_tag(input_plugin_t *input, xine_stream_t *stream, - int8_t *mp3_frame_header) { + uint8_t *mp3_frame_header) { id3v2_header_t tag_header; id3v23_frame_header_t tag_frame_header; id3v23_frame_ext_header_t tag_frame_ext_header; @@ -573,7 +541,7 @@ int id3v23_parse_tag(input_plugin_t *input, if (tag_header.flags & ID3V23_ZERO_FLAG) { /* invalid flags */ xprintf(stream->xine, XINE_VERBOSITY_DEBUG, - "id3: invalid header flags\n"); + "id3: invalid header flags (%02x)\n", tag_header.flags); input->seek (input, tag_header.size - pos, SEEK_CUR); return 0; } @@ -650,9 +618,9 @@ static int id3v24_parse_frame_header(input_plugin_t *input, len = input->read (input, buf, ID3V24_FRAME_HEADER_SIZE); if (len == ID3V24_FRAME_HEADER_SIZE) { - frame_header->id = BE_32(buf); - frame_header->size = BE_32_synchsafe(&buf[4]); - frame_header->flags = BE_16(&buf[8]); + frame_header->id = _X_BE_32(buf); + frame_header->size = _X_BE_32_synchsafe(&buf[4]); + frame_header->flags = _X_BE_16(&buf[8]); lprintf("frame: %c%c%c%c, size: %d, flags: %X\n", buf[0], buf[1], buf[2], buf[3], frame_header->size, frame_header->flags); @@ -669,7 +637,7 @@ static int id3v24_parse_ext_header(input_plugin_t *input, if (input->read (input, buf, 4) == 4) { - frame_ext_header->size = BE_32_synchsafe(&buf[0]); + frame_ext_header->size = _X_BE_32_synchsafe(&buf[0]); if (input->read (input, buf, 2) == 2) { uint8_t flags_size = buf[0]; @@ -813,7 +781,7 @@ static int id3v24_interp_frame(input_plugin_t *input, int id3v24_parse_tag(input_plugin_t *input, xine_stream_t *stream, - int8_t *mp3_frame_header) { + uint8_t *mp3_frame_header) { id3v2_header_t tag_header; id3v24_frame_header_t tag_frame_header; id3v24_frame_ext_header_t tag_frame_ext_header; @@ -824,7 +792,7 @@ int id3v24_parse_tag(input_plugin_t *input, if (tag_header.flags & ID3V24_ZERO_FLAG) { /* invalid flags */ xprintf(stream->xine, XINE_VERBOSITY_DEBUG, - "id3: invalid header flags\n"); + "id3: invalid header flags (%02x)\n", tag_header.flags); input->seek (input, tag_header.size - pos, SEEK_CUR); return 0; } @@ -881,7 +849,7 @@ int id3v24_parse_tag(input_plugin_t *input, int id3v2_parse_tag(input_plugin_t *input, xine_stream_t *stream, - int8_t *mp3_frame_header) { + uint8_t *mp3_frame_header) { _x_assert(mp3_frame_header[0] == 'I' && mp3_frame_header[1] == 'D' && mp3_frame_header[2] == '3'); int result = 0; @@ -898,7 +866,7 @@ int id3v2_parse_tag(input_plugin_t *input, break; case 4: - xprintf(stream->xine, XINE_VERBOSITY_LOG, "ID3V2.3 tag\n"); + xprintf(stream->xine, XINE_VERBOSITY_LOG, "ID3V2.4 tag\n"); result = id3v24_parse_tag(input, stream, mp3_frame_header); break; |