diff options
author | Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> | 2010-01-05 14:11:06 +0100 |
---|---|---|
committer | Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> | 2010-01-05 16:44:58 +0100 |
commit | 8fb183c7c9597677f15fb9962535b183ad6b3fc1 (patch) | |
tree | 306525f3560866df1dfba0cce9f677d4615b8c4f | |
parent | fe970cb8566b3b7e24d9e2786738f5273f089af4 (diff) |
oggdemux: enhance flac packet duration calculation
-rw-r--r-- | ext/ogg/gstoggstream.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/ext/ogg/gstoggstream.c b/ext/ogg/gstoggstream.c index 50a132f3..2889b89f 100644 --- a/ext/ogg/gstoggstream.c +++ b/ext/ogg/gstoggstream.c @@ -637,6 +637,31 @@ packet_duration_flac (GstOggStream * pad, ogg_packet * packet) if (block_size_index >= 8) { return 256 << (block_size_index - 8); } + if (block_size_index == 6 || block_size_index == 7) { + guint len, bytes = (block_size_index - 6) + 1; + guint8 tmp; + + if (packet->bytes < 4 + 1 + bytes) + return -1; + tmp = packet->packet[4]; + /* utf-8 prefix */ + len = 0; + while (tmp & 0x80) { + len++; + tmp <<= 1; + } + if (len == 2) + return -1; + if (len == 0) + len++; + if (packet->bytes < 4 + len + bytes) + return -1; + if (bytes == 1) { + return packet->packet[4 + len] + 1; + } else { + return GST_READ_UINT16_BE (packet->packet + 4 + len) + 1; + } + } return -1; } @@ -1156,7 +1181,7 @@ static const GstOggMap mappers[] = { NULL }, { - "\177FLAC", 4, 36, + "\177FLAC", 5, 36, "audio/x-flac", setup_flac_mapper, granulepos_to_granule_default, |