mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-30 05:31:15 +00:00
avwait: Add support for setting an end running time
It was possible to set a start running time and start/end timecode before, but not an end running time.
This commit is contained in:
parent
074df2f4bc
commit
cf35802c52
2 changed files with 52 additions and 4 deletions
|
@ -92,12 +92,14 @@ enum
|
||||||
PROP_TARGET_TIME_CODE_STRING,
|
PROP_TARGET_TIME_CODE_STRING,
|
||||||
PROP_TARGET_RUNNING_TIME,
|
PROP_TARGET_RUNNING_TIME,
|
||||||
PROP_END_TIME_CODE,
|
PROP_END_TIME_CODE,
|
||||||
|
PROP_END_RUNNING_TIME,
|
||||||
PROP_RECORDING,
|
PROP_RECORDING,
|
||||||
PROP_MODE
|
PROP_MODE
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFAULT_TARGET_TIMECODE_STR "00:00:00:00"
|
#define DEFAULT_TARGET_TIMECODE_STR "00:00:00:00"
|
||||||
#define DEFAULT_TARGET_RUNNING_TIME GST_CLOCK_TIME_NONE
|
#define DEFAULT_TARGET_RUNNING_TIME GST_CLOCK_TIME_NONE
|
||||||
|
#define DEFAULT_END_RUNNING_TIME GST_CLOCK_TIME_NONE
|
||||||
#define DEFAULT_MODE MODE_TIMECODE
|
#define DEFAULT_MODE MODE_TIMECODE
|
||||||
|
|
||||||
/* flags for self->must_send_end_message */
|
/* flags for self->must_send_end_message */
|
||||||
|
@ -201,6 +203,14 @@ gst_avwait_class_init (GstAvWaitClass * klass)
|
||||||
GST_TYPE_VIDEO_TIME_CODE,
|
GST_TYPE_VIDEO_TIME_CODE,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
|
g_object_class_install_property (gobject_class, PROP_END_RUNNING_TIME,
|
||||||
|
g_param_spec_uint64 ("end-running-time", "End running time",
|
||||||
|
"Running time to end at in running-time mode",
|
||||||
|
0, G_MAXUINT64,
|
||||||
|
DEFAULT_END_RUNNING_TIME,
|
||||||
|
GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE |
|
||||||
|
G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class, PROP_RECORDING,
|
g_object_class_install_property (gobject_class, PROP_RECORDING,
|
||||||
g_param_spec_boolean ("recording",
|
g_param_spec_boolean ("recording",
|
||||||
"Recording state",
|
"Recording state",
|
||||||
|
@ -288,6 +298,7 @@ gst_avwait_init (GstAvWait * self)
|
||||||
self->recording = TRUE;
|
self->recording = TRUE;
|
||||||
|
|
||||||
self->target_running_time = DEFAULT_TARGET_RUNNING_TIME;
|
self->target_running_time = DEFAULT_TARGET_RUNNING_TIME;
|
||||||
|
self->end_running_time = DEFAULT_TARGET_RUNNING_TIME;
|
||||||
self->mode = DEFAULT_MODE;
|
self->mode = DEFAULT_MODE;
|
||||||
|
|
||||||
gst_video_info_init (&self->vinfo);
|
gst_video_info_init (&self->vinfo);
|
||||||
|
@ -428,6 +439,12 @@ gst_avwait_get_property (GObject * object, guint prop_id,
|
||||||
g_mutex_unlock (&self->mutex);
|
g_mutex_unlock (&self->mutex);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PROP_END_RUNNING_TIME:{
|
||||||
|
g_mutex_lock (&self->mutex);
|
||||||
|
g_value_set_uint64 (value, self->end_running_time);
|
||||||
|
g_mutex_unlock (&self->mutex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case PROP_RECORDING:{
|
case PROP_RECORDING:{
|
||||||
g_mutex_lock (&self->mutex);
|
g_mutex_lock (&self->mutex);
|
||||||
g_value_set_boolean (value, self->recording);
|
g_value_set_boolean (value, self->recording);
|
||||||
|
@ -528,6 +545,21 @@ gst_avwait_set_property (GObject * object, guint prop_id,
|
||||||
g_mutex_unlock (&self->mutex);
|
g_mutex_unlock (&self->mutex);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PROP_END_RUNNING_TIME:{
|
||||||
|
g_mutex_lock (&self->mutex);
|
||||||
|
self->end_running_time = g_value_get_uint64 (value);
|
||||||
|
if (self->mode == MODE_RUNNING_TIME) {
|
||||||
|
self->running_time_to_end_at = self->end_running_time;
|
||||||
|
if (self->recording) {
|
||||||
|
self->audio_running_time_to_end_at = self->running_time_to_end_at;
|
||||||
|
}
|
||||||
|
if (self->end_running_time >= self->last_seen_video_running_time) {
|
||||||
|
self->dropping = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_mutex_unlock (&self->mutex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case PROP_MODE:{
|
case PROP_MODE:{
|
||||||
GstAvWaitMode old_mode;
|
GstAvWaitMode old_mode;
|
||||||
|
|
||||||
|
@ -546,11 +578,15 @@ gst_avwait_set_property (GObject * object, guint prop_id,
|
||||||
break;
|
break;
|
||||||
case MODE_RUNNING_TIME:
|
case MODE_RUNNING_TIME:
|
||||||
self->running_time_to_wait_for = self->target_running_time;
|
self->running_time_to_wait_for = self->target_running_time;
|
||||||
|
self->running_time_to_end_at = self->end_running_time;
|
||||||
if (self->recording) {
|
if (self->recording) {
|
||||||
self->audio_running_time_to_wait_for =
|
self->audio_running_time_to_wait_for =
|
||||||
self->running_time_to_wait_for;
|
self->running_time_to_wait_for;
|
||||||
|
self->audio_running_time_to_end_at = self->running_time_to_end_at;
|
||||||
}
|
}
|
||||||
if (self->target_running_time < self->last_seen_video_running_time) {
|
if (self->target_running_time < self->last_seen_video_running_time
|
||||||
|
|| self->end_running_time >=
|
||||||
|
self->last_seen_video_running_time) {
|
||||||
self->dropping = TRUE;
|
self->dropping = TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -896,10 +932,21 @@ gst_avwait_vsink_chain (GstPad * pad, GstObject * parent, GstBuffer * inbuf)
|
||||||
if (self->recording)
|
if (self->recording)
|
||||||
gst_avwait_send_element_message (self, FALSE, running_time);
|
gst_avwait_send_element_message (self, FALSE, running_time);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GST_CLOCK_TIME_IS_VALID (self->running_time_to_end_at)
|
||||||
|
&& running_time >= self->running_time_to_end_at) {
|
||||||
GST_INFO_OBJECT (self,
|
GST_INFO_OBJECT (self,
|
||||||
"Have %" GST_TIME_FORMAT ", waiting for %" GST_TIME_FORMAT,
|
"End running time %" GST_TIME_FORMAT " reached at %"
|
||||||
GST_TIME_ARGS (running_time),
|
GST_TIME_FORMAT, GST_TIME_ARGS (self->running_time_to_end_at),
|
||||||
GST_TIME_ARGS (self->running_time_to_wait_for));
|
GST_TIME_ARGS (self->vsegment.position));
|
||||||
|
self->dropping = TRUE;
|
||||||
|
if (self->recording) {
|
||||||
|
self->audio_running_time_to_end_at = self->running_time_to_end_at;
|
||||||
|
self->must_send_end_message |= END_MESSAGE_STREAM_ENDED;
|
||||||
|
}
|
||||||
|
gst_buffer_unref (inbuf);
|
||||||
|
inbuf = NULL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,7 @@ struct _GstAvWait
|
||||||
GstAvWaitMode mode;
|
GstAvWaitMode mode;
|
||||||
|
|
||||||
GstVideoTimeCode *end_tc;
|
GstVideoTimeCode *end_tc;
|
||||||
|
GstClockTime end_running_time;
|
||||||
GstClockTime running_time_to_end_at;
|
GstClockTime running_time_to_end_at;
|
||||||
|
|
||||||
GstPad *asrcpad, *asinkpad, *vsrcpad, *vsinkpad;
|
GstPad *asrcpad, *asinkpad, *vsrcpad, *vsinkpad;
|
||||||
|
|
Loading…
Reference in a new issue