gint64 granule, gint64 keyframe_granule);
/* returns TRUE if the granulepos denotes a key frame */
-typedef gboolean (*GstOggMapIsKeyFrameFunc) (GstOggStream * pad,
+typedef gboolean (*GstOggMapIsGranuleposKeyFrameFunc) (GstOggStream * pad,
gint64 granulepos);
+/* returns TRUE if the packet is a key frame */
+typedef gboolean (*GstOggMapIsPacketKeyFrameFunc) (GstOggStream * pad,
+ ogg_packet * packet);
+
/* returns TRUE if the given packet is a stream header packet */
typedef gboolean (*GstOggMapIsHeaderPacketFunc) (GstOggStream * pad,
ogg_packet * packet);
GstOggMapSetupFunc setup_func;
GstOggMapToGranuleFunc granulepos_to_granule_func;
GstOggMapToGranuleposFunc granule_to_granulepos_func;
- GstOggMapIsKeyFrameFunc is_key_frame_func;
+ GstOggMapIsGranuleposKeyFrameFunc is_granulepos_key_frame_func;
+ GstOggMapIsPacketKeyFrameFunc is_packet_key_frame_func;
GstOggMapIsHeaderPacketFunc is_header_func;
GstOggMapPacketDurationFunc packet_duration_func;
GstOggMapGranuleposToKeyGranuleFunc granulepos_to_key_granule_func;
return FALSE;
}
- if (mappers[pad->map].is_key_frame_func == NULL) {
+ if (mappers[pad->map].is_granulepos_key_frame_func == NULL) {
GST_WARNING ("Failed to determine keyframeness for %s granulepos",
gst_ogg_stream_get_media_type (pad));
return FALSE;
}
- return mappers[pad->map].is_key_frame_func (pad, granulepos);
+ return mappers[pad->map].is_granulepos_key_frame_func (pad, granulepos);
+}
+
+gboolean
+gst_ogg_stream_packet_is_key_frame (GstOggStream * pad, ogg_packet * packet)
+{
+ if (mappers[pad->map].is_packet_key_frame_func == NULL) {
+ GST_WARNING ("Failed to determine keyframeness of %s packet",
+ gst_ogg_stream_get_media_type (pad));
+ return FALSE;
+ }
+
+ return mappers[pad->map].is_packet_key_frame_func (pad, packet);
}
gboolean
/* some generic functions */
static gboolean
-is_keyframe_true (GstOggStream * pad, gint64 granulepos)
+is_granulepos_keyframe_true (GstOggStream * pad, gint64 granulepos)
+{
+ return TRUE;
+}
+
+static gboolean
+is_packet_keyframe_true (GstOggStream * pad, ogg_packet * packet)
{
return TRUE;
}
/* 2 bits + 3 bits = 5 bits KFGSHIFT */
pad->granuleshift = ((GST_READ_UINT8 (data + 40) & 0x03) << 3) +
(GST_READ_UINT8 (data + 41) >> 5);
+ GST_LOG ("granshift: %d", pad->granuleshift);
pad->is_video = TRUE;
pad->n_header_packets = 3;
}
static gboolean
-is_keyframe_theora (GstOggStream * pad, gint64 granulepos)
+is_granulepos_keyframe_theora (GstOggStream * pad, gint64 granulepos)
{
gint64 frame_mask;
}
static gboolean
+is_packet_keyframe_theora (GstOggStream * pad, ogg_packet * packet)
+{
+ if (packet->bytes == 0)
+ return FALSE;
+ return (packet->packet[0] & 0xc0) == 0x00;
+}
+
+static gboolean
is_header_theora (GstOggStream * pad, ogg_packet * packet)
{
return (packet->bytes > 0 && (packet->packet[0] & 0x80) == 0x80);
setup_theora_mapper,
granulepos_to_granule_theora,
granule_to_granulepos_default,
- is_keyframe_theora,
+ is_granulepos_keyframe_theora,
+ is_packet_keyframe_theora,
is_header_theora,
packet_duration_constant,
NULL,
setup_vorbis_mapper,
granulepos_to_granule_default,
granule_to_granulepos_default,
- is_keyframe_true,
+ is_granulepos_keyframe_true,
+ is_packet_keyframe_true,
is_header_vorbis,
packet_duration_vorbis,
NULL,
setup_speex_mapper,
granulepos_to_granule_default,
granule_to_granulepos_default,
- is_keyframe_true,
+ is_granulepos_keyframe_true,
+ is_packet_keyframe_true,
is_header_count,
packet_duration_constant,
NULL,
NULL,
NULL,
NULL,
+ NULL,
is_header_count,
NULL,
NULL,
NULL,
NULL,
NULL,
+ NULL,
is_header_count,
NULL,
NULL,
granulepos_to_granule_default,
granule_to_granulepos_default,
NULL,
+ NULL,
is_header_count,
NULL,
NULL,
NULL,
NULL,
NULL,
+ NULL,
is_header_true,
NULL,
NULL,
setup_fLaC_mapper,
granulepos_to_granule_default,
granule_to_granulepos_default,
- is_keyframe_true,
+ is_granulepos_keyframe_true,
+ is_packet_keyframe_true,
is_header_fLaC,
packet_duration_flac,
NULL,
setup_flac_mapper,
granulepos_to_granule_default,
granule_to_granulepos_default,
- is_keyframe_true,
+ is_granulepos_keyframe_true,
+ is_packet_keyframe_true,
is_header_flac,
packet_duration_flac,
NULL,
NULL,
NULL,
NULL,
+ NULL,
NULL
},
{
granulepos_to_granule_default,
granule_to_granulepos_default,
NULL,
+ NULL,
is_header_count,
packet_duration_constant,
NULL,
granulepos_to_granule_default,
granule_to_granulepos_default,
NULL,
+ NULL,
is_header_count,
packet_duration_kate,
NULL,
granulepos_to_granule_dirac,
granule_to_granulepos_dirac,
is_keyframe_dirac,
+ NULL,
is_header_count,
packet_duration_constant,
granulepos_to_key_granule_dirac,
granulepos_to_granule_vp8,
granule_to_granulepos_vp8,
is_keyframe_vp8,
+ NULL,
is_header_vp8,
packet_duration_vp8,
granulepos_to_key_granule_vp8,
granulepos_to_granule_default,
granule_to_granulepos_default,
NULL,
+ NULL,
is_header_opus,
packet_duration_opus,
NULL,
setup_ogmaudio_mapper,
granulepos_to_granule_default,
granule_to_granulepos_default,
- is_keyframe_true,
+ is_granulepos_keyframe_true,
+ is_packet_keyframe_true,
is_header_ogm,
packet_duration_ogm,
NULL,
granulepos_to_granule_default,
granule_to_granulepos_default,
NULL,
+ NULL,
is_header_ogm,
packet_duration_constant,
NULL,
setup_ogmtext_mapper,
granulepos_to_granule_default,
granule_to_granulepos_default,
- is_keyframe_true,
+ is_granulepos_keyframe_true,
+ is_packet_keyframe_true,
is_header_ogm,
packet_duration_ogm,
NULL,