summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2010-01-05 14:11:06 +0100
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2010-01-05 16:44:58 +0100
commit8fb183c7c9597677f15fb9962535b183ad6b3fc1 (patch)
tree306525f3560866df1dfba0cce9f677d4615b8c4f
parentfe970cb8566b3b7e24d9e2786738f5273f089af4 (diff)
oggdemux: enhance flac packet duration calculation
-rw-r--r--ext/ogg/gstoggstream.c27
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,