g_mutex_unlock(&decode->decoder_mutex);
}
+static gboolean
+gst_vaapidecode_is_valid_time(GstVaapiDecode *decode, gint64 time)
+{
+ if (decode->segment.format != GST_FORMAT_TIME)
+ return TRUE;
+ if (decode->segment.stop != -1 && time != -1 && time > decode->segment.stop)
+ return FALSE;
+ if (decode->segment.start != -1 && time != -1 && time < decode->segment.start)
+ return FALSE;
+
+ return TRUE;
+}
+
static GstFlowReturn
gst_vaapidecode_step(GstVaapiDecode *decode)
{
goto error_create_buffer;
timestamp = GST_VAAPI_SURFACE_PROXY_TIMESTAMP(proxy);
+ if (GST_CLOCK_TIME_IS_VALID(timestamp) &&
+ !gst_vaapidecode_is_valid_time(decode, (gint64)timestamp)) {
+ g_object_unref(proxy);
+ continue;
+ }
+
if (!decode->render_time_base)
decode->render_time_base = g_get_monotonic_time();
decode->last_buffer_time = timestamp;
return gst_vaapidecode_create(decode, caps);
}
+static void
+gst_vaapidecode_configure_segment(
+ GstVaapiDecode *decode,
+ GstEvent *event
+)
+{
+ gboolean update;
+ gdouble rate, applied_rate;
+ GstFormat format;
+ gint64 start, stop, time;
+
+ gst_event_parse_new_segment_full(event, &update, &rate, &applied_rate,
+ &format, &start, &stop, &time);
+ if (format == GST_FORMAT_TIME) {
+ gst_segment_set_newsegment_full(&decode->segment, update, rate, applied_rate,
+ format, start, stop, time);
+ GST_DEBUG("configured new segment, update %d, rate %lf, applied rate %lf, "
+ "format GST_FORMAT_TIME, "
+ "start %" GST_TIME_FORMAT ", stop %" GST_TIME_FORMAT ", "
+ "time %" GST_TIME_FORMAT,
+ update, rate, applied_rate,
+ GST_TIME_ARGS(start), GST_TIME_ARGS(stop),
+ GST_TIME_ARGS(time));
+ }
+}
+
static gboolean
gst_vaapidecode_flush(GstVaapiDecode *decode)
{
/* Propagate event downstream */
switch (GST_EVENT_TYPE(event)) {
+ case GST_EVENT_FLUSH_STOP:
+ gst_segment_init(&decode->segment, GST_FORMAT_UNDEFINED);
+ if (decode->decoder)
+ gst_vaapi_decoder_clear_buffer(decode->decoder);
+ break;
case GST_EVENT_NEWSEGMENT:
if (decode->delayed_new_seg) {
gst_event_unref(decode->delayed_new_seg);
decode->delayed_new_seg = gst_event_ref(event);
return TRUE;
}
+ gst_vaapidecode_configure_segment(decode, event);
break;
case GST_EVENT_EOS:
if (!gst_vaapidecode_flush(decode)) {
g_mutex_init(&decode->decoder_mutex);
g_cond_init(&decode->decoder_ready);
+ gst_segment_init(&decode->segment, GST_FORMAT_UNDEFINED);
/* Pad through which data comes in to the element */
decode->sinkpad = gst_pad_new_from_template(