From patchwork Fri Jan 5 16:42:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 45494 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1093:b0:199:52ba:a72d with SMTP id w19csp213227pze; Fri, 5 Jan 2024 08:44:05 -0800 (PST) X-Google-Smtp-Source: AGHT+IFTZFPPyzNrIimYdqCIAws8MRCLUi3iSkWTCCGY8H22gqeQV/NYF4rcGHwCSYDpb9B6JGeC X-Received: by 2002:a50:99c1:0:b0:554:e4e:ba38 with SMTP id n1-20020a5099c1000000b005540e4eba38mr1504506edb.17.1704473044886; Fri, 05 Jan 2024 08:44:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1704473044; cv=none; d=google.com; s=arc-20160816; b=ibIDpheLj4pkfZZ5tZ4+12iBy28asqjKpcfqR7sQuY9/XE6YRSl9xl8oSvRB/p+dHo tOYCpQ2erOX2xliAtrOtHT2r6Q4Ws9QSWAgRoOpUde/KspsRZ4eFs7tjxDMstrHWBVz1 /ofVd/VRlCk+K279NUkAB4QvKyurllVOwQig6WKXjhXJFvwOp4DfBPlbdlXtZCo/fkCV TPXhh616TGBCfZ0zol8vcQPDahA91/uwAYRhmdf6URbCXgdM8R9qPpg5Wup/uGWvUqps 7lQ5mdpqc1hTJz6DR3F89ezWT3uhYKQAA0xy6E9X9AIXJeR2FpvRsePpVSXCZ1HXa59A V+uQ== 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=YqImHTVIGtzUGY7j1Tm8bc1365gF5ZpzkZB0ccKaK3U=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=pBZ7upMAuI2hNgRH8dXEkPy2wSvg/nfjsx1WdSstFgPM9/MOKFzLeoVYDyCqgYNGJY Mbq4seO1Zllfu4yOe96DHTyqdlNblrW7xfeR8Ln901f7YuFM/ni4pJuR5/k+hVoQae3P gf3WbHB/1S1OX7FvTJnriDEEFMiMAaASdamNjBtIiS8mqxIpvYWqK9tJUC6Apgp9E9x3 xCc+eIpw2DTKRvg0TaTcpg5FPF4G0WHYyvhrDtm1y8J3WxaBzhDDTOwUWN6M7VZGHh8x y1syXlEARCqMyJdVDVtsnenYf/omLgYJn2ggGmrB0GTp4jRWVR6EH60NzrxFUf+OipXh QWQw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=DndR8qzY; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id r2-20020a50d682000000b00553501721acsi745985edi.656.2024.01.05.08.44.04; Fri, 05 Jan 2024 08:44:04 -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=@khirnov.net header.s=mail header.b=DndR8qzY; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D4A2368CE32; Fri, 5 Jan 2024 18:43:10 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9ADAD68CD3F for ; Fri, 5 Jan 2024 18:43:00 +0200 (EET) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=DndR8qzY; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 3A3171547 for ; Fri, 5 Jan 2024 17:42:56 +0100 (CET) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id Z2pWBu0CQQfc for ; Fri, 5 Jan 2024 17:42:55 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1704472974; bh=HQIQdjdXYDK0zhhT68crzdsD1AnlKegcqkbvSg8NGLc=; h=From:To:Subject:Date:In-Reply-To:References:From; b=DndR8qzYVyE8IM3+xs0u0749JLLhgT1PDG5pXwebSOcBJh+T9XCW9OlzftQNxwV9T fMBROGA0A8FAtmrK8Eu5WYt3nVO1riMhGUPtlf5u5pa2q1fnqzs/YvEHq4gbLFBb9F z7J09jUfvIt04Adk7+hPQPFoujzUWFm5+WIMLIK+TOi80fmYH5zJF+So0dC5viD1rE Bl8I59Nmxg37fso0jQeghVXJtR+WVoCInAbeCkqb3W8iN2ffCRL0GZ+ubnKAMffBZl OBRhwswcLF0wj7p2E720sJt/UCRl3r3trszf98OtHEjwQLUCvJTm9bAIWJ62ifXCoB XoggaylPAHzVg== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id E8D2319AB for ; Fri, 5 Jan 2024 17:42:53 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 838333A07AE for ; Fri, 5 Jan 2024 17:42:53 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 5 Jan 2024 17:42:49 +0100 Message-ID: <20240105164251.28935-6-anton@khirnov.net> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240105164251.28935-1-anton@khirnov.net> References: <20240105164251.28935-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 6/8] fftools/ffmpeg_demux: add demuxing thread private data 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: 64sb8PhaTATg To be used for data that never needs to be visible outside of the demuxer thread, similarly as was previously done for other components. --- fftools/ffmpeg_demux.c | 67 ++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c index c51140b1c5..eae1f0bde5 100644 --- a/fftools/ffmpeg_demux.c +++ b/fftools/ffmpeg_demux.c @@ -115,6 +115,11 @@ typedef struct Demuxer { int nb_streams_finished; } Demuxer; +typedef struct DemuxThreadContext { + // packet used for reading from the demuxer + AVPacket *pkt_demux; +} DemuxThreadContext; + static DemuxStream *ds_from_ist(InputStream *ist) { return (DemuxStream*)ist; @@ -565,18 +570,36 @@ static void thread_set_name(InputFile *f) ff_thread_setname(name); } +static void demux_thread_uninit(DemuxThreadContext *dt) +{ + av_packet_free(&dt->pkt_demux); + + memset(dt, 0, sizeof(*dt)); +} + +static int demux_thread_init(DemuxThreadContext *dt) +{ + memset(dt, 0, sizeof(*dt)); + + dt->pkt_demux = av_packet_alloc(); + if (!dt->pkt_demux) + return AVERROR(ENOMEM); + + return 0; +} + static void *input_thread(void *arg) { Demuxer *d = arg; InputFile *f = &d->f; - AVPacket *pkt; + + DemuxThreadContext dt; + int ret = 0; - pkt = av_packet_alloc(); - if (!pkt) { - ret = AVERROR(ENOMEM); + ret = demux_thread_init(&dt); + if (ret < 0) goto finish; - } thread_set_name(f); @@ -589,7 +612,7 @@ static void *input_thread(void *arg) DemuxStream *ds; unsigned send_flags = 0; - ret = av_read_frame(f->ctx, pkt); + ret = av_read_frame(f->ctx, dt.pkt_demux); if (ret == AVERROR(EAGAIN)) { av_usleep(10000); @@ -598,12 +621,12 @@ static void *input_thread(void *arg) if (ret < 0) { if (d->loop) { /* signal looping to our consumers */ - pkt->stream_index = -1; + dt.pkt_demux->stream_index = -1; - ret = sch_demux_send(d->sch, f->index, pkt, 0); + ret = sch_demux_send(d->sch, f->index, dt.pkt_demux, 0); if (ret >= 0) - ret = seek_to_start(d, (Timestamp){ .ts = pkt->pts, - .tb = pkt->time_base }); + ret = seek_to_start(d, (Timestamp){ .ts = dt.pkt_demux->pts, + .tb = dt.pkt_demux->time_base }); if (ret >= 0) continue; @@ -622,39 +645,39 @@ static void *input_thread(void *arg) } if (do_pkt_dump) { - av_pkt_dump_log2(NULL, AV_LOG_INFO, pkt, do_hex_dump, - f->ctx->streams[pkt->stream_index]); + av_pkt_dump_log2(NULL, AV_LOG_INFO, dt.pkt_demux, do_hex_dump, + f->ctx->streams[dt.pkt_demux->stream_index]); } /* the following test is needed in case new streams appear dynamically in stream : we ignore them */ - ds = pkt->stream_index < f->nb_streams ? - ds_from_ist(f->streams[pkt->stream_index]) : NULL; + ds = dt.pkt_demux->stream_index < f->nb_streams ? + ds_from_ist(f->streams[dt.pkt_demux->stream_index]) : NULL; if (!ds || ds->discard || ds->finished) { - report_new_stream(d, pkt); - av_packet_unref(pkt); + report_new_stream(d, dt.pkt_demux); + av_packet_unref(dt.pkt_demux); continue; } - if (pkt->flags & AV_PKT_FLAG_CORRUPT) { + if (dt.pkt_demux->flags & AV_PKT_FLAG_CORRUPT) { av_log(d, exit_on_error ? AV_LOG_FATAL : AV_LOG_WARNING, "corrupt input packet in stream %d\n", - pkt->stream_index); + dt.pkt_demux->stream_index); if (exit_on_error) { - av_packet_unref(pkt); + av_packet_unref(dt.pkt_demux); ret = AVERROR_INVALIDDATA; break; } } - ret = input_packet_process(d, pkt, &send_flags); + ret = input_packet_process(d, dt.pkt_demux, &send_flags); if (ret < 0) break; if (d->readrate) readrate_sleep(d); - ret = demux_send(d, ds, pkt, send_flags); + ret = demux_send(d, ds, dt.pkt_demux, send_flags); if (ret < 0) break; } @@ -664,7 +687,7 @@ static void *input_thread(void *arg) ret = 0; finish: - av_packet_free(&pkt); + demux_thread_uninit(&dt); return (void*)(intptr_t)ret; }