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 ESMTPS id 328B84C0B8 for ; Mon, 10 Feb 2025 19:27:30 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E098368BED9; Mon, 10 Feb 2025 21:26:40 +0200 (EET) Received: from mail-yw1-f169.google.com (mail-yw1-f169.google.com [209.85.128.169]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A44DA68BE9F for ; Mon, 10 Feb 2025 21:26:34 +0200 (EET) Received: by mail-yw1-f169.google.com with SMTP id 00721157ae682-6f9c6d147edso22724597b3.3 for ; Mon, 10 Feb 2025 11:26:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739215593; x=1739820393; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=B2yijdDrUhWkWvJINn1Bh+mRD1/w2/3CrahO7apHL04=; b=FVVHMoj6+lOxf6+pJ1g2W1sNeFlxjXYhQivk2c9DjpRIVnjiahMVjF1ilCqfqJGKv5 ufhq9qgIwGI72woEnmZC3IHgrGJ0ABz/THAcj7TehX8Q5rgP9cy7XKFNb+5y/FsYeeYg uuj+pbegkxOBnCGUSsLzDjabXgnieqEeprs7LHDFN+OoLY5zSCIsS/lkihiOMJt8sm6w dz0A+Evjpjqk4cG2b1Q/pnMUjCLhWMO/Po+K+yaenC7qLqv/qNpw9/vLK2o/RmHkZWWv pjwORirJ4JmHXSlwmoRF1Lh+x2yJwXAxuiAPHmzXhjSfzxqjMdYROetMtLfXRMr8AIrB M0kQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739215593; x=1739820393; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=B2yijdDrUhWkWvJINn1Bh+mRD1/w2/3CrahO7apHL04=; b=avCJ/8Gi3WqtteGVW8B4DdxMpFD6dfLe8WxSK6jiLbGG9aquH71lUnppzkGjqsn9fs u9Jy/TOKVP/38dWqJyTSf5bOlBA4gZb3tiPnExuMdMRgGIDKQYYw469w5O/ODc44KqTT R1a/qqwTBPHd9NCZSJmRRHjJURY4HqhQuI43de8wGg1ys7PCcp/Wn3IZX8LQFyZobymQ EyF/HaXcY3Yz8wLX8/wSQqNZZd03w5JOYHak8WTN4n/nZ4i7yaWf1FlggIOEYKewY4TW +scR5mvmSQ2ti0DIbUMD6JrZCN+3Qk88M4GURW83GBJ4K5j1MEalCzEJ+KbciVadSTxg fUXA== X-Gm-Message-State: AOJu0YzUY77XT0s4a8leNCYottaDJbPyMYwhsgKtWHZyuoKPTFNK1QMX 6QN/oFC364dDamjL+oy7QSSnGyBqj0g85X59AXoNWHPL7zTwgK4llXW8EA== X-Gm-Gg: ASbGncuuFa14I4xal/skPDLmR4K9FkWqJOlPDsrLVW/oLo32MZZIuamOGeVDwxIn//T mwgqivSItYrg5jWYRCvfsUN328OHXUttqMqWGFPmhYa7I2pSkGsqEvPr3HuQqJFMWkmkYwlRP6b An49131i3vQU6IFB3taZySszug3fT4aPRzsj0rEFVtkPRtDVrixWl+9E1JKiryr/PoJmanxXhTp pjuiMR0Mhlgn/0JAMAZ4gHqcCsrpm+oZkgGumdkwPwnzL+YJpg3db+MxJCry2bGxcfxI/RSqidh yYZgnXiv1QsaYAUmyTx8P2/b7++ue9D77gsr7dLLFIIkOdORsm8MNUQ= X-Google-Smtp-Source: AGHT+IFUjcGl4g0+rzhPf6Mw/7EaiK3dRPu4EFKDdaj7GFO0M+SzxD/3xX6NSGQEjmb7ooNsWPbr+A== X-Received: by 2002:a05:690c:4807:b0:6ee:6e71:e6d6 with SMTP id 00721157ae682-6f9b29d8b80mr127923877b3.23.1739215592694; Mon, 10 Feb 2025 11:26:32 -0800 (PST) Received: from localhost.localdomain ([2607:fb91:fe6:4ec3:28a5:3f0e:2e51:b5ed]) by smtp.gmail.com with ESMTPSA id 00721157ae682-6fafee87110sm4985567b3.15.2025.02.10.11.26.30 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 10 Feb 2025 11:26:32 -0800 (PST) From: Romain Beauxis To: ffmpeg-devel@ffmpeg.org Date: Mon, 10 Feb 2025 13:25:59 -0600 Message-Id: <20250210192600.42502-6-romain.beauxis@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20250210192600.42502-1-romain.beauxis@gmail.com> References: <20250210192600.42502-1-romain.beauxis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 5/6] Parse secondary chained ogg/flac stream comments. 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: Romain Beauxis 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: This the same changes as done with ogg/opus: parse comments in secondary chained ogg/flac streams, attach them as packed extradata, decode and attach them to the next decoded stream in the flac decoder. libavformat/oggparseflac.c: Parse ogg/flac comments in new ogg packets, add them to ogg stream new_metadata. libavcodec/flacdec.c: Process AV_PKT_DATA_METADATA_UPDATE on new packets, add them as new metadata on the new decoded audio frame. --- libavcodec/flacdec.c | 20 +++++++++++++++++++- libavformat/oggparseflac.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c index ad921a1bd1..337f3e1702 100644 --- a/libavcodec/flacdec.c +++ b/libavcodec/flacdec.c @@ -68,6 +68,8 @@ typedef struct FLACContext { unsigned int decoded_buffer_size_33bps; int buggy_lpc; ///< use workaround for old lavc encoded files + AVDictionary *pending_metadata; + FLACDSPContext dsp; } FLACContext; @@ -718,6 +720,8 @@ static int flac_decode_frame(AVCodecContext *avctx, AVFrame *frame, int buf_size = avpkt->size; FLACContext *s = avctx->priv_data; int bytes_read = 0; + const uint8_t *side_metadata; + size_t size; int ret; *got_frame_ptr = 0; @@ -728,7 +732,14 @@ static int flac_decode_frame(AVCodecContext *avctx, AVFrame *frame, } if (buf_size > 0 && (*buf & 0x7F) == FLAC_METADATA_TYPE_VORBIS_COMMENT) { - av_log(s->avctx, AV_LOG_DEBUG, "skipping vorbis comment\n"); + /* New metadata */ + side_metadata = av_packet_get_side_data(avpkt, AV_PKT_DATA_METADATA_UPDATE, &size); + if (side_metadata) { + av_dict_free(&s->pending_metadata); + ret = av_packet_unpack_dictionary(side_metadata, size, &s->pending_metadata); + if (ret < 0) + return ret; + } return buf_size; } @@ -788,6 +799,12 @@ static int flac_decode_frame(AVCodecContext *avctx, AVFrame *frame, buf_size - bytes_read, buf_size); } + + if (s->pending_metadata) { + av_dict_copy(&frame->metadata, s->pending_metadata, AV_DICT_APPEND); + av_dict_free(&s->pending_metadata); + } + *got_frame_ptr = 1; return bytes_read; @@ -799,6 +816,7 @@ static av_cold int flac_decode_close(AVCodecContext *avctx) av_freep(&s->decoded_buffer); av_freep(&s->decoded_buffer_33bps); + av_dict_free(&s->pending_metadata); return 0; } diff --git a/libavformat/oggparseflac.c b/libavformat/oggparseflac.c index f25ed9cc15..3810806112 100644 --- a/libavformat/oggparseflac.c +++ b/libavformat/oggparseflac.c @@ -78,6 +78,32 @@ flac_header (AVFormatContext * s, int idx) return 1; } +static int +flac_packet (AVFormatContext * s, int idx) +{ + struct ogg *ogg = s->priv_data; + struct ogg_stream *os = ogg->streams + idx; + AVDictionary *new_metadata = NULL; + int ret; + + if (os->psize > 0 && os->buf[os->pstart] && + (os->buf[os->pstart] & 0x7F) == FLAC_METADATA_TYPE_VORBIS_COMMENT) { + ret = ff_vorbis_comment(s, &new_metadata, os->buf + os->pstart + 4, + os->psize - 4, 1); + + if (ret < 0) + return ret; + + os->new_metadata = av_packet_pack_dictionary(new_metadata, &os->new_metadata_size); + av_dict_free(&new_metadata); + + if (!os->new_metadata) + return AVERROR(ENOMEM); + } + + return 0; +} + static int old_flac_header (AVFormatContext * s, int idx) { @@ -130,6 +156,7 @@ const struct ogg_codec ff_flac_codec = { .magic = "\177FLAC", .magicsize = 5, .header = flac_header, + .packet = flac_packet, .nb_header = 2, }; @@ -137,5 +164,6 @@ const struct ogg_codec ff_old_flac_codec = { .magic = "fLaC", .magicsize = 4, .header = old_flac_header, + .packet = flac_packet, .nb_header = 0, }; -- 2.39.5 (Apple Git-154) _______________________________________________ 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".