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".