mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-04 05:22:30 +00:00
oggdemux: Add support for mapping specific granulepos to key granule mapping
This commit is contained in:
parent
5fc1309703
commit
d6b6d0cdad
1 changed files with 51 additions and 11 deletions
|
@ -56,6 +56,9 @@ typedef gboolean (*GstOggMapIsHeaderPacketFunc) (GstOggStream * pad,
|
||||||
typedef gint64 (*GstOggMapPacketDurationFunc) (GstOggStream * pad,
|
typedef gint64 (*GstOggMapPacketDurationFunc) (GstOggStream * pad,
|
||||||
ogg_packet * packet);
|
ogg_packet * packet);
|
||||||
|
|
||||||
|
typedef gint64 (*GstOggMapGranuleposToKeyGranuleFunc) (GstOggStream * pad,
|
||||||
|
gint64 granulepos);
|
||||||
|
|
||||||
#define SKELETON_FISBONE_MIN_SIZE 52
|
#define SKELETON_FISBONE_MIN_SIZE 52
|
||||||
#define SKELETON_FISHEAD_3_3_MIN_SIZE 112
|
#define SKELETON_FISHEAD_3_3_MIN_SIZE 112
|
||||||
|
|
||||||
|
@ -71,6 +74,7 @@ struct _GstOggMap
|
||||||
GstOggMapIsKeyFrameFunc is_key_frame_func;
|
GstOggMapIsKeyFrameFunc is_key_frame_func;
|
||||||
GstOggMapIsHeaderPacketFunc is_header_func;
|
GstOggMapIsHeaderPacketFunc is_header_func;
|
||||||
GstOggMapPacketDurationFunc packet_duration_func;
|
GstOggMapPacketDurationFunc packet_duration_func;
|
||||||
|
GstOggMapGranuleposToKeyGranuleFunc granulepos_to_key_granule_func;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const GstOggMap mappers[];
|
static const GstOggMap mappers[];
|
||||||
|
@ -141,6 +145,9 @@ gst_ogg_stream_granulepos_to_granule (GstOggStream * pad, gint64 granulepos)
|
||||||
gint64
|
gint64
|
||||||
gst_ogg_stream_granulepos_to_key_granule (GstOggStream * pad, gint64 granulepos)
|
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) {
|
if (granulepos == -1 || granulepos == 0) {
|
||||||
return granulepos;
|
return granulepos;
|
||||||
}
|
}
|
||||||
|
@ -546,6 +553,22 @@ packet_duration_vp8 (GstOggStream * pad, ogg_packet * packet)
|
||||||
return (((hdr >> 4) & 1) != 0) ? 1 : 0;
|
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 */
|
/* vorbis */
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -1445,7 +1468,8 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_default,
|
granule_to_granulepos_default,
|
||||||
is_keyframe_theora,
|
is_keyframe_theora,
|
||||||
is_header_theora,
|
is_header_theora,
|
||||||
packet_duration_constant
|
packet_duration_constant,
|
||||||
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"\001vorbis", 7, 22,
|
"\001vorbis", 7, 22,
|
||||||
|
@ -1455,7 +1479,8 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_default,
|
granule_to_granulepos_default,
|
||||||
is_keyframe_true,
|
is_keyframe_true,
|
||||||
is_header_vorbis,
|
is_header_vorbis,
|
||||||
packet_duration_vorbis
|
packet_duration_vorbis,
|
||||||
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Speex", 5, 80,
|
"Speex", 5, 80,
|
||||||
|
@ -1465,7 +1490,8 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_default,
|
granule_to_granulepos_default,
|
||||||
is_keyframe_true,
|
is_keyframe_true,
|
||||||
is_header_count,
|
is_header_count,
|
||||||
packet_duration_constant
|
packet_duration_constant,
|
||||||
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"PCM ", 8, 0,
|
"PCM ", 8, 0,
|
||||||
|
@ -1475,6 +1501,7 @@ static const GstOggMap mappers[] = {
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
is_header_count,
|
is_header_count,
|
||||||
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -1485,6 +1512,7 @@ static const GstOggMap mappers[] = {
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
is_header_count,
|
is_header_count,
|
||||||
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -1495,6 +1523,7 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_default,
|
granule_to_granulepos_default,
|
||||||
NULL,
|
NULL,
|
||||||
is_header_count,
|
is_header_count,
|
||||||
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -1505,6 +1534,7 @@ static const GstOggMap mappers[] = {
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
is_header_true,
|
is_header_true,
|
||||||
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -1515,7 +1545,8 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_default,
|
granule_to_granulepos_default,
|
||||||
is_keyframe_true,
|
is_keyframe_true,
|
||||||
is_header_fLaC,
|
is_header_fLaC,
|
||||||
packet_duration_flac
|
packet_duration_flac,
|
||||||
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"\177FLAC", 5, 36,
|
"\177FLAC", 5, 36,
|
||||||
|
@ -1525,7 +1556,8 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_default,
|
granule_to_granulepos_default,
|
||||||
is_keyframe_true,
|
is_keyframe_true,
|
||||||
is_header_flac,
|
is_header_flac,
|
||||||
packet_duration_flac
|
packet_duration_flac,
|
||||||
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"AnxData", 7, 0,
|
"AnxData", 7, 0,
|
||||||
|
@ -1534,6 +1566,7 @@ static const GstOggMap mappers[] = {
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -1544,7 +1577,8 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_default,
|
granule_to_granulepos_default,
|
||||||
NULL,
|
NULL,
|
||||||
is_header_count,
|
is_header_count,
|
||||||
packet_duration_constant
|
packet_duration_constant,
|
||||||
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"\200kate\0\0\0", 8, 0,
|
"\200kate\0\0\0", 8, 0,
|
||||||
|
@ -1554,6 +1588,7 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_default,
|
granule_to_granulepos_default,
|
||||||
NULL,
|
NULL,
|
||||||
is_header_count,
|
is_header_count,
|
||||||
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -1564,7 +1599,8 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_dirac,
|
granule_to_granulepos_dirac,
|
||||||
is_keyframe_dirac,
|
is_keyframe_dirac,
|
||||||
is_header_count,
|
is_header_count,
|
||||||
packet_duration_constant
|
packet_duration_constant,
|
||||||
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"VP80\1", 5, 4,
|
"VP80\1", 5, 4,
|
||||||
|
@ -1574,7 +1610,8 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_vp8,
|
granule_to_granulepos_vp8,
|
||||||
is_keyframe_vp8,
|
is_keyframe_vp8,
|
||||||
is_header_count,
|
is_header_count,
|
||||||
packet_duration_vp8
|
packet_duration_vp8,
|
||||||
|
granulepos_to_key_granule_vp8
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"\001audio\0\0\0", 9, 53,
|
"\001audio\0\0\0", 9, 53,
|
||||||
|
@ -1584,7 +1621,8 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_default,
|
granule_to_granulepos_default,
|
||||||
is_keyframe_true,
|
is_keyframe_true,
|
||||||
is_header_ogm,
|
is_header_ogm,
|
||||||
packet_duration_ogm
|
packet_duration_ogm,
|
||||||
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"\001video\0\0\0", 9, 53,
|
"\001video\0\0\0", 9, 53,
|
||||||
|
@ -1594,7 +1632,8 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_default,
|
granule_to_granulepos_default,
|
||||||
NULL,
|
NULL,
|
||||||
is_header_ogm,
|
is_header_ogm,
|
||||||
packet_duration_constant
|
packet_duration_constant,
|
||||||
|
NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"\001text\0\0\0", 9, 9,
|
"\001text\0\0\0", 9, 9,
|
||||||
|
@ -1604,7 +1643,8 @@ static const GstOggMap mappers[] = {
|
||||||
granule_to_granulepos_default,
|
granule_to_granulepos_default,
|
||||||
is_keyframe_true,
|
is_keyframe_true,
|
||||||
is_header_ogm,
|
is_header_ogm,
|
||||||
packet_duration_ogm
|
packet_duration_ogm,
|
||||||
|
NULL
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
|
|
Loading…
Reference in a new issue