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 }