add seeking support in ASS demuxer

Originally committed as revision 24578 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Aurelien Jacobs 2010-07-29 22:10:22 +00:00
parent 530bbe96c7
commit ac066b83e9
1 changed files with 41 additions and 1 deletions

View File

@ -162,6 +162,46 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt)
return 0;
}
static int read_seek2(AVFormatContext *s, int stream_index,
int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
{
ASSContext *ass = s->priv_data;
if (flags & AVSEEK_FLAG_BYTE) {
return AVERROR_NOTSUPP;
} else if (flags & AVSEEK_FLAG_FRAME) {
if (ts < 0 || ts >= ass->event_count)
return AVERROR(ERANGE);
ass->event_index = ts;
} else {
int i, idx = -1;
int64_t min_ts_diff = INT64_MAX;
if (stream_index == -1) {
AVRational time_base = s->streams[0]->time_base;
ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
min_ts = av_rescale_rnd(min_ts, time_base.den,
time_base.num * (int64_t)AV_TIME_BASE,
AV_ROUND_UP);
max_ts = av_rescale_rnd(max_ts, time_base.den,
time_base.num * (int64_t)AV_TIME_BASE,
AV_ROUND_DOWN);
}
/* TODO: ass->event[] is sorted by pts so we could do a binary search */
for (i=0; i<ass->event_count; i++) {
int64_t pts = get_pts(ass->event[i]);
int64_t ts_diff = FFABS(pts - ts);
if (pts >= min_ts && pts <= max_ts && ts_diff < min_ts_diff) {
min_ts_diff = ts_diff;
idx = i;
}
}
if (idx < 0)
return AVERROR(ERANGE);
ass->event_index = idx;
}
return 0;
}
AVInputFormat ass_demuxer = {
"ass",
NULL_IF_CONFIG_SMALL("Advanced SubStation Alpha subtitle format"),
@ -170,5 +210,5 @@ AVInputFormat ass_demuxer = {
read_header,
read_packet,
read_close,
// read_seek,
.read_seek2 = read_seek2,
};