media-descriptor: check if frame data matches
authorThiago Santos <thiagoss@osg.samsung.com>
Fri, 27 Nov 2015 21:05:23 +0000 (18:05 -0300)
committerThiago Santos <thiagoss@osg.samsung.com>
Fri, 4 Dec 2015 22:03:53 +0000 (19:03 -0300)
When comparing media descriptors, also check if the frames
match

https://bugzilla.gnome.org/show_bug.cgi?id=758855

validate/gst/validate/gst-validate-report.c
validate/gst/validate/gst-validate-report.h
validate/gst/validate/media-descriptor.c

index ac850a4..48e1b84 100644 (file)
@@ -299,6 +299,8 @@ gst_validate_report_load_issues (void)
       _("resulting file stream profiles didn't match expected values"), NULL);
   REGISTER_VALIDATE_ISSUE (ISSUE, FILE_TAG_DETECTION_INCORRECT,
       _("detected tags are different than expected ones"), NULL);
+  REGISTER_VALIDATE_ISSUE (CRITICAL, FILE_FRAMES_INCORRECT,
+      _("resulting file frames are not as expected"), NULL);
   REGISTER_VALIDATE_ISSUE (WARNING, FILE_NO_STREAM_INFO,
       _("the discoverer could not determine the stream info"), NULL);
   REGISTER_VALIDATE_ISSUE (WARNING, FILE_NO_STREAM_ID,
index 5a32e97..87d0e00 100644 (file)
@@ -98,6 +98,7 @@ typedef enum {
 #define FILE_DURATION_INCORRECT                  _QUARK("file-checking::duration-incorrect")
 #define FILE_SEEKABLE_INCORRECT                  _QUARK("file-checking::seekable-incorrect")
 #define FILE_PROFILE_INCORRECT                   _QUARK("file-checking::profile-incorrect")
+#define FILE_FRAMES_INCORRECT                    _QUARK("file-checking::frames-incorrect")
 
 #define ALLOCATION_FAILURE                       _QUARK("runtime::allocation-failure")
 #define MISSING_PLUGIN                           _QUARK("runtime::missing-plugin")
index 0669d32..37e70e2 100644 (file)
@@ -337,6 +337,69 @@ stream_id_is_equal (const gchar * uri, const gchar * rid, const gchar * cid)
   return FALSE;
 }
 
+static gboolean
+compare_frames (GstMediaDescriptor * ref, StreamNode * rstream,
+    FrameNode * rframe, FrameNode * cframe)
+{
+  if (rframe->id != cframe->id) {
+    GST_VALIDATE_REPORT (ref, FILE_FRAMES_INCORRECT,
+        "Stream frame %s ids mismatch: %" G_GUINT64_FORMAT " != %"
+        G_GUINT64_FORMAT, rstream->id, rframe->id, cframe->id);
+    return FALSE;
+  }
+#define CHECK_FRAME_FIELD(fieldname, format) \
+  if (rframe->fieldname != cframe->fieldname) { \
+    GST_VALIDATE_REPORT (ref, FILE_FRAMES_INCORRECT, \
+        "Stream %s frames with id %" G_GUINT64_FORMAT " have " #fieldname \
+        " mismatch. Expected " format ", got " format, rstream->id, \
+        rframe->id, rframe->fieldname, cframe->fieldname); \
+    return FALSE; \
+  }
+
+  CHECK_FRAME_FIELD (pts, "%" G_GUINT64_FORMAT);
+  CHECK_FRAME_FIELD (dts, "%" G_GUINT64_FORMAT);
+  CHECK_FRAME_FIELD (duration, "%" G_GUINT64_FORMAT);
+  CHECK_FRAME_FIELD (offset, "%" G_GUINT64_FORMAT);
+  CHECK_FRAME_FIELD (offset_end, "%" G_GUINT64_FORMAT);
+  CHECK_FRAME_FIELD (is_keyframe, "%d");
+
+  return TRUE;
+}
+
+static gboolean
+compare_frames_list (GstMediaDescriptor * ref, StreamNode * rstream,
+    StreamNode * cstream)
+{
+  GList *rframes, *cframes;
+
+  if (g_list_length (rstream->frames) != g_list_length (cstream->frames)) {
+    GST_VALIDATE_REPORT (ref, FILE_FRAMES_INCORRECT,
+        "Stream reference has %i frames, compared one has %i frames",
+        g_list_length (rstream->frames), g_list_length (cstream->frames));
+    return FALSE;
+  }
+
+  for (rframes = rstream->frames, cframes = cstream->frames; rframes;
+      rframes = g_list_next (rframes), cframes = g_list_next (cframes)) {
+    FrameNode *rframe, *cframe;
+
+    if (cframes == NULL) {
+      /* The list was checked to be of the same size */
+      g_assert_not_reached ();
+      return FALSE;
+    }
+
+    rframe = rframes->data;
+    cframe = cframes->data;
+
+    if (!compare_frames (ref, rstream, rframe, cframe)) {
+      return FALSE;
+    }
+  }
+
+  return TRUE;
+}
+
 /*  Return -1 if not found 1 if OK 0 if an error occured */
 static gint
 compare_streams (GstMediaDescriptor * ref, StreamNode * rstream,
@@ -358,7 +421,9 @@ compare_streams (GstMediaDescriptor * ref, StreamNode * rstream,
     /* We ignore the return value on purpose as this is not critical */
     compare_tags (ref, rstream, cstream);
 
-    return 1;
+    if (compare_frames_list (ref, rstream, cstream))
+      return 1;
+    return 0;
   }
 
   return -1;