summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Georg <mail@jensge.org>2020-05-04 21:23:10 +0200
committerJens Georg <mail@jensge.org>2020-05-04 21:23:19 +0200
commit5bd59cbfad9bc896950453c38f4d12fa7f720992 (patch)
treed8e9b85d5809aa92071bb4263d39715a2c14f3dc
parent21e6c7bd7d4dac1150f12966f0dd90e9475f0518 (diff)
downloadrygel-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.vala29
-rw-r--r--src/media-engines/gstreamer/rygel-gst-transcoder.vala3
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);