From patchwork Wed Nov 18 16:52:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 23715 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 8162444BB34 for ; Wed, 18 Nov 2020 19:00:48 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6DE7A68B641; Wed, 18 Nov 2020 19:00:48 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-io1-f44.google.com (mail-io1-f44.google.com [209.85.166.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1EE3868A477 for ; Wed, 18 Nov 2020 19:00:42 +0200 (EET) Received: by mail-io1-f44.google.com with SMTP id i9so2765672ioo.2 for ; Wed, 18 Nov 2020 09:00:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Ama8Nl0sL9LV1Ssi2HezJfavtCUQbce61Ia54nBFLiI=; b=XvjlqccxsA6CaskbGWsRb3H56MaIKbsRN+RGTyBThPQVNyUPRdWU7ts98Yn/brCERy WjQurugoKzS/ME6WVBAD3Cf8almDJTq954Wqqc0v9VA8d75RSiSNjEN8zPYchbCMzJYA Mx0Lvo9pxZqRVvyaLAoa5nvFfltrEndHUfvBzsO536cDX5ec9GMu5o+OefBpZHuqCxXm GOYaeoM08BT8mw8pb3dMNHaQLb16uYx2uIH7EzivFfCsc3GUERvyKZSf++D63z3JCS+S MLnDAQkLtqObzcqRHSwBLiVVJjFgqFa7MPnxL/3WY92LqMsUhGkC7YzC3/VIL6hDvDnR uRug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Ama8Nl0sL9LV1Ssi2HezJfavtCUQbce61Ia54nBFLiI=; b=UNpFynvsD1gtPGC/hajBWL0RT46MHyTG9yOGt0PQPpix9VARxR+oDX7hdZcxEKp3b4 lovK/SCG+UXSApGFH85Goigawn+qZFe9CqeIevbB0H611rBUpENej8mP2cDOsfbqoegB 9ldIPBDpO2OPgQsXKvJc1nxYKC8mSynp90vWl0cLY67VK7Uy+uyxKn3Da2h+UJVOBZRW sFlIaSaCJ8Xr6zd2culxtinL4USk/1fOADcBEERj39U39OuowX0gvCfVP6tyjeS0HX9e IIbG5StOjPlthtZ9vyqlEIe8B6I8jPPPooQIBQel+tukHnZmif1wCaJ9gM0BA2UAbE5D 1ZiQ== X-Gm-Message-State: AOAM531roAuxNQ1iWW1woNLtSdKMX4sO5uNIYDLesYZcialt2jEKrqj2 pgMQYkIy3Q1dFPZEM5g6rGDRQnOhtN0pIg== X-Google-Smtp-Source: ABdhPJxNQOhbhE6Yb2FXxXVxYCCli6flvqiGQG8sb8Nhu0fAR/kirQRqbEEFJt5DXBVHmJAMMEAHag== X-Received: by 2002:a37:d08:: with SMTP id 8mr5472484qkn.306.1605718405098; Wed, 18 Nov 2020 08:53:25 -0800 (PST) Received: from localhost.localdomain ([181.23.91.217]) by smtp.gmail.com with ESMTPSA id f14sm4863788qkk.89.2020.11.18.08.53.23 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Nov 2020 08:53:24 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Nov 2020 13:52:39 -0300 Message-Id: <20201118165247.4130-11-jamrial@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201118165247.4130-1-jamrial@gmail.com> References: <20201118165247.4130-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/18] avdevice/decklink_dec: port to the new packet list API X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: James Almer --- libavdevice/decklink_common.h | 2 +- libavdevice/decklink_dec.cpp | 53 +++++++++++++---------------------- 2 files changed, 20 insertions(+), 35 deletions(-) diff --git a/libavdevice/decklink_common.h b/libavdevice/decklink_common.h index f35bd9ae6f..9ee877f349 100644 --- a/libavdevice/decklink_common.h +++ b/libavdevice/decklink_common.h @@ -75,7 +75,7 @@ class decklink_output_callback; class decklink_input_callback; typedef struct AVPacketQueue { - AVPacketList *first_pkt, *last_pkt; + AVPacketList *pktl; int nb_packets; unsigned long long size; int abort_request; diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp index 6517b9df13..1115c5af79 100644 --- a/libavdevice/decklink_dec.cpp +++ b/libavdevice/decklink_dec.cpp @@ -469,10 +469,13 @@ skip_packet: return tgt; } -static void avpacket_queue_init(AVFormatContext *avctx, AVPacketQueue *q) +static int avpacket_queue_init(AVFormatContext *avctx, AVPacketQueue *q) { struct decklink_cctx *ctx = (struct decklink_cctx *)avctx->priv_data; memset(q, 0, sizeof(AVPacketQueue)); + q->pktl = av_packet_list_alloc(); + if (!q->pktl) + return AVERROR(ENOMEM); pthread_mutex_init(&q->mutex, NULL); pthread_cond_init(&q->cond, NULL); q->avctx = avctx; @@ -484,13 +487,7 @@ static void avpacket_queue_flush(AVPacketQueue *q) AVPacketList *pkt, *pkt1; pthread_mutex_lock(&q->mutex); - for (pkt = q->first_pkt; pkt != NULL; pkt = pkt1) { - pkt1 = pkt->next; - av_packet_unref(&pkt->pkt); - av_freep(&pkt); - } - q->last_pkt = NULL; - q->first_pkt = NULL; + av_packet_list_flush(q->pktl); q->nb_packets = 0; q->size = 0; pthread_mutex_unlock(&q->mutex); @@ -499,6 +496,7 @@ static void avpacket_queue_flush(AVPacketQueue *q) static void avpacket_queue_end(AVPacketQueue *q) { avpacket_queue_flush(q); + av_packet_list_free(&q->pktl); pthread_mutex_destroy(&q->mutex); pthread_cond_destroy(&q->cond); } @@ -514,7 +512,7 @@ static unsigned long long avpacket_queue_size(AVPacketQueue *q) static int avpacket_queue_put(AVPacketQueue *q, AVPacket *pkt) { - AVPacketList *pkt1; + int size; // Drop Packet if queue size is > maximum queue size if (avpacket_queue_size(q) > (uint64_t)q->max_q_size) { @@ -528,25 +526,16 @@ static int avpacket_queue_put(AVPacketQueue *q, AVPacket *pkt) return -1; } - pkt1 = (AVPacketList *)av_malloc(sizeof(AVPacketList)); - if (!pkt1) { - av_packet_unref(pkt); - return -1; - } - av_packet_move_ref(&pkt1->pkt, pkt); - pkt1->next = NULL; - pthread_mutex_lock(&q->mutex); - if (!q->last_pkt) { - q->first_pkt = pkt1; - } else { - q->last_pkt->next = pkt1; - } + size = pkt->size; + + ret = av_packet_list_put(q->pktl, pkt, 0); + if (ret < 0) + return 0; - q->last_pkt = pkt1; q->nb_packets++; - q->size += pkt1->pkt.size + sizeof(*pkt1); + q->size += size; pthread_cond_signal(&q->cond); @@ -562,16 +551,10 @@ static int avpacket_queue_get(AVPacketQueue *q, AVPacket *pkt, int block) pthread_mutex_lock(&q->mutex); for (;; ) { - pkt1 = q->first_pkt; - if (pkt1) { - q->first_pkt = pkt1->next; - if (!q->first_pkt) { - q->last_pkt = NULL; - } + ret = av_packet_list_get(q->pktl, pkt, 0); + if (!ret) { q->nb_packets--; - q->size -= pkt1->pkt.size + sizeof(*pkt1); - *pkt = pkt1->pkt; - av_free(pkt1); + q->size -= pkt.size; ret = 1; break; } else if (!block) { @@ -1382,7 +1365,9 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) goto error; } - avpacket_queue_init (avctx, &ctx->queue); + ret = avpacket_queue_init(avctx, &ctx->queue); + if (ret < 0) + goto error; if (ctx->dli->StartStreams() != S_OK) { av_log(avctx, AV_LOG_ERROR, "Cannot start input stream\n");