char *end;
int hours, minutes;
double seconds = 0;
+ int64_t ts = 0;
if (*cur < '0' || *cur > '9')
return 0;
seconds = strtod(cur + 1, &end);
if (end > cur + 1)
cur = end;
+ ts = av_clipd(seconds * AV_TIME_BASE, INT64_MIN/2, INT64_MAX/2);
}
- *rtime = (hours * 3600LL + minutes * 60LL + seconds) * AV_TIME_BASE;
+ *rtime = av_sat_add64((hours * 3600LL + minutes * 60LL) * AV_TIME_BASE, ts);
return cur - str;
}
return size;
}
-static void expand_timestamps(void *log, struct sbg_script *s)
+static int expand_timestamps(void *log, struct sbg_script *s)
{
int i, nb_rel = 0;
int64_t now, cur_ts, delta = 0;
AV_NOPTS_VALUE; /* may be overridden later by -E option */
cur_ts = now;
for (i = 0; i < s->nb_tseq; i++) {
+ if (av_sat_add64(s->tseq[i].ts.t, delta) != s->tseq[i].ts.t + (uint64_t)delta)
+ return AVERROR_INVALIDDATA;
if (s->tseq[i].ts.t + delta < cur_ts)
delta += DAY_TS;
cur_ts = s->tseq[i].ts.t += delta;
}
+ return 0;
}
static int expand_tseq(void *log, struct sbg_script *s, int *nb_ev_max,
{
int i, r, nb_events_max = 0;
- expand_timestamps(log, s);
+ r = expand_timestamps(log, s);
+ if (r < 0)
+ return r;
for (i = 0; i < s->nb_tseq; i++) {
r = expand_tseq(log, s, &nb_events_max, 0, &s->tseq[i]);
if (r < 0)