[FFmpeg-devel] [PATCH v4 2/3] avcodec/avpacket: add functionality to prepend to AVPacketLists

Jan Ekström jeebjp at gmail.com
Thu Oct 24 15:26:51 EEST 2024


From: Jan Ekström <jan.ekstrom at 24i.com>

Signed-off-by: Jan Ekström <jan.ekstrom at 24i.com>
---
 libavcodec/packet.c          | 20 +++++++++++++++-----
 libavcodec/packet_internal.h |  2 ++
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/libavcodec/packet.c b/libavcodec/packet.c
index 381001fd65..a6302340bb 100644
--- a/libavcodec/packet.c
+++ b/libavcodec/packet.c
@@ -546,6 +546,7 @@ int avpriv_packet_list_put(PacketList *packet_buffer,
                            int flags)
 {
     PacketListEntry *pktl = av_malloc(sizeof(*pktl));
+    unsigned int update_end_point = 1;
     int ret;
 
     if (!pktl)
@@ -569,13 +570,22 @@ int avpriv_packet_list_put(PacketList *packet_buffer,
 
     pktl->next = NULL;
 
-    if (packet_buffer->head)
-        packet_buffer->tail->next = pktl;
-    else
+    if (packet_buffer->head) {
+        if (flags & FF_PACKETLIST_FLAG_PREPEND) {
+            pktl->next = packet_buffer->head;
+            packet_buffer->head = pktl;
+            update_end_point = 0;
+        } else {
+            packet_buffer->tail->next = pktl;
+        }
+    } else
         packet_buffer->head = pktl;
 
-    /* Add the packet in the buffered packet list. */
-    packet_buffer->tail = pktl;
+    if (update_end_point) {
+        /* Add the packet in the buffered packet list. */
+        packet_buffer->tail = pktl;
+    }
+
     return 0;
 }
 
diff --git a/libavcodec/packet_internal.h b/libavcodec/packet_internal.h
index 52fa6d9be9..9c0f4fead5 100644
--- a/libavcodec/packet_internal.h
+++ b/libavcodec/packet_internal.h
@@ -34,6 +34,8 @@ typedef struct PacketList {
     PacketListEntry *head, *tail;
 } PacketList;
 
+#define FF_PACKETLIST_FLAG_PREPEND (1 << 0) /**< Prepend created AVPacketList instead of appending */
+
 /**
  * Append an AVPacket to the list.
  *
-- 
2.47.0



More information about the ffmpeg-devel mailing list