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