diff options
Diffstat (limited to 'src/media-engines/gstreamer/rygel-gst-data-source.vala')
-rw-r--r-- | src/media-engines/gstreamer/rygel-gst-data-source.vala | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/src/media-engines/gstreamer/rygel-gst-data-source.vala b/src/media-engines/gstreamer/rygel-gst-data-source.vala index 198ada54..5d58a486 100644 --- a/src/media-engines/gstreamer/rygel-gst-data-source.vala +++ b/src/media-engines/gstreamer/rygel-gst-data-source.vala @@ -208,10 +208,6 @@ internal class Rygel.GstDataSource : Rygel.DataSource, GLib.Object { if (message.type == MessageType.EOS) { ret = false; } else if (message.type == MessageType.STATE_CHANGED) { - if (message.src != this.pipeline) { - return true; - } - State old_state; State new_state; @@ -219,6 +215,29 @@ internal class Rygel.GstDataSource : Rygel.DataSource, GLib.Object { out new_state, null); + var encodebin = this.pipeline.get_by_name (GstTranscoder.DECODE_BIN_NAME); + if (message.src == encodebin && old_state == State.READY && new_state == State.PAUSED) { + if (this.seek is HTTPTimeSeekRequest) { + debug ("Trying to seek encodebin directly..."); + var time_seek = (HTTPTimeSeekRequest) this.seek; + debug ("%lld %lld", time_seek.start_time * Gst.USECOND, time_seek.end_time * Gst.USECOND); + if (!encodebin.seek (1.0, + Format.TIME, + SeekFlags.ACCURATE| SeekFlags.FLUSH, + Gst.SeekType.SET, + time_seek.start_time * Gst.USECOND, + time_seek.end_time == 0 ? + Gst.SeekType.NONE : Gst.SeekType.SET, + time_seek.end_time * Gst.USECOND + 1)) { + critical ("Failed to seek..."); + } + } + } + if (message.src != this.pipeline) { + return true; + } + + if (old_state == State.NULL && new_state == State.READY) { dynamic Element element = this.pipeline.get_by_name ("muxer"); if (element != null) { @@ -239,7 +258,7 @@ internal class Rygel.GstDataSource : Rygel.DataSource, GLib.Object { if (this.seek != null) { if (old_state == State.READY && new_state == State.PAUSED) { - if (this.perform_seek ()) { + if ((encodebin != null && this.seek is HTTPTimeSeekRequest) || this.perform_seek ()) { this.pipeline.set_state (State.PLAYING); } } |