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 915C04C450 for ; Sat, 24 May 2025 18:14:57 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 4B10468DEF1; Sat, 24 May 2025 21:14:20 +0300 (EEST) Received: from mail-oa1-f42.google.com (mail-oa1-f42.google.com [209.85.160.42]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 04BAB68DE7E for ; Sat, 24 May 2025 21:14:15 +0300 (EEST) Received: by mail-oa1-f42.google.com with SMTP id 586e51a60fabf-2c2c754af3cso822870fac.3 for ; Sat, 24 May 2025 11:14:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748110454; x=1748715254; 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=hXvKQAPUtGuE9e+3xjS+6FtatKCl6Rcz1BilQfrrY/p1muWuurfW6IApqOhAkn2P0V GDp/Hke4v8+wdR0IubXg4udxPO2yBJD5dzqPMO/TprjUJuvSwhOc6NnJC8f+aMlQbbEm GDai08dS0l7Im5oSe0j8dFk59tnCFsYHyQ/ckZ9l57TcPFm58HbLHaNPlD0rLOrg/IN1 TQhFYDXBGMKN+gU3rIChiJMoi+hd39a72M2HJ4oepzjgUD687cnvXG7PoHuKwOn902k+ EcxgYweHkHnWdO4s/62L+Fnn00L8urPZGkCFBLfSMzG9QtGIJtm8TfehGEVjkP2wIhNh GmfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748110454; x=1748715254; 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=BKry4sGEFojs+axqo9jhOZ1aSUhniPRFfZrzsQ1UWMpoy5Houjtmq0vWLOOsOZ8PSk +MBzANkCo/hE3tEW3xlODN0pYE4SHLHFxaURbhk7F+XaQWaUZPP05jSPGnKnUjrhmPzk 4Mfrz5AiktXNwbW8Hdmq7WZ3qFP7+PZbx7ub9TlAsAvP0l/XDu3GZTsAcQjPc5teZ4uY +YzVpxvkKHqZcrPpIcd4fkUriYnc759BKvDSk8ZujwyhSkGQAYJHXfBqIcq7Vhs/cA4m E5pKOroq9nURoa0teGrCKgWWGyPZ7zy7s2PpiwUL9eY3DqWiAyNuTE6qYMY5lR0MUxqd Zpcw== X-Gm-Message-State: AOJu0YxZnPI5NTZYKbQHunomOhKNozZxdM9P0sZNO/mzHMMQMvSqvpSV SVjLwSr53AhHgVXRsd1pyNxrmlzINa1aIH1CWRY4Rq2A9Gxz7L2Ja5EP5dJkM79f X-Gm-Gg: ASbGncs71kBim44k4iH/1ztqjQtsGb2sluV/5xIerLhGiqbadwsa2gitNisSmpM6ThM HztPf/nPlrgPpY5VcAyAV+N1Y9b6nwB9mLeDPx5OWN1d4Zau8EpvHLHR4lOcqtTQSVYjZA3OTZa 0704+vXaDJCwmzRCbWntUlYhD3tmeAP0WLY76HqIjcFuiPHirtzg2YshAHjf76DKUnL4sdZiCCh AvNtNI3S6ieKjcCzTcZUQ+YBNfmpuLA6CL96Sj+N16PXo/1vmZKXtjuxSIaezYG9asD25Nut7Vx KC7CNayiR904CLPMN80A1Soj8/R2lPXuVG5GOmS1wt1NFWBuynGhvDU6xj+QL4ylGWXghvPCUEo sPChd9qd3z50I/njhDzs= X-Google-Smtp-Source: AGHT+IE4fu4gx13DhvaUBMhXldY89XNGmsMTqgAmN+B77IdSm6nan6X7ttPNtmfW0S+z0gh90cFacQ== X-Received: by 2002:a05:6871:8002:b0:29e:3c90:148b with SMTP id 586e51a60fabf-2e862193a7cmr1946279fac.26.1748110454192; Sat, 24 May 2025 11:14:14 -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 586e51a60fabf-2e3c075d6a6sm4129844fac.28.2025.05.24.11.14.13 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 24 May 2025 11:14:13 -0700 (PDT) From: Romain Beauxis To: ffmpeg-devel@ffmpeg.org Date: Sat, 24 May 2025 13:14:06 -0500 Message-Id: <20250524181408.49384-4-romain.beauxis@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20250524181408.49384-1-romain.beauxis@gmail.com> References: <20250524181408.49384-1-romain.beauxis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v8 3/5] 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".