1 2#------------------------------------------------------------------------------ 3# $File: vorbis,v 1.18 2014/04/30 21:41:02 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!:mime application/ogg 27>4 byte !0 UNKNOWN REVISION %u 28##>4 byte 0 revision 0 29>4 byte 0 30##>>14 lelong x (Serial %lX) 31# non-Vorbis content: FLAC (Free Lossless Audio Codec, http://flac.sourceforge.net) 32>>28 string \x7fFLAC \b, FLAC audio 33# non-Vorbis content: Theora 34>>28 string \x80theora \b, Theora video 35# non-Vorbis content: Kate 36>>28 string \x80kate\0\0\0\0 \b, Kate 37>>>37 ubyte x v%u 38>>>38 ubyte x \b.%u, 39>>>40 byte 0 utf8 encoding, 40>>>40 byte !0 unknown character encoding, 41>>>60 string >\0 language %s, 42>>>60 string \0 no language set, 43>>>76 string >\0 category %s 44>>>76 string \0 no category set 45# non-Vorbis content: Skeleton 46>>28 string fishead\0 \b, Skeleton 47>>>36 short x v%u 48>>>40 short x \b.%u 49# non-Vorbis content: Speex 50>>28 string Speex\ \ \ \b, Speex audio 51# non-Vorbis content: OGM 52>>28 string \x01video\0\0\0 \b, OGM video 53>>>37 string/c div3 (DivX 3) 54>>>37 string/c divx (DivX 4) 55>>>37 string/c dx50 (DivX 5) 56>>>37 string/c xvid (XviD) 57# --- First vorbis packet - general header --- 58>>28 string \x01vorbis \b, Vorbis audio, 59>>>35 lelong !0 UNKNOWN VERSION %u, 60##>>>35 lelong 0 version 0, 61>>>35 lelong 0 62>>>>39 ubyte 1 mono, 63>>>>39 ubyte 2 stereo, 64>>>>39 ubyte >2 %u channels, 65>>>>40 lelong x %u Hz 66# Minimal, nominal and maximal bitrates specified when encoding 67>>>>48 string <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff \b, 68# The above tests if at least one of these is specified: 69>>>>>52 lelong !-1 70# Vorbis RC2 has a bug which puts -1000 in the min/max bitrate fields 71# instead of -1. 72# Vorbis 1.0 uses 0 instead of -1. 73>>>>>>52 lelong !0 74>>>>>>>52 lelong !-1000 75>>>>>>>>52 lelong x <%u 76>>>>>48 lelong !-1 77>>>>>>48 lelong x ~%u 78>>>>>44 lelong !-1 79>>>>>>44 lelong !-1000 80>>>>>>>44 lelong !0 81>>>>>>>>44 lelong x >%u 82>>>>>48 string <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff bps 83# -- Second vorbis header packet - the comments 84# A kludge to read the vendor string. It's a counted string, not a 85# zero-terminated one, so file(1) can't read it in a generic way. 86# libVorbis is the only one existing currently, so I detect specifically 87# it. The interesting value is the cvs date (8 digits decimal). 88# Post-RC1 Ogg files have the second header packet (and thus the version) 89# in a different place, so we must use an indirect offset. 90>>>(84.b+85) string \x03vorbis 91>>>>(84.b+96) string/c Xiphophorus\ libVorbis\ I \b, created by: Xiphophorus libVorbis I 92>>>>>(84.b+120) string >00000000 93# Map to beta version numbers: 94>>>>>>(84.b+120) string <20000508 (<beta1, prepublic) 95>>>>>>(84.b+120) string 20000508 (1.0 beta 1 or beta 2) 96>>>>>>(84.b+120) string >20000508 97>>>>>>>(84.b+120) string <20001031 (beta2-3) 98>>>>>>(84.b+120) string 20001031 (1.0 beta 3) 99>>>>>>(84.b+120) string >20001031 100>>>>>>>(84.b+120) string <20010225 (beta3-4) 101>>>>>>(84.b+120) string 20010225 (1.0 beta 4) 102>>>>>>(84.b+120) string >20010225 103>>>>>>>(84.b+120) string <20010615 (beta4-RC1) 104>>>>>>(84.b+120) string 20010615 (1.0 RC1) 105>>>>>>(84.b+120) string 20010813 (1.0 RC2) 106>>>>>>(84.b+120) string 20010816 (RC2 - Garf tuned v1) 107>>>>>>(84.b+120) string 20011014 (RC2 - Garf tuned v2) 108>>>>>>(84.b+120) string 20011217 (1.0 RC3) 109>>>>>>(84.b+120) string 20011231 (1.0 RC3) 110# Some pre-1.0 CVS snapshots still had "Xiphphorus"... 111>>>>>>(84.b+120) string >20011231 (pre-1.0 CVS) 112# For the 1.0 release, Xiphophorus is replaced by Xiph.Org 113>>>>(84.b+96) string/c Xiph.Org\ libVorbis\ I \b, created by: Xiph.Org libVorbis I 114>>>>>(84.b+117) string >00000000 115>>>>>>(84.b+117) string <20020717 (pre-1.0 CVS) 116>>>>>>(84.b+117) string 20020717 (1.0) 117>>>>>>(84.b+117) string 20030909 (1.0.1) 118>>>>>>(84.b+117) string 20040629 (1.1.0 RC1) 119