mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-18 12:15:19 +00:00
timeoverlay: add support for reference timestamp time mode
+ update date-time mode to actually use the timestamp that was selected with the time-mode property Co-authored-by: Sebastian Dröge <sebastian@centricular.com> Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2252>
This commit is contained in:
parent
9d5179ad3f
commit
14b37268f6
3 changed files with 83 additions and 1 deletions
|
@ -8272,6 +8272,18 @@
|
||||||
"type": "gchararray",
|
"type": "gchararray",
|
||||||
"writable": true
|
"writable": true
|
||||||
},
|
},
|
||||||
|
"reference-timestamp-caps": {
|
||||||
|
"blurb": "Caps to use for the reference timestamp time mode",
|
||||||
|
"conditionally-available": false,
|
||||||
|
"construct": false,
|
||||||
|
"construct-only": false,
|
||||||
|
"controllable": false,
|
||||||
|
"default": "timestamp/x-ntp",
|
||||||
|
"mutable": "null",
|
||||||
|
"readable": true,
|
||||||
|
"type": "GstCaps",
|
||||||
|
"writable": true
|
||||||
|
},
|
||||||
"show-times-as-dates": {
|
"show-times-as-dates": {
|
||||||
"blurb": "Whether to display times, counted from datetime-epoch, as dates",
|
"blurb": "Whether to display times, counted from datetime-epoch, as dates",
|
||||||
"conditionally-available": false,
|
"conditionally-available": false,
|
||||||
|
@ -8929,6 +8941,11 @@
|
||||||
"desc": "elapsed-running-time",
|
"desc": "elapsed-running-time",
|
||||||
"name": "elapsed-running-time",
|
"name": "elapsed-running-time",
|
||||||
"value": "4"
|
"value": "4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "reference-timestamp",
|
||||||
|
"name": "reference-timestamp",
|
||||||
|
"value": "5"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,9 @@
|
||||||
#define DEFAULT_SHOW_TIMES_AS_DATES FALSE
|
#define DEFAULT_SHOW_TIMES_AS_DATES FALSE
|
||||||
#define DEFAULT_DATETIME_FORMAT "%F %T" /* YYYY-MM-DD hh:mm:ss */
|
#define DEFAULT_DATETIME_FORMAT "%F %T" /* YYYY-MM-DD hh:mm:ss */
|
||||||
|
|
||||||
|
static GstStaticCaps ntp_reference_timestamp_caps =
|
||||||
|
GST_STATIC_CAPS ("timestamp/x-ntp");
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
@ -64,6 +67,7 @@ enum
|
||||||
PROP_SHOW_TIMES_AS_DATES,
|
PROP_SHOW_TIMES_AS_DATES,
|
||||||
PROP_DATETIME_EPOCH,
|
PROP_DATETIME_EPOCH,
|
||||||
PROP_DATETIME_FORMAT,
|
PROP_DATETIME_FORMAT,
|
||||||
|
PROP_REFERENCE_TIMESTAMP_CAPS,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define gst_time_overlay_parent_class parent_class
|
#define gst_time_overlay_parent_class parent_class
|
||||||
|
@ -84,6 +88,14 @@ static void gst_time_overlay_get_property (GObject * object, guint prop_id,
|
||||||
* Since: 1.20
|
* Since: 1.20
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstTimeOverlayTimeLine::reference-timestamp:
|
||||||
|
*
|
||||||
|
* Use #GstReferenceTimestampMeta.
|
||||||
|
*
|
||||||
|
* Since: 1.22
|
||||||
|
*/
|
||||||
|
|
||||||
#define GST_TYPE_TIME_OVERLAY_TIME_LINE (gst_time_overlay_time_line_type())
|
#define GST_TYPE_TIME_OVERLAY_TIME_LINE (gst_time_overlay_time_line_type())
|
||||||
static GType
|
static GType
|
||||||
gst_time_overlay_time_line_type (void)
|
gst_time_overlay_time_line_type (void)
|
||||||
|
@ -96,6 +108,8 @@ gst_time_overlay_time_line_type (void)
|
||||||
{GST_TIME_OVERLAY_TIME_LINE_TIME_CODE, "time-code", "time-code"},
|
{GST_TIME_OVERLAY_TIME_LINE_TIME_CODE, "time-code", "time-code"},
|
||||||
{GST_TIME_OVERLAY_TIME_LINE_ELAPSED_RUNNING_TIME,
|
{GST_TIME_OVERLAY_TIME_LINE_ELAPSED_RUNNING_TIME,
|
||||||
"elapsed-running-time", "elapsed-running-time"},
|
"elapsed-running-time", "elapsed-running-time"},
|
||||||
|
{GST_TIME_OVERLAY_TIME_LINE_REFERENCE_TIMESTAMP,
|
||||||
|
"reference-timestamp", "reference-timestamp"},
|
||||||
{0, NULL, NULL},
|
{0, NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -169,6 +183,26 @@ gst_time_overlay_get_text (GstBaseTextOverlay * overlay,
|
||||||
self->first_running_time = ts;
|
self->first_running_time = ts;
|
||||||
ts -= self->first_running_time;
|
ts -= self->first_running_time;
|
||||||
break;
|
break;
|
||||||
|
case GST_TIME_OVERLAY_TIME_LINE_REFERENCE_TIMESTAMP:
|
||||||
|
{
|
||||||
|
GstReferenceTimestampMeta *meta;
|
||||||
|
|
||||||
|
if (self->reference_timestamp_caps) {
|
||||||
|
meta =
|
||||||
|
gst_buffer_get_reference_timestamp_meta (video_frame,
|
||||||
|
self->reference_timestamp_caps);
|
||||||
|
|
||||||
|
if (meta) {
|
||||||
|
ts = meta->timestamp;
|
||||||
|
} else {
|
||||||
|
ts = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ts = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
case GST_TIME_OVERLAY_TIME_LINE_BUFFER_TIME:
|
case GST_TIME_OVERLAY_TIME_LINE_BUFFER_TIME:
|
||||||
default:
|
default:
|
||||||
ts = ts_buffer;
|
ts = ts_buffer;
|
||||||
|
@ -180,8 +214,10 @@ gst_time_overlay_get_text (GstBaseTextOverlay * overlay,
|
||||||
|
|
||||||
datetime =
|
datetime =
|
||||||
g_date_time_add_seconds (self->datetime_epoch,
|
g_date_time_add_seconds (self->datetime_epoch,
|
||||||
(gdouble) GST_BUFFER_TIMESTAMP (video_frame) / GST_SECOND);
|
((gdouble) ts) / GST_SECOND);
|
||||||
|
|
||||||
time_str = g_date_time_format (datetime, self->datetime_format);
|
time_str = g_date_time_format (datetime, self->datetime_format);
|
||||||
|
|
||||||
g_date_time_unref (datetime);
|
g_date_time_unref (datetime);
|
||||||
} else {
|
} else {
|
||||||
time_str = gst_time_overlay_render_time (GST_TIME_OVERLAY (overlay), ts);
|
time_str = gst_time_overlay_render_time (GST_TIME_OVERLAY (overlay), ts);
|
||||||
|
@ -224,8 +260,10 @@ gst_time_overlay_finalize (GObject * gobject)
|
||||||
{
|
{
|
||||||
GstTimeOverlay *self = GST_TIME_OVERLAY (gobject);
|
GstTimeOverlay *self = GST_TIME_OVERLAY (gobject);
|
||||||
|
|
||||||
|
gst_clear_caps (&self->reference_timestamp_caps);
|
||||||
g_date_time_unref (self->datetime_epoch);
|
g_date_time_unref (self->datetime_epoch);
|
||||||
g_free (self->datetime_format);
|
g_free (self->datetime_format);
|
||||||
|
|
||||||
G_OBJECT_CLASS (parent_class)->finalize (gobject);
|
G_OBJECT_CLASS (parent_class)->finalize (gobject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -275,6 +313,20 @@ gst_time_overlay_class_init (GstTimeOverlayClass * klass)
|
||||||
DEFAULT_SHOW_TIMES_AS_DATES,
|
DEFAULT_SHOW_TIMES_AS_DATES,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* timeoverlay:reference-timestamp-caps
|
||||||
|
*
|
||||||
|
* Selects the caps to use for the reference timestamp meta in
|
||||||
|
* time-mode=reference-timestamp.
|
||||||
|
*
|
||||||
|
* Since: 1.22
|
||||||
|
*/
|
||||||
|
g_object_class_install_property (gobject_class, PROP_REFERENCE_TIMESTAMP_CAPS,
|
||||||
|
g_param_spec_boxed ("reference-timestamp-caps",
|
||||||
|
"Reference Timestamp Caps",
|
||||||
|
"Caps to use for the reference timestamp time mode",
|
||||||
|
GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
gst_type_mark_as_plugin_api (GST_TYPE_TIME_OVERLAY_TIME_LINE, 0);
|
gst_type_mark_as_plugin_api (GST_TYPE_TIME_OVERLAY_TIME_LINE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -313,6 +365,9 @@ gst_time_overlay_init (GstTimeOverlay * overlay)
|
||||||
overlay->datetime_epoch = g_date_time_new_utc (1900, 1, 1, 0, 0, 0);
|
overlay->datetime_epoch = g_date_time_new_utc (1900, 1, 1, 0, 0, 0);
|
||||||
overlay->datetime_format = g_strdup (DEFAULT_DATETIME_FORMAT);
|
overlay->datetime_format = g_strdup (DEFAULT_DATETIME_FORMAT);
|
||||||
|
|
||||||
|
overlay->reference_timestamp_caps =
|
||||||
|
gst_static_caps_get (&ntp_reference_timestamp_caps);
|
||||||
|
|
||||||
context = textoverlay->pango_context;
|
context = textoverlay->pango_context;
|
||||||
|
|
||||||
pango_context_set_language (context, pango_language_from_string ("en_US"));
|
pango_context_set_language (context, pango_language_from_string ("en_US"));
|
||||||
|
@ -354,6 +409,10 @@ gst_time_overlay_set_property (GObject * object, guint prop_id,
|
||||||
g_free (overlay->datetime_format);
|
g_free (overlay->datetime_format);
|
||||||
overlay->datetime_format = g_value_dup_string (value);
|
overlay->datetime_format = g_value_dup_string (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_REFERENCE_TIMESTAMP_CAPS:
|
||||||
|
gst_clear_caps (&overlay->reference_timestamp_caps);
|
||||||
|
overlay->reference_timestamp_caps = g_value_dup_boxed (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -379,6 +438,9 @@ gst_time_overlay_get_property (GObject * object, guint prop_id,
|
||||||
case PROP_DATETIME_FORMAT:
|
case PROP_DATETIME_FORMAT:
|
||||||
g_value_set_string (value, overlay->datetime_format);
|
g_value_set_string (value, overlay->datetime_format);
|
||||||
break;
|
break;
|
||||||
|
case PROP_REFERENCE_TIMESTAMP_CAPS:
|
||||||
|
g_value_set_boxed (value, overlay->reference_timestamp_caps);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -47,6 +47,7 @@ typedef enum {
|
||||||
GST_TIME_OVERLAY_TIME_LINE_RUNNING_TIME,
|
GST_TIME_OVERLAY_TIME_LINE_RUNNING_TIME,
|
||||||
GST_TIME_OVERLAY_TIME_LINE_TIME_CODE,
|
GST_TIME_OVERLAY_TIME_LINE_TIME_CODE,
|
||||||
GST_TIME_OVERLAY_TIME_LINE_ELAPSED_RUNNING_TIME,
|
GST_TIME_OVERLAY_TIME_LINE_ELAPSED_RUNNING_TIME,
|
||||||
|
GST_TIME_OVERLAY_TIME_LINE_REFERENCE_TIMESTAMP,
|
||||||
} GstTimeOverlayTimeLine;
|
} GstTimeOverlayTimeLine;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -65,6 +66,8 @@ struct _GstTimeOverlay {
|
||||||
gchar *datetime_format;
|
gchar *datetime_format;
|
||||||
GDateTime *datetime_epoch;
|
GDateTime *datetime_epoch;
|
||||||
|
|
||||||
|
GstCaps *reference_timestamp_caps;
|
||||||
|
|
||||||
/* For GST_TIME_OVERLAY_TIME_LINE_ELAPSED_RUNNING_TIME mode */
|
/* For GST_TIME_OVERLAY_TIME_LINE_ELAPSED_RUNNING_TIME mode */
|
||||||
GstClockTime first_running_time;
|
GstClockTime first_running_time;
|
||||||
GstPadEventFunction orig_video_event;
|
GstPadEventFunction orig_video_event;
|
||||||
|
|
Loading…
Reference in a new issue