mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
check stream
Original commit message from CVS: check stream
This commit is contained in:
parent
b5051d23dd
commit
0b17785211
5 changed files with 106 additions and 2 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2004-06-26 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
|
* gst/elements/gstidentity.c: (gst_identity_class_init),
|
||||||
|
(gst_identity_init), (gst_identity_chain),
|
||||||
|
(gst_identity_set_property), (gst_identity_get_property):
|
||||||
|
* gst/elements/gstidentity.h:
|
||||||
|
check for perfect stream
|
||||||
|
|
||||||
2004-06-25 Thomas Vander Stichele <thomas at apestaart dot org>
|
2004-06-25 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
* gst/elements/gstidentity.c: (gst_identity_chain):
|
* gst/elements/gstidentity.c: (gst_identity_chain):
|
||||||
|
|
|
@ -59,7 +59,8 @@ enum
|
||||||
ARG_SILENT,
|
ARG_SILENT,
|
||||||
ARG_LAST_MESSAGE,
|
ARG_LAST_MESSAGE,
|
||||||
ARG_DUMP,
|
ARG_DUMP,
|
||||||
ARG_SYNC
|
ARG_SYNC,
|
||||||
|
ARG_CHECK_PERFECT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -140,6 +141,10 @@ gst_identity_class_init (GstIdentityClass * klass)
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC,
|
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC,
|
||||||
g_param_spec_boolean ("sync", "Synchronize",
|
g_param_spec_boolean ("sync", "Synchronize",
|
||||||
"Synchronize to pipeline clock", FALSE, G_PARAM_READWRITE));
|
"Synchronize to pipeline clock", FALSE, G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHECK_PERFECT,
|
||||||
|
g_param_spec_boolean ("check-perfect", "Check For Perfect Stream",
|
||||||
|
"Verify that the stream is time- and data-contiguous", FALSE,
|
||||||
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
gst_identity_signals[SIGNAL_HANDOFF] =
|
gst_identity_signals[SIGNAL_HANDOFF] =
|
||||||
g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
|
g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
|
||||||
|
@ -176,6 +181,10 @@ gst_identity_init (GstIdentity * identity)
|
||||||
identity->drop_probability = 0.0;
|
identity->drop_probability = 0.0;
|
||||||
identity->silent = FALSE;
|
identity->silent = FALSE;
|
||||||
identity->sync = FALSE;
|
identity->sync = FALSE;
|
||||||
|
identity->check_perfect = FALSE;
|
||||||
|
identity->prev_timestamp = GST_CLOCK_TIME_NONE;
|
||||||
|
identity->prev_duration = GST_CLOCK_TIME_NONE;
|
||||||
|
identity->prev_offset_end = -1;
|
||||||
identity->dump = FALSE;
|
identity->dump = FALSE;
|
||||||
identity->last_message = NULL;
|
identity->last_message = NULL;
|
||||||
identity->srccaps = NULL;
|
identity->srccaps = NULL;
|
||||||
|
@ -221,6 +230,35 @@ gst_identity_chain (GstPad * pad, GstData * _data)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* see if we need to do perfect stream checking */
|
||||||
|
/* invalid timestamp drops us out of check. FIXME: maybe warn ? */
|
||||||
|
if (identity->check_perfect &&
|
||||||
|
GST_BUFFER_TIMESTAMP (buf) != GST_CLOCK_TIME_NONE) {
|
||||||
|
/* check if we had a previous buffer to compare to */
|
||||||
|
if (identity->prev_timestamp != GST_CLOCK_TIME_NONE) {
|
||||||
|
if (identity->prev_timestamp + identity->prev_duration !=
|
||||||
|
GST_BUFFER_TIMESTAMP (buf)) {
|
||||||
|
GST_WARNING_OBJECT (identity,
|
||||||
|
"Buffer not time-contiguous with previous one: " "prev ts %"
|
||||||
|
GST_TIME_FORMAT ", prev dur %" GST_TIME_FORMAT ", new ts %"
|
||||||
|
GST_TIME_FORMAT, GST_TIME_ARGS (identity->prev_timestamp),
|
||||||
|
GST_TIME_ARGS (identity->prev_duration),
|
||||||
|
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
|
||||||
|
}
|
||||||
|
if (identity->prev_offset_end != GST_BUFFER_OFFSET (buf)) {
|
||||||
|
GST_WARNING_OBJECT (identity,
|
||||||
|
"Buffer not data-contiguous with previous one: "
|
||||||
|
"prev offset_end %" G_GINT64_FORMAT ", new offset %"
|
||||||
|
G_GINT64_FORMAT, identity->prev_offset_end,
|
||||||
|
GST_BUFFER_OFFSET (buf));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* update prev values */
|
||||||
|
identity->prev_timestamp = GST_BUFFER_TIMESTAMP (buf);
|
||||||
|
identity->prev_duration = GST_BUFFER_DURATION (buf);
|
||||||
|
identity->prev_offset_end = GST_BUFFER_OFFSET_END (buf);
|
||||||
|
}
|
||||||
|
|
||||||
if (identity->error_after >= 0) {
|
if (identity->error_after >= 0) {
|
||||||
identity->error_after--;
|
identity->error_after--;
|
||||||
if (identity->error_after == 0) {
|
if (identity->error_after == 0) {
|
||||||
|
@ -352,6 +390,9 @@ gst_identity_set_property (GObject * object, guint prop_id,
|
||||||
case ARG_SYNC:
|
case ARG_SYNC:
|
||||||
identity->sync = g_value_get_boolean (value);
|
identity->sync = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
case ARG_CHECK_PERFECT:
|
||||||
|
identity->check_perfect = g_value_get_boolean (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;
|
||||||
|
@ -397,6 +438,9 @@ gst_identity_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
case ARG_SYNC:
|
case ARG_SYNC:
|
||||||
g_value_set_boolean (value, identity->sync);
|
g_value_set_boolean (value, identity->sync);
|
||||||
break;
|
break;
|
||||||
|
case ARG_CHECK_PERFECT:
|
||||||
|
g_value_set_boolean (value, identity->check_perfect);
|
||||||
|
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;
|
||||||
|
|
|
@ -58,6 +58,10 @@ struct _GstIdentity {
|
||||||
gboolean silent;
|
gboolean silent;
|
||||||
gboolean dump;
|
gboolean dump;
|
||||||
gboolean sync;
|
gboolean sync;
|
||||||
|
gboolean check_perfect;
|
||||||
|
GstClockTime prev_timestamp;
|
||||||
|
GstClockTime prev_duration;
|
||||||
|
guint64 prev_offset_end;
|
||||||
GstClock *clock;
|
GstClock *clock;
|
||||||
gchar *last_message;
|
gchar *last_message;
|
||||||
GstCaps *srccaps;
|
GstCaps *srccaps;
|
||||||
|
|
|
@ -59,7 +59,8 @@ enum
|
||||||
ARG_SILENT,
|
ARG_SILENT,
|
||||||
ARG_LAST_MESSAGE,
|
ARG_LAST_MESSAGE,
|
||||||
ARG_DUMP,
|
ARG_DUMP,
|
||||||
ARG_SYNC
|
ARG_SYNC,
|
||||||
|
ARG_CHECK_PERFECT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -140,6 +141,10 @@ gst_identity_class_init (GstIdentityClass * klass)
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC,
|
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC,
|
||||||
g_param_spec_boolean ("sync", "Synchronize",
|
g_param_spec_boolean ("sync", "Synchronize",
|
||||||
"Synchronize to pipeline clock", FALSE, G_PARAM_READWRITE));
|
"Synchronize to pipeline clock", FALSE, G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHECK_PERFECT,
|
||||||
|
g_param_spec_boolean ("check-perfect", "Check For Perfect Stream",
|
||||||
|
"Verify that the stream is time- and data-contiguous", FALSE,
|
||||||
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
gst_identity_signals[SIGNAL_HANDOFF] =
|
gst_identity_signals[SIGNAL_HANDOFF] =
|
||||||
g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
|
g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
|
||||||
|
@ -176,6 +181,10 @@ gst_identity_init (GstIdentity * identity)
|
||||||
identity->drop_probability = 0.0;
|
identity->drop_probability = 0.0;
|
||||||
identity->silent = FALSE;
|
identity->silent = FALSE;
|
||||||
identity->sync = FALSE;
|
identity->sync = FALSE;
|
||||||
|
identity->check_perfect = FALSE;
|
||||||
|
identity->prev_timestamp = GST_CLOCK_TIME_NONE;
|
||||||
|
identity->prev_duration = GST_CLOCK_TIME_NONE;
|
||||||
|
identity->prev_offset_end = -1;
|
||||||
identity->dump = FALSE;
|
identity->dump = FALSE;
|
||||||
identity->last_message = NULL;
|
identity->last_message = NULL;
|
||||||
identity->srccaps = NULL;
|
identity->srccaps = NULL;
|
||||||
|
@ -221,6 +230,35 @@ gst_identity_chain (GstPad * pad, GstData * _data)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* see if we need to do perfect stream checking */
|
||||||
|
/* invalid timestamp drops us out of check. FIXME: maybe warn ? */
|
||||||
|
if (identity->check_perfect &&
|
||||||
|
GST_BUFFER_TIMESTAMP (buf) != GST_CLOCK_TIME_NONE) {
|
||||||
|
/* check if we had a previous buffer to compare to */
|
||||||
|
if (identity->prev_timestamp != GST_CLOCK_TIME_NONE) {
|
||||||
|
if (identity->prev_timestamp + identity->prev_duration !=
|
||||||
|
GST_BUFFER_TIMESTAMP (buf)) {
|
||||||
|
GST_WARNING_OBJECT (identity,
|
||||||
|
"Buffer not time-contiguous with previous one: " "prev ts %"
|
||||||
|
GST_TIME_FORMAT ", prev dur %" GST_TIME_FORMAT ", new ts %"
|
||||||
|
GST_TIME_FORMAT, GST_TIME_ARGS (identity->prev_timestamp),
|
||||||
|
GST_TIME_ARGS (identity->prev_duration),
|
||||||
|
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
|
||||||
|
}
|
||||||
|
if (identity->prev_offset_end != GST_BUFFER_OFFSET (buf)) {
|
||||||
|
GST_WARNING_OBJECT (identity,
|
||||||
|
"Buffer not data-contiguous with previous one: "
|
||||||
|
"prev offset_end %" G_GINT64_FORMAT ", new offset %"
|
||||||
|
G_GINT64_FORMAT, identity->prev_offset_end,
|
||||||
|
GST_BUFFER_OFFSET (buf));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* update prev values */
|
||||||
|
identity->prev_timestamp = GST_BUFFER_TIMESTAMP (buf);
|
||||||
|
identity->prev_duration = GST_BUFFER_DURATION (buf);
|
||||||
|
identity->prev_offset_end = GST_BUFFER_OFFSET_END (buf);
|
||||||
|
}
|
||||||
|
|
||||||
if (identity->error_after >= 0) {
|
if (identity->error_after >= 0) {
|
||||||
identity->error_after--;
|
identity->error_after--;
|
||||||
if (identity->error_after == 0) {
|
if (identity->error_after == 0) {
|
||||||
|
@ -352,6 +390,9 @@ gst_identity_set_property (GObject * object, guint prop_id,
|
||||||
case ARG_SYNC:
|
case ARG_SYNC:
|
||||||
identity->sync = g_value_get_boolean (value);
|
identity->sync = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
case ARG_CHECK_PERFECT:
|
||||||
|
identity->check_perfect = g_value_get_boolean (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;
|
||||||
|
@ -397,6 +438,9 @@ gst_identity_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
case ARG_SYNC:
|
case ARG_SYNC:
|
||||||
g_value_set_boolean (value, identity->sync);
|
g_value_set_boolean (value, identity->sync);
|
||||||
break;
|
break;
|
||||||
|
case ARG_CHECK_PERFECT:
|
||||||
|
g_value_set_boolean (value, identity->check_perfect);
|
||||||
|
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;
|
||||||
|
|
|
@ -58,6 +58,10 @@ struct _GstIdentity {
|
||||||
gboolean silent;
|
gboolean silent;
|
||||||
gboolean dump;
|
gboolean dump;
|
||||||
gboolean sync;
|
gboolean sync;
|
||||||
|
gboolean check_perfect;
|
||||||
|
GstClockTime prev_timestamp;
|
||||||
|
GstClockTime prev_duration;
|
||||||
|
guint64 prev_offset_end;
|
||||||
GstClock *clock;
|
GstClock *clock;
|
||||||
gchar *last_message;
|
gchar *last_message;
|
||||||
GstCaps *srccaps;
|
GstCaps *srccaps;
|
||||||
|
|
Loading…
Reference in a new issue