diff --git a/components/fpexif/examples/metadata_viewer/mdvmain.lfm b/components/fpexif/examples/metadata_viewer/mdvmain.lfm
index 299c3a164..541525009 100644
--- a/components/fpexif/examples/metadata_viewer/mdvmain.lfm
+++ b/components/fpexif/examples/metadata_viewer/mdvmain.lfm
@@ -1,7 +1,7 @@
object MainForm: TMainForm
- Left = 579
+ Left = 430
Height = 714
- Top = 200
+ Top = 141
Width = 926
Caption = 'Metadata viewer'
ClientHeight = 714
diff --git a/components/fpexif/fpemakernote.pas b/components/fpexif/fpemakernote.pas
index b25c805ca..94e4d3b9c 100644
--- a/components/fpexif/fpemakernote.pas
+++ b/components/fpexif/fpemakernote.pas
@@ -6,7 +6,7 @@ unit fpeMakerNote;
interface
uses
- fpeMakerNoteCanonCasio, fpeMakerNoteEpson, fpeMakerNoteFuji,
+ fpeMakerNoteCanon, fpeMakerNoteCasio, fpeMakerNoteEpson, fpeMakerNoteFuji,
fpeMakerNoteMinolta, fpeMakerNoteNikon, fpeMakerNoteOlympus,
fpeMakerNoteSanyo;
diff --git a/components/fpexif/fpemakernotecanoncasio.pas b/components/fpexif/fpemakernotecanon.pas
similarity index 53%
rename from components/fpexif/fpemakernotecanoncasio.pas
rename to components/fpexif/fpemakernotecanon.pas
index 2e2a888e1..9412e8d6e 100644
--- a/components/fpexif/fpemakernotecanoncasio.pas
+++ b/components/fpexif/fpemakernotecanon.pas
@@ -1,6 +1,6 @@
-{ This maker note reader can handle CANON and CASIO cameras. }
+{ This maker note reader can handle CANON cameras. }
-unit fpeMakerNoteCanonCasio;
+unit fpeMakerNoteCanon;
{$mode objfpc}{$H+}
@@ -18,13 +18,6 @@ type
procedure GetTagDefs({%H-}AStream: TStream); override;
end;
- TCasioMakerNoteReader = class(TMakerNoteReader)
- protected
- FVersion: Integer;
- procedure GetTagDefs({%H-}AStream: TStream); override;
- function Prepare(AStream: TStream): Boolean; override;
- end;
-
implementation
@@ -32,7 +25,6 @@ uses
fpeStrConsts, fpeUtils, fpeExifData;
resourcestring
- // Canon
rsCanonAELkup = '0:Normal AE,1:Exposure compensation,2:AE lock,'+
'3:AE lock + Exposure compensation,4:No AE';
{
@@ -97,59 +89,10 @@ resourcestring
'14:Daylight fluorescent,17:Under water';
rsCanonZoomLkup = '0:None,1:2x,2:4x,3:Other';
- // Casio
- rsCasioAFMode2Lkup = '0:Off,1:Spot,2:Multi,3:Face detection,4:Tracking,5:Intelligent';
- rsCasioArtMode2Lkup = '0:Normal,8:Silent movie,39:HDR,45:Premium auto,' +
- '47:Painting,49:Crayon drawing,51:Panorama,52:Art HDR,62:High Speed night shot,'+
- '64:Monochrome,67:Toy camera,68:Pop art,69:Light tone';
- rsCasioAutoIso2Lkup = '1:On,2:Off,7:On (high sensitivity),8:On (anti-shake),'+
- '10:High Speed';
- rsCasioCCDSensitivityLkup = '64:Normal,125:+1.0,250:+2.0,244:+3.0,80:Normal,'+
- '100:High';
- rsCasioColorFilter2Lkup = '0:Off,1:Blue,3:Green,4:Yellow,5:Red,6:Purple,7:Pink';
- rsCasioColorMode2Lkup = '0:Off,2:Black & White,3:Sepia';
- rsCasioDigitalZoomLkup = '$10000:Off,$10001:2x Digital zoom,'+
- '$20000:2x digital zoom,$40000:4x digital zoom';
- rsCasioDriveMode2Lkup = '0:Single shot,1:Continuous shooting,'+
- '2:Continuous (2 fps),3:Continuous (3 fps),4:Continuous (4 fps),'+
- '5:Continuous (5 fps),6:Continuous (6 fps),7:Continuous (7 fps),'+
- '10:Continuous (10 fps),12:Continuous (12 fps),15:Continuous (15 fps),'+
- '20:Continuous (20 fps),30:Continuous (30 fps),40:Continuous (40 fps),'+
- '60:Continuous (60 fps),240:Auto-N';
- rsCasioEnhancement2Lkup = '0:Off,1:Scenery,3:Green,5:Underwater,9:Flesh tones';
- rsCasioFlashIntensityLkup = '11:Weak,13:Normal,15:Strong';
- rsCasioFlashModeLkup = '1:Auto,2:On,3:Off,4:Red-eye reduction';
- rsCasioFocusingModeLkup = '2:Macro,3:Auto focus,4:Manual focus,5:Infinity';
- rsCasioFocusMode2Lkup = '0:Normal,1:Macro';
- rsCasioFocusMode22Lkup = '0:Manual,1:Focus lock,2:Macro,3:Single-area auto focus,'+
- '5:Infinity,6:Multi-area auto focus,8:Super macro';
- rsCasioImageSize2Lkup = '0:640 x 480,4:1600 x 1200,5:2048 x 1536,'+
- '20:2288 x 1712,21:2592 x 1944,22:2304 x 1728,36:3008 x 2008';
- rsCasioImageStabilization2Lkup = '0:Off,1:On,2:Best shot,3:Movie anti-shake';
- rsCasioISOSpeed2Lkup = '3 = 50,4:64,6:100,9:200';
- rsCasioLightingMode2Lkup = '0:Off,1:High dynamic range,5:Shadow enhance low,'+
- '6:Shadow enhance high';
- rsCasioPortraitRefiner2Lkup = '0:Off,1:+1,2:+2';
- rsCasioRecordingModeLkup = '1:Single shutter,2:Panorama,3:Night scene,'+
- '4:Portrait,5:Landscape';
- rsCasioRecordMode2Lkup = '2:Program AE,3:Shutter priority,4:Aperture priority,'+
- '5:Manual,6:Best shot,17:Movie,19:Movie (19),20:YouTube Movie';
- rsCasioReleaseMode2Lkup = '1:Normal,3:AE Bracketing,11:WB Bracketing,'+
- '13 = Contrast Bracketing,19:High Speed Burst';
- rsCasioSharpness2Lkup = '0:Soft,1:Normal,2:Hard';
- rsCasioSpecialEffectSetting2Lkup = '0:Off,1:Makeup,2:Mist removal,'+
- '3:Vivid landscape,16:Art shot';
- rsCasioVideoQuality2Lkup = '1:Standard,3:HD (720p),4:Full HD (1080p),5:Low';
- rsCasioWhiteBalanceLkup = '1:Auto,2:Tungsten,3:Daylight,4:Fluorescent,'+
- '5:Shade,129:Manual';
- rsCasioWhiteBalance2Lkup = '0:Auto,1:Daylight,2:Shade,3:Tungsten,4:Fluorescent,5:Manual';
- rsCasioWhiteBalance22Lkup = '0:Manual,1:Daylight,2:Cloudy,3:Shade,4:Flash?,'+
- '6:Fluorescent,9:Tungsten?,10:Tungsten,12:Flash';
-
-const
- M = DWord(TAGPARENT_MAKERNOTE);
procedure BuildCanonTagDefs(AList: TTagDefList);
+const
+ M = DWord(TAGPARENT_MAKERNOTE);
begin
Assert(AList <> nil);
with AList do begin
@@ -165,100 +108,6 @@ begin
end;
end;
-{ Casio Type 1
- Standard TIFF IFD Data using Casio Type 1 Tags but always uses
- Motorola (Big-Endian) byte alignment
- This makernote has no header - the IFD starts immediately
- Ref.: http://www.ozhiker.com/electronics/pjmt/jpeg_info/casio_mn.html }
-procedure BuildCasio1TagDefs(AList: TTagDefList);
-begin
- Assert(AList <> nil);
- with AList do begin
- AddUShortTag(M+$0001, 'RecordingMode', 1, '', rsCasioRecordingModeLkup);
- AddUShortTag(M+$0002, 'Quality', 1, '', rsEconomyNormalFine1);
- AddUShortTag(M+$0003, 'FocusingMode', 1, '', rsCasioFocusingModeLkup);
- AddUShortTag(M+$0004, 'FlashMode', 1, '', rsCasioFlashModeLkup);
- AddUShortTag(M+$0005, 'FlashIntensity', 1, '', rsCasioFlashIntensityLkup);
- AddULongTag (M+$0006, 'ObjectDistance', 1, '', '', '%d mm');
- AddUShortTag(M+$0007, 'WhiteBalance', 1, '', rsCasioWhiteBalanceLkup);
- AddULongTag (M+$000A, 'DigitalZoom', 1, '', rsCasioDigitalZoomLkup);
- AddUShortTag(M+$000B, 'Sharpness', 1, '', rsNormalSoftHard);
- AddUShortTag(M+$000C, 'Contrast', 1, '', rsNormalLowHigh);
- AddUShortTag(M+$000D, 'Saturation', 1, '', rsNormalLowHigh);
- AddUShortTag(M+$000A, 'DigitalZoom', 1, '', rsCasioDigitalZoomLkup);
- AddUShortTag(M+$0014, 'CCDSensitivity', 1, '', rsCasioCCDSensitivityLkup);
- end;
-end;
-
-{ Case Type 2
- Header: 6 Bytes "QVC\x00\x00\x00"
- IFD Data: Standard TIFF IFD Data using Casio Type 2 Tags but always uses
- Motorola (Big-Endian) Byte Alignment.
- All EXIF offsets are relative to the start of the TIFF header at the
- beginning of the EXIF segment
- Ref.: http://www.ozhiker.com/electronics/pjmt/jpeg_info/casio_mn.html
- http://www.exiv2.org/tags-casio.html
- https://sno.phy.queensu.ca/~phil/exiftool/TagNames/Casio.html#Type2
-}
-procedure BuildCasio2TagDefs(AList: TTagDefList);
-begin
- Assert(AList <> nil);
- with AList do begin
- AddUShortTag (M+$0002, 'PreviewImageSize', 2); // width and height, in pixels
- AddULongTag (M+$0003, 'PreviewImageLength');
- AddULongTag (M+$0004, 'PreviewImageStart');
- AddUShortTag (M+$0008, 'QualityMode', 1, '', rsEconomyNormalFine);
- AddUShortTag (M+$0009, 'ImageSize', 1, '', rsCasioImageSize2Lkup);
- AddUShortTag (M+$000D, 'FocusMode', 1, '', rsCasioFocusMode2Lkup);
- AddUShortTag (M+$0014, 'ISOSpeed', 1, '', rsCasioISOSpeed2Lkup);
- AddUShortTag (M+$0019, 'WhiteBalance', 1, '', rsCasioWhiteBalance2Lkup);
- AddURationalTag(M+$001D, 'FocalLength');
- AddUShortTag (M+$001F, 'Saturation', 1, '', rsLowNormalHigh);
- AddUShortTag (M+$0020, 'Contrast', 1, '', rsLowNormalHigh);
- AddUShortTag (M+$0021, 'Sharpness', 1, '', rsCasioSharpness2Lkup);
- AddBinaryTag (M+$0E00, 'PrintIM');
- AddBinaryTag (M+$2000, 'PreviewImage');
- AddStringTag (M+$2001, 'FirwareDate', 18);
- AddUShortTag (M+$2011, 'WhiteBalanceBias', 2);
- AddUShortTag (M+$2012, 'WhiteBalance2', 2, '', rsCasioWhiteBalance22Lkup);
- AddUShortTag (M+$2021, 'AFPointPosition', 4);
- AddULongTag (M+$2022, 'ObjectDistance');
- AddUShortTag (M+$2034, 'FlashDistance');
- AddByteTag (M+$2076, 'SpecialEffectMode', 3); // to do: array lkup - should be: '0 0 0' = Off,'1 0 0' = Makeup,'2 0 0' = Mist Removal,'3 0 0' = Vivid Landscape
- AddBinaryTag (M+$2089, 'FaceInfo');
- AddByteTag (M+$211C, 'FacesDetected');
- AddUShortTag (M+$3000, 'RecordMode', 1, '', rsCasioRecordMode2Lkup);
- AddUShortTag (M+$3001, 'ReleaseMode', 1, '', rsCasioReleaseMode2Lkup);
- AddUShortTag (M+$3002, 'Quality', 1, '', rsEconomyNormalFine1);
- AddUShortTag (M+$3003, 'FocusMode2', 1, '', rsCasioFocusMode2Lkup);
- AddStringTag (M+$3006, 'HometownCity');
- AddUShortTag (M+$3007, 'BestShotMode'); // Lkup depends severly on camera model
- AddUShortTag (M+$3008, 'AutoISO', 1, '', rsCasioAutoIso2Lkup);
- AddUShortTag (M+$3009, 'AFMode', 1, '', rsCasioAFMode2Lkup);
- AddBinaryTag (M+$3011, 'Sharpness2');
- AddBinaryTag (M+$3012, 'Contrast2');
- AddBinaryTag (M+$3013, 'Saturation2');
- AddUShortTag (M+$3014, 'ISO');
- AddUShortTag (M+$3015, 'ColorMode', 1, '', rsCasioColorMode2Lkup);
- AddUShortTag (M+$3016, 'Enhancement', 1, '', rsCasioEnhancement2Lkup);
- AddUShortTag (M+$3017, 'ColorFilter', 1, '', rsCasioColorFilter2Lkup);
- AddUShortTag (M+$301B, 'ArtMode', 1, '', rsCasioArtMode2Lkup);
- AddUShortTag (M+$301C, 'SequenceNumber');
- AddUShortTag (M+$301D, 'BracketSequence', 2);
- AddUShortTag (M+$3020, 'ImageStabilization', 1, '', rsCasioImageStabilization2Lkup);
- AddUShortTag (M+$302A, 'LightingMode', 1, '', rsCasioLightingMode2Lkup);
- AddUShortTag (M+$302B, 'PortraitRefiner', 1, '', rsCasioPortraitRefiner2Lkup);
- AddUShortTag (M+$3030, 'SpecialEffectLevel');
- AddUShortTag (M+$3031, 'SpecialEffectSetting', 1, '', rsCasioSpecialEffectSetting2Lkup);
- AddUShortTag (M+$3103, 'DriveMode', 1, '', rsCasioDriveMode2Lkup);
- AddBinaryTag (M+$310B, 'ArtModeParameters', 3);
- AddUShortTag (M+$4001, 'CaptureFrameRate');
- AddUShortTag (M+$4003, 'VideoQuality', 1, '', rsCasioVideoQuality2Lkup);
-
- // to do...
- end;
-end;
-
//==============================================================================
// TCanonMakerNoteReader
@@ -405,50 +254,12 @@ end;
procedure TCanonMakerNoteReader.GetTagDefs(AStream: TStream);
begin
- if Uppercase(FMake) = 'CANON' then
- BuildCanonTagDefs(FTagDefs);
-end;
-
-
-//==============================================================================
-// TCasioMakerNoteReader
-//==============================================================================
-
-function TCasioMakerNoteReader.Prepare(AStream: TStream): Boolean;
-var
- p: Int64;
- hdr: Array[0..5] of ansichar;
-begin
- Result := false;
-
- p := AStream.Position;
- AStream.Read({%H-}hdr[0], SizeOf(hdr));
- if (hdr[0] = 'Q') and (hdr[1] = 'V') and (hdr[2] = 'C') and
- (hdr[3] = #0) and (hdr[4] = #0) and (hdr[5] = #0)
- then begin
- FVersion := 2;
- BuildCasio2TagDefs(FTagDefs);
- AStream.Position := p + SizeOf(hdr);
- end else
- begin
- FVersion := 1;
- BuildCasio1TagDefs(FTagDefs);
- AStream.Position := p;
- end;
-
- FBigEndian := true;
- Result := true;
-end;
-
-procedure TCasioMakerNoteReader.GetTagDefs(AStream: TStream);
-begin
- if Uppercase(FMake) = 'CASIO' then
- BuildCasio1TagDefs(FTagDefs);
+ BuildCanonTagDefs(FTagDefs);
end;
initialization
- RegisterMakerNoteReader(TCanonMakerNoteReader, 'Canon;Casio', '');
+ RegisterMakerNoteReader(TCanonMakerNoteReader, 'Canon', '');
end.
diff --git a/components/fpexif/fpemakernotecasio.pas b/components/fpexif/fpemakernotecasio.pas
new file mode 100644
index 000000000..ad5b32b27
--- /dev/null
+++ b/components/fpexif/fpemakernotecasio.pas
@@ -0,0 +1,230 @@
+unit fpeMakerNoteCasio;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils,
+ fpeGlobal, fpeTags, fpeExifReadWrite;
+
+type
+ TCasioMakerNoteReader = class(TMakerNoteReader)
+ protected
+ FVersion: Integer;
+ procedure GetTagDefs({%H-}AStream: TStream); override;
+ function Prepare(AStream: TStream): Boolean; override;
+ end;
+
+
+implementation
+
+uses
+ fpeStrConsts, fpeUtils, fpeExifData;
+
+resourcestring
+ rsCasioAFMode2Lkup = '0:Off,1:Spot,2:Multi,3:Face detection,4:Tracking,5:Intelligent';
+ rsCasioArtMode2Lkup = '0:Normal,8:Silent movie,39:HDR,45:Premium auto,' +
+ '47:Painting,49:Crayon drawing,51:Panorama,52:Art HDR,62:High Speed night shot,'+
+ '64:Monochrome,67:Toy camera,68:Pop art,69:Light tone';
+ rsCasioAutoIso2Lkup = '1:On,2:Off,7:On (high sensitivity),8:On (anti-shake),'+
+ '10:High Speed';
+ rsCasioAFPointLkUp = '1:Center,2:Upper Left,3:Upper Right,4:Near Left/Right of Center,'+
+ '5:Far Left/Right of Center,6:Far Left/Right of Center/Bottom,'+
+ '7:Top Near-left,8:Near Upper/Left,9:Top Near-right,10:Top Left,'+
+ '11:Top Center,12:Top Right,13:Center Left,14:Center Right,15:Bottom Left,'+
+ '16:Bottom Center,17:Bottom Right';
+ {
+ rsCasioCCDSensitivityLkup = '64:Normal,125:+1.0,250:+2.0,244:+3.0,80:Normal,'+
+ '100:High';
+ }
+ rsCasioColorFilterLkup = '1:Off,2:Black & White,3:Sepia,4:Red,5:Green,6:Blue,'+
+ '7:Yellow,8:Pink,9:Purple';
+ rsCasioColorFilter2Lkup = '0:Off,1:Blue,3:Green,4:Yellow,5:Red,6:Purple,7:Pink';
+ rsCasioColorMode2Lkup = '0:Off,2:Black & White,3:Sepia';
+ rsCasioDigitalZoomLkup = '$10000:Off,$10001:2x Digital zoom,'+
+ '$20000:2x digital zoom,$40000:4x digital zoom';
+ rsCasioDriveMode2Lkup = '0:Single shot,1:Continuous shooting,'+
+ '2:Continuous (2 fps),3:Continuous (3 fps),4:Continuous (4 fps),'+
+ '5:Continuous (5 fps),6:Continuous (6 fps),7:Continuous (7 fps),'+
+ '10:Continuous (10 fps),12:Continuous (12 fps),15:Continuous (15 fps),'+
+ '20:Continuous (20 fps),30:Continuous (30 fps),40:Continuous (40 fps),'+
+ '60:Continuous (60 fps),240:Auto-N';
+ rsCasioEnhancementLkup = '1:Off,2:Red,3:Green,4:Blue,5:Flesh Tones';
+ rsCasioEnhancement2Lkup = '0:Off,1:Scenery,3:Green,5:Underwater,9:Flesh tones';
+ rsCasioFlashIntensityLkup_5 = '11:Weak,13:Normal,15:Strong';
+ rsCasioFlashIntensityLkUp_19 = '1:Normal,2:Weak,3:Strong';
+ rsCasioFlashModeLkup = '1:Auto,2:On,3:Off,4:Red-eye reduction';
+ rsCasioFocusingModeLkup = '2:Macro,3:Auto focus,4:Manual focus,5:Infinity';
+ rsCasioFocusMode2Lkup = '0:Normal,1:Macro';
+ rsCasioFocusMode22Lkup = '0:Manual,1:Focus lock,2:Macro,3:Single-area auto focus,'+
+ '5:Infinity,6:Multi-area auto focus,8:Super macro';
+ rsCasioImageSize2Lkup = '0:640 x 480,4:1600 x 1200,5:2048 x 1536,'+
+ '20:2288 x 1712,21:2592 x 1944,22:2304 x 1728,36:3008 x 2008';
+ rsCasioImageStabilization2Lkup = '0:Off,1:On,2:Best shot,3:Movie anti-shake';
+ rsCasioISOSpeed2Lkup = '3 = 50,4:64,6:100,9:200';
+ rsCasioLightingMode2Lkup = '0:Off,1:High dynamic range,5:Shadow enhance low,'+
+ '6:Shadow enhance high';
+ rsCasioPortraitRefiner2Lkup = '0:Off,1:+1,2:+2';
+ rsCasioRecordingModeLkup = '1:Single shutter,2:Panorama,3:Night scene,'+
+ '4:Portrait,5:Landscape';
+ rsCasioRecordMode2Lkup = '2:Program AE,3:Shutter priority,4:Aperture priority,'+
+ '5:Manual,6:Best shot,17:Movie,19:Movie (19),20:YouTube Movie';
+ rsCasioReleaseMode2Lkup = '1:Normal,3:AE Bracketing,11:WB Bracketing,'+
+ '13 = Contrast Bracketing,19:High Speed Burst';
+ rsCasioSharpness2Lkup = '0:Soft,1:Normal,2:Hard';
+ rsCasioSpecialEffectSetting2Lkup = '0:Off,1:Makeup,2:Mist removal,'+
+ '3:Vivid landscape,16:Art shot';
+ rsCasioVideoQuality2Lkup = '1:Standard,3:HD (720p),4:Full HD (1080p),5:Low';
+ rsCasioWhiteBalanceLkup = '1:Auto,2:Tungsten,3:Daylight,4:Fluorescent,'+
+ '5:Shade,129:Manual';
+ rsCasioWhiteBalance2Lkup = '0:Auto,1:Daylight,2:Shade,3:Tungsten,4:Fluorescent,5:Manual';
+ rsCasioWhiteBalance22Lkup = '0:Manual,1:Daylight,2:Cloudy,3:Shade,4:Flash?,'+
+ '6:Fluorescent,9:Tungsten?,10:Tungsten,12:Flash';
+
+
+const
+ M = DWord(TAGPARENT_MAKERNOTE);
+
+{ Casio Type 1
+ Standard TIFF IFD Data using Casio Type 1 Tags but always uses
+ Motorola (Big-Endian) byte alignment
+ This makernote has no header - the IFD starts immediately
+ Ref.: http://www.ozhiker.com/electronics/pjmt/jpeg_info/casio_mn.html }
+procedure BuildCasio1TagDefs(AList: TTagDefList);
+begin
+ Assert(AList <> nil);
+ with AList do begin
+ AddUShortTag(M+$0001, 'RecordingMode', 1, '', rsCasioRecordingModeLkup);
+ AddUShortTag(M+$0002, 'Quality', 1, '', rsEconomyNormalFine1);
+ AddUShortTag(M+$0003, 'FocusingMode', 1, '', rsCasioFocusingModeLkup);
+ AddUShortTag(M+$0004, 'FlashMode', 1, '', rsCasioFlashModeLkup);
+ AddUShortTag(M+$0005, 'FlashIntensity', 1, '', rsCasioFlashIntensityLkup_5);
+ AddULongTag (M+$0006, 'ObjectDistance', 1, '', '', '%d mm');
+ AddUShortTag(M+$0007, 'WhiteBalance', 1, '', rsCasioWhiteBalanceLkup);
+ AddULongTag (M+$000A, 'DigitalZoom', 1, '', rsCasioDigitalZoomLkup);
+ AddUShortTag(M+$000B, 'Sharpness', 1, '', rsNormalSoftHard);
+ AddUShortTag(M+$000C, 'Contrast', 1, '', rsNormalLowHigh);
+ AddUShortTag(M+$000D, 'Saturation', 1, '', rsNormalLowHigh);
+ AddUShortTag(M+$000A, 'DigitalZoom', 1, '', rsCasioDigitalZoomLkup);
+// AddUShortTag(M+$0014, 'CCDSensitivity', 1, '', rsCasioCCDSensitivityLkup);
+ AddUShortTag(M+$0014, 'ISO', 1, '', '');
+ AddStringTag(M+$0015, 'FirmwareDate', 18, '', '');
+ AddUShortTag(M+$0016, 'Enhancement', 1, '', rsCasioEnhancementLkUp);
+ AddUShortTag(M+$0017, 'ColorFilter', 1, '', rsCasioColorFilterLkUp);
+ AddUShortTag(M+$0018, 'AFPoint', 1, '', rsCasioAFPointLkUp);
+ AddUShortTag(M+$0019, 'FlashIntensity', 1, '', rsCasioFlashIntensityLkUp_19);
+ AddBinaryTag(M+$0E00, 'PrintIM');
+ end;
+end;
+
+{ Case Type 2
+ Header: 6 Bytes "QVC\x00\x00\x00"
+ IFD Data: Standard TIFF IFD Data using Casio Type 2 Tags but always uses
+ Motorola (Big-Endian) Byte Alignment.
+ All EXIF offsets are relative to the start of the TIFF header at the
+ beginning of the EXIF segment
+ Ref.: http://www.ozhiker.com/electronics/pjmt/jpeg_info/casio_mn.html
+ http://www.exiv2.org/tags-casio.html
+ https://sno.phy.queensu.ca/~phil/exiftool/TagNames/Casio.html#Type2
+}
+procedure BuildCasio2TagDefs(AList: TTagDefList);
+begin
+ Assert(AList <> nil);
+ with AList do begin
+ AddUShortTag (M+$0002, 'PreviewImageSize', 2); // width and height, in pixels
+ AddULongTag (M+$0003, 'PreviewImageLength');
+ AddULongTag (M+$0004, 'PreviewImageStart');
+ AddUShortTag (M+$0008, 'QualityMode', 1, '', rsEconomyNormalFine);
+ AddUShortTag (M+$0009, 'ImageSize', 1, '', rsCasioImageSize2Lkup);
+ AddUShortTag (M+$000D, 'FocusMode', 1, '', rsCasioFocusMode2Lkup);
+ AddUShortTag (M+$0014, 'ISOSpeed', 1, '', rsCasioISOSpeed2Lkup);
+ AddUShortTag (M+$0019, 'WhiteBalance', 1, '', rsCasioWhiteBalance2Lkup);
+ AddURationalTag(M+$001D, 'FocalLength');
+ AddUShortTag (M+$001F, 'Saturation', 1, '', rsLowNormalHigh);
+ AddUShortTag (M+$0020, 'Contrast', 1, '', rsLowNormalHigh);
+ AddUShortTag (M+$0021, 'Sharpness', 1, '', rsCasioSharpness2Lkup);
+ AddBinaryTag (M+$0E00, 'PrintIM');
+ AddBinaryTag (M+$2000, 'PreviewImage');
+ AddStringTag (M+$2001, 'FirwareDate', 18);
+ AddUShortTag (M+$2011, 'WhiteBalanceBias', 2);
+ AddUShortTag (M+$2012, 'WhiteBalance2', 2, '', rsCasioWhiteBalance22Lkup);
+ AddUShortTag (M+$2021, 'AFPointPosition', 4);
+ AddULongTag (M+$2022, 'ObjectDistance');
+ AddUShortTag (M+$2034, 'FlashDistance');
+ AddByteTag (M+$2076, 'SpecialEffectMode', 3); // to do: array lkup - should be: '0 0 0' = Off,'1 0 0' = Makeup,'2 0 0' = Mist Removal,'3 0 0' = Vivid Landscape
+ AddBinaryTag (M+$2089, 'FaceInfo');
+ AddByteTag (M+$211C, 'FacesDetected');
+ AddUShortTag (M+$3000, 'RecordMode', 1, '', rsCasioRecordMode2Lkup);
+ AddUShortTag (M+$3001, 'ReleaseMode', 1, '', rsCasioReleaseMode2Lkup);
+ AddUShortTag (M+$3002, 'Quality', 1, '', rsEconomyNormalFine1);
+ AddUShortTag (M+$3003, 'FocusMode2', 1, '', rsCasioFocusMode2Lkup);
+ AddStringTag (M+$3006, 'HometownCity');
+ AddUShortTag (M+$3007, 'BestShotMode'); // Lkup depends severly on camera model
+ AddUShortTag (M+$3008, 'AutoISO', 1, '', rsCasioAutoIso2Lkup);
+ AddUShortTag (M+$3009, 'AFMode', 1, '', rsCasioAFMode2Lkup);
+ AddBinaryTag (M+$3011, 'Sharpness2');
+ AddBinaryTag (M+$3012, 'Contrast2');
+ AddBinaryTag (M+$3013, 'Saturation2');
+ AddUShortTag (M+$3014, 'ISO');
+ AddUShortTag (M+$3015, 'ColorMode', 1, '', rsCasioColorMode2Lkup);
+ AddUShortTag (M+$3016, 'Enhancement', 1, '', rsCasioEnhancement2Lkup);
+ AddUShortTag (M+$3017, 'ColorFilter', 1, '', rsCasioColorFilter2Lkup);
+ AddUShortTag (M+$301B, 'ArtMode', 1, '', rsCasioArtMode2Lkup);
+ AddUShortTag (M+$301C, 'SequenceNumber');
+ AddUShortTag (M+$301D, 'BracketSequence', 2);
+ AddUShortTag (M+$3020, 'ImageStabilization', 1, '', rsCasioImageStabilization2Lkup);
+ AddUShortTag (M+$302A, 'LightingMode', 1, '', rsCasioLightingMode2Lkup);
+ AddUShortTag (M+$302B, 'PortraitRefiner', 1, '', rsCasioPortraitRefiner2Lkup);
+ AddUShortTag (M+$3030, 'SpecialEffectLevel');
+ AddUShortTag (M+$3031, 'SpecialEffectSetting', 1, '', rsCasioSpecialEffectSetting2Lkup);
+ AddUShortTag (M+$3103, 'DriveMode', 1, '', rsCasioDriveMode2Lkup);
+ AddBinaryTag (M+$310B, 'ArtModeParameters', 3);
+ AddUShortTag (M+$4001, 'CaptureFrameRate');
+ AddUShortTag (M+$4003, 'VideoQuality', 1, '', rsCasioVideoQuality2Lkup);
+ end;
+end;
+
+
+//==============================================================================
+// TCasioMakerNoteReader
+//==============================================================================
+
+function TCasioMakerNoteReader.Prepare(AStream: TStream): Boolean;
+var
+ p: Int64;
+ hdr: Array[0..5] of ansichar;
+begin
+ Result := false;
+
+ p := AStream.Position;
+ AStream.Read({%H-}hdr[0], SizeOf(hdr));
+ if (hdr[0] = 'Q') and (hdr[1] = 'V') and (hdr[2] = 'C') and
+ (hdr[3] = #0) and (hdr[4] = #0) and (hdr[5] = #0)
+ then begin
+ FVersion := 2;
+ BuildCasio2TagDefs(FTagDefs);
+ AStream.Position := p + SizeOf(hdr);
+ end else
+ begin
+ FVersion := 1;
+ BuildCasio1TagDefs(FTagDefs);
+ AStream.Position := p;
+ end;
+
+ FBigEndian := true;
+ Result := true;
+end;
+
+procedure TCasioMakerNoteReader.GetTagDefs(AStream: TStream);
+begin
+ if Uppercase(FMake) = 'CASIO' then
+ BuildCasio1TagDefs(FTagDefs);
+end;
+
+
+initialization
+ RegisterMakerNoteReader(TCasioMakerNoteReader, 'Casio', '');
+
+end.
+
diff --git a/components/fpexif/fpexif_pkg.lpk b/components/fpexif/fpexif_pkg.lpk
index e8272e65a..2f2f03330 100644
--- a/components/fpexif/fpexif_pkg.lpk
+++ b/components/fpexif/fpexif_pkg.lpk
@@ -12,7 +12,7 @@
-
+
@@ -66,29 +66,33 @@
-
-
-
-
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/components/fpexif/fpexif_pkg.pas b/components/fpexif/fpexif_pkg.pas
index 4991d9d47..15b9b8fa8 100644
--- a/components/fpexif/fpexif_pkg.pas
+++ b/components/fpexif/fpexif_pkg.pas
@@ -10,8 +10,9 @@ interface
uses
fpeGlobal, fpeTags, fpeUtils, fpeMetadata, fpeExifReadWrite,
fpeIptcReadWrite, fpeExifData, fpeIptcData, fpeStrConsts, fpeMakerNote,
- fpeMakerNoteNikon, fpeMakerNoteCanonCasio, fpeMakerNoteMinolta,
- fpeMakerNoteOlympus, fpeMakerNoteEpson, fpeMakerNoteFuji, fpemakernotesanyo;
+ fpeMakerNoteNikon, fpeMakerNoteMinolta, fpeMakerNoteOlympus,
+ fpeMakerNoteEpson, fpeMakerNoteFuji, fpeMakerNoteSanyo, fpeMakerNoteCasio,
+ fpeMakerNoteCanon;
implementation