mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
playsink: Add text-offset property
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
This commit is contained in:
parent
3cd38be94b
commit
ea3b074ead
2 changed files with 67 additions and 0 deletions
|
@ -255,6 +255,7 @@ struct _GstPlaySink
|
||||||
gboolean volume_changed; /* volume/mute changed while no audiochain */
|
gboolean volume_changed; /* volume/mute changed while no audiochain */
|
||||||
gboolean mute_changed; /* ... has been created yet */
|
gboolean mute_changed; /* ... has been created yet */
|
||||||
gint64 av_offset;
|
gint64 av_offset;
|
||||||
|
gint64 text_offset;
|
||||||
GstPlaySinkSendEventMode send_event_mode;
|
GstPlaySinkSendEventMode send_event_mode;
|
||||||
gboolean force_aspect_ratio;
|
gboolean force_aspect_ratio;
|
||||||
|
|
||||||
|
@ -340,6 +341,7 @@ enum
|
||||||
PROP_VIS_PLUGIN,
|
PROP_VIS_PLUGIN,
|
||||||
PROP_SAMPLE,
|
PROP_SAMPLE,
|
||||||
PROP_AV_OFFSET,
|
PROP_AV_OFFSET,
|
||||||
|
PROP_TEXT_OFFSET,
|
||||||
PROP_VIDEO_SINK,
|
PROP_VIDEO_SINK,
|
||||||
PROP_AUDIO_SINK,
|
PROP_AUDIO_SINK,
|
||||||
PROP_TEXT_SINK,
|
PROP_TEXT_SINK,
|
||||||
|
@ -394,6 +396,7 @@ static void notify_mute_cb (GObject * object, GParamSpec * pspec,
|
||||||
GstPlaySink * playsink);
|
GstPlaySink * playsink);
|
||||||
|
|
||||||
static void update_av_offset (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);
|
static gboolean gst_play_sink_do_reconfigure (GstPlaySink * playsink);
|
||||||
|
|
||||||
|
@ -518,6 +521,19 @@ gst_play_sink_class_init (GstPlaySinkClass * klass)
|
||||||
G_MININT64, G_MAXINT64, 0,
|
G_MININT64, G_MAXINT64, 0,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
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:
|
* GstPlaySink:video-filter:
|
||||||
*
|
*
|
||||||
|
@ -3865,6 +3881,7 @@ gst_play_sink_do_reconfigure (GstPlaySink * playsink)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
update_av_offset (playsink);
|
update_av_offset (playsink);
|
||||||
|
update_text_offset (playsink);
|
||||||
do_async_done (playsink);
|
do_async_done (playsink);
|
||||||
GST_PLAY_SINK_UNLOCK (playsink);
|
GST_PLAY_SINK_UNLOCK (playsink);
|
||||||
|
|
||||||
|
@ -4036,6 +4053,47 @@ gst_play_sink_get_av_offset (GstPlaySink * playsink)
|
||||||
return result;
|
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:
|
* gst_play_sink_get_last_sample:
|
||||||
* @playsink: a #GstPlaySink
|
* @playsink: a #GstPlaySink
|
||||||
|
@ -5089,6 +5147,9 @@ gst_play_sink_set_property (GObject * object, guint prop_id,
|
||||||
case PROP_AV_OFFSET:
|
case PROP_AV_OFFSET:
|
||||||
gst_play_sink_set_av_offset (playsink, g_value_get_int64 (value));
|
gst_play_sink_set_av_offset (playsink, g_value_get_int64 (value));
|
||||||
break;
|
break;
|
||||||
|
case PROP_TEXT_OFFSET:
|
||||||
|
gst_play_sink_set_text_offset (playsink, g_value_get_int64 (value));
|
||||||
|
break;
|
||||||
case PROP_VIDEO_FILTER:
|
case PROP_VIDEO_FILTER:
|
||||||
gst_play_sink_set_filter (playsink, GST_PLAY_SINK_TYPE_VIDEO,
|
gst_play_sink_set_filter (playsink, GST_PLAY_SINK_TYPE_VIDEO,
|
||||||
g_value_get_object (value));
|
g_value_get_object (value));
|
||||||
|
@ -5172,6 +5233,9 @@ gst_play_sink_get_property (GObject * object, guint prop_id,
|
||||||
case PROP_AV_OFFSET:
|
case PROP_AV_OFFSET:
|
||||||
g_value_set_int64 (value, gst_play_sink_get_av_offset (playsink));
|
g_value_set_int64 (value, gst_play_sink_get_av_offset (playsink));
|
||||||
break;
|
break;
|
||||||
|
case PROP_TEXT_OFFSET:
|
||||||
|
g_value_set_int64 (value, gst_play_sink_get_text_offset (playsink));
|
||||||
|
break;
|
||||||
case PROP_VIDEO_FILTER:
|
case PROP_VIDEO_FILTER:
|
||||||
g_value_take_object (value, gst_play_sink_get_filter (playsink,
|
g_value_take_object (value, gst_play_sink_get_filter (playsink,
|
||||||
GST_PLAY_SINK_TYPE_VIDEO));
|
GST_PLAY_SINK_TYPE_VIDEO));
|
||||||
|
|
|
@ -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);
|
void gst_play_sink_set_av_offset (GstPlaySink *playsink, gint64 av_offset);
|
||||||
gint64 gst_play_sink_get_av_offset (GstPlaySink *playsink);
|
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_get_last_sample (GstPlaySink * playsink);
|
||||||
GstSample * gst_play_sink_convert_sample (GstPlaySink * playsink, GstCaps * caps);
|
GstSample * gst_play_sink_convert_sample (GstPlaySink * playsink, GstCaps * caps);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue