2015-03-19 15:41:10 (UTC-03:00)
Marcel Rodrigues <marcelgmr@gmail.com>
Add sync command.
diff --git a/srtsync.c b/srtsync.c index e3e7f91..10c9ec0 100644 --- a/srtsync.c +++ b/srtsync.c @@ -149,25 +149,31 @@ free_subs(Subtitles **subs) } void -shift(Subtitles *subs, int sign, uint32_t ms) +transform(Subtitles *subs, double factor, int sign, uint32_t offset) { int i; for (i = 0; i < subs->count; i++) { - subs->lines[i].on += sign * ms; - subs->lines[i].off += sign * ms; + subs->lines[i].on = subs->lines[i].on * factor + sign * offset; + subs->lines[i].off = subs->lines[i].off * factor + sign * offset; } } void -scale(Subtitles *subs, double factor) +sync(Subtitles *subs, int i1, uint32_t t1, int i2, uint32_t t2) { - int i; - - for (i = 0; i < subs->count; i++) { - subs->lines[i].on *= factor; - subs->lines[i].off *= factor; - } + double factor; + int32_t shift; + int sign; + uint32_t offset; + uint32_t t1_old = subs->lines[i1-1].on; + uint32_t t2_old = subs->lines[i2-1].on; + factor = ((double) (t2 - t1)) / (t2_old - t1_old); + shift = t1 - t1_old * factor; + fprintf(stderr, "scaled by %g, shifted by %gs\n", factor, shift / 1e3); + sign = shift < 0 ? -1 : +1; + offset = abs(shift); + transform(subs, factor, sign, offset); } int @@ -231,6 +237,7 @@ usage(FILE *fp) " srtsync search TIME [WORD [WORD [...]]] -- search around TIME\n" " srtsync shift (-TIME|+TIME) -- shift all subtitles by TIME\n" " srtsync scale FACTOR -- multiply all time stamps by FACTOR\n" + " srtsync sync INDEX TIME INDEX TIME -- linearly sync subtitles\n" "\n" ); } @@ -261,7 +268,7 @@ main(int argc, char *argv[]) } } else if (!strcmp(argv[1], "shift") && argc == 3) { int sign; - uint32_t ms; + uint32_t offset; char *hms = argv[2]; switch (*hms) { case '-': @@ -273,11 +280,17 @@ main(int argc, char *argv[]) default: sign = +1; } - ms = hms2ms(hms); - shift(subs, sign, ms); + offset = hms2ms(hms); + transform(subs, 1, sign, offset); } else if (!strcmp(argv[1], "scale") && argc == 3) { double factor = atof(argv[2]); - scale(subs, factor); + transform(subs, factor, 0, 0); + } else if (!strcmp(argv[1], "sync") && argc == 6) { + int i1 = atoi(argv[2]); + uint32_t t1 = hms2ms(argv[3]); + int i2 = atoi(argv[4]); + uint32_t t2 = hms2ms(argv[5]); + sync(subs, i1, t1, i2, t2); } else { usage(stderr); return 1;