+int avpriv_packet_list_put(PacketList **packet_buffer,
+ PacketList **plast_pktl,
+ AVPacket *pkt,
+ int (*copy)(AVPacket *dst, const AVPacket *src),
+ int flags)
+{
+ PacketList *pktl = av_mallocz(sizeof(PacketList));
+ int ret;
+
+ if (!pktl)
+ return AVERROR(ENOMEM);
+
+ if (copy) {
+ ret = copy(&pktl->pkt, pkt);
+ if (ret < 0) {
+ av_free(pktl);
+ return ret;
+ }
+ } else {
+ ret = av_packet_make_refcounted(pkt);
+ if (ret < 0) {
+ av_free(pktl);
+ return ret;
+ }
+ av_packet_move_ref(&pktl->pkt, pkt);
+ }
+
+ if (*packet_buffer)
+ (*plast_pktl)->next = pktl;
+ else
+ *packet_buffer = pktl;
+
+ /* Add the packet in the buffered packet list. */
+ *plast_pktl = pktl;
+ return 0;
+}
+
+int avpriv_packet_list_get(PacketList **pkt_buffer,
+ PacketList **pkt_buffer_end,
+ AVPacket *pkt)
+{
+ PacketList *pktl;
+ if (!*pkt_buffer)
+ return AVERROR(EAGAIN);
+ pktl = *pkt_buffer;
+ *pkt = pktl->pkt;
+ *pkt_buffer = pktl->next;
+ if (!pktl->next)
+ *pkt_buffer_end = NULL;
+ av_freep(&pktl);
+ return 0;
+}
+
+void avpriv_packet_list_free(PacketList **pkt_buf, PacketList **pkt_buf_end)
+{
+ PacketList *tmp = *pkt_buf;
+
+ while (tmp) {
+ PacketList *pktl = tmp;
+ tmp = pktl->next;
+ av_packet_unref(&pktl->pkt);
+ av_freep(&pktl);
+ }
+ *pkt_buf = NULL;
+ *pkt_buf_end = NULL;
+}
+