From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id B273448E49 for ; Fri, 29 Mar 2024 16:10:52 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 20F0568D72D; Fri, 29 Mar 2024 18:10:49 +0200 (EET) Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01olkn2033.outbound.protection.outlook.com [40.92.65.33]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7CB6368D515 for ; Fri, 29 Mar 2024 18:10:42 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GfJpD4meenO1XpwwKBw8ZSPRKZsVzMXM2bLtriVp5dFRURJoT2DwPZZnlEu4TjHaQfacCCuZNsnAQACPhYwntsPOCZ57sexDwenQibgkpbwUIpgthBtFF2TLx73foi3BB+Ud/QYiccdjZtNT3fiW2pMxzsn58RXJFzBw2mLgCBKsSITJEhnTHJNRN+Gi5p+Ij1VEv6G5qXPJLz5qMib4rF+MjPo4EVZh1zvAvYLDm2iIHn7E4+JSDlTParWf3PXoSJ/l9uNc1jK9g7q/VcGEJNiXm3cABSWICytxiLGXP862CU1VmDLuzQAWIsPvyYOuNw3XbW01EVoRhzhKxJFVAw== 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=PLx8HEunDMWFukSVIAKPvPZgjxlBqRM734F1A3Gl70I=; b=JSq1J7HFbJIJAitb35ysReuRLa5AGTxes3tQz/DXrAxAEY8kbkX/h3b0JsCVzD4liFaebWI8ujUjXs1tWFUP1SAIsIyksI2z+62tTZswomHT2ggtlUsta3IDD8q2q7HJktuORnEDZdz2IqV9UC/HmEf4bu+El8c7TTbEk2Col7TXkhI5V0NbYgJLsiW1f48K1y0sFG7BSRHSrYtg+e3jTEzEwJ36SOBoSkbtf0irsFBvl2VyTqI5400+1qg7UNl0462nzX8NyW5epftAt6CFI2ZUSNQkgEFt0YqhVrP0frU6PCRpqlQAl0R3VgDec12n04KkobTO0kpAqgHE5/7BoQ== 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=PLx8HEunDMWFukSVIAKPvPZgjxlBqRM734F1A3Gl70I=; b=QP0tp7xaKbYCIVlZrGYln4o6nUHdqK9nlEZKM5bH8W//0fCCgSsA7ap6hJTtxBkhzycJRgtCvacDDuEZR3BVK49+PdRClJF7vjSxCAUlHrZXONj4VZVoL7CrOw9LvJf6hKrkQetStml8H6qPuQr0Gwq0fs4nBLi+MI7VnsAFKgtedd3Wg7VF43ssTSCT50muBao6el1TtgsO1T9INBpkW9VZkvz+EfWXfItdBzURJom/He5TEcNH5RwKYCYqqSozFzNOh/Qm5nv4sx9BGu6IFUSVQY6/fxEc2BSwvsmt7DRaKDu07LUC+iYOp5PN3bbBR+13sLUohA3227Vb9qTTgQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by PA1P250MB1065.EURP250.PROD.OUTLOOK.COM (2603:10a6:102:45c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.32; Fri, 29 Mar 2024 16:10:41 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::1f29:8206:b8c3:45bb]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::1f29:8206:b8c3:45bb%3]) with mapi id 15.20.7409.039; Fri, 29 Mar 2024 16:10:40 +0000 Message-ID: Date: Fri, 29 Mar 2024 17:10:38 +0100 User-Agent: Mozilla Thunderbird Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20240329155601.14190-1-jamrial@gmail.com> From: Andreas Rheinhardt In-Reply-To: <20240329155601.14190-1-jamrial@gmail.com> X-TMN: [a1mvLCJ2a4kmoM87fwIKcKEbGx6HNv3P2zN6BFoHffs=] X-ClientProxiedBy: ZR0P278CA0189.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:44::6) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|PA1P250MB1065:EE_ X-MS-Office365-Filtering-Correlation-Id: 62017381-1253-4706-819f-08dc500ac786 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: O/GAnBd9xWJkpPy3GYOAwMRehKEdggip5FQde5Y7chA2iFd0rkDmw2QWH1BxPSCVp9mXoD+mdKPqPHsWbzpODlepGXseCDpj8MIxlyoEgoNKQYT9p2N5+jWUf/OGCmAsp/A7g3MR/h6gGUgJQeu6T30WnqigpJEDUEPh9GsjpEVzqg/2cy/B/QmKlg/mQJ6GQz3wxpYNwbAC0DzCyrp9ZDm5hiSTioHqwZez3m5/w7bBR+8J0INuP//4pbkrjyi4gsh5sn1lRJN9Mbc7uRCEAhBacp9L7+lrkm88/t9wWhi8C5mR9jzPIrIioLTr033rHizs0Le2Pd6vq1aQ8rTHiwofCdkazYkvpoLk2AT/OvVzGlUaWBvbzmXOewqkDc43Q/mBkAfzg0BMcP8cgJlz1XhNhw8LT1sFabyQYkFfRHYKJtQaD1Z6dRiqENUpF4mvJnQtxIcdRBwVU6ikTgqwI5wR3Xis0FGwQDH65gkpnhxhfdKu1JKCUFONYTYQt/T1G6HOOfbrTAA4SOOAoBNwuBaTSzEKZz2iHM/V+d6Qvjs099ksrZ3ew+WgOrK+k+2F X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?WlVoWFlFSzIxWDZIK25LVkVoSFY1VDBHOUE4bEJlY240OGlvTTFrUzd3WHdV?= =?utf-8?B?bmIzOWpMWVd2ZXB4RHlvSE5tZE5HTlZDQ2xNYllRUEhMQnhxZEVxZ2dkbHFq?= =?utf-8?B?REdQV1NrTDgxZDJ3dExSM0hPZURHMUpWbDVPVm1pTGk2QVl5VkdxUGs4UzdX?= =?utf-8?B?WXZ4eTQ2TE9WVGpPK01WVkJpYng4TldwS3ZNR1R5T0t5dmRYT0FxajdhQVU2?= =?utf-8?B?cjZoTEE1MERwemtlLzNDYm5KSytmeHJsbDZuRkJhY2orRy9qT1BWRFA5UjBi?= =?utf-8?B?dkUwdWxEdWljWEZ4REN5M2YxaUpTUHpnL0RzcjRKbktRSWk0RE9KdG45U0VD?= =?utf-8?B?Y21Zenl4L0cvV1JNSGcxVFh5V2puY216dDJKSlFNMVV5RkZoMFI2dnVGM05Z?= =?utf-8?B?WWtsYkl1bGRxaWYyWS9QbURnRTV4SHptV04yMFNFMFhnY242aU0raUxkblBQ?= =?utf-8?B?RkdnL2ErWDBmZkNPaWdmRFNQMjNJK2JYNEIvcy82bm5CRlZKUklKMUN2NC9Q?= =?utf-8?B?RjViVmRHOU11Q1hCemNXNkJkcjhwTEVkWHo4S0theGJWTFEzS0lMYkJvVm9x?= =?utf-8?B?NlBVN1IzYzl6T0Q4d0pxQWZ3OEdlczBFMXlkVGJGWEJhTTVSeGlGMTZ1SzdX?= =?utf-8?B?SjFxZlAvWnAvUlhIZzRwNlVUMjVacEViejJZVmphOXRHaHlPQzlMbjFiQmpH?= =?utf-8?B?YXdTanpuem1pYnJqOTUzZmhweGNnSlY5VFNXZ3BONGpkVy9HM1c0dWtvak9q?= =?utf-8?B?WXI0V3hsbHMxNlZEVUw0THVPZWtlZVkwK2x1N3RkVHN0bmY1TUZuNDg1RWdT?= =?utf-8?B?Z3pHa3BUK0hYS2E4ajFVZnkyckhYczFnVTlKTzB0djRldjlQeFc2VHlGUzBy?= =?utf-8?B?emZwaVRob1VGZjVxbm1LWUFBY2FoWWZFNU9OQVhQMTJlajhEYVdNcWdma0lZ?= =?utf-8?B?cFBBaFFvOTQ3T2FXS2QxcEVKb3UwUkgxdEFvTUk2WW1NUzNMVzJVWUZCbThS?= =?utf-8?B?VTlaNDFFUlVUU2NCdWdmTUtEcFdyL2M5QnFMUnRpL2ZRVmJ4QWxrUDk3bHF1?= =?utf-8?B?N2dZaGxsYjU5SnYrZnhsYmdzNzdwNWNwbDJla1RKQUVvNk1aNTUzcTUrWkFF?= =?utf-8?B?bGRZQnRsOEd2M1V4MnlqZ08xY29TWXdVWnUwbkJ4bXAxSXdxSEl2bDYxdWtX?= =?utf-8?B?YmNyaFdpcWVwOGwxMFdzcDhjaGVVT3FBNU10MTBnSEZ4djBOcEVYRXAxY0Rh?= =?utf-8?B?Wm5CT2hOWTlXVnVYcjUxbWhHUnNkSlZOdXZEcWlJQmtXejhmb2xEa2diMTBR?= =?utf-8?B?MXRPTnN5WndjYmhWdGhrYWw3MzNQb0NYejdVeFZBSGZKSFlyM2g1MEdkaTMw?= =?utf-8?B?NHdaSDhGSlRpeGhNZjNIQzV2TGVRYWNJRXdTdlRjNUhqQVBTL09Mdm04YlN2?= =?utf-8?B?YTJOVncxVmlpR0U0ZUE3cmw1RHRtaDRNcFJ3SUlnRmxsc0FETVdGOTNTSS9V?= =?utf-8?B?Vlp1RGt6UUxScTZCcEF2YllsYlRrMXdreHFLZnduYXo1cTFvRjNSSndUL3Av?= =?utf-8?B?eUY5OWdmdWcwQXppMUlOZzg4a3dEWHJ4b2VhOXpKRXR4eStDOWtPeiswMm5p?= =?utf-8?B?Wm1ndUhLN2dhdW83YW9kbXZvMjRwRzdTb2xuak1EZ3RrK3hIQ2dEazZ2SEJK?= =?utf-8?B?ZkxYK2VOdjRlamR0Y0ZBcWoxZjE0MkU4dGVRY1lNTlUrekxaMUJDR2xBPT0=?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 62017381-1253-4706-819f-08dc500ac786 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Mar 2024 16:10:40.9278 (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: PA1P250MB1065 Subject: Re: [FFmpeg-devel] [PATCH] avocdec/hevc_ps: don't use a fixed sized buffer for parameter set raw 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 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: James Almer: > Allocate it instead, and use it to compare sets instead of the parsed struct. > > Signed-off-by: James Almer > --- > libavcodec/hevc_ps.c | 84 ++++++++++++++++++++++---------------------- > libavcodec/hevc_ps.h | 14 +++++--- > 2 files changed, 51 insertions(+), 47 deletions(-) > > diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c > index 6475d86d7d..e417039d76 100644 > --- a/libavcodec/hevc_ps.c > +++ b/libavcodec/hevc_ps.c > @@ -442,20 +442,18 @@ static int decode_hrd(GetBitContext *gb, int common_inf_present, > return 0; > } > > -static void uninit_vps(FFRefStructOpaque opaque, void *obj) > +static void hevc_vps_free(FFRefStructOpaque opaque, void *obj) > { > HEVCVPS *vps = obj; > > av_freep(&vps->hdr); > + av_freep(&vps->data); > } > > static int compare_vps(const HEVCVPS *vps1, const HEVCVPS *vps2) > { > - if (!memcmp(vps1, vps2, offsetof(HEVCVPS, hdr))) > - return !vps1->vps_num_hrd_parameters || > - !memcmp(vps1->hdr, vps2->hdr, vps1->vps_num_hrd_parameters * sizeof(*vps1->hdr)); > - > - return 0; > + return vps1->data_size == vps2->data_size && > + !memcmp(vps1->data, vps2->data, vps1->data_size); > } > > int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, > @@ -463,25 +461,20 @@ int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, > { > int i,j; > int vps_id = 0; > - ptrdiff_t nal_size; > - HEVCVPS *vps = ff_refstruct_alloc_ext(sizeof(*vps), 0, NULL, uninit_vps); > + int ret = AVERROR_INVALIDDATA; > + HEVCVPS *vps = ff_refstruct_alloc_ext(sizeof(*vps), 0, NULL, hevc_vps_free); > > if (!vps) > return AVERROR(ENOMEM); > > av_log(avctx, AV_LOG_DEBUG, "Decoding VPS\n"); > > - nal_size = gb->buffer_end - gb->buffer; > - if (nal_size > sizeof(vps->data)) { > - av_log(avctx, AV_LOG_WARNING, "Truncating likely oversized VPS " > - "(%"PTRDIFF_SPECIFIER" > %"SIZE_SPECIFIER")\n", > - nal_size, sizeof(vps->data)); > - vps->data_size = sizeof(vps->data); > - } else { > - vps->data_size = nal_size; > + vps->data_size = gb->buffer_end - gb->buffer; > + vps->data = av_memdup(gb->buffer, vps->data_size); > + if (!vps->data) { > + ret = AVERROR(ENOMEM); > + goto err; > } > - memcpy(vps->data, gb->buffer, vps->data_size); > - > vps_id = vps->vps_id = get_bits(gb, 4); > > if (get_bits(gb, 2) != 3) { // vps_reserved_three_2bits > @@ -591,7 +584,7 @@ int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, > > err: > ff_refstruct_unref(&vps); > - return AVERROR_INVALIDDATA; > + return ret; > } > > static void decode_vui(GetBitContext *gb, AVCodecContext *avctx, > @@ -1294,36 +1287,43 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, > return 0; > } > > +static void hevc_sps_free(FFRefStructOpaque opaque, void *obj) > +{ > + HEVCSPS *sps = obj; > + > + av_freep(&sps->data); > +} > + > +static int compare_sps(const HEVCSPS *sps1, const HEVCSPS *sps2) > +{ > + return sps1->data_size == sps2->data_size && > + !memcmp(sps1->data, sps2->data, sps1->data_size); > +} > + > int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, > HEVCParamSets *ps, int apply_defdispwin) > { > - HEVCSPS *sps = ff_refstruct_allocz(sizeof(*sps)); > + HEVCSPS *sps = ff_refstruct_alloc_ext(sizeof(*sps), 0, NULL, hevc_sps_free); > unsigned int sps_id; > int ret; > - ptrdiff_t nal_size; > > if (!sps) > return AVERROR(ENOMEM); > > av_log(avctx, AV_LOG_DEBUG, "Decoding SPS\n"); > > - nal_size = gb->buffer_end - gb->buffer; > - if (nal_size > sizeof(sps->data)) { > - av_log(avctx, AV_LOG_WARNING, "Truncating likely oversized SPS " > - "(%"PTRDIFF_SPECIFIER" > %"SIZE_SPECIFIER")\n", > - nal_size, sizeof(sps->data)); > - sps->data_size = sizeof(sps->data); > - } else { > - sps->data_size = nal_size; > + sps->data_size = gb->buffer_end - gb->buffer; > + sps->data = av_memdup(gb->buffer, sps->data_size); > + if (!sps->data) { > + ret = AVERROR(ENOMEM); > + goto err; > } > - memcpy(sps->data, gb->buffer, sps->data_size); > > ret = ff_hevc_parse_sps(sps, gb, &sps_id, > apply_defdispwin, > ps->vps_list, avctx); > if (ret < 0) { > - ff_refstruct_unref(&sps); > - return ret; > + goto err; > } > > if (avctx->debug & FF_DEBUG_BITSTREAM) { > @@ -1340,7 +1340,7 @@ int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, > * original one. > * otherwise drop all PPSes that depend on it */ > if (ps->sps_list[sps_id] && > - !memcmp(ps->sps_list[sps_id], sps, sizeof(*sps))) { > + compare_sps(ps->sps_list[sps_id], sps)) { > ff_refstruct_unref(&sps); > } else { > remove_sps(ps, sps_id); > @@ -1348,6 +1348,9 @@ int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, > } > > return 0; > +err: > + ff_refstruct_unref(&sps); > + return ret; > } > > static void hevc_pps_free(FFRefStructOpaque unused, void *obj) > @@ -1364,6 +1367,7 @@ static void hevc_pps_free(FFRefStructOpaque unused, void *obj) > av_freep(&pps->tile_pos_rs); > av_freep(&pps->tile_id); > av_freep(&pps->min_tb_addr_zs_tab); > + av_freep(&pps->data); > } > > static void colour_mapping_octants(GetBitContext *gb, HEVCPPS *pps, int inp_depth, > @@ -1773,16 +1777,12 @@ int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, > > av_log(avctx, AV_LOG_DEBUG, "Decoding PPS\n"); > > - nal_size = gb->buffer_end - gb->buffer; > - if (nal_size > sizeof(pps->data)) { > - av_log(avctx, AV_LOG_WARNING, "Truncating likely oversized PPS " > - "(%"PTRDIFF_SPECIFIER" > %"SIZE_SPECIFIER")\n", > - nal_size, sizeof(pps->data)); > - pps->data_size = sizeof(pps->data); > - } else { > - pps->data_size = nal_size; > + pps->data_size = gb->buffer_end - gb->buffer; > + pps->data = av_memdup(gb->buffer, pps->data_size); > + if (!pps->data) { > + ret = AVERROR_INVALIDDATA; > + goto err; > } > - memcpy(pps->data, gb->buffer, pps->data_size); > > // Default values > pps->loop_filter_across_tiles_enabled_flag = 1; > diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h > index 0d8eaf2b3e..bed406770f 100644 > --- a/libavcodec/hevc_ps.h > +++ b/libavcodec/hevc_ps.h > @@ -172,11 +172,11 @@ typedef struct HEVCVPS { > int vps_num_ticks_poc_diff_one; ///< vps_num_ticks_poc_diff_one_minus1 + 1 > int vps_num_hrd_parameters; > > - uint8_t data[4096]; > - int data_size; > - /* Put this at the end of the structure to make it easier to calculate the > + /* Keep this at the end of the structure to make it easier to calculate the > * size before this pointer, which is used for memcmp */ > HEVCHdrParams *hdr; > + uint8_t *data; > + int data_size; > } HEVCVPS; > > typedef struct ScalingList { > @@ -299,7 +299,9 @@ typedef struct HEVCSPS { > > int qp_bd_offset; > > - uint8_t data[4096]; > + /* Keep this at the end of the structure to make it easier to calculate the > + * size before this pointer, which is used for memcmp */ > + uint8_t *data; > int data_size; > } HEVCSPS; > > @@ -434,7 +436,9 @@ typedef struct HEVCPPS { > int *min_tb_addr_zs; ///< MinTbAddrZS > int *min_tb_addr_zs_tab;///< MinTbAddrZS > > - uint8_t data[4096]; > + /* Keep this at the end of the structure to make it easier to calculate the > + * size before this pointer, which is used for memcmp */ > + uint8_t *data; > int data_size; > } HEVCPPS; > This is vastly overcomplicated: If you already have the complete data of the earlier PS, all you need is comparing the data before you even parse the new parameter set. - Andreas _______________________________________________ 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".