From patchwork Thu Mar 9 09:31:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wangyaqiang <1035567130@qq.com> X-Patchwork-Id: 40619 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:d046:b0:cd:afd7:272c with SMTP id hv6csp188888pzb; Thu, 9 Mar 2023 01:32:10 -0800 (PST) X-Google-Smtp-Source: AK7set/zRwelsDIYo2+0lJU24Ka5fYfMjEpt22K9j4caCZ9SKxGq4q+M0gVr1ceVnZXqCgNCujGx X-Received: by 2002:a17:906:246:b0:8b1:fc1a:7d21 with SMTP id 6-20020a170906024600b008b1fc1a7d21mr25906032ejl.5.1678354330499; Thu, 09 Mar 2023 01:32:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1678354330; cv=none; d=google.com; s=arc-20160816; b=yC6vFgkUXuFLAMRmVYRFazY82gd1mnvXZ8FBfQhflczXg9ECO4AXdIX7Y55jxBcRKf 9dnTld7sZXr8oREdU+IMqL1gEyphggPPigDZLUB7snJgBQLOWMvixe/DoriBUl4YA2mb gBE8hC24L0S4ro4GqVhYL1bhEk21goO/l6ne0qe5TCX+KJCqR1YvE+sSZaYO30XMSRom BOqbYkDKWqmKkKPeUwf1Gyv9UOD9GTk9BPumL6GRSVQkaFmrcQVLQaYoP/35Tn9jNN1f d714RjXLw1fwl0EWzJU+7zw5W+vj59dSa9Hw26lpEwK+tZeC5bFZL7NCZ7qVwpwD1TlV YDdA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:date:to:from:message-id :dkim-signature:delivered-to; bh=VpLGg7X9AS7QnzeXB79IbzXhFId5TtTmfVGjEsIlyro=; b=RFatB5ZjVx2vxZSqRi9LzCZcZApeA4eA+UFNLjU+STE690qIsOOv+PFcCrxVGD0t5W TFRsr3QuILqFkNSVFaDaqv1r9VGWlzDYlw1WJZauNxY2eskfXd63Qen+mdgpdAf6ZRVI VrYSAXJw4tIZLPbypjyXexWUNFOMaN4ziEE8mYNgs3OR5qnhPMUNfA82bFj/U4Zx3exI 6PItL7zppVH1fH0+OYGAWMeqPyB7CTOfGHxjtpNlAxu7TgfEE7vTU624aSoehH1LPGml BaIjBwRqH35yARY3KYracZ5jnQRmUrpWdULBbupr8ICQ3dYBMIaOGtP0/Bwjj0bAXFUu C/rg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@qq.com header.s=s201512 header.b=bQ0zOeGz; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=qq.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j9-20020a170906430900b008ccca79f939si18808248ejm.293.2023.03.09.01.32.09; Thu, 09 Mar 2023 01:32:10 -0800 (PST) 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=@qq.com header.s=s201512 header.b=bQ0zOeGz; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=qq.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0B97068BCD5; Thu, 9 Mar 2023 11:32:07 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-57-49.mail.qq.com (out162-62-57-49.mail.qq.com [162.62.57.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7376368B651 for ; Thu, 9 Mar 2023 11:31:59 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512; t=1678354311; bh=VHm55NyjfICxMhgBN3kyg4jdgrCJmZBPsV+wysbkBbw=; h=From:To:Cc:Subject:Date; b=bQ0zOeGzad1Ux87ScPVC4eq35Wdz3R8XZ4kFg3vpT5t7SBsbVXwRpkExEI63Elphq nHPYi74uzwM5jYjB4XdKP62tjxDsJnjjANQO/epX9QwQup1Wd+5ALBfWAtQm4alT4f Ub/oz9H9GThKlpz0La8BccRBbmaPqdCMCrmQeS5M= Received: from localhost.localdomain ([103.107.216.225]) by newxmesmtplogicsvrszb9-0.qq.com (NewEsmtp) with SMTP id 7F1228BE; Thu, 09 Mar 2023 17:31:49 +0800 X-QQ-mid: xmsmtpt1678354309t81av0r31 Message-ID: X-QQ-XMAILINFO: NJ/+omVLhVgaL8BtnwBvTWmg+sA2JFa86G5rOC7VZTA4cabZlctygRfyn7FhHO utL9/Utv0PSMrZ/Q0v1SL566jCKMyS6Ur9N7DE28ahlR8PzPeMWvOhpJsIOofC7is1+b7x5ae/tY vr+7AjQA9GvYAgid7P3HG/B1e27Cb5EdLviQVlOKHcQxkuKdhloLdU4DUnnvfwNw4tN4aIBxVdZM mcd04iYcezqYszl6GgN307GJlL97KI9XyaHABwUk3Db2XSB2/Gs0qJfw6MOVs4Yuo1iJZL8sWoTI ElOWk1KOJ7s6UDS42N/Pojss2BOKZEwJghYqZqcfpQcT1y9/CYhubDtzyZkjqbGT/5LS3+9PkGkb xdZM0c1to0byLBBt6eW7S/yMQrruhFeUIB9mlI5xYF4R2UKLtsEA7m7n7CRybsuGyyYRFozmXpCm szk8ZKoG7ww1vjMM15mtDEHnOGLGv19RRJu2Q2MsXbq+jgoWz9QtrF0iEX2HACoQ8wPLgF3WHSvO 2ly7Hf5kJ++8U3D6YjcYfwSny7dfGyM5UTfvsHQBZk6iADmm1k9ncF2lXvtbkAWZmYtZKSDutxYx 3qSF5vt1F4fnlZFAYzx91ZlCy8vWp66DZVKzJ4O7wy13i2e+G7T+ZnBuAiB1BSDg25e/u6626S3o K7Jy7TrXnu/DnLXs5e+VK5EAI4HTs7pymuTFpB5tbZdyy8/pXPSI3UzZ2FHfVzm2a+h3S6Po12gj xfaWQ8OjH/eDAxEHP9wi7mzy2MyEIZ+AOe4fUzvXgIr5Fnpd/KXqIFpjlN0ysLcsHVSFbzZz2Ldt 6UmkbjehDtU1vIN4C5hM2kl4PXQEtAB8OPhB8+IoITb3chlFb4cPcl+Q0N3EoTBNolBBX8F+11ec 4SrEiZmLR4ZvNOhQK4l/p0ymoAIzMDpmdOkAHMFQ7aqOzVbxqnlUM4Yq+BvXLcbm/ug8KS8DSgoZ jNdToUeIk= From: 1035567130@qq.com To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Mar 2023 17:31:47 +0800 X-OQ-MSGID: <20230309093147.44072-1-1035567130@qq.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] libavcodec/libwebpenc_animencoder.c: support ICCP when the source material contains the icc profile 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 Cc: Wang Yaqiang Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 2/VeXOWMd4F7 From: Wang Yaqiang when the source material contains the icc profile, the AVFrame have side_data with type AV_FRAME_DATA_ICC_PROFILE, write the ICCP chunk make sure the colors are displayed correctly. Signed-off-by: Wang Yaqiang --- libavcodec/libwebpenc_animencoder.c | 39 ++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/libavcodec/libwebpenc_animencoder.c b/libavcodec/libwebpenc_animencoder.c index 8756231f23..acdefc75a4 100644 --- a/libavcodec/libwebpenc_animencoder.c +++ b/libavcodec/libwebpenc_animencoder.c @@ -45,6 +45,8 @@ typedef struct LibWebPAnimContext { void *first_frame_opaque; AVBufferRef *first_frame_opaque_ref; + WebPData icc_data; + int done; // If true, we have assembled the bitstream already } LibWebPAnimContext; @@ -62,6 +64,7 @@ static av_cold int libwebp_anim_encode_init(AVCodecContext *avctx) return AVERROR(EINVAL); s->first_frame_pts = AV_NOPTS_VALUE; s->done = 0; + WebPDataInit(&s->icc_data); } return ret; } @@ -79,6 +82,27 @@ static int libwebp_anim_encode_frame(AVCodecContext *avctx, AVPacket *pkt, WebPData assembled_data = { 0 }; ret = WebPAnimEncoderAssemble(s->enc, &assembled_data); if (ret) { + if (s->icc_data.bytes) { + WebPMux *muxer = WebPMuxCreate(&assembled_data,1); + WebPDataClear(&assembled_data); + if (!muxer) { + ret = AVERROR(ENOMEM); + return ret; + } + ret = WebPMuxSetChunk(muxer,"ICCP",&s->icc_data,0); + if (!ret) { + ret = AVERROR_INVALIDDATA; + WebPMuxDelete(muxer); + return ret; + } + ret = WebPMuxAssemble(muxer,&assembled_data); + WebPMuxDelete(muxer); + if (!ret) { + ret = AVERROR_INVALIDDATA; + WebPDataClear(&assembled_data); + return ret; + } + } ret = ff_get_encode_buffer(avctx, pkt, assembled_data.size, 0); if (ret < 0) { WebPDataClear(&assembled_data); @@ -117,6 +141,7 @@ FF_ENABLE_DEPRECATION_WARNINGS int timestamp_ms; WebPPicture *pic = NULL; AVFrame *alt_frame = NULL; + AVFrameSideData *frame_side_data = NULL; ret = ff_libwebp_get_frame(avctx, &s->cc, frame, &alt_frame, &pic); if (ret < 0) goto end; @@ -131,7 +156,18 @@ FF_ENABLE_DEPRECATION_WARNINGS ret = ff_libwebp_error_to_averror(pic->error_code); goto end; } - + if (!s->icc_data.bytes) { + frame_side_data = av_frame_get_side_data(frame,AV_FRAME_DATA_ICC_PROFILE); + if (frame_side_data) { + s->icc_data.bytes = WebPMalloc(frame_side_data->size); + if (!s->icc_data.bytes) { + ret = AVERROR(ENOMEM); + goto end; + } + s->icc_data.size = frame_side_data->size; + memcpy(s->icc_data.bytes,frame_side_data->data,frame_side_data->size); + } + } if (!avctx->frame_num) { s->first_frame_pts = frame->pts; #if FF_API_REORDERED_OPAQUE @@ -170,6 +206,7 @@ static int libwebp_anim_encode_close(AVCodecContext *avctx) av_buffer_unref(&s->first_frame_opaque_ref); + WebPDataClear(&s->icc_data); return 0; }