From b1710d7c158d969a151caffad4c6671d62c679a6 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 16 Nov 2016 16:30:50 -0300 Subject: [PATCH] iqa: Error out when trying to compare video stream with different sizes We do not handle it yet and we should let the user know. --- ext/iqa/iqa.c | 49 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/ext/iqa/iqa.c b/ext/iqa/iqa.c index 5ba60b35df..50c688517d 100644 --- a/ext/iqa/iqa.c +++ b/ext/iqa/iqa.c @@ -102,7 +102,6 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%u", G_DEFINE_TYPE (GstIqa, gst_iqa, GST_TYPE_VIDEO_AGGREGATOR); #ifdef HAVE_DSSIM - inline static unsigned char to_byte (float in) { @@ -113,7 +112,7 @@ to_byte (float in) return in * 256.f; } -static void +static gboolean do_dssim (GstIqa * self, GstVideoFrame * ref, GstVideoFrame * cmp, GstBuffer * outbuf, GstStructure * msg_structure, gchar * padname) { @@ -138,9 +137,18 @@ do_dssim (GstIqa * self, GstVideoFrame * ref, GstVideoFrame * cmp, dssim_set_save_ssim_maps (attr, 1, 1); if (ref->info.width != cmp->info.width || ref->info.height != cmp->info.height) { - GST_WARNING_OBJECT (self, - "Cannot compare two images with a different geometry yet"); - return; + GST_OBJECT_UNLOCK (self); + + GST_ELEMENT_ERROR (self, STREAM, FAILED, + ("Video streams do not have the same sizes (add videoscale" + " and force the sizes to be equal on all sink pads.)"), + ("Reference width %d - compared width: %d. " + "Reference height %d - compared height: %d", + ref->info.width, cmp->info.width, ref->info.height, + cmp->info.height)); + + GST_OBJECT_LOCK (self); + return FALSE; } gst_buffer_map (ref->buffer, &ref_info, GST_MAP_READ); @@ -198,21 +206,23 @@ do_dssim (GstIqa * self, GstVideoFrame * ref, GstVideoFrame * cmp, dssim_dealloc_image (ref_image); dssim_dealloc_image (cmp_image); dssim_dealloc_attr (attr); -} -#else -static void -do_dssim (GstIqa * self, GstVideoFrame * ref, GstVideoFrame * cmp, - GstBuffer * outbuf, GstStructure * msg_structure, gchar * padname) -{ + + return TRUE; } #endif -static void +static gboolean compare_frames (GstIqa * self, GstVideoFrame * ref, GstVideoFrame * cmp, GstBuffer * outbuf, GstStructure * msg_structure, gchar * padname) { - if (self->do_dssim) - do_dssim (self, ref, cmp, outbuf, msg_structure, padname); +#ifdef HAVE_DSSIM + if (self->do_dssim) { + if (!do_dssim (self, ref, cmp, outbuf, msg_structure, padname)) + return FALSE; + } +#endif + + return TRUE; } static GstFlowReturn @@ -239,12 +249,16 @@ gst_iqa_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) if (!ref_frame) { ref_frame = pad->aggregated_frame; } else { + gboolean res; gchar *padname = gst_pad_get_name (pad); GstVideoFrame *cmp_frame = pad->aggregated_frame; - compare_frames (self, ref_frame, cmp_frame, outbuf, msg_structure, + res = compare_frames (self, ref_frame, cmp_frame, outbuf, msg_structure, padname); g_free (padname); + + if (!res) + goto failed; } } } @@ -258,6 +272,11 @@ gst_iqa_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) agg->segment.position, NULL); gst_element_post_message (GST_ELEMENT (self), m); return GST_FLOW_OK; + +failed: + GST_OBJECT_UNLOCK (vagg); + + return GST_FLOW_ERROR; } static void