ogg: implement packet duration query for kate streams

https://bugzilla.gnome.org/show_bug.cgi?id=637519
This commit is contained in:
Vincent Penquerc'h 2010-12-17 14:16:18 +00:00 committed by Sebastian Dröge
parent aa07af41f3
commit 22aa87e98f
2 changed files with 33 additions and 2 deletions

View file

@ -540,7 +540,12 @@ gst_ogg_demux_chain_peer (GstOggPad * pad, ogg_packet * packet,
} else if (pad->map.is_sparse) {
out_timestamp = gst_ogg_stream_granule_to_time (&pad->map,
pad->current_granule);
out_duration = GST_CLOCK_TIME_NONE;
if (duration == GST_CLOCK_TIME_NONE) {
out_duration = GST_CLOCK_TIME_NONE;
} else {
out_duration = gst_util_uint64_scale (duration,
GST_SECOND * pad->map.granulerate_d, pad->map.granulerate_n);
}
} else {
out_timestamp = gst_ogg_stream_granule_to_time (&pad->map,
pad->current_granule - duration);

View file

@ -1732,6 +1732,32 @@ setup_kate_mapper (GstOggStream * pad, ogg_packet * packet)
return TRUE;
}
static gint64
packet_duration_kate (GstOggStream * pad, ogg_packet * packet)
{
gint64 duration;
if (packet->bytes < 1)
return 0;
switch (packet->packet[0]) {
case 0x00: /* text data */
if (packet->bytes < 1 + 8 * 2) {
duration = 0;
} else {
duration = GST_READ_UINT64_LE (packet->packet + 1 + 8);
if (duration < 0)
duration = 0;
}
break;
default:
duration = GST_CLOCK_TIME_NONE;
break;
}
return duration;
}
/* *INDENT-OFF* */
/* indent hates our freedoms */
@ -1875,7 +1901,7 @@ const GstOggMap mappers[] = {
granule_to_granulepos_default,
NULL,
is_header_count,
NULL,
packet_duration_kate,
NULL,
NULL
},