1 module aurorafw.metadata.jpeg;
2 
3 enum JPEGVersion {
4 	JPEG_CANON_EOS,
5 	JPEG_SAMSUNG_D500,
6 	Unknown
7 }
8 
9 import std.stdio : File;
10 
11 @safe
12 JPEGVersion getJPEGVersion(File file)
13 {
14 	char[4] buf = file.rawRead(new char[4]);
15 	if(buf[3] == 0xE2) return JPEGVersion.JPEG_CANON_EOS;
16 	else if(buf[3] == 0xE3) return JPEGVersion.JPEG_SAMSUNG_D500;
17 
18 	return JPEGVersion.Unknown;
19 }
20 
21 @safe pure
22 string toString(JPEGVersion ver)
23 {
24 	final switch(ver)
25 	{
26 		case JPEGVersion.JPEG_CANON_EOS: return "CANON EOS JPEG Format";
27 		case JPEGVersion.JPEG_SAMSUNG_D500: return "Samsung D500 JPEG Format";
28 		case JPEGVersion.Unknown: return "Unknown";
29 	}
30 }
31 
32 
33 @safe
34 @("JPEG: Versioning")
35 unittest
36 {
37 	import std.file;
38 	version(unittest) import aurorafw.unit.assertion;
39 	import std.conv : to;
40 
41 	scope(exit)
42 	{
43 		assert(exists(deleteme));
44 		remove(deleteme);
45 	}
46 
47 	JPEGVersion version_;
48 	char[] buf = [0xFF, 0xD8, 0xFF];
49 
50 	write(deleteme, buf ~ 0xE2);
51 	version_ = getJPEGVersion(File(deleteme));
52 	assertEquals(JPEGVersion.JPEG_CANON_EOS, version_);
53 	assertEquals("CANON EOS JPEG Format", version_.toString);
54 
55 	write(deleteme, buf ~ 0xE3);
56 	version_ = getJPEGVersion(File(deleteme));
57 	assertEquals(JPEGVersion.JPEG_SAMSUNG_D500, version_);
58 	assertEquals("Samsung D500 JPEG Format", version_.toString);
59 
60 	write(deleteme, buf ~  0xFF);
61 	version_ = getJPEGVersion(File(deleteme));
62 	assertEquals(JPEGVersion.Unknown, version_);
63 	assertEquals("Unknown", version_.toString);
64 }