mpegtsdemux: Implement SEEKING query

Partially fixes bug #588944.
This commit is contained in:
Sebastian Dröge 2009-07-21 13:33:58 +02:00
parent e3f08983aa
commit 1f88ceeba8

View file

@ -2778,9 +2778,54 @@ gst_mpegts_demux_src_pad_query (GstPad * pad, GstQuery * query)
} }
break; break;
} }
case GST_QUERY_SEEKING:{
GstFormat fmt;
gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL);
if (fmt == GST_FORMAT_BYTES) {
/* Seeking in BYTES format not supported at all */
gst_query_set_seeking (query, fmt, FALSE, -1, -1);
} else {
GstQuery *peerquery;
gboolean seekable;
/* Then ask upstream */
res = gst_pad_peer_query (demux->sinkpad, query);
if (res) {
/* If upstream can handle seeks we're done, if it
* can't we still have our TIME->BYTES conversion seek
*/
gst_query_parse_seeking (query, NULL, &seekable, NULL, NULL);
if (seekable || fmt != GST_FORMAT_TIME)
goto beach;
}
/* We can seek if upstream supports BYTES seeks and we
* have a bitrate
*/
peerquery = gst_query_new_seeking (GST_FORMAT_BYTES);
res = gst_pad_peer_query (demux->sinkpad, query);
if (!res || demux->bitrate == -1) {
gst_query_set_seeking (query, fmt, FALSE, -1, -1);
} else {
gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL);
if (seekable)
gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, -1);
else
gst_query_set_seeking (query, fmt, FALSE, -1, -1);
}
gst_query_unref (peerquery);
res = TRUE;
}
break;
}
default: default:
res = gst_pad_query_default (pad, query); res = gst_pad_query_default (pad, query);
break;
} }
beach:
gst_object_unref (demux); gst_object_unref (demux);
return res; return res;