From patchwork Thu Jul 20 20:46:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rostislav Pehlivanov X-Patchwork-Id: 4402 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.1.76 with SMTP id 73csp84321vsb; Thu, 20 Jul 2017 13:54:25 -0700 (PDT) X-Received: by 10.28.34.130 with SMTP id i124mr3324432wmi.135.1500584065359; Thu, 20 Jul 2017 13:54:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1500584065; cv=none; d=google.com; s=arc-20160816; b=QRNQtzAjim1ZCb/Ak+Gp4OcVtZjtbEz/mS3D5lCRdKntrhCFTwnGoGJ/RHMnVslMPC do8bw8OzCdBs0WNFjRGdyPhm5fBNRDhzkIgzykvK/Td4OIL5QDl8eqC68nUGZwZEd8A9 5BUXoxfaU9fLi61fE1MCIksanIiyw9zE9L3IL477cxH9uDVTAqDB7CcAUebi0V9dWAq7 uBjIDV+pZjePZXwqRmuFdJW8Nf8SBLcDT8qp7NFEb80qLTzGoIcUguNvQ+18AiFyfJo6 SQtrforuB3IIx8EsYoEEJQkpqCGTP69zHOK9G9Dgx7mbkZOZRKPuFK5mfhFyNMegllsi UAOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=I9SCtx/WTz2n5OPqaaoO0dmOF8XGrVy3W5gCt/IrOPk=; b=KOLpYQOqdorTUkt8lB+ilW6/XLPpmrGB+dmZ0ffRKId2BYuKATEjIUGCLC2bTTqQ4u /pEZtHscHtpnKBHGp9fHt9f/8DPuQG/DpkAIM+YX6qU+TVK1bl/h/VBZMOKcOaNIUWfw oF2EXQcquOcGXnEsTMySAjo1ldjH0qqIf9FmbQTHTeDriZ6KIrhGNrLhkMtqkeKwJurS T4mOA6sMW31d+uRN62aTEufOfUtTTo0ITyKvsD+vkEzPO2JrZDJcOON0wRs2Y5OUQNNQ j6Chgr01UVkaamz0kTz71gBHeN1nG8V2zVbxADKE0pijAj8VJkmC+pdG8E1zeJWWxM+W P98g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.b=YLUbt4Jg; 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=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 194si2298060wmu.49.2017.07.20.13.54.24; Thu, 20 Jul 2017 13:54:25 -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=@gmail.com header.b=YLUbt4Jg; 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=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C4B29689B0E; Thu, 20 Jul 2017 23:54:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C4020689AEA for ; Thu, 20 Jul 2017 23:54:07 +0300 (EEST) Received: by mail-wm0-f67.google.com with SMTP id m4so4871729wmi.4 for ; Thu, 20 Jul 2017 13:54:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TFCKUBdELSo++7aug+Go1IZ+1ZM8fqlu4iHDLYwgcoI=; b=YLUbt4JgP9OvM3SOYvf6rmSaXx6UU5OnUmhiwXU0dH4OiXgQLmfYeivBjUqr4fdLcD Awf8AzensvqC5mt9SGHgL17tdogbS8udLkeG4ES5XM+nVyhs/PmIuDkXcl5ZAvEW+SV0 O3bJd0PibqNRBa40n1gsWiLEIensB1pPS187I5SILRvquPRLYzcV+e98dEajW8juDYnD wU28C1paT7t1xg7QVmMe6FqyOqSsNxwb9ulp7WNoBs12aPkzb+jE0zyakJg40xNySepo wCyEfDHoJX9KH29U50/SYZhab4TYU32303ToF3f2jkG2dSXYrofIhU+rmRqxpYgvtAbV TZBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=TFCKUBdELSo++7aug+Go1IZ+1ZM8fqlu4iHDLYwgcoI=; b=E8mIGDptKaHk3+zyB8r8EGe4+nvh6KWSWkiDU8CU76ViuctoeVQ+zyhWxS7WppJMoG X0RreSEMdTML/CEIURnJhpGtBtcbmUwZCmOD7UPxCCO3WQgsX3/8v0OuDJEL8AJBhbJV 0YpwP/jQ3jPSx5+KEuRCeAGbPazylBsnYN3Bw88Hv9lSAJc0DEh4cV2Av7tfHR2X6pE1 iZ4hAnlLpNfjl6e68JIIRT22wLmvZmNAxSQwSJ3x8kpCKJe8Yq/bTXukRWyALVbErbZA +J4xTQghsBxkq/cX9gcSZY5h972ve1iDyEUXve0x2gtv3dHRdtfwF8cpcuEYZl/rmcHx bzLA== X-Gm-Message-State: AIVw110FGNX8emAXTjnzZ3igsoTKCqxH6OUV+mFH/mcYa3/RksG7eqJp RL5omrDg2JidSDmh1CM= X-Received: by 10.28.54.202 with SMTP id y71mr3456928wmh.106.1500583598952; Thu, 20 Jul 2017 13:46:38 -0700 (PDT) Received: from skyhide.lan ([93.183.129.6]) by smtp.gmail.com with ESMTPSA id 35sm3145050wrf.72.2017.07.20.13.46.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Jul 2017 13:46:38 -0700 (PDT) From: Rostislav Pehlivanov To: ffmpeg-devel@ffmpeg.org Date: Thu, 20 Jul 2017 21:46:22 +0100 Message-Id: <20170720204622.27337-2-atomnuker@gmail.com> X-Mailer: git-send-email 2.14.0.rc0.284.gd933b75aa4 In-Reply-To: <20170720204622.27337-1-atomnuker@gmail.com> References: <20170720204622.27337-1-atomnuker@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/2] pngdec: decode and expose iCCP chunks as side data X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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: Rostislav Pehlivanov MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Rostislav Pehlivanov --- libavcodec/pngdec.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index 083f61f4f8..64811c6fc3 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -836,6 +836,46 @@ static int decode_trns_chunk(AVCodecContext *avctx, PNGDecContext *s, return 0; } +static int decode_iccp_chunk(PNGDecContext *s, uint32_t length, AVFrame *f) +{ + int ret, cnt = 0; + uint8_t *data, profile_name[82]; + AVBPrint bp; + AVFrameSideData *sd; + + while ((profile_name[cnt++] = bytestream2_get_byte(&s->gb)) && cnt < 81); + if (cnt > 80) { + av_log(s->avctx, AV_LOG_ERROR, "iCCP with invalid name!\n"); + return AVERROR_INVALIDDATA; + } + + length -= cnt; + + if (bytestream2_get_byte(&s->gb) != 0) { + av_log(s->avctx, AV_LOG_ERROR, "iCCP with invalid compression!\n"); + return AVERROR_INVALIDDATA; + } + + length -= 1; + + if ((ret = decode_zbuf(&bp, s->gb.buffer, s->gb.buffer + length) < 0)) + return ret; + + av_bprint_finalize(&bp, (char **)&data); + + if (!(sd = av_frame_new_side_data(f, AV_FRAME_DATA_ICC_PROFILE, bp.len))) + return AVERROR(ENOMEM); + + av_dict_set(&sd->metadata, "name", profile_name, 0); + memcpy(sd->data, data, bp.len); + av_free(data); + + /* ICC compressed data and CRC */ + bytestream2_skip(&s->gb, length + 4); + + return 0; +} + static void handle_small_bpp(PNGDecContext *s, AVFrame *p) { if (s->bits_per_pixel == 1 && s->color_type == PNG_COLOR_TYPE_PALETTE) { @@ -1239,6 +1279,11 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, bytestream2_skip(&s->gb, 4); /* crc */ break; } + case MKTAG('i', 'C', 'C', 'P'): { + if (decode_iccp_chunk(s, length, p) < 0) + goto fail; + break; + } case MKTAG('I', 'E', 'N', 'D'): if (!(s->pic_state & PNG_ALLIMAGE)) av_log(avctx, AV_LOG_ERROR, "IEND without all image\n");