[FFmpeg-devel] [PATCH v4] avformat/utils: add helper functions to retrieve index entries from an AVStream
Andreas Rheinhardt
andreas.rheinhardt at outlook.com
Tue Apr 6 21:46:20 EEST 2021
James Almer:
> 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.
>
I wonder whether the AVStream *st should be const; together with a
guarantee that calling these functions does not invalidate entries that
have been returned earlier.
>>
>> Â 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);
An int? Not something unsigned?
>> +
>> +/**
>> + * 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.
^
typo
>> + */
>> +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.
^
same typo
>> + */
>> +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 ))
>> Â {
>>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list