1 2#------------------------------------------------------------------------------ 3# $File: vorbis,v 1.23 2017/03/17 21:35:28 christos Exp $ 4# vorbis: file(1) magic for Ogg/Vorbis files 5# 6# From Felix von Leitner <leitner@fefe.de> 7# Extended by Beni Cherniavsky <cben@crosswinds.net> 8# Further extended by Greg Wooledge <greg@wooledge.org> 9# 10# Most (everything but the number of channels and bitrate) is commented 11# out with `##' as it's not interesting to the average user. The most 12# probable things advanced users would want to uncomment are probably 13# the number of comments and the encoder version. 14# 15# FIXME: The first match has been made a search, so that it can skip 16# over prepended ID3 tags. This will work for MIME type detection, but 17# won't work for detecting other properties of the file (they all need 18# to be made relative to the search). In any case, if the file has ID3 19# tags, the ID3 information will be printed, not the Ogg information, 20# so until that's fixed, this doesn't matter. 21# FIXME[2]: Disable the above for now, since search assumes text mode. 22# 23# --- Ogg Framing --- 24#0 search/1000 OggS Ogg data 250 string OggS Ogg data 26>4 byte !0 UNKNOWN REVISION %u 27##>4 byte 0 revision 0 28>4 byte 0 29##>>14 lelong x (Serial %lX) 30# non-Vorbis content: FLAC (Free Lossless Audio Codec, http://flac.sourceforge.net) 31>>28 string \x7fFLAC \b, FLAC audio 32# non-Vorbis content: Theora 33!:mime audio/ogg 34>>28 string \x80theora \b, Theora video 35!:mime video/ogg 36# non-Vorbis content: Kate 37>>28 string \x80kate\0\0\0\0 \b, Kate (Karaoke and Text) 38!:mime application/ogg 39>>>37 ubyte x v%u 40>>>38 ubyte x \b.%u, 41>>>40 byte 0 utf8 encoding, 42>>>40 byte !0 unknown character encoding, 43>>>60 string >\0 language %s, 44>>>60 string \0 no language set, 45>>>76 string >\0 category %s 46>>>76 string \0 no category set 47# non-Vorbis content: Skeleton 48>>28 string fishead\0 \b, Skeleton 49!:mime video/ogg 50>>>36 leshort x v%u 51>>>40 leshort x \b.%u 52# non-Vorbis content: Speex 53>>28 string Speex\ \ \ \b, Speex audio 54!:mime audio/ogg 55# non-Vorbis content: OGM 56>>28 string \x01video\0\0\0 \b, OGM video 57!:mime video/ogg 58>>>37 string/c div3 (DivX 3) 59>>>37 string/c divx (DivX 4) 60>>>37 string/c dx50 (DivX 5) 61>>>37 string/c xvid (XviD) 62# --- First vorbis packet - general header --- 63>>28 string \x01vorbis \b, Vorbis audio, 64!:mime audio/ogg 65>>>35 lelong !0 UNKNOWN VERSION %u, 66##>>>35 lelong 0 version 0, 67>>>35 lelong 0 68>>>>39 ubyte 1 mono, 69>>>>39 ubyte 2 stereo, 70>>>>39 ubyte >2 %u channels, 71>>>>40 lelong x %u Hz 72# Minimal, nominal and maximal bitrates specified when encoding 73>>>>48 string <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff \b, 74# The above tests if at least one of these is specified: 75>>>>>52 lelong !-1 76# Vorbis RC2 has a bug which puts -1000 in the min/max bitrate fields 77# instead of -1. 78# Vorbis 1.0 uses 0 instead of -1. 79>>>>>>52 lelong !0 80>>>>>>>52 lelong !-1000 81>>>>>>>>52 lelong x <%u 82>>>>>48 lelong !-1 83>>>>>>48 lelong x ~%u 84>>>>>44 lelong !-1 85>>>>>>44 lelong !-1000 86>>>>>>>44 lelong !0 87>>>>>>>>44 lelong x >%u 88>>>>>48 string <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff bps 89# -- Second vorbis header packet - the comments 90# A kludge to read the vendor string. It's a counted string, not a 91# zero-terminated one, so file(1) can't read it in a generic way. 92# libVorbis is the only one existing currently, so I detect specifically 93# it. The interesting value is the cvs date (8 digits decimal). 94# Post-RC1 Ogg files have the second header packet (and thus the version) 95# in a different place, so we must use an indirect offset. 96>>>(84.b+85) string \x03vorbis 97>>>>(84.b+96) string/c Xiphophorus\ libVorbis\ I \b, created by: Xiphophorus libVorbis I 98>>>>>(84.b+120) string >00000000 99# Map to beta version numbers: 100>>>>>>(84.b+120) string <20000508 (<beta1, prepublic) 101>>>>>>(84.b+120) string 20000508 (1.0 beta 1 or beta 2) 102>>>>>>(84.b+120) string >20000508 103>>>>>>>(84.b+120) string <20001031 (beta2-3) 104>>>>>>(84.b+120) string 20001031 (1.0 beta 3) 105>>>>>>(84.b+120) string >20001031 106>>>>>>>(84.b+120) string <20010225 (beta3-4) 107>>>>>>(84.b+120) string 20010225 (1.0 beta 4) 108>>>>>>(84.b+120) string >20010225 109>>>>>>>(84.b+120) string <20010615 (beta4-RC1) 110>>>>>>(84.b+120) string 20010615 (1.0 RC1) 111>>>>>>(84.b+120) string 20010813 (1.0 RC2) 112>>>>>>(84.b+120) string 20010816 (RC2 - Garf tuned v1) 113>>>>>>(84.b+120) string 20011014 (RC2 - Garf tuned v2) 114>>>>>>(84.b+120) string 20011217 (1.0 RC3) 115>>>>>>(84.b+120) string 20011231 (1.0 RC3) 116# Some pre-1.0 CVS snapshots still had "Xiphphorus"... 117>>>>>>(84.b+120) string >20011231 (pre-1.0 CVS) 118# For the 1.0 release, Xiphophorus is replaced by Xiph.Org 119>>>>(84.b+96) string/c Xiph.Org\ libVorbis\ I \b, created by: Xiph.Org libVorbis I 120>>>>>(84.b+117) string >00000000 121>>>>>>(84.b+117) string <20020717 (pre-1.0 CVS) 122>>>>>>(84.b+117) string 20020717 (1.0) 123>>>>>>(84.b+117) string 20030909 (1.0.1) 124>>>>>>(84.b+117) string 20040629 (1.1.0 RC1) 125 126# non-Vorbis content: Opus https://tools.ietf.org/html/draft-ietf-codec-oggopus-06#section-5 127>>28 string OpusHead \b, Opus audio, 128!:mime audio/ogg 129>>>36 ubyte >0x0F UNKNOWN VERSION %u, 130>>>36 ubyte &0x0F version 0.%d 131>>>>46 ubyte >1 132>>>>>46 ubyte !255 unknown channel mapping family %u, 133>>>>>37 ubyte x %u channels 134>>>>46 ubyte 0 135>>>>>37 ubyte 1 mono 136>>>>>37 ubyte 2 stereo 137>>>>46 ubyte 1 138>>>>>37 ubyte 1 mono 139>>>>>37 ubyte 2 stereo 140>>>>>37 ubyte 3 linear surround 141>>>>>37 ubyte 4 quadraphonic 142>>>>>37 ubyte 5 5.0 surround 143>>>>>37 ubyte 6 5.1 surround 144>>>>>37 ubyte 7 6.1 surround 145>>>>>37 ubyte 8 7.1 surround 146>>>>40 lelong !0 \b, %u Hz 147