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 5076C47548 for ; Mon, 11 Sep 2023 17:40:43 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A414668C961; Mon, 11 Sep 2023 20:40:40 +0300 (EEST) Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-vi1eur04olkn2107.outbound.protection.outlook.com [40.92.75.107]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9142668C91E for ; Mon, 11 Sep 2023 20:40:34 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Kxmu2J0rSaabMHub3z6y3P7f7TAyBQcdU9+Rj/C6x3nv3rp3V3D+DtLXaZqRle1hDPzPTJqgZloP58PIDGRwEVcGjIv8M5SLsAjgTyGTWAqGVvuCJ+2rypywVd6Rc2k4hNWjPQMCTH1Lr05f1KRUQtvGOgvDRLZA0DpcL3tsstKNAMkSZewNakEAR3w+vjJSAEkxvxhDnj6MuFnI0pk9BMp5NkxUa0ognaJDNDyZ54VoHZ1FcYalkwZtbgkNUHsHP4J4CJI2xwUSC9SufhN10otdp3J+jFjdAg1FIo8OkCgTvtYOS57Du3eov67E00bObfqT5QHmUxrUlwFYiyLFaA== 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=JP8JeoWkDDn2FojK48hw7HHGfXYDlQJlbc+kWLwU18c=; b=hyHCsjh98pzOjqHvixZAnUbPpn7+6R/BIa7NdUtKCWooSH/1TjKPH87MFSjUNPoOwOkTrgNyS2nZdAncLrfpYv1qMw0hvq0Itfb8oEuSeJxxBFpPDgiPpJMSw5VB2rinyoFRaC5cfr1sPprW7HyZADdohmkbNL2mllf6duRfjZeDQE7j3eQL37MZdqLnec7EkfiVrwNTD65Dl5GzCn4Rmw1B0AG0HOf25SGFs79XPH49tAvVbvhPfiIkJUu3bDt152flpcQt+tW2SOVVDlU7DjN+5n/Yk16tngT1Xl8xRdaDFYCNNxffEP9Z9IpRoA8QtRfVlg5DkbgevWW5sYJTag== 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=JP8JeoWkDDn2FojK48hw7HHGfXYDlQJlbc+kWLwU18c=; b=MImrYhcEyRwHmccLiuAPIe0q+DcTC79xNeX8QNv+93LigagrSOqnBaxnAdWeeMCvJeJq5Hls047FI6fFwug64Rj/e/Ry59o6wxhj6XrRmysht9tB+DBZHWoBUMazv0z9tJAfTH/BD3/PVnD6O/egKE865S/M/GbSUUb6/f1nAPhsyW1QHTMLFcZXbYegjwXS4aOLMJwnz2Ie+SJ+svStB654HkeyB1MjKxyIG7HTUIqSa8Ir/6oJJP1kzU/l1GVYzk7TxHnJshYl2WxAPTubj0VTJs0jKdFG8WgG8LNcAyRwi//Qh+ofvLXFq0oOGqtv89IWosZ7D8YxDeekk+Lm7g== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by DU2P250MB0224.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:279::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6768.35; Mon, 11 Sep 2023 17:40:33 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa%3]) with mapi id 15.20.6768.029; Mon, 11 Sep 2023 17:40:33 +0000 Message-ID: Date: Mon, 11 Sep 2023 19:41:52 +0200 To: ffmpeg-devel@ffmpeg.org References: <20230906174431.45558-1-jamrial@gmail.com> <20230906174431.45558-2-jamrial@gmail.com> Content-Language: en-US From: Andreas Rheinhardt In-Reply-To: <20230906174431.45558-2-jamrial@gmail.com> X-TMN: [LpiJYvMjkhXqjT0s80iq+UgYnjQkiKAx] X-ClientProxiedBy: FR0P281CA0244.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:af::13) 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_|DU2P250MB0224:EE_ X-MS-Office365-Filtering-Correlation-Id: 7a014c27-eb06-4f57-db85-08dbb2ee32f1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: GQiARkIfZ7LFaR9+kP0uI26WA89KellHVNvOg7k6Bmt5BsJ/6rG3ihfPe08iio+/q75G3AtRlRMC3XcAJB9pTfEZC77m3On0Krw/FipZ0QX4wLibN+1STN1KEQ8GTW2E6n5NZTO/6sFlykB2YIxM4v35fTAADbbQjz/DcFFSXxWIEnMZMwX3gWSwcH9UKGEKtyycYTxivKrh0prlEaJrnRQ1hP81aZuX/TagXEu55BmiKHDdKARJdCBfzbGh8LfHN/fwM0UtbBIexzLP3B7sXtxPnS+m7hA0OkLgJ6cB33s3yvciKe/pvhkLuIq1kDPR+Bw1ei4CSpSYeUk+BEoOkaJgqNEG4UE/iro2IiDemCXCinywF5031GWs/hQnBIVZrOcYdQEUJTmjGlCzFwgLHoGrvKlPdPI1fbRzUq9t4nnCaAXR1k+bIfijCsuRHXjeXDwVhDFnSL2dvaWCeoAMfKjX19/AKLscNBf8gqoY+gTqS6MdI4BeRdDmPkL7lR2vZ5Ydkl2BURVNV6tj/bElunMIpOemGh9yB5PKPElHFFPobDtb9P/jinhn4mBEMMVB X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?QXExbU04MkZCSWpkZjlFMVFkejdhUFdSMVNkU09hcUI5VXNoSkZzVkVWZjFG?= =?utf-8?B?cWVWMm9tY0pZV3RsRHRLMlhPQkFlM2ppS2JqUExCUnV3WERpZkNvR2hqbVU3?= =?utf-8?B?NHFDdTQzVXZSOWhLQ1Nhdm1Bc3pFWnJHVkxQaUwxSXFKYVhVdXBNSEROZW9R?= =?utf-8?B?aHBzcDF6UjFDZmhPT1JPZFdoaU84TEFyUTJzSnlzSFJJaG1vUHhUOCt6S1o1?= =?utf-8?B?c1pnWnJJN1NCdmVaY0l3WVpHbmg2T2hKRjJ4WmYwc0ZPMEtPcXRVYVJuN1dQ?= =?utf-8?B?QTVUNTh0bWRIYUhTdi8rNjZQSDdZSllwT3U1VjN3eEJmNldGYkkzU3A1NkZw?= =?utf-8?B?Y05FR1RoOFErODBwczh6Z3FDTTZTTzMwUUV5ekpmR3lBMng1RmRqRVhBUTQ3?= =?utf-8?B?YXZUbXkxaTZadTJmdGJQZTduOHUvRlUzTStLSFFtZmxNTkJyTUwxTDZiU1JE?= =?utf-8?B?K1FmK0FkQkxqZ0ZoRzc0cXZCUUJhQ1hBL3lBVjEvbzBHT0wvN2tnN0ZOcWNj?= =?utf-8?B?OGFWNE1yeVl4MXVIY2QwRWRBZ1dqU2lnVUlUN29DYkFHWXFTaWVmVkdpbXpx?= =?utf-8?B?YTZvSEt4OXF4MWwzUXMrcFRRUVRnT2d4ZzBRK3hzRGIzMk1FOEovVmZPSU1i?= =?utf-8?B?ZnJPOWkxS2hIbkZIeWlEazdVTnBidHVEQzlxaGZyWDduVGUrMi83eWNhWUhw?= =?utf-8?B?S3Zmb2hIM3RoMUE3c2htUEp3NU4yeU5KWnVNTGpkRE5JbkgyV0l3VG9kVWJG?= =?utf-8?B?aEFnSlBTWUJ0WEViK1AzYjVNWjNhVC9LOUJnM2Nhd3RDcmpiN0dQcCtxcERV?= =?utf-8?B?ZXRQL3J3WXlvQXNjMDV5bjZDUzc4bGFZeElJanU3VDE2SkZWb21FOXpaRDQ0?= =?utf-8?B?SWFBeFVULzRYT3lXNXNjcW05THdvQ0FLMnJDTkh6VVlqVk9HbFhaQjZtam92?= =?utf-8?B?b1E2U292V3p1dDF4UlBUY1BHd2dyVWRLODdvcTcvS1pjeHRCU0llem1TekpH?= =?utf-8?B?ZW9qOGxFdWxaQXI4R25EZjNqMm4yQVA2UFNnaVZjTDlIcFB2dHpwcjROQkNu?= =?utf-8?B?WFhLQmhrWUtPMThFSmVweitkQXBWbkh3YnJsZGx0WFZ5Q0k3RnhLOGdPaWhI?= =?utf-8?B?dm1GMFpwRmtDZzI0STlDUEhEMnRvNUk5UHpROHozYWVsTWV3L05pMFdBRHFZ?= =?utf-8?B?MVhaTE1ETHY4YzQvYll6TXUvdytzTDRMSFBJV0lQSWpwb3NFUlhQZXAyQmFD?= =?utf-8?B?SWdFYy8rSDhlRHBORmxOQXAvRUpwY05iQlEzN0RsY2dzaVJJTlhscHFFdXFZ?= =?utf-8?B?VEhuRGRsRzYwWUxDVWY4NDdnL0M0bWx4TVQ4cHkxUTVoa0lzSitIdGxpQkdz?= =?utf-8?B?Lzh3UWR4dmNqa2hJSS93VjFzTUZYamlsQ3BMQ29sMS9mQ1ZFR2UxM0lyM1dS?= =?utf-8?B?Y3ZCK0dGb3FNOEtGQ2lBNHlqelZpTFJ6YkVNNG5URnZTQ3hFdVl2NVptZ0Nw?= =?utf-8?B?YXh0ak1GSitZZXRCSDloRGZZTmc5UXgvZjdKbUVlaW1IMjRsYVFkSk93eHNk?= =?utf-8?B?OHJtNnI0cFV3WG5XWVVvM0w2MVRrNmwzbGxYRkY2RXBDbWdiWkFJUHVib0Jo?= =?utf-8?B?aDBDbVlIc1ErbXZYb2t6RlV6N0xxTThBYmxHUkJJaHRoVUdlaWxBSlRqK1ZT?= =?utf-8?Q?HHFzQtkXVOy8dL0vTj4I?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7a014c27-eb06-4f57-db85-08dbb2ee32f1 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2023 17:40:33.2306 (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: DU2P250MB0224 Subject: Re: [FFmpeg-devel] [PATCH 01/10] avcodec/packet: add side data set struct and helpers 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: > This will be useful in the following commits. > > Signed-off-by: James Almer > --- > libavcodec/avpacket.c | 99 +++++++++++++++++++++++++++++++++++++++++++ > libavcodec/packet.h | 74 ++++++++++++++++++++++++++++++++ > 2 files changed, 173 insertions(+) > > diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c > index 5fef65e97a..5b133c5d8a 100644 > --- a/libavcodec/avpacket.c > +++ b/libavcodec/avpacket.c > @@ -645,3 +645,102 @@ int ff_side_data_set_prft(AVPacket *pkt, int64_t timestamp) > > return 0; > } > + > +AVPacketSideData *av_packet_side_data_set_get(const AVPacketSideDataSet *set, > + enum AVPacketSideDataType type) > +{ > + for (int i = 0; i < set->nb_sd; i++) > + if (set->sd[i]->type == type) > + return set->sd[i]; > + > + return NULL; > +} > + > +static AVPacketSideData *add_side_data_to_set(AVPacketSideDataSet *set, > + enum AVPacketSideDataType type, > + uint8_t *data, size_t size) > +{ > + AVPacketSideData *sd, **tmp; > + > + for (int i = 0; i < set->nb_sd; i++) { > + sd = set->sd[i]; > + if (sd->type != type) > + continue; > + > + av_freep(&sd->data); > + sd->data = data; > + sd->size = size; > + return sd; > + } > + > + if (set->nb_sd + 1U > INT_MAX) > + return NULL; > + > + tmp = av_realloc_array(set->sd, set->nb_sd + 1, sizeof(*tmp)); > + if (!tmp) > + return NULL; > + > + set->sd = tmp; > + > + sd = av_mallocz(sizeof(*sd)); > + if (!sd) > + return NULL; > + > + sd->type = type; > + sd->data = data; > + sd->size = size; > + > + set->sd[set->nb_sd++] = sd; > + > + return sd; > +} > + > +AVPacketSideData *av_packet_side_data_set_add(AVPacketSideDataSet *set, > + enum AVPacketSideDataType type, > + uint8_t *data, size_t size, > + int flags) > +{ > + return add_side_data_to_set(set, type, data, size); > +} > + > +AVPacketSideData *av_packet_side_data_set_new(AVPacketSideDataSet *set, > + enum AVPacketSideDataType type, > + size_t size, int flags) > +{ > + AVPacketSideData *sd = NULL; > + uint8_t *data = av_malloc(size); How about padding in case we have new extradata? > + > + if (!data) > + return NULL; > + > + sd = add_side_data_to_set(set, type, data, size); > + if (!sd) > + av_freep(&data); > + > + return sd; > +} > + > +void av_packet_side_data_set_remove(AVPacketSideDataSet *set, > + enum AVPacketSideDataType type) > +{ > + for (int i = set->nb_sd - 1; i >= 0; i--) { > + AVPacketSideData *sd = set->sd[i]; > + if (sd->type != type) > + continue; > + av_free(set->sd[i]->data); > + av_free(set->sd[i]); > + set->sd[i] = set->sd[--set->nb_sd]; > + break; > + } > +} > + > +void av_packet_side_data_set_free(AVPacketSideDataSet *set) > +{ > + for (int i = 0; i < set->nb_sd; i++) { > + av_free(set->sd[i]->data); > + av_free(set->sd[i]); > + } > + set->nb_sd = 0; > + > + av_freep(&set->sd); > +} > diff --git a/libavcodec/packet.h b/libavcodec/packet.h > index f28e7e7011..87720ab909 100644 > --- a/libavcodec/packet.h > +++ b/libavcodec/packet.h > @@ -318,6 +318,20 @@ typedef struct AVPacketSideData { > enum AVPacketSideDataType type; > } AVPacketSideData; > > +/** > + * Structure to hold a set of AVPacketSideData This should mention whether it is legal or not to have multiple side datas of the same type in the same set. > + * > + * @see av_packet_side_data_set_new > + * @see av_packet_side_data_set_add > + * @see av_packet_side_data_set_get > + * @see av_packet_side_data_set_remove > + * @see av_packet_side_data_set_free > + */ This should mention that its size is part of the ABI. > +typedef struct AVPacketSideDataSet { > + AVPacketSideData **sd; Allocating the AVPacketSideDatas independently is a big break from how it is done with AVPackets. Is this really intended? IMO not worth it. > + int nb_sd; int? Why not something unsigned given that it will never be negative? > +} AVPacketSideDataSet; > + > /** > * This structure stores compressed data. It is typically exported by demuxers > * and then passed as input to decoders, or received as output from encoders and > @@ -724,6 +738,66 @@ int av_packet_make_writable(AVPacket *pkt); > */ > void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst); > > +/** > + * Allocate a new side data entry into to a set. > + * > + * @param set a set to which the side data should be added > + * @param type side data type > + * @param size side data size > + * @param flags currently unused must be zero > + * @return pointer to freshly allocated side data entry on success, or NULL > + * otherwise. > + */ > +AVPacketSideData *av_packet_side_data_set_new(AVPacketSideDataSet *set, > + enum AVPacketSideDataType type, > + size_t size, int flags); > + > +/** > + * Wrap an existing array as a packet side data into a set. > + * > + * @param set a set to which the side data should be added > + * @param type side data type > + * @param data a data array. It must be allocated with the av_malloc() family > + * of functions. The ownership of the data is transferred to the > + * set on success > + * @param size size of the data array > + * @param flags currently unused > + * @return pointer to freshly allocated side data entry on success, or NULL > + * otherwise. On failure, the set is unchanged and the data remains > + * owned by the caller. > + */ > +AVPacketSideData *av_packet_side_data_set_add(AVPacketSideDataSet *set, > + enum AVPacketSideDataType type, > + uint8_t *data, size_t size, data should be void*; the days in which side data was just a buffer and not a structure are long gone. Changing AVPacketSideData is a different issue. > + int flags); > + > +/** > + * Remove side data of the given type from a set. > + * > + * @param set a set from which the side data should be removed > + * @param type side information type > + */ > +void av_packet_side_data_set_remove(AVPacketSideDataSet *set, > + enum AVPacketSideDataType type); > + > +/** > + * Get side information from set. > + * > + * @param set a set from which the side data should be fetched > + * @param type desired side information type > + * > + * @return pointer to side data if present or NULL otherwise > + */ > +AVPacketSideData *av_packet_side_data_set_get(const AVPacketSideDataSet *set, Is it really good to give the user the right to modify the entries of a set that they don't own? > + enum AVPacketSideDataType type); > + > +/** > + * Convenience function to free all the side data stored in a set. > + * > + * @param set the set to free > + */ > +void av_packet_side_data_set_free(AVPacketSideDataSet *set); > + > /** > * @} > */ _______________________________________________ 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".