[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