playsink: Add text-offset property
authorPhilippe Normand <philn@igalia.com>
Sun, 28 Oct 2018 14:42:31 +0000 (14:42 +0000)
committerPhilippe Normand <philn@igalia.com>
Thu, 1 Nov 2018 09:52:34 +0000 (09:52 +0000)
When the playsink contains a text chain this property controls the
synchronisation of the subtitles and video by controlling the underlying
subtitleoverlay::subtitle-ts-offset property.

https://bugzilla.gnome.org/show_bug.cgi?id=797134

gst/playback/gstplaysink.c
gst/playback/gstplaysink.h

index 3caf05c..d7a13d0 100644 (file)
@@ -255,6 +255,7 @@ struct _GstPlaySink
   gboolean volume_changed;      /* volume/mute changed while no audiochain */
   gboolean mute_changed;        /* ... has been created yet */
   gint64 av_offset;
+  gint64 text_offset;
   GstPlaySinkSendEventMode send_event_mode;
   gboolean force_aspect_ratio;
 
@@ -340,6 +341,7 @@ enum
   PROP_VIS_PLUGIN,
   PROP_SAMPLE,
   PROP_AV_OFFSET,
+  PROP_TEXT_OFFSET,
   PROP_VIDEO_SINK,
   PROP_AUDIO_SINK,
   PROP_TEXT_SINK,
@@ -394,6 +396,7 @@ static void notify_mute_cb (GObject * object, GParamSpec * pspec,
     GstPlaySink * playsink);
 
 static void update_av_offset (GstPlaySink * playsink);
+static void update_text_offset (GstPlaySink * playsink);
 
 static gboolean gst_play_sink_do_reconfigure (GstPlaySink * playsink);
 
@@ -519,6 +522,19 @@ gst_play_sink_class_init (GstPlaySinkClass * klass)
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   /**
+   * GstPlaySink:text-offset:
+   *
+   * Control the synchronisation offset between the text and video streams.
+   * Positive values make the text ahead of the video and negative values make
+   * the text go behind the video.
+   */
+  g_object_class_install_property (gobject_klass, PROP_TEXT_OFFSET,
+      g_param_spec_int64 ("text-offset", "Text Offset",
+          "The synchronisation offset between text and video in nanoseconds",
+          G_MININT64, G_MAXINT64, 0,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  /**
    * GstPlaySink:video-filter:
    *
    * Set the video filter element/bin to use. Will apply on a best-effort basis
@@ -3865,6 +3881,7 @@ gst_play_sink_do_reconfigure (GstPlaySink * playsink)
     }
   }
   update_av_offset (playsink);
+  update_text_offset (playsink);
   do_async_done (playsink);
   GST_PLAY_SINK_UNLOCK (playsink);
 
@@ -4036,6 +4053,47 @@ gst_play_sink_get_av_offset (GstPlaySink * playsink)
   return result;
 }
 
+static void
+update_text_offset (GstPlaySink * playsink)
+{
+  gint64 text_offset;
+  GstPlayTextChain *tchain;
+
+  text_offset = playsink->text_offset;
+  tchain = (GstPlayTextChain *) playsink->textchain;
+
+  if (tchain) {
+    if (tchain->sink) {
+      g_object_set (tchain->sink, "ts-offset", text_offset, NULL);
+    } else if (tchain->overlay) {
+      g_object_set (tchain->overlay, "subtitle-ts-offset", text_offset, NULL);
+    }
+  } else {
+    GST_LOG_OBJECT (playsink, "no text chain");
+  }
+}
+
+void
+gst_play_sink_set_text_offset (GstPlaySink * playsink, gint64 text_offset)
+{
+  GST_PLAY_SINK_LOCK (playsink);
+  playsink->text_offset = text_offset;
+  update_text_offset (playsink);
+  GST_PLAY_SINK_UNLOCK (playsink);
+}
+
+gint64
+gst_play_sink_get_text_offset (GstPlaySink * playsink)
+{
+  gint64 result;
+
+  GST_PLAY_SINK_LOCK (playsink);
+  result = playsink->text_offset;
+  GST_PLAY_SINK_UNLOCK (playsink);
+
+  return result;
+}
+
 /**
  * gst_play_sink_get_last_sample:
  * @playsink: a #GstPlaySink
@@ -5089,6 +5147,9 @@ gst_play_sink_set_property (GObject * object, guint prop_id,
     case PROP_AV_OFFSET:
       gst_play_sink_set_av_offset (playsink, g_value_get_int64 (value));
       break;
+    case PROP_TEXT_OFFSET:
+      gst_play_sink_set_text_offset (playsink, g_value_get_int64 (value));
+      break;
     case PROP_VIDEO_FILTER:
       gst_play_sink_set_filter (playsink, GST_PLAY_SINK_TYPE_VIDEO,
           g_value_get_object (value));
@@ -5172,6 +5233,9 @@ gst_play_sink_get_property (GObject * object, guint prop_id,
     case PROP_AV_OFFSET:
       g_value_set_int64 (value, gst_play_sink_get_av_offset (playsink));
       break;
+    case PROP_TEXT_OFFSET:
+      g_value_set_int64 (value, gst_play_sink_get_text_offset (playsink));
+      break;
     case PROP_VIDEO_FILTER:
       g_value_take_object (value, gst_play_sink_get_filter (playsink,
               GST_PLAY_SINK_TYPE_VIDEO));
index f102583..8db4565 100644 (file)
@@ -98,6 +98,9 @@ gchar *          gst_play_sink_get_subtitle_encoding  (GstPlaySink *playsink);
 void             gst_play_sink_set_av_offset  (GstPlaySink *playsink, gint64 av_offset);
 gint64           gst_play_sink_get_av_offset  (GstPlaySink *playsink);
 
+void             gst_play_sink_set_text_offset  (GstPlaySink *playsink, gint64 text_offset);
+gint64           gst_play_sink_get_text_offset  (GstPlaySink *playsink);
+
 GstSample *      gst_play_sink_get_last_sample (GstPlaySink * playsink);
 GstSample *      gst_play_sink_convert_sample  (GstPlaySink * playsink, GstCaps * caps);