summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
Diffstat (limited to 'gst')
-rw-r--r--gst/ivtc/gstivtc.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/gst/ivtc/gstivtc.c b/gst/ivtc/gstivtc.c
index 26d0f4e35..d26439b9c 100644
--- a/gst/ivtc/gstivtc.c
+++ b/gst/ivtc/gstivtc.c
@@ -329,6 +329,8 @@ gst_ivtc_fixate_caps (GstBaseTransform * trans,
gst_caps_set_simple (result, "framerate", GST_TYPE_FRACTION, 24, 1, NULL);
}
+ result = gst_caps_fixate (result);
+
return result;
}
@@ -392,8 +394,9 @@ gst_ivtc_transform_size (GstBaseTransform * trans,
GstPadDirection direction,
GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize)
{
+ *othersize = size;
- return FALSE;
+ return TRUE;
}
static gboolean
@@ -618,6 +621,9 @@ gst_ivtc_retire_fields (GstIvtc * ivtc, int n_fields)
{
int i;
+ if (n_fields == 0)
+ return;
+
for (i = 0; i < n_fields; i++) {
gst_video_frame_unmap (&ivtc->fields[i].frame);
gst_buffer_unref (ivtc->fields[i].buffer);
@@ -653,6 +659,12 @@ gst_ivtc_transform (GstBaseTransform * trans, GstBuffer * inbuf,
}
}
+ while (ivtc->n_fields > 0 &&
+ ivtc->fields[0].ts + GST_MSECOND * 50 < ivtc->current_ts) {
+ GST_DEBUG ("retiring early field");
+ gst_ivtc_retire_fields (ivtc, 1);
+ }
+
GST_DEBUG ("n_fields %d", ivtc->n_fields);
if (ivtc->n_fields < 4) {
return GST_BASE_TRANSFORM_FLOW_DROPPED;
@@ -662,9 +674,11 @@ gst_ivtc_transform (GstBaseTransform * trans, GstBuffer * inbuf,
while (ivtc->n_fields >= 4) {
GstBuffer *buf;
buf = gst_buffer_copy (outbuf);
+ GST_DEBUG ("pushing extra frame");
ret = gst_pad_push (GST_BASE_TRANSFORM_SRC_PAD (trans), buf);
- if (ret != GST_FLOW_OK)
+ if (ret != GST_FLOW_OK) {
return ret;
+ }
gst_ivtc_construct_frame (ivtc, outbuf);
}