]> sigrok.org Git - libsigrok.git/commitdiff
input/vcd: fixup VCD timestamp to sigrok samplenum mapping
authorGerhard Sittig <redacted>
Mon, 13 Mar 2017 12:17:05 +0000 (13:17 +0100)
committerUwe Hermann <redacted>
Fri, 22 Dec 2017 10:47:03 +0000 (11:47 +0100)
When processing of large VCD input files was spread across multiple
parse_contents() invocations, the resulting sigrok stream of sample data
had gaps in them and total timing was off. For instance 74ms of input
data were interpreted as spanning some 600ms or 300ms, depending on the
number of channels in the input stream.

Move the "previous timestamp" variable to the input module context. This
eliminates the inappropriate gaps and fixes the translation of VCD file
timestamps to sigrok sample numbers.

This fixes bug #1075.

src/input/vcd.c

index 8d6edd1dcc77594ea31f6cab8c489c1c974a48aa..bf203193ef6ef06ea83ad1fe22083b83ba913b2a 100644 (file)
@@ -72,6 +72,7 @@
 struct context {
        gboolean started;
        gboolean got_header;
+       uint64_t prev_timestamp;
        uint64_t samplerate;
        unsigned int maxchannels;
        unsigned int channelcount;
@@ -367,12 +368,11 @@ static void process_bit(struct context *inc, char *identifier, unsigned int bit)
 static void parse_contents(const struct sr_input *in, char *data)
 {
        struct context *inc;
-       uint64_t timestamp, prev_timestamp;
+       uint64_t timestamp;
        unsigned int bit, i;
        char **tokens;
 
        inc = in->priv;
-       prev_timestamp = 0;
 
        /* Read one space-delimited token at a time. */
        tokens = g_strsplit_set(data, " \t\r\n", 0);
@@ -399,22 +399,22 @@ static void parse_contents(const struct sr_input *in, char *data)
                         */
                        if (inc->skip < 0) {
                                inc->skip = timestamp;
-                               prev_timestamp = timestamp;
+                               inc->prev_timestamp = timestamp;
                        } else if (inc->skip > 0 && timestamp < (uint64_t)inc->skip) {
-                               prev_timestamp = inc->skip;
-                       } else if (timestamp == prev_timestamp) {
+                               inc->prev_timestamp = inc->skip;
+                       } else if (timestamp == inc->prev_timestamp) {
                                /* Ignore repeated timestamps (e.g. sigrok outputs these) */
                        } else {
-                               if (inc->compress != 0 && timestamp - prev_timestamp > inc->compress) {
+                               if (inc->compress != 0 && timestamp - inc->prev_timestamp > inc->compress) {
                                        /* Compress long idle periods */
-                                       prev_timestamp = timestamp - inc->compress;
+                                       inc->prev_timestamp = timestamp - inc->compress;
                                }
 
                                sr_dbg("New timestamp: %" PRIu64, timestamp);
 
                                /* Generate samples from prev_timestamp up to timestamp - 1. */
-                               add_samples(in, timestamp - prev_timestamp);
-                               prev_timestamp = timestamp;
+                               add_samples(in, timestamp - inc->prev_timestamp);
+                               inc->prev_timestamp = timestamp;
                        }
                } else if (tokens[i][0] == '$' && tokens[i][1] != '\0') {
                        /*