mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-10 03:19:40 +00:00
- Added seek on bytes
Original commit message from CVS: - Added seek on bytes - use index to lookup offsets
This commit is contained in:
parent
d9bf04bce7
commit
b9072f711a
1 changed files with 40 additions and 13 deletions
|
@ -351,7 +351,7 @@ gst_mpeg_parse_parse_packhead (GstMPEGParse *mpeg_parse, GstBuffer *buffer)
|
||||||
scr = scr_adj;
|
scr = scr_adj;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mpeg_parse->index) {
|
if (mpeg_parse->index && GST_INDEX_IS_WRITABLE (mpeg_parse->index)) {
|
||||||
/* update index if any */
|
/* update index if any */
|
||||||
gst_index_add_association (mpeg_parse->index, mpeg_parse->index_id,
|
gst_index_add_association (mpeg_parse->index, mpeg_parse->index_id,
|
||||||
GST_ACCOCIATION_FLAG_KEY_UNIT,
|
GST_ACCOCIATION_FLAG_KEY_UNIT,
|
||||||
|
@ -514,6 +514,7 @@ const GstFormat*
|
||||||
gst_mpeg_parse_get_src_formats (GstPad *pad)
|
gst_mpeg_parse_get_src_formats (GstPad *pad)
|
||||||
{
|
{
|
||||||
static const GstFormat formats[] = {
|
static const GstFormat formats[] = {
|
||||||
|
GST_FORMAT_BYTES,
|
||||||
GST_FORMAT_TIME,
|
GST_FORMAT_TIME,
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
@ -603,10 +604,28 @@ gst_mpeg_parse_get_src_event_masks (GstPad *pad)
|
||||||
return masks;
|
return masks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
seek_index (GstMPEGParse *parse, GstEvent *event, guint64 *offset)
|
||||||
|
{
|
||||||
|
GstIndexEntry *entry;
|
||||||
|
|
||||||
|
entry = gst_index_get_assoc_entry (parse->index, parse->index_id,
|
||||||
|
GST_INDEX_LOOKUP_BEFORE,
|
||||||
|
GST_EVENT_SEEK_FORMAT (event),
|
||||||
|
GST_EVENT_SEEK_OFFSET (event));
|
||||||
|
if (!entry)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, offset)) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
gst_mpeg_parse_handle_src_event (GstPad *pad, GstEvent *event)
|
gst_mpeg_parse_handle_src_event (GstPad *pad, GstEvent *event)
|
||||||
{
|
{
|
||||||
gboolean res = TRUE;
|
gboolean res = FALSE;
|
||||||
GstMPEGParse *mpeg_parse = GST_MPEG_PARSE (gst_pad_get_parent (pad));
|
GstMPEGParse *mpeg_parse = GST_MPEG_PARSE (gst_pad_get_parent (pad));
|
||||||
|
|
||||||
switch (GST_EVENT_TYPE (event)) {
|
switch (GST_EVENT_TYPE (event)) {
|
||||||
|
@ -614,28 +633,36 @@ gst_mpeg_parse_handle_src_event (GstPad *pad, GstEvent *event)
|
||||||
{
|
{
|
||||||
guint64 desired_offset;
|
guint64 desired_offset;
|
||||||
|
|
||||||
if (GST_EVENT_SEEK_FORMAT (event) != GST_FORMAT_TIME) {
|
switch (GST_EVENT_SEEK_FORMAT (event)) {
|
||||||
gst_event_unref (event);
|
case GST_FORMAT_BYTES:
|
||||||
return FALSE;
|
if (mpeg_parse->index) {
|
||||||
|
if (!seek_index (mpeg_parse, event, &desired_offset)) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
desired_offset = GST_EVENT_SEEK_OFFSET (event);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GST_FORMAT_TIME:
|
||||||
|
desired_offset = mpeg_parse->mux_rate * 50 * GST_EVENT_SEEK_OFFSET (event) / (GST_SECOND);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_FLUSH) {
|
|
||||||
}
|
|
||||||
desired_offset = mpeg_parse->mux_rate * 50 * GST_EVENT_SEEK_OFFSET (event) / (GST_SECOND);
|
|
||||||
|
|
||||||
if (!gst_bytestream_seek (mpeg_parse->packetize->bs, desired_offset, GST_SEEK_METHOD_SET)) {
|
if (!gst_bytestream_seek (mpeg_parse->packetize->bs, desired_offset, GST_SEEK_METHOD_SET)) {
|
||||||
gst_event_unref (event);
|
goto done;
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
mpeg_parse->discont_pending = TRUE;
|
mpeg_parse->discont_pending = TRUE;
|
||||||
mpeg_parse->scr_pending = TRUE;
|
mpeg_parse->scr_pending = TRUE;
|
||||||
|
res = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
res = FALSE;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
done:
|
||||||
gst_event_unref (event);
|
gst_event_unref (event);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue