From patchwork Sat Dec 3 15:50:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rick Kern X-Patchwork-Id: 39574 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:999a:b0:a4:2148:650a with SMTP id ve26csp2076898pzb; Sat, 3 Dec 2022 07:51:20 -0800 (PST) X-Google-Smtp-Source: AA0mqf52KqlsSJF3fmeImToddFOlLwQbND7FA9lSMlGrL5PhDjwnO056GHw8E45yHdBtR2om4bFE X-Received: by 2002:aa7:d601:0:b0:46c:7da6:7320 with SMTP id c1-20020aa7d601000000b0046c7da67320mr1306873edr.227.1670082680635; Sat, 03 Dec 2022 07:51:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670082680; cv=none; d=google.com; s=arc-20160816; b=SqBIZz0lVblaOPVaIe6IJ6dn4TSFWOqDzyYWKNNkqdQVVIm9mRSti78mIyenBOcBBY npROR5s1rKuT8Og1+llxe4yx4JkMu3FQlLatZtEPpDMvAmRiMGY+jrG8Ct5dnDtWtpSt C9hMOWVq6jhQPhiQHvLuLFFcpUgaRrJRkCHKewf8uGh8S0kB+Gschkzyg0t6btPn03RW ScrzFOil3e/+LK9+kMI6aqOXlruRJl8/dxye6jFmuIHjKHjxOvJwiUXcHE1bECm4EVAa afiXtLGgSAED/0B8HxbaoXPaRG4zwSonIZK7b4To+Z92x0xYEZkC76xla1lr/HoG+7b5 5Yng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=ew/eSndceXFAwF+i3Ea+KXOnx99kS/SFpJku4lZeJ3c=; b=CjMRqdAbkNARmlZO6dpnLccpZnYmmyBbbHWSzAD/sIiXM27wGX8I0bWke5z0FBmJQM FOiUq2b+J+M14tBJ3OYdxltbZ4Nw5JTviQcfyxtPhbL2CQyaOw5mrq4xEbwXCXk9uufV P9y9S1QXdBsP3yzPiqHvLouTM19OYpM4MadBRhaDIuOA4OGC6etVoUujuvejXTCr+Bld lsTOwr/aw+VrL/Di0aChb2yvhzMTkeWLSPDzeypydf5qIAt5l1p7nCLnSU2tNYXVLvqh w5d0m845ZS2YpYgSzg6AkkVk4b3y4noDO/NuYlCjapISJuWXHD56maBEHdFBPH0etrBT Dipw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=SP7Tn9hB; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id z11-20020a05640235cb00b00461f285ce57si9701208edc.211.2022.12.03.07.51.20; Sat, 03 Dec 2022 07:51:20 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=SP7Tn9hB; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AB98968B9EC; Sat, 3 Dec 2022 17:51:07 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f177.google.com (mail-qt1-f177.google.com [209.85.160.177]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4D89468B940 for ; Sat, 3 Dec 2022 17:51:01 +0200 (EET) Received: by mail-qt1-f177.google.com with SMTP id l15so8716944qtv.4 for ; Sat, 03 Dec 2022 07:51:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=TVfsk5RVfsu7CLs1rRNNSZQvSb6PovW24wEM8u2LELs=; b=SP7Tn9hBqSrpOdm8SBbQnOPp3W9TOhhdN/SPLvlIxGYl7Mi18E16InCOPJTkZFTSNs s0UkKHqXIh1qhLrWNTZaHgZv0evtRXEUK+fXjK/AT8qEVqX71D9ilQmbIfvLGNKry1FS 71JwNfJFUZwPm30zx7aB3Vj1qCISZ3+8Y0XVq0n5ZDZ7omcimFGjK3DCC9wQQeaMNGOp DqYVjHlnG9Yu8C5qT74srngFuF+6FltXCyGKN/NhSyITexgGOOUpTRuCSLtFtPSMUD+q r3XbIFgTVE9UeJSONn1LHjG5eD1NXy7uqFIPtXviAHjaODm9wouOeCHq18Tgk1SrFkpm CMOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TVfsk5RVfsu7CLs1rRNNSZQvSb6PovW24wEM8u2LELs=; b=loowJr2YU30YVzS3Hml2GWxzE2mbyuvuYnEdzEKA+G1M6Xm4PJBoKhZLC4HVZYgpm/ NtAxUvm1MciJ5YnVNpgPjlxvBUyl7IzO8PncY/FiNFmvXV63Xhcd1xRy9ik2X5wRhPVN MM+64t3o9gC9cHJyM2j+iCd+PdKyJ1GsFFoWLvoZ4Tu8QTU0a7U6zlqxsNQK5QLXCQak Ge1GgVxP56TIglm9F+nnEYz79KTb1+Ta+3r5ccfxzlTXyjPSqcluon9JTOwPSZuG9DwK 8KfzdTahEihc4T3Wo6+jp+UlAqxPf4Hk0uBj7kxbCZojPGJCgTUZvf8DwtQIW5N9+Qpe nkpw== X-Gm-Message-State: ANoB5pmv3wHwCXwJeT94uH6Jg6vNemhKnJ1vTJqD7Va5L2iNsre9CGek 2z1umcGDdPRbbhCO9wuJGNfj6I5pZIa5aQ== X-Received: by 2002:ac8:1411:0:b0:3a4:fe13:5274 with SMTP id k17-20020ac81411000000b003a4fe135274mr71014396qtj.381.1670082659523; Sat, 03 Dec 2022 07:50:59 -0800 (PST) Received: from localhost.localdomain ([2603:3007:2608:b900:38fa:c53b:cbdc:b66a]) by smtp.gmail.com with ESMTPSA id h4-20020a05620a284400b006cfc7f9eea0sm8156531qkp.122.2022.12.03.07.50.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Dec 2022 07:50:58 -0800 (PST) From: Rick Kern To: ffmpeg-devel@ffmpeg.org Date: Sat, 3 Dec 2022 10:50:55 -0500 Message-Id: <20221203155056.74093-2-kernrj@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221203155056.74093-1-kernrj@gmail.com> References: <20221203155056.74093-1-kernrj@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 1/2] fftools/objpool: move objpool to libavutil X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: aT1wqzJ0K9YK Moved objpool to libavutil to make it available outside of fftools. Signed-off-by: Rick Kern --- fftools/Makefile | 1 - fftools/ffmpeg_mux.c | 8 ++++---- fftools/sync_queue.c | 18 +++++++++--------- fftools/thread_queue.c | 14 +++++++------- fftools/thread_queue.h | 4 ++-- libavutil/Makefile | 2 ++ {fftools => libavutil}/objpool.c | 32 +++++++++++++++++--------------- {fftools => libavutil}/objpool.h | 24 +++++++++++++----------- 8 files changed, 54 insertions(+), 49 deletions(-) rename {fftools => libavutil}/objpool.c (77%) rename {fftools => libavutil}/objpool.h (62%) diff --git a/fftools/Makefile b/fftools/Makefile index 8ac38e75d2..25b11deaff 100644 --- a/fftools/Makefile +++ b/fftools/Makefile @@ -16,7 +16,6 @@ OBJS-ffmpeg += \ fftools/ffmpeg_mux.o \ fftools/ffmpeg_mux_init.o \ fftools/ffmpeg_opt.o \ - fftools/objpool.o \ fftools/sync_queue.o \ fftools/thread_queue.o \ diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c index 20524e5a28..8e4dd0facf 100644 --- a/fftools/ffmpeg_mux.c +++ b/fftools/ffmpeg_mux.c @@ -22,7 +22,6 @@ #include "ffmpeg.h" #include "ffmpeg_mux.h" -#include "objpool.h" #include "sync_queue.h" #include "thread_queue.h" @@ -30,6 +29,7 @@ #include "libavutil/intreadwrite.h" #include "libavutil/log.h" #include "libavutil/mem.h" +#include "libavutil/objpool.h" #include "libavutil/timestamp.h" #include "libavutil/thread.h" @@ -398,16 +398,16 @@ static void pkt_move(void *dst, void *src) static int thread_start(Muxer *mux) { AVFormatContext *fc = mux->fc; - ObjPool *op; + AVObjPool *op; int ret; - op = objpool_alloc_packets(); + op = av_objpool_alloc_packets(); if (!op) return AVERROR(ENOMEM); mux->tq = tq_alloc(fc->nb_streams, mux->thread_queue_size, op, pkt_move); if (!mux->tq) { - objpool_free(&op); + av_objpool_free(&op); return AVERROR(ENOMEM); } diff --git a/fftools/sync_queue.c b/fftools/sync_queue.c index c2b23ee4f5..bfa91bc129 100644 --- a/fftools/sync_queue.c +++ b/fftools/sync_queue.c @@ -24,8 +24,8 @@ #include "libavutil/fifo.h" #include "libavutil/mathematics.h" #include "libavutil/mem.h" +#include "libavutil/objpool.h" -#include "objpool.h" #include "sync_queue.h" typedef struct SyncQueueStream { @@ -60,7 +60,7 @@ struct SyncQueue { unsigned int nb_streams; // pool of preallocated frames to avoid constant allocations - ObjPool *pool; + AVObjPool *pool; }; static void frame_move(const SyncQueue *sq, SyncQueueFrame dst, @@ -250,7 +250,7 @@ int sq_send(SyncQueue *sq, unsigned int stream_idx, SyncQueueFrame frame) if (st->finished) return AVERROR_EOF; - ret = objpool_get(sq->pool, (void**)&dst); + ret = av_objpool_get(sq->pool, (void**)&dst); if (ret < 0) return ret; @@ -261,7 +261,7 @@ int sq_send(SyncQueue *sq, unsigned int stream_idx, SyncQueueFrame frame) ret = av_fifo_write(st->fifo, &dst, 1); if (ret < 0) { frame_move(sq, frame, dst); - objpool_release(sq->pool, (void**)&dst); + av_objpool_release(sq->pool, (void**)&dst); return ret; } @@ -302,7 +302,7 @@ static int receive_for_stream(SyncQueue *sq, unsigned int stream_idx, */ if (cmp <= 0 || ts == AV_NOPTS_VALUE) { frame_move(sq, frame, peek); - objpool_release(sq->pool, (void**)&peek); + av_objpool_release(sq->pool, (void**)&peek); av_fifo_drain2(st->fifo, 1); return 0; } @@ -415,8 +415,8 @@ SyncQueue *sq_alloc(enum SyncQueueType type, int64_t buf_size_us) sq->head_stream = -1; sq->head_finished_stream = -1; - sq->pool = (type == SYNC_QUEUE_PACKETS) ? objpool_alloc_packets() : - objpool_alloc_frames(); + sq->pool = (type == SYNC_QUEUE_PACKETS) ? av_objpool_alloc_packets() : + av_objpool_alloc_frames(); if (!sq->pool) { av_freep(&sq); return NULL; @@ -435,14 +435,14 @@ void sq_free(SyncQueue **psq) for (unsigned int i = 0; i < sq->nb_streams; i++) { SyncQueueFrame frame; while (av_fifo_read(sq->streams[i].fifo, &frame, 1) >= 0) - objpool_release(sq->pool, (void**)&frame); + av_objpool_release(sq->pool, (void**)&frame); av_fifo_freep2(&sq->streams[i].fifo); } av_freep(&sq->streams); - objpool_free(&sq->pool); + av_objpool_free(&sq->pool); av_freep(psq); } diff --git a/fftools/thread_queue.c b/fftools/thread_queue.c index a1ab4ce92e..514d12bb6a 100644 --- a/fftools/thread_queue.c +++ b/fftools/thread_queue.c @@ -24,9 +24,9 @@ #include "libavutil/fifo.h" #include "libavutil/intreadwrite.h" #include "libavutil/mem.h" +#include "libavutil/objpool.h" #include "libavutil/thread.h" -#include "objpool.h" #include "thread_queue.h" enum { @@ -45,7 +45,7 @@ struct ThreadQueue { AVFifo *fifo; - ObjPool *obj_pool; + AVObjPool *obj_pool; void (*obj_move)(void *dst, void *src); pthread_mutex_t lock; @@ -62,11 +62,11 @@ void tq_free(ThreadQueue **ptq) if (tq->fifo) { FifoElem elem; while (av_fifo_read(tq->fifo, &elem, 1) >= 0) - objpool_release(tq->obj_pool, &elem.obj); + av_objpool_release(tq->obj_pool, &elem.obj); } av_fifo_freep2(&tq->fifo); - objpool_free(&tq->obj_pool); + av_objpool_free(&tq->obj_pool); av_freep(&tq->finished); @@ -77,7 +77,7 @@ void tq_free(ThreadQueue **ptq) } ThreadQueue *tq_alloc(unsigned int nb_streams, size_t queue_size, - ObjPool *obj_pool, void (*obj_move)(void *dst, void *src)) + AVObjPool *obj_pool, void (*obj_move)(void *dst, void *src)) { ThreadQueue *tq; int ret; @@ -141,7 +141,7 @@ int tq_send(ThreadQueue *tq, unsigned int stream_idx, void *data) } else { FifoElem elem = { .stream_idx = stream_idx }; - ret = objpool_get(tq->obj_pool, &elem.obj); + ret = av_objpool_get(tq->obj_pool, &elem.obj); if (ret < 0) goto finish; @@ -166,7 +166,7 @@ static int receive_locked(ThreadQueue *tq, int *stream_idx, if (av_fifo_read(tq->fifo, &elem, 1) >= 0) { tq->obj_move(data, elem.obj); - objpool_release(tq->obj_pool, &elem.obj); + av_objpool_release(tq->obj_pool, &elem.obj); *stream_idx = elem.stream_idx; return 0; } diff --git a/fftools/thread_queue.h b/fftools/thread_queue.h index 0cc8c71ebd..e61260687f 100644 --- a/fftools/thread_queue.h +++ b/fftools/thread_queue.h @@ -21,7 +21,7 @@ #include -#include "objpool.h" +#include "libavutil/objpool.h" typedef struct ThreadQueue ThreadQueue; @@ -37,7 +37,7 @@ typedef struct ThreadQueue ThreadQueue; * @param callback that moves the contents between two data pointers */ ThreadQueue *tq_alloc(unsigned int nb_streams, size_t queue_size, - ObjPool *obj_pool, void (*obj_move)(void *dst, void *src)); + AVObjPool *obj_pool, void (*obj_move)(void *dst, void *src)); void tq_free(ThreadQueue **tq); /** diff --git a/libavutil/Makefile b/libavutil/Makefile index 3d9c07aea8..bd9ac28335 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -62,6 +62,7 @@ HEADERS = adler32.h \ mem.h \ motion_vector.h \ murmur3.h \ + objpool.h \ opt.h \ parseutils.h \ pixdesc.h \ @@ -149,6 +150,7 @@ OBJS = adler32.o \ md5.o \ mem.o \ murmur3.o \ + objpool.o \ opt.o \ parseutils.o \ pixdesc.o \ diff --git a/fftools/objpool.c b/libavutil/objpool.c similarity index 77% rename from fftools/objpool.c rename to libavutil/objpool.c index 87237cf724..2309afb5b2 100644 --- a/fftools/objpool.c +++ b/libavutil/objpool.c @@ -27,19 +27,21 @@ #include "objpool.h" -struct ObjPool { +struct AVObjPool { void *pool[32]; unsigned int pool_count; - ObjPoolCBAlloc alloc; - ObjPoolCBReset reset; - ObjPoolCBFree free; + AVObjPoolCBAlloc alloc; + AVObjPoolCBReset reset; + AVObjPoolCBFree free; }; -ObjPool *objpool_alloc(ObjPoolCBAlloc cb_alloc, ObjPoolCBReset cb_reset, - ObjPoolCBFree cb_free) +AVObjPool *av_objpool_alloc( + AVObjPoolCBAlloc cb_alloc, + AVObjPoolCBReset cb_reset, + AVObjPoolCBFree cb_free) { - ObjPool *op = av_mallocz(sizeof(*op)); + AVObjPool *op = av_mallocz(sizeof(*op)); if (!op) return NULL; @@ -51,9 +53,9 @@ ObjPool *objpool_alloc(ObjPoolCBAlloc cb_alloc, ObjPoolCBReset cb_reset, return op; } -void objpool_free(ObjPool **pop) +void av_objpool_free(AVObjPool **pop) { - ObjPool *op = *pop; + AVObjPool *op = *pop; if (!op) return; @@ -64,7 +66,7 @@ void objpool_free(ObjPool **pop) av_freep(pop); } -int objpool_get(ObjPool *op, void **obj) +int av_objpool_get(AVObjPool *op, void **obj) { if (op->pool_count) { *obj = op->pool[--op->pool_count]; @@ -75,7 +77,7 @@ int objpool_get(ObjPool *op, void **obj) return *obj ? 0 : AVERROR(ENOMEM); } -void objpool_release(ObjPool *op, void **obj) +void av_objpool_release(AVObjPool *op, void **obj) { if (!*obj) return; @@ -121,11 +123,11 @@ static void free_frame(void **obj) *obj = NULL; } -ObjPool *objpool_alloc_packets(void) +AVObjPool *av_objpool_alloc_packets(void) { - return objpool_alloc(alloc_packet, reset_packet, free_packet); + return av_objpool_alloc(alloc_packet, reset_packet, free_packet); } -ObjPool *objpool_alloc_frames(void) +AVObjPool *av_objpool_alloc_frames(void) { - return objpool_alloc(alloc_frame, reset_frame, free_frame); + return av_objpool_alloc(alloc_frame, reset_frame, free_frame); } diff --git a/fftools/objpool.h b/libavutil/objpool.h similarity index 62% rename from fftools/objpool.h rename to libavutil/objpool.h index 1b2aea6aca..9dcdc999a4 100644 --- a/fftools/objpool.h +++ b/libavutil/objpool.h @@ -19,19 +19,21 @@ #ifndef FFTOOLS_OBJPOOL_H #define FFTOOLS_OBJPOOL_H -typedef struct ObjPool ObjPool; +typedef struct AVObjPool AVObjPool; -typedef void* (*ObjPoolCBAlloc)(void); -typedef void (*ObjPoolCBReset)(void *); -typedef void (*ObjPoolCBFree)(void **); +typedef void* (*AVObjPoolCBAlloc)(void); +typedef void (*AVObjPoolCBReset)(void *); +typedef void (*AVObjPoolCBFree)(void **); -void objpool_free(ObjPool **op); -ObjPool *objpool_alloc(ObjPoolCBAlloc cb_alloc, ObjPoolCBReset cb_reset, - ObjPoolCBFree cb_free); -ObjPool *objpool_alloc_packets(void); -ObjPool *objpool_alloc_frames(void); +void av_objpool_free(AVObjPool **op); +AVObjPool *av_objpool_alloc( + AVObjPoolCBAlloc cb_alloc, + AVObjPoolCBReset cb_reset, + AVObjPoolCBFree cb_free); +AVObjPool *av_objpool_alloc_packets(void); +AVObjPool *av_objpool_alloc_frames(void); -int objpool_get(ObjPool *op, void **obj); -void objpool_release(ObjPool *op, void **obj); +int av_objpool_get(AVObjPool *op, void **obj); +void av_objpool_release(AVObjPool *op, void **obj); #endif // FFTOOLS_OBJPOOL_H From patchwork Sat Dec 3 15:50:56 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rick Kern X-Patchwork-Id: 39575 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:999a:b0:a4:2148:650a with SMTP id ve26csp2076969pzb; Sat, 3 Dec 2022 07:51:30 -0800 (PST) X-Google-Smtp-Source: AA0mqf7HxHVF8tp5JPiIUfQDMLuCxEiYBR+hdKAwDJJuDcgJs3CM/hJ8vU3bqSt33rH+6v214RY7 X-Received: by 2002:a17:906:d295:b0:7c0:aff1:f1b6 with SMTP id ay21-20020a170906d29500b007c0aff1f1b6mr9762061ejb.418.1670082689851; Sat, 03 Dec 2022 07:51:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670082689; cv=none; d=google.com; s=arc-20160816; b=RrIeD1kJ1gJM0WaABPckfrUTr5byVBBeHqdTHBiB+6PS/LRLzfk4PCfG/ZHyacUxXV guMYN+ZldYkXEdFFGGxndTT7lJL2/sNy1GfBHS+ATum+M2fAB5RqQH2C4ZmrWyjdICOW JvybM8/qf1bzpmyZx0X20wTefJTJszYVHUPbkPm7QwGBZIcD1cory3RqfIsXklTwgbSv BOEFWtIotxSCQd8NAD2OYHzIJxWaRfmbgCvtogQX+S5XwX+IvWygF/8W7qYmZbRvTI1U wzrf4R722a/zFOOzJOoOMONwWrfQ7WUjxdaj7oZAoj7U4djMTFJWMnaYtorShzQumb8e 7Nag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=NbkJzjVLnLyKLBBQDtq2/O/iLULJTVwwEt83+WPz4Gg=; b=Nu/bbDp0OHgAV+nGpCwY121Q4wscw9lfiMrpC0hj4lJIrZsXois25krpjJU57Y9lPr UW4mX+Z6hyYwRUnuqk09sSilXTL5qBnQk+acdMX3lVITtLicLs4m3d6CMAkc5Kh+8NDD VcAsu/9Nb0xB2kDJo4mMwDtIUbQqADD+V+fSzk2rScU3w9qP+SvTuvRF8/t8g9UMMFti 7bTGl43uVFCATmKyOqN9KCKn+VsJOef9+w4YT3oTe/bD3D+iEL0ahp9EG1FoKwt0VVFu /us6WDADUPyw2+uo5e49SBl29Bx7O6yLTcskih/aSuxONkRON7vPy6i69YnLwfFr2Npk GPLw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=lv+foLZv; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id qa16-20020a170907869000b007b9bf05f0edsi8203813ejc.520.2022.12.03.07.51.29; Sat, 03 Dec 2022 07:51:29 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=lv+foLZv; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C054568B834; Sat, 3 Dec 2022 17:51:10 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f172.google.com (mail-qt1-f172.google.com [209.85.160.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5398868B92B for ; Sat, 3 Dec 2022 17:51:02 +0200 (EET) Received: by mail-qt1-f172.google.com with SMTP id e15so8721323qts.1 for ; Sat, 03 Dec 2022 07:51:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=BGYheYaUIEH/EglLnbtgBVPl6dnxrEP+1VBI94ysfRI=; b=lv+foLZvJwEqY3VORRwIoaFCCIm/DUMpw391pfURQY6eHA+P4KdW5/0HlMkp7UR9/U rDV35BhJq3QC4PqZuEloalG5Vl88eMB163ux5O+dbQeUJsxK/O7pc4uxE7C6MDW5urtx gusC+kO3HZ3nwWYtFZJ4NowvP6Tw3N776qZl23zcNdFCz1mWNDuJBxYhTeX3gOpSjhBx W3X2MJJZlvvOgzU99R5tNzR7lX6e1+eroXLVMIrS7FtUYKIz5WfQcGJ0VcgCduGLhpd1 Oe7gJK+Dv1dHHKWWxcFxsDDIjOiglV9Hcmn+M5USVTpk9IHtYhbvupxZcOuqVqMaMn64 Fbug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BGYheYaUIEH/EglLnbtgBVPl6dnxrEP+1VBI94ysfRI=; b=7H/f3+4Tdc8VRd2nTEqH2MZ+vgoPke53RKtOdngzEKP5ps9f9FyK8XaGpnrTcHjW7W dte0PoqwvLT//iSZ4GhZOGFb08+v6Te0f0UCDPcXGXlARdvca/azTsXGQUUZK8wONOyb P9RpPz087CkZPxJ6SrMUvH7A+WsH+9Ii5DYoLpDIXyIHAcnR1XWJvlkT1qslX8Oxs9Gd 06R2nMNaBaIhHZso5ep6sLTYjOHA94eW0M1IqpEpDUxoQnQL7J3PbF9iRLRGvAK79iYC YVNFigFX5ym7/uJX16p6Uk12Ve7pEJgjFEaQtWe3mHxsaEUSp4dOfOMPL9fhoerYkxcS vfdw== X-Gm-Message-State: ANoB5pnC7WuPpbEbwLVpb5MRO9AuWuj1c0HtVP9N0Hy74DdLZr+vtYT5 jAz3Aua4T/bCwxLsVOykTiTi++Z+GBMKrg== X-Received: by 2002:a05:622a:4892:b0:3a5:252c:2bcc with SMTP id fc18-20020a05622a489200b003a5252c2bccmr20754380qtb.224.1670082660639; Sat, 03 Dec 2022 07:51:00 -0800 (PST) Received: from localhost.localdomain ([2603:3007:2608:b900:38fa:c53b:cbdc:b66a]) by smtp.gmail.com with ESMTPSA id h4-20020a05620a284400b006cfc7f9eea0sm8156531qkp.122.2022.12.03.07.50.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Dec 2022 07:50:59 -0800 (PST) From: Rick Kern To: ffmpeg-devel@ffmpeg.org Date: Sat, 3 Dec 2022 10:50:56 -0500 Message-Id: <20221203155056.74093-3-kernrj@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221203155056.74093-1-kernrj@gmail.com> References: <20221203155056.74093-1-kernrj@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 2/2] lavc/videotoolboxenc: use objectpool for encoder output information X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: h484yquTsq28 Instead of allocating/freeing, use objpool for data passed from an input frame to an output packet. Signed-off-by: Rick Kern --- libavcodec/videotoolboxenc.c | 80 ++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 9 deletions(-) diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c index dc9e321d3d..184feb029b 100644 --- a/libavcodec/videotoolboxenc.c +++ b/libavcodec/videotoolboxenc.c @@ -24,6 +24,7 @@ #include #include #include "avcodec.h" +#include "libavutil/objpool.h" #include "libavutil/opt.h" #include "libavutil/avassert.h" #include "libavutil/avstring.h" @@ -251,8 +252,49 @@ typedef struct VTEncContext { /* can't be bool type since AVOption will access it as int */ int a53_cc; + + AVObjPool *output_node_pool; } VTEncContext; +static BufNode *output_node_alloc(void) { return av_mallocz(sizeof(BufNode)); } +static void output_node_free(BufNode **node) { av_freep(node); } +static void output_node_reset(BufNode *node) { + if (node->cm_buffer != NULL) { + CFRelease(node->cm_buffer); + } + + if (node->sei != NULL) { + if (node->sei->data != NULL) { + av_free(node->sei->data); + } + + av_free(node->sei); + } + + memset(node, 0, sizeof(*node)); +} + +static int alloc_output_node_pool(AVObjPool **pool_out) { + AVObjPool *pool = NULL; + + if (pool_out == NULL) { + return AVERROR(EINVAL); + } + + pool = av_objpool_alloc( + (AVObjPoolCBAlloc)output_node_alloc, + (AVObjPoolCBReset)output_node_reset, + (AVObjPoolCBFree)output_node_free); + + if (pool == NULL) { + return AVERROR(ENOMEM); + } + + *pool_out = pool; + + return 0; +} + static int vtenc_populate_extradata(AVCodecContext *avctx, CMVideoCodecType codec_type, CFStringRef profile_level, @@ -285,8 +327,7 @@ static void set_async_error(VTEncContext *vtctx, int err) while (info) { BufNode *next = info->next; - CFRelease(info->cm_buffer); - av_free(info); + av_objpool_release(vtctx->output_node_pool, (void**)&info); info = next; } @@ -336,22 +377,29 @@ static int vtenc_q_pop(VTEncContext *vtctx, bool wait, CMSampleBufferRef *buf, E pthread_mutex_unlock(&vtctx->lock); *buf = info->cm_buffer; + if (*buf != NULL) { + CFRetain(*buf); + } + if (sei && *buf) { *sei = info->sei; - } else if (info->sei) { - if (info->sei->data) av_free(info->sei->data); - av_free(info->sei); + info->sei = NULL; } - av_free(info); + av_objpool_release(vtctx->output_node_pool, (void**)&info); return 0; } static void vtenc_q_push(VTEncContext *vtctx, CMSampleBufferRef buffer, ExtraSEI *sei) { - BufNode *info = av_malloc(sizeof(BufNode)); - if (!info) { + BufNode *info = NULL; + int status = av_objpool_get(vtctx->output_node_pool, (void**)&info); + + if (status < 0) { + set_async_error(vtctx, status); + return; + } else if (!info) { set_async_error(vtctx, AVERROR(ENOMEM)); return; } @@ -1569,6 +1617,16 @@ static av_cold int vtenc_init(AVCodecContext *avctx) pthread_mutex_init(&vtctx->lock, NULL); pthread_cond_init(&vtctx->cv_sample_sent, NULL); + status = alloc_output_node_pool(&vtctx->output_node_pool); + + if (status < 0) { + av_log( + avctx, + AV_LOG_ERROR, + "Failed to allocate output pool (%d)\n", + status); + } + vtctx->session = NULL; status = vtenc_configure_encoder(avctx); if (status) return status; @@ -1589,7 +1647,7 @@ static av_cold int vtenc_init(AVCodecContext *avctx) } avctx->has_b_frames = vtctx->has_b_frames; - return 0; + return status; } static void vtenc_get_frame_info(CMSampleBufferRef buffer, bool *is_key_frame) @@ -2647,6 +2705,10 @@ static av_cold int vtenc_close(AVCodecContext *avctx) vtctx->ycbcr_matrix = NULL; } + if (vtctx->output_node_pool != NULL) { + av_objpool_free(&vtctx->output_node_pool); + } + return 0; }