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 262D940E1F for ; Fri, 11 Mar 2022 11:18:25 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C6D8E68B0D3; Fri, 11 Mar 2022 13:18:22 +0200 (EET) Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-oln040092066030.outbound.protection.outlook.com [40.92.66.30]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8F65A68B058 for ; Fri, 11 Mar 2022 13:18:16 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=HmUby2+jMtIOjUTkaHJ569NMyYGYz3H1rApChygXXJ5JAjsbSG6p9hakm2NcZ7IUYzR54/Es/PFpLi3OJoDALdhUkLLyX9I9AxhLpjLVUbqRn5bH+yWjkj/a42TyV30n9pp+9K0Go28+yeE3cquAXujS7IfyQPK/ZktfQwTvSnBdyrIlAgoV3q1VE+5sgnRa0d4RVPgfGHnxXd7i4bipE+mqjaCKtc9qv6xXNxZSm3SJqJXVYU1STGU0ynWvcIynVa7UryABXgVGKLBWuTmmx4+2zkhVHJkTmwe+t3z2/hAlzhGuDekbSuGmXB72EqTd2KM7236UZw1HdCI0QDV7ZQ== 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=ORex8l81y36vg/DBfIh1VU9SLMGx4v9cfLDPd+RlvL8=; b=LpysDohIM2m7NzXjiJNeqHpJQWhcXYWZahsfRmlZwonHgyO7jQ/bGiTlHQBGEnZ5TciZqLbyQS4JZooeV0gJ+TLBX31cL6raGrBGxx+OPFqulY03vaKtcN1Kjppm4UxhbLC2uwpKpCprsxEfD3t1GgsaA5uIGb3OiR7K+iMKsmZSbh7RAsf7zLOv8RUpd+D99h74sH1dHuT5rSZn7ovRB1SBcEd6TIRmAaFSeEimG3QZI+8b7kffS62Qxu7ADzqWPslBEtWByqGRH/KhQobfvbw2MznrRK6COxRHYRc44+qyZM19Sb5E3bUgFvlw7G35+OQUhuJ0X3icZu+1ux5wDw== 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=ORex8l81y36vg/DBfIh1VU9SLMGx4v9cfLDPd+RlvL8=; b=kdrsVx0+wMBRxuzO/XvZ5cTXAqzoHPsrLSUkgPhg2OuMVj0N1sXfvhbh+MBXo1/87K8k1RHiMIElamBh+kGOC/53nfDTaZyF9//z5S1/yXTviOGasPKqLRzfx+lBWpncuo4pbeM8uAxt+6/ehpM39ZhaPJi43O8CWFF7E9fsloTw8d7OSQ8LXepYmL6toPTGPUTdgzaIB5jjKsilWbF7f1KDf0NCUi/n7c/CMQLTKkC8U1TnYj1eKrpq7j5xEnoCyx7bU/RLm89uwPgq5jHxyfVRgFepEnKp9VpqGih4yQjAI8awLOHv//Fr6FAtf9d1R4wN2vEJoXrPeukf3Q5AQw== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by DB8PR03MB6202.eurprd03.prod.outlook.com (2603:10a6:10:136::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5061.22; Fri, 11 Mar 2022 11:18:15 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::bc6c:af66:7adb:7a3d]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::bc6c:af66:7adb:7a3d%7]) with mapi id 15.20.5061.022; Fri, 11 Mar 2022 11:18:15 +0000 Message-ID: Date: Fri, 11 Mar 2022 12:18:13 +0100 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20220311101413.92878-1-ffmpeg@haasn.xyz> <20220311101741.104545-1-ffmpeg@haasn.xyz> From: Andreas Rheinhardt In-Reply-To: <20220311101741.104545-1-ffmpeg@haasn.xyz> X-TMN: [gP+YBKa3oSiJ5MN5gOgWIykGkS6EqiyE] X-ClientProxiedBy: AS8PR04CA0047.eurprd04.prod.outlook.com (2603:10a6:20b:312::22) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: bdf01c62-777c-4007-1964-08da0350d5da X-MS-TrafficTypeDiagnostic: DB8PR03MB6202:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 11WVjWLcliMdqgOlM4hvmvdlxNeotlmmsF6Qatlpx+VQwHvnHL8fQbNyhDdCfge15ivrOYT4evMvcagPEhR7eKPNXCx9CZSkUPQ52AhnL8ldBnuevaqxvkjkztPOMkqHJRfdvLQdDzszm4/QAq1gtentN9mnmYDie/u1agR1O4PSYmNEjWG45iNA9eDVOwV8p8NHELQGkl+jxR13wqTUXxZsYJU0iYToXH/NGwCUYynYHnczBlW+EtHfI2w908S0az8J+EhEN9AiPCJglpK22taSJAKlltzWV1hK1LSn/Ts+q1L0g5oycKUCZAFeXvRHQHD4YBD94K4/m294X8IU8+wPxjnagP4FwJ2w2k1Ms3PWcaaG30AYH4c2NOYB/PoD5ENQq3UGut6H4Sq5DXVATl2Kub0ofZuhepKly/HXXw0DbhpjUtsOerJ+j4lRdsMp1/9BGlknTcU81fINusQJ6xT9+eDNBWGn0kfmYPS87sdoLPZZWH3onwWM1EXZOfoGSDOTcd2XcCwDcgnisjf4ULzBS6HejB8RyNByWVkxi9x6xxEqOww0GDvgDArk36fOackmcmDIXLv4cc64Bj+vFs8buc7KW5gu6bqvEmTh9YeVjd348aQn6khUSxLwKyYl X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?QmR3S2dsK3k5ZUtnTlpiY1hPVmhoYXB2TkVSZU1XRWFQbjRraDdKWnM1OEty?= =?utf-8?B?Wm43SXp4RytOcXVBdkxnT01NRU5vM3NGc29YYjd0TndVUDRkL3pUU04vdmov?= =?utf-8?B?eG9Hd3FHb1BEeUsvTjJ4S1daYm1RSzZUcmVrUjZMUTBDN21QQVVMMFhwNWdQ?= =?utf-8?B?NUJ1KytQT0o5MEUxNFk5K1RYMmVPSHNveEZ2OWZHU3IyN0hudHFFZU94aVIv?= =?utf-8?B?QTk5ajZyV0ZBUzBwMVRPYWVra1JzeklzUklPck0vKytQVUovR0FUdlBNelVq?= =?utf-8?B?Mnl2bGNPY0xLRG5nQ0dJMk9VQzduREw5S0M0ZGNydzltVW1wS2wvNUpMZFgr?= =?utf-8?B?Qk9DK1VDZlFYSGhLSHJSSXFFUThyTUNOQUpTcksrbWdKMHlGWDRvczhWM2ND?= =?utf-8?B?c2xrWVQ1blppV3Rna1ZiMFhCNzFBekhLalhyVTVqOEhuaXp1aTFZZGtoNWZv?= =?utf-8?B?R1JSS1YvME9hOVFJcnBrNVNYbm9VKzRtdGpMcTRRRFRNRGhQK25neU9CZ2JG?= =?utf-8?B?cm50d05wOGFQVjdveVFTVUhKamYydEFsaS9xN3BERFF1SzZYTzU5OCt4dmdE?= =?utf-8?B?Qzg0bWZpNllNUERaL3RXLys2WVIrUXU1SmxXWG5RbnJ6cXZxMTFNTUE2bklD?= =?utf-8?B?Tkl0eS9CWFYzaThBL0wzbzJlV29pK2FFSFJZSzRUY1JBVzE4b1p6YldzRjZB?= =?utf-8?B?RWJITFd0VE9MVGUyY0hKbGRQQnBxMkg3NU5HZ3JuZmdMQXZpN0diZXBBQ3Fp?= =?utf-8?B?ZDVpdE9zT0JPcVlOTGJxVEhkQ2lyTEdLa0x5M3FWT1RHclNZQm4xbDhmVk05?= =?utf-8?B?MDJMMjZ0Y0V2V0MyVXkraEpiMk54Q2NzbW13dkdybUpDMnlVWG9rRGRyQWRu?= =?utf-8?B?RDZSbkxJeENqNVJwSUUwRFR5c2hqbE5Db3d0UWpVTDFtSHhpa0VGc3hncVJQ?= =?utf-8?B?NXpRK3hwWmtpSGVGOUFiai9RWEVUZGhtZHJjNFhlTUxablRZSFl6T1I0Z214?= =?utf-8?B?bVlrdkpiQVkrWmx0Q1Iwb2E3WG9JTzZMbFdxc2g3TWhiVFhEaGJTYm1JdUha?= =?utf-8?B?RktoQkFhYlU2SkpMd3VNSDFDaHFUK3UrM2hLOTVhQTMyVzlBdTAvWHVGSG05?= =?utf-8?B?dTNkaXNpODhHdnljZ1F2NEtPSG1ubUo0V1hKcExJSTF3Uk8vNFA4dS8yTUs5?= =?utf-8?B?NzJmMHlaNzBYQVhmbStlNHhqU3pmVXAyajlveXlGNFNSVW13MWVuVWZ2bWxP?= =?utf-8?B?MzZTdEk1SjdoRU1wSDJicys5MnlkcmIzc1BWdlFhUTE2NXh5cEpNRzEwdEpn?= =?utf-8?B?ekRiekFUMVF6bTJ4Y21YUjVJTFdnWUljRlVZMC9KeVdQTk1DTVhQRW9QMTcx?= =?utf-8?B?WHNDUExPUjhKK3lkUm0yNFllSUdZU240UzFrRUlRV2plOXo4cE9pVDZtZzFh?= =?utf-8?B?UkY3cFdKK21JOFZkY3VJUjRqZWM5VjEwTlhWQVg5N0dMMFhmUlk5L3ZvcEM4?= =?utf-8?B?eFY2RTZ3UkJMWlpJcGloTlc3V1pBTytNbVMvYlh4SUNTWkI4MG9xRWZIdlY0?= =?utf-8?Q?VTJQ4MAoUzT8eHT/0R/M3UqZ1h7iuXYzW4e/gaMVqAyhsl?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: bdf01c62-777c-4007-1964-08da0350d5da X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Mar 2022 11:18:14.9265 (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: DB8PR03MB6202 Subject: Re: [FFmpeg-devel] [PATCH v2] avcodec/pngenc: support writing iCCP chunks 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: Niklas Haas: > From: Niklas Haas > > encode_zbuf is mostly a mirror image of decode_zbuf. Other than that, > the code is pretty straightforward. Special care needs to be taken to > avoid writing more than 79 characters of the profile description (the > maximum supported). > > Also add a FATE transcode test to ensure that the ICC profile gets > encoded correctly. > --- > Oops. `-c copy` doesn't actually test the PNG writing code. Need to use > `-c png` instead. Fixed in v2. > --- > libavcodec/pngenc.c | 77 +++++++++++++++++++++++++++++++++++++++++- > tests/fate/image.mak | 3 ++ > tests/ref/fate/png-icc | 8 +++++ > 3 files changed, 87 insertions(+), 1 deletion(-) > create mode 100644 tests/ref/fate/png-icc > > diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c > index 3ebcc1e571..24530bb62f 100644 > --- a/libavcodec/pngenc.c > +++ b/libavcodec/pngenc.c > @@ -28,6 +28,7 @@ > #include "apng.h" > > #include "libavutil/avassert.h" > +#include "libavutil/bprint.h" > #include "libavutil/crc.h" > #include "libavutil/libm.h" > #include "libavutil/opt.h" > @@ -343,6 +344,65 @@ static int png_get_gama(enum AVColorTransferCharacteristic trc, uint8_t *buf) > return 1; > } > > +static int encode_zbuf(AVBPrint *bp, const uint8_t *data, size_t size) > +{ > + z_stream zstream; > + unsigned char *buf; > + unsigned buf_size; > + int ret; > + > + zstream.zalloc = ff_png_zalloc, > + zstream.zfree = ff_png_zfree, > + zstream.opaque = NULL; > + if (deflateInit(&zstream, Z_DEFAULT_COMPRESSION) != Z_OK) > + return AVERROR_EXTERNAL; > + zstream.next_in = data; > + zstream.avail_in = size; > + > + for (;;) { > + av_bprint_get_buffer(bp, 2, &buf, &buf_size); > + if (buf_size < 2) { > + deflateEnd(&zstream); > + return AVERROR(ENOMEM); > + } > + > + zstream.next_out = buf; > + zstream.avail_out = buf_size - 1; > + ret = deflate(&zstream, Z_FINISH); > + if (ret != Z_OK && ret != Z_STREAM_END) { > + deflateEnd(&zstream); > + return AVERROR_EXTERNAL; > + } > + > + bp->len += zstream.next_out - buf; > + if (ret == Z_STREAM_END) { > + deflateEnd(&zstream); > + return 0; > + } > + } > +} > + > +static int png_get_iccp(AVBPrint *bp, const AVFrameSideData *sd, char **buf_out) > +{ > + const AVDictionaryEntry *name; > + int ret; > + > + av_bprint_init(bp, 0, AV_BPRINT_SIZE_UNLIMITED); > + > + /* profile header */ > + name = av_dict_get(sd->metadata, "name", NULL, 0); > + av_bprintf(bp, "%.79s", (name && name->value[0]) ? name->value : "icc"); > + av_bprint_chars(bp, 0, 2); /* terminating \0 and compression method */ > + > + /* profile data */ > + if ((ret = encode_zbuf(bp, sd->data, sd->size))) { > + av_bprint_finalize(bp, NULL); > + return ret; > + } > + > + return av_bprint_finalize(bp, buf_out); 1. This is not how should work with an AVBPrint -- you are throwing the small-string optimization away here. 2. Using an AVBPrint with its dynamic reallocations is probably not good here at all: It is easy to get a good upper bound via deflateBound() which allows to omit the reallocations/the loop. (I should probably have applied https://patchwork.ffmpeg.org/project/ffmpeg/patch/20210317163202.672493-1-andreas.rheinhardt@gmail.com/) > +} > + > static int encode_headers(AVCodecContext *avctx, const AVFrame *pict) > { > AVFrameSideData *side_data; > @@ -399,7 +459,22 @@ static int encode_headers(AVCodecContext *avctx, const AVFrame *pict) > if (png_get_gama(pict->color_trc, s->buf)) > png_write_chunk(&s->bytestream, MKTAG('g', 'A', 'M', 'A'), s->buf, 4); > > - /* put the palette if needed */ > + side_data = av_frame_get_side_data(pict, AV_FRAME_DATA_ICC_PROFILE); > + if (side_data && side_data->size) { > + AVBPrint bp; > + char *buf; > + int ret; > + > + if ((ret = png_get_iccp(&bp, side_data, &buf))) { > + av_log(avctx, AV_LOG_WARNING, "Failed writing iCCP chunk: %s\n", > + av_err2str(ret)); 3. You should error out in case of error. > + } else { > + png_write_chunk(&s->bytestream, MKTAG('i', 'C', 'C', 'P'), buf, bp.size); 4. The size of this chunk is not accounted for in the max_packet_size. (You are lucky that the current estimate for max_packet_size is too generous (the zstream is not reset/flushed for each row, so it should be deflatebound(alldata) instead of height*deflatebound(data_from_one_row)).) > + av_free(buf); > + } > + } > + > + /* put the palette if needed, must be after colorspace information */ > if (s->color_type == PNG_COLOR_TYPE_PALETTE) { > int has_alpha, alpha, i; > unsigned int v; > diff --git a/tests/fate/image.mak b/tests/fate/image.mak > index 573d398915..da4f3709e9 100644 > --- a/tests/fate/image.mak > +++ b/tests/fate/image.mak > @@ -385,6 +385,9 @@ FATE_PNG_PROBE += fate-png-side-data > fate-png-side-data: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_frames \ > -i $(TARGET_SAMPLES)/png1/lena-int_rgb24.png > > +FATE_PNG_PROBE += fate-png-icc > +fate-png-icc: CMD = transcode png_pipe $(TARGET_SAMPLES)/png1/lena-int_rgb24.png image2 "-c png" > + > FATE_PNG-$(call DEMDEC, IMAGE2, PNG) += $(FATE_PNG) > FATE_PNG_PROBE-$(call DEMDEC, IMAGE2, PNG) += $(FATE_PNG_PROBE) > FATE_IMAGE += $(FATE_PNG-yes) > diff --git a/tests/ref/fate/png-icc b/tests/ref/fate/png-icc > new file mode 100644 > index 0000000000..d3cf55263e > --- /dev/null > +++ b/tests/ref/fate/png-icc > @@ -0,0 +1,8 @@ > +7e412f6a9e2c7fcb674336e5c104518d *tests/data/fate/png-icc.image2 > +49398 tests/data/fate/png-icc.image2 > +#tb 0: 1/25 > +#media_type 0: video > +#codec_id 0: rawvideo > +#dimensions 0: 128x128 > +#sar 0: 2835/2835 > +0, 0, 0, 1, 49152, 0xe0013dee _______________________________________________ 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".