[FFmpeg-devel] [PATCH 11/18] avdevice/vfwcap: port to the new packet list API

James Almer jamrial at gmail.com
Wed Nov 18 18:52:40 EET 2020


Signed-off-by: James Almer <jamrial at gmail.com>
---
 libavdevice/vfwcap.c | 49 +++++++++++++++++++-------------------------
 1 file changed, 21 insertions(+), 28 deletions(-)

diff --git a/libavdevice/vfwcap.c b/libavdevice/vfwcap.c
index e2ab276c2e..eb5c29923f 100644
--- a/libavdevice/vfwcap.c
+++ b/libavdevice/vfwcap.c
@@ -178,7 +178,8 @@ static LRESULT CALLBACK videostream_cb(HWND hwnd, LPVIDEOHDR vdhdr)
 {
     AVFormatContext *s;
     struct vfw_ctx *ctx;
-    AVPacketList **ppktl, *pktl_next;
+    AVPacket pkt = { 0 };
+    int ret;
 
     s = (AVFormatContext *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
     ctx = s->priv_data;
@@ -190,21 +191,18 @@ static LRESULT CALLBACK videostream_cb(HWND hwnd, LPVIDEOHDR vdhdr)
 
     WaitForSingleObject(ctx->mutex, INFINITE);
 
-    pktl_next = av_mallocz(sizeof(AVPacketList));
-    if(!pktl_next)
+    if (av_new_packet(&pkt, vdhdr->dwBytesUsed) < 0)
         goto fail;
 
-    if(av_new_packet(&pktl_next->pkt, vdhdr->dwBytesUsed) < 0) {
-        av_free(pktl_next);
+    pkt.pts = vdhdr->dwTimeCaptured;
+    memcpy(pkt.data, vdhdr->lpData, vdhdr->dwBytesUsed);
+
+    ret = av_packet_list_put(ctx->pktl, &pkt, NULL, 0);
+    if (ret < 0) {
+        av_packet_unref(&pkt);
         goto fail;
     }
 
-    pktl_next->pkt.pts = vdhdr->dwTimeCaptured;
-    memcpy(pktl_next->pkt.data, vdhdr->lpData, vdhdr->dwBytesUsed);
-
-    for(ppktl = &ctx->pktl ; *ppktl ; ppktl = &(*ppktl)->next);
-    *ppktl = pktl_next;
-
     ctx->curbufsize += vdhdr->dwBytesUsed;
 
     SetEvent(ctx->event);
@@ -219,7 +217,6 @@ fail:
 static int vfw_read_close(AVFormatContext *s)
 {
     struct vfw_ctx *ctx = s->priv_data;
-    AVPacketList *pktl;
 
     if(ctx->hwnd) {
         SendMessage(ctx->hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
@@ -231,13 +228,7 @@ static int vfw_read_close(AVFormatContext *s)
     if(ctx->event)
         CloseHandle(ctx->event);
 
-    pktl = ctx->pktl;
-    while (pktl) {
-        AVPacketList *next = pktl->next;
-        av_packet_unref(&pktl->pkt);
-        av_free(pktl);
-        pktl = next;
-    }
+    av_packet_list_free(&ctx->pktl);
 
     return 0;
 }
@@ -300,6 +291,13 @@ static int vfw_read_header(AVFormatContext *s)
 
     SetWindowLongPtr(ctx->hwnd, GWLP_USERDATA, (LONG_PTR) s);
 
+
+    ctx->pktl = av_packet_list_alloc();
+    if (!ctx->pktl) {
+        vfw_read_close(s);
+        return AVERROR(ENOMEM);
+    }
+
     st = avformat_new_stream(s, NULL);
     if(!st) {
         vfw_read_close(s);
@@ -439,19 +437,14 @@ fail:
 static int vfw_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     struct vfw_ctx *ctx = s->priv_data;
-    AVPacketList *pktl = NULL;
+    int ret = AVERROR(EAGAIN);
 
-    while(!pktl) {
+    while (ret) {
         WaitForSingleObject(ctx->mutex, INFINITE);
-        pktl = ctx->pktl;
-        if(ctx->pktl) {
-            *pkt = ctx->pktl->pkt;
-            ctx->pktl = ctx->pktl->next;
-            av_free(pktl);
-        }
+        ret = av_packet_list_get(ctx->pktl, pkt, 0);
         ResetEvent(ctx->event);
         ReleaseMutex(ctx->mutex);
-        if(!pktl) {
+        if (ret) {
             if(s->flags & AVFMT_FLAG_NONBLOCK) {
                 return AVERROR(EAGAIN);
             } else {
-- 
2.29.2



More information about the ffmpeg-devel mailing list