| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
#------------------------------------------------------------------------------ |
|
2
|
|
|
|
|
|
|
# File: Apple.pm |
|
3
|
|
|
|
|
|
|
# |
|
4
|
|
|
|
|
|
|
# Description: Apple EXIF maker notes tags |
|
5
|
|
|
|
|
|
|
# |
|
6
|
|
|
|
|
|
|
# Revisions: 2013-09-13 - P. Harvey Created |
|
7
|
|
|
|
|
|
|
# |
|
8
|
|
|
|
|
|
|
# References: 1) http://www.photoinvestigator.co/blog/the-mystery-of-maker-apple-metadata/ |
|
9
|
|
|
|
|
|
|
# 2) Frank Rupprecht private communication |
|
10
|
|
|
|
|
|
|
#------------------------------------------------------------------------------ |
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
package Image::ExifTool::Apple; |
|
13
|
|
|
|
|
|
|
|
|
14
|
5
|
|
|
5
|
|
4792
|
use strict; |
|
|
5
|
|
|
|
|
17
|
|
|
|
5
|
|
|
|
|
203
|
|
|
15
|
5
|
|
|
5
|
|
30
|
use vars qw($VERSION); |
|
|
5
|
|
|
|
|
13
|
|
|
|
5
|
|
|
|
|
254
|
|
|
16
|
5
|
|
|
5
|
|
1403
|
use Image::ExifTool::Exif; |
|
|
5
|
|
|
|
|
65
|
|
|
|
5
|
|
|
|
|
146
|
|
|
17
|
5
|
|
|
5
|
|
1847
|
use Image::ExifTool::PLIST; |
|
|
5
|
|
|
|
|
15
|
|
|
|
5
|
|
|
|
|
3077
|
|
|
18
|
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
$VERSION = '1.08'; |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
sub ConvertPLIST($$); |
|
22
|
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
# Apple iPhone metadata (ref PH) |
|
24
|
|
|
|
|
|
|
%Image::ExifTool::Apple::Main = ( |
|
25
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, |
|
26
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, |
|
27
|
|
|
|
|
|
|
WRITABLE => 1, |
|
28
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, |
|
29
|
|
|
|
|
|
|
NOTES => 'Tags extracted from the maker notes of iPhone images.', |
|
30
|
|
|
|
|
|
|
0x0001 => { # (Version, ref 2) |
|
31
|
|
|
|
|
|
|
Name => 'MakerNoteVersion', |
|
32
|
|
|
|
|
|
|
Writable => 'int32s', |
|
33
|
|
|
|
|
|
|
}, |
|
34
|
|
|
|
|
|
|
0x0002 => { #2 |
|
35
|
|
|
|
|
|
|
Name => 'AEMatrix', |
|
36
|
|
|
|
|
|
|
Unknown => 1, |
|
37
|
|
|
|
|
|
|
# (not currently writable) |
|
38
|
|
|
|
|
|
|
ValueConv => \&ConvertPLIST, |
|
39
|
|
|
|
|
|
|
}, |
|
40
|
|
|
|
|
|
|
0x0003 => { # (Timestamp, ref 2) |
|
41
|
|
|
|
|
|
|
Name => 'RunTime', # (includes time plugged in, but not when suspended, ref 1) |
|
42
|
|
|
|
|
|
|
SubDirectory => { TagTable => 'Image::ExifTool::Apple::RunTime' }, |
|
43
|
|
|
|
|
|
|
}, |
|
44
|
|
|
|
|
|
|
0x0004 => { #2 |
|
45
|
|
|
|
|
|
|
Name => 'AEStable', |
|
46
|
|
|
|
|
|
|
Writable => 'int32s', |
|
47
|
|
|
|
|
|
|
PrintConv => { 0 => 'No', 1 => 'Yes' }, |
|
48
|
|
|
|
|
|
|
}, |
|
49
|
|
|
|
|
|
|
0x0005 => { #2 |
|
50
|
|
|
|
|
|
|
Name => 'AETarget', |
|
51
|
|
|
|
|
|
|
Writable => 'int32s', |
|
52
|
|
|
|
|
|
|
}, |
|
53
|
|
|
|
|
|
|
0x0006 => { #2 |
|
54
|
|
|
|
|
|
|
Name => 'AEAverage', |
|
55
|
|
|
|
|
|
|
Writable => 'int32s', |
|
56
|
|
|
|
|
|
|
}, |
|
57
|
|
|
|
|
|
|
0x0007 => { #2 |
|
58
|
|
|
|
|
|
|
Name => 'AFStable', |
|
59
|
|
|
|
|
|
|
Writable => 'int32s', |
|
60
|
|
|
|
|
|
|
PrintConv => { 0 => 'No', 1 => 'Yes' }, |
|
61
|
|
|
|
|
|
|
}, |
|
62
|
|
|
|
|
|
|
0x0008 => { #1 (FocusAccelerometerVector, ref 2) |
|
63
|
|
|
|
|
|
|
Name => 'AccelerationVector', |
|
64
|
|
|
|
|
|
|
Groups => { 2 => 'Camera' }, |
|
65
|
|
|
|
|
|
|
Writable => 'rational64s', |
|
66
|
|
|
|
|
|
|
Count => 3, |
|
67
|
|
|
|
|
|
|
# Note: the directions are contrary to the Apple documentation (which have the |
|
68
|
|
|
|
|
|
|
# signs of all axes reversed -- apparently the Apple geeks aren't very good |
|
69
|
|
|
|
|
|
|
# with basic physics, and don't understand the concept of acceleration. See |
|
70
|
|
|
|
|
|
|
# http://nscookbook.com/2013/03/ios-programming-recipe-19-using-core-motion-to-access-gyro-and-accelerometer/ |
|
71
|
|
|
|
|
|
|
# for one of the few correct descriptions of this). Note that this leads to |
|
72
|
|
|
|
|
|
|
# a left-handed coordinate system for acceleration. |
|
73
|
|
|
|
|
|
|
Notes => q{ |
|
74
|
|
|
|
|
|
|
XYZ coordinates of the acceleration vector in units of g. As viewed from |
|
75
|
|
|
|
|
|
|
the front of the phone, positive X is toward the left side, positive Y is |
|
76
|
|
|
|
|
|
|
toward the bottom, and positive Z points into the face of the phone |
|
77
|
|
|
|
|
|
|
}, |
|
78
|
|
|
|
|
|
|
}, |
|
79
|
|
|
|
|
|
|
# 0x0009 - int32s: seen 19,275,531,4371 (SISMethod, ref 2) |
|
80
|
|
|
|
|
|
|
0x000a => { # (HDRMethod, ref 2) |
|
81
|
|
|
|
|
|
|
Name => 'HDRImageType', |
|
82
|
|
|
|
|
|
|
Writable => 'int32s', |
|
83
|
|
|
|
|
|
|
PrintConv => { |
|
84
|
|
|
|
|
|
|
# 2 => ? (iPad mini 2) |
|
85
|
|
|
|
|
|
|
3 => 'HDR Image', |
|
86
|
|
|
|
|
|
|
4 => 'Original Image', |
|
87
|
|
|
|
|
|
|
}, |
|
88
|
|
|
|
|
|
|
}, |
|
89
|
|
|
|
|
|
|
0x000b => { # (BurstUUID, ref 2) |
|
90
|
|
|
|
|
|
|
Name => 'BurstUUID', |
|
91
|
|
|
|
|
|
|
Writable => 'string', |
|
92
|
|
|
|
|
|
|
Notes => 'unique ID for all images in a burst', |
|
93
|
|
|
|
|
|
|
}, |
|
94
|
|
|
|
|
|
|
0x000c => { # ref forum13710 (Neal Krawetz) (SphereHealthTrackingError, ref 2) |
|
95
|
|
|
|
|
|
|
Name => 'FocusDistanceRange', |
|
96
|
|
|
|
|
|
|
Writable => 'rational64s', |
|
97
|
|
|
|
|
|
|
Count => 2, |
|
98
|
|
|
|
|
|
|
PrintConv => q{ |
|
99
|
|
|
|
|
|
|
my @a = split ' ', $val; |
|
100
|
|
|
|
|
|
|
sprintf('%.2f - %.2f m', $a[0] <= $a[1] ? @a : reverse @a); |
|
101
|
|
|
|
|
|
|
}, |
|
102
|
|
|
|
|
|
|
PrintConvInv => '$val =~ s/ - //; $val =~ s/ ?m$//; $val', |
|
103
|
|
|
|
|
|
|
}, |
|
104
|
|
|
|
|
|
|
# 0x000d - int32s: 0,1,6,20,24,32,40 (SphereHealthAverageCurrent, ref 2) |
|
105
|
|
|
|
|
|
|
# 0x000e - int32s: 0,1,4,12 (Orientation? 0=landscape? 4=portrait? ref 1) (SphereMotionDataStatus, ref 2) |
|
106
|
|
|
|
|
|
|
0x000f => { #2 |
|
107
|
|
|
|
|
|
|
Name => 'OISMode', |
|
108
|
|
|
|
|
|
|
Writable => 'int32s', |
|
109
|
|
|
|
|
|
|
# seen: 2,3,5 |
|
110
|
|
|
|
|
|
|
}, |
|
111
|
|
|
|
|
|
|
# 0x0010 - int32s: 1 (SphereStatus, ref 2) |
|
112
|
|
|
|
|
|
|
0x0011 => { # (if defined, there is a live photo associated with the video, #forum13565) (AssetIdentifier, ref 2) |
|
113
|
|
|
|
|
|
|
Name => 'MediaGroupUUID', #NealKrawetz private communication |
|
114
|
|
|
|
|
|
|
# (changed in 12.19 from Name => 'ContentIdentifier', #forum8750) |
|
115
|
|
|
|
|
|
|
Writable => 'string', |
|
116
|
|
|
|
|
|
|
}, |
|
117
|
|
|
|
|
|
|
# 0x0012 - (QRMOutputType, ref 2) |
|
118
|
|
|
|
|
|
|
# 0x0013 - (SphereExternalForceOffset, ref 2) |
|
119
|
|
|
|
|
|
|
0x0014 => { # (StillImageCaptureType, ref 2) |
|
120
|
|
|
|
|
|
|
Name => 'ImageCaptureType', |
|
121
|
|
|
|
|
|
|
Writable => 'int32s', |
|
122
|
|
|
|
|
|
|
Unknown => 1, # (don't know what the values mean) |
|
123
|
|
|
|
|
|
|
# seen: 1,2,3,4,5,10,12 |
|
124
|
|
|
|
|
|
|
}, |
|
125
|
|
|
|
|
|
|
0x0015 => { # (ImageGroupIdentifier, ref 2) |
|
126
|
|
|
|
|
|
|
Name => 'ImageUniqueID', |
|
127
|
|
|
|
|
|
|
Writable => 'string', |
|
128
|
|
|
|
|
|
|
}, |
|
129
|
|
|
|
|
|
|
# 0x0016 - string[29]: "AXZ6pMTOh2L+acSh4Kg630XCScoO\0" (PhotosOriginatingSignature, ref 2) |
|
130
|
|
|
|
|
|
|
0x0017 => { #forum13565 (only valid if MediaGroupUUID exists) (StillImageCaptureFlags, ref 2) |
|
131
|
|
|
|
|
|
|
Name => 'LivePhotoVideoIndex', |
|
132
|
|
|
|
|
|
|
Notes => 'divide by RunTimeScale to get time in seconds', |
|
133
|
|
|
|
|
|
|
}, |
|
134
|
|
|
|
|
|
|
# 0x0018 - (PhotosRenderOriginatingSignature, ref 2) |
|
135
|
|
|
|
|
|
|
0x0019 => { # (StillImageProcessingFlags, ref 2) |
|
136
|
|
|
|
|
|
|
Name => 'ImageProcessingFlags', |
|
137
|
|
|
|
|
|
|
Writable => 'int32s', |
|
138
|
|
|
|
|
|
|
Unknown => 1, |
|
139
|
|
|
|
|
|
|
PrintConv => { BITMASK => { } }, |
|
140
|
|
|
|
|
|
|
}, |
|
141
|
|
|
|
|
|
|
0x001a => { # (PhotoTranscodeQualityHint, ref 2) |
|
142
|
|
|
|
|
|
|
Name => 'QualityHint', |
|
143
|
|
|
|
|
|
|
Writable => 'string', |
|
144
|
|
|
|
|
|
|
Unknown => 1, |
|
145
|
|
|
|
|
|
|
# seen: "q825s\0", "q750n\0", "q900n\0" |
|
146
|
|
|
|
|
|
|
}, |
|
147
|
|
|
|
|
|
|
# 0x001b - (PhotosRenderEffect, ref 2) |
|
148
|
|
|
|
|
|
|
# 0x001c - (BracketedCaptureSequenceNumber, ref 2) |
|
149
|
|
|
|
|
|
|
0x001d => { #2 |
|
150
|
|
|
|
|
|
|
Name => 'LuminanceNoiseAmplitude', |
|
151
|
|
|
|
|
|
|
Writable => 'rational64s', |
|
152
|
|
|
|
|
|
|
}, |
|
153
|
|
|
|
|
|
|
# 0x001e - (OriginatingAppID, ref 2) |
|
154
|
|
|
|
|
|
|
# 0x001f - int32s: 0,1 (PhotosAppFeatureFlags, ref 2) |
|
155
|
|
|
|
|
|
|
0x0020 => { # (ImageCaptureRequestIdentifier, ref 2) |
|
156
|
|
|
|
|
|
|
Name => 'ImageCaptureReqestID', |
|
157
|
|
|
|
|
|
|
Writable => 'string', |
|
158
|
|
|
|
|
|
|
Unknown => 1, |
|
159
|
|
|
|
|
|
|
}, |
|
160
|
|
|
|
|
|
|
0x0021 => { # (MeteorHeadroom, ref 2) |
|
161
|
|
|
|
|
|
|
Name => 'HDRHeadroom', |
|
162
|
|
|
|
|
|
|
Writable => 'rational64s', |
|
163
|
|
|
|
|
|
|
}, |
|
164
|
|
|
|
|
|
|
# 0x0022 - (ARKitPhoto, ref 2) |
|
165
|
|
|
|
|
|
|
# 0x0023 - int32s[2] (AFPerformance, ref 2) |
|
166
|
|
|
|
|
|
|
# 0x0024 - (AFExternalOffset, ref 2) |
|
167
|
|
|
|
|
|
|
0x0025 => { # (StillImageSceneFlags, ref 2) |
|
168
|
|
|
|
|
|
|
Name => 'SceneFlags', |
|
169
|
|
|
|
|
|
|
Writable => 'int32s', |
|
170
|
|
|
|
|
|
|
Unknown => 1, |
|
171
|
|
|
|
|
|
|
PrintConv => { BITMASK => { } }, |
|
172
|
|
|
|
|
|
|
}, |
|
173
|
|
|
|
|
|
|
0x0026 => { # (StillImageSNRType, ref 2) |
|
174
|
|
|
|
|
|
|
Name => 'SignalToNoiseRatioType', |
|
175
|
|
|
|
|
|
|
Writable => 'int32s', |
|
176
|
|
|
|
|
|
|
Unknown => 1, |
|
177
|
|
|
|
|
|
|
}, |
|
178
|
|
|
|
|
|
|
0x0027 => { # (StillImageSNR, ref 2) |
|
179
|
|
|
|
|
|
|
Name => 'SignalToNoiseRatio', |
|
180
|
|
|
|
|
|
|
Writable => 'rational64s', |
|
181
|
|
|
|
|
|
|
}, |
|
182
|
|
|
|
|
|
|
# 0x0028 - int32s (UBMethod, ref 2) |
|
183
|
|
|
|
|
|
|
# 0x0029 - string (SpatialOverCaptureGroupIdentifier, ref 2) |
|
184
|
|
|
|
|
|
|
# 0x002A - (iCloudServerSoftwareVersionForDynamicallyGeneratedMedia, ref 2) |
|
185
|
|
|
|
|
|
|
# 0x002B - (PhotoIdentifier, ref 2) |
|
186
|
|
|
|
|
|
|
# 0x002C - (SpatialOverCaptureImageType, ref 2) |
|
187
|
|
|
|
|
|
|
# 0x002D - (CCT, ref 2) |
|
188
|
|
|
|
|
|
|
# 0x002E - (ApsMode, ref 2) |
|
189
|
|
|
|
|
|
|
0x002F => { #2 |
|
190
|
|
|
|
|
|
|
Name => 'FocusPosition', |
|
191
|
|
|
|
|
|
|
Writable => 'int32s', |
|
192
|
|
|
|
|
|
|
}, |
|
193
|
|
|
|
|
|
|
0x0030 => { # (MeteorPlusGainMap, ref 2) |
|
194
|
|
|
|
|
|
|
Name => 'HDRGain', |
|
195
|
|
|
|
|
|
|
Writable => 'rational64s', |
|
196
|
|
|
|
|
|
|
}, |
|
197
|
|
|
|
|
|
|
# 0x0031 - (StillImageProcessingHomography, ref 2) |
|
198
|
|
|
|
|
|
|
# 0x0032 - (IntelligentDistortionCorrection, ref 2) |
|
199
|
|
|
|
|
|
|
# 0x0033 - (NRFStatus, ref 2) |
|
200
|
|
|
|
|
|
|
# 0x0034 - (NRFInputBracketCount, ref 2) |
|
201
|
|
|
|
|
|
|
# 0x0035 - (NRFRegisteredBracketCount, ref 2) |
|
202
|
|
|
|
|
|
|
# 0x0036 - (LuxLevel, ref 2) |
|
203
|
|
|
|
|
|
|
# 0x0037 - (LastFocusingMethod, ref 2) |
|
204
|
|
|
|
|
|
|
0x0038 => { # (TimeOfFlightAssistedAutoFocusEstimatorMeasuredDepth, ref 2) |
|
205
|
|
|
|
|
|
|
Name => 'AFMeasuredDepth', |
|
206
|
|
|
|
|
|
|
Notes => 'from the time-of-flight-assisted auto-focus estimator', |
|
207
|
|
|
|
|
|
|
Writable => 'int32s', |
|
208
|
|
|
|
|
|
|
}, |
|
209
|
|
|
|
|
|
|
# 0x0039 - (TimeOfFlightAssistedAutoFocusEstimatorROIType, ref 2) |
|
210
|
|
|
|
|
|
|
# 0x003A - (NRFSRLStatus, ref 2) |
|
211
|
|
|
|
|
|
|
# 0x003B - (SystemPressureLevel, ref 2) |
|
212
|
|
|
|
|
|
|
# 0x003C - (CameraControlsStatisticsMaster, ref 2) |
|
213
|
|
|
|
|
|
|
0x003D => { # (TimeOfFlightAssistedAutoFocusEstimatorSensorConfidence, ref 2) |
|
214
|
|
|
|
|
|
|
Name => 'AFConfidence', |
|
215
|
|
|
|
|
|
|
Writable => 'int32s', |
|
216
|
|
|
|
|
|
|
}, |
|
217
|
|
|
|
|
|
|
0x003E => { # (ColorCorrectionMatrix, ref 2) |
|
218
|
|
|
|
|
|
|
Name => 'ColorCorrectionMatrix', |
|
219
|
|
|
|
|
|
|
Unknown => 1, |
|
220
|
|
|
|
|
|
|
ValueConv => \&ConvertPLIST, |
|
221
|
|
|
|
|
|
|
}, |
|
222
|
|
|
|
|
|
|
0x003F => { #2 |
|
223
|
|
|
|
|
|
|
Name => 'GreenGhostMitigationStatus', |
|
224
|
|
|
|
|
|
|
Writable => 'int32s', |
|
225
|
|
|
|
|
|
|
Unknown => 1, |
|
226
|
|
|
|
|
|
|
}, |
|
227
|
|
|
|
|
|
|
0x0040 => { #2 |
|
228
|
|
|
|
|
|
|
Name => 'SemanticStyle', |
|
229
|
|
|
|
|
|
|
ValueConv => \&ConvertPLIST, |
|
230
|
|
|
|
|
|
|
}, |
|
231
|
|
|
|
|
|
|
0x0041 => { # (SemanticStyleKey_RenderingVersion, ref 2) |
|
232
|
|
|
|
|
|
|
Name => 'SemanticStyleRenderingVer', |
|
233
|
|
|
|
|
|
|
ValueConv => \&ConvertPLIST, |
|
234
|
|
|
|
|
|
|
}, |
|
235
|
|
|
|
|
|
|
0x0042 => { # (SemanticStyleKey_Preset, ref 2) |
|
236
|
|
|
|
|
|
|
Name => 'SemanticStylePreset', |
|
237
|
|
|
|
|
|
|
ValueConv => \&ConvertPLIST, |
|
238
|
|
|
|
|
|
|
}, |
|
239
|
|
|
|
|
|
|
# 0x0043 - (SemanticStyleKey_ToneBias, ref 2) |
|
240
|
|
|
|
|
|
|
# 0x0044 - (SemanticStyleKey_WarmthBias, ref 2) |
|
241
|
|
|
|
|
|
|
0x0045 => { # (FrontFacing, ref 2) |
|
242
|
|
|
|
|
|
|
Name => 'FrontFacingCamera', |
|
243
|
|
|
|
|
|
|
Writable => 'int32s', |
|
244
|
|
|
|
|
|
|
PrintConv => { 0 => 'No', 1 => 'Yes' }, #PH (NC) |
|
245
|
|
|
|
|
|
|
}, |
|
246
|
|
|
|
|
|
|
# 0x0046 - (TimeOfFlightAssistedAutoFocusEstimatorContainsBlindSpot, ref 2) |
|
247
|
|
|
|
|
|
|
# 0x0047 - (LeaderFollowerAutoFocusLeaderDepth, ref 2) |
|
248
|
|
|
|
|
|
|
# 0x0048 - (LeaderFollowerAutoFocusLeaderFocusMethod, ref 2) |
|
249
|
|
|
|
|
|
|
# 0x0049 - (LeaderFollowerAutoFocusLeaderConfidence, ref 2) |
|
250
|
|
|
|
|
|
|
# 0x004A - (LeaderFollowerAutoFocusLeaderROIType, ref 2) |
|
251
|
|
|
|
|
|
|
# 0x004B - (ZeroShutterLagFailureReason, ref 2) |
|
252
|
|
|
|
|
|
|
# 0x004C - (TimeOfFlightAssistedAutoFocusEstimatorMSPMeasuredDepth, ref 2) |
|
253
|
|
|
|
|
|
|
# 0x004D - (TimeOfFlightAssistedAutoFocusEstimatorMSPSensorConfidence, ref 2) |
|
254
|
|
|
|
|
|
|
# 0x004E - (Camera, ref 2) |
|
255
|
|
|
|
|
|
|
); |
|
256
|
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
# PLIST-format CMTime structure (ref PH) |
|
258
|
|
|
|
|
|
|
# (CMTime ref https://developer.apple.com/library/ios/documentation/CoreMedia/Reference/CMTime/Reference/reference.html) |
|
259
|
|
|
|
|
|
|
%Image::ExifTool::Apple::RunTime = ( |
|
260
|
|
|
|
|
|
|
PROCESS_PROC => \&Image::ExifTool::PLIST::ProcessBinaryPLIST, |
|
261
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, |
|
262
|
|
|
|
|
|
|
NOTES => q{ |
|
263
|
|
|
|
|
|
|
This PLIST-format information contains the elements of a CMTime structure |
|
264
|
|
|
|
|
|
|
representing the amount of time the phone has been running since the last |
|
265
|
|
|
|
|
|
|
boot, not including standby time. |
|
266
|
|
|
|
|
|
|
}, |
|
267
|
|
|
|
|
|
|
timescale => { Name => 'RunTimeScale' }, # (seen 1000000000 --> ns) |
|
268
|
|
|
|
|
|
|
epoch => { Name => 'RunTimeEpoch' }, # (seen 0) |
|
269
|
|
|
|
|
|
|
value => { Name => 'RunTimeValue' }, # (should divide by RunTimeScale to get seconds) |
|
270
|
|
|
|
|
|
|
flags => { |
|
271
|
|
|
|
|
|
|
Name => 'RunTimeFlags', |
|
272
|
|
|
|
|
|
|
PrintConv => { BITMASK => { |
|
273
|
|
|
|
|
|
|
0 => 'Valid', |
|
274
|
|
|
|
|
|
|
1 => 'Has been rounded', |
|
275
|
|
|
|
|
|
|
2 => 'Positive infinity', |
|
276
|
|
|
|
|
|
|
3 => 'Negative infinity', |
|
277
|
|
|
|
|
|
|
4 => 'Indefinite', |
|
278
|
|
|
|
|
|
|
}}, |
|
279
|
|
|
|
|
|
|
}, |
|
280
|
|
|
|
|
|
|
); |
|
281
|
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
# Apple composite tags |
|
283
|
|
|
|
|
|
|
%Image::ExifTool::Apple::Composite = ( |
|
284
|
|
|
|
|
|
|
GROUPS => { 2 => 'Camera' }, |
|
285
|
|
|
|
|
|
|
RunTimeSincePowerUp => { |
|
286
|
|
|
|
|
|
|
Require => { |
|
287
|
|
|
|
|
|
|
0 => 'Apple:RunTimeValue', |
|
288
|
|
|
|
|
|
|
1 => 'Apple:RunTimeScale', |
|
289
|
|
|
|
|
|
|
}, |
|
290
|
|
|
|
|
|
|
ValueConv => '$val[1] ? $val[0] / $val[1] : undef', |
|
291
|
|
|
|
|
|
|
PrintConv => 'ConvertDuration($val)', |
|
292
|
|
|
|
|
|
|
}, |
|
293
|
|
|
|
|
|
|
); |
|
294
|
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
# add our composite tags |
|
296
|
|
|
|
|
|
|
Image::ExifTool::AddCompositeTags('Image::ExifTool::Apple'); |
|
297
|
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
#------------------------------------------------------------------------------ |
|
299
|
|
|
|
|
|
|
# Convert from binary PLIST format to a tag value we can use |
|
300
|
|
|
|
|
|
|
# Inputs: 0) binary plist data, 1) ExifTool ref |
|
301
|
|
|
|
|
|
|
# Returns: converted value |
|
302
|
|
|
|
|
|
|
sub ConvertPLIST($$) |
|
303
|
|
|
|
|
|
|
{ |
|
304
|
1
|
|
|
1
|
0
|
4
|
my ($val, $et) = @_; |
|
305
|
1
|
|
|
|
|
3
|
my $dirInfo = { DataPt => \$val }; |
|
306
|
1
|
|
|
|
|
8
|
require Image::ExifTool::PLIST; |
|
307
|
1
|
|
|
|
|
7
|
Image::ExifTool::PLIST::ProcessBinaryPLIST($et, $dirInfo); |
|
308
|
1
|
|
|
|
|
3
|
$val = $$dirInfo{Value}; |
|
309
|
1
|
50
|
33
|
|
|
14
|
if (ref $val eq 'HASH' and not $et->Options('Struct')) { |
|
310
|
0
|
|
|
|
|
0
|
require 'Image/ExifTool/XMPStruct.pl'; |
|
311
|
0
|
|
|
|
|
0
|
$val = Image::ExifTool::XMP::SerializeStruct($val); |
|
312
|
|
|
|
|
|
|
} |
|
313
|
1
|
|
|
|
|
6
|
return $val; |
|
314
|
|
|
|
|
|
|
} |
|
315
|
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
1; # end |
|
317
|
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
__END__ |