From patchwork Mon Jan 24 14:46:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 33786 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:e71a:0:0:0:0:0 with SMTP id b26csp388728ioh; Mon, 24 Jan 2022 06:50:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJz87GWbzW858Wl1dl+/u4IQ1lrm2JhJGoY933SpgT2d4K3yJPY6q6f9oh1RYGnYPX04ZMEj X-Received: by 2002:a05:6402:11ca:: with SMTP id j10mr16409357edw.169.1643035822616; Mon, 24 Jan 2022 06:50:22 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id qa30si1869155ejc.423.2022.01.24.06.50.21; Mon, 24 Jan 2022 06:50:22 -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=@outlook.com header.s=selector1 header.b=b6FRvRv6; arc=fail (body hash mismatch); 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=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9962868B167; Mon, 24 Jan 2022 16:48:22 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2053.outbound.protection.outlook.com [40.92.89.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 06EB768B143 for ; Mon, 24 Jan 2022 16:48:20 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=C+ZouZQyRIfGCmA9+7F4ZWMs0dISa1yyX6WSNeE2XXAsInGnYmJAkQKIaXM1nspJE0IfvU8KbBrGIE2NzYqTY/WJ/IGqnct8CNcVYdBsLD1C7imcQiCNISawRk+iAcNb/THXVMRokv8fW6RkzLQla9CoBZUDdqxLuR1HLBM93IjsMp19DAeNV7nVou6n9Qiu85ztFFdbyFpUagiC/JA/pjRW0DjhB2Blj7rdcM6j2Muq3C6j4c/JuLZkUfBPwNocomeG08kzSV63Uy9f/fYsouv35hGjCXMs4mtoq7i5a16ongbfeADn1nZXf83YriWweIjZ/HJak3Nyxn2p3qFDqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=cyHVm2mR580w6HeWBDg+d8i5Rt7bqbR583rQ9adMYNU=; b=fowu2nC++7NSv/7Yueaa90ye/L+E8l9pxXiv9kBFIHTlknT0/m4hg3K/u/3H8MaJnfyYUJ9q5aNRROppMcOvmaTY5LqrAQivWI4WuEe/FA648kFTpCH+jfPedLQLoNglYRURN1kUzlcpu6Hnsht6IyC4spFQJHRlkgSOWhTtazIiIasoP5tNWFF48Gc6BFBwuJCyPDUbLkwqsyWd58bZC4pzZFSjTfDWuX0FAQSBWgPHEjs2AocHm973v1kUC3YEChHR2rd2sSaSEDaxQW+IhB4mw1a12XNFfQjI6PyMCVd4D3Etylmr88dKIwD63FwaFS1P/NVbwzYRUaYBL3MY7A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cyHVm2mR580w6HeWBDg+d8i5Rt7bqbR583rQ9adMYNU=; b=b6FRvRv6t/xgZsguUMZXVCLODlmY2r5VvE2oCJus3yW+rAHgLKVq3C93Wqs59wS3jZPHt1XLlHo0NNz+l5Ou73z33h1EuImMO3dqlZKMyAJ90NqDXdiHfAqaOkjac46/q4Hl1B5SkVE9WDnbM8F9f3dy0+toNFjuBoApObonu0jQ/0CpXxNcB1GPjKksjLmtjYpXMBByDBlrG0HF4zbJ6LoEQnL8vi2GzOWOiAFG5LJPjRtUV6NFOxDXhCf2gXYlRpNywyaOveyTzbbbtsRRK7SrkZ/SadgBY2LIEobkGLcCkslppEYcrwyLd+QAvicWb6XF3UWvJkoTfVXlTpnfPQ== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM0PR0302MB3187.eurprd03.prod.outlook.com (2603:10a6:208:7::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4909.17; Mon, 24 Jan 2022 14:48:18 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22%4]) with mapi id 15.20.4909.017; Mon, 24 Jan 2022 14:48:18 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 24 Jan 2022 15:46:07 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [n3KUoK2O4SDo+h3imNUcKcSZl7eAXzbI] X-ClientProxiedBy: AM5PR0201CA0016.eurprd02.prod.outlook.com (2603:10a6:203:3d::26) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220124144616.559446-22-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 85bc401d-77df-4174-a61d-08d9df488f70 X-MS-TrafficTypeDiagnostic: AM0PR0302MB3187:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZTAYs516C4aZBv1XnC6wniQm5p2ZWzdfGjw7wcia/uJiAVHCwXkIKM3aE8l27kcGOo2v091JH+hrsZJwnQbNtE/wDEK4wfrrGn+a7JhKZciB3JMqhgH6s21XMW6k9BBg4jmXSl58h4A0V4r25sh8ljIAq5tXyIRMSvUP3lyOQf0R6y3mY9Smn97ZPBoK4MGb9bRjy5IuzkL2z9gpQySmuTpUpsPjyOon0znMLIos+2ia9wfyfHscXYy9fwBfCl7ZEVAALpBWmfynUs6qC30UVMZ+l8ABldocfDDM7QhpsuiuMK8WgTU/gF9t9rp+4TLrzva8brDRLGtBwodtc7AQpx0SOxC9TumMacU8NqSa3U5s7fwJeMabQ+ESC9uTjVkFcc7K1mpvnwe0GtosC5WHZPZry6E7YZdE/IDD7OKTbFCQ1FtFbjWliwoxkPdgd0aX6amfxQUKMNqTXxPfoRIQByvVscZd7R4xQ/zWkizBcYSgonxNnJTeYlqKXW5RQt6AMUwu2HFg8Tv69sxMMnBCb/ohTrmCAf7aSkORjZHyj3Iabb2pL5KBWvyLeLxfRvTZCI97jlg9+bZKz9dTtHhSiA== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 1Mt/PEtYMY2vXca/Sz5eo1HI6042iltCopNV1zxL7CG0Gf1aMeNt+g4yDqTO5XEIPYi9uPPnRQUDX3aXE3GUJ76VYHkXeW0iAo/WrQnQPtdsHKH4YdQ+kNwDorfSnfeIX2JwsJ/Oiik9PqZJIkpu++4gUZnJeHklbAbqKqt+jMcapsXXoOG/oh+b+billtX+bhSIN5jrxHvuXQAWXzmrik2NlXTk+mRAThkyRIu5p4yxW1p9QYJWceZEJqGoOcodVJeA8MVMThOwPiCjECxVaZ6rnb3wmvIdKslJpJdndsSQ4GZ+JnzhREB7EBvsQYyD2CFHCB9aIjjKobkLxyfwu9HbAl2hAaukx9IzWeLuwbmWBbs5J4M/z1M9TDn7k9rKdXFO71/uf5/DmXYJbIGTwIZKAGk4GOhp5UyEKDR/IKASECYNBpU6eMsj2iHR70lOQbvlL7uMQEciEpnd3NHRybZV/z5EiaRAsL1QEv/mVfEfoNQnluXT1fvBJz5lWRzuOUimnt4KYSgPFdMQhPvzHG1kt6vZPuwChNT69WJ+LsrvVC/4ArWRUf2rQExGL7GHQTMQ9BkAoisEn/lv6NE9euX3bS9Ya9ljpFpC6UAEVURdvBbY5cqj0JAyqrnKaAFnVXmreupxz1zZIRRTF5wcY63kUQnUhYpaNRRTJXBz/fhYZL6RUfnMCbSXGymCkVXi88RYsUxziQnzoY24HphdHlzchCf+qSWKatcvVZEisH84pVHy7FTqCaz4miBud67voSCrVQHQ1hXv0MCtTGFCEOnM7fuPi4PJ1ak3ysqJVjrNhBZbdO4NUPKKX6FP7nnR51DsIJwlB+6/a599bnKG52gY2OyZp11UHjSaHcFD6aNGrTcDDJBxKWCe/633RF6aqGEEfk2zfbBGzPZ16nOu4Tb9BPkwflHk5EOSb+EcMmMkdWg+OZO33eMckygNeU9jqGGTro/S6/cIRCvUGb4vkQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 85bc401d-77df-4174-a61d-08d9df488f70 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Jan 2022 14:48:18.8830 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR0302MB3187 Subject: [FFmpeg-devel] [PATCH v2 22/31] lavf/async: switch to new FIFO API 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 Cc: Anton Khirnov Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: DhdhDSO7fpF7 From: Anton Khirnov --- libavformat/async.c | 68 ++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/libavformat/async.c b/libavformat/async.c index 5a81507ef1..547417aa1e 100644 --- a/libavformat/async.c +++ b/libavformat/async.c @@ -47,7 +47,7 @@ typedef struct RingBuffer { - AVFifoBuffer *fifo; + AVFifo *fifo; int read_back_capacity; int read_pos; @@ -83,7 +83,7 @@ typedef struct Context { static int ring_init(RingBuffer *ring, unsigned int capacity, int read_back_capacity) { memset(ring, 0, sizeof(RingBuffer)); - ring->fifo = av_fifo_alloc(capacity + read_back_capacity); + ring->fifo = av_fifo_alloc2(capacity + read_back_capacity, 1, 0); if (!ring->fifo) return AVERROR(ENOMEM); @@ -93,45 +93,59 @@ static int ring_init(RingBuffer *ring, unsigned int capacity, int read_back_capa static void ring_destroy(RingBuffer *ring) { - av_fifo_freep(&ring->fifo); + av_fifo_freep2(&ring->fifo); } static void ring_reset(RingBuffer *ring) { - av_fifo_reset(ring->fifo); + av_fifo_reset2(ring->fifo); ring->read_pos = 0; } static int ring_size(RingBuffer *ring) { - return av_fifo_size(ring->fifo) - ring->read_pos; + return av_fifo_can_read(ring->fifo) - ring->read_pos; } static int ring_space(RingBuffer *ring) { - return av_fifo_space(ring->fifo); + return av_fifo_can_write(ring->fifo); } -static int ring_generic_read(RingBuffer *ring, void *dest, int buf_size, void (*func)(void*, void*, int)) +static int ring_read(RingBuffer *ring, void *dest, int buf_size) { - int ret; + int ret = 0; av_assert2(buf_size <= ring_size(ring)); - ret = av_fifo_generic_peek_at(ring->fifo, dest, ring->read_pos, buf_size, func); + if (dest) + ret = av_fifo_peek(ring->fifo, dest, buf_size, ring->read_pos); ring->read_pos += buf_size; if (ring->read_pos > ring->read_back_capacity) { - av_fifo_drain(ring->fifo, ring->read_pos - ring->read_back_capacity); + av_fifo_drain2(ring->fifo, ring->read_pos - ring->read_back_capacity); ring->read_pos = ring->read_back_capacity; } return ret; } -static int ring_generic_write(RingBuffer *ring, void *src, int size, int (*func)(void*, void*, int)) +static int wrapped_url_read(void *src, void *dst, size_t *size) +{ + URLContext *h = src; + Context *c = h->priv_data; + int ret; + + ret = ffurl_read(c->inner, dst, *size); + *size = ret > 0 ? ret : 0; + c->inner_io_error = ret < 0 ? ret : 0; + + return c->inner_io_error; +} + +static int ring_write(RingBuffer *ring, URLContext *h, size_t size) { av_assert2(size <= ring_space(ring)); - return av_fifo_generic_write(ring->fifo, src, size, func); + return av_fifo_write_from_cb(ring->fifo, wrapped_url_read, h, &size); } static int ring_size_of_read_back(RingBuffer *ring) @@ -161,18 +175,6 @@ static int async_check_interrupt(void *arg) return c->abort_request; } -static int wrapped_url_read(void *src, void *dst, int size) -{ - URLContext *h = src; - Context *c = h->priv_data; - int ret; - - ret = ffurl_read(c->inner, dst, size); - c->inner_io_error = ret < 0 ? ret : 0; - - return ret; -} - static void *async_buffer_task(void *arg) { URLContext *h = arg; @@ -221,7 +223,7 @@ static void *async_buffer_task(void *arg) pthread_mutex_unlock(&c->mutex); to_copy = FFMIN(4096, fifo_space); - ret = ring_generic_write(ring, (void *)h, to_copy, wrapped_url_read); + ret = ring_write(ring, h, to_copy); pthread_mutex_lock(&c->mutex); if (ret <= 0) { @@ -327,11 +329,11 @@ static int async_close(URLContext *h) return 0; } -static int async_read_internal(URLContext *h, void *dest, int size, int read_complete, - void (*func)(void*, void*, int)) +static int async_read_internal(URLContext *h, void *dest, int size) { Context *c = h->priv_data; RingBuffer *ring = &c->ring; + int read_complete = !dest; int to_read = size; int ret = 0; @@ -346,8 +348,8 @@ static int async_read_internal(URLContext *h, void *dest, int size, int read_com fifo_size = ring_size(ring); to_copy = FFMIN(to_read, fifo_size); if (to_copy > 0) { - ring_generic_read(ring, dest, to_copy, func); - if (!func) + ring_read(ring, dest, to_copy); + if (dest) dest = (uint8_t *)dest + to_copy; c->logical_pos += to_copy; to_read -= to_copy; @@ -376,11 +378,7 @@ static int async_read_internal(URLContext *h, void *dest, int size, int read_com static int async_read(URLContext *h, unsigned char *buf, int size) { - return async_read_internal(h, buf, size, 0, NULL); -} - -static void fifo_do_not_copy_func(void* dest, void* src, int size) { - // do not copy + return async_read_internal(h, buf, size); } static int64_t async_seek(URLContext *h, int64_t pos, int whence) @@ -422,7 +420,7 @@ static int64_t async_seek(URLContext *h, int64_t pos, int whence) if (pos_delta > 0) { // fast seek forwards - async_read_internal(h, NULL, pos_delta, 1, fifo_do_not_copy_func); + async_read_internal(h, NULL, pos_delta); } else { // fast seek backwards ring_drain(ring, pos_delta);