diff options
-rw-r--r-- | docs/gst_plugins_cache.json | 14 | ||||
-rw-r--r-- | gst/matroska/matroska-mux.c | 27 | ||||
-rw-r--r-- | gst/matroska/matroska-mux.h | 1 |
3 files changed, 42 insertions, 0 deletions
diff --git a/docs/gst_plugins_cache.json b/docs/gst_plugins_cache.json index 29807956a..0d7eeb229 100644 --- a/docs/gst_plugins_cache.json +++ b/docs/gst_plugins_cache.json @@ -9120,6 +9120,20 @@ } }, "properties": { + "cluster-timestamp-offset": { + "blurb": "An offset to add to all clusters/blocks (in nanoseconds)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "18446744073709551615", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint64", + "writable": true + }, "creation-time": { "blurb": "Date and time of creation. This will be used for the DateUTC field. NULL means that the current time will be used.", "conditionally-available": false, diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c index 1d003b488..7dd8901ff 100644 --- a/gst/matroska/matroska-mux.c +++ b/gst/matroska/matroska-mux.c @@ -76,6 +76,7 @@ enum PROP_MAX_CLUSTER_DURATION, PROP_OFFSET_TO_ZERO, PROP_CREATION_TIME, + PROP_CLUSTER_TIMESTAMP_OFFSET, }; #define DEFAULT_DOCTYPE_VERSION 2 @@ -86,6 +87,7 @@ enum #define DEFAULT_MIN_CLUSTER_DURATION 500 * GST_MSECOND #define DEFAULT_MAX_CLUSTER_DURATION 65535 * GST_MSECOND #define DEFAULT_OFFSET_TO_ZERO FALSE +#define DEFAULT_CLUSTER_TIMESTAMP_OFFSET 0 /* WAVEFORMATEX is gst_riff_strf_auds + an extra guint16 extension size */ #define WAVEFORMATEX_SIZE (2 + sizeof (gst_riff_strf_auds)) @@ -380,6 +382,20 @@ gst_matroska_mux_class_init (GstMatroskaMuxClass * klass) " NULL means that the current time will be used.", G_TYPE_DATE_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstMatroskaMux:cluster-timestamp-offset: + * + * An offset to add to all clusters/blocks (in nanoseconds) + * + * Since: 1.20 + */ + g_object_class_install_property (gobject_class, PROP_CLUSTER_TIMESTAMP_OFFSET, + g_param_spec_uint64 ("cluster-timestamp-offset", + "Cluster timestamp offset", + "An offset to add to all clusters/blocks (in nanoseconds)", 0, + G_MAXUINT64, DEFAULT_CLUSTER_TIMESTAMP_OFFSET, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_matroska_mux_change_state); gstelement_class->request_new_pad = @@ -508,6 +524,7 @@ gst_matroska_mux_init (GstMatroskaMux * mux, gpointer g_class) mux->time_scale = DEFAULT_TIMECODESCALE; mux->min_cluster_duration = DEFAULT_MIN_CLUSTER_DURATION; mux->max_cluster_duration = DEFAULT_MAX_CLUSTER_DURATION; + mux->cluster_timestamp_offset = DEFAULT_CLUSTER_TIMESTAMP_OFFSET; /* initialize internal variables */ mux->index = NULL; @@ -3915,6 +3932,10 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad, } } + /* From this point on we use the buffer_timestamp to do cluster and other + * related arithmetic, so apply the timestamp offset if we have one */ + buffer_timestamp += mux->cluster_timestamp_offset; + is_audio_only = (collect_pad->track->type == GST_MATROSKA_TRACK_TYPE_AUDIO) && (mux->num_streams == 1); is_min_duration_reached = (mux->min_cluster_duration == 0 @@ -4303,6 +4324,9 @@ gst_matroska_mux_set_property (GObject * object, g_clear_pointer (&mux->creation_time, g_date_time_unref); mux->creation_time = g_value_dup_boxed (value); break; + case PROP_CLUSTER_TIMESTAMP_OFFSET: + mux->cluster_timestamp_offset = g_value_get_uint64 (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -4346,6 +4370,9 @@ gst_matroska_mux_get_property (GObject * object, case PROP_CREATION_TIME: g_value_set_boxed (value, mux->creation_time); break; + case PROP_CLUSTER_TIMESTAMP_OFFSET: + g_value_set_uint64 (value, mux->cluster_timestamp_offset); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; diff --git a/gst/matroska/matroska-mux.h b/gst/matroska/matroska-mux.h index ff208f7ba..bcb61a929 100644 --- a/gst/matroska/matroska-mux.h +++ b/gst/matroska/matroska-mux.h @@ -116,6 +116,7 @@ struct _GstMatroskaMux { /* earliest timestamp (time, ns) if offsetting to zero */ gboolean offset_to_zero; + guint64 cluster_timestamp_offset; guint64 earliest_time; /* length, position (time, ns) */ guint64 duration; |