Kodak.pm 66 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096
  1. #------------------------------------------------------------------------------
  2. # File: Kodak.pm
  3. #
  4. # Description: Kodak EXIF maker notes and APP3 "Meta" tags
  5. #
  6. # Revisions: 03/28/2005 - P. Harvey Created
  7. #
  8. # References: 1) http://search.cpan.org/dist/Image-MetaData-JPEG/
  9. # 2) http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html
  10. # 3) http://www.cybercom.net/~dcoffin/dcraw/
  11. # 4) Iliah Borg private communication (LibRaw)
  12. #
  13. # Notes: There really isn't much public information about Kodak formats.
  14. # The only source I could find was Image::MetaData::JPEG, which
  15. # didn't provide information about decoding the tag values. So
  16. # this module represents a lot of work downloading sample images
  17. # (about 100MB worth!), and testing with my daughter's CX4200.
  18. #------------------------------------------------------------------------------
  19. package Image::ExifTool::Kodak;
  20. use strict;
  21. use vars qw($VERSION);
  22. use Image::ExifTool qw(:DataAccess :Utils);
  23. use Image::ExifTool::Exif;
  24. $VERSION = '1.41';
  25. sub ProcessKodakIFD($$$);
  26. sub ProcessKodakText($$$);
  27. sub WriteKodakIFD($$$);
  28. # Kodak type 1 maker notes (ref 1)
  29. %Image::ExifTool::Kodak::Main = (
  30. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  31. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  32. WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
  33. CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
  34. NOTES => q{
  35. The table below contains the most common set of Kodak tags. The following
  36. Kodak camera models have been tested and found to use these tags: C360,
  37. C663, C875, CX6330, CX6445, CX7330, CX7430, CX7525, CX7530, DC4800, DC4900,
  38. DX3500, DX3600, DX3900, DX4330, DX4530, DX4900, DX6340, DX6440, DX6490,
  39. DX7440, DX7590, DX7630, EasyShare-One, LS420, LS443, LS633, LS743, LS753,
  40. V530, V550, V570, V603, V610, V705, Z650, Z700, Z710, Z730, Z740, Z760 and
  41. Z7590.
  42. },
  43. WRITABLE => 1,
  44. FIRST_ENTRY => 8,
  45. 0x00 => {
  46. Name => 'KodakModel',
  47. Format => 'string[8]',
  48. },
  49. 0x09 => {
  50. Name => 'Quality',
  51. PrintConv => { #PH
  52. 1 => 'Fine',
  53. 2 => 'Normal',
  54. },
  55. },
  56. 0x0a => {
  57. Name => 'BurstMode',
  58. PrintConv => { 0 => 'Off', 1 => 'On' },
  59. },
  60. 0x0c => {
  61. Name => 'KodakImageWidth',
  62. Format => 'int16u',
  63. },
  64. 0x0e => {
  65. Name => 'KodakImageHeight',
  66. Format => 'int16u',
  67. },
  68. 0x10 => {
  69. Name => 'YearCreated',
  70. Groups => { 2 => 'Time' },
  71. Format => 'int16u',
  72. },
  73. 0x12 => {
  74. Name => 'MonthDayCreated',
  75. Groups => { 2 => 'Time' },
  76. Format => 'int8u[2]',
  77. ValueConv => 'sprintf("%.2d:%.2d",split(" ", $val))',
  78. ValueConvInv => '$val=~tr/:./ /;$val',
  79. },
  80. 0x14 => {
  81. Name => 'TimeCreated',
  82. Groups => { 2 => 'Time' },
  83. Format => 'int8u[4]',
  84. Shift => 'Time',
  85. ValueConv => 'sprintf("%.2d:%.2d:%.2d.%.2d",split(" ", $val))',
  86. ValueConvInv => '$val=~tr/:./ /;$val',
  87. },
  88. 0x18 => {
  89. Name => 'BurstMode2',
  90. Format => 'int16u',
  91. Unknown => 1, # not sure about this tag (or other 'Unknown' tags)
  92. },
  93. 0x1b => {
  94. Name => 'ShutterMode',
  95. PrintConv => { #PH
  96. 0 => 'Auto',
  97. 8 => 'Aperture Priority',
  98. 32 => 'Manual?',
  99. },
  100. },
  101. 0x1c => {
  102. Name => 'MeteringMode',
  103. PrintConv => { #PH
  104. 0 => 'Multi-segment',
  105. 1 => 'Center-weighted average',
  106. 2 => 'Spot',
  107. },
  108. },
  109. 0x1d => 'SequenceNumber',
  110. 0x1e => {
  111. Name => 'FNumber',
  112. Format => 'int16u',
  113. ValueConv => '$val / 100',
  114. ValueConvInv => 'int($val * 100 + 0.5)',
  115. },
  116. 0x20 => {
  117. Name => 'ExposureTime',
  118. Format => 'int32u',
  119. ValueConv => '$val / 1e5',
  120. ValueConvInv => '$val * 1e5',
  121. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  122. PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
  123. },
  124. 0x24 => {
  125. Name => 'ExposureCompensation',
  126. Format => 'int16s',
  127. ValueConv => '$val / 1000',
  128. ValueConvInv => '$val * 1000',
  129. PrintConv => '$val > 0 ? "+$val" : $val',
  130. PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
  131. },
  132. 0x26 => {
  133. Name => 'VariousModes',
  134. Format => 'int16u',
  135. Unknown => 1,
  136. },
  137. 0x28 => {
  138. Name => 'Distance1',
  139. Format => 'int32u',
  140. Unknown => 1,
  141. },
  142. 0x2c => {
  143. Name => 'Distance2',
  144. Format => 'int32u',
  145. Unknown => 1,
  146. },
  147. 0x30 => {
  148. Name => 'Distance3',
  149. Format => 'int32u',
  150. Unknown => 1,
  151. },
  152. 0x34 => {
  153. Name => 'Distance4',
  154. Format => 'int32u',
  155. Unknown => 1,
  156. },
  157. 0x38 => {
  158. Name => 'FocusMode',
  159. PrintConv => {
  160. 0 => 'Normal',
  161. 2 => 'Macro',
  162. },
  163. },
  164. 0x3a => {
  165. Name => 'VariousModes2',
  166. Format => 'int16u',
  167. Unknown => 1,
  168. },
  169. 0x3c => {
  170. Name => 'PanoramaMode',
  171. Format => 'int16u',
  172. Unknown => 1,
  173. },
  174. 0x3e => {
  175. Name => 'SubjectDistance',
  176. Format => 'int16u',
  177. Unknown => 1,
  178. },
  179. 0x40 => {
  180. Name => 'WhiteBalance',
  181. Priority => 0,
  182. PrintConv => { #PH
  183. 0 => 'Auto',
  184. 1 => 'Flash?',
  185. 2 => 'Tungsten',
  186. 3 => 'Daylight',
  187. },
  188. },
  189. 0x5c => {
  190. Name => 'FlashMode',
  191. Flags => 'PrintHex',
  192. # various models express this number differently
  193. PrintConv => { #PH
  194. 0x00 => 'Auto',
  195. 0x01 => 'Fill Flash',
  196. 0x02 => 'Off',
  197. 0x03 => 'Red-Eye',
  198. 0x10 => 'Fill Flash',
  199. 0x20 => 'Off',
  200. 0x40 => 'Red-Eye?',
  201. },
  202. },
  203. 0x5d => {
  204. Name => 'FlashFired',
  205. PrintConv => { 0 => 'No', 1 => 'Yes' },
  206. },
  207. 0x5e => {
  208. Name => 'ISOSetting',
  209. Format => 'int16u',
  210. PrintConv => '$val ? $val : "Auto"',
  211. PrintConvInv => '$val=~/^\d+$/ ? $val : 0',
  212. },
  213. 0x60 => {
  214. Name => 'ISO',
  215. Format => 'int16u',
  216. },
  217. 0x62 => {
  218. Name => 'TotalZoom',
  219. Format => 'int16u',
  220. ValueConv => '$val / 100',
  221. ValueConvInv => '$val * 100',
  222. },
  223. 0x64 => {
  224. Name => 'DateTimeStamp',
  225. Format => 'int16u',
  226. PrintConv => '$val ? "Mode $val" : "Off"',
  227. PrintConvInv => '$val=~tr/0-9//dc; $val ? $val : 0',
  228. },
  229. 0x66 => {
  230. Name => 'ColorMode',
  231. Format => 'int16u',
  232. Flags => 'PrintHex',
  233. # various models express this number differently
  234. PrintConv => { #PH
  235. 0x01 => 'B&W',
  236. 0x02 => 'Sepia',
  237. 0x03 => 'B&W Yellow Filter',
  238. 0x04 => 'B&W Red Filter',
  239. 0x20 => 'Saturated Color',
  240. 0x40 => 'Neutral Color',
  241. 0x100 => 'Saturated Color',
  242. 0x200 => 'Neutral Color',
  243. 0x2000 => 'B&W',
  244. 0x4000 => 'Sepia',
  245. },
  246. },
  247. 0x68 => {
  248. Name => 'DigitalZoom',
  249. Format => 'int16u',
  250. ValueConv => '$val / 100',
  251. ValueConvInv => '$val * 100',
  252. },
  253. 0x6b => {
  254. Name => 'Sharpness',
  255. Format => 'int8s',
  256. %Image::ExifTool::Exif::printParameter,
  257. },
  258. );
  259. # Kodak type 2 maker notes (ref PH)
  260. %Image::ExifTool::Kodak::Type2 = (
  261. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  262. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  263. WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
  264. CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
  265. NOTES => q{
  266. These tags are used by the Kodak DC220, DC260, DC265 and DC290,
  267. Hewlett-Packard PhotoSmart 618, C500 and C912, Pentax EI-200 and EI-2000,
  268. and Minolta EX1500Z.
  269. },
  270. WRITABLE => 1,
  271. FIRST_ENTRY => 0,
  272. 0x08 => {
  273. Name => 'KodakMaker',
  274. Format => 'string[32]',
  275. },
  276. 0x28 => {
  277. Name => 'KodakModel',
  278. Format => 'string[32]',
  279. },
  280. 0x6c => {
  281. Name => 'KodakImageWidth',
  282. Format => 'int32u',
  283. },
  284. 0x70 => {
  285. Name => 'KodakImageHeight',
  286. Format => 'int32u',
  287. },
  288. );
  289. # Kodak type 3 maker notes (ref PH)
  290. %Image::ExifTool::Kodak::Type3 = (
  291. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  292. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  293. WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
  294. CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
  295. NOTES => 'These tags are used by the DC240, DC280, DC3400 and DC5000.',
  296. WRITABLE => 1,
  297. FIRST_ENTRY => 0,
  298. 0x0c => {
  299. Name => 'YearCreated',
  300. Groups => { 2 => 'Time' },
  301. Format => 'int16u',
  302. },
  303. 0x0e => {
  304. Name => 'MonthDayCreated',
  305. Groups => { 2 => 'Time' },
  306. Format => 'int8u[2]',
  307. ValueConv => 'sprintf("%.2d:%.2d",split(" ", $val))',
  308. ValueConvInv => '$val=~tr/:./ /;$val',
  309. },
  310. 0x10 => {
  311. Name => 'TimeCreated',
  312. Groups => { 2 => 'Time' },
  313. Format => 'int8u[4]',
  314. Shift => 'Time',
  315. ValueConv => 'sprintf("%2d:%.2d:%.2d.%.2d",split(" ", $val))',
  316. ValueConvInv => '$val=~tr/:./ /;$val',
  317. },
  318. 0x1e => {
  319. Name => 'OpticalZoom',
  320. Format => 'int16u',
  321. ValueConv => '$val / 100',
  322. ValueConvInv => '$val * 100',
  323. },
  324. 0x37 => {
  325. Name => 'Sharpness',
  326. Format => 'int8s',
  327. %Image::ExifTool::Exif::printParameter,
  328. },
  329. 0x38 => {
  330. Name => 'ExposureTime',
  331. Format => 'int32u',
  332. ValueConv => '$val / 1e5',
  333. ValueConvInv => '$val * 1e5',
  334. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  335. PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
  336. },
  337. 0x3c => {
  338. Name => 'FNumber',
  339. Format => 'int16u',
  340. ValueConv => '$val / 100',
  341. ValueConvInv => 'int($val * 100 + 0.5)',
  342. },
  343. 0x4e => {
  344. Name => 'ISO',
  345. Format => 'int16u',
  346. },
  347. );
  348. # Kodak type 4 maker notes (ref PH)
  349. %Image::ExifTool::Kodak::Type4 = (
  350. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  351. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  352. WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
  353. CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
  354. NOTES => 'These tags are used by the DC200 and DC215.',
  355. WRITABLE => 1,
  356. FIRST_ENTRY => 0,
  357. 0x20 => {
  358. Name => 'OriginalFileName',
  359. Format => 'string[12]',
  360. },
  361. );
  362. # Kodak type 5 maker notes (ref PH)
  363. %Image::ExifTool::Kodak::Type5 = (
  364. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  365. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  366. NOTES => q{
  367. These tags are used by the CX4200, CX4210, CX4230, CX4300, CX4310, CX6200
  368. and CX6230.
  369. },
  370. WRITABLE => 1,
  371. FIRST_ENTRY => 0,
  372. 0x14 => {
  373. Name => 'ExposureTime',
  374. Format => 'int32u',
  375. ValueConv => '$val / 1e5',
  376. ValueConvInv => '$val * 1e5',
  377. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  378. PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
  379. },
  380. 0x1a => {
  381. Name => 'WhiteBalance',
  382. PrintConv => {
  383. 1 => 'Daylight',
  384. 2 => 'Flash',
  385. 3 => 'Tungsten',
  386. },
  387. },
  388. 0x1c => {
  389. Name => 'FNumber',
  390. Format => 'int16u',
  391. ValueConv => '$val / 100',
  392. ValueConvInv => 'int($val * 100 + 0.5)',
  393. },
  394. 0x1e => {
  395. Name => 'ISO',
  396. Format => 'int16u',
  397. },
  398. 0x20 => {
  399. Name => 'OpticalZoom',
  400. Format => 'int16u',
  401. ValueConv => '$val / 100',
  402. ValueConvInv => '$val * 100',
  403. },
  404. 0x22 => {
  405. Name => 'DigitalZoom',
  406. Format => 'int16u',
  407. ValueConv => '$val / 100',
  408. ValueConvInv => '$val * 100',
  409. },
  410. 0x27 => {
  411. Name => 'FlashMode',
  412. PrintConv => {
  413. 0 => 'Auto',
  414. 1 => 'On',
  415. 2 => 'Off',
  416. 3 => 'Red-Eye',
  417. },
  418. },
  419. 0x2a => {
  420. Name => 'ImageRotated',
  421. PrintConv => { 0 => 'No', 1 => 'Yes' },
  422. },
  423. 0x2b => {
  424. Name => 'Macro',
  425. PrintConv => { 0 => 'On', 1 => 'Off' },
  426. },
  427. );
  428. # Kodak type 6 maker notes (ref PH)
  429. %Image::ExifTool::Kodak::Type6 = (
  430. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  431. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  432. NOTES => 'These tags are used by the DX3215 and DX3700.',
  433. WRITABLE => 1,
  434. FIRST_ENTRY => 0,
  435. 0x10 => {
  436. Name => 'ExposureTime',
  437. Format => 'int32u',
  438. ValueConv => '$val / 1e5',
  439. ValueConvInv => '$val * 1e5',
  440. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  441. PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
  442. },
  443. 0x14 => {
  444. Name => 'ISOSetting',
  445. Format => 'int32u',
  446. Unknown => 1,
  447. },
  448. 0x18 => {
  449. Name => 'FNumber',
  450. Format => 'int16u',
  451. ValueConv => '$val / 100',
  452. ValueConvInv => 'int($val * 100 + 0.5)',
  453. },
  454. 0x1a => {
  455. Name => 'ISO',
  456. Format => 'int16u',
  457. },
  458. 0x1c => {
  459. Name => 'OpticalZoom',
  460. Format => 'int16u',
  461. ValueConv => '$val / 100',
  462. ValueConvInv => '$val * 100',
  463. },
  464. 0x1e => {
  465. Name => 'DigitalZoom',
  466. Format => 'int16u',
  467. ValueConv => '$val / 100',
  468. ValueConvInv => '$val * 100',
  469. },
  470. 0x22 => {
  471. Name => 'Flash',
  472. Format => 'int16u',
  473. PrintConv => {
  474. 0 => 'No Flash',
  475. 1 => 'Fired',
  476. },
  477. },
  478. );
  479. # Kodak type 7 maker notes (ref PH)
  480. %Image::ExifTool::Kodak::Type7 = (
  481. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  482. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  483. WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
  484. CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
  485. WRITABLE => 1,
  486. FIRST_ENTRY => 0,
  487. NOTES => q{
  488. The maker notes of models such as the C340, C433, CC533, LS755, V803 and
  489. V1003 seem to start with the camera serial number. The C310, C315, C330,
  490. C643, C743, CD33, CD43, CX7220 and CX7300 maker notes are also decoded using
  491. this table, although the strings for these cameras don't conform to the
  492. usual Kodak serial number format, and instead have the model name followed
  493. by 8 digits.
  494. },
  495. 0 => { # (not confirmed)
  496. Name => 'SerialNumber',
  497. Format => 'string[16]',
  498. ValueConv => '$val=~s/\s+$//; $val', # remove trailing whitespace
  499. ValueConvInv => '$val',
  500. },
  501. );
  502. # Kodak IFD-format maker notes (ref PH)
  503. %Image::ExifTool::Kodak::Type8 = (
  504. WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
  505. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  506. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  507. NOTES => q{
  508. Kodak models such as the ZD710, P712, P850, P880, V1233, V1253, V1275,
  509. V1285, Z612, Z712, Z812, Z885 use standard TIFF IFD format for the maker
  510. notes. In keeping with Kodak's strategy of inconsistent makernotes, models
  511. such as the M380, M1033, M1093, V1073, V1273, Z1012, Z1085 and Z8612
  512. also use these tags, but these makernotes begin with a TIFF header instead
  513. of an IFD entry count and use relative instead of absolute offsets. There
  514. is a large amount of information stored in these maker notes (apparently
  515. with much duplication), but relatively few tags have so far been decoded.
  516. },
  517. 0xfc00 => [{
  518. Name => 'SubIFD0',
  519. Condition => '$format eq "undef"',
  520. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  521. NestedHtmlDump => 2, # (so HtmlDump doesn't show these as double-referenced)
  522. SubDirectory => {
  523. TagTable => 'Image::ExifTool::Kodak::SubIFD0',
  524. Base => '$start',
  525. ProcessProc => \&ProcessKodakIFD,
  526. WriteProc => \&WriteKodakIFD,
  527. },
  528. },{
  529. Name => 'SubIFD0',
  530. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  531. Flags => 'SubIFD',
  532. SubDirectory => {
  533. TagTable => 'Image::ExifTool::Kodak::SubIFD0',
  534. Start => '$val',
  535. # (odd but true: the Base for this SubIFD is different than 0xfc01-0xfc06)
  536. },
  537. }],
  538. # SubIFD1 and higher data is preceded by a TIFF byte order mark to indicate
  539. # the byte ordering used. Beginning with the M580, these subdirectories are
  540. # stored as 'undef' data rather than as a standard EXIF SubIFD.
  541. 0xfc01 => [{
  542. Name => 'SubIFD1',
  543. Condition => '$format eq "undef"',
  544. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  545. NestedHtmlDump => 2,
  546. SubDirectory => {
  547. TagTable => 'Image::ExifTool::Kodak::SubIFD1',
  548. Base => '$start',
  549. },
  550. },{
  551. Name => 'SubIFD1',
  552. Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
  553. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  554. Flags => 'SubIFD',
  555. SubDirectory => {
  556. TagTable => 'Image::ExifTool::Kodak::SubIFD1',
  557. Start => '$val',
  558. Base => '$start',
  559. },
  560. }],
  561. 0xfc02 => [{
  562. Name => 'SubIFD2',
  563. Condition => '$format eq "undef"',
  564. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  565. NestedHtmlDump => 2,
  566. SubDirectory => {
  567. TagTable => 'Image::ExifTool::Kodak::SubIFD2',
  568. Base => '$start',
  569. },
  570. },{
  571. Name => 'SubIFD2',
  572. Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
  573. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  574. Flags => 'SubIFD',
  575. SubDirectory => {
  576. TagTable => 'Image::ExifTool::Kodak::SubIFD2',
  577. Start => '$val',
  578. Base => '$start',
  579. },
  580. }],
  581. 0xfc03 => [{
  582. Name => 'SubIFD3',
  583. Condition => '$format eq "undef"',
  584. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  585. NestedHtmlDump => 2,
  586. SubDirectory => {
  587. TagTable => 'Image::ExifTool::Kodak::SubIFD3',
  588. Base => '$start',
  589. },
  590. },{
  591. Name => 'SubIFD3',
  592. Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
  593. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  594. Flags => 'SubIFD',
  595. SubDirectory => {
  596. TagTable => 'Image::ExifTool::Kodak::SubIFD3',
  597. Start => '$val',
  598. Base => '$start',
  599. },
  600. }],
  601. # (SubIFD4 has the pointer zeroed in my samples, but support it
  602. # in case it is used by future models -- ignored if pointer is zero)
  603. 0xfc04 => [{
  604. Name => 'SubIFD4',
  605. Condition => '$format eq "undef"',
  606. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  607. NestedHtmlDump => 2,
  608. SubDirectory => {
  609. TagTable => 'Image::ExifTool::Kodak::SubIFD4',
  610. Base => '$start',
  611. },
  612. },{
  613. Name => 'SubIFD4',
  614. Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
  615. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  616. Flags => 'SubIFD',
  617. SubDirectory => {
  618. TagTable => 'Image::ExifTool::Kodak::SubIFD4',
  619. Start => '$val',
  620. Base => '$start',
  621. },
  622. }],
  623. 0xfc05 => [{
  624. Name => 'SubIFD5',
  625. Condition => '$format eq "undef"',
  626. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  627. NestedHtmlDump => 2,
  628. SubDirectory => {
  629. TagTable => 'Image::ExifTool::Kodak::SubIFD5',
  630. Base => '$start',
  631. },
  632. },{
  633. Name => 'SubIFD5',
  634. Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
  635. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  636. Flags => 'SubIFD',
  637. SubDirectory => {
  638. TagTable => 'Image::ExifTool::Kodak::SubIFD5',
  639. Start => '$val',
  640. Base => '$start',
  641. },
  642. }],
  643. 0xfc06 => [{ # new for the M580
  644. Name => 'SubIFD6',
  645. Condition => '$format eq "undef"',
  646. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  647. NestedHtmlDump => 2,
  648. SubDirectory => {
  649. TagTable => 'Image::ExifTool::Kodak::SubIFD6',
  650. Base => '$start',
  651. },
  652. },{
  653. Name => 'SubIFD6',
  654. Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
  655. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  656. Flags => 'SubIFD',
  657. SubDirectory => {
  658. TagTable => 'Image::ExifTool::Kodak::SubIFD6',
  659. Start => '$val',
  660. Base => '$start',
  661. },
  662. }],
  663. 0xfcff => {
  664. Name => 'SubIFD255',
  665. Condition => '$format eq "undef"',
  666. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  667. NestedHtmlDump => 2,
  668. SubDirectory => {
  669. TagTable => 'Image::ExifTool::Kodak::SubIFD0',
  670. # (uses the same Base as the main MakerNote IFD)
  671. },
  672. },
  673. 0xff00 => {
  674. Name => 'CameraInfo',
  675. Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
  676. Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
  677. Flags => 'SubIFD',
  678. SubDirectory => {
  679. TagTable => 'Image::ExifTool::Kodak::CameraInfo',
  680. Start => '$val',
  681. # (uses the same Base as the main MakerNote IFD)
  682. },
  683. },
  684. );
  685. # Kodak type 9 maker notes (ref PH)
  686. %Image::ExifTool::Kodak::Type9 = (
  687. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  688. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  689. WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
  690. CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
  691. WRITABLE => 1,
  692. FIRST_ENTRY => 0,
  693. NOTES => q{
  694. These tags are used by the Kodak C140, C180, C913, C1013, M320, M340 and
  695. M550, as well as various cameras marketed by other manufacturers.
  696. },
  697. 0x0c => [
  698. {
  699. Name => 'FNumber',
  700. Condition => '$$self{Make} =~ /Kodak/i',
  701. Format => 'int16u',
  702. ValueConv => '$val / 100',
  703. ValueConvInv => 'int($val * 100 + 0.5)',
  704. },{
  705. Name => 'FNumber',
  706. Format => 'int16u',
  707. ValueConv => '$val / 10',
  708. ValueConvInv => 'int($val * 10 + 0.5)',
  709. },
  710. ],
  711. 0x10 => {
  712. Name => 'ExposureTime',
  713. Format => 'int32u',
  714. ValueConv => '$val / 1e6',
  715. ValueConvInv => '$val * 1e6',
  716. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  717. PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
  718. },
  719. 0x14 => {
  720. Name => 'DateTimeOriginal',
  721. Description => 'Date/Time Original',
  722. Groups => { 2 => 'Time' },
  723. Format => 'string[20]',
  724. Shift => 'Time',
  725. ValueConv => '$val=~s{/}{:}g; $val',
  726. ValueConvInv => '$val=~s{^(\d{4}):(\d{2}):}{$1/$2/}; $val',
  727. PrintConv => '$self->ConvertDateTime($val)',
  728. PrintConvInv => '$self->InverseDateTime($val,0)',
  729. },
  730. 0x34 => {
  731. Name => 'ISO',
  732. Format => 'int16u',
  733. },
  734. 0x57 => {
  735. Name => 'FirmwareVersion',
  736. Condition => '$$self{Make} =~ /Kodak/i',
  737. Format => 'string[16]',
  738. Notes => 'Kodak only',
  739. },
  740. 0xa8 => {
  741. Name => 'UnknownNumber', # (was SerialNumber, but not unique for all cameras. eg. C1013)
  742. Condition => '$$self{Make} =~ /Kodak/i and $$valPt =~ /^([A-Z0-9]{1,11}\0|[A-Z0-9]{12})/i',
  743. Format => 'string[12]',
  744. Notes => 'Kodak only',
  745. Writable => 0,
  746. },
  747. 0xc4 => {
  748. Name => 'UnknownNumber', # (confirmed NOT to be serial number for Easyshare Mini - PH)
  749. Condition => '$$self{Make} =~ /Kodak/i and $$valPt =~ /^([A-Z0-9]{1,11}\0|[A-Z0-9]{12})/i',
  750. Format => 'string[12]',
  751. Notes => 'Kodak only',
  752. Writable => 0,
  753. },
  754. );
  755. # more Kodak IFD-format maker notes (ref PH)
  756. %Image::ExifTool::Kodak::Type10 = (
  757. WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
  758. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  759. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  760. PRIORITY => 0,
  761. NOTES => q{
  762. Another variation of the IFD-format type, this time with just a byte order
  763. indicator instead of a full TIFF header. These tags are used by the Z980.
  764. },
  765. # 0x01 int16u - always 0
  766. 0x02 => {
  767. Name => 'PreviewImageSize',
  768. Writable => 'int16u',
  769. Count => 2,
  770. },
  771. # 0x03 int32u - ranges from about 33940 to 40680
  772. # 0x04 int32u - always 18493
  773. # 0x06 undef[4] - 07 d9 04 11
  774. # 0x07 undef[3] - varies
  775. # 0x08 int16u - 1 (mostly), 2
  776. # 0x09 int16u - 255
  777. # 0x0b int16u[2] - '0 0' (mostly), '20 0', '21 0', '1 0'
  778. # 0x0c int16u - 1 (mostly), 3, 259, 260
  779. # 0x0d int16u - 0
  780. # 0x0e int16u - 0, 1, 2 (MeteringMode? 0=Partial, 1,2=Multi)
  781. # 0x0f int16u - 0, 5 (MeteringMode? 0=Multi, 5=Partial)
  782. # 0x10 int16u - ranges from about 902 to 2308
  783. 0x12 => {
  784. Name => 'ExposureTime',
  785. Writable => 'int32u',
  786. ValueConv => '$val / 1e5',
  787. ValueConvInv => '$val * 1e5',
  788. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  789. PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
  790. },
  791. 0x13 => {
  792. Name => 'FNumber',
  793. Writable => 'int16u',
  794. ValueConv => '$val / 10',
  795. ValueConvInv => '$val * 10',
  796. },
  797. 0x14 => {
  798. Name => 'ISO',
  799. Writable => 'int16u',
  800. ValueConv => 'exp($val/3*log(2))*25',
  801. ValueConvInv => '3*log($val/25)/log(2)',
  802. PrintConv => 'int($val + 0.5)',
  803. PrintConvInv => '$val',
  804. },
  805. # 0x15 int16u - 18-25 (SceneMode? 21=auto, 24=Aperture Priority, 19=high speed)
  806. # 0x16 int16u - 50
  807. # 0x17 int16u - 0, 65535 (MeteringMode? 0=Multi, 65535=Partial)
  808. # 0x19 int16u - 0, 4 (WhiteBalance? 0=Auto, 4=Manual)
  809. # 0x1a int16u - 0, 65535
  810. # 0x1b int16u - 416-696
  811. # 0x1c int16u - 251-439 (low when 0x1b is high)
  812. 0x1d => {
  813. Name => 'FocalLength',
  814. Writable => 'int32u',
  815. ValueConv => '$val / 100',
  816. ValueConvInv => '$val * 100',
  817. PrintConv => '"$val mm"',
  818. PrintConvInv => '$val=~s/\s*mm//;$val',
  819. },
  820. # 0x1e int16u - 100
  821. # 0x1f int16u - 0, 1
  822. # 0x20,0x21 int16u - 1
  823. # 0x27 undef[4] - fe ff ff ff
  824. # 0x32 undef[4] - 00 00 00 00
  825. # 0x61 int32u[2] - '0 0' or '34050 0'
  826. # 0x62 int8u - 0, 1
  827. # 0x63 int8u - 1
  828. # 0x64,0x65 int8u - 0, 1, 2
  829. # 0x66 int32u - 0
  830. # 0x67 int32u - 3
  831. # 0x68 int32u - 0
  832. # 0x3fe undef[2540]
  833. );
  834. # Kodak PixPro S-1 maker notes (ref PH)
  835. # (similar to Ricoh::Type2 and GE::Main)
  836. %Image::ExifTool::Kodak::Type11 = (
  837. # (can't currently write these)
  838. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  839. NOTES =>q{
  840. These tags are found in models such as the PixPro S-1. They are not
  841. writable because the inconsistency of Kodak maker notes is beginning to get
  842. on my nerves.
  843. },
  844. 0x0203 => {
  845. Name => 'PictureEffect',
  846. PrintConv => {
  847. 0 => 'None',
  848. 3 => 'Monochrome',
  849. 9 => 'Kodachrome',
  850. },
  851. },
  852. # 0x0204 - ExposureComp or FlashExposureComp maybe?
  853. 0x0207 => 'KodakModel',
  854. 0x0300 => 'KodakMake',
  855. 0x0308 => 'LensSerialNumber',
  856. 0x0309 => 'LensModel',
  857. );
  858. # Kodak SubIFD0 tags (ref PH)
  859. %Image::ExifTool::Kodak::SubIFD0 = (
  860. WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
  861. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  862. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  863. NOTES => 'SubIFD0 through SubIFD5 tags are written a number of newer Kodak models.',
  864. 0xfa02 => {
  865. Name => 'SceneMode',
  866. Writable => 'int16u',
  867. Notes => 'may not be valid for some models', # eg. M580?
  868. PrintConvColumns => 2,
  869. PrintConv => {
  870. 1 => 'Sport',
  871. 3 => 'Portrait',
  872. 4 => 'Landscape',
  873. 6 => 'Beach',
  874. 7 => 'Night Portrait',
  875. 8 => 'Night Landscape',
  876. 9 => 'Snow',
  877. 10 => 'Text',
  878. 11 => 'Fireworks',
  879. 12 => 'Macro',
  880. 13 => 'Museum',
  881. 16 => 'Children',
  882. 17 => 'Program',
  883. 18 => 'Aperture Priority',
  884. 19 => 'Shutter Priority',
  885. 20 => 'Manual',
  886. 25 => 'Back Light',
  887. 28 => 'Candlelight',
  888. 29 => 'Sunset',
  889. 31 => 'Panorama Left-right',
  890. 32 => 'Panorama Right-left',
  891. 33 => 'Smart Scene',
  892. 34 => 'High ISO',
  893. },
  894. },
  895. # 0xfa04 - values: 0 (normally), 2 (panorama shots)
  896. # 0xfa0f - values: 0 (normally), 1 (macro?)
  897. # 0xfa11 - some sort of FNumber (x 100)
  898. 0xfa19 => {
  899. Name => 'SerialNumber', # (verified with Z712 - PH)
  900. Writable => 'string',
  901. },
  902. 0xfa1d => {
  903. Name => 'KodakImageWidth',
  904. Writable => 'int16u',
  905. },
  906. 0xfa1e => {
  907. Name => 'KodakImageHeight',
  908. Writable => 'int16u',
  909. },
  910. 0xfa20 => {
  911. Name => 'SensorWidth',
  912. Writable => 'int16u',
  913. },
  914. 0xfa21 => {
  915. Name => 'SensorHeight',
  916. Writable => 'int16u',
  917. },
  918. 0xfa23 => {
  919. Name => 'FNumber',
  920. Writable => 'int16u',
  921. Priority => 0,
  922. ValueConv => '$val / 100',
  923. ValueConvInv => '$val * 100',
  924. },
  925. 0xfa24 => {
  926. Name => 'ExposureTime',
  927. Writable => 'int32u',
  928. Priority => 0,
  929. ValueConv => '$val / 1e5',
  930. ValueConvInv => '$val * 1e5',
  931. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  932. PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
  933. },
  934. 0xfa2e => {
  935. Name => 'ISO',
  936. Writable => 'int16u',
  937. Priority => 0,
  938. },
  939. 0xfa3d => {
  940. Name => 'OpticalZoom',
  941. Writable => 'int16u',
  942. ValueConv => '$val / 100',
  943. ValueConvInv => '$val * 100',
  944. PrintConv => 'sprintf("%.2f",$val)',
  945. PrintConvInv => '$val=~s/ ?x//; $val',
  946. },
  947. 0xfa46 => {
  948. Name => 'ISO',
  949. Writable => 'int16u',
  950. Priority => 0,
  951. },
  952. # 0xfa4c - related to focal length (1=wide, 32=full zoom)
  953. 0xfa51 => {
  954. Name => 'KodakImageWidth',
  955. Writable => 'int16u',
  956. },
  957. 0xfa52 => {
  958. Name => 'KodakImageHeight',
  959. Writable => 'int16u',
  960. },
  961. 0xfa54 => {
  962. Name => 'ThumbnailWidth',
  963. Writable => 'int16u',
  964. },
  965. 0xfa55 => {
  966. Name => 'ThumbnailHeight',
  967. Writable => 'int16u',
  968. },
  969. 0xfa57 => {
  970. Name => 'PreviewImageWidth',
  971. Writable => 'int16u',
  972. },
  973. 0xfa58 => {
  974. Name => 'PreviewImageHeight',
  975. Writable => 'int16u',
  976. },
  977. );
  978. # Kodak SubIFD1 tags (ref PH)
  979. %Image::ExifTool::Kodak::SubIFD1 = (
  980. PROCESS_PROC => \&ProcessKodakIFD,
  981. WRITE_PROC => \&WriteKodakIFD,
  982. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  983. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  984. 0x0027 => {
  985. Name => 'ISO',
  986. Writable => 'int16u',
  987. Priority => 0,
  988. },
  989. 0x0028 => {
  990. Name => 'ISO',
  991. Writable => 'int16u',
  992. Priority => 0,
  993. },
  994. );
  995. my %sceneModeUsed = (
  996. 0 => 'Program',
  997. 2 => 'Aperture Priority',
  998. 3 => 'Shutter Priority',
  999. 4 => 'Manual',
  1000. 5 => 'Portrait',
  1001. 6 => 'Sport',
  1002. 7 => 'Children',
  1003. 8 => 'Museum',
  1004. 10 => 'High ISO',
  1005. 11 => 'Text',
  1006. 12 => 'Macro',
  1007. 13 => 'Back Light',
  1008. 16 => 'Landscape',
  1009. 17 => 'Night Landscape',
  1010. 18 => 'Night Portrait',
  1011. 19 => 'Snow',
  1012. 20 => 'Beach',
  1013. 21 => 'Fireworks',
  1014. 22 => 'Sunset',
  1015. 23 => 'Candlelight',
  1016. 28 => 'Panorama',
  1017. );
  1018. # Kodak SubIFD2 tags (ref PH)
  1019. %Image::ExifTool::Kodak::SubIFD2 = (
  1020. PROCESS_PROC => \&ProcessKodakIFD,
  1021. WRITE_PROC => \&WriteKodakIFD,
  1022. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  1023. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  1024. 0x6002 => {
  1025. Name => 'SceneModeUsed',
  1026. Writable => 'int32u',
  1027. PrintConvColumns => 2,
  1028. PrintConv => \%sceneModeUsed,
  1029. },
  1030. 0x6006 => {
  1031. Name => 'OpticalZoom',
  1032. Writable => 'int32u',
  1033. ValueConv => '$val / 100',
  1034. ValueConvInv => '$val * 100',
  1035. PrintConv => 'sprintf("%.2f",$val)',
  1036. PrintConvInv => '$val=~s/ ?x//; $val',
  1037. },
  1038. # 0x6009 - some sort of FNumber (x 100)
  1039. 0x6103 => {
  1040. Name => 'MaxAperture',
  1041. Writable => 'int32u',
  1042. ValueConv => '$val / 100',
  1043. ValueConvInv => '$val * 100',
  1044. },
  1045. 0xf002 => {
  1046. Name => 'SceneModeUsed',
  1047. Writable => 'int32u',
  1048. PrintConvColumns => 2,
  1049. PrintConv => \%sceneModeUsed,
  1050. },
  1051. 0xf006 => {
  1052. Name => 'OpticalZoom',
  1053. Writable => 'int32u',
  1054. ValueConv => '$val / 100',
  1055. ValueConvInv => '$val * 100',
  1056. PrintConv => 'sprintf("%.2f",$val)',
  1057. PrintConvInv => '$val=~s/ ?x//; $val',
  1058. },
  1059. # 0xf009 - some sort of FNumber (x 100)
  1060. 0xf103 => {
  1061. Name => 'FNumber',
  1062. Writable => 'int32u',
  1063. Priority => 0,
  1064. ValueConv => '$val / 100',
  1065. ValueConvInv => '$val * 100',
  1066. },
  1067. 0xf104 => {
  1068. Name => 'ExposureTime',
  1069. Writable => 'int32u',
  1070. Priority => 0,
  1071. ValueConv => '$val / 1e6',
  1072. ValueConvInv => '$val * 1e6',
  1073. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  1074. PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
  1075. },
  1076. 0xf105 => {
  1077. Name => 'ISO',
  1078. Writable => 'int32u',
  1079. Priority => 0,
  1080. ValueConv => '$val / 10',
  1081. ValueConvInv => '$val * 10',
  1082. },
  1083. );
  1084. # Kodak SubIFD3 tags (ref PH)
  1085. %Image::ExifTool::Kodak::SubIFD3 = (
  1086. PROCESS_PROC => \&ProcessKodakIFD,
  1087. WRITE_PROC => \&WriteKodakIFD,
  1088. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  1089. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  1090. 0x1000 => {
  1091. Name => 'OpticalZoom',
  1092. Writable => 'int16u',
  1093. ValueConv => '$val / 100',
  1094. ValueConvInv => '$val * 100',
  1095. PrintConv => 'sprintf("%.2f",$val)',
  1096. PrintConvInv => '$val=~s/ ?x//; $val',
  1097. },
  1098. # 0x1002 - related to focal length (1=wide, 32=full zoom)
  1099. # 0x1006 - pictures remaining? (gradually decreases as pictures are taken)
  1100. #
  1101. # the following unknown Kodak tags in subIFD3 may store an IFD count of 0 or 1 instead
  1102. # of the correct value (which changes from model to model). This bad count is fixed
  1103. # with the "FixCount" patch. Models known to have this problem include:
  1104. # M380, M1033, M1093IS, V1073, V1233, V1253, V1273, V1275, V1285, Z612, Z712,
  1105. # Z812, Z885, Z915, Z950, Z1012IS, Z1085IS, ZD710
  1106. #
  1107. 0x2007 => {
  1108. Name => 'Kodak_SubIFD3_0x2007',
  1109. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1110. },
  1111. 0x2008 => {
  1112. Name => 'Kodak_SubIFD3_0x2008',
  1113. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1114. },
  1115. 0x2009 => {
  1116. Name => 'Kodak_SubIFD3_0x2009',
  1117. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1118. },
  1119. 0x200a => {
  1120. Name => 'Kodak_SubIFD3_0x200a',
  1121. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1122. },
  1123. 0x200b => {
  1124. Name => 'Kodak_SubIFD3_0x200b',
  1125. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1126. },
  1127. 0x3020 => {
  1128. Name => 'Kodak_SubIFD3_0x3020',
  1129. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1130. },
  1131. 0x3030 => {
  1132. Name => 'Kodak_SubIFD3_0x3030',
  1133. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1134. },
  1135. 0x3040 => {
  1136. Name => 'Kodak_SubIFD3_0x3040',
  1137. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1138. },
  1139. 0x3050 => {
  1140. Name => 'Kodak_SubIFD3_0x3050',
  1141. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1142. },
  1143. 0x3060 => {
  1144. Name => 'Kodak_SubIFD3_0x3060',
  1145. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1146. },
  1147. 0x8001 => {
  1148. Name => 'Kodak_SubIFD3_0x8001',
  1149. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1150. },
  1151. 0x8002 => {
  1152. Name => 'Kodak_SubIFD3_0x8002',
  1153. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1154. },
  1155. 0x8003 => {
  1156. Name => 'Kodak_SubIFD3_0x8003',
  1157. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1158. },
  1159. 0x8004 => {
  1160. Name => 'Kodak_SubIFD3_0x8004',
  1161. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1162. },
  1163. 0x8005 => {
  1164. Name => 'Kodak_SubIFD3_0x8005',
  1165. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1166. },
  1167. 0x8006 => {
  1168. Name => 'Kodak_SubIFD3_0x8006',
  1169. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1170. },
  1171. 0x8007 => {
  1172. Name => 'Kodak_SubIFD3_0x8007',
  1173. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1174. },
  1175. 0x8008 => {
  1176. Name => 'Kodak_SubIFD3_0x8008',
  1177. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1178. },
  1179. 0x8009 => {
  1180. Name => 'Kodak_SubIFD3_0x8009',
  1181. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1182. },
  1183. 0x800a => {
  1184. Name => 'Kodak_SubIFD3_0x800a',
  1185. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1186. },
  1187. 0x800b => {
  1188. Name => 'Kodak_SubIFD3_0x800b',
  1189. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1190. },
  1191. 0x800c => {
  1192. Name => 'Kodak_SubIFD3_0x800c',
  1193. Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
  1194. },
  1195. );
  1196. # Kodak SubIFD4 tags (ref PH)
  1197. %Image::ExifTool::Kodak::SubIFD4 = (
  1198. PROCESS_PROC => \&ProcessKodakIFD,
  1199. WRITE_PROC => \&WriteKodakIFD,
  1200. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  1201. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  1202. );
  1203. # Kodak SubIFD5 tags (ref PH)
  1204. %Image::ExifTool::Kodak::SubIFD5 = (
  1205. PROCESS_PROC => \&ProcessKodakIFD,
  1206. WRITE_PROC => \&WriteKodakIFD,
  1207. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  1208. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  1209. 0x000f => {
  1210. Name => 'OpticalZoom',
  1211. Writable => 'int16u',
  1212. ValueConv => '$val / 100',
  1213. ValueConvInv => '$val * 100',
  1214. PrintConv => 'sprintf("%.2f",$val)',
  1215. PrintConvInv => '$val=~s/ ?x//; $val',
  1216. },
  1217. );
  1218. # Kodak SubIFD6 tags (ref PH)
  1219. %Image::ExifTool::Kodak::SubIFD6 = (
  1220. PROCESS_PROC => \&ProcessKodakIFD,
  1221. WRITE_PROC => \&WriteKodakIFD,
  1222. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  1223. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  1224. NOTES => 'SubIFD6 is written by the M580.',
  1225. );
  1226. # Decoded from P712, P850 and P880 samples (ref PH)
  1227. %Image::ExifTool::Kodak::CameraInfo = (
  1228. WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
  1229. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  1230. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  1231. NOTES => 'These tags are used by the P712, P850 and P880.',
  1232. 0xf900 => {
  1233. Name => 'SensorWidth',
  1234. Writable => 'int16u',
  1235. Notes => 'effective sensor size',
  1236. },
  1237. 0xf901 => {
  1238. Name => 'SensorHeight',
  1239. Writable => 'int16u',
  1240. },
  1241. 0xf902 => {
  1242. Name => 'BayerPattern',
  1243. Writable => 'string',
  1244. },
  1245. 0xf903 => {
  1246. Name => 'SensorFullWidth',
  1247. Writable => 'int16u',
  1248. Notes => 'includes black border?',
  1249. },
  1250. 0xf904 => {
  1251. Name => 'SensorFullHeight',
  1252. Writable => 'int16u',
  1253. },
  1254. 0xf907 => {
  1255. Name => 'KodakImageWidth',
  1256. Writable => 'int16u',
  1257. },
  1258. 0xf908 => {
  1259. Name => 'KodakImageHeight',
  1260. Writable => 'int16u',
  1261. },
  1262. 0xfa00 => {
  1263. Name => 'KodakInfoType',
  1264. Writable => 'string',
  1265. },
  1266. 0xfa04 => {
  1267. Name => 'SerialNumber', # (unverified)
  1268. Writable => 'string',
  1269. },
  1270. 0xfd04 => {
  1271. Name => 'FNumber',
  1272. Writable => 'int16u',
  1273. Priority => 0,
  1274. ValueConv => '$val / 100',
  1275. ValueConvInv => '$val * 100',
  1276. },
  1277. 0xfd05 => {
  1278. Name => 'ExposureTime',
  1279. Writable => 'int32u',
  1280. Priority => 0,
  1281. ValueConv => '$val / 1e6',
  1282. ValueConvInv => '$val * 1e6',
  1283. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  1284. PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
  1285. },
  1286. 0xfd06 => {
  1287. Name => 'ISO',
  1288. Writable => 'int16u',
  1289. Priority => 0,
  1290. },
  1291. );
  1292. # treat unknown maker notes as binary data (allows viewing with -U)
  1293. %Image::ExifTool::Kodak::Unknown = (
  1294. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  1295. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  1296. FIRST_ENTRY => 0,
  1297. );
  1298. # tags found in the KodakIFD (in IFD0 of KDC, DCR, TIFF and JPEG images) (ref PH)
  1299. %Image::ExifTool::Kodak::IFD = (
  1300. GROUPS => { 0 => 'MakerNotes', 1 => 'KodakIFD', 2 => 'Image'},
  1301. WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
  1302. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  1303. WRITE_GROUP => 'KodakIFD',
  1304. SET_GROUP1 => 1,
  1305. NOTES => q{
  1306. These tags are found in a separate IFD of JPEG, TIFF, DCR and KDC images
  1307. from some older Kodak models such as the DC50, DC120, DCS760C, DCS Pro 14N,
  1308. 14nx, SLR/n, Pro Back and Canon EOS D2000.
  1309. },
  1310. # 0x0000: int8u[4] - values: "1 0 0 0" (DC50), "1 1 0 0" (DC120)
  1311. 0x0001 => {
  1312. # (related to EV but exact meaning unknown)
  1313. Name => 'UnknownEV',
  1314. Writable => 'rational64u',
  1315. Unknown => 1,
  1316. },
  1317. # 0x0002: int8u - values: 0
  1318. 0x0003 => {
  1319. Name => 'ExposureValue',
  1320. Writable => 'rational64u',
  1321. },
  1322. # 0x0004: rational64u - values: 2.875,3.375,3.625,4,4.125,7.25
  1323. # 0x0005: int8u - values: 0
  1324. # 0x0006: int32u[12] - ?
  1325. # 0x0007: int32u[3] - values: "65536 67932 69256"
  1326. 0x03e9 => { Name => 'OriginalFileName', Writable => 'string' },
  1327. 0x03eb => 'SensorLeftBorder',
  1328. 0x03ec => 'SensorTopBorder',
  1329. 0x03ed => 'SensorImageWidth',
  1330. 0x03ee => 'SensorImageHeight',
  1331. 0x03f1 => {
  1332. Name => 'TextualInfo',
  1333. SubDirectory => {
  1334. TagTable => 'Image::ExifTool::Kodak::TextualInfo',
  1335. },
  1336. },
  1337. # 0x03f2 - FlashMode (ref 4)
  1338. # 0x03f3 - FlashCompensation (ref 4)
  1339. # 0x03f8 - MinAperture (ref 4)
  1340. # 0x03f9 - MaxAperture (ref 4)
  1341. 0x03fc => { #3
  1342. Name => 'WhiteBalance',
  1343. Writable => 'int16u',
  1344. Priority => 0,
  1345. PrintConv => { }, # no values yet known
  1346. },
  1347. 0x03fd => { #3
  1348. Name => 'Processing',
  1349. Condition => '$count == 72',
  1350. SubDirectory => {
  1351. TagTable => 'Image::ExifTool::Kodak::Processing',
  1352. },
  1353. },
  1354. 0x0401 => {
  1355. Name => 'Time',
  1356. Groups => { 2 => 'Time' },
  1357. Writable => 'string',
  1358. },
  1359. 0x0406 => { #4
  1360. Name => 'CameraTemperature',
  1361. # (when count is 2, values seem related to temperature, but are not Celius)
  1362. Condition => '$count == 1',
  1363. Groups => { 2 => 'Camera' },
  1364. Writable => 'rational64s',
  1365. PrintConv => '"$val C"',
  1366. PrintConvInv => '$val=~s/ ?C//; $val',
  1367. },
  1368. 0x0407 => { #4
  1369. Name => 'AdapterVoltage',
  1370. Groups => { 2 => 'Camera' },
  1371. Writable => 'rational64u',
  1372. },
  1373. 0x0408 => { #4
  1374. Name => 'BatteryVoltage',
  1375. Groups => { 2 => 'Camera' },
  1376. Writable => 'rational64u',
  1377. },
  1378. 0x0414 => { Name => 'NCDFileInfo', Writable => 'string' },
  1379. 0x0846 => { #3
  1380. Name => 'ColorTemperature',
  1381. Writable => 'int16u',
  1382. },
  1383. 0x0848 => 'WB_RGBLevelsDaylight', #4
  1384. 0x0849 => 'WB_RGBLevelsTungsten', #4
  1385. 0x084a => 'WB_RGBLevelsFluorescent', #4
  1386. 0x084b => 'WB_RGBLevelsFlash', #4
  1387. 0x084c => 'WB_RGBLevelsCustom', #4
  1388. 0x084d => 'WB_RGBLevelsAuto', #4
  1389. 0x0852 => 'WB_RGBMul0', #3
  1390. 0x0853 => 'WB_RGBMul1', #3
  1391. 0x0854 => 'WB_RGBMul2', #3
  1392. 0x0855 => 'WB_RGBMul3', #3
  1393. 0x085c => { Name => 'WB_RGBCoeffs0', Binary => 1 }, #3
  1394. 0x085d => { Name => 'WB_RGBCoeffs1', Binary => 1 }, #3
  1395. 0x085e => { Name => 'WB_RGBCoeffs2', Binary => 1 }, #3
  1396. 0x085f => { Name => 'WB_RGBCoeffs3', Binary => 1 }, #3
  1397. # 0x089d => true analogue ISO values possible (ref 4)
  1398. # 0x089e => true analogue ISO used at capture (ref 4)
  1399. # 0x089f => ISO calibration gain (ref 4)
  1400. # 0x08a0 => ISO calibration gain table (ref 4)
  1401. # 0x08a1 => exposure headroom coefficient (ref 4)
  1402. 0x0903 => { Name => 'BaseISO', Writable => 'rational64u' }, #4 (ISO before digital gain)
  1403. # 0x090d: linear table (ref 3)
  1404. 0x09ce => { Name => 'SensorSerialNumber', Writable => 'string', Groups => { 2 => 'Camera' } }, #4
  1405. # 0x0c81: some sort of date (manufacture date?) - PH
  1406. 0x0ce5 => { Name => 'FirmwareVersion', Writable => 'string', Groups => { 2 => 'Camera' } },
  1407. 0x0e4c => { #4
  1408. Name => 'KodakLook',
  1409. Format => 'undef',
  1410. Writable => 'string',
  1411. ValueConv => '$val=~tr/\0/\n/; $val',
  1412. ValueConvInv => '$val=~tr/\n/\0/; $val',
  1413. },
  1414. 0x1389 => { Name => 'InputProfile', Writable => 'undef', Binary => 1 }, #4
  1415. 0x138a => { Name => 'KodakLookProfile', Writable => 'undef', Binary => 1 }, #4
  1416. 0x138b => { Name => 'OutputProfile', Writable => 'undef', Binary => 1 }, #4
  1417. # 0x1390: value: "DCSProSLRn" (tone curve name?) - PH
  1418. 0x1391 => { Name => 'ToneCurveFileName',Writable => 'string' },
  1419. 0x1784 => { Name => 'ISO', Writable => 'int32u' }, #3
  1420. );
  1421. # contains WB adjust set in software (ref 3)
  1422. %Image::ExifTool::Kodak::Processing = (
  1423. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  1424. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  1425. WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
  1426. CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
  1427. FORMAT => 'int16u',
  1428. FIRST_ENTRY => 0,
  1429. 20 => {
  1430. Name => 'WB_RGBLevels',
  1431. Format => 'int16u[3]',
  1432. ValueConv => q{
  1433. my @a = split ' ',$val;
  1434. foreach (@a) {
  1435. $_ = 2048 / $_ if $_;
  1436. }
  1437. return join ' ', @a;
  1438. }
  1439. },
  1440. );
  1441. # tags found in the Kodak KDC_IFD (in IFD0 of KDC images) (ref 3)
  1442. %Image::ExifTool::Kodak::KDC_IFD = (
  1443. GROUPS => { 0 => 'MakerNotes', 1 => 'KDC_IFD', 2 => 'Image'},
  1444. WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
  1445. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  1446. WRITE_GROUP => 'KDC_IFD',
  1447. SET_GROUP1 => 1,
  1448. NOTES => q{
  1449. These tags are found in a separate IFD of KDC images from some newer Kodak
  1450. models such as the P880 and Z1015IS.
  1451. },
  1452. 0xfa00 => {
  1453. Name => 'SerialNumber', #PH (unverified)
  1454. Writable => 'string',
  1455. },
  1456. 0xfa0d => {
  1457. Name => 'WhiteBalance',
  1458. Writable => 'int8u',
  1459. PrintConv => { #PH
  1460. 0 => 'Auto',
  1461. 1 => 'Fluorescent', # (NC)
  1462. 2 => 'Tungsten', # (NC)
  1463. 3 => 'Daylight', # (NC)
  1464. 6 => 'Shade', # (NC, called "Open Shade" by Kodak)
  1465. },
  1466. },
  1467. # the following tags are numbered for use in the Composite tag lookup
  1468. 0xfa25 => 'WB_RGBLevelsAuto',
  1469. 0xfa27 => 'WB_RGBLevelsTungsten', # (NC)
  1470. 0xfa28 => 'WB_RGBLevelsFluorescent', # (NC)
  1471. 0xfa29 => 'WB_RGBLevelsDaylight', # (NC)
  1472. 0xfa2a => 'WB_RGBLevelsShade', # (NC)
  1473. );
  1474. # textual-based Kodak TextualInfo tags (not found in KDC images) (ref PH)
  1475. %Image::ExifTool::Kodak::TextualInfo = (
  1476. GROUPS => { 0 => 'MakerNotes', 1 => 'Kodak', 2 => 'Image'},
  1477. PROCESS_PROC => \&ProcessKodakText,
  1478. NOTES => q{
  1479. Below is a list of tags which have been observed in the Kodak TextualInfo
  1480. data, however ExifTool will extract information from any tags found here.
  1481. },
  1482. 'Actual Compensation' => 'ActualCompensation',
  1483. 'AF Function' => 'AFMode', # values: "S" (=Single?, then maybe C for Continuous, M for Manual?) - PH
  1484. 'Aperture' => {
  1485. Name => 'Aperture',
  1486. ValueConv => '$val=~s/^f//i; $val',
  1487. },
  1488. 'Auto Bracket' => 'AutoBracket',
  1489. 'Brightness Value' => 'BrightnessValue',
  1490. 'Camera' => 'CameraModel',
  1491. 'Camera body' => 'CameraBody',
  1492. 'Compensation' => 'ExposureCompensation',
  1493. 'Date' => {
  1494. Name => 'Date',
  1495. Groups => { 2 => 'Time' },
  1496. },
  1497. 'Exposure Bias' => 'ExposureBias',
  1498. 'Exposure Mode' => {
  1499. Name => 'ExposureMode',
  1500. PrintConv => {
  1501. 'M' => 'Manual',
  1502. 'A' => 'Aperture Priority', #(NC -- I suppose this could be "Auto" too)
  1503. 'S' => 'Shutter Priority', #(NC)
  1504. 'P' => 'Program', #(NC)
  1505. 'B' => 'Bulb', #(NC)
  1506. # have seen "Manual (M)" written by DCS760C - PH
  1507. },
  1508. },
  1509. 'Firmware Version' => 'FirmwareVersion',
  1510. 'Flash Compensation' => 'FlashExposureComp',
  1511. 'Flash Fired' => 'FlashFired',
  1512. 'Flash Sync Mode' => 'FlashSyncMode',
  1513. 'Focal Length' => {
  1514. Name => 'FocalLength',
  1515. PrintConv => '"$val mm"',
  1516. },
  1517. 'Height' => 'KodakImageHeight',
  1518. 'Image Number' => 'ImageNumber',
  1519. 'ISO' => 'ISO',
  1520. 'ISO Speed' => 'ISO',
  1521. 'Max Aperture' => {
  1522. Name => 'MaxAperture',
  1523. ValueConv => '$val=~s/^f//i; $val',
  1524. },
  1525. 'Meter Mode' => 'MeterMode',
  1526. 'Min Aperture' => {
  1527. Name => 'MinAperture',
  1528. ValueConv => '$val=~s/^f//i; $val',
  1529. },
  1530. 'Popup Flash' => 'PopupFlash',
  1531. 'Serial Number' => 'SerialNumber',
  1532. 'Shooting Mode' => 'ShootingMode',
  1533. 'Shutter' => 'ShutterSpeed',
  1534. 'Temperature' => 'Temperature', # with a value of 15653, what could this be? - PH
  1535. 'Time' => {
  1536. Name => 'Time',
  1537. Groups => { 2 => 'Time' },
  1538. },
  1539. 'White balance' => 'WhiteBalance',
  1540. 'Width' => 'KodakImageWidth',
  1541. '_other_info' => {
  1542. Name => 'OtherInfo',
  1543. Notes => 'any other information without a tag name',
  1544. },
  1545. );
  1546. # Kodak APP3 "Meta" tags (ref 2)
  1547. %Image::ExifTool::Kodak::Meta = (
  1548. GROUPS => { 0 => 'Meta', 1 => 'MetaIFD', 2 => 'Image'},
  1549. WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
  1550. CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
  1551. WRITE_GROUP => 'MetaIFD', # default write group
  1552. NOTES => q{
  1553. These tags are found in the APP3 "Meta" segment of JPEG images from Kodak
  1554. cameras such as the DC280, DC3400, DC5000, MC3, M580, Z950 and Z981. The
  1555. structure of this segment is similar to the APP1 "Exif" segment, but a
  1556. different set of tags is used.
  1557. },
  1558. 0xc350 => 'FilmProductCode',
  1559. 0xc351 => 'ImageSourceEK',
  1560. 0xc352 => 'CaptureConditionsPAR',
  1561. 0xc353 => {
  1562. Name => 'CameraOwner',
  1563. Writable => 'undef',
  1564. RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,$tag)',
  1565. RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
  1566. },
  1567. 0xc354 => {
  1568. Name => 'SerialNumber',
  1569. Writable => 'undef',
  1570. Groups => { 2 => 'Camera' },
  1571. RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,$tag)', #PH
  1572. RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
  1573. },
  1574. 0xc355 => 'UserSelectGroupTitle',
  1575. 0xc356 => 'DealerIDNumber',
  1576. 0xc357 => 'CaptureDeviceFID',
  1577. 0xc358 => 'EnvelopeNumber',
  1578. 0xc359 => 'FrameNumber',
  1579. 0xc35a => 'FilmCategory',
  1580. 0xc35b => 'FilmGencode',
  1581. 0xc35c => 'ModelAndVersion',
  1582. 0xc35d => 'FilmSize',
  1583. 0xc35e => 'SBA_RGBShifts',
  1584. 0xc35f => 'SBAInputImageColorspace',
  1585. 0xc360 => 'SBAInputImageBitDepth',
  1586. 0xc361 => {
  1587. Name => 'SBAExposureRecord',
  1588. Binary => 1,
  1589. },
  1590. 0xc362 => {
  1591. Name => 'UserAdjSBA_RGBShifts',
  1592. Binary => 1,
  1593. },
  1594. 0xc363 => 'ImageRotationStatus',
  1595. 0xc364 => 'RollGuidElements',
  1596. 0xc365 => 'MetadataNumber',
  1597. 0xc366 => 'EditTagArray',
  1598. 0xc367 => 'Magnification',
  1599. # 0xc36b - string[8]: "1.0"
  1600. 0xc36c => 'NativeXResolution',
  1601. 0xc36d => 'NativeYResolution',
  1602. 0xc36e => {
  1603. Name => 'KodakEffectsIFD',
  1604. Flags => 'SubIFD',
  1605. Groups => { 1 => 'KodakEffectsIFD' },
  1606. SubDirectory => {
  1607. TagTable => 'Image::ExifTool::Kodak::SpecialEffects',
  1608. Start => '$val',
  1609. },
  1610. },
  1611. 0xc36f => {
  1612. Name => 'KodakBordersIFD',
  1613. Flags => 'SubIFD',
  1614. Groups => { 1 => 'KodakBordersIFD' },
  1615. SubDirectory => {
  1616. TagTable => 'Image::ExifTool::Kodak::Borders',
  1617. Start => '$val',
  1618. },
  1619. },
  1620. 0xc37a => 'NativeResolutionUnit',
  1621. 0xc418 => 'SourceImageDirectory',
  1622. 0xc419 => 'SourceImageFileName',
  1623. 0xc41a => 'SourceImageVolumeName',
  1624. 0xc46c => 'PrintQuality',
  1625. 0xc46e => 'ImagePrintStatus',
  1626. # 0cx46f - int16u: 1
  1627. );
  1628. # Kodak APP3 "Meta" Special Effects sub-IFD (ref 2)
  1629. %Image::ExifTool::Kodak::SpecialEffects = (
  1630. GROUPS => { 0 => 'Meta', 1 => 'KodakEffectsIFD', 2 => 'Image'},
  1631. WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
  1632. 0 => 'DigitalEffectsVersion',
  1633. 1 => {
  1634. Name => 'DigitalEffectsName',
  1635. PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,"DigitalEffectsName")',
  1636. },
  1637. 2 => 'DigitalEffectsType',
  1638. );
  1639. # Kodak APP3 "Meta" Borders sub-IFD (ref 2)
  1640. %Image::ExifTool::Kodak::Borders = (
  1641. GROUPS => { 0 => 'Meta', 1 => 'KodakBordersIFD', 2 => 'Image'},
  1642. WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
  1643. 0 => 'BordersVersion',
  1644. 1 => {
  1645. Name => 'BorderName',
  1646. PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,"BorderName")',
  1647. },
  1648. 2 => 'BorderID',
  1649. 3 => 'BorderLocation',
  1650. 4 => 'BorderType',
  1651. 8 => 'WatermarkType',
  1652. );
  1653. # tags in Kodak MOV videos (ref PH)
  1654. # (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
  1655. %Image::ExifTool::Kodak::MOV = (
  1656. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  1657. GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
  1658. FIRST_ENTRY => 0,
  1659. NOTES => q{
  1660. This information is found in the TAGS atom of MOV videos from Kodak models
  1661. such as the P880.
  1662. },
  1663. 0 => {
  1664. Name => 'Make',
  1665. Format => 'string[21]',
  1666. },
  1667. 0x16 => {
  1668. Name => 'Model',
  1669. Format => 'string[42]',
  1670. },
  1671. 0x40 => {
  1672. Name => 'ModelType',
  1673. Format => 'string[8]',
  1674. },
  1675. # (01 00 at offset 0x48)
  1676. 0x4e => {
  1677. Name => 'ExposureTime',
  1678. Format => 'int32u',
  1679. ValueConv => '$val ? 10 / $val : 0',
  1680. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  1681. },
  1682. 0x52 => {
  1683. Name => 'FNumber',
  1684. Format => 'rational64u',
  1685. PrintConv => 'sprintf("%.1f",$val)',
  1686. },
  1687. 0x5a => {
  1688. Name => 'ExposureCompensation',
  1689. Format => 'rational64s',
  1690. PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
  1691. },
  1692. # 0x6c => 'WhiteBalance', ?
  1693. 0x70 => {
  1694. Name => 'FocalLength',
  1695. Format => 'rational64u',
  1696. PrintConv => 'sprintf("%.1f mm",$val)',
  1697. },
  1698. );
  1699. # Kodak DcMD atoms (ref PH)
  1700. %Image::ExifTool::Kodak::DcMD = (
  1701. GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
  1702. NOTES => 'Metadata directory found in MOV and MP4 videos from some Kodak cameras.',
  1703. Cmbo => {
  1704. Name => 'CameraByteOrder',
  1705. PrintConv => {
  1706. II => 'Little-endian (Intel, II)',
  1707. MM => 'Big-endian (Motorola, MM)',
  1708. },
  1709. },
  1710. CMbo => { # (as written by Kodak Playsport video camera)
  1711. Name => 'CameraByteOrder',
  1712. PrintConv => {
  1713. II => 'Little-endian (Intel, II)',
  1714. MM => 'Big-endian (Motorola, MM)',
  1715. },
  1716. },
  1717. DcME => {
  1718. Name => 'DcME',
  1719. SubDirectory => {
  1720. TagTable => 'Image::ExifTool::Kodak::DcME',
  1721. },
  1722. },
  1723. DcEM => {
  1724. Name => 'DcEM',
  1725. SubDirectory => {
  1726. TagTable => 'Image::ExifTool::Kodak::DcEM',
  1727. },
  1728. },
  1729. );
  1730. # Kodak DcME atoms (ref PH)
  1731. %Image::ExifTool::Kodak::DcME = (
  1732. GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
  1733. # Mtmd - 24 bytes: ("00 00 00 00 00 00 00 01" x 3)
  1734. # Keyw - keywords? (six bytes all zero)
  1735. # Rate - 2 bytes: 00 00
  1736. );
  1737. # Kodak DcEM atoms (ref PH)
  1738. %Image::ExifTool::Kodak::DcEM = (
  1739. GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
  1740. # Mtmd - 24 bytes: ("00 00 00 00 00 00 00 01" x 3)
  1741. # Csat - 16 bytes: 00 06 00 00 62 00 61 00 73 00 69 00 63 00 00 00 [....b.a.s.i.c...]
  1742. # Ksre - 8 bytes: 00 01 00 00 00 00
  1743. );
  1744. # tags in "free" atom of Kodak M5370 MP4 videos (ref PH)
  1745. %Image::ExifTool::Kodak::Free = (
  1746. GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
  1747. NOTES => q{
  1748. Information stored in the "free" atom of Kodak MP4 videos. (VERY bad form
  1749. for Kodak to store useful information in an atom intended for unused space!)
  1750. },
  1751. # (2012/01/19: Kodak files for bankruptcy -- this is poetic metadata justice)
  1752. Seri => {
  1753. Name => 'SerialNumber',
  1754. # byte 0 is string length; byte 1 is zero; string starts at byte 2
  1755. ValueConv => 'substr($val, 2, unpack("C",$val))',
  1756. },
  1757. SVer => {
  1758. Name => 'FirmwareVersion',
  1759. ValueConv => 'substr($val, 2, unpack("C",$val))',
  1760. },
  1761. # Clor - 2 bytes: 0 1 (?)
  1762. # CapM - 2 bytes: 0 1 (capture mode? = exposure mode?)
  1763. # WBMD - 2 bytes: 0 0 (white balance?)
  1764. Expc => { # (NC)
  1765. Name => 'ExposureCompensation',
  1766. Format => 'int16s',
  1767. ValueConv => '$val / 3', # (guess)
  1768. PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
  1769. },
  1770. # Zone - 2 bytes: 0 2 (time zone? focus zone?)
  1771. # FoMD - 2 bytes: 0 0 (focus mode?)
  1772. # Shap - 2 bytes: 0 2 (sharpness?)
  1773. Expo => {
  1774. Name => 'ExposureTime',
  1775. Format => 'rational32u',
  1776. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  1777. },
  1778. FNum => {
  1779. Name => 'FNumber',
  1780. Format => 'int16u',
  1781. ValueConv => '$val / 100',
  1782. PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
  1783. },
  1784. ISOS => { Name => 'ISO', Format => 'int16u' },
  1785. StSV => {
  1786. Name => 'ShutterSpeedValue',
  1787. Format => 'int16s',
  1788. ValueConv => 'abs($val)<100 ? 2**(-$val/3) : 0',
  1789. PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
  1790. },
  1791. AprV => {
  1792. Name => 'ApertureValue',
  1793. Format => 'int16s',
  1794. ValueConv => '2 ** ($val / 2000)',
  1795. PrintConv => 'sprintf("%.1f",$val)',
  1796. },
  1797. BrtV => { # (NC)
  1798. Name => 'BrightnessValue',
  1799. Format => 'int32s',
  1800. ValueConv => '$val / 1000', # (guess)
  1801. },
  1802. FoLn => {
  1803. Name => 'FocalLength',
  1804. Groups => { 2 => 'Camera' },
  1805. Format => 'int16u',
  1806. PrintConv => 'sprintf("%.1f mm",$val)',
  1807. },
  1808. FL35 => {
  1809. Name => 'FocalLengthIn35mmFormat',
  1810. Groups => { 2 => 'Camera' },
  1811. Format => 'int16u',
  1812. PrintConv => '"$val mm"',
  1813. },
  1814. Scrn => {
  1815. Name => 'PreviewInfo',
  1816. SubDirectory => { TagTable => 'Image::ExifTool::Kodak::Scrn' },
  1817. },
  1818. );
  1819. # tags in "frea" atom of Kodak PixPro SP360 MP4 videos (ref PH)
  1820. %Image::ExifTool::Kodak::frea = (
  1821. GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
  1822. NOTES => 'Information stored in the "frea" atom of Kodak PixPro SP360 MP4 videos.',
  1823. # tima - 4 bytes: 0 0 0 0x20
  1824. thma => { Name => 'ThumbnailImage', Groups => { 2 => 'Preview' }, Binary => 1 },
  1825. scra => { Name => 'PreviewImage', Groups => { 2 => 'Preview' }, Binary => 1 },
  1826. );
  1827. # preview information in free/Scrn atom of MP4 videos (ref PH)
  1828. %Image::ExifTool::Kodak::Scrn = (
  1829. GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
  1830. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  1831. FORMAT => 'int16u',
  1832. 0 => 'PreviewImageWidth',
  1833. 1 => 'PreviewImageHeight',
  1834. 2 => { Name => 'PreviewImageLength', Format => 'int32u' },
  1835. 4 => {
  1836. Name => 'PreviewImage',
  1837. Groups => { 2 => 'Preview' },
  1838. Format => 'undef[$val{2}]',
  1839. RawConv => '$self->ValidateImage(\$val, $tag)',
  1840. },
  1841. );
  1842. # Kodak composite tags
  1843. %Image::ExifTool::Kodak::Composite = (
  1844. GROUPS => { 2 => 'Camera' },
  1845. DateCreated => {
  1846. Groups => { 2 => 'Time' },
  1847. Require => {
  1848. 0 => 'Kodak:YearCreated',
  1849. 1 => 'Kodak:MonthDayCreated',
  1850. },
  1851. ValueConv => '"$val[0]:$val[1]"',
  1852. },
  1853. WB_RGBLevels => {
  1854. Require => {
  1855. 0 => 'KDC_IFD:WhiteBalance',
  1856. },
  1857. # indices of the following entries are KDC_IFD:WhiteBalance + 1
  1858. Desire => {
  1859. 1 => 'WB_RGBLevelsAuto',
  1860. 2 => 'WB_RGBLevelsFluorescent',
  1861. 3 => 'WB_RGBLevelsTungsten',
  1862. 4 => 'WB_RGBLevelsDaylight',
  1863. 5 => 'WB_RGBLevels4',
  1864. 6 => 'WB_RGBLevels5',
  1865. 7 => 'WB_RGBLevelsShade',
  1866. },
  1867. ValueConv => '$val[$val[0] + 1]',
  1868. },
  1869. WB_RGBLevels2 => {
  1870. Name => 'WB_RGBLevels',
  1871. Require => {
  1872. 0 => 'KodakIFD:WhiteBalance',
  1873. 1 => 'WB_RGBMul0',
  1874. 2 => 'WB_RGBMul1',
  1875. 3 => 'WB_RGBMul2',
  1876. 4 => 'WB_RGBMul3',
  1877. 5 => 'WB_RGBCoeffs0',
  1878. 6 => 'WB_RGBCoeffs1',
  1879. 7 => 'WB_RGBCoeffs2',
  1880. 8 => 'WB_RGBCoeffs3',
  1881. },
  1882. # indices of the following entries are KDC_IFD:WhiteBalance + 1
  1883. Desire => {
  1884. 9 => 'KodakIFD:ColorTemperature',
  1885. 10 => 'Kodak:WB_RGBLevels',
  1886. },
  1887. ValueConv => 'Image::ExifTool::Kodak::CalculateRGBLevels(@val)',
  1888. },
  1889. );
  1890. # add our composite tags
  1891. Image::ExifTool::AddCompositeTags('Image::ExifTool::Kodak');
  1892. #------------------------------------------------------------------------------
  1893. # Calculate RGB levels from associated tags (ref 3)
  1894. # Inputs: 0) KodakIFD:WhiteBalance, 1-4) WB_RGBMul0-3, 5-8) WB_RGBCoeffs0-3
  1895. # 9) (optional) KodakIFD:ColorTemperature, 10) (optional) Kodak:WB_RGBLevels
  1896. # Returns: WB_RGBLevels or undef
  1897. sub CalculateRGBLevels(@)
  1898. {
  1899. return undef if $_[10]; # use existing software levels if they exist
  1900. my $wbi = $_[0];
  1901. return undef if $wbi < 0 or $wbi > 3;
  1902. my @mul = split ' ', $_[$wbi + 1], 13; # (only use the first 12 coeffs)
  1903. my @coefs = split ' ', ${$_[$wbi + 5]}; # (extra de-reference for Binary data)
  1904. my $wbtemp100 = ($_[9] || 6500) / 100;
  1905. return undef unless @mul >= 3 and @coefs >= 12;
  1906. my ($i, $c, $n, $num, @cam_mul);
  1907. for ($c=$n=0; $c<3; ++$c) {
  1908. for ($num=$i=0; $i<4; ++$i) {
  1909. $num += $coefs[$n++] * ($wbtemp100 ** $i);
  1910. }
  1911. $cam_mul[$c] = 2048 / ($num * $mul[$c]);
  1912. }
  1913. return join(' ', @cam_mul);
  1914. }
  1915. #------------------------------------------------------------------------------
  1916. # Process Kodak textual TextualInfo
  1917. # Inputs: 0) ExifTool object ref, 1) dirInfo hash ref, 2) tag table ref
  1918. # Returns: 1 on success
  1919. sub ProcessKodakText($$$)
  1920. {
  1921. my ($et, $dirInfo, $tagTablePtr) = @_;
  1922. my $dataPt = $$dirInfo{DataPt};
  1923. my $dirStart = $$dirInfo{DirStart} || 0;
  1924. my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart;
  1925. my $data = substr($$dataPt, $dirStart, $dirLen);
  1926. $data =~ s/\0.*//s; # truncate at null if it exists
  1927. my @lines = split /[\n\r]+/, $data;
  1928. my ($line, $success, @other, $tagInfo);
  1929. $et->VerboseDir('Kodak Text');
  1930. foreach $line (@lines) {
  1931. if ($line =~ /(.*?):\s*(.*)/) {
  1932. my ($tag, $val) = ($1, $2);
  1933. if ($$tagTablePtr{$tag}) {
  1934. $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
  1935. } else {
  1936. my $tagName = $tag;
  1937. $tagName =~ s/([A-Z])\s+([A-Za-z])/${1}_\U$2/g;
  1938. $tagName =~ s/([a-z])\s+([A-Za-z0-9])/${1}\U$2/g;
  1939. $tagName =~ s/\s+//g;
  1940. $tagName =~ s/[^-\w]+//g; # delete remaining invalid characters
  1941. $tagName = 'NoName' unless $tagName;
  1942. $tagInfo = { Name => $tagName };
  1943. AddTagToTable($tagTablePtr, $tag, $tagInfo);
  1944. }
  1945. $et->HandleTag($tagTablePtr, $tag, $val, TagInfo => $tagInfo);
  1946. $success = 1;
  1947. } else {
  1948. # strip off leading/trailing white space and ignore blank lines
  1949. push @other, $1 if $line =~ /^\s*(\S.*?)\s*$/;
  1950. }
  1951. }
  1952. if ($success) {
  1953. if (@other) {
  1954. $tagInfo = $et->GetTagInfo($tagTablePtr, '_other_info');
  1955. $et->FoundTag($tagInfo, \@other);
  1956. }
  1957. } else {
  1958. $et->Warn("Can't parse Kodak TextualInfo data", 1);
  1959. }
  1960. return $success;
  1961. }
  1962. #------------------------------------------------------------------------------
  1963. # Process Kodak IFD (with leading byte order mark)
  1964. # Inputs: 0) ExifTool object ref, 1) dirInfo hash ref, 2) tag table ref
  1965. # Returns: 1 on success, otherwise returns 0 and sets a Warning
  1966. sub ProcessKodakIFD($$$)
  1967. {
  1968. my ($et, $dirInfo, $tagTablePtr) = @_;
  1969. my $dirStart = $$dirInfo{DirStart} || 0;
  1970. return 1 if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
  1971. my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2);
  1972. unless (Image::ExifTool::SetByteOrder($byteOrder)) {
  1973. $et->Warn("Invalid Kodak $$dirInfo{Name} directory");
  1974. return 1;
  1975. }
  1976. $$dirInfo{DirStart} += 2; # skip byte order mark
  1977. $$dirInfo{DirLen} -= 2;
  1978. if ($$et{HTML_DUMP}) {
  1979. my $base = $$dirInfo{Base} + $$dirInfo{DataPos};
  1980. $et->HDump($dirStart+$base, 2, "Byte Order Mark");
  1981. }
  1982. return Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
  1983. }
  1984. #------------------------------------------------------------------------------
  1985. # Write Kodak IFD (with leading byte order mark)
  1986. # Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref
  1987. # Returns: Exif data block (may be empty if no Exif data) or undef on error
  1988. sub WriteKodakIFD($$$)
  1989. {
  1990. my ($et, $dirInfo, $tagTablePtr) = @_;
  1991. my $dirStart = $$dirInfo{DirStart} || 0;
  1992. return '' if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
  1993. my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2);
  1994. return '' unless Image::ExifTool::SetByteOrder($byteOrder);
  1995. $$dirInfo{DirStart} += 2; # skip byte order mark
  1996. $$dirInfo{DirLen} -= 2;
  1997. my $buff = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr);
  1998. return $buff unless defined $buff and length $buff;
  1999. # apply one-time fixup for length of byte order mark
  2000. if ($$dirInfo{Fixup}) {
  2001. $dirInfo->{Fixup}->{Shift} += 2;
  2002. $$dirInfo{Fixup}->ApplyFixup(\$buff);
  2003. delete $$dirInfo{Fixup};
  2004. }
  2005. return Image::ExifTool::GetByteOrder() . $buff;
  2006. }
  2007. 1; # end
  2008. __END__
  2009. =head1 NAME
  2010. Image::ExifTool::Kodak - Kodak EXIF maker notes and APP3 "Meta" tags
  2011. =head1 SYNOPSIS
  2012. This module is loaded automatically by Image::ExifTool when required.
  2013. =head1 DESCRIPTION
  2014. This module contains definitions required by Image::ExifTool to
  2015. interpret Kodak maker notes EXIF meta information.
  2016. =head1 AUTHOR
  2017. Copyright 2003-2016, Phil Harvey (phil at owl.phy.queensu.ca)
  2018. This library is free software; you can redistribute it and/or modify it
  2019. under the same terms as Perl itself.
  2020. =head1 REFERENCES
  2021. =over 4
  2022. =item L<Image::MetaData::JPEG|Image::MetaData::JPEG>
  2023. =item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html>
  2024. =item L<http://www.cybercom.net/~dcoffin/dcraw/>
  2025. =item (...plus lots of testing with my daughter's CX4200!)
  2026. =back
  2027. =head1 SEE ALSO
  2028. L<Image::ExifTool::TagNames/Kodak Tags>,
  2029. L<Image::ExifTool(3pm)|Image::ExifTool>
  2030. =cut