Skip to content

Commit 19978e0

Browse files
authored
Merge pull request #401 from drewnoakes/apple-makernotes
Extend Apple makernote support
2 parents 5f22ae3 + 9cc583b commit 19978e0

File tree

5 files changed

+196
-9
lines changed

5 files changed

+196
-9
lines changed

MetadataExtractor/Formats/Exif/makernotes/AppleMakernoteDescriptor.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,26 @@ public class AppleMakernoteDescriptor(AppleMakernoteDirectory directory)
1616
{
1717
return tagType switch
1818
{
19+
TagAEStable => GetAEStableDescription(),
20+
TagAFStable => GetAEStableDescription(),
1921
TagHdrImageType => GetHdrImageTypeDescription(),
2022
TagAccelerationVector => GetAccelerationVectorDescription(),
23+
TagImageCaptureType => GetImageCaptureTypeDescription(),
24+
TagFrontFacingCamera => GetFrontFacingCameraDescription(),
2125
_ => base.GetDescription(tagType)
2226
};
2327
}
2428

29+
public string? GetAEStableDescription()
30+
{
31+
return GetBooleanDescription(TagAEStable, "Yes", "No");
32+
}
33+
34+
public string? GetAFStableDescription()
35+
{
36+
return GetBooleanDescription(TagAFStable, "Yes", "No");
37+
}
38+
2539
public string? GetHdrImageTypeDescription()
2640
{
2741
return GetIndexedDescription(TagHdrImageType, 3, "HDR Image", "Original Image");
@@ -36,5 +50,26 @@ public class AppleMakernoteDescriptor(AppleMakernoteDirectory directory)
3650
$"{values[1].Absolute.ToDouble():N2}g {(values[1].IsPositive ? "down" : "up")}, " +
3751
$"{values[2].Absolute.ToDouble():N2}g {(values[2].IsPositive ? "forward" : "backward")}";
3852
}
53+
54+
public string? GetImageCaptureTypeDescription()
55+
{
56+
if (Directory.TryGetInt32(TagImageCaptureType, out int value))
57+
{
58+
return value switch
59+
{
60+
1 => "ProRAW",
61+
2 => "Portrait",
62+
10 => "Photo",
63+
_ => base.GetDescription(TagImageCaptureType)
64+
};
65+
}
66+
67+
return base.GetDescription(TagImageCaptureType);
68+
}
69+
70+
public string? GetFrontFacingCameraDescription()
71+
{
72+
return GetBooleanDescription(TagFrontFacingCamera, "Yes", "No");
73+
}
3974
}
4075
}

MetadataExtractor/Formats/Exif/makernotes/AppleMakernoteDirectory.cs

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,95 @@
33
namespace MetadataExtractor.Formats.Exif.Makernotes
44
{
55
/// <summary>Describes tags specific to Apple cameras.</summary>
6-
/// <remarks>Using information from http://owl.phy.queensu.ca/~phil/exiftool/TagNames/Apple.html</remarks>
6+
/// <remarks>Using information from https://exiftool.org/TagNames/Apple.html</remarks>
77
/// <author>Drew Noakes https://drewnoakes.com</author>
88
public class AppleMakernoteDirectory : Directory
99
{
1010
#pragma warning disable format
11-
public const int TagRunTime = 0x0003;
11+
public const int TagMakernoteVersion = 0x0001;
12+
public const int TagAEMatrix = 0x0002;
13+
public const int TagRunTime = 0x0003;
14+
public const int TagAEStable = 0x0004;
15+
public const int TagAETarget = 0x0005;
16+
public const int TagAEAverage = 0x0006;
17+
public const int TagAFStable = 0x0007;
1218
/// <summary>
1319
/// XYZ coordinates of the acceleration vector in units of g.
1420
/// As viewed from the front of the phone,
1521
/// positive X is toward the left side,
1622
/// positive Y is toward the bottom,
1723
/// positive Z points into the face of the phone
1824
/// </summary>
19-
public const int TagAccelerationVector = 0x0008;
20-
public const int TagHdrImageType = 0x000a;
25+
public const int TagAccelerationVector = 0x0008;
26+
public const int TagHdrImageType = 0x000a;
2127
/// <summary>
2228
/// Unique ID for all images in a burst.
2329
/// </summary>
24-
public const int TagBurstUuid = 0x000b;
25-
public const int TagContentIdentifier = 0x0011;
26-
public const int TagImageUniqueId = 0x0015;
27-
public const int TagLivePhotoId = 0x0017;
30+
public const int TagBurstUuid = 0x000b;
31+
public const int TagFocusDistanceRange = 0x000c;
32+
public const int TagOisMode = 0x000f;
33+
public const int TagContentIdentifier = 0x0011;
34+
public const int TagImageCaptureType = 0x0014;
35+
public const int TagImageUniqueId = 0x0015;
36+
public const int TagLivePhotoId = 0x0017;
37+
public const int TagImageProcessingFlags = 0x0019;
38+
public const int TagQualityHint = 0x001a;
39+
public const int TagLuminanceNoiseAmplitude = 0x001d;
40+
public const int TagImageCaptureRequestID = 0x0020;
41+
public const int TagHdrHeadroom = 0x0021;
42+
public const int TagSceneFlags = 0x0025;
43+
public const int TagSignalToNoiseRatioType = 0x0026;
44+
public const int TagSignalToNoiseRatio = 0x0027;
45+
public const int TagPhotoIdentifier = 0x002b;
46+
public const int TagFocusPosition = 0x002f;
47+
public const int TagHdrGain = 0x0030;
48+
public const int TagAFMeasuredDepth = 0x0038;
49+
public const int TagAFConfidence = 0x003d;
50+
public const int TagColorCorrectionMatrix = 0x003e;
51+
public const int TagGreenGhostMitigationStatus = 0x003f;
52+
public const int TagSemanticStyle = 0x0040;
53+
public const int TagSemanticStyleRenderingVer = 0x0041;
54+
public const int TagSemanticStylePreset = 0x0042;
55+
public const int TagFrontFacingCamera = 0x0045;
2856
#pragma warning restore format
2957

3058
private static readonly Dictionary<int, string> _tagNameMap = new()
3159
{
60+
{ TagMakernoteVersion, "Makernote Version" },
61+
{ TagAEMatrix, "AE Matrix" },
3262
{ TagRunTime, "Run Time" },
63+
{ TagAEStable, "AE Stable" },
64+
{ TagAETarget, "AE Target" },
65+
{ TagAEAverage, "AE Average" },
66+
{ TagAFStable, "AF Stable" },
3367
{ TagAccelerationVector, "Acceleration Vector" },
3468
{ TagHdrImageType, "HDR Image Type" },
3569
{ TagBurstUuid, "Burst UUID" },
70+
{ TagFocusDistanceRange, "Focus Distance Range" },
71+
{ TagOisMode, "OIS Mode" },
3672
{ TagContentIdentifier, "Content Identifier" },
73+
{ TagImageCaptureType, "Image Capture Type" },
3774
{ TagImageUniqueId, "Image Unique ID" },
38-
{ TagLivePhotoId, "Live Photo ID" }
75+
{ TagLivePhotoId, "Live Photo ID" },
76+
{ TagImageProcessingFlags, "Image Processing Flags" },
77+
{ TagQualityHint, "Quality Hint" },
78+
{ TagLuminanceNoiseAmplitude, "Luminance Noise Amplitude" },
79+
{ TagImageCaptureRequestID, "Image Capture Request ID" },
80+
{ TagHdrHeadroom, "HDR Headroom" },
81+
{ TagSceneFlags, "Scene Flags" },
82+
{ TagSignalToNoiseRatioType, "Signal-to-Noise Ratio Type" },
83+
{ TagSignalToNoiseRatio, "Signal-to-Noise Ratio" },
84+
{ TagPhotoIdentifier, "Photo Identifier" },
85+
{ TagFocusPosition, "Focus Position" },
86+
{ TagHdrGain, "HDR Gain" },
87+
{ TagAFMeasuredDepth, "AF Measured Depth" },
88+
{ TagAFConfidence, "AF Confidence" },
89+
{ TagColorCorrectionMatrix, "Color Correction Matrix" },
90+
{ TagGreenGhostMitigationStatus, "Green Ghost Mitigation Status" },
91+
{ TagSemanticStyle, "Semantic Style" },
92+
{ TagSemanticStyleRenderingVer, "Semantic Style Rendering Ver" },
93+
{ TagSemanticStylePreset, "Semantic Style Preset" },
94+
{ TagFrontFacingCamera, "Front Facing Camera" }
3995
};
4096

4197
public AppleMakernoteDirectory() : base(_tagNameMap)

MetadataExtractor/PublicAPI/net462/PublicAPI.Unshipped.txt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,34 @@
11
#nullable enable
22
abstract MetadataExtractor.IO.IndexedReader.GetBytes(int index, System.Span<byte> bytes) -> void
33
abstract MetadataExtractor.IO.SequentialReader.GetBytes(System.Span<byte> bytes) -> void
4+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAEAverage = 6 -> int
5+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAEMatrix = 2 -> int
6+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAEStable = 4 -> int
7+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAETarget = 5 -> int
8+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAFConfidence = 61 -> int
9+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAFMeasuredDepth = 56 -> int
10+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAFStable = 7 -> int
11+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagColorCorrectionMatrix = 62 -> int
12+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagFocusDistanceRange = 12 -> int
13+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagFocusPosition = 47 -> int
14+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagFrontFacingCamera = 69 -> int
15+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagGreenGhostMitigationStatus = 63 -> int
16+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagHdrGain = 48 -> int
17+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagHdrHeadroom = 33 -> int
18+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagImageCaptureRequestID = 32 -> int
19+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagImageCaptureType = 20 -> int
20+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagImageProcessingFlags = 25 -> int
21+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagLuminanceNoiseAmplitude = 29 -> int
22+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagMakernoteVersion = 1 -> int
23+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagOisMode = 15 -> int
24+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagPhotoIdentifier = 43 -> int
25+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagQualityHint = 26 -> int
26+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSceneFlags = 37 -> int
27+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSemanticStyle = 64 -> int
28+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSemanticStylePreset = 66 -> int
29+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSemanticStyleRenderingVer = 65 -> int
30+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSignalToNoiseRatio = 39 -> int
31+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSignalToNoiseRatioType = 38 -> int
432
const MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.TagEpoch = 2 -> int
533
const MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.TagFlags = 1 -> int
634
const MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.TagScale = 3 -> int
@@ -46,6 +74,10 @@ MetadataExtractor.Formats.Apple.BplistReader.BplistReader() -> void
4674
MetadataExtractor.Formats.Apple.BplistReader.PropertyListResults
4775
MetadataExtractor.Formats.Apple.BplistReader.PropertyListResults.Get(byte key) -> object!
4876
MetadataExtractor.Formats.Apple.BplistReader.PropertyListResults.GetTopObject() -> System.Collections.Generic.Dictionary<byte, byte>?
77+
MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDescriptor.GetAEStableDescription() -> string?
78+
MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDescriptor.GetAFStableDescription() -> string?
79+
MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDescriptor.GetFrontFacingCameraDescription() -> string?
80+
MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDescriptor.GetImageCaptureTypeDescription() -> string?
4981
MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor
5082
MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.AppleRunTimeMakernoteDescriptor(MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory! directory) -> void
5183
MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.GetFlagsDescription() -> string?

MetadataExtractor/PublicAPI/netstandard1.3/PublicAPI.Unshipped.txt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,34 @@
11
#nullable enable
22
abstract MetadataExtractor.IO.IndexedReader.GetBytes(int index, System.Span<byte> bytes) -> void
33
abstract MetadataExtractor.IO.SequentialReader.GetBytes(System.Span<byte> bytes) -> void
4+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAEAverage = 6 -> int
5+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAEMatrix = 2 -> int
6+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAEStable = 4 -> int
7+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAETarget = 5 -> int
8+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAFConfidence = 61 -> int
9+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAFMeasuredDepth = 56 -> int
10+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAFStable = 7 -> int
11+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagColorCorrectionMatrix = 62 -> int
12+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagFocusDistanceRange = 12 -> int
13+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagFocusPosition = 47 -> int
14+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagFrontFacingCamera = 69 -> int
15+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagGreenGhostMitigationStatus = 63 -> int
16+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagHdrGain = 48 -> int
17+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagHdrHeadroom = 33 -> int
18+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagImageCaptureRequestID = 32 -> int
19+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagImageCaptureType = 20 -> int
20+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagImageProcessingFlags = 25 -> int
21+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagLuminanceNoiseAmplitude = 29 -> int
22+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagMakernoteVersion = 1 -> int
23+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagOisMode = 15 -> int
24+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagPhotoIdentifier = 43 -> int
25+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagQualityHint = 26 -> int
26+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSceneFlags = 37 -> int
27+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSemanticStyle = 64 -> int
28+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSemanticStylePreset = 66 -> int
29+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSemanticStyleRenderingVer = 65 -> int
30+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSignalToNoiseRatio = 39 -> int
31+
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagSignalToNoiseRatioType = 38 -> int
432
const MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.TagEpoch = 2 -> int
533
const MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.TagFlags = 1 -> int
634
const MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.TagScale = 3 -> int
@@ -46,6 +74,10 @@ MetadataExtractor.Formats.Apple.BplistReader.BplistReader() -> void
4674
MetadataExtractor.Formats.Apple.BplistReader.PropertyListResults
4775
MetadataExtractor.Formats.Apple.BplistReader.PropertyListResults.Get(byte key) -> object!
4876
MetadataExtractor.Formats.Apple.BplistReader.PropertyListResults.GetTopObject() -> System.Collections.Generic.Dictionary<byte, byte>?
77+
MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDescriptor.GetAEStableDescription() -> string?
78+
MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDescriptor.GetAFStableDescription() -> string?
79+
MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDescriptor.GetFrontFacingCameraDescription() -> string?
80+
MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDescriptor.GetImageCaptureTypeDescription() -> string?
4981
MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor
5082
MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.AppleRunTimeMakernoteDescriptor(MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory! directory) -> void
5183
MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.GetFlagsDescription() -> string?

0 commit comments

Comments
 (0)