X-Git-Url: https://git.distorted.org.uk/~mdw/dvdrip/blobdiff_plain/7763378f512e3123c1eaa489f7baff1aef8c5e55..4789962fccede0a14e89e7080f858e378645e74a:/dvd-sector-copy.c diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index 3c779bf..4543296 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -730,16 +730,16 @@ static ssize_t find_good_sector(secaddr *pos_inout, secaddr end, if (n == want) good = pos; else bad_hi = pos + n + 1; } - recovered(bad_lo, bad_hi); *pos_inout = good; - if (good < r.pos + r.start || r.pos + r.end <= good) + recovered(bad_lo, bad_hi); *pos_inout = bad_hi; + if (bad_hi < r.pos + r.start || r.pos + r.end <= bad_hi) n = 0; else { - n = r.pos + r.end - good; - rearrange_sectors(&r, 0, good - r.pos, n); + n = r.pos + r.end - bad_hi; + rearrange_sectors(&r, 0, bad_hi - r.pos, n); } #ifdef DEBUG show_recovery_buffer_map(&r, "returning %zd good sectors at %"PRIuSEC"", - n, good); + n, bad_hi); #endif return (n); } @@ -861,38 +861,6 @@ static int read_line(FILE *fp, struct buf *b) return (0); } -static double parse_float(const char **p_inout, double min, double max, - const char *what) -{ - const char *p; - char *q; - double x; - int err; - - err = errno; errno = 0; - p = *p_inout; - x = strtod(p, &q); - if (errno || x < min || x > max) bail("bad %s `%s'", what, p); - *p_inout = q; errno = err; - return (x); -} - -static long parse_int(const char **p_inout, long min, long max, - const char *what) -{ - const char *p; - char *q; - long x; - int err; - - err = errno; errno = 0; - p = *p_inout; - x = strtoul(p, &q, 0); - if (errno || x < min || x > max) bail("bad %s `%s'", what, p); - *p_inout = q; errno = err; - return (x); -} - #define PRF_HYPHEN 1u static int parse_range(const char *p, unsigned f, secaddr *start_out, secaddr *end_out) @@ -936,6 +904,39 @@ end: return (rc); } +#ifdef DEBUG +static void dump_eventq(const char *what) +{ + unsigned i; + const struct event *ev; + char fn[MAXFNSZ]; + + printf("\n;; event dump (%s):\n", what); + for (i = 0; i < eventq.n; i++) { + ev = &eventq.v[i]; + switch (ev->ev) { + case EV_BEGIN: + store_filename(fn, filetab.v[ev->file].id); + printf(";; %8"PRIuSEC": begin %s\n", ev->pos, fn); + break; + case EV_END: + store_filename(fn, filetab.v[ev->file].id); + printf(";; %8"PRIuSEC": end %s\n", ev->pos, fn); + break; + case EV_WRITE: + printf(";; %8"PRIuSEC": write\n", ev->pos); + break; + case EV_STOP: + printf(";; %8"PRIuSEC": stop\n", ev->pos); + break; + default: + printf(";; %8"PRIuSEC": ?%u\n", ev->pos, ev->ev); + break; + } + } +} +#endif + int main(int argc, char *argv[]) { unsigned f = 0; @@ -979,25 +980,33 @@ int main(int argc, char *argv[]) (STRNCMP(p, ==, s "=", sizeof(s)) && (p += sizeof(s), 1)) for (;;) { if (SKIP_PREFIX("cf")) - clear_factor = parse_float(&p, 0, DBL_MAX, "clear factor"); + clear_factor = parse_float(&p, PNF_JUNK, 0, DBL_MAX, + "clear factor"); else if (SKIP_PREFIX("cmin")) - clear_min = parse_int(&p, 1, SECLIMIT, "clear minimum"); + clear_min = parse_int(&p, PNF_JUNK, 1, SECLIMIT, + "clear minimum"); else if (SKIP_PREFIX("cmax")) - clear_max = parse_int(&p, 1, SECLIMIT, "clear maximum"); + clear_max = parse_int(&p, PNF_JUNK, 1, SECLIMIT, + "clear maximum"); else if (SKIP_PREFIX("sf")) - step_factor = parse_float(&p, 0, DBL_MAX, "step factor"); + step_factor = parse_float(&p, PNF_JUNK, 0, DBL_MAX, + "step factor"); else if (SKIP_PREFIX("smin")) - step_min = parse_int(&p, 1, SECLIMIT - 1, "step minimum"); + step_min = parse_int(&p, PNF_JUNK, 1, SECLIMIT - 1, + "step minimum"); else if (SKIP_PREFIX("smax")) - step_max = parse_int(&p, 1, SECLIMIT - 1, "step maximum"); + step_max = parse_int(&p, PNF_JUNK, 1, SECLIMIT - 1, + "step maximum"); else if (SKIP_PREFIX("retry")) - max_retries = parse_int(&p, 0, INT_MAX, "retries"); + max_retries = parse_int(&p, PNF_JUNK, 0, INT_MAX, "retries"); else if (SKIP_PREFIX("alpha")) - alpha = parse_float(&p, 0, 1, "average decay factor"); + alpha = parse_float(&p, PNF_JUNK, 0, 1, "average decay factor"); else if (SKIP_PREFIX("_badwait")) - bad_block_delay = parse_float(&p, 0, DBL_MAX, "bad-block delay"); + bad_block_delay = parse_float(&p, PNF_JUNK, 0, DBL_MAX, + "bad-block delay"); else if (SKIP_PREFIX("_blkwait")) - good_block_delay = parse_float(&p, 0, DBL_MAX, "good block delay"); + good_block_delay = parse_float(&p, PNF_JUNK, 0, DBL_MAX, + "good block delay"); else bail("unknown bad blocks parameter `%s'", p); if (!*p) break; @@ -1141,7 +1150,8 @@ int main(int argc, char *argv[]) for (i = 0; i < filetab.n; i++) { file = &filetab.v[i]; store_filename(fn, file->id); - printf(";;\t%8"PRIuSEC" %s\n", file->start, fn); + printf(";;\t%8"PRIuSEC" .. %-8"PRIuSEC" %s\n", + file->start, file->end, fn); } #endif @@ -1153,7 +1163,8 @@ int main(int argc, char *argv[]) switch (ev->ev) { case EV_WRITE: if (f&f_write) - bail("overlapping ranges: range from %"PRIuSEC" still open at %"PRIuSEC"", + bail("overlapping ranges: range from %"PRIuSEC" " + "still open at %"PRIuSEC"", start, ev->pos); f |= f_write; start = ev->pos; break; @@ -1163,17 +1174,21 @@ int main(int argc, char *argv[]) } } +#ifdef DEBUG + dump_eventq("initial"); +#endif f &= ~f_write; start = 0; for (i = 0; i < eventq.n; i++) { ev = &eventq.v[i]; - switch (ev->ev) { - case EV_WRITE: start = ev->pos; f |= f_write; break; - case EV_STOP: nsectors += ev->pos - start; f &= ~f_write; break; - } + if (ev->ev == EV_WRITE) { start = ev->pos; f |= f_write; } if (ev->pos >= limit) break; + if (ev->ev == EV_STOP) { nsectors += ev->pos - start; f &= ~f_write; } if (f&f_fixup) start = ev->pos; } eventq.n = i; +#ifdef DEBUG + dump_eventq("trimmed"); +#endif if (f&f_fixup) { put_event(EV_WRITE, 0, start); f |= f_write; @@ -1182,6 +1197,9 @@ int main(int argc, char *argv[]) nsectors += limit - start; put_event(EV_STOP, 0, limit); } +#ifdef DEBUG + dump_eventq("final"); +#endif copy_progress.render = render_copy_progress; progress_additem(&progress, ©_progress); @@ -1256,7 +1274,7 @@ int main(int argc, char *argv[]) if (f&f_stats) { gettimeofday(&tv1, 0); t = tvdiff(&tv0, &tv1); - if (nsectors == limit - start) { ndone -= start; nsectors -= start; } + if (nsectors == limit) { ndone -= start; nsectors -= start; } tot = scale_bytes((double)nsectors*SECTORSZ, &totunit); rate = scale_bytes((double)nsectors*SECTORSZ/t, &rateunit); moan("all done: %.1f %sB in %s -- %.1f %sB/s",