From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id DFFDE4BB8E for ; Wed, 21 May 2025 22:06:16 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 91A0C68DD62; Thu, 22 May 2025 01:05:54 +0300 (EEST) Received: from mail-ot1-f50.google.com (mail-ot1-f50.google.com [209.85.210.50]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 3E37968DD49 for ; Thu, 22 May 2025 01:05:46 +0300 (EEST) Received: by mail-ot1-f50.google.com with SMTP id 46e09a7af769-72c16e658f4so4876132a34.1 for ; Wed, 21 May 2025 15:05:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747865144; x=1748469944; 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=jTjIA5f9kGqwqHTVJgVMx2SK47jDAZFPazhP8MufQMM=; b=mRIsJZVBFoeTS8aeGEszQ8x7j/NB7aeFyI9Gsk8izGt/BpuGDgH+h6xk6c7ES7fotf VEdYHQVy+79Vy7g3Sb626P4CKmTrrKokqfCfdROtVftxhEsZ9+xErtrkWmT6UGnMFcWq NhoogYotJt6j0C88G+K05dFy6NhMliKfH2nKCu+Go+qX47VpIoWgbT2mNQikR6OdsoDP xavw4E7TxzPMCAWe35yFiQqd9cDZL501wrhegRnbGYzr4F3KzJ/6hozpVMAkhJ+1V+3j J/vUBUBYquM8+ltbhDlO3GRa6Jokx9S/deu7p0TwrargzibJaMbGMf9Q50j0N7QTzPxW ZVrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747865144; x=1748469944; 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=jTjIA5f9kGqwqHTVJgVMx2SK47jDAZFPazhP8MufQMM=; b=klIOIqMUkS9k2hyeeLlNGvadLXoWrDjmPnVBWYEHpiPmEto4EGf53/Tfbi+kk9Pdgj zTimmBqjiX7Im6B5Zj8etcu4wbBXWQ6TWLu8DGqpG9uJVkQz7SC9IYCD6swLG9UjKPBq Rkx1RNQEYf/6yzwQZifP5Esvjddh04+mrCH1SpIIOPv3naXNt5C201YKiFDbAK1J4Mzj hDwqDWlO7KzOFjGS6hs57/o4KbubRz8Ez94FsfOL65qFjTNCocXo9RABUO9J78WuzLAr 9iFHZU6dTrygbUt2+DQTdlfwikEy/ThyzxOddg+9oLYCLlnOJTe2H3Zs1QNPDjZw+gSY C0/g== X-Gm-Message-State: AOJu0Yx/2Kd1JiZz9/A604S5izl0VuOpePpcmEhzNTSo8b0vkzTIuhWA vIEUBMri0VuM7uCMrZVZpGKGum8nFKICyWZ56ASQcesUJC1DblIGZcaZM3lNz/zv X-Gm-Gg: ASbGncvhZHCXzYlbFbk/qQxYuVYtPcIUBk1lrgU9PaHsDu/nV0kvkn6NTr3rPmyj8gg lZVelQKxYGEuml6k0n8nsenzG2rZq1Z08Lw8ZDpwA+TJOjyEQPHjsEkYIFLg9t61xA634fH932/ ZIwIQoBASKGOH7BgS2S5969Etz9/lAPlCBUuhzzySh42g8v9Vl0dOnpbsu7aYL7HV82AzrZVu1M 9I3vzGnG4AAbAfiXyQUbTnjejpD0IsHw7kmh+6IIsVjKDhYarDxs5IX//L0UEvHqXO99D3o+yxQ I/ysLIto0zUi7YN/4D/lMw2Q1LBe4VfaAFyvT1TUQKWequZ8Q8bsM1o66dWuuikIZ1Po17qgV3L Griv3n8+bXhiRdJf12UY= X-Google-Smtp-Source: AGHT+IG/sLjb9bS6DWDl8H+8ggkDfpST5I5c1JgIt+AGzAD6O8KyjcElwb8zwncO3ryvoDbGDdMpKg== X-Received: by 2002:a05:6830:3902:b0:72b:9180:cc75 with SMTP id 46e09a7af769-734f6ae22bdmr13403056a34.7.1747865144485; Wed, 21 May 2025 15:05:44 -0700 (PDT) Received: from mac.lan (ip72-211-125-114.no.no.cox.net. [72.211.125.114]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-734f6b6066fsm2282245a34.68.2025.05.21.15.05.43 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 21 May 2025 15:05:43 -0700 (PDT) From: Romain Beauxis To: ffmpeg-devel@ffmpeg.org Date: Wed, 21 May 2025 17:05:36 -0500 Message-Id: <20250521220538.16624-3-romain.beauxis@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20250521220538.16624-1-romain.beauxis@gmail.com> References: <20250521220538.16624-1-romain.beauxis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v7 2/4] ogg/vorbis: factor out header processing logic. 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: --- libavformat/oggparsevorbis.c | 104 ++++++++++++++++++++--------------- 1 file changed, 60 insertions(+), 44 deletions(-) diff --git a/libavformat/oggparsevorbis.c b/libavformat/oggparsevorbis.c index 9f50ab9ffc..62cc2da6de 100644 --- a/libavformat/oggparsevorbis.c +++ b/libavformat/oggparsevorbis.c @@ -293,6 +293,62 @@ static int vorbis_update_metadata(AVFormatContext *s, int idx) return ret; } +static int vorbis_parse_header(AVFormatContext *s, AVStream *st, + const uint8_t *p, unsigned int psize) +{ + unsigned blocksize, bs0, bs1; + int srate; + int channels; + + if (psize != 30) + return AVERROR_INVALIDDATA; + + p += 7; /* skip "\001vorbis" tag */ + + if (bytestream_get_le32(&p) != 0) /* vorbis_version */ + return AVERROR_INVALIDDATA; + + channels = bytestream_get_byte(&p); + if (st->codecpar->ch_layout.nb_channels && + channels != st->codecpar->ch_layout.nb_channels) { + av_log(s, AV_LOG_ERROR, "Channel change is not supported\n"); + return AVERROR_PATCHWELCOME; + } + st->codecpar->ch_layout.nb_channels = channels; + srate = bytestream_get_le32(&p); + p += 4; // skip maximum bitrate + st->codecpar->bit_rate = bytestream_get_le32(&p); // nominal bitrate + p += 4; // skip minimum bitrate + + blocksize = bytestream_get_byte(&p); + bs0 = blocksize & 15; + bs1 = blocksize >> 4; + + if (bs0 > bs1) + return AVERROR_INVALIDDATA; + if (bs0 < 6 || bs1 > 13) + return AVERROR_INVALIDDATA; + + if (bytestream_get_byte(&p) != 1) /* framing_flag */ + return AVERROR_INVALIDDATA; + + st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; + st->codecpar->codec_id = AV_CODEC_ID_VORBIS; + + if (srate > 0) { + if (st->codecpar->sample_rate && + srate != st->codecpar->sample_rate) { + av_log(s, AV_LOG_ERROR, "Sample rate change is not supported\n"); + return AVERROR_PATCHWELCOME; + } + + st->codecpar->sample_rate = srate; + avpriv_set_pts_info(st, 64, 1, srate); + } + + return 1; +} + static int vorbis_header(AVFormatContext *s, int idx) { struct ogg *ogg = s->priv_data; @@ -329,50 +385,10 @@ static int vorbis_header(AVFormatContext *s, int idx) priv->packet[pkt_type >> 1] = av_memdup(os->buf + os->pstart, os->psize); if (!priv->packet[pkt_type >> 1]) return AVERROR(ENOMEM); - if (os->buf[os->pstart] == 1) { - const uint8_t *p = os->buf + os->pstart + 7; /* skip "\001vorbis" tag */ - unsigned blocksize, bs0, bs1; - int srate; - int channels; - - if (os->psize != 30) - return AVERROR_INVALIDDATA; - - if (bytestream_get_le32(&p) != 0) /* vorbis_version */ - return AVERROR_INVALIDDATA; - - channels = bytestream_get_byte(&p); - if (st->codecpar->ch_layout.nb_channels && - channels != st->codecpar->ch_layout.nb_channels) { - av_log(s, AV_LOG_ERROR, "Channel change is not supported\n"); - return AVERROR_PATCHWELCOME; - } - st->codecpar->ch_layout.nb_channels = channels; - srate = bytestream_get_le32(&p); - p += 4; // skip maximum bitrate - st->codecpar->bit_rate = bytestream_get_le32(&p); // nominal bitrate - p += 4; // skip minimum bitrate - - blocksize = bytestream_get_byte(&p); - bs0 = blocksize & 15; - bs1 = blocksize >> 4; - - if (bs0 > bs1) - return AVERROR_INVALIDDATA; - if (bs0 < 6 || bs1 > 13) - return AVERROR_INVALIDDATA; - - if (bytestream_get_byte(&p) != 1) /* framing_flag */ - return AVERROR_INVALIDDATA; - - st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; - st->codecpar->codec_id = AV_CODEC_ID_VORBIS; - - if (srate > 0) { - st->codecpar->sample_rate = srate; - avpriv_set_pts_info(st, 64, 1, srate); - } - } else if (os->buf[os->pstart] == 3) { + if (pkt_type == 1) + return vorbis_parse_header(s, st, os->buf + os->pstart, os->psize); + + if (pkt_type == 3) { if (vorbis_update_metadata(s, idx) >= 0 && priv->len[1] > 10) { unsigned new_len; -- 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".