summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorРуслан Ижбулатов <lrn1986@gmail.com>2009-09-25 12:20:50 +0400
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-09-30 18:51:55 +0200
commit05e059c6247a72cbb47069cc76b79979ccf22f89 (patch)
tree4ba27ff075f7673aba350513defdf2a53fa7aa97
parent1adfafbe2cd0af7a8b1e03da8f68a63d8c102b28 (diff)
Take offset gaps into account.
Prevents measurecollector from crashing when frame numbers are not consecutive. Fixes bug #596285.
-rw-r--r--gst/videomeasure/gstvideomeasure_collector.c43
1 files changed, 28 insertions, 15 deletions
diff --git a/gst/videomeasure/gstvideomeasure_collector.c b/gst/videomeasure/gstvideomeasure_collector.c
index 306b3c0bf..a7c6d2e85 100644
--- a/gst/videomeasure/gstvideomeasure_collector.c
+++ b/gst/videomeasure/gstvideomeasure_collector.c
@@ -135,17 +135,27 @@ gst_measure_collector_post_message (GstMeasureCollector * mc)
135 135
136 if (strcmp (mc->metric, "SSIM") == 0) { 136 if (strcmp (mc->metric, "SSIM") == 0) {
137 gfloat dresult = 0; 137 gfloat dresult = 0;
138 guint64 mlen;
138 g_free (mc->result); 139 g_free (mc->result);
139 mc->result = g_new0 (GValue, 1); 140 mc->result = g_new0 (GValue, 1);
140 g_value_init (mc->result, G_TYPE_FLOAT); 141 g_value_init (mc->result, G_TYPE_FLOAT);
142 mlen = mc->measurements->len;
141 for (i = 0; i < mc->measurements->len; i++) { 143 for (i = 0; i < mc->measurements->len; i++) {
142 const GValue *v; 144 const GValue *v;
143 GstStructure *str = 145 GstStructure *str =
144 (GstStructure *) g_ptr_array_index (mc->measurements, i); 146 (GstStructure *) g_ptr_array_index (mc->measurements, i);
145 v = gst_structure_get_value (str, "mean"); 147 if (str)
146 dresult += g_value_get_float (v); 148 {
149 v = gst_structure_get_value (str, "mean");
150 dresult += g_value_get_float (v);
151 }
152 else
153 {
154 GST_WARNING_OBJECT (mc, "No measurement info for frame %" G_GUINT64_FORMAT, i);
155 mlen--;
156 }
147 } 157 }
148 g_value_set_float (mc->result, dresult / mc->measurements->len); 158 g_value_set_float (mc->result, dresult / mlen);
149 } 159 }
150 160
151 m = gst_message_new_element (GST_OBJECT_CAST (mc), 161 m = gst_message_new_element (GST_OBJECT_CAST (mc),
@@ -269,16 +279,18 @@ gst_measure_collector_save_csv (GstMeasureCollector * mc)
269 for (i = 0; i < mc->measurements->len; i++) { 279 for (i = 0; i < mc->measurements->len; i++) {
270 fprintf (file, "\n"); 280 fprintf (file, "\n");
271 str = (GstStructure *) g_ptr_array_index (mc->measurements, i); 281 str = (GstStructure *) g_ptr_array_index (mc->measurements, i);
272 for (j = 0; j < gst_structure_n_fields (str); j++) { 282 if (str != NULL) {
273 const gchar *fieldname; 283 for (j = 0; j < gst_structure_n_fields (str); j++) {
274 fieldname = gst_structure_nth_field_name (str, j); 284 const gchar *fieldname;
275 if (G_LIKELY (j > 0)) 285 fieldname = gst_structure_nth_field_name (str, j);
276 fprintf (file, ";"); 286 if (G_LIKELY (j > 0))
277 if (G_LIKELY (g_value_transform (gst_structure_get_value (str, fieldname), 287 fprintf (file, ";");
278 &tmp))) 288 if (G_LIKELY (g_value_transform (gst_structure_get_value (str, fieldname),
279 fprintf (file, "%s", g_value_get_string (&tmp)); 289 &tmp)))
280 else 290 fprintf (file, "%s", g_value_get_string (&tmp));
281 fprintf (file, "<untranslatable>"); 291 else
292 fprintf (file, "<untranslatable>");
293 }
282 } 294 }
283 } 295 }
284 296
@@ -387,8 +399,9 @@ gst_measure_collector_finalize (GObject * object)
387 GstMeasureCollector *mc = GST_MEASURE_COLLECTOR (object); 399 GstMeasureCollector *mc = GST_MEASURE_COLLECTOR (object);
388 400
389 for (i = 0; i < mc->measurements->len; i++) { 401 for (i = 0; i < mc->measurements->len; i++) {
390 gst_structure_free ((GstStructure *) g_ptr_array_index (mc->measurements, 402 if (g_ptr_array_index (mc->measurements,i) != NULL)
391 i)); 403 gst_structure_free ((GstStructure *) g_ptr_array_index (mc->measurements,
404 i));
392 } 405 }
393 406
394 g_ptr_array_free (mc->measurements, TRUE); 407 g_ptr_array_free (mc->measurements, TRUE);