~ubuntu-branches/ubuntu/karmic/libimage-exiftool-perl/karmic

« back to all changes in this revision

Viewing changes to lib/Image/ExifTool/Kodak.pm

  • Committer: Bazaar Package Importer
  • Author(s): Mari Wang
  • Date: 2008-02-04 20:32:53 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20080204203253-mpbal8trlfe1fz5d
Tags: 7.00-1
* Upload of new production release (Closes: #456430)
* Added Recommends: libcompress-zlib-perl (Closes: #435589)
* Package now includes iptc2xmp.args and xmp2iptc.args, they are put
  into /usr/share/libimage-exiftool/ (Closes: #436100)
* Updated standards-version (3.7.2 -> 3.7.3). No changes needed.
* Lots of updates and bugfixes compared to last debian version
  (6.90).  See the Changes file for details
* Upload sponsored by Petter Reinholdtsen

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
 
20
20
use strict;
21
21
use vars qw($VERSION);
22
 
 
23
 
$VERSION = '1.08';
24
 
 
 
22
use Image::ExifTool::Exif;
 
23
 
 
24
$VERSION = '1.10';
 
25
 
 
26
sub ProcessKodakIFD($$$);
 
27
sub WriteKodakIFD($$$);
 
28
 
 
29
# Kodak type 1 maker notes (ref 1)
25
30
%Image::ExifTool::Kodak::Main = (
26
31
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
27
32
    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
254
259
    },
255
260
);
256
261
 
 
262
# Kodak type 2 maker notes (ref PH)
257
263
%Image::ExifTool::Kodak::Type2 = (
258
264
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
259
265
    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
266
272
    },
267
273
    WRITABLE => 1,
268
274
    FIRST_ENTRY => 0,
269
 
    0x08 => { #PH
 
275
    0x08 => {
270
276
        Name => 'KodakMaker',
271
277
        Format => 'string[32]',
272
278
    },
273
 
    0x28 => { #PH
 
279
    0x28 => {
274
280
        Name => 'KodakModel',
275
281
        Format => 'string[32]',
276
282
    },
277
 
    0x6c => { #PH
 
283
    0x6c => {
278
284
        Name => 'KodakImageWidth',
279
285
        Format => 'int32u',
280
286
    },
281
 
    0x70 => { #PH
 
287
    0x70 => {
282
288
        Name => 'KodakImageHeight',
283
289
        Format => 'int32u',
284
290
    },
285
291
);
286
292
 
 
293
# Kodak type 3 maker notes (ref PH)
287
294
%Image::ExifTool::Kodak::Type3 = (
288
295
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
289
296
    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
304
311
        ValueConv => 'sprintf("%.2d:%.2d",split(" ", $val))',
305
312
        ValueConvInv => '$val=~tr/:./ /;$val',
306
313
    },
307
 
    0x10 => { #PH
 
314
    0x10 => {
308
315
        Name => 'TimeCreated',
309
316
        Groups => { 2 => 'Time' },
310
317
        Format => 'int8u[4]',
312
319
        ValueConv => 'sprintf("%2d:%.2d:%.2d.%.2d",split(" ", $val))',
313
320
        ValueConvInv => '$val=~tr/:./ /;$val',
314
321
    },
315
 
    0x1e => { #PH
 
322
    0x1e => {
316
323
        Name => 'OpticalZoom',
317
324
        Format => 'int16u',
318
325
        ValueConv => '$val / 100',
319
326
        ValueConvInv => '$val * 100',
320
327
    },
321
 
    0x37 => { #PH
 
328
    0x37 => {
322
329
        Name => 'Sharpness',
323
330
        Format => 'int8s',
324
331
        PrintConv => 'Image::ExifTool::Exif::PrintParameter($val)',
325
332
        PrintConvInv => '$val=~/normal/i ? 0 : $val',
326
333
    },
327
 
    0x38 => { #PH
 
334
    0x38 => {
328
335
        Name => 'ExposureTime',
329
336
        Format => 'int32u',
330
337
        ValueConv => '$val / 1e5',
332
339
        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
333
340
        PrintConvInv => 'eval $val',
334
341
    },
335
 
    0x3c => { #PH
 
342
    0x3c => {
336
343
        Name => 'FNumber',
337
344
        Format => 'int16u',
338
345
        ValueConv => '$val / 100',
339
346
        ValueConvInv => 'int($val * 100 + 0.5)',
340
347
    },
341
 
    0x4e => { #PH
 
348
    0x4e => {
342
349
        Name => 'ISO',
343
350
        Format => 'int16u',
344
351
    },
345
352
);
346
353
 
 
354
# Kodak type 4 maker notes (ref PH)
347
355
%Image::ExifTool::Kodak::Type4 = (
348
356
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
349
357
    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
352
360
    NOTES => 'These tags are used by the DC200 and DC215.',
353
361
    WRITABLE => 1,
354
362
    FIRST_ENTRY => 0,
355
 
    0x20 => { #PH
 
363
    0x20 => {
356
364
        Name => 'OriginalFileName',
357
365
        Format => 'string[12]',
358
366
    },
359
367
);
360
368
 
 
369
# Kodak type 5 maker notes (ref PH)
361
370
%Image::ExifTool::Kodak::Type5 = (
362
371
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
363
372
    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
367
376
    },
368
377
    WRITABLE => 1,
369
378
    FIRST_ENTRY => 0,
370
 
    0x14 => { #PH
 
379
    0x14 => {
371
380
        Name => 'ExposureTime',
372
381
        Format => 'int32u',
373
382
        ValueConv => '$val / 1e5',
375
384
        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
376
385
        PrintConvInv => 'eval $val',
377
386
    },
378
 
    0x1a => { #PH
 
387
    0x1a => {
379
388
        Name => 'WhiteBalance',
380
389
        PrintConv => {
381
390
            1 => 'Daylight',
383
392
            3 => 'Tungsten',
384
393
        },
385
394
    },
386
 
    0x1c => { #PH
 
395
    0x1c => {
387
396
        Name => 'FNumber',
388
397
        Format => 'int16u',
389
398
        ValueConv => '$val / 100',
390
399
        ValueConvInv => 'int($val * 100 + 0.5)',
391
400
    },
392
 
    0x1e => { #PH
 
401
    0x1e => {
393
402
        Name => 'ISO',
394
403
        Format => 'int16u',
395
404
    },
396
 
    0x20 => { #PH
 
405
    0x20 => {
397
406
        Name => 'OpticalZoom',
398
407
        Format => 'int16u',
399
408
        ValueConv => '$val / 100',
400
409
        ValueConvInv => '$val * 100',
401
410
    },
402
 
    0x22 => { #PH
 
411
    0x22 => {
403
412
        Name => 'DigitalZoom',
404
413
        Format => 'int16u',
405
414
        ValueConv => '$val / 100',
406
415
        ValueConvInv => '$val * 100',
407
416
    },
408
 
    0x27 => { #PH
 
417
    0x27 => {
409
418
        Name => 'FlashMode',
410
419
        PrintConv => {
411
420
            0 => 'Auto',
414
423
            3 => 'Red-Eye',
415
424
        },
416
425
    },
417
 
    0x2a => { #PH
 
426
    0x2a => {
418
427
        Name => 'ImageRotated',
419
428
        PrintConv => { 0 => 'No', 1 => 'Yes' },
420
429
    },
421
 
    0x2b => { #PH
 
430
    0x2b => {
422
431
        Name => 'Macro',
423
432
        PrintConv => { 0 => 'On', 1 => 'Off' },
424
433
    },
425
434
);
426
435
 
 
436
# Kodak type 6 maker notes (ref PH)
427
437
%Image::ExifTool::Kodak::Type6 = (
428
438
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
429
439
    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
430
440
    NOTES => 'These tags are used by the DX3215 and DX3700.',
431
441
    WRITABLE => 1,
432
442
    FIRST_ENTRY => 0,
433
 
    0x10 => { #PH
 
443
    0x10 => {
434
444
        Name => 'ExposureTime',
435
445
        Format => 'int32u',
436
446
        ValueConv => '$val / 1e5',
438
448
        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
439
449
        PrintConvInv => 'eval $val',
440
450
    },
441
 
    0x14 => { #PH
 
451
    0x14 => {
442
452
        Name => 'ISOSetting',
443
453
        Format => 'int32u',
444
454
        Unknown => 1,
445
455
    },
446
 
    0x18 => { #PH
 
456
    0x18 => {
447
457
        Name => 'FNumber',
448
458
        Format => 'int16u',
449
459
        ValueConv => '$val / 100',
450
460
        ValueConvInv => 'int($val * 100 + 0.5)',
451
461
    },
452
 
    0x1a => { #PH
 
462
    0x1a => {
453
463
        Name => 'ISO',
454
464
        Format => 'int16u',
455
465
    },
456
 
    0x1c => { #PH
 
466
    0x1c => {
457
467
        Name => 'OpticalZoom',
458
468
        Format => 'int16u',
459
469
        ValueConv => '$val / 100',
460
470
        ValueConvInv => '$val * 100',
461
471
    },
462
 
    0x1e => { #PH
 
472
    0x1e => {
463
473
        Name => 'DigitalZoom',
464
474
        Format => 'int16u',
465
475
        ValueConv => '$val / 100',
466
476
        ValueConvInv => '$val * 100',
467
477
    },
468
 
    0x22 => { #PH
 
478
    0x22 => {
469
479
        Name => 'Flash',
470
480
        Format => 'int16u',
471
481
        PrintConv => {
475
485
    },
476
486
);
477
487
 
 
488
# Kodak type 7 maker notes (ref PH)
 
489
%Image::ExifTool::Kodak::Type7 = (
 
490
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
 
491
    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
 
492
    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
 
493
    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
 
494
    WRITABLE => 1,
 
495
    FIRST_ENTRY => 0,
 
496
    NOTES => q{
 
497
        The maker notes of models such as the C340, C433, CC533, LS755, V803 and
 
498
        V1003 seem to start with the camera serial number.  The C310, C315, C330,
 
499
        C643, C743, CD33, CD43, CX7220 and CX7300 maker notes are also decoded using
 
500
        this table, although the strings for these cameras don't conform to the
 
501
        usual Kodak serial number format, and instead have the model name followed
 
502
        by 8 digits.
 
503
    },
 
504
    0 => { # (not confirmed)
 
505
        Name => 'SerialNumber',
 
506
        Format => 'string[16]',
 
507
        ValueConv => '$val=~s/\s+$//; $val', # remove trailing whitespace
 
508
        ValueConvInv => '$val',
 
509
    },
 
510
);
 
511
 
 
512
# Kodak IFD-format maker notes (ref PH)
 
513
%Image::ExifTool::Kodak::IFD = (
 
514
    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
 
515
    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
 
516
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
 
517
    NOTES => q{
 
518
        Newer Kodak models such as the P712, P850, P880, Z612 and Z712 use standard
 
519
        TIFF IFD format for the maker notes.  There is a large amount of information
 
520
        stored in these maker notes (with apparently much duplication), but
 
521
        relatively few tags have so far been decoded.
 
522
    },
 
523
    0xfc00 => {
 
524
        Name => 'SubIFD0',
 
525
        Groups => { 1 => 'MakerNotes' },    # SubIFD needs group 1 set
 
526
        Flags => 'SubIFD',
 
527
        SubDirectory => {
 
528
            TagTable => 'Image::ExifTool::Kodak::SubIFD0',
 
529
            Start => '$val',
 
530
        },
 
531
    },
 
532
    # SubIFD1 and higher data is preceded by a TIFF byte order mark to indicate
 
533
    # the byte ordering used
 
534
    0xfc01 => {
 
535
        Name => 'SubIFD1',
 
536
        Groups => { 1 => 'MakerNotes' },    # SubIFD needs group 1 set
 
537
        Flags => 'SubIFD',
 
538
        SubDirectory => {
 
539
            TagTable => 'Image::ExifTool::Kodak::SubIFD1',
 
540
            Start => '$val',
 
541
            Base => '$start',
 
542
        },
 
543
    },
 
544
    0xfc02 => {
 
545
        Name => 'SubIFD2',
 
546
        Groups => { 1 => 'MakerNotes' },    # SubIFD needs group 1 set
 
547
        Flags => 'SubIFD',
 
548
        SubDirectory => {
 
549
            TagTable => 'Image::ExifTool::Kodak::SubIFD2',
 
550
            Start => '$val',
 
551
            Base => '$start',
 
552
        },
 
553
    },
 
554
    0xfc03 => {
 
555
        Name => 'SubIFD3',
 
556
        Groups => { 1 => 'MakerNotes' },    # SubIFD needs group 1 set
 
557
        Flags => 'SubIFD',
 
558
        SubDirectory => {
 
559
            TagTable => 'Image::ExifTool::Kodak::SubIFD3',
 
560
            Start => '$val',
 
561
            Base => '$start',
 
562
        },
 
563
    },
 
564
    # (SubIFD4 has the pointer zeroed in my samples, but support it
 
565
    # in case it is used by future models -- ignored if pointer is zero)
 
566
    0xfc04 => {
 
567
        Name => 'SubIFD4',
 
568
        Groups => { 1 => 'MakerNotes' },    # SubIFD needs group 1 set
 
569
        Flags => 'SubIFD',
 
570
        SubDirectory => {
 
571
            TagTable => 'Image::ExifTool::Kodak::SubIFD4',
 
572
            Start => '$val',
 
573
            Base => '$start',
 
574
        },
 
575
    },
 
576
    0xfc05 => {
 
577
        Name => 'SubIFD5',
 
578
        Groups => { 1 => 'MakerNotes' },    # SubIFD needs group 1 set
 
579
        Flags => 'SubIFD',
 
580
        SubDirectory => {
 
581
            TagTable => 'Image::ExifTool::Kodak::SubIFD5',
 
582
            Start => '$val',
 
583
            Base => '$start',
 
584
        },
 
585
    },
 
586
    0xff00 => {
 
587
        Name => 'CameraInfo',
 
588
        Groups => { 1 => 'MakerNotes' },    # SubIFD needs group 1 set
 
589
        Flags => 'SubIFD',
 
590
        SubDirectory => {
 
591
            TagTable => 'Image::ExifTool::Kodak::CameraInfo',
 
592
            Start => '$val',
 
593
        },
 
594
    },
 
595
);
 
596
 
 
597
# Kodak SubIFD0 tags (ref PH)
 
598
%Image::ExifTool::Kodak::SubIFD0 = (
 
599
    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
 
600
    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
 
601
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
 
602
    NOTES => 'SubIFD0 through SubIFD5 tags are used by the Z612 and Z712.',
 
603
    0xfa02 => {
 
604
        Name => 'SceneMode',
 
605
        Writable => 'int16u',
 
606
        PrintConv => {
 
607
            1 => 'Sport',
 
608
            3 => 'Portrait',
 
609
            4 => 'Landscape',
 
610
            6 => 'Beach',
 
611
            7 => 'Night Portrait',
 
612
            8 => 'Night Landscape',
 
613
            9 => 'Snow',
 
614
            10 => 'Text',
 
615
            11 => 'Fireworks',
 
616
            12 => 'Macro',
 
617
            13 => 'Museum',
 
618
            16 => 'Children',
 
619
            17 => 'Program',
 
620
            18 => 'Aperture Priority',
 
621
            19 => 'Shutter Priority',
 
622
            20 => 'Manual',
 
623
            25 => 'Back Light',
 
624
            28 => 'Candlelight',
 
625
            29 => 'Sunset',
 
626
            31 => 'Panorama Left-Right',
 
627
            32 => 'Panorama Right-Left',
 
628
            33 => 'Smart Scene',
 
629
            34 => 'High ISO',
 
630
        },
 
631
    },
 
632
    # 0xfa04 - values: 0 (normally), 2 (panorama shots)
 
633
    # 0xfa0f - values: 0 (normally), 1 (macro?)
 
634
    # 0xfa11 - some sort of FNumber (x 100)
 
635
    0xfa19 => {
 
636
        Name => 'SerialNumber', # (verified with Z712 - PH)
 
637
        Writable => 'string',
 
638
    },
 
639
    0xfa1d => {
 
640
        Name => 'KodakImageWidth',
 
641
        Writable => 'int16u',
 
642
    },
 
643
    0xfa1e => {
 
644
        Name => 'KodakImageHeight',
 
645
        Writable => 'int16u',
 
646
    },
 
647
    0xfa20 => {
 
648
        Name => 'SensorWidth',
 
649
        Writable => 'int16u',
 
650
    },
 
651
    0xfa21 => {
 
652
        Name => 'SensorHeight',
 
653
        Writable => 'int16u',
 
654
    },
 
655
    0xfa23 => {
 
656
        Name => 'FNumber',
 
657
        Writable => 'int16u',
 
658
        Priority => 0,
 
659
        ValueConv => '$val / 100',
 
660
        ValueConvInv => '$val * 100',
 
661
    },
 
662
    0xfa24 => {
 
663
        Name => 'ExposureTime',
 
664
        Writable => 'int32u',
 
665
        Priority => 0,
 
666
        ValueConv => '$val / 1e5',
 
667
        ValueConvInv => '$val * 1e5',
 
668
        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
 
669
        PrintConvInv => 'eval $val',
 
670
    },
 
671
    0xfa2e => {
 
672
        Name => 'ISO',
 
673
        Writable => 'int16u',
 
674
        Priority => 0,
 
675
    },
 
676
    0xfa3d => {
 
677
        Name => 'OpticalZoom',
 
678
        Writable => 'int16u',
 
679
        ValueConv => '$val / 100',
 
680
        ValueConvInv => '$val * 100',
 
681
        PrintConv => 'sprintf("%.2f",$val)',
 
682
        PrintConvInv => '$val=~s/ ?x//; $val',
 
683
    },
 
684
    0xfa46 => {
 
685
        Name => 'ISO',
 
686
        Writable => 'int16u',
 
687
        Priority => 0,
 
688
    },
 
689
    # 0xfa4c - related to focal length (1=wide, 32=full zoom)
 
690
    0xfa51 => {
 
691
        Name => 'KodakImageWidth',
 
692
        Writable => 'int16u',
 
693
    },
 
694
    0xfa52 => {
 
695
        Name => 'KodakImageHeight',
 
696
        Writable => 'int16u',
 
697
    },
 
698
    0xfa54 => {
 
699
        Name => 'ThumbnailWidth',
 
700
        Writable => 'int16u',
 
701
    },
 
702
    0xfa55 => {
 
703
        Name => 'ThumbnailHeight',
 
704
        Writable => 'int16u',
 
705
    },
 
706
    0xfa57 => {
 
707
        Name => 'PreviewWidth',
 
708
        Writable => 'int16u',
 
709
    },
 
710
    0xfa58 => {
 
711
        Name => 'PreviewHeight',
 
712
        Writable => 'int16u',
 
713
    },
 
714
);
 
715
 
 
716
# Kodak SubIFD1 tags (ref PH)
 
717
%Image::ExifTool::Kodak::SubIFD1 = (
 
718
    PROCESS_PROC => \&ProcessKodakIFD,
 
719
    WRITE_PROC => \&WriteKodakIFD,
 
720
    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
 
721
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
 
722
    0x0027 => {
 
723
        Name => 'ISO',
 
724
        Writable => 'int16u',
 
725
        Priority => 0,
 
726
    },
 
727
    0x0028 => {
 
728
        Name => 'ISO',
 
729
        Writable => 'int16u',
 
730
        Priority => 0,
 
731
    },
 
732
);
 
733
 
 
734
my %sceneModeUsed = (
 
735
    0 => 'Program',
 
736
    2 => 'Aperture Priority',
 
737
    3 => 'Shutter Priority',
 
738
    4 => 'Manual',
 
739
    5 => 'Portrait',
 
740
    6 => 'Sport',
 
741
    7 => 'Children',
 
742
    8 => 'Museum',
 
743
    10 => 'High ISO',
 
744
    11 => 'Text',
 
745
    12 => 'Macro',
 
746
    13 => 'Back Light',
 
747
    16 => 'Landscape',
 
748
    17 => 'Night Landscape',
 
749
    18 => 'Night Portrait',
 
750
    19 => 'Snow',
 
751
    20 => 'Beach',
 
752
    21 => 'Fireworks',
 
753
    22 => 'Sunset',
 
754
    23 => 'Candlelight',
 
755
    28 => 'Panorama',
 
756
);
 
757
 
 
758
# Kodak SubIFD2 tags (ref PH)
 
759
%Image::ExifTool::Kodak::SubIFD2 = (
 
760
    PROCESS_PROC => \&ProcessKodakIFD,
 
761
    WRITE_PROC => \&WriteKodakIFD,
 
762
    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
 
763
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
 
764
    0x6002 => {
 
765
        Name => 'SceneModeUsed',
 
766
        Writable => 'int32u',
 
767
        PrintConv => \%sceneModeUsed,
 
768
    },
 
769
    0x6006 => {
 
770
        Name => 'OpticalZoom',
 
771
        Writable => 'int32u',
 
772
        ValueConv => '$val / 100',
 
773
        ValueConvInv => '$val * 100',
 
774
        PrintConv => 'sprintf("%.2f",$val)',
 
775
        PrintConvInv => '$val=~s/ ?x//; $val',
 
776
    },
 
777
    # 0x6009 - some sort of FNumber (x 100)
 
778
    0x6103 => {
 
779
        Name => 'MaxAperture',
 
780
        Writable => 'int32u',
 
781
        ValueConv => '$val / 100',
 
782
        ValueConvInv => '$val * 100',
 
783
    },
 
784
    0xf002 => {
 
785
        Name => 'SceneModeUsed',
 
786
        Writable => 'int32u',
 
787
        PrintConv => \%sceneModeUsed,
 
788
    },
 
789
    0xf006 => {
 
790
        Name => 'OpticalZoom',
 
791
        Writable => 'int32u',
 
792
        ValueConv => '$val / 100',
 
793
        ValueConvInv => '$val * 100',
 
794
        PrintConv => 'sprintf("%.2f",$val)',
 
795
        PrintConvInv => '$val=~s/ ?x//; $val',
 
796
    },
 
797
    # 0xf009 - some sort of FNumber (x 100)
 
798
    0xf103 => {
 
799
        Name => 'FNumber',
 
800
        Writable => 'int32u',
 
801
        Priority => 0,
 
802
        ValueConv => '$val / 100',
 
803
        ValueConvInv => '$val * 100',
 
804
    },
 
805
    0xf104 => {
 
806
        Name => 'ExposureTime',
 
807
        Writable => 'int32u',
 
808
        Priority => 0,
 
809
        ValueConv => '$val / 1e6',
 
810
        ValueConvInv => '$val * 1e6',
 
811
        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
 
812
        PrintConvInv => 'eval $val',
 
813
    },
 
814
    0xf105 => {
 
815
        Name => 'ISO',
 
816
        Writable => 'int32u',
 
817
        Priority => 0,
 
818
        ValueConv => '$val / 10',
 
819
        ValueConvInv => '$val * 10',
 
820
    },
 
821
);
 
822
 
 
823
# Kodak SubIFD3 tags (ref PH)
 
824
%Image::ExifTool::Kodak::SubIFD3 = (
 
825
    PROCESS_PROC => \&ProcessKodakIFD,
 
826
    WRITE_PROC => \&WriteKodakIFD,
 
827
    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
 
828
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
 
829
    0x1000 => {
 
830
        Name => 'OpticalZoom',
 
831
        Writable => 'int16u',
 
832
        ValueConv => '$val / 100',
 
833
        ValueConvInv => '$val * 100',
 
834
        PrintConv => 'sprintf("%.2f",$val)',
 
835
        PrintConvInv => '$val=~s/ ?x//; $val',
 
836
    },
 
837
    # 0x1002 - related to focal length (1=wide, 32=full zoom)
 
838
    # 0x1006 - pictures remaining? (gradually decreases as pictures are taken)
 
839
);
 
840
 
 
841
# Kodak SubIFD4 tags (ref PH)
 
842
%Image::ExifTool::Kodak::SubIFD4 = (
 
843
    PROCESS_PROC => \&ProcessKodakIFD,
 
844
    WRITE_PROC => \&WriteKodakIFD,
 
845
    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
 
846
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
 
847
);
 
848
 
 
849
# Kodak SubIFD5 tags (ref PH)
 
850
%Image::ExifTool::Kodak::SubIFD5 = (
 
851
    PROCESS_PROC => \&ProcessKodakIFD,
 
852
    WRITE_PROC => \&WriteKodakIFD,
 
853
    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
 
854
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
 
855
    0x000f => {
 
856
        Name => 'OpticalZoom',
 
857
        Writable => 'int16u',
 
858
        ValueConv => '$val / 100',
 
859
        ValueConvInv => '$val * 100',
 
860
        PrintConv => 'sprintf("%.2f",$val)',
 
861
        PrintConvInv => '$val=~s/ ?x//; $val',
 
862
    },
 
863
);
 
864
 
 
865
# Decoded from P712, P850 and P880 samples (ref PH)
 
866
%Image::ExifTool::Kodak::CameraInfo = (
 
867
    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
 
868
    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
 
869
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
 
870
    NOTES => 'These tags are used by the  P712, P850 and P880.',
 
871
    0xf900 => {
 
872
        Name => 'SensorWidth',
 
873
        Writable => 'int16u',
 
874
        Notes => 'effective sensor size',
 
875
    },
 
876
    0xf901 => {
 
877
        Name => 'SensorHeight',
 
878
        Writable => 'int16u',
 
879
    },
 
880
    0xf902 => {
 
881
        Name => 'BayerPattern',
 
882
        Writable => 'string',
 
883
    },
 
884
    0xf903 => {
 
885
        Name => 'SensorFullWidth',
 
886
        Writable => 'int16u',
 
887
        Notes => 'includes black border?',
 
888
    },
 
889
    0xf904 => {
 
890
        Name => 'SensorFullHeight',
 
891
        Writable => 'int16u',
 
892
    },
 
893
    0xf907 => {
 
894
        Name => 'KodakImageWidth',
 
895
        Writable => 'int16u',
 
896
    },
 
897
    0xf908 => {
 
898
        Name => 'KodakImageHeight',
 
899
        Writable => 'int16u',
 
900
    },
 
901
    0xfa00 => {
 
902
        Name => 'KodakInfoType',
 
903
        Writable => 'string',
 
904
    },
 
905
    0xfa04 => {
 
906
        Name => 'SerialNumber', # (unverified)
 
907
        Writable => 'string',
 
908
    },
 
909
    0xfd04 => {
 
910
        Name => 'FNumber',
 
911
        Writable => 'int16u',
 
912
        Priority => 0,
 
913
        ValueConv => '$val / 100',
 
914
        ValueConvInv => '$val * 100',
 
915
    },
 
916
    0xfd05 => {
 
917
        Name => 'ExposureTime',
 
918
        Writable => 'int32u',
 
919
        Priority => 0,
 
920
        ValueConv => '$val / 1e6',
 
921
        ValueConvInv => '$val * 1e6',
 
922
        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
 
923
        PrintConvInv => 'eval $val',
 
924
    },
 
925
    0xfd06 => {
 
926
        Name => 'ISO',
 
927
        Writable => 'int16u',
 
928
        Priority => 0,
 
929
    },
 
930
);
 
931
 
 
932
# treat unknown maker notes as binary data (allows viewing with -U)
478
933
%Image::ExifTool::Kodak::Unknown = (
479
934
    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
480
935
    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
586
1041
# add our composite tags
587
1042
Image::ExifTool::AddCompositeTags('Image::ExifTool::Kodak');
588
1043
 
 
1044
#------------------------------------------------------------------------------
 
1045
# Process Kodak IFD (with leading byte order mark)
 
1046
# Inputs: 0) ExifTool object ref, 1) dirInfo hash ref, 2) tag table ref
 
1047
# Returns: 1 on success, otherwise returns 0 and sets a Warning
 
1048
sub ProcessKodakIFD($$$)
 
1049
{
 
1050
    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
 
1051
    my $dirStart = $$dirInfo{DirStart} || 0;
 
1052
    return 1 if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
 
1053
    my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2);
 
1054
    return 1 unless Image::ExifTool::SetByteOrder($byteOrder);
 
1055
    $$dirInfo{DirStart} += 2;   # skip byte order mark
 
1056
    $$dirInfo{DirLen} -= 2;
 
1057
    if ($exifTool->{HTML_DUMP}) {
 
1058
        my $base = $$dirInfo{Base} + $$dirInfo{DataPos};
 
1059
        $exifTool->HtmlDump($dirStart+$base, 2, "Byte Order Mark");
 
1060
    }
 
1061
    return Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
 
1062
}
 
1063
 
 
1064
#------------------------------------------------------------------------------
 
1065
# Write Kodak IFD (with leading byte order mark)
 
1066
# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref
 
1067
# Returns: Exif data block (may be empty if no Exif data) or undef on error
 
1068
sub WriteKodakIFD($$$)
 
1069
{
 
1070
    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
 
1071
    my $dirStart = $$dirInfo{DirStart} || 0;
 
1072
    return '' if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
 
1073
    my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2);
 
1074
    return '' unless Image::ExifTool::SetByteOrder($byteOrder);
 
1075
    $$dirInfo{DirStart} += 2;   # skip byte order mark
 
1076
    $$dirInfo{DirLen} -= 2;
 
1077
    my $buff = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
 
1078
    return $buff unless defined $buff and length $buff;
 
1079
    # apply one-time fixup for length of byte order mark
 
1080
    if ($$dirInfo{Fixup}) {
 
1081
        $dirInfo->{Fixup}->{Shift} += 2;
 
1082
        $$dirInfo{Fixup}->ApplyFixup(\$buff);
 
1083
        delete $$dirInfo{Fixup};
 
1084
    }
 
1085
    return Image::ExifTool::GetByteOrder() . $buff;
 
1086
}
 
1087
 
589
1088
1;  # end
590
1089
 
591
1090
__END__