From: <mn...@ke...> - 2009-02-27 14:00:20
|
Module: gst-plugins-ugly Branch: master Commit: d950699d2eb3efac7ac33eb81214f2cb723e1235 URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-ugly/commit/?id=d950699d2eb3efac7ac33eb81214f2cb723e1235 Author: Mark Nauwelaerts <mar...@co...> Date: Fri Feb 27 13:41:58 2009 +0100 mpegaudioparse: Provide SEEKING query handling. Since SEEK event handling might perform some conversion from TIME to BYTES, do not let upstream fool application into (TIME) seeking not being possible. --- gst/mpegaudioparse/gstmpegaudioparse.c | 40 ++++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-) diff --git a/gst/mpegaudioparse/gstmpegaudioparse.c b/gst/mpegaudioparse/gstmpegaudioparse.c index 4f0a38f..dfd4e60 100644 --- a/gst/mpegaudioparse/gstmpegaudioparse.c +++ b/gst/mpegaudioparse/gstmpegaudioparse.c @@ -1914,6 +1914,8 @@ mp3parse_src_query (GstPad * pad, GstQuery * query) g_return_val_if_fail (mp3parse != NULL, FALSE); + GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query)); + switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: gst_query_parse_position (query, &format, NULL); @@ -1959,6 +1961,44 @@ mp3parse_src_query (GstPad * pad, GstQuery * query) res = TRUE; } break; + case GST_QUERY_SEEKING: + gst_query_parse_seeking (query, &format, NULL, NULL, NULL); + + /* does upstream handle ? */ + if ((peer = gst_pad_get_peer (mp3parse->sinkpad)) != NULL) { + res = gst_pad_query (peer, query); + gst_object_unref (peer); + } + /* we may be able to help if in TIME */ + if (format == GST_FORMAT_TIME) { + gboolean seekable; + + gst_query_parse_seeking (query, &format, &seekable, NULL, NULL); + /* already OK if upstream takes care */ + if (res && !seekable) { + gint64 pos; + + seekable = TRUE; + if (!mp3parse_total_time (mp3parse, &total) || total == -1) { + seekable = FALSE; + } else if (!mp3parse_time_to_bytepos (mp3parse, 0, &pos)) { + seekable = FALSE; + } else { + GstQuery *q; + + q = gst_query_new_seeking (GST_FORMAT_BYTES); + if (!gst_pad_peer_query (mp3parse->sinkpad, q)) { + seekable = FALSE; + } else { + gst_query_parse_seeking (q, &format, &seekable, NULL, NULL); + } + gst_query_unref (q); + } + gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, total); + res = TRUE; + } + } + break; default: res = gst_pad_query_default (pad, query); break; |