[FFmpeg-devel] [PATCH 1/2] lavf/subtitles: add ff_subtitles_queue_seek().
Michael Niedermayer
michaelni at gmx.at
Sun Nov 25 19:44:38 CET 2012
On Fri, Nov 23, 2012 at 09:45:01PM +0100, Clément Bœsch wrote:
> This function is almost identical to lavf/assdec:read_seek2(). It
> performs a generic seek for text subtitles demuxers for the new seeking
> API.
>
> The seek callback in the ASS demuxer will be removed when it is
> redesigned to use FFDemuxSubtitlesQueue.
> ---
> libavformat/subtitles.c | 38 ++++++++++++++++++++++++++++++++++++++
> libavformat/subtitles.h | 7 +++++++
> 2 files changed, 45 insertions(+)
>
> diff --git a/libavformat/subtitles.c b/libavformat/subtitles.c
> index 1204526..3661495 100644
> --- a/libavformat/subtitles.c
> +++ b/libavformat/subtitles.c
> @@ -91,6 +91,44 @@ int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt)
> return 0;
> }
>
> +int ff_subtitles_queue_seek(FFDemuxSubtitlesQueue *q, AVFormatContext *s, int stream_index,
> + int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
> +{
> + if (flags & AVSEEK_FLAG_BYTE) {
> + return AVERROR(ENOSYS);
> + } else if (flags & AVSEEK_FLAG_FRAME) {
> + if (ts < 0 || ts >= q->nb_subs)
> + return AVERROR(ERANGE);
> + q->current_sub_idx = 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: q->subs[] is sorted by pts so we could do a binary search */
> + for (i = 0; i < q->nb_subs; i++) {
> + int64_t pts = q->subs[i].pts;
> + int64_t ts_diff = FFABS(pts - ts);
this needs to be unsigned to avoid overflow
> + if (pts >= min_ts && pts <= max_ts && ts_diff < min_ts_diff) {
> + min_ts_diff = ts_diff;
> + idx = i;
> + }
iam not sure this is correct, please correct me if i misunderstand
something.
consider there are subtitles, first one displays from 2 to 10 second
second one displays from 5 to 18 seconds
if you want to seek to second 8 you actually need to seek to 2 to
get both displayed at your target
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
No great genius has ever existed without some touch of madness. -- Aristotle
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20121125/8a062415/attachment.asc>
More information about the ffmpeg-devel
mailing list