From: Gerhard Sittig Date: Mon, 13 Mar 2017 12:17:05 +0000 (+0100) Subject: input/vcd: fixup VCD timestamp to sigrok samplenum mapping X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=f9bc17d4c0a23cb07065ece11f5c71facdba4eb2;p=libsigrok.git input/vcd: fixup VCD timestamp to sigrok samplenum mapping 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. --- diff --git a/src/input/vcd.c b/src/input/vcd.c index 8d6edd1d..bf203193 100644 --- a/src/input/vcd.c +++ b/src/input/vcd.c @@ -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') { /*