From patchwork Wed Apr 17 19:20:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Diego Felix de Souza via ffmpeg-devel X-Patchwork-Id: 48122 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:ce4e:b0:1a9:af23:56c1 with SMTP id id14csp1232915pzb; Wed, 17 Apr 2024 12:21:52 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUH/SCoEmUtuDzp3czdZyR3FAsoytsrQhcmV/m1TF2szhHGf6y8CWDpUQm5eh3HP/hSsA8f9KB7s6k2TEDlsjU4pPc7dGp3uPy1ow== X-Google-Smtp-Source: AGHT+IErlbZKMhER0GdJgbG2txWwyGGEbREbeiWlw7CZduuFISizwng/tukSwmIwQ+6gw7OxI0L6 X-Received: by 2002:a2e:b001:0:b0:2d8:8e1e:e15d with SMTP id y1-20020a2eb001000000b002d88e1ee15dmr125615ljk.32.1713381712203; Wed, 17 Apr 2024 12:21:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1713381712; cv=none; d=google.com; s=arc-20160816; b=sK/6y7/B0nImQiZP9i+xM7XX/8H1WsLMZWFRUm94x1RkqewQWn1u03Mtb3Afl1VtKz 8P3vmleHYl4vUV+qaM0s7ClKq6mJd+ATYhP47pSjd6Xm8E4y123KTatSfbYh4b06mlhN MQw913RG3r+NDiZF/byP68DrulidmHu3ZrzPyUXi22LHtKBeqmThsWhkhmzZF/fyWChl DcqHrJZw0NovsGx8vwsyV5i7rnQformzRdCjo6vnrsiN7UxPzkQQYEzyoSOEOQNTR9Rc /vSp0xOCOrDh0l5Ed4SsziX/CQDzwj09SZ6d1rbH5J4uj/r8t/uFvF7VY2qEzZ/u7Y/1 1yrg== 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:from :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:delivered-to; bh=kFbkXJTn+TJ58rEBU1eNGEUwh+5AnGfCw/RwjiMotD0=; fh=XuleKIHF9MUFgiZ1qrMyNqDu84gapm8sSgQI0zYajBE=; b=PRVTmR+cMbP59l7s1Dt5uTipFUR+UMm58JDBNADJdPJuBfp6AEDG6+VxmPHknyL6Qt 7JsQmPd5I//KqWHXIO0jqNf771L1VeA3EJXOgEljKQbDN77M1wjVnfbTeUMdcgCNCQz4 kXa6P3sYGl9RAvzHeDurG5lEvGuoDGmtyt6Xit9ZIwHZMqDBmHb5a/prXhMUmW0j7vnW +a4lsvk58/cDJXfUSURq2kmhZHtuMERVmATxSlZRWmP4NeDKn3TS2IHk5cE7OEgZL/UR /KAEboXvluv5DiuHI5CW5wlq9hM78jlonBNUieG+xngSsqEirp0kFGxmsXunyLeELRIf bxuA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e20-20020a056402191400b0056dc92ac0c7si7081548edz.295.2024.04.17.12.21.51; Wed, 17 Apr 2024 12:21:52 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EEFEF68D3D2; Wed, 17 Apr 2024 22:21:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from shout01.mail.de (shout01.mail.de [62.201.172.24]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1A22968D3A3 for ; Wed, 17 Apr 2024 22:21:20 +0300 (EEST) Received: from postfix03.mail.de (postfix03.bt.mail.de [10.0.121.127]) by shout01.mail.de (Postfix) with ESMTP id BACD8240E3A for ; Wed, 17 Apr 2024 21:21:19 +0200 (CEST) Received: from smtp01.mail.de (smtp03.bt.mail.de [10.0.121.213]) by postfix03.mail.de (Postfix) with ESMTP id 9E49880303 for ; Wed, 17 Apr 2024 21:21:19 +0200 (CEST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp01.mail.de (Postfix) with ESMTPSA id 55AE5240AEA for ; Wed, 17 Apr 2024 21:21:17 +0200 (CEST) To: ffmpeg-devel@ffmpeg.org Date: Wed, 17 Apr 2024 12:20:04 -0700 Message-ID: <20240417192012.22436-9-thilo.borgmann@mail.de> In-Reply-To: <20240417192012.22436-1-thilo.borgmann@mail.de> References: <20240417192012.22436-1-thilo.borgmann@mail.de> MIME-Version: 1.0 X-purgate: clean X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate-type: clean X-purgate-Ad: Categorized by eleven eXpurgate (R) http://www.eleven.de X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate: clean X-purgate-size: 3674 X-purgate-ID: 154282::1713381679-551C31F9-96AE71DA/0/0 Subject: [FFmpeg-devel] [PATCH v12 8/8] avcodec/webp: export XMP metadata 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: , X-Patchwork-Original-From: Thilo Borgmann via ffmpeg-devel From: Diego Felix de Souza via ffmpeg-devel Reply-To: FFmpeg development discussions and patches Cc: thilo.borgmann@mail.de Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: maGupQF5JRd8 From: Thilo Borgmann via ffmpeg-devel --- libavcodec/webp.c | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/libavcodec/webp.c b/libavcodec/webp.c index 4a244c1b67..35851ef3da 100644 --- a/libavcodec/webp.c +++ b/libavcodec/webp.c @@ -38,8 +38,8 @@ * @author Josef Zlomek, Pexeso Inc. * Animation * - * Unimplemented: - * - XMP metadata + * @author Thilo Borgmann + * XMP metadata */ #include "libavutil/imgutils.h" @@ -217,6 +217,7 @@ typedef struct WebPContext { int alpha_data_size; /* alpha chunk data size */ int has_exif; /* set after an EXIF chunk has been processed */ int has_iccp; /* set after an ICCP chunk has been processed */ + int has_xmp; /* set after an XMP chunk has been processed */ int width; /* image width */ int height; /* image height */ int vp8x_flags; /* global flags from VP8X chunk */ @@ -1464,6 +1465,7 @@ static int webp_decode_frame_common(AVCodecContext *avctx, uint8_t *data, int si // reset metadata bit for each packet s->has_exif = 0; s->has_iccp = 0; + s->has_xmp = 0; while (bytestream2_get_bytes_left(&gb) > 8) { char chunk_str[5] = { 0 }; @@ -1495,6 +1497,7 @@ static int webp_decode_frame_common(AVCodecContext *avctx, uint8_t *data, int si s->canvas_height = 0; s->has_exif = 0; s->has_iccp = 0; + s->has_xmp = 0; ff_thread_release_ext_buffer(&s->canvas_frame); break; case MKTAG('V', 'P', '8', ' '): @@ -1680,12 +1683,39 @@ exif_end: } s->vp8x_flags |= VP8X_FLAG_ANIMATION; break; - case MKTAG('X', 'M', 'P', ' '): - AV_WL32(chunk_str, chunk_type); - av_log(avctx, AV_LOG_WARNING, "skipping unsupported chunk: %s\n", - chunk_str); + case MKTAG('X', 'M', 'P', ' '): { + GetByteContext xmp_gb; + AVDictionary **xmp_metadata = NULL; + uint8_t *buffer; + int xmp_offset = bytestream2_tell(&gb); + + if (s->has_xmp) { + av_log(avctx, AV_LOG_VERBOSE, "Ignoring extra XMP chunk\n"); + goto xmp_end; + } + if (!(s->vp8x_flags & VP8X_FLAG_XMP_METADATA)) + av_log(avctx, AV_LOG_WARNING, + "XMP chunk present, but XMP bit not set in the " + "VP8X header\n"); + + // there are at least chunk_size bytes left to read + buffer = av_malloc(chunk_size + 1); + if (!buffer) { + return AVERROR(ENOMEM); + } + + s->has_xmp = 1; + bytestream2_init(&xmp_gb, data + xmp_offset, size - xmp_offset); + bytestream2_get_buffer(&xmp_gb, buffer, chunk_size); + buffer[chunk_size] = '\0'; + + xmp_metadata = (s->vp8x_flags & VP8X_FLAG_ANIMATION) ? &p->metadata : &s->frame->metadata; + av_dict_set(xmp_metadata, "xmp", buffer, AV_DICT_DONT_STRDUP_VAL); + +xmp_end: bytestream2_skip(&gb, chunk_size); break; + } default: AV_WL32(chunk_str, chunk_type); av_log(avctx, AV_LOG_VERBOSE, "skipping unknown chunk: %s\n",