diff options
author | Jens Georg <mail@jensge.org> | 2020-05-04 21:23:10 +0200 |
---|---|---|
committer | Jens Georg <mail@jensge.org> | 2020-05-04 21:23:19 +0200 |
commit | 5bd59cbfad9bc896950453c38f4d12fa7f720992 (patch) | |
tree | d8e9b85d5809aa92071bb4263d39715a2c14f3dc | |
parent | 21e6c7bd7d4dac1150f12966f0dd90e9475f0518 (diff) | |
download | rygel-5bd59cbfad9bc896950453c38f4d12fa7f720992.tar.gz |
engine-gst: Do not seek on the encodebin
Hackish fix for #157
-rw-r--r-- | src/media-engines/gstreamer/rygel-gst-data-source.vala | 29 | ||||
-rw-r--r-- | src/media-engines/gstreamer/rygel-gst-transcoder.vala | 3 |
2 files changed, 26 insertions, 6 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); } } diff --git a/src/media-engines/gstreamer/rygel-gst-transcoder.vala b/src/media-engines/gstreamer/rygel-gst-transcoder.vala index 8920109a..45b133fb 100644 --- a/src/media-engines/gstreamer/rygel-gst-transcoder.vala +++ b/src/media-engines/gstreamer/rygel-gst-transcoder.vala @@ -39,6 +39,7 @@ public errordomain Rygel.GstTranscoderError { * implement get_resources_for_item and get_encoding_profile methods. */ internal abstract class Rygel.GstTranscoder : GLib.Object { + public const string DECODE_BIN_NAME = "RygelTranscoderDecodebin"; public string name { get; construct; } public string mime_type { get; construct; } public string dlna_profile { get; construct; } @@ -129,7 +130,7 @@ internal abstract class Rygel.GstTranscoder : GLib.Object { var orig_source = src as GstDataSource; this.decoder = GstUtils.create_element (DECODE_BIN, - DECODE_BIN); + DECODE_BIN_NAME); this.encoder = GstUtils.create_element (ENCODE_BIN, ENCODE_BIN); |