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 * 3600 + minutes * 60 + seconds) * AV_TIME_BASE;
+ *rtime = av_sat_add64((hours * 3600LL + minutes * 60LL) * AV_TIME_BASE, ts);
return cur - str;
}
while (lex_char(p, '+')) {
if (!lex_time(p, &dt))
return AVERROR_INVALIDDATA;
+ if (av_sat_add64(rel, dt) - dt != rel)
+ return AVERROR_INVALIDDATA;
rel += dt;
r = 1;
}
return AVERROR_INVALIDDATA;
}
ts.type = p->current_time.type;
+
+ if (av_sat_add64(p->current_time.t, rel_ts) != p->current_time.t + (uint64_t)rel_ts)
+ return AVERROR_INVALIDDATA;
ts.t = p->current_time.t + rel_ts;
r = parse_fade(p, &fade);
if (r < 0)
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)
static int encode_intervals(struct sbg_script *s, AVCodecParameters *par,
struct ws_intervals *inter)
{
- int i, edata_size = 4;
+ int i, edata_size = 4, ret;
uint8_t *edata;
for (i = 0; i < inter->nb_inter; i++) {
if (edata_size < 0)
return AVERROR(ENOMEM);
}
- if (ff_alloc_extradata(par, edata_size))
- return AVERROR(ENOMEM);
+ if ((ret = ff_alloc_extradata(par, edata_size)) < 0)
+ return ret;
edata = par->extradata;
#define ADD_EDATA32(v) do { AV_WL32(edata, (v)); edata += 4; } while(0)
return 0;
}
-static av_cold int sbg_read_probe(AVProbeData *p)
+static av_cold int sbg_read_probe(const AVProbeData *p)
{
int r, score;
struct sbg_script script = { 0 };
if (r < 0)
goto fail;
+ if (script.end_ts != AV_NOPTS_VALUE && script.end_ts < script.start_ts) {
+ r = AVERROR_INVALIDDATA;
+ goto fail;
+ }
+
st = avformat_new_stream(avf, NULL);
if (!st)
return AVERROR(ENOMEM);
static int sbg_read_packet(AVFormatContext *avf, AVPacket *packet)
{
int64_t ts, end_ts;
+ int ret;
ts = avf->streams[0]->cur_dts;
end_ts = ts + avf->streams[0]->codecpar->frame_size;
end_ts);
if (end_ts <= ts)
return AVERROR_EOF;
- if (av_new_packet(packet, 12) < 0)
- return AVERROR(ENOMEM);
+ if ((ret = av_new_packet(packet, 12)) < 0)
+ return ret;
packet->dts = packet->pts = ts;
packet->duration = end_ts - ts;
AV_WL64(packet->data + 0, ts);