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,
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
504
0 => { # (not confirmed)
505
Name => 'SerialNumber',
506
Format => 'string[16]',
507
ValueConv => '$val=~s/\s+$//; $val', # remove trailing whitespace
508
ValueConvInv => '$val',
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' },
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.
525
Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
528
TagTable => 'Image::ExifTool::Kodak::SubIFD0',
532
# SubIFD1 and higher data is preceded by a TIFF byte order mark to indicate
533
# the byte ordering used
536
Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
539
TagTable => 'Image::ExifTool::Kodak::SubIFD1',
546
Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
549
TagTable => 'Image::ExifTool::Kodak::SubIFD2',
556
Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
559
TagTable => 'Image::ExifTool::Kodak::SubIFD3',
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)
568
Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
571
TagTable => 'Image::ExifTool::Kodak::SubIFD4',
578
Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
581
TagTable => 'Image::ExifTool::Kodak::SubIFD5',
587
Name => 'CameraInfo',
588
Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
591
TagTable => 'Image::ExifTool::Kodak::CameraInfo',
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.',
605
Writable => 'int16u',
611
7 => 'Night Portrait',
612
8 => 'Night Landscape',
620
18 => 'Aperture Priority',
621
19 => 'Shutter Priority',
626
31 => 'Panorama Left-Right',
627
32 => 'Panorama Right-Left',
632
# 0xfa04 - values: 0 (normally), 2 (panorama shots)
633
# 0xfa0f - values: 0 (normally), 1 (macro?)
634
# 0xfa11 - some sort of FNumber (x 100)
636
Name => 'SerialNumber', # (verified with Z712 - PH)
637
Writable => 'string',
640
Name => 'KodakImageWidth',
641
Writable => 'int16u',
644
Name => 'KodakImageHeight',
645
Writable => 'int16u',
648
Name => 'SensorWidth',
649
Writable => 'int16u',
652
Name => 'SensorHeight',
653
Writable => 'int16u',
657
Writable => 'int16u',
659
ValueConv => '$val / 100',
660
ValueConvInv => '$val * 100',
663
Name => 'ExposureTime',
664
Writable => 'int32u',
666
ValueConv => '$val / 1e5',
667
ValueConvInv => '$val * 1e5',
668
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
669
PrintConvInv => 'eval $val',
673
Writable => 'int16u',
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',
686
Writable => 'int16u',
689
# 0xfa4c - related to focal length (1=wide, 32=full zoom)
691
Name => 'KodakImageWidth',
692
Writable => 'int16u',
695
Name => 'KodakImageHeight',
696
Writable => 'int16u',
699
Name => 'ThumbnailWidth',
700
Writable => 'int16u',
703
Name => 'ThumbnailHeight',
704
Writable => 'int16u',
707
Name => 'PreviewWidth',
708
Writable => 'int16u',
711
Name => 'PreviewHeight',
712
Writable => 'int16u',
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' },
724
Writable => 'int16u',
729
Writable => 'int16u',
734
my %sceneModeUsed = (
736
2 => 'Aperture Priority',
737
3 => 'Shutter Priority',
748
17 => 'Night Landscape',
749
18 => 'Night Portrait',
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' },
765
Name => 'SceneModeUsed',
766
Writable => 'int32u',
767
PrintConv => \%sceneModeUsed,
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',
777
# 0x6009 - some sort of FNumber (x 100)
779
Name => 'MaxAperture',
780
Writable => 'int32u',
781
ValueConv => '$val / 100',
782
ValueConvInv => '$val * 100',
785
Name => 'SceneModeUsed',
786
Writable => 'int32u',
787
PrintConv => \%sceneModeUsed,
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',
797
# 0xf009 - some sort of FNumber (x 100)
800
Writable => 'int32u',
802
ValueConv => '$val / 100',
803
ValueConvInv => '$val * 100',
806
Name => 'ExposureTime',
807
Writable => 'int32u',
809
ValueConv => '$val / 1e6',
810
ValueConvInv => '$val * 1e6',
811
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
812
PrintConvInv => 'eval $val',
816
Writable => 'int32u',
818
ValueConv => '$val / 10',
819
ValueConvInv => '$val * 10',
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' },
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',
837
# 0x1002 - related to focal length (1=wide, 32=full zoom)
838
# 0x1006 - pictures remaining? (gradually decreases as pictures are taken)
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' },
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' },
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',
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.',
872
Name => 'SensorWidth',
873
Writable => 'int16u',
874
Notes => 'effective sensor size',
877
Name => 'SensorHeight',
878
Writable => 'int16u',
881
Name => 'BayerPattern',
882
Writable => 'string',
885
Name => 'SensorFullWidth',
886
Writable => 'int16u',
887
Notes => 'includes black border?',
890
Name => 'SensorFullHeight',
891
Writable => 'int16u',
894
Name => 'KodakImageWidth',
895
Writable => 'int16u',
898
Name => 'KodakImageHeight',
899
Writable => 'int16u',
902
Name => 'KodakInfoType',
903
Writable => 'string',
906
Name => 'SerialNumber', # (unverified)
907
Writable => 'string',
911
Writable => 'int16u',
913
ValueConv => '$val / 100',
914
ValueConvInv => '$val * 100',
917
Name => 'ExposureTime',
918
Writable => 'int32u',
920
ValueConv => '$val / 1e6',
921
ValueConvInv => '$val * 1e6',
922
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
923
PrintConvInv => 'eval $val',
927
Writable => 'int16u',
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');
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($$$)
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");
1061
return Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
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($$$)
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};
1085
return Image::ExifTool::GetByteOrder() . $buff;