From patchwork Sun Aug 28 21:19:54 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 37528 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp1584729pzh; Sun, 28 Aug 2022 14:21:09 -0700 (PDT) X-Google-Smtp-Source: AA6agR7K8KrGKghv5hUMbc00CgP9y7OaCXm2W46J7Z647O0K7gMvZIDFjx1ntijz7eDpWqqeiEN6 X-Received: by 2002:a05:6402:510a:b0:43d:ab25:7d68 with SMTP id m10-20020a056402510a00b0043dab257d68mr14214976edd.102.1661721669132; Sun, 28 Aug 2022 14:21:09 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id s1-20020a17090699c100b0073d8a8fedbfsi5741095ejn.386.2022.08.28.14.21.08; Sun, 28 Aug 2022 14:21:09 -0700 (PDT) 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=TVsNaOK0; 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 D49F768B9DB; Mon, 29 Aug 2022 00:20:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2094.outbound.protection.outlook.com [40.92.91.94]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1648268B9CA for ; Mon, 29 Aug 2022 00:20:27 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nlUxtBx/QbU3LgKwDpWKiz6L8VVJJN91/dF+TlzT5b7QweVjf6hVqAP5yfymzrEy3bdYBUmnbcZGFJK+0IdOhAFZ+pS5cwsQ6PyUpjM3YR6mFp8yCrrjQ8enKQoM6Ysh3r3UZMEe3tSDrqcjgTpVZDEKb6+Wfv09ccMIQEwgYsm46sE954m+/5yv6TCGu8zK+3OORqrqroRmtBpzM9oxS4kPBh8/JnHnRp06fafg5OWrOaKCyyWJD9tco61wS5es+xIcCfRIF+vVW2oNbni+39PenVrC1gVaLp3IZZx79/i4rM+QyglOT3tFtppZqp2ir4VAoIEA5eM988DauueaiQ== 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=LZG0ljye4Nin5+U58R1A7H6snn7idCBLxDaLUk7PN1s=; b=fh0XRp6YNq7shRkt9xhyG9Ho3bbcfGHDtJMnJY+5f/W4NS9wJzj433TRLBtSb3VcP7LN/aHl+fK3Lkg3yzNgaKUV3YyUxaEIEmDdOUhFQ5NJkcNJMu4nAMSYMOwpVQlW03LU294r8JVlOUX+gjyovnv0yrl7bz3cIuGow1sW/Rbv9DtvZIue+CWzB0XEPKP9LobWflW3ADVgNLQ9TP+xA2fclrupBY+sWABB9kaahRnpIo/ROE2ycvBKcIrwfxwmK9F8QBlbGzwLgV/IQ3/YCklwB3vRhMC8aiuDerNm1Axi4StocGiaXZmeEu3FKwSJPy/6sYo8BtzgI/Pmxr+UEg== 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=LZG0ljye4Nin5+U58R1A7H6snn7idCBLxDaLUk7PN1s=; b=TVsNaOK0fxtrmHHMxZWk4+hjKx2lybpSsPCe6Egid0Rgn1Hg76xGgQgDxGAAA+gEYez65lAiU/JL1m+CIyetcyZOjVJ13U185UVDAoX8eQ5VK74aY5MAnZCAZ4p/5l5ppEFUiJUr926Kj40UujQ6+lVpObswyljHUlk9pE5ZI3CgOLRWsKJMzST0ELUyabgQmOaGMnp/f05SzHuspAmndW4cBkMauUg+oYwuCruGS7rao3ZMf5pYiS/92icE0WC4lGk/dnLRELMENiYS0F9kYy2oCXYvYVhvoktTBCPIhc+5Mb+Li0hTM5yqK71rfhjfC3OkMfeL4GIfmNvizJLsvQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by DU0P250MB0747.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:3cb::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5566.15; Sun, 28 Aug 2022 21:20:19 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::7d2a:d9d8:f384:4cee]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::7d2a:d9d8:f384:4cee%9]) with mapi id 15.20.5566.021; Sun, 28 Aug 2022 21:20:19 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 28 Aug 2022 23:19:54 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [BU26I/YSuBPbu53+85jZXRTcaZXVHKeV] X-ClientProxiedBy: AS9PR06CA0114.eurprd06.prod.outlook.com (2603:10a6:20b:465::12) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20220828211957.472263-7-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: bfa31310-8f84-4d25-b91b-08da893b1c2a X-MS-Exchange-SLBlob-MailProps: AZnQBsB9XmrlP0uwnDwxs8RZ0OmP5JOdKM2LL3LPZOvRxKg6YE+DiBhj4rXXEjUe1YOwqsNWQ1AWYqqdxXass23Qz051IQxq7rrO4HywyEClrRGuTa6YLDbGKjimxf/thbzCFWPBAu+sB07l5208kzSB7YY7e3mOcVy2oBsxNBUT/dyxDx9Nj2GPGAMmPK0CjiadBH+qoy9qp3XC0LFJ+82SZ/7+kUmEa8nhJEWzzQE5nMMnlVJgbiA6fGRnOl3ZxeS79paTFFtvi2tmbEm5S2rvO/Bho3vd2zAEIwaAjGV3n0qaoKaIfgM9T9tKNNbIyGE3j6OBtWzLLcA8odcqRoE5qm/riEaBS/GQyfL0AvLN3ZwxRlLn3uFqM89/HT/GRmShF7NXMLjcf7/I7Ud8eBUfis0bsEgT6sHcYGUnT5nJrOAqupjzzYHB11GGUC20uiKPf0S7R3OeN6DATRF8e41GNq9sWw5on+bMtdm4FOJUACEGeE/EqEbDWpobks2vWgboFH7EewvI1abs9Vb/PcrF7kp58UHyImhtXRXaTGyAQ6ND3wLrULQdKaHy75wiSvqQCBWq0dF0FatldPZz7Ee9otfoM2rAWAP4XfRvMfwtraDSr4pNvuPcoWCPvLu8xvGcPdTBtLeZagpJVPWJ66tOFlD+5ooSQj7d96xivZVLaAFwDdlLv2VuPgVm2ULdCgm7yGFAj8bnV3Us+LubRU9nd3Ob2S7ewi5OWxA0oS5Uy5O8RmbIgl/g8fbIC7JDKjia/l4ByOM= X-MS-TrafficTypeDiagnostic: DU0P250MB0747:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: +XjB6C0rP8tEMhqAhy2v6HNv3hXjS2uqIC5ntTuJ4+FgbtBGb6WqAUE9ocdPtUmAV3Gzy+6OQqsUjmu9lBHBD9TBRdTc8qQO3yi85j//6mkEJnKhYt0Y863kZMG8AgOnDVUwGkWx4jXREstCPgRLJjVDHMN/RGmCVwJito+8Mc1DJIy03q4IXAmGfLCmUgthJJZeuq/AFzh3NmtI7yxR1V4PREfRPHa5y8jeRccGDbv012pg+Xs97htisC+kNobrB4dLBnKHlrl9zU8l9q7c/WLEMvpj30Qr3APUkDz3vDySe7ZDDeE40q1ToljAeIMkHPyLjuKAO62NCFEHJ8sfpB7gb0m4xkJa522KGeEnCd+McXrs7KM2/vhCg3Z47C+hlAnDtEFoHoIOzDmydLIc9YSjeSkubX7yKKri/2jXIZ92D9Lk5v5Q7gVUZZ0S5PUeOjgNWYmx6AKiUcCA9aUtWG3N9qfb6EBtvlcN8sasyGWvZjABX9fFmdIPpH6cBTLc0vD6SSORS4eHZqPzetZvqCF1HT+lhruKG0edZhY7oSj3pXo1CMjLTjdS/Kwf1uKV4yCYP6cRf2kwitnbLpYY4hwep6kvpiw0MlPLUpv8OGAye3Mpgzy2XlQ1I7qNNku7N/gA4ULakpuyw0IVS616DA== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: DOxzZs/zh9L3o8D2XN+HBaPIolJWs9tiKB4cN+AAykJZzUgq+EZbYEoVz5QNQmvU+Hioxiylo/K6kgB53HvpeKmhSOUkdfEB4SaCONpscVd5cQXYD2vskaMo9jbfGsm4CabgNJ3/a++k5OI8labcatxq/aHSoWcC4Pxn1RGss9L8E0/kB2U+hLaiyPkfmMEQ+IsMNYBmSPGWcWi14kNnsDUS80PxgVjkRKjGM7qLMiUg0Cn8Tww2vZ7bmYgLfyq1tGhrR6Ff6sHM87qvL9UpOPDefvPfp5Z0lXDTk55xuHmRSyfalQ6DHt1BNlLjGneyolnp0xIZUpyN2kPEMHd+PNACfSdVZ+M0uyOaYMxrous/3sv6I1dx90vOur+bQlosLWqKYVLSgEH5H+slgiZcEM6vzr8opiJhnKZ5TOwxfDElzDsmrvCetPpUAd9oLvZ050XcpD2utciPturULiDJ0HpK0bhkY1BCn95imjSO3N34r+UidfML+UDfUl4WWuOcayU9X7DESSGMXxkVo8EpZooP9zv9WT2lwf7URx43Oz3A1UriKjIfIN/xQ+Rel5gkBLi0j+PjlBwef58hlTNxh+2ikFrJ7e+QBXc3uVLTztr9IyFsHMVSLRiTLiGft3Jiqjj7TqkyuMA3ATY0aMvXI0Pu1LmwktKjpd1D/aEggW3p9JdVBNkUeyiGFRINwAOyCEvrSBp6s6QCHPOiqNrMHT87X/3STXx0++AHmtf8/cNLTZePlKWvHH8687iN4c++iqtr9qKvtogQHa2Asr5noxhLSBz/7oMFkyEhbMiqLtJV2zLycnDSq0wQKJoUE4A86m+h777J4ybskHPq+JoceHlfrNHhf3NbyMa6Rohwn6GA2K7qjGqa7iALTctFsKf/a1KjiceUunHvSbIy8zRVXF/zFfIsUgObsWEJAPMIXv3Ef2VJhBKUf19vK9iHqT5aVAPXV1od2qh9Hf5aMfgT97D3mHLsfb540uMbNqUmm0XVVX8HHzgNER4J6jrKar9KiBeKq3L4h8Yf5qkvO7RgU+EXrwN159GJBuyxdBJdh/ogB7NsaaqGRTsX7R/TmZ48+FMYz8DmeXDnQMNeHQhXs0vODKi2fCQ6+4NBku0AHXNl5cZnla5CdaYkcv32ma1b82kkUsPYNrP0jLCNJFNxNCp/6WMt2Oj5zHOxpYHfsTYJY3iTnVYsPrLa7cpWQQdOY9fTHnITPr8bjpG82Cd9AVxKJV7Sm2rQ1ffVm6GG4UzEpqjTuCyb+JLVRAnY6MhkU7jDbcW6sW2Y6UTMsW6b/UQg9boXD9QvDO2b38z8Re4= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: bfa31310-8f84-4d25-b91b-08da893b1c2a X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Aug 2022 21:20:19.7339 (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: DU0P250MB0747 Subject: [FFmpeg-devel] [PATCH 08/11] avcodec/flac: Move decoder+parser stuff into a new header, flac_parse.h 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: T1TPI13ezEk7 (The FLAC parser currently ignores the streaminfo block; therefore some of this is decoder-only. Given that the FLAC parser should probably use the streaminfo block, this stuff is moved to flac_parse.h.) Signed-off-by: Andreas Rheinhardt --- libavcodec/flac.c | 1 + libavcodec/flac.h | 66 +---------------------------- libavcodec/flac_parse.h | 89 ++++++++++++++++++++++++++++++++++++++++ libavcodec/flac_parser.c | 2 +- libavcodec/flacdec.c | 1 + 5 files changed, 94 insertions(+), 65 deletions(-) create mode 100644 libavcodec/flac_parse.h diff --git a/libavcodec/flac.c b/libavcodec/flac.c index 1da8aed21b..352d663c67 100644 --- a/libavcodec/flac.c +++ b/libavcodec/flac.c @@ -26,6 +26,7 @@ #include "get_bits.h" #include "flac.h" #include "flacdata.h" +#include "flac_parse.h" static const int8_t sample_size_table[] = { 0, 8, 12, 0, 16, 20, 24, 0 }; diff --git a/libavcodec/flac.h b/libavcodec/flac.h index dbfca546cf..fd899ef72c 100644 --- a/libavcodec/flac.h +++ b/libavcodec/flac.h @@ -1,5 +1,5 @@ /* - * FLAC (Free Lossless Audio Codec) decoder/demuxer common functions + * FLAC (Free Lossless Audio Codec) common stuff * Copyright (c) 2008 Justin Ruggles * * This file is part of FFmpeg. @@ -21,15 +21,13 @@ /** * @file - * FLAC (Free Lossless Audio Codec) decoder/demuxer common functions + * FLAC (Free Lossless Audio Codec) common stuff */ #ifndef AVCODEC_FLAC_H #define AVCODEC_FLAC_H -#include "avcodec.h" #include "bytestream.h" -#include "get_bits.h" #define FLAC_STREAMINFO_SIZE 34 #define FLAC_MAX_CHANNELS 8 @@ -55,66 +53,6 @@ enum { FLAC_METADATA_TYPE_INVALID = 127 }; -/** - * Data needed from the Streaminfo header for use by the raw FLAC demuxer - * and/or the FLAC decoder. - */ -typedef struct FLACStreaminfo { - int samplerate; /**< sample rate */ - int channels; /**< number of channels */ - int bps; /**< bits-per-sample */ - int max_blocksize; /**< maximum block size, in samples */ - int max_framesize; /**< maximum frame size, in bytes */ - int64_t samples; /**< total number of samples */ -} FLACStreaminfo; - -typedef struct FLACFrameInfo { - int samplerate; /**< sample rate */ - int channels; /**< number of channels */ - int bps; /**< bits-per-sample */ - int blocksize; /**< block size of the frame */ - int ch_mode; /**< channel decorrelation mode */ - int64_t frame_or_sample_num; /**< frame number or sample number */ - int is_var_size; /**< specifies if the stream uses variable - block sizes or a fixed block size; - also determines the meaning of - frame_or_sample_num */ -} FLACFrameInfo; - -/** - * Parse the Streaminfo metadata block - * @param[out] avctx codec context to set basic stream parameters - * @param[out] s where parsed information is stored - * @param[in] buffer pointer to start of 34-byte streaminfo data - * - * @return negative error code on faiure or >= 0 on success - */ -int ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s, - const uint8_t *buffer); - -/** - * Validate the FLAC extradata. - * @param[in] avctx codec context containing the extradata. - * @param[out] format extradata format. - * @param[out] streaminfo_start pointer to start of 34-byte STREAMINFO data. - * @return 1 if valid, 0 if not valid. - */ -int ff_flac_is_extradata_valid(AVCodecContext *avctx, - uint8_t **streaminfo_start); - -/** - * Validate and decode a frame header. - * @param avctx AVCodecContext to use as av_log() context - * @param gb GetBitContext from which to read frame header - * @param[out] fi frame information - * @param log_level_offset log level offset. can be used to silence error messages. - * @return non-zero on error, 0 if ok - */ -int ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, - FLACFrameInfo *fi, int log_level_offset); - -void ff_flac_set_channel_layout(AVCodecContext *avctx, int channels); - /** * Parse the metadata block parameters from the header. * @param[in] block_header header data, at least 4 bytes diff --git a/libavcodec/flac_parse.h b/libavcodec/flac_parse.h new file mode 100644 index 0000000000..67a7320bea --- /dev/null +++ b/libavcodec/flac_parse.h @@ -0,0 +1,89 @@ +/* + * FLAC (Free Lossless Audio Codec) decoder/parser common functions + * Copyright (c) 2008 Justin Ruggles + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * FLAC (Free Lossless Audio Codec) decoder/parser common functions + */ + +#ifndef AVCODEC_FLAC_PARSE_H +#define AVCODEC_FLAC_PARSE_H + +#include "avcodec.h" +#include "get_bits.h" + +typedef struct FLACStreaminfo { + int samplerate; /**< sample rate */ + int channels; /**< number of channels */ + int bps; /**< bits-per-sample */ + int max_blocksize; /**< maximum block size, in samples */ + int max_framesize; /**< maximum frame size, in bytes */ + int64_t samples; /**< total number of samples */ +} FLACStreaminfo; + +typedef struct FLACFrameInfo { + int samplerate; /**< sample rate */ + int channels; /**< number of channels */ + int bps; /**< bits-per-sample */ + int blocksize; /**< block size of the frame */ + int ch_mode; /**< channel decorrelation mode */ + int64_t frame_or_sample_num; /**< frame number or sample number */ + int is_var_size; /**< specifies if the stream uses variable + block sizes or a fixed block size; + also determines the meaning of + frame_or_sample_num */ +} FLACFrameInfo; + +/** + * Parse the Streaminfo metadata block + * @param[out] avctx codec context to set basic stream parameters + * @param[out] s where parsed information is stored + * @param[in] buffer pointer to start of 34-byte streaminfo data + * + * @return negative error code on faiure or >= 0 on success + */ +int ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s, + const uint8_t *buffer); + +/** + * Validate the FLAC extradata. + * @param[in] avctx codec context containing the extradata. + * @param[out] format extradata format. + * @param[out] streaminfo_start pointer to start of 34-byte STREAMINFO data. + * @return 1 if valid, 0 if not valid. + */ +int ff_flac_is_extradata_valid(AVCodecContext *avctx, + uint8_t **streaminfo_start); + +/** + * Validate and decode a frame header. + * @param avctx AVCodecContext to use as av_log() context + * @param gb GetBitContext from which to read frame header + * @param[out] fi frame information + * @param log_level_offset log level offset. can be used to silence error messages. + * @return non-zero on error, 0 if ok + */ +int ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, + FLACFrameInfo *fi, int log_level_offset); + +void ff_flac_set_channel_layout(AVCodecContext *avctx, int channels); + +#endif /* AVCODEC_FLAC_PARSE_H */ diff --git a/libavcodec/flac_parser.c b/libavcodec/flac_parser.c index 81b6f12ab3..a1d9cd7f29 100644 --- a/libavcodec/flac_parser.c +++ b/libavcodec/flac_parser.c @@ -36,7 +36,7 @@ #include "libavutil/crc.h" #include "bytestream.h" #include "parser.h" -#include "flac.h" +#include "flac_parse.h" /** maximum number of adjacent headers that compare CRCs against each other */ #define FLAC_MAX_SEQUENTIAL_HEADERS 4 diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c index 23e9eba4ad..c5d9e95168 100644 --- a/libavcodec/flacdec.c +++ b/libavcodec/flacdec.c @@ -44,6 +44,7 @@ #include "flac.h" #include "flacdata.h" #include "flacdsp.h" +#include "flac_parse.h" #include "thread.h" #include "unary.h"