xref: /openbsd/usr.bin/file/magdir/jpeg (revision 3d8817e4)
1#	$OpenBSD: jpeg,v 1.4 2009/04/24 18:54:34 chl Exp $
2
3#------------------------------------------------------------------------------
4# JPEG images
5# SunOS 5.5.1 had
6#
7#	0	string		\377\330\377\340	JPEG file
8#	0	string		\377\330\377\356	JPG file
9#
10# both of which turn into "JPEG image data" here.
11#
120	beshort		0xffd8		JPEG image data
13!:mime	image/jpeg
14>6	string		JFIF		\b, JFIF standard
15# The following added by Erik Rossen <rossen@freesurf.ch> 1999-09-06
16# in a vain attempt to add image size reporting for JFIF.  Note that these
17# tests are not fool-proof since some perfectly valid JPEGs are currently
18# impossible to specify in magic(4) format.
19# First, a little JFIF version info:
20>>11	byte		x		\b %d.
21>>12	byte		x		\b%02d
22# Next, the resolution or aspect ratio of the image:
23#>>13	byte		0		\b, aspect ratio
24#>>13	byte		1		\b, resolution (DPI)
25#>>13	byte		2		\b, resolution (DPCM)
26#>>4	beshort		x		\b, segment length %d
27# Next, show thumbnail info, if it exists:
28>>18	byte		!0		\b, thumbnail %dx
29>>>19	byte		x		\b%d
30
31# EXIF moved down here to avoid reporting a bogus version number,
32# and EXIF version number printing added.
33#   - Patrik R=E5dman <patrik+file-magic@iki.fi>
34>6	string		Exif		\b, EXIF standard
35# Look for EXIF IFD offset in IFD 0, and then look for EXIF version tag in EXIF IFD.
36# All possible combinations of entries have to be enumerated, since no looping
37# is possible. And both endians are possible...
38# The combinations included below are from real-world JPEGs.
39# Little-endian
40>>12	string		II
41# IFD 0 Entry #5:
42>>>70	leshort		0x8769
43# EXIF IFD Entry #1:
44>>>>(78.l+14)	leshort	0x9000
45>>>>>(78.l+23)	byte	x		%c
46>>>>>(78.l+24)	byte	x		\b.%c
47>>>>>(78.l+25)	byte	!0x30		\b%c
48# IFD 0 Entry #9:
49>>>118	leshort		0x8769
50# EXIF IFD Entry #3:
51>>>>(126.l+38)	leshort	0x9000
52>>>>>(126.l+47)	byte	x		%c
53>>>>>(126.l+48)	byte	x		\b.%c
54>>>>>(126.l+49)	byte	!0x30		\b%c
55# IFD 0 Entry #10
56>>>130	leshort		0x8769
57# EXIF IFD Entry #3:
58>>>>(138.l+38)	leshort	0x9000
59>>>>>(138.l+47)	byte	x		%c
60>>>>>(138.l+48)	byte	x		\b.%c
61>>>>>(138.l+49)	byte	!0x30		\b%c
62# EXIF IFD Entry #4:
63>>>>(138.l+50)	leshort	0x9000
64>>>>>(138.l+59)	byte	x		%c
65>>>>>(138.l+60)	byte	x		\b.%c
66>>>>>(138.l+61)	byte	!0x30		\b%c
67# EXIF IFD Entry #5:
68>>>>(138.l+62)	leshort	0x9000
69>>>>>(138.l+71)	byte	x		%c
70>>>>>(138.l+72)	byte	x		\b.%c
71>>>>>(138.l+73)	byte	!0x30		\b%c
72# IFD 0 Entry #11
73>>>142	leshort		0x8769
74# EXIF IFD Entry #3:
75>>>>(150.l+38)	leshort	0x9000
76>>>>>(150.l+47)	byte	x		%c
77>>>>>(150.l+48)	byte	x		\b.%c
78>>>>>(150.l+49)	byte	!0x30		\b%c
79# EXIF IFD Entry #4:
80>>>>(150.l+50)	leshort	0x9000
81>>>>>(150.l+59)	byte	x		%c
82>>>>>(150.l+60)	byte	x		\b.%c
83>>>>>(150.l+61)	byte	!0x30		\b%c
84# EXIF IFD Entry #5:
85>>>>(150.l+62)	leshort	0x9000
86>>>>>(150.l+71)	byte	x		%c
87>>>>>(150.l+72)	byte	x		\b.%c
88>>>>>(150.l+73)	byte	!0x30		\b%c
89# Big-endian
90>>12	string		MM
91# IFD 0 Entry #9:
92>>>118	beshort		0x8769
93# EXIF IFD Entry #1:
94>>>>(126.L+14)	beshort	0x9000
95>>>>>(126.L+23)	byte	x		%c
96>>>>>(126.L+24)	byte	x		\b.%c
97>>>>>(126.L+25)	byte	!0x30		\b%c
98# EXIF IFD Entry #3:
99>>>>(126.L+38)	beshort	0x9000
100>>>>>(126.L+47)	byte	x		%c
101>>>>>(126.L+48)	byte	x		\b.%c
102>>>>>(126.L+49)	byte	!0x30		\b%c
103# IFD 0 Entry #10
104>>>130	beshort		0x8769
105# EXIF IFD Entry #3:
106>>>>(138.L+38)	beshort	0x9000
107>>>>>(138.L+47)	byte	x		%c
108>>>>>(138.L+48)	byte	x		\b.%c
109>>>>>(138.L+49)	byte	!0x30		\b%c
110# EXIF IFD Entry #5:
111>>>>(138.L+62)	beshort	0x9000
112>>>>>(138.L+71)	byte	x		%c
113>>>>>(138.L+72)	byte	x		\b.%c
114>>>>>(138.L+73)	byte	!0x30		\b%c
115# IFD 0 Entry #11
116>>>142	beshort		0x8769
117# EXIF IFD Entry #4:
118>>>>(150.L+50)	beshort	0x9000
119>>>>>(150.L+59)	byte	x		%c
120>>>>>(150.L+60)	byte	x		\b.%c
121>>>>>(150.L+61)	byte	!0x30		\b%c
122# Here things get sticky.  We can do ONE MORE marker segment with
123# indirect addressing, and that's all.  It would be great if we could
124# do pointer arithemetic like in an assembler language.  Christos?
125# And if there was some sort of looping construct to do searches, plus a few
126# named accumulators, it would be even more effective...
127# At least we can show a comment if no other segments got inserted before:
128>(4.S+5)	byte		0xFE
129>>(4.S+8)	string		>\0		\b, comment: "%s"
130#>(4.S+5)	byte		0xFE		\b, comment
131#>>(4.S+6)	beshort		x		\b length=%d
132#>>(4.S+8)	string		>\0		\b, "%s"
133# Or, we can show the encoding type (I've included only the three most common)
134# and image dimensions if we are lucky and the SOFn (image segment) is here:
135>(4.S+5)	byte		0xC0		\b, baseline
136>>(4.S+6)	byte		x		\b, precision %d
137>>(4.S+7)	beshort		x		\b, %dx
138>>(4.S+9)	beshort		x		\b%d
139>(4.S+5)	byte		0xC1		\b, extended sequential
140>>(4.S+6)	byte		x		\b, precision %d
141>>(4.S+7)	beshort		x		\b, %dx
142>>(4.S+9)	beshort		x		\b%d
143>(4.S+5)	byte		0xC2		\b, progressive
144>>(4.S+6)	byte		x		\b, precision %d
145>>(4.S+7)	beshort		x		\b, %dx
146>>(4.S+9)	beshort		x		\b%d
147# I've commented-out quantisation table reporting.  I doubt anyone cares yet.
148#>(4.S+5)	byte		0xDB		\b, quantisation table
149#>>(4.S+6)	beshort		x		\b length=%d
150#>14	beshort		x		\b, %d x
151#>16	beshort		x		\b %d
152
153# HSI is Handmade Software's proprietary JPEG encoding scheme
1540	string		hsi1		JPEG image data, HSI proprietary
155
156# From: David Santinoli <david@santinoli.com>
1570	string		\x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A	JPEG 2000 image data
158
159# Type: JPEG 2000 codesream
160# From: Mathieu Malaterre <mathieu.malaterre@gmail.com>
1610	belong		0xff4fff51						JPEG 2000 codestream
16245	beshort		0xff52
163