From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 2B7804D404 for ; Sat, 31 May 2025 20:34:39 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 3131E68DEDC; Sat, 31 May 2025 23:34:35 +0300 (EEST) Received: from EUR03-VI1-obe.outbound.protection.outlook.com (mail-vi1eur03olkn2028.outbound.protection.outlook.com [40.92.57.28]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 46FD668DEC7 for ; Sat, 31 May 2025 23:34:28 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PhsOEYeYfLPi6XgGh9xUFgvcP1nfTnXk6U3Wth2ZZBrbQBp2kYpWgk/SS5XCBqFmgaP/s0fnigf74VOJ+rXDOcEJbawz4F7ynuS+duuliqXK6ZiuuFBdI90IKpYRSnkGF3yWIkVqsUSauWddlttYxoUg33b5mIvsVQjhwO6UIaPc4PwEt5iauvgYwnKvAEqitVCcloLRDLbgbIl5+DG7km3xbOEw6A70Y5XiQ3TppQ6OUWF/+RRy7+HE8PnsQ03nwNDJ+yvbCCkoZlYGIR7KHawxHp6uzf/Ki2x3lXjyvu04BwOY3vPHjvxLNmcoM4PzEOqEffHyBOy5hXZ1DayMkQ== 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=NZbQdDQPPKqJAo1VZqD+jGs3by/Y6mG5VrIZT2gFlks=; b=mYgKccbjjuMlt30C0lufVnBJbo+goGjqolUPXYOo5Ltjbuc03KzIEokwCGNWak2MxIrc8S/viktS5K0J01pWtgLvOuHxRcNjk5MthqcOozoth6OrAHFMdLCFWSiWXzV5ICXS9LDQgBLvzgtt/p4B8DxCLAYhgBszvNdFGXc2hj2pkFV5wq2NLjYnICEShSkDndR6IObQyLqi2yTYH0Cwb686W6i/Xoo9XLNu0yYI7+J2JI+1rFtqTQqNlScp55n9adNH9wcL8LyXM3DYm95OIfxVSuuujZUcFuF44/9GqA609iKBtXqYCu3ERln028Gr9k3oM4gfDv/IR3okrFYiOg== 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=NZbQdDQPPKqJAo1VZqD+jGs3by/Y6mG5VrIZT2gFlks=; b=jDGkZGesN7bZIJLOPdt00mG0whxXXZ/TdwckwaDBM6yR0w66KoqRXQloQp93fYLXb3dK+W1OakxNgQYl17gV2vtpBPo3uEnUeBk2tLE0cG7qpLUuXUF/ZGgeLdyAj6ezvo2X3Xx/mzHi3jl4S+/oMpgs99PCtgQCXw00j5bqRQKUDHH0AJUwwxWcSLCoacng17VA06TnOcpkkMWbyUDAKJf7vA1Q3SNog4bQ/gymABdE+IuebCKvdvSyqAubmabrFMBI3FpV4NGs9V2LIgpVjuWmXv9AlqEpHKH7/NJGfWgzRrlbu3CVFH4G/LTptZYTuIeEIZy3XcAoZ4F50ffuKQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AS8P250MB0235.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:37a::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8769.29; Sat, 31 May 2025 20:34:26 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::384d:40d4:ecb7:1c9]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::384d:40d4:ecb7:1c9%3]) with mapi id 15.20.8769.021; Sat, 31 May 2025 20:34:26 +0000 Message-ID: Date: Sat, 31 May 2025 22:34:25 +0200 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: <20250427114451.1236-1-toqsxw@outlook.com> <20250427114451.1236-10-toqsxw@outlook.com> Content-Language: en-US From: Andreas Rheinhardt In-Reply-To: <20250427114451.1236-10-toqsxw@outlook.com> X-ClientProxiedBy: FR2P281CA0009.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a::19) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <5e7cd13c-8082-438c-b71b-88d744c53437@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AS8P250MB0235:EE_ X-MS-Office365-Filtering-Correlation-Id: a21068aa-6f63-4da9-dadd-08dda082890b X-Microsoft-Antispam: BCL:0; ARA:14566002|15080799009|6090799003|5072599009|7092599006|41001999006|8060799009|461199028|19110799006|440099028|3412199025|12091999003; X-Microsoft-Antispam-Message-Info: =?utf-8?B?N2xkSUoxUUhTK2dvRVZEM2FuREt6RGJaaUZTbTl1VFBQWUxWVEg3WGZvMU9T?= =?utf-8?B?ekczMWpVWW1samlyWElEQzAzNU1RSmk2N3F4TVZ2OWozQUhGV2FmamFidzV0?= =?utf-8?B?TjlSR292eWV1bzRmL1ZvR3FVdG8vK29iRE5zTDVqY200aDZmZnY4Rkw2L3BI?= =?utf-8?B?V0dvOXNSSWpHQ2RGblNTM2pLZUw3TzVLWHVBSTgzWDBYNmFkTXJYTXptT2Vw?= =?utf-8?B?ZjlZdWdOWFltWHBuTkx3U2VUaDF4bkpNSU0zTDNxVE9LYVpsdzlvaEVEVXJt?= =?utf-8?B?OUtuKzhzbWt2NzlUQmh1bEU4K0dmbkt4dndob2NWOXJML0NCeFBhTTlJS01H?= =?utf-8?B?RkdNUDQ0WHFYbW45dXBpaDVsZGNYenpwMXNYOGFRalJFNkloVzZieHVUMWlR?= =?utf-8?B?aGY4UEFQSEhBQko3ak1IbEVtK3JhNFhlYnVOQVFJZi9KUmZybjhVOEt6Z2xV?= =?utf-8?B?TjR4dmZxWmEwYzNvcVRkVlIyZllVZFdWOE5mTitYZVZFcDZZSHk5dEZuK2ph?= =?utf-8?B?ZWNGaDFTRU5mU01Wdlg5amFraEpkTVBybWNjNUpsWjBSOFJYWFZwc2pEODZC?= =?utf-8?B?RDhuVkFlakJuSEpIK3grbzhPbzNIY2NWNHhyZFVTR3BHMjlLci9GOTNRMkhk?= =?utf-8?B?VWJMeDQyZitoMFBwaW8rQU5va0NNNUJIZDEvaytqOTZkVWJrL0RNODhsTjFP?= =?utf-8?B?VlV4RnJkU3ZCV1grRjR0azhLa0UybEoraW1jWVJ4M0pEYnYzTW45TGNpZ2Fz?= =?utf-8?B?WDRxU2hEUG96bFNyZFBCTWNZNmlxZjBRcUhEcktCQjdpcC8zU21qUjBSWTNE?= =?utf-8?B?WEhMbTNKR1Z1WGwrc3hmaVc4NEd4ci9GMk5NS2xFVXEwTXpkODIyMldoYTBp?= =?utf-8?B?VndmU3NXcm9kK04zMDNCQUx2TG1XRHgyQjZYZkkyUFNJclpJbVJ0TldIQ2VG?= =?utf-8?B?bmRVQThaOUlXUHdOZ0plZ0hSeHVFdlN0Z2pHZzhHaHdXclovMm9PZ1ZvUTFt?= =?utf-8?B?Wkk4TFZ6Z3dYVUpuY0VhTXNFTUd3WDlxd1k2ejYwbDRrM0c0ZG15Y2RNOEk5?= =?utf-8?B?TnN6aklTdmtOYjBKNVVaVmtMZXNEOGZtK2cwZnU4NHI2R3QyaHRVaGZrdnBS?= =?utf-8?B?R2ZVYWNrRXNqMllYNU00MG8xTytwNVZ4ck5YOFJ6RkJRVjk5VWw3SHV1V3BR?= =?utf-8?B?ZzlacUJNS0Jab3kzOXVXZzloeC9jQ1U1eEJpN0RVYnV2OEZxZjhxOGRqN0Qz?= =?utf-8?B?SitBRG5ud1ZIWlJxTWt0NlFzbVY1Zm9XcE9nTGpmeTJNUzBBMEs1ZkYvK0py?= =?utf-8?B?Yy93RDh5aXE3SmZaVi84YUVaRXVGT0FLcnRLa0J6TUUxNmo4UktOYk9zQW1V?= =?utf-8?B?QmdTR0hzQXhZb1M0b1BFNDdncFBoemZWYlpNaXROSWRsYXl5TzVEN2pKNWZT?= =?utf-8?B?WHBwbGU1bTdubGVIRmZ2akRrOXFBTjFtUGFPbGRsdXJ6RnNadHZwSVhIRkJz?= =?utf-8?B?WEo3UHJnV29RZDVocElqSUN0bVErdFF6czRpa1F1YzhCZVJtY0Z4Q0NBYXh4?= =?utf-8?Q?WIqctp6JU0nKk5N+lAggjGLX07XknMvN5DKmSR4HY/fhAW?= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TURXOU5VMkprNUZsd0tiTnZnNXkxcDQ5Um13YzU0UlZ2TDQ4c2Y1RDFueDZN?= =?utf-8?B?U1QvaGl6aUc4SG9XQmNYM0hYaHZ2YkF4SHhEV1ZuTDhna0p2b3dPTHFyOTg5?= =?utf-8?B?SVRaUUx1ejgvQ29wNTc1ait0em9SNitjRHBrdHdQcE00WkdzUDc4UEs0MjZO?= =?utf-8?B?MlRUVmNEbm1qbTFBQTZTZzBzU3N5ZW5ZenZEaTZyUWJ3YnpXZTV5WWJWY2h5?= =?utf-8?B?bDE3S2pXd1B2QUdXMTNjTTJsRnI0WW13OGthVTNNeG9CMVpTWVNTcUgxY0t5?= =?utf-8?B?WU1iSURSSVArMWpNZXRsVkRjM0lPMGVHakRFdHRidnhVb2dzditXWk9KV2Jv?= =?utf-8?B?dE9XakhnRUliSE9TUExqbkFkalM5OUFhcUMrWjdxQVdQVWYxNTE3aHh3MnB1?= =?utf-8?B?NzdPT2Evb1RZaHROa2pXOStadmFORGNuQzhsd1Q1WTYyaGd1RnQrREFkLy8r?= =?utf-8?B?QU5DdXVjTGFPVnV3VGRSaTluL3RFN3B0VHYwOUIrSVZrb1VQTXVnSzl0ODFI?= =?utf-8?B?b2x2eEVDUHpYMG5Yd1JZb1RNM2NEdTgwVzdDSk8yUEVpQkVxOWFhcEtDWEoy?= =?utf-8?B?aXVhaWRyZGNKUWRFU0FZWmJFazg3S3c0UG5LdVY2dmc1ZE5VSFpCU1hYNHo3?= =?utf-8?B?TEFQd05YUGNhVXhLWWJMb0lxdUQ4SGk3UFNva0VCMXNTeTVua1ZUZlRPSElR?= =?utf-8?B?QjFiczFZa0hVbVJHNm1wK3Vvb05HbnpWcC85akhwRUF5U1lRdEx2SC9tY2RI?= =?utf-8?B?aFA1K3orSTVkdDRDMXFXOW1ldi9HY0FHLzd3dDNwSWw3OVhxOGxMbyt4aTMx?= =?utf-8?B?d3RuOEFZZEhmb3pmVFFmenl1cElxZE5yS0dOd3g3TGozM3BHaFI2bzJmM0J6?= =?utf-8?B?VTRsc0tYdGNQakZZRG44NGFzUkVQZHpkMDBUS2YveXR0bkgvcnd0UlJFRFhU?= =?utf-8?B?ZnppeE1oYk8vdXJ0Z3o3WlVIN2d0elVubWlXVHFHMVhWSTNZR0ZEcmcydCtR?= =?utf-8?B?VEdNSyt0c2dyOFBxdWVReTNTa1pWYXlaUnBmTng4N3BpYS9Qa0oxSmxZR3NZ?= =?utf-8?B?OHNNaUt5TmlGSExOL3ROMnFHbFl2TEZoQmYzdVltMDRHY1pMbWxKZ1RjSjlu?= =?utf-8?B?K2tIMFJQVHhaN3J3QXA4dHVOamx5cjd1dFJiRVRyZkRVU2pWdk5KaTlSc0JG?= =?utf-8?B?Z04wS1AzRTVZaEJ3UklBVDNrMWlqKzR6QmpRODBPWWxFM0lxaXo3NDJTMDZz?= =?utf-8?B?WnR4dUxlZVk4c2Y2SEZLT2RUU2NBZ0ZJS0FVdk1zSjRBZGQ1WWxvTlVZTWlP?= =?utf-8?B?R3dTRlZTbDhMTVo3VHhBTWsxU3hMY2F1ckprZlRGb2F5ZVFsQXB0c01aVUQ4?= =?utf-8?B?YnhRcmdub2dHRnpnckpxU1ZjUDg1MC9IWTZGVUlZcFlXNjlPZ3VjN25DbzAw?= =?utf-8?B?T0plRjZXMjF2ZXJTQ2VCWk9tMzRNMlpkeEJ6eFB4QkpRcTBlRVdVU1F1OFdR?= =?utf-8?B?VU9LRWxYQUpMT2J5ZzU3bG15dEJDZXFreHZmaFZPOFhBVGt1bUJZTmNjaGdO?= =?utf-8?B?VzZicGFldmFDMDMySCsrQ04rbGpMU3J3a24xQlNDQTM1MFNjL2dSUlBRT1Fl?= =?utf-8?B?ajE0TWc0dExhT1NGY3V6blhSOVNqRjIzY1NaU2k4UnNWUDZYaU1EQkFLOS9T?= =?utf-8?B?ZkxPdFhlODAwRWU0UGlXQUFMZTl6blluYThFVmJOb2NKKzVrakxyTHUrb2Rk?= =?utf-8?B?MWRFd3dDR0dHZURVbGhNZnJHTE1xTmI4SG1LcDFwR1RtVGI0cFRONWltR2VV?= =?utf-8?B?eEEyMFZ0d0RQalYvWXczZz09?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: a21068aa-6f63-4da9-dadd-08dda082890b X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 May 2025 20:34:26.5712 (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: AS8P250MB0235 Subject: Re: [FFmpeg-devel] [PATCH v2 10/20] avcodec/h274: add ff_h274_hash functions 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: toqsxw@gmail.com: > From: Wu Jianhua > > Signed-off-by: Wu Jianhua > --- > libavcodec/h274.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++ > libavcodec/h274.h | 7 +++ > 2 files changed, 162 insertions(+) > > diff --git a/libavcodec/h274.c b/libavcodec/h274.c > index 5709200322..e46926e4cc 100644 > --- a/libavcodec/h274.c > +++ b/libavcodec/h274.c > @@ -26,7 +26,11 @@ > */ > > #include "libavutil/avassert.h" > +#include "libavutil/bswap.h" > +#include "libavutil/crc.h" > #include "libavutil/imgutils.h" > +#include "libavutil/md5.h" > +#include "libavutil/mem.h" > > #include "h274.h" > > @@ -790,3 +794,154 @@ static const int8_t R64T[64][64] = { > 17, -16, 15, -14, 13, -12, 11, -10, 9, -8, 7, -6, 4, -3, 2, -1, > } > }; > + > +static int verify_plane_md5(struct AVMD5 *ctx, > + const uint8_t *src, const int w, const int h, const int stride, > + const uint8_t *expected) > +{ > +#define MD5_SIZE 16 > + uint8_t md5[MD5_SIZE]; > + av_md5_init(ctx); > + for (int j = 0; j < h; j++) { > + av_md5_update(ctx, src, w); > + src += stride; > + } > + av_md5_final(ctx, md5); > + > + if (memcmp(md5, expected, MD5_SIZE)) > + return AVERROR_INVALIDDATA; > + > + return 0; > +} > + > +static int verify_plane_crc(const uint8_t *src, const int w, const int h, const int stride, > + uint16_t expected) > +{ > + uint32_t crc = 0x0F1D; // CRC-16-CCITT-AUG > + const AVCRC *ctx = av_crc_get_table(AV_CRC_16_CCITT); > + > + expected = av_le2ne32(expected); > + for (int j = 0; j < h; j++) { > + crc = av_crc(ctx, crc, src, w); Did you test this with >8 bit content? For this type of content, it can only work on either LE or BE (which one depends upon whether the spec wants the CRC applied on LE or BE data), but not both. Same for md5. > + src += stride; > + } > + crc = av_bswap16(crc); > + > + if (crc != expected) > + return AVERROR_INVALIDDATA; > + > + return 0; > +} > + > +#define CAL_CHECKSUM(pixel) ((pixel) ^ xor_mask) > +static int verify_plane_checksum(const uint8_t *src, const int w, const int h, const int stride, const int ps, > + uint32_t expected) > +{ > + uint32_t checksum = 0; > + expected = av_le2ne32(expected); > + > + for (int y = 0; y < h; y++) { > + for (int x = 0; x < w; x++) { > + const int xor_mask = (x & 0xFF) ^ (y & 0xFF) ^ (x >> 8) ^ (y >> 8); > + checksum += CAL_CHECKSUM(src[x << ps]); > + if (ps) > + checksum += CAL_CHECKSUM(src[(x << ps) + 1]); It seems to me that you think that ps != 0 is equivalent to a >8 bit pixel format like AV_PIX_FMT_YUV420P10. This assumption may be true now, but it is not true for e.g. NV12, which may be used by future hwaccels. Maybe we should not verify checksums when hardware acceleration is in use? > + } > + src += stride; > + } > + > + if (checksum != expected) > + return AVERROR_INVALIDDATA; > + > + return 0; > +} > + > +enum { > + HASH_MD5SUM, > + HASH_CRC, > + HASH_CHECKSUM, > + HASH_LAST = HASH_CHECKSUM, > +}; > + > +struct H274HashContext { > + int type; > + struct AVMD5 *ctx; > +}; > + > +void ff_h274_hash_freep(H274HashContext **ctx) > +{ > + if (*ctx) { > + H274HashContext *c = *ctx; > + if (c->ctx) > + av_free(c->ctx); > + av_freep(ctx); > + } > +} > + > +int ff_h274_hash_init(H274HashContext **ctx, const int type) > +{ > + H274HashContext *c; > + > + if (type > HASH_LAST || !ctx) > + return AVERROR(EINVAL); > + > + c = *ctx; > + if (c) { > + if (c->type != type) { > + if (c->type == HASH_MD5SUM) > + av_freep(&c->ctx); > + c->type = type; > + } > + } else { > + c = av_mallocz(sizeof(H274HashContext)); > + if (!c) > + return AVERROR(ENOMEM); > + c->type = type; > + *ctx = c; > + } > + > + if (type == HASH_MD5SUM && !c->ctx) { > + c->ctx = av_md5_alloc(); > + if (!c->ctx) > + return AVERROR(ENOMEM); > + } > + > + return 0; > +} > + > +int ff_h274_hash_verify(H274HashContext *c, const H274SEIPictureHash *hash, > + const AVFrame *frame, const int coded_width, const int coded_height) > +{ > + const AVPixFmtDescriptor *desc; > + int err = 0; > + > + if (!c || !hash || !frame) > + return AVERROR(EINVAL); > + > + if (c->type != hash->hash_type) > + return AVERROR(EINVAL); > + > + desc = av_pix_fmt_desc_get(frame->format); > + if (!desc) > + return AVERROR(EINVAL); > + > + for (int i = 0; i < desc->nb_components; i++) { > + const int w = i ? (coded_width >> desc->log2_chroma_w) : coded_width; > + const int h = i ? (coded_height >> desc->log2_chroma_h) : coded_height; > + const int ps = desc->comp[i].step - 1; > + const uint8_t *src = frame->data[i]; > + const int stride = frame->linesize[i]; > + > + if (c->type == HASH_MD5SUM) > + err = verify_plane_md5(c->ctx, src, w << ps, h, stride, hash->md5[i]); > + else if (c->type == HASH_CRC) > + err = verify_plane_crc(src, w << ps, h, stride, hash->crc[i]); > + else if (c->type == HASH_CHECKSUM) > + err = verify_plane_checksum(src, w, h, stride, ps, hash->checksum[i]); > + if (err < 0) > + goto fail; > + } > + > +fail: > + return err; > +} > diff --git a/libavcodec/h274.h b/libavcodec/h274.h > index e1803edaf3..0ca5f0cbab 100644 > --- a/libavcodec/h274.h > +++ b/libavcodec/h274.h > @@ -64,6 +64,8 @@ int ff_h274_apply_film_grain(AVFrame *out, const AVFrame *in, > H274FilmGrainDatabase *db, > const AVFilmGrainParams *params); > > +typedef struct H274HashContext H274HashContext; > + > typedef struct H274SEIPictureHash { > int present; > union { > @@ -74,4 +76,9 @@ typedef struct H274SEIPictureHash { > uint8_t hash_type; > } H274SEIPictureHash; > > +int ff_h274_hash_init(H274HashContext **c, int type); > +int ff_h274_hash_verify(H274HashContext *c, const H274SEIPictureHash *hash, > + const AVFrame *frame, int coded_width, int coded_height); > +void ff_h274_hash_freep(H274HashContext **c); > + > #endif /* AVCODEC_H274_H */ _______________________________________________ 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".