Take offset gaps into account.

Prevents measurecollector from crashing when frame numbers are not consecutive.

Fixes bug #596285.
This commit is contained in:
Руслан Ижбулатов 2009-09-25 12:20:50 +04:00 committed by Sebastian Dröge
parent 1adfafbe2c
commit 05e059c624

View file

@ -135,17 +135,27 @@ gst_measure_collector_post_message (GstMeasureCollector * mc)
if (strcmp (mc->metric, "SSIM") == 0) { if (strcmp (mc->metric, "SSIM") == 0) {
gfloat dresult = 0; gfloat dresult = 0;
guint64 mlen;
g_free (mc->result); g_free (mc->result);
mc->result = g_new0 (GValue, 1); mc->result = g_new0 (GValue, 1);
g_value_init (mc->result, G_TYPE_FLOAT); g_value_init (mc->result, G_TYPE_FLOAT);
mlen = mc->measurements->len;
for (i = 0; i < mc->measurements->len; i++) { for (i = 0; i < mc->measurements->len; i++) {
const GValue *v; const GValue *v;
GstStructure *str = GstStructure *str =
(GstStructure *) g_ptr_array_index (mc->measurements, i); (GstStructure *) g_ptr_array_index (mc->measurements, i);
v = gst_structure_get_value (str, "mean"); if (str)
dresult += g_value_get_float (v); {
v = gst_structure_get_value (str, "mean");
dresult += g_value_get_float (v);
}
else
{
GST_WARNING_OBJECT (mc, "No measurement info for frame %" G_GUINT64_FORMAT, i);
mlen--;
}
} }
g_value_set_float (mc->result, dresult / mc->measurements->len); g_value_set_float (mc->result, dresult / mlen);
} }
m = gst_message_new_element (GST_OBJECT_CAST (mc), m = gst_message_new_element (GST_OBJECT_CAST (mc),
@ -269,16 +279,18 @@ gst_measure_collector_save_csv (GstMeasureCollector * mc)
for (i = 0; i < mc->measurements->len; i++) { for (i = 0; i < mc->measurements->len; i++) {
fprintf (file, "\n"); fprintf (file, "\n");
str = (GstStructure *) g_ptr_array_index (mc->measurements, i); str = (GstStructure *) g_ptr_array_index (mc->measurements, i);
for (j = 0; j < gst_structure_n_fields (str); j++) { if (str != NULL) {
const gchar *fieldname; for (j = 0; j < gst_structure_n_fields (str); j++) {
fieldname = gst_structure_nth_field_name (str, j); const gchar *fieldname;
if (G_LIKELY (j > 0)) fieldname = gst_structure_nth_field_name (str, j);
fprintf (file, ";"); if (G_LIKELY (j > 0))
if (G_LIKELY (g_value_transform (gst_structure_get_value (str, fieldname), fprintf (file, ";");
&tmp))) if (G_LIKELY (g_value_transform (gst_structure_get_value (str, fieldname),
fprintf (file, "%s", g_value_get_string (&tmp)); &tmp)))
else fprintf (file, "%s", g_value_get_string (&tmp));
fprintf (file, "<untranslatable>"); else
fprintf (file, "<untranslatable>");
}
} }
} }
@ -387,8 +399,9 @@ gst_measure_collector_finalize (GObject * object)
GstMeasureCollector *mc = GST_MEASURE_COLLECTOR (object); GstMeasureCollector *mc = GST_MEASURE_COLLECTOR (object);
for (i = 0; i < mc->measurements->len; i++) { for (i = 0; i < mc->measurements->len; i++) {
gst_structure_free ((GstStructure *) g_ptr_array_index (mc->measurements, if (g_ptr_array_index (mc->measurements,i) != NULL)
i)); gst_structure_free ((GstStructure *) g_ptr_array_index (mc->measurements,
i));
} }
g_ptr_array_free (mc->measurements, TRUE); g_ptr_array_free (mc->measurements, TRUE);