On Wed, 18 Nov 2020, James Almer wrote:

Signed-off-by: James Almer <jamr...@gmail.com>
---
I don't know if this is necessary, so i'm sending it as an RFC.

I don't think this API should provide locking by default, maybe as an option. But considering that it was not often needed so far, and the API can be wrapped into locked versions (like decklink does) relatively easily, I think it is fine as is.

Regards,
Marton


libavcodec/avpacket.c        | 34 +++++++++++++++++++++++++++++++---
libavcodec/packet_internal.h |  2 ++
2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index 0db47c1d62..a8e934913e 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -807,6 +807,8 @@ AVPacketList *av_packet_list_alloc(void)
    if (!pktl)
        return NULL;

+    ff_mutex_init(&pktl->mutex, NULL);
+
    return (AVPacketList *)pktl;
}

@@ -840,6 +842,7 @@ int av_packet_list_put(AVPacketList *list, AVPacket *pkt,
        av_packet_move_ref(&pktle->pkt, pkt);
    }

+    ff_mutex_lock(&pktl->mutex);
    if (pktl->head)
        pktl->tail->next = pktle;
    else
@@ -847,6 +850,7 @@ int av_packet_list_put(AVPacketList *list, AVPacket *pkt,

    /* Add the packet in the buffered packet list. */
    pktl->tail = pktle;
+    ff_mutex_unlock(&pktl->mutex);

    return 0;
}
@@ -861,8 +865,11 @@ int av_packet_list_get(AVPacketList *list, AVPacket *pkt,
    AVPacketList *pktl = list;
#endif

-    if (!pktl->head)
+    ff_mutex_lock(&pktl->mutex);
+    if (!pktl->head) {
+        ff_mutex_unlock(&pktl->mutex);
        return AVERROR(EAGAIN);
+    }

    pktle      = pktl->head;
    if (pkt)
@@ -873,6 +880,7 @@ int av_packet_list_get(AVPacketList *list, AVPacket *pkt,

    if (!pktle->next)
        pktl->tail = NULL;
+    ff_mutex_unlock(&pktl->mutex);

    av_freep(&pktle);

@@ -891,14 +899,20 @@ int av_packet_list_peek(AVPacketList *list, AVPacket *pkt,
    AVPacket tmp = { 0 };
    int ret;

-    if (!pktl->head)
+    ff_mutex_lock(&pktl->mutex);
+    if (!pktl->head) {
+        ff_mutex_unlock(&pktl->mutex);
        return AVERROR(EAGAIN);
+    }

-    if (!pkt)
+    if (!pkt) {
+       ff_mutex_unlock(&pktl->mutex);
       return 0;
+    }

    pktle = pktl->head;
    ret = av_packet_ref(&tmp, &pktle->pkt);
+    ff_mutex_unlock(&pktl->mutex);
    if (ret < 0)
        return ret;

@@ -915,6 +929,7 @@ void av_packet_list_flush(AVPacketList *list)
    AVPacketList *pktl = list;
#endif

+    ff_mutex_lock(&pktl->mutex);
    while (pktl->head) {
        PacketListEntry *pktle = pktl->head;
        pktl->head = pktle->next;
@@ -923,16 +938,29 @@ void av_packet_list_flush(AVPacketList *list)
    }

    pktl->tail = NULL;
+    ff_mutex_unlock(&pktl->mutex);
}

void av_packet_list_free(AVPacketList **plist)
{
    AVPacketList *list = *plist;
+#if FF_API_PACKET_LIST
+    struct PacketList *pktl;
+#else
+    AVPacketList *pktl;
+#endif

    if (!list)
        return;

+#if FF_API_PACKET_LIST
+    pktl = (struct PacketList *)list;
+#else
+    pktl = list;
+#endif
+
    av_packet_list_flush(list);
+    ff_mutex_destroy(&pktl->mutex);
    av_freep(plist);
}

diff --git a/libavcodec/packet_internal.h b/libavcodec/packet_internal.h
index fd9637bc44..4cb3fb4bbd 100644
--- a/libavcodec/packet_internal.h
+++ b/libavcodec/packet_internal.h
@@ -21,6 +21,7 @@

#include <stdint.h>

+#include "libavutil/thread.h"
#include "packet.h"

typedef struct PacketListEntry {
@@ -36,6 +37,7 @@ struct AVPacketList {
#endif
    PacketListEntry *head;
    PacketListEntry *tail;
+    AVMutex mutex;
};

#if LIBAVCODEC_VERSION_MAJOR < 59
--
2.29.2

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to