[FFmpeg-devel] [PATCH v4] avformat/utils: add helper functions to retrieve index entries from an AVStream
James Almer
jamrial at gmail.com
Tue Apr 6 21:34:45 EEST 2021
On 4/3/2021 8:12 PM, James Almer wrote:
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
> Now using the avformat_ prefix as Anton requested. I forgot about it when i
> made v3.
Will apply soon if there are no objections.
>
> libavformat/avformat.h | 39 +++++++++++++++++++++++++++++++++++++++
> libavformat/utils.c | 27 +++++++++++++++++++++++++++
> 2 files changed, 66 insertions(+)
>
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index 6a9b09160c..a1e87ef891 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -2767,6 +2767,45 @@ int av_find_default_stream_index(AVFormatContext *s);
> */
> int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags);
>
> +/**
> + * Get the index entry count for the given AVStream.
> + *
> + * @param st stream
> + * @return the number of index entries in the stream
> + */
> +int avformat_index_get_entries_count(AVStream *st);
> +
> +/**
> + * Get the AVIndexEntry corresponding to the given index.
> + *
> + * @param st Stream containing the requested AVIndexEntry.
> + * @param idx The desired index.
> + * @return A pointer to the requested AVIndexEntry if it exists, NULL otherwise.
> + *
> + * @note The pointer returned by this function is only guaranteed to be valid
> + * until any function that could alter the stream or the AVFormatContext
> + * that cointains it is called.
> + */
> +const AVIndexEntry *avformat_index_get_entry(AVStream *st, int idx);
> +
> +/**
> + * Get the AVIndexEntry corresponding to the given timestamp.
> + *
> + * @param st Stream containing the requested AVIndexEntry.
> + * @param timestamp Timestamp to retrieve the index entry for.
> + * @param flags If AVSEEK_FLAG_BACKWARD then the returned entry will correspond
> + * to the timestamp which is <= the requested one, if backward
> + * is 0, then it will be >=
> + * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise.
> + * @return A pointer to the requested AVIndexEntry if it exists, NULL otherwise.
> + *
> + * @note The pointer returned by this function is only guaranteed to be valid
> + * until any function that could alter the stream or the AVFormatContext
> + * that cointains it is called.
> + */
> +const AVIndexEntry *avformat_index_get_entry_from_timestamp(AVStream *st,
> + int64_t wanted_timestamp,
> + int flags);
> /**
> * Add an index entry into a sorted list. Update the entry if the list
> * already contains it.
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index e9bf31e38b..942d7c8390 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -2176,6 +2176,33 @@ int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
> wanted_timestamp, flags);
> }
>
> +int avformat_index_get_entries_count(AVStream *st)
> +{
> + return st->internal->nb_index_entries;
> +}
> +
> +const AVIndexEntry *avformat_index_get_entry(AVStream *st, int idx)
> +{
> + if (idx < 0 || idx >= st->internal->nb_index_entries)
> + return NULL;
> +
> + return &st->internal->index_entries[idx];
> +}
> +
> +const AVIndexEntry *avformat_index_get_entry_from_timestamp(AVStream *st,
> + int64_t wanted_timestamp,
> + int flags)
> +{
> + int idx = ff_index_search_timestamp(st->internal->index_entries,
> + st->internal->nb_index_entries,
> + wanted_timestamp, flags);
> +
> + if (idx < 0)
> + return NULL;
> +
> + return &st->internal->index_entries[idx];
> +}
> +
> static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
> int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
> {
>
More information about the ffmpeg-devel
mailing list