[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 22:09:25 EEST 2021


On 4/6/2021 3:46 PM, Andreas Rheinhardt wrote:
> 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.

Sure, will make it const.

> 
>>>
>>>    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?

st->internal->nb_index_entries is an int, and 
av_index_search_timestamp() returns an int, too, so I'm inclined to 
leave it as is.

> 
>>> +
>>> +/**
>>> + * 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

Both fixed locally.

>>> + */
>>> +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".
> 
> _______________________________________________
> 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