From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <ffmpeg-devel-bounces@ffmpeg.org>
Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100])
	by master.gitmailbox.com (Postfix) with ESMTPS id C7E3B4885D
	for <ffmpegdev@gitmailbox.com>; Wed, 23 Apr 2025 06:02:34 +0000 (UTC)
Received: from [127.0.1.1] (localhost [127.0.0.1])
	by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 45769687DE2;
	Wed, 23 Apr 2025 09:02:30 +0300 (EEST)
Received: from SY5PR01CU010.outbound.protection.outlook.com
 (mail-australiaeastazolkn19012052.outbound.protection.outlook.com
 [52.103.72.52])
 by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5BDC7687D96
 for <ffmpeg-devel@ffmpeg.org>; Wed, 23 Apr 2025 09:02:23 +0300 (EEST)
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=dSDH+52CQ/u5x02ueOS7WeSlWw6Nl3AHQGbGRFV3jZO+RoENwIfK9jDDJKMS9MBmY47xjpMb1IxoMX+yDOukoNolMCWfwCiEtfNVo8NCjsd78uk5HSon1J338tdCMfttKPySRwRuPtKN34yT0ChqMhxp0PvzuX0t2mlKQYAVK4h+9CbxNBX2qxCadTzFtUwgHguyZeP85ae1HHO52UChy6DpufIoD04md8KMMqjwl9WdSN3zkM5Biz8DEUcMGd+Hj7i9z39/43chi4h5+8L7nQM6vFV3l0gVugL9gIbHWJZP0SH1fIU+EB4Ilt+zAes6ACV7633e6hIEJVw13HgqYg==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; 
 s=arcselector10001;
 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=q9yDp3/CKomATBKClSlLcmymUwpZEUGeCxwRlzxFn1o=;
 b=ANwmKywGDbAZOqoTjtqs7FFQGdblnrgTH9xawfIAY4yz7dr2SYg0LS0ZL54xBqPd1d4X++GA7ouRy/OQxaTsvZTNMSq4eHxqbE8dNuNBnn8TTmTcrKRc/GFSCfmmD16uox6t5RyZRwAYN4bSUXiD1cZIlC7HINgo98x/++8QUVF9u6gqhZ/Rd2vp/3DvjpzF2geUgmduwGI7of6hZCPgFkPYtWW+724JPSUkZRBbfBIVGUgdW+WECLNaRGNOkKeRGYva9SXkKdkJ250Zp/8s4/H2Jl2UqIsLWkxixqczw84tJRH4VB6GPgxYKiOt6cnz3or6ZsMv4G1MYSSwj3IHtA==
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=q9yDp3/CKomATBKClSlLcmymUwpZEUGeCxwRlzxFn1o=;
 b=oD3nE4awPfX+lJ1zLNFQf/Ogk1aq1TCVPO9P/z3P2NGNpt8fwhVsJE8I5d2UwuHmvZSyqOlcLFbSSoKFghTQZcoV77SBOr38eKfZhCN6lMEQbsPzCAU0+O1eeWzCtc4CQELFpz0ntmYHy98EiAvJ6sBImJJbaGoRW1qMZOBHrwjRUyPNIVwSynnrRZykXe93ly8W5PlnVzEAdPyKx2TwiO8lJ44OwuY+PyAABuk8jngLdjs2LGQvF5GmB3WaInun18QsQccZzNBrgYv+DeVs7fgYF3k6oS38+XHXyNCJgIrVGtahBbX/YPGqmYhbdfx2cO8fQ46/3NkCTtxGw3gvyw==
Received: from MEYP282MB1878.AUSP282.PROD.OUTLOOK.COM (2603:10c6:220:be::15)
 by SYBP282MB3703.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:1a3::10) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8678.23; Wed, 23 Apr
 2025 06:02:17 +0000
Received: from MEYP282MB1878.AUSP282.PROD.OUTLOOK.COM
 ([fe80::dc32:4068:a067:92b8]) by MEYP282MB1878.AUSP282.PROD.OUTLOOK.COM
 ([fe80::dc32:4068:a067:92b8%2]) with mapi id 15.20.8678.021; Wed, 23 Apr 2025
 06:02:17 +0000
From: =?gb2312?B?0rvWu7TzILfKw6g=?= <blueybf777@outlook.com>
To: "ffmpeg-devel@ffmpeg.org" <ffmpeg-devel@ffmpeg.org>
Thread-Topic: [PATCH] avfilter: add PCM dumping between filters for audio
 debugging
Thread-Index: AQHbs4FR7I/oWjJTTUybqSSDOZn5UA==
Date: Wed, 23 Apr 2025 06:02:17 +0000
Message-ID: <MEYP282MB18784DCA03D764E54E08FC8D88BB2@MEYP282MB1878.AUSP282.PROD.OUTLOOK.COM>
Accept-Language: zh-CN, en-US
Content-Language: zh-CN
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
msip_labels: 
x-ms-publictraffictype: Email
x-ms-traffictypediagnostic: MEYP282MB1878:EE_|SYBP282MB3703:EE_
x-ms-office365-filtering-correlation-id: fc95260f-a3fe-4824-befb-08dd822c66ed
x-microsoft-antispam: BCL:0;
 ARA:14566002|7092599003|8060799006|15080799006|8062599003|461199028|15030799003|5062599005|19110799003|440099028|3412199025|102099032|41001999003|26104999006|12091999003;
x-microsoft-antispam-message-info: =?gb2312?B?NW5LTkZ0cEdLdDc3Y0V4bjNyMEh4ZkdiTnM4cW5hQXp3bkJxdmlRbzZGUTBV?=
 =?gb2312?B?VnBHamVib3dwT0w5TXcycU1QaWtCSklKRjdkRHpDNXg5UUE2dmo4dWs1Z1lK?=
 =?gb2312?B?WmVYNGd5L28xeUhnRkRzcEp2d2hPazE1MXVkNUJZd2NzRFg3WE0wWE9nNDFx?=
 =?gb2312?B?ZlZGU09yek5zaGZYRFNjZzRiY1gvbWl2MzBkamg0dEdVVHIweDJFVlZDK2ph?=
 =?gb2312?B?UUJUV3pCRkdDNXRHNzl1MHhUd09WSzZYQTFITzFaenJDSUtuUlNTenh3N2Mz?=
 =?gb2312?B?QTJKajNPUVFKVDVpVXBMZEI4MWpwTytuZzZZZEFpajJZTzlVMU52T0ZiMXdZ?=
 =?gb2312?B?S1ZGQTNXZEFIT0Z2aEE4enQ2V09NT1Z1N0tDa2JmbHgxRW5MeHR1bk1YUDBJ?=
 =?gb2312?B?am1kdUp4bjQ0cW9HYms0NWZLWWhWZ2tSaEJmTDhqSTV1aUMxM2srb1lrOU9G?=
 =?gb2312?B?NGMzRDRWbmlUWDJlMUdGTUNrdG1BYW13cW1CdGkvNEVVOTRUYmp6SjJpem5S?=
 =?gb2312?B?b1V2L0NtVFNZOEppVnVSTEUyaGcwWDVERE5NamFGa2N2amc1NFpKaXBMSDYy?=
 =?gb2312?B?a1ZPandKazAyMFkzN090dlBHN1M0RWhWcWZwdlcwaHM5cWJtYlRJQy82MXVs?=
 =?gb2312?B?VXhjQ0phV2Jqdmt2VnF2cTFtUW1JNkM2ZGdybVJObkc4RjB4N0NXeGtGVCt5?=
 =?gb2312?B?Tnh3S2RlUE5zbmRuTDZyMGxzNTVuZUMyMmw3dVFiTllIcjUyNTcwR1NGMSty?=
 =?gb2312?B?QW14R3Z6dlVKNlhtWU1LVko1QUxmMVUrTWpTUjNuYnIxcjBkajBabmMwZzVh?=
 =?gb2312?B?VzIwOURxUFlnbDJFd05LeHprKzJ3VVJqUkQ4RWdKc3VIOENkWXRaM0ttMHFT?=
 =?gb2312?B?VDFlbjk2akRrTms3aWdUZzdVNWdlN2JKUXFxd1VudEt0Rkg4ejNiQ2JsbzJ0?=
 =?gb2312?B?VGhqRjQ0VDQ1SElIM3JiMFg2TzdkZEM3Z09PampqWEZwQzJ4cnlueWs3aEdo?=
 =?gb2312?B?ZS9KbVkrYjNWZVNBY0cwU2l1ZDhSV3A0b2FqV1FTNVJyeWZNL1hSR0tLMHRo?=
 =?gb2312?B?aVBJdndYME5QaFF0Z1VHWTlHR2d1M1c0RU5ScTdZUEhsMjc2dml0dFJiaExy?=
 =?gb2312?B?d04rOHJxL2hWUmVLNnNSaG9GSHc3SXlacUdKVVcvRHNGbUZLWkg3MUxCaEhK?=
 =?gb2312?B?RVdBTW11Q25xa2dUNm1QeFVndTJEb0U1R0ZrcDcwQTdmVDBGKy9BRXh3cWY5?=
 =?gb2312?B?K3hpcjVseU9Eai9SeXRqRFZIQ1NDSzROQjVBN05wSG81U1VMaGpxdnRPSWN5?=
 =?gb2312?B?SC9KSXIrSm91dzNhcmkrc2NyVDB0eElKYWdNQWZuejdON2kwbGwzYnp2NUg2?=
 =?gb2312?B?NGhtU0hIL3BPcGVQTmRWUmg1VnNMT1dUelh3V0R4Q083Rk9nMFZ3M1dud01Q?=
 =?gb2312?B?VW5tWllvMW9CR1d1bDdDTjNPUWxNejlBOXVJN2RQYW56dTU1TE5DRGVwS2hp?=
 =?gb2312?B?Ty9ic2hHeDFnaDVWNkM1Z0F2cTJ6RGh0MUsvZUQ2NnRpaS9lc2JnMGZOL0V6?=
 =?gb2312?B?MVdNQTE5NExibkNFUUorbExvamxzZGFKSXBTbTFwZlRrRUFaRUJoZzZPdUNK?=
 =?gb2312?B?S2VPeU1GNWtBZjk2K2pWZ25SaUJIVVZnWExuZVBVTGM3aGtudjFJWkNPMzh6?=
 =?gb2312?B?WlV5YnpYcTlxMkhHdGJDK1FJbWVwRnNuRk96QUJuUGwvUWdWclNHczVBPT0=?=
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0: =?gb2312?B?R3F6dGRtYkpiaXg5NHQ2YTB3eVlVNHZ2TTRDY3FpTzNua0RlZmFZeDlCck5i?=
 =?gb2312?B?eE9kcnl0SWorbE1NU2RQU3lJYjRQMjl5QnEySUtvak9mb1FjUndFMmVkcUlk?=
 =?gb2312?B?KzNsL2hwUUpkT0Z6WEpYSkFvUE9IVzAyb0lxOWU0aVVLZ3IwaVkxQmRYTVY3?=
 =?gb2312?B?Rk9aNlc4VW0rdmJmaVdWcFhpWG5DSUtjL0RGMk9EZFhwUCszVk9KWTcrL0Fr?=
 =?gb2312?B?TVJxYmpjMlhVNTNIRzYxemIzU3l3L3dUbng2U2ZQVEVnRW5CeVI2TFRKSVlr?=
 =?gb2312?B?N3lnbGIzZ0xUK2t1Ly85azVvUmd0UkVsT0V6bEhkSVFmOUJnOXZ6NUpFUVIx?=
 =?gb2312?B?VlBubCs0dFMzVi9EZ0sxTjZzTDF0M3pvOERNa0c0NDRyMTRBUmV3dWFwUVQz?=
 =?gb2312?B?UktMRnZFOEpOZlRwdldSZmN4bElFTmNDeWxveFduenJYQXNoQmpUclZXdmRO?=
 =?gb2312?B?UGIycU9sdTdoVmtxY0VLaXdOMGVPVUpkRTQ5bjg3OTQvSVpPL2VzemdGS0Rp?=
 =?gb2312?B?a1pVUjNTdEdVblNscjQ0WTc1enJXS2w5SmwvVjdCL3I3Z21rOHZhNW5HR1lY?=
 =?gb2312?B?M0pScnYva3RBdXRyVEZOOWoxRGlTbkxTMkpCVk1pUDlPRG9NRVJYOWRiZnkw?=
 =?gb2312?B?NGJ3NGYwVHJzY2szb1ZCN0VFb1g2aTBWU2ZRemF2cTNtQXpqYmVsdDdtdU85?=
 =?gb2312?B?c1kzemdwMnc4SVJQVk5aVWdqNmRCcWFTMk5hbnl6eHVieDYxSk9XeDFabnNI?=
 =?gb2312?B?b2hwakFwR3RHQjdGSUYraHBYdldVYzBjV0VId29hSy85bXYwdXhDcE4rMHRF?=
 =?gb2312?B?Q0M1VlhMc3ozVHJsSlFvV0FpZGIzUWNZeFNlUXhxYzZJTWJMQnI5R20vOE1z?=
 =?gb2312?B?RnJyR3kwVStJek84SkNMMGFwU1ZTMndTMTF6dTYvVXh6TWRvbHpkQlZvMk9h?=
 =?gb2312?B?Z1ZrL09QbUJXeUVpMWVrNng3enordzg5aENqRFkrVlVld1ovWCtpZjJhV0hh?=
 =?gb2312?B?RkNGdWRKUjA1NDZ4TS9PVWRnQmlHeWk2NUY2Z0JrQXJQWHlUbGYzR3p2aVFQ?=
 =?gb2312?B?dmZZQ3FjaDJEZ09ZSUZxaDNRQXRrSUdGcWpHVy94Y3J3dEdGVmkrYXowek52?=
 =?gb2312?B?aWpZNndkWW12NStTTkg3UTFNSlluVVZZSnJHbitZZzBkZ2VxUFNNWGVmbXli?=
 =?gb2312?B?cElZWmR1ckdYclM3WW9JdHJKcmtRRjJDU1A0V0h3aVVXdUxXNlo0U1FWMEth?=
 =?gb2312?B?TWhGTmt3MFo2NVNxUGEybTZtMTYwYzlMYnBmblBsbkhIVkpOZlF5dkM4bXN0?=
 =?gb2312?B?dlFIRkV5cFFPWWluSHhwZkhHTWY1bnFGZllwbWdRQ01VMm8rZWpIS0dUMDg1?=
 =?gb2312?B?ZHhEbVVrNXE2VWQzeURNV2xFdE9aMnBlY3FFYkd2UGsvQXVPaUg3eE9oSG9r?=
 =?gb2312?B?Z1hZY0NnMjVWSWc0NU5NSGw3Z3QxU3FjWDd3akhBWHpsY3NyWXdJLzRNdXRK?=
 =?gb2312?B?VVN1ajNqemtPQjB5SFVHZExFUmhoSEpuQlVjL3JBOFBhS3laNEZQR1R3Tm4v?=
 =?gb2312?B?MlJnTytzL0NVdVFwZ1p0V2pvemVYNWRiUVRKV25ETGdCdFNUbHF0cVdSSTZ3?=
 =?gb2312?Q?iSpYYn6D60WM5VEsYZ1TjhUDflg+Bn9fdLYzlI0cUJiw=3D?=
MIME-Version: 1.0
X-OriginatorOrg: outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: MEYP282MB1878.AUSP282.PROD.OUTLOOK.COM
X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000
X-MS-Exchange-CrossTenant-Network-Message-Id: fc95260f-a3fe-4824-befb-08dd822c66ed
X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Apr 2025 06:02:17.3105 (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: SYBP282MB3703
X-Content-Filtered-By: Mailman/MimeDel 2.1.29
Subject: [FFmpeg-devel] [PATCH] avfilter: add PCM dumping between filters
 for audio debugging
X-BeenThere: ffmpeg-devel@ffmpeg.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: ffmpeg-devel-bounces@ffmpeg.org
Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
Archived-At: <https://master.gitmailbox.com/ffmpegdev/MEYP282MB18784DCA03D764E54E08FC8D88BB2@MEYP282MB1878.AUSP282.PROD.OUTLOOK.COM/>
List-Archive: <https://master.gitmailbox.com/ffmpegdev/>
List-Post: <mailto:ffmpegdev@gitmailbox.com>

This patch introduces PCM dumping support between AVFilter links, intended for audio debugging.

It adds a configure-time option `--dumpdir=PATH` to specify the output directory for raw PCM data (default: /tmp/).

Two commands are exposed to control dumping:
  - dump_raw_start <dst_filter_name>
  - dump_raw_stop <dst_filter_name>

Dump files are written as: srcname-dstname-channel.pcm

Supports packed and planar formats. File descriptors are managed automatically and work only on audio links.

Example usage:
    avfilter_process_command(filter, "dump_raw_start", "volume", NULL, 0, 0);

This feature helps developers debug filter behavior by inspecting intermediate audio data.
---
>From 6a31c85afd2800c09076c1e2b7c734c7b719f73d Mon Sep 17 00:00:00 2001
From: Yibo Fang <blueybf777@outlook.com>
Date: Wed, 23 Apr 2025 09:17:51 +0800
Subject: [PATCH 1/1] avfilter: add PCM dumping between filters for audio
 debugging

This patch adds the ability to dump raw PCM audio data between AVFilter links.
It introduces a configure-time option `--dumpdir=PATH` to control the output
directory of dump files (default: /tmp/). This feature is helpful for debugging
filter behavior and verifying audio processing.

Two filter commands are added:
  - dump_raw_start <dst_filter_name>
  - dump_raw_stop <dst_filter_name>

The PCM files are written in the format: srcname-dstname-<channel>.pcm.

Supports both packed and planar formats. File descriptors are automatically
managed. Works only on audio links.

Example usage:
  avfilter_process_command(filter, "dump_raw_start", "volume", NULL, 0, 0);

Signed-off-by: Yibo Fang <blueybf777@outlook.com>
---
 configure              |   7 +++
 libavfilter/avfilter.c | 110 +++++++++++++++++++++++++++++++++++++++++
 libavfilter/avfilter.h |   4 ++
 3 files changed, 121 insertions(+)

diff --git a/configure b/configure
index c94b8eac43..381633749d 100755
--- a/configure
+++ b/configure
@@ -524,6 +524,7 @@ Developer options (useful when working on FFmpeg itself):
   --disable-large-tests    disable tests that use a large amount of memory
   --disable-ptx-compression don't compress CUDA PTX code even when possible
   --disable-version-tracking don't include the git/release version in the build
+  --dumpdir=PATH           location of pcm dump files to save.

 NOTE: Object files are built at the place where configure is launched.
 EOF
@@ -2690,6 +2691,7 @@ PATHS_LIST="
     prefix
     shlibdir
     install_name_dir
+    dumpdir
 "

 CMDLINE_SET="
@@ -4123,6 +4125,9 @@ incdir_default='${prefix}/include'
 libdir_default='${prefix}/lib'
 mandir_default='${prefix}/share/man'

+# runtime path
+dumpdir_default='/tmp/'
+
 # toolchain
 ar_default="ar"
 cc_default="gcc"
@@ -8118,6 +8123,7 @@ DOCDIR=\$(DESTDIR)$docdir
 MANDIR=\$(DESTDIR)$mandir
 PKGCONFIGDIR=\$(DESTDIR)$pkgconfigdir
 INSTALL_NAME_DIR=$install_name_dir
+DUMPDIR=$dumpdir
 SRC_PATH=$source_path
 SRC_LINK=$source_link
 ifndef MAIN_MAKEFILE
@@ -8267,6 +8273,7 @@ cat > $TMPH <<EOF
 #define CONFIG_THIS_YEAR 2025
 #define FFMPEG_DATADIR "$(eval c_escape $datadir)"
 #define AVCONV_DATADIR "$(eval c_escape $datadir)"
+#define FFMPEG_DUMPDIR "$(eval c_escape $dumpdir)"
 #define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
 #define OS_NAME $target_os
 #define EXTERN_PREFIX "${extern_prefix}"
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index 64c1075c40..9fc6308544 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -19,6 +19,9 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */

+#include <fcntl.h>
+#include <unistd.h>
+
 #include "libavutil/avassert.h"
 #include "libavutil/avstring.h"
 #include "libavutil/bprint.h"
@@ -195,6 +198,66 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad,
     return 0;
 }

+static av_cold void link_uninit_dump_pcm(AVFilterLink *link, int stop)
+{
+    if (link->dump_pcm_fds) {
+        int i;
+        for (i = 0; i < link->nb_dump_pcm_fds; i++) {
+            if (link->dump_pcm_fds[i])
+                close(link->dump_pcm_fds[i]);
+        }
+        av_free(link->dump_pcm_fds);
+        link->dump_pcm_fds    = NULL;
+        link->nb_dump_pcm_fds = 0;
+    }
+
+    if (stop)
+        link->dump_pcm = 0;
+}
+
+static av_cold int link_init_dump_pcm(AVFilterLink *link)
+{
+    char path[4096];
+    int fd, i;
+
+    link->nb_dump_pcm_fds = av_sample_fmt_is_planar(link->format)? link->ch_layout.nb_channels : 1;
+    link->dump_pcm_fds = av_malloc_array(link->nb_dump_pcm_fds, sizeof(int));
+    if (!link->dump_pcm_fds)
+        return AVERROR(ENOMEM);
+
+    for (i = 0; i < link->nb_dump_pcm_fds; i++) {
+        snprintf(path, sizeof(path), FFMPEG_DUMPDIR"%.16s-%.8s-%d.pcm", link->src->name, link->dst->name, i);
+        fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+        if (fd < 0) {
+            link_uninit_dump_pcm(link, 1);
+            return AVERROR(errno);
+        }
+        link->dump_pcm_fds[i] = fd;
+    }
+
+    return 0;
+}
+
+static int filter_set_dump_pcm(AVFilterContext *filter, const char *target, int set)
+{
+    int i;
+
+    for (i = 0; i < filter->nb_outputs; i++) {
+        AVFilterLink *link = filter->outputs[i];
+        if (!target || !strcmp(link->dst->name, target)) {
+            if (set) {
+                link->dump_pcm = 1;
+            } else
+                link_uninit_dump_pcm(link, 1);
+
+            if (target)
+                return 0;
+        }
+    }
+
+    return target ? AVERROR(EINVAL) : 0;
+}
+
 static void link_free(AVFilterLink **link)
 {
     FilterLinkInternal *li;
@@ -208,6 +271,8 @@ static void link_free(AVFilterLink **link)
     av_channel_layout_uninit(&(*link)->ch_layout);
     av_frame_side_data_free(&(*link)->side_data, &(*link)->nb_side_data);

+    link_uninit_dump_pcm(*link, 1);
+
     av_buffer_unref(&li->l.hw_frames_ctx);

     av_freep(link);
@@ -617,6 +682,10 @@ int avfilter_process_command(AVFilterContext *filter, const char *cmd, const cha
         if (res == local_res)
             av_log(filter, AV_LOG_INFO, "%s", res);
         return 0;
+    }else if(!strcmp(cmd, "dump_raw_start")) {
+        return filter_set_dump_pcm(filter, arg, 1);
+    }else if(!strcmp(cmd, "dump_raw_stop")) {
+        return filter_set_dump_pcm(filter, arg, 0);
     }else if(!strcmp(cmd, "enable")) {
         return set_enable_expr(fffilterctx(filter), arg);
     }else if (fffilter(filter->filter)->process_command) {
@@ -1050,6 +1119,41 @@ fail:
     return ret;
 }

+static int link_dump_frame(AVFilterLink *link, AVFrame *frame)
+{
+    int samples_size, ret;
+
+    if (!link->dump_pcm_fds) {
+        ret = link_init_dump_pcm(link);
+        if (ret < 0)
+            return ret;
+    }
+
+    samples_size = av_get_bytes_per_sample(frame->format) * frame->nb_samples;
+    if (av_sample_fmt_is_planar(frame->format)) {
+        int i;
+        for (i = 0; i < link->nb_dump_pcm_fds && i < frame->ch_layout.nb_channels; i++) {
+            if (i < AV_NUM_DATA_POINTERS) {
+                ret = write(link->dump_pcm_fds[i], frame->data[i], samples_size);
+            } else
+                ret = write(link->dump_pcm_fds[i], frame->extended_data[i - AV_NUM_DATA_POINTERS], samples_size);
+
+            if (ret < 0)
+                goto err;
+        }
+    } else {
+        ret = write(link->dump_pcm_fds[0], frame->data[0], samples_size * frame->ch_layout.nb_channels);
+        if (ret < 0)
+            goto err;
+
+    }
+
+    return 0;
+err:
+    link_uninit_dump_pcm(link, 1);
+    return AVERROR(errno);
+}
+
 int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
 {
     FilterLinkInternal * const li = ff_link_internal(link);
@@ -1087,6 +1191,12 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
                                        link->time_base);
     }

+    if (link->dump_pcm && link->type == AVMEDIA_TYPE_AUDIO) {
+        ret = link_dump_frame(link, frame);
+        if (ret < 0)
+            av_log(link->dst, AV_LOG_ERROR, "Dump pcm files failed with %d\n", ret);
+    }
+
     li->frame_blocked_in = li->frame_wanted_out = 0;
     li->l.frame_count_in++;
     li->l.sample_count_in += frame->nb_samples;
diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
index a89d3cf658..6d04b9da77 100644
--- a/libavfilter/avfilter.h
+++ b/libavfilter/avfilter.h
@@ -404,6 +404,10 @@ struct AVFilterLink {
     int sample_rate;            ///< samples per second
     AVChannelLayout ch_layout;  ///< channel layout of current buffer (see libavutil/channel_layout.h)

+    int        dump_pcm;       ///< flag to dump pcm
+    int        *dump_pcm_fds;   ///< dump files
+    unsigned nb_dump_pcm_fds;   ///< number of dump file
+
     /**
      * Define the time base used by the PTS of the frames/samples
      * which will pass through this link.
--
2.34.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".