mirror of
https://github.com/Rafostar/clapper.git
synced 2025-08-30 16:02:00 +02:00
157 lines
5.4 KiB
Diff
157 lines
5.4 KiB
Diff
From 35fcd972398c8efaf7ff389ab7b98f0428b02394 Mon Sep 17 00:00:00 2001
|
|
From: Rafostar <rafostar.github@gmail.com>
|
|
Date: Thu, 5 Nov 2020 15:34:45 +0100
|
|
Subject: [PATCH] player: add seek_fast config option
|
|
|
|
Add a `seek_fast` player config option as an alternative to currently available normal and accurate options.
|
|
|
|
The new `seek_fast` option restores playback from next keyframe from requested seek position and takes precedence over `seek_accurate` when both options are enabled.
|
|
Depending on how keyframes are distributed in the video, this can be even over 20x faster than standard seeking on some files (at the expense of being more inaccurate).
|
|
---
|
|
gst-libs/gst/player/gstplayer.c | 67 ++++++++++++++++++++++++++++-----
|
|
gst-libs/gst/player/gstplayer.h | 6 +++
|
|
2 files changed, 63 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/gst-libs/gst/player/gstplayer.c b/gst-libs/gst/player/gstplayer.c
|
|
index 45705c671..cfa9db11e 100644
|
|
--- a/gst-libs/gst/player/gstplayer.c
|
|
+++ b/gst-libs/gst/player/gstplayer.c
|
|
@@ -88,6 +88,7 @@ typedef enum
|
|
CONFIG_QUARK_USER_AGENT = 0,
|
|
CONFIG_QUARK_POSITION_INTERVAL_UPDATE,
|
|
CONFIG_QUARK_ACCURATE_SEEK,
|
|
+ CONFIG_QUARK_FAST_SEEK,
|
|
|
|
CONFIG_QUARK_MAX
|
|
} ConfigQuarkId;
|
|
@@ -96,6 +97,7 @@ static const gchar *_config_quark_strings[] = {
|
|
"user-agent",
|
|
"position-interval-update",
|
|
"accurate-seek",
|
|
+ "fast-seek",
|
|
};
|
|
|
|
GQuark _config_quark_table[CONFIG_QUARK_MAX];
|
|
@@ -295,6 +297,7 @@ gst_player_init (GstPlayer * self)
|
|
self->config = gst_structure_new_id (QUARK_CONFIG,
|
|
CONFIG_QUARK (POSITION_INTERVAL_UPDATE), G_TYPE_UINT, DEFAULT_POSITION_UPDATE_INTERVAL_MS,
|
|
CONFIG_QUARK (ACCURATE_SEEK), G_TYPE_BOOLEAN, FALSE,
|
|
+ CONFIG_QUARK (FAST_SEEK), G_TYPE_BOOLEAN, FALSE,
|
|
NULL);
|
|
/* *INDENT-ON* */
|
|
|
|
@@ -3317,7 +3320,6 @@ gst_player_seek_internal_locked (GstPlayer * self)
|
|
GstStateChangeReturn state_ret;
|
|
GstEvent *s_event;
|
|
GstSeekFlags flags = 0;
|
|
- gboolean accurate = FALSE;
|
|
|
|
remove_seek_source (self);
|
|
|
|
@@ -3349,12 +3351,10 @@ gst_player_seek_internal_locked (GstPlayer * self)
|
|
|
|
flags |= GST_SEEK_FLAG_FLUSH;
|
|
|
|
- accurate = gst_player_config_get_seek_accurate (self->config);
|
|
-
|
|
- if (accurate) {
|
|
+ if (gst_player_config_get_seek_fast (self->config)) {
|
|
+ flags |= GST_SEEK_FLAG_KEY_UNIT | GST_SEEK_FLAG_SNAP_AFTER;
|
|
+ } else if (gst_player_config_get_seek_accurate (self->config)) {
|
|
flags |= GST_SEEK_FLAG_ACCURATE;
|
|
- } else {
|
|
- flags &= ~GST_SEEK_FLAG_ACCURATE;
|
|
}
|
|
|
|
if (rate != 1.0) {
|
|
@@ -4692,6 +4692,53 @@ gst_player_config_get_position_update_interval (const GstStructure * config)
|
|
return interval;
|
|
}
|
|
|
|
+/**
|
|
+ * gst_player_config_set_seek_fast:
|
|
+ * @config: a #GstPlayer configuration
|
|
+ * @fast: fast seek or not
|
|
+ *
|
|
+ * Enable or disable fast seeking. When enabled, player will resume playback from
|
|
+ * next keyframe from requested seek position. Generally it will be much faster
|
|
+ * than default seeking behaviour, but the outcome position might differ greatly
|
|
+ * depending on how keyframes are distributed in video (usually up to few seconds).
|
|
+ *
|
|
+ * If fast and accurate seeking options are disabled, elements will seek as
|
|
+ * close as the request position without slowing down seeking too much.
|
|
+ *
|
|
+ * Fast seeking is disabled by default. This option takes precedence
|
|
+ * over accurate seeking option.
|
|
+ * Since: 1.20
|
|
+ */
|
|
+void
|
|
+gst_player_config_set_seek_fast (GstStructure * config, gboolean fast)
|
|
+{
|
|
+ g_return_if_fail (config != NULL);
|
|
+
|
|
+ gst_structure_id_set (config,
|
|
+ CONFIG_QUARK (FAST_SEEK), G_TYPE_BOOLEAN, fast, NULL);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * gst_player_config_get_seek_fast:
|
|
+ * @config: a #GstPlayer configuration
|
|
+ *
|
|
+ * Returns: %TRUE if fast seeking is enabled
|
|
+ *
|
|
+ * Since: 1.20
|
|
+ */
|
|
+gboolean
|
|
+gst_player_config_get_seek_fast (const GstStructure * config)
|
|
+{
|
|
+ gboolean fast = FALSE;
|
|
+
|
|
+ g_return_val_if_fail (config != NULL, FALSE);
|
|
+
|
|
+ gst_structure_id_get (config,
|
|
+ CONFIG_QUARK (FAST_SEEK), G_TYPE_BOOLEAN, &fast, NULL);
|
|
+
|
|
+ return fast;
|
|
+}
|
|
+
|
|
/**
|
|
* gst_player_config_set_seek_accurate:
|
|
* @config: a #GstPlayer configuration
|
|
@@ -4702,11 +4749,11 @@ gst_player_config_get_position_update_interval (const GstStructure * config)
|
|
* it will be slower especially for formats that don't have any indexes or
|
|
* timestamp markers in the stream.
|
|
*
|
|
- * If accurate seeking is disabled, elements will seek as close as the request
|
|
- * position without slowing down seeking too much.
|
|
- *
|
|
- * Accurate seeking is disabled by default.
|
|
+ * If accurate and fast seeking options are disabled, elements will seek as
|
|
+ * close as the request position without slowing down seeking too much.
|
|
*
|
|
+ * Accurate seeking is disabled by default. This option is ignored when
|
|
+ * fast seeking is enabled.
|
|
* Since: 1.12
|
|
*/
|
|
void
|
|
diff --git a/gst-libs/gst/player/gstplayer.h b/gst-libs/gst/player/gstplayer.h
|
|
index e853ed875..4984126ac 100644
|
|
--- a/gst-libs/gst/player/gstplayer.h
|
|
+++ b/gst-libs/gst/player/gstplayer.h
|
|
@@ -282,6 +282,12 @@ void gst_player_config_set_position_update_interval (GstStructure * c
|
|
GST_PLAYER_API
|
|
guint gst_player_config_get_position_update_interval (const GstStructure * config);
|
|
|
|
+GST_PLAYER_API
|
|
+void gst_player_config_set_seek_fast (GstStructure * config, gboolean fast);
|
|
+
|
|
+GST_PLAYER_API
|
|
+gboolean gst_player_config_get_seek_fast (const GstStructure * config);
|
|
+
|
|
GST_PLAYER_API
|
|
void gst_player_config_set_seek_accurate (GstStructure * config, gboolean accurate);
|
|
|
|
--
|
|
2.26.2
|
|
|