[vlc-devel] [V2 15/16] lib: Add a minimal picture list API

Hugo Beauzée-Luyssen hugo at beauzee.fr
Fri Nov 13 11:27:31 CET 2020


---
 include/vlc/libvlc_picture.h | 22 +++++++++++++++++
 lib/libvlc.sym               |  3 +++
 lib/picture.c                | 48 ++++++++++++++++++++++++++++++++++++
 lib/picture_internal.h       |  3 +++
 4 files changed, 76 insertions(+)

diff --git a/include/vlc/libvlc_picture.h b/include/vlc/libvlc_picture.h
index 07fbf11fc2..d54d495a25 100644
--- a/include/vlc/libvlc_picture.h
+++ b/include/vlc/libvlc_picture.h
@@ -28,6 +28,7 @@ extern "C" {
 # endif
 
 typedef struct libvlc_picture_t libvlc_picture_t;
+typedef struct libvlc_picture_list_t libvlc_picture_list_t;
 
 typedef enum libvlc_picture_type_t
 {
@@ -120,6 +121,27 @@ libvlc_picture_get_height( const libvlc_picture_t* pic );
 LIBVLC_API libvlc_time_t
 libvlc_picture_get_time( const libvlc_picture_t* pic );
 
+/**
+ * Returns the number of pictures in the list
+ */
+LIBVLC_API size_t libvlc_picture_list_nb_pictures( const libvlc_picture_list_t* list );
+
+/**
+ * Returns the picture at the provided index.
+ *
+ * If the index is out of bound, the result is undefined.
+ */
+LIBVLC_API libvlc_picture_t* libvlc_picture_list_at( const libvlc_picture_list_t* list,
+                                                     size_t index );
+
+/**
+ * Destroys a picture list and releases the pictures it contains
+ * \param list The list to destroy
+ *
+ * Calling this function with a NULL list is safe and will return immediatly
+ */
+LIBVLC_API void libvlc_picture_list_destroy( libvlc_picture_list_t* list );
+
 # ifdef __cplusplus
 }
 # endif
diff --git a/lib/libvlc.sym b/lib/libvlc.sym
index ebdd2db629..a6034392b2 100644
--- a/lib/libvlc.sym
+++ b/lib/libvlc.sym
@@ -288,3 +288,6 @@ libvlc_picture_get_stride
 libvlc_picture_get_width
 libvlc_picture_get_height
 libvlc_picture_get_time
+libvlc_picture_list_at
+libvlc_picture_list_nb_pictures
+libvlc_picture_list_destroy
diff --git a/lib/picture.c b/lib/picture.c
index 7eddb0efb0..b30f9784ae 100644
--- a/lib/picture.c
+++ b/lib/picture.c
@@ -195,3 +195,51 @@ libvlc_time_t libvlc_picture_get_time( const libvlc_picture_t* pic )
 {
     return pic->time;
 }
+
+libvlc_picture_list_t* libvlc_picture_list_from_attachments( input_item_attachment_t** attachments,
+                                                             size_t nb_attachments )
+{
+    size_t size = 0;
+    libvlc_picture_list_t* list;
+    if ( mul_overflow( nb_attachments, sizeof( libvlc_picture_t* ), &size ) )
+        return NULL;
+    if ( add_overflow( size, sizeof( *list ), &size ) )
+        return NULL;
+
+    list = malloc( size );
+    if ( !list )
+        return NULL;
+    list->count = 0;
+    for ( size_t i = 0; i < nb_attachments; ++i )
+    {
+        input_item_attachment_t* a = attachments[i];
+        libvlc_picture_t *pic = libvlc_picture_from_attachment( a );
+        if( !pic )
+            continue;
+        list->pictures[list->count] = pic;
+        list->count++;
+    }
+    return list;
+}
+
+size_t libvlc_picture_list_nb_pictures( const libvlc_picture_list_t* list )
+{
+    assert( list );
+    return list->count;
+}
+
+libvlc_picture_t* libvlc_picture_list_at( const libvlc_picture_list_t* list,
+                                          size_t index )
+{
+    assert( list );
+    return list->pictures[index];
+}
+
+void libvlc_picture_list_destroy( libvlc_picture_list_t* list )
+{
+    if ( !list )
+        return;
+    for ( size_t i = 0; i < list->count; ++i )
+        libvlc_picture_release( list->pictures[i] );
+    free( list );
+}
diff --git a/lib/picture_internal.h b/lib/picture_internal.h
index aeb1e3f505..270989e142 100644
--- a/lib/picture_internal.h
+++ b/lib/picture_internal.h
@@ -44,4 +44,7 @@ libvlc_picture_t* libvlc_picture_new( vlc_object_t* p_obj, picture_t* p_pic,
                                       unsigned int i_width, unsigned int i_height,
                                       bool b_crop );
 
+libvlc_picture_list_t* libvlc_picture_list_from_attachments( input_item_attachment_t** attachments,
+                                                             size_t nb_attachments );
+
 #endif /* PICTURE_INTERNAL_H */
-- 
2.29.2



More information about the vlc-devel mailing list