oggstream: account for opus pre-skip in granpos/time mapping

This commit is contained in:
Vincent Penquerc'h 2011-11-21 17:03:21 +00:00
parent da69993a49
commit e05f1df04b
2 changed files with 10 additions and 0 deletions

View file

@ -127,6 +127,10 @@ gst_ogg_stream_granule_to_time (GstOggStream * pad, gint64 granule)
if (granule == 0 || pad->granulerate_n == 0 || pad->granulerate_d == 0) if (granule == 0 || pad->granulerate_n == 0 || pad->granulerate_d == 0)
return 0; return 0;
granule += pad->granule_offset;
if (granule < 0)
return 0;
return gst_util_uint64_scale (granule, GST_SECOND * pad->granulerate_d, return gst_util_uint64_scale (granule, GST_SECOND * pad->granulerate_d,
pad->granulerate_n); pad->granulerate_n);
} }
@ -1858,6 +1862,11 @@ setup_opus_mapper (GstOggStream * pad, ogg_packet * packet)
pad->granuleshift = 0; pad->granuleshift = 0;
pad->n_header_packets = 2; pad->n_header_packets = 2;
/* pre-skip is in samples at 48000 Hz, which matches granule one for one */
pad->granule_offset = -GST_READ_UINT16_LE (packet->packet + 10);
GST_INFO ("Opus has a pre-skip of %" G_GINT64_FORMAT " samples",
-pad->granule_offset);
pad->caps = gst_caps_new_simple ("audio/x-opus", NULL); pad->caps = gst_caps_new_simple ("audio/x-opus", NULL);
return TRUE; return TRUE;

View file

@ -60,6 +60,7 @@ struct _GstOggStream
gboolean have_fisbone; gboolean have_fisbone;
gint granulerate_n; gint granulerate_n;
gint granulerate_d; gint granulerate_d;
gint64 granule_offset;
guint32 preroll; guint32 preroll;
guint granuleshift; guint granuleshift;
gint n_header_packets; gint n_header_packets;