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)
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)
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);