diff mbox series

[FFmpeg-devel,v3] avformat/utils: add helper functions to retrieve index entries from an AVStream

Message ID 20210403163725.1078-1-jamrial@gmail.com
State Accepted
Headers show
Series [FFmpeg-devel,v3] avformat/utils: add helper functions to retrieve index entries from an AVStream | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

James Almer April 3, 2021, 4:37 p.m. UTC
Signed-off-by: James Almer <jamrial@gmail.com>
---
Now returning a pointer to the requested entry.

 libavformat/avformat.h | 38 ++++++++++++++++++++++++++++++++++++++
 libavformat/utils.c    | 26 ++++++++++++++++++++++++++
 2 files changed, 64 insertions(+)
diff mbox series

Patch

diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 6a9b09160c..39371ea6d8 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -2767,6 +2767,44 @@  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 av_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 *av_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.
+ *
+ * @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 *av_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..812237c57e 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2176,6 +2176,32 @@  int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
                                      wanted_timestamp, flags);
 }
 
+int av_index_get_entries_count(AVStream *st)
+{
+    return st->internal->nb_index_entries;
+}
+
+const AVIndexEntry *av_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 *av_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 ))
 {