From patchwork Wed Nov 18 16:52:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 23708 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 839E944B913 for ; Wed, 18 Nov 2020 18:53:44 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6B90068B6C5; Wed, 18 Nov 2020 18:53:44 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f194.google.com (mail-qt1-f194.google.com [209.85.160.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C519668B6BF for ; Wed, 18 Nov 2020 18:53:39 +0200 (EET) Received: by mail-qt1-f194.google.com with SMTP id p12so2093020qtp.7 for ; Wed, 18 Nov 2020 08:53:39 -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=w4kIUalymEnBJIIrazpA6T2V6yHg+vZ0BwAdNP/VbCI=; b=K/c+Zw3MLJQDo0GzP2Vrc6VdyZEXyBJAXiFx/JvdYVOSu1UOqH0q742NtrriMZkfDt AJtT8TzKrIfJy5np5yumCtJlAIjaCtIzhrHGoOCc2Jpr9b42gcZxHPgr0SgLSyBg8iLi Q7hgDgbdVPYSltjOLzGD0pvXQhOAzIlmvZkmxYUMgOIspguGBug0nXl48JD/+1xAn99l 908W8nC1a6rXNtmSXTnSSpaz2O2JhE9o6mVt8BZFXzOijc4vh67THj+Jb/aSHLOsnlPu pbSXlvcEbak2tvBAtWm59Zr1dQG4+rBFc+Sc6t8ZyzygC5TEBoHcaw1+oETjo5yT1VF4 dITg== 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=w4kIUalymEnBJIIrazpA6T2V6yHg+vZ0BwAdNP/VbCI=; b=Wo0Ug0XMHK+wOs16kbMPwZAOx9z5PSWFs0RyockMVPL6TkcAXTtRjr7kC6xLXR/+Sw +pFNQHgSfia/qC4kClyZxLRsVODBnghhxTQIiIR87mXpO3x6FE3aMnZn7Fx77hXE1RzN vhdFmlN2VxGn1YjnFyoYLXOeZkeuAcu9mDiCnwoftgfRolBv5XuwXMH48Av6gKAi9aYg SoAyHTetYoZWeV82wZiK9y6C7KXEPPN8pxpXb4lTsHuxbhqzh9eNdaU4rtWr4Qz6gRWz fiapZNr3JXcdaqQTQvM2zzaaNR0vHyU5G/E7+Kc6i2WZZKzT2zPXhwexsRCB5Xtznxs2 kYCA== X-Gm-Message-State: AOAM530JxBVeni7lzauVAvBCzuSITa2OXHAgqDOS4lpKlbYn14D9X7nz +KfupJrjjhnuWiV9qwfXGU7TKys0Tw/rEQ== X-Google-Smtp-Source: ABdhPJxQ9zxHehp21Ci0UwIQete/cdvoHvrLwnAzc4dzYzO1PbYRYvKooIVs/0jaYLn11xCS6tsp5g== X-Received: by 2002:ac8:5351:: with SMTP id d17mr5627775qto.235.1605718418136; Wed, 18 Nov 2020 08:53:38 -0800 (PST) Received: from localhost.localdomain ([181.23.91.217]) by smtp.gmail.com with ESMTPSA id f14sm4863788qkk.89.2020.11.18.08.53.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Nov 2020 08:53:37 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Nov 2020 13:52:47 -0300 Message-Id: <20201118165247.4130-19-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] [RFC][PATCH 18/18] avcodec/avpacket: make the AVPacketList API thread safe 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 --- I don't know if this is necessary, so i'm sending it as an RFC. 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 +#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