diff options
author | Руслан Ижбулатов <lrn1986@gmail.com> | 2009-09-25 12:20:50 +0400 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2009-09-30 18:51:55 +0200 |
commit | 05e059c6247a72cbb47069cc76b79979ccf22f89 (patch) | |
tree | 4ba27ff075f7673aba350513defdf2a53fa7aa97 | |
parent | 1adfafbe2cd0af7a8b1e03da8f68a63d8c102b28 (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.c | 43 |
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); |