[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