typedef gint64 (*GstOggMapPacketDurationFunc) (GstOggStream * pad,
ogg_packet * packet);
+typedef gint64 (*GstOggMapGranuleposToKeyGranuleFunc) (GstOggStream * pad,
+ gint64 granulepos);
+
#define SKELETON_FISBONE_MIN_SIZE 52
#define SKELETON_FISHEAD_3_3_MIN_SIZE 112
GstOggMapIsKeyFrameFunc is_key_frame_func;
GstOggMapIsHeaderPacketFunc is_header_func;
GstOggMapPacketDurationFunc packet_duration_func;
+ GstOggMapGranuleposToKeyGranuleFunc granulepos_to_key_granule_func;
};
static const GstOggMap mappers[];
gint64
gst_ogg_stream_granulepos_to_key_granule (GstOggStream * pad, gint64 granulepos)
{
+ if (mappers[pad->map].granulepos_to_key_granule_func)
+ return mappers[pad->map].granulepos_to_key_granule_func (pad, granulepos);
+
if (granulepos == -1 || granulepos == 0) {
return granulepos;
}
return (((hdr >> 4) & 1) != 0) ? 1 : 0;
}
+static gint64
+granulepos_to_key_granule_vp8 (GstOggStream * pad, gint64 granulepos)
+{
+ guint64 gp = granulepos;
+ guint64 pts = (gp >> 32);
+ guint32 dist = (gp >> 3) & 0x07ffffff;
+
+ if (granulepos == -1 || granulepos == 0)
+ return granulepos;
+
+ if (dist > pts)
+ return 0;
+
+ return pts - dist;
+}
+
/* vorbis */
static gboolean
granule_to_granulepos_default,
is_keyframe_theora,
is_header_theora,
- packet_duration_constant
+ packet_duration_constant,
+ NULL
},
{
"\001vorbis", 7, 22,
granule_to_granulepos_default,
is_keyframe_true,
is_header_vorbis,
- packet_duration_vorbis
+ packet_duration_vorbis,
+ NULL
},
{
"Speex", 5, 80,
granule_to_granulepos_default,
is_keyframe_true,
is_header_count,
- packet_duration_constant
+ packet_duration_constant,
+ NULL
},
{
"PCM ", 8, 0,
NULL,
NULL,
is_header_count,
+ NULL,
NULL
},
{
NULL,
NULL,
is_header_count,
+ NULL,
NULL
},
{
granule_to_granulepos_default,
NULL,
is_header_count,
+ NULL,
NULL
},
{
NULL,
NULL,
is_header_true,
+ NULL,
NULL
},
{
granule_to_granulepos_default,
is_keyframe_true,
is_header_fLaC,
- packet_duration_flac
+ packet_duration_flac,
+ NULL
},
{
"\177FLAC", 5, 36,
granule_to_granulepos_default,
is_keyframe_true,
is_header_flac,
- packet_duration_flac
+ packet_duration_flac,
+ NULL
},
{
"AnxData", 7, 0,
NULL,
NULL,
NULL,
+ NULL,
NULL
},
{
granule_to_granulepos_default,
NULL,
is_header_count,
- packet_duration_constant
+ packet_duration_constant,
+ NULL
},
{
"\200kate\0\0\0", 8, 0,
granule_to_granulepos_default,
NULL,
is_header_count,
+ NULL,
NULL
},
{
granule_to_granulepos_dirac,
is_keyframe_dirac,
is_header_count,
- packet_duration_constant
+ packet_duration_constant,
+ NULL
},
{
"VP80\1", 5, 4,
granule_to_granulepos_vp8,
is_keyframe_vp8,
is_header_count,
- packet_duration_vp8
+ packet_duration_vp8,
+ granulepos_to_key_granule_vp8
},
{
"\001audio\0\0\0", 9, 53,
granule_to_granulepos_default,
is_keyframe_true,
is_header_ogm,
- packet_duration_ogm
+ packet_duration_ogm,
+ NULL
},
{
"\001video\0\0\0", 9, 53,
granule_to_granulepos_default,
NULL,
is_header_ogm,
- packet_duration_constant
+ packet_duration_constant,
+ NULL
},
{
"\001text\0\0\0", 9, 9,
granule_to_granulepos_default,
is_keyframe_true,
is_header_ogm,
- packet_duration_ogm
+ packet_duration_ogm,
+ NULL
}
};
/* *INDENT-ON* */