@sswroom/sswr 1.6.10 → 1.6.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/media.js CHANGED
@@ -1307,7 +1307,7 @@ export class EXIFData
1307
1307
  let ret = [];
1308
1308
  let i;
1309
1309
  for (i in this.exifMap)
1310
- ret.push(i);
1310
+ ret.push(Number(i));
1311
1311
  return ret;
1312
1312
  }
1313
1313
 
@@ -1319,11 +1319,20 @@ export class EXIFData
1319
1319
  return EXIFType.Unknown;
1320
1320
  }
1321
1321
 
1322
+ /**
1323
+ *
1324
+ * @param {number} id
1325
+ * @returns {EXIFItem|null}
1326
+ */
1322
1327
  getExifItem(id)
1323
1328
  {
1324
1329
  return this.exifMap[id];
1325
1330
  }
1326
1331
 
1332
+ /**
1333
+ *
1334
+ * @param {number} id
1335
+ */
1327
1336
  getExifUInt16(id)
1328
1337
  {
1329
1338
  let item = this.exifMap[id];
@@ -1563,7 +1572,9 @@ export class EXIFData
1563
1572
  {
1564
1573
  let subExif = this.getExifSubexif(34853);
1565
1574
  if (subExif == null)
1575
+ {
1566
1576
  return null;
1577
+ }
1567
1578
 
1568
1579
  let ret = {};
1569
1580
  let item1;
@@ -1587,11 +1598,13 @@ export class EXIFData
1587
1598
  }
1588
1599
  else
1589
1600
  {
1601
+ console.log("Latitude length is not valid");
1590
1602
  return null;
1591
1603
  }
1592
1604
  }
1593
1605
  else
1594
1606
  {
1607
+ console.log("Latitude type not valid");
1595
1608
  return null;
1596
1609
  }
1597
1610
  if (item1.type == EXIFType.STRING)
@@ -1603,12 +1616,14 @@ export class EXIFData
1603
1616
  }
1604
1617
  else
1605
1618
  {
1619
+ console.log("LatitudeRef type not valid");
1606
1620
  return null;
1607
1621
  }
1608
1622
  ret.lat = val;
1609
1623
  }
1610
1624
  else
1611
1625
  {
1626
+ console.log("Latitude / LatitudeRef not found");
1612
1627
  return null;
1613
1628
  }
1614
1629
  item1 = subExif.getExifItem(3);
@@ -1629,11 +1644,13 @@ export class EXIFData
1629
1644
  }
1630
1645
  else
1631
1646
  {
1647
+ console.log("Longitude length is not valid");
1632
1648
  return null;
1633
1649
  }
1634
1650
  }
1635
1651
  else
1636
1652
  {
1653
+ console.log("Longitude type not valid");
1637
1654
  return null;
1638
1655
  }
1639
1656
  if (item1.type == EXIFType.STRING)
@@ -1645,12 +1662,14 @@ export class EXIFData
1645
1662
  }
1646
1663
  else
1647
1664
  {
1665
+ console.log("LongitudeRef type not valid");
1648
1666
  return null;
1649
1667
  }
1650
1668
  ret.lon = val;
1651
1669
  }
1652
1670
  else
1653
1671
  {
1672
+ console.log("Longitude / LongitudeRef not found");
1654
1673
  return null;
1655
1674
  }
1656
1675
  item1 = subExif.getExifItem(5);
@@ -1665,11 +1684,13 @@ export class EXIFData
1665
1684
  }
1666
1685
  else
1667
1686
  {
1687
+ console.log("Altitude length is not valid");
1668
1688
  return null;
1669
1689
  }
1670
1690
  }
1671
1691
  else
1672
1692
  {
1693
+ console.log("Altitude Type is not valid");
1673
1694
  return null;
1674
1695
  }
1675
1696
  if (item1.type == EXIFType.Bytes && item1.data.length == 1)
@@ -1688,13 +1709,14 @@ export class EXIFData
1688
1709
  }
1689
1710
  else
1690
1711
  {
1691
- return false;
1712
+ console.log("AltitudeRef Type is not valid");
1713
+ return null;
1692
1714
  }
1693
1715
  ret.altitude = val;
1694
1716
  }
1695
1717
  else
1696
1718
  {
1697
- ret.altitude = 0;
1719
+ ret.altitude = null;
1698
1720
  }
1699
1721
  item1 = subExif.getExifItem(7);
1700
1722
  item2 = subExif.getExifItem(29);
@@ -1709,6 +1731,7 @@ export class EXIFData
1709
1731
  {
1710
1732
  if (item1.data[1] != 1 || item1.data[3] != 1)
1711
1733
  {
1734
+ console.log("GPSTime denominator is not valid");
1712
1735
  return null;
1713
1736
  }
1714
1737
  else
@@ -1722,13 +1745,15 @@ export class EXIFData
1722
1745
  }
1723
1746
  else
1724
1747
  {
1748
+ console.log("GPSTime Type is not valid");
1725
1749
  return null;
1726
1750
  }
1727
- if (item2.type == EXIFType.STRING && item2.data.length == 11)
1751
+ if (item2.type == EXIFType.STRING && item2.data.length >= 10)
1728
1752
  {
1729
1753
  let dateArr = item2.data.split(":");
1730
1754
  if (dateArr.length != 3)
1731
1755
  {
1756
+ console.log("GPSDate is not valid");
1732
1757
  return null;
1733
1758
  }
1734
1759
  else
@@ -1741,12 +1766,13 @@ export class EXIFData
1741
1766
  tv.minute = mm;
1742
1767
  tv.second = ss;
1743
1768
  tv.nanosec = Math.floor(ms * 1000000000);
1744
- tv.tzQhr = data.DateTimeUtil.getLocalTzQhr();
1769
+ tv.tzQhr = 0;
1745
1770
  ret.gpsTime = data.Timestamp.fromTimeValue(tv);
1746
1771
  }
1747
1772
  }
1748
1773
  else
1749
1774
  {
1775
+ console.log("GPSDate format is not valid", item2.data);
1750
1776
  return null;
1751
1777
  }
1752
1778
  }
@@ -1764,7 +1790,7 @@ export class EXIFData
1764
1790
  for (i in this.exifMap)
1765
1791
  {
1766
1792
  item = this.exifMap[i];
1767
- name = EXIFData.getEXIFName(this.exifMaker, id, i);
1793
+ name = EXIFData.getEXIFName(this.exifMaker, i, id);
1768
1794
  if (item.type == EXIFType.SubExif)
1769
1795
  {
1770
1796
  ret[name] = item.data.getProperties(i);
@@ -1789,6 +1815,1791 @@ export class EXIFData
1789
1815
  return ret;
1790
1816
  }
1791
1817
 
1818
+ toString(linePrefix)
1819
+ {
1820
+ let sb = [];
1821
+ let exItem;
1822
+ let i;
1823
+ let j;
1824
+ let k;
1825
+ let v;
1826
+
1827
+ sb.push("EXIF Content:");
1828
+ let exifIds = this.getExifIds();
1829
+ i = 0;
1830
+ j = exifIds.length;
1831
+ while (i < j)
1832
+ {
1833
+ v = exifIds[i];
1834
+ sb.push("\r\n");
1835
+ if (linePrefix) sb.push(linePrefix);
1836
+ sb.push("Id = ");
1837
+ sb.push(v);
1838
+ sb.push(", name = ");
1839
+ sb.push(EXIFData.getEXIFName(this.exifMaker, v));
1840
+ if ((exItem = this.getExifItem(v)) != null)
1841
+ {
1842
+ if (exItem.type == EXIFType.SubExif)
1843
+ {
1844
+ let i2;
1845
+ let j2;
1846
+ let v2;
1847
+ let subExItem;
1848
+ let subExif = exItem.data;
1849
+ let subExIds = subExif.getExifIds();
1850
+ i2 = 0;
1851
+ j2 = subExIds.length;
1852
+ while (i2 < j2)
1853
+ {
1854
+ v2 = subExIds[i2];
1855
+ sb.push("\r\n");
1856
+ if (linePrefix) sb.push(linePrefix);
1857
+ sb.push(" Subid = ");
1858
+ sb.push(v2);
1859
+ sb.push(", name = ");
1860
+ sb.push(EXIFData.getEXIFName(this.exifMaker, v2, v));
1861
+
1862
+ if ((subExItem = subExif.getExifItem(v2)) != null)
1863
+ {
1864
+ if (subExItem.type == EXIFType.STRING)
1865
+ {
1866
+ sb.push(", value = ");
1867
+ sb.push(subExItem.data);
1868
+ }
1869
+ else if (subExItem.type == EXIFType.Double)
1870
+ {
1871
+ let valBuff = subExItem.data;
1872
+ k = 0;
1873
+ while (k < valBuff.length)
1874
+ {
1875
+ if (k == 0)
1876
+ {
1877
+ sb.push(", value = ");
1878
+ }
1879
+ else
1880
+ {
1881
+ sb.push(", ");
1882
+ }
1883
+ sb.push(valBuff[k]);
1884
+ k++;
1885
+ }
1886
+ }
1887
+ else if (subExItem.type == EXIFType.Bytes)
1888
+ {
1889
+ let valBuff = subExItem.data;
1890
+ sb.push(", value = ");
1891
+ if (valBuff.length > 1024)
1892
+ {
1893
+ sb.push(valBuff.length);
1894
+ sb.push(" bytes: ");
1895
+ sb.push(text.u8Arr2Hex(new Uint8Array(valBuff, 0, 256), ' ', "\r\n"));
1896
+ sb.push("\r\n...\r\n");
1897
+ sb.push(text.u8Arr2Hex(new Uint8Array(valBuff, (valBuff.length & ~15) - 256, 256 + (valBuff.length & 15)), ' ', "\r\n"));
1898
+ }
1899
+ else
1900
+ {
1901
+ sb.push(text.u8Arr2Hex(new Uint8Array(valBuff), ' ', "\r\n"));
1902
+ }
1903
+ }
1904
+ else if (subExItem.type == EXIFType.UINT16)
1905
+ {
1906
+ let valBuff = subExItem.data;
1907
+ k = 0;
1908
+ while (k < valBuff.length)
1909
+ {
1910
+ if (k == 0)
1911
+ {
1912
+ sb.push(", value = ");
1913
+ }
1914
+ else
1915
+ {
1916
+ sb.push(", ");
1917
+ }
1918
+ sb.push(valBuff[k]);
1919
+ k++;
1920
+ }
1921
+ }
1922
+ else if (subExItem.type == EXIFType.UINT32)
1923
+ {
1924
+ let valBuff = subExItem.data;
1925
+ k = 0;
1926
+ while (k < valBuff.length)
1927
+ {
1928
+ if (k == 0)
1929
+ {
1930
+ sb.push(", value = ");
1931
+ }
1932
+ else
1933
+ {
1934
+ sb.push(", ");
1935
+ }
1936
+ sb.push(valBuff[k]);
1937
+ k++;
1938
+ }
1939
+ }
1940
+ else if (subExItem.type == EXIFType.Rational)
1941
+ {
1942
+ let valBuff = subExItem.data;
1943
+ k = 0;
1944
+ while (k < valBuff.length)
1945
+ {
1946
+ if (k == 0)
1947
+ {
1948
+ sb.push(", value = ");
1949
+ }
1950
+ else
1951
+ {
1952
+ sb.push(", ");
1953
+ }
1954
+ sb.push(valBuff[k]);
1955
+ sb.push(" / ");
1956
+ sb.push(valBuff[k + 1]);
1957
+ if (valBuff[k + 1] != 0)
1958
+ {
1959
+ sb.push(" (");
1960
+ sb.push(valBuff[k] / valBuff[k + 1]);
1961
+ sb.push(")");
1962
+ }
1963
+ k += 2;
1964
+ }
1965
+ }
1966
+ else if (subExItem.type == EXIFType.SRational)
1967
+ {
1968
+ let valBuff = subExItem.data;
1969
+ k = 0;
1970
+ while (k < valBuff.length)
1971
+ {
1972
+ if (k == 0)
1973
+ {
1974
+ sb.push(", value = ");
1975
+ }
1976
+ else
1977
+ {
1978
+ sb.push(", ");
1979
+ }
1980
+ sb.push(valBuff[k]);
1981
+ sb.push(" / ");
1982
+ sb.push(valBuff[k + 1]);
1983
+ if (valBuff[k + 1] != 0)
1984
+ {
1985
+ sb.push(" (");
1986
+ sb.push(valBuff[k] / valBuff[k + 1]);
1987
+ sb.push(")");
1988
+ }
1989
+ k += 2;
1990
+ }
1991
+ }
1992
+ else if (subExItem.type == EXIFType.INT16)
1993
+ {
1994
+ let valBuff = subExItem.data;
1995
+ k = 0;
1996
+ while (k < valBuff.length)
1997
+ {
1998
+ if (k == 0)
1999
+ {
2000
+ sb.push(", value = ");
2001
+ }
2002
+ else
2003
+ {
2004
+ sb.push(", ");
2005
+ }
2006
+ sb.push(valBuff[k]);
2007
+ k++;
2008
+ }
2009
+ }
2010
+ else if (subExItem.type == EXIFType.INT32)
2011
+ {
2012
+ let valBuff = subExItem.data;
2013
+ k = 0;
2014
+ while (k < valBuff.length)
2015
+ {
2016
+ if (k == 0)
2017
+ {
2018
+ sb.push(", value = ");
2019
+ }
2020
+ else
2021
+ {
2022
+ sb.push(", ");
2023
+ }
2024
+ sb.push(valBuff[k]);
2025
+ k++;
2026
+ }
2027
+ }
2028
+ else if (subExItem.id == 37500)
2029
+ {
2030
+ let valBuff = subExItem.data;
2031
+ let innerExif;
2032
+ let nnlinePrefix;
2033
+ if ((innerExif = this.parseMakerNote(valBuff)) != null)
2034
+ {
2035
+ sb.push(", Format = ");
2036
+ sb.push(innerExif.getEXIFMaker());
2037
+ sb.push(", Inner ");
2038
+ if (linePrefix)
2039
+ {
2040
+ sb.push(innerExif.toString(" "+linePrefix));
2041
+ }
2042
+ else
2043
+ {
2044
+ sb.push(innerExif.toString(" "));
2045
+ }
2046
+ }
2047
+ else
2048
+ {
2049
+ sb.push(", value (Other) = ");
2050
+ sb.push(text.u8Arr2Hex(valBuff, ' ', "\r\n"));
2051
+ }
2052
+ }
2053
+ else if (subExItem.type == EXIFType.Other)
2054
+ {
2055
+ let valBuff = subExItem.data;
2056
+ if (this.exifMaker == EXIFMaker.Olympus && subExItem.id == 0)
2057
+ {
2058
+ sb.push(", value = ");
2059
+ sb.push(valBuff); //////////////////
2060
+ }
2061
+ else
2062
+ {
2063
+ sb.push(", value (Other) = ");
2064
+ sb.push(text.u8Arr2Hex(valBuff, ' ', "\r\n"));
2065
+ }
2066
+ }
2067
+ else
2068
+ {
2069
+ let valBuff = subExItem.data;
2070
+ sb.push(", value (Unk) = ");
2071
+ sb.push(text.u8Arr2Hex(valBuff, ' ', "\r\n"));
2072
+ }
2073
+ }
2074
+ i2++;
2075
+ }
2076
+ }
2077
+ else if (exItem.type == EXIFType.STRING)
2078
+ {
2079
+ sb.push(", value = ");
2080
+ sb.push(exItem.data);
2081
+ }
2082
+ else if (exItem.type == EXIFType.Double)
2083
+ {
2084
+ let valBuff = exItem.data;
2085
+ k = 0;
2086
+ while (k < valBuff.length)
2087
+ {
2088
+ if (k == 0)
2089
+ {
2090
+ sb.push(", value = ");
2091
+ }
2092
+ else
2093
+ {
2094
+ sb.push(", ");
2095
+ }
2096
+ sb.push(valBuff[k]);
2097
+ k++;
2098
+ }
2099
+ }
2100
+ else if (exItem.type == EXIFType.Bytes)
2101
+ {
2102
+ let valBuff = exItem.data;
2103
+ sb.push(", value = ");
2104
+ if (exItem.id >= 40091 && exItem.id <= 40095)
2105
+ {
2106
+ let enc = new text.UTF16LETextBinEnc();
2107
+ if (valBuff[valBuff.length - 2] == 0)
2108
+ {
2109
+ sb.push(enc.encodeBin(new Uint8Array(valBuff, 0, valBuff.length - 2)));
2110
+ }
2111
+ else
2112
+ {
2113
+ sb.push(enc.encodeBin(new Uint8Array(valBuff, 0, valBuff.length)));
2114
+ }
2115
+ }
2116
+ else
2117
+ {
2118
+ if (exItem.data.length > 1024)
2119
+ {
2120
+ sb.push(exItem.data.length);
2121
+ sb.push(" bytes: ");
2122
+ sb.push(text.u8Arr2Hex(new Uint8Array(valBuff, 0, 256), ' ', "\r\n"));
2123
+ sb.push("\r\n...\r\n");
2124
+ sb.push(text.u8Arr2Hex(new Uint8Array(valBuff, (valBuff.length & ~15) - 256, 256 + (valBuff.length & 15)), ' ', "\r\n"));
2125
+ }
2126
+ else
2127
+ {
2128
+ sb.push(text.u8Arr2Hex(new Uint8Array(valBuff), ' ', "\r\n"));
2129
+ }
2130
+ }
2131
+ }
2132
+ else if (exItem.type == EXIFType.UINT16)
2133
+ {
2134
+ let valBuff = exItem.data;
2135
+ if (this.exifMaker == EXIFMaker.Canon && exItem.id == 1)
2136
+ {
2137
+ sb.push(this.toStringCanonCameraSettings(linePrefix, valBuff));
2138
+ }
2139
+ else if (this.exifMaker == EXIFMaker.Canon && exItem.id == 2)
2140
+ {
2141
+ sb.push(this.toStringCanonFocalLength(linePrefix, valBuff));
2142
+ }
2143
+ else if (this.exifMaker == EXIFMaker.Canon && exItem.id == 4)
2144
+ {
2145
+ sb.push(this.toStringCanonShotInfo(linePrefix, valBuff));
2146
+ }
2147
+ else
2148
+ {
2149
+ k = 0;
2150
+ while (k < valBuff.length)
2151
+ {
2152
+ if (k == 0)
2153
+ {
2154
+ sb.push(", value = ");
2155
+ }
2156
+ else
2157
+ {
2158
+ sb.push(", ");
2159
+ }
2160
+ sb.push(valBuff[k]);
2161
+ k++;
2162
+ }
2163
+ }
2164
+ }
2165
+ else if (exItem.type == EXIFType.UINT32)
2166
+ {
2167
+ let valBuff = exItem.data;
2168
+ k = 0;
2169
+ while (k < valBuff.length)
2170
+ {
2171
+ if (k == 0)
2172
+ {
2173
+ sb.push(", value = ");
2174
+ }
2175
+ else
2176
+ {
2177
+ sb.push(", ");
2178
+ }
2179
+ sb.push(valBuff[k]);
2180
+ k++;
2181
+ }
2182
+ }
2183
+ else if (exItem.type == EXIFType.Rational)
2184
+ {
2185
+ let valBuff = exItem.data;
2186
+ k = 0;
2187
+ while (k < valBuff.length)
2188
+ {
2189
+ if (k == 0)
2190
+ {
2191
+ sb.push(", value = ");
2192
+ }
2193
+ else
2194
+ {
2195
+ sb.push(", ");
2196
+ }
2197
+ sb.push(valBuff[k]);
2198
+ sb.push(" / ");
2199
+ sb.push(valBuff[k + 1]);
2200
+ if (valBuff[k + 1] != 0)
2201
+ {
2202
+ sb.push(" (");
2203
+ sb.push(valBuff[k] / valBuff[k + 1]);
2204
+ sb.push(")");
2205
+ }
2206
+ k += 2;
2207
+ }
2208
+ }
2209
+ else if (exItem.type == EXIFType.SRational)
2210
+ {
2211
+ let valBuff = exItem.data;
2212
+ k = 0;
2213
+ while (k < valBuff.length)
2214
+ {
2215
+ if (k == 0)
2216
+ {
2217
+ sb.push(", value = ");
2218
+ }
2219
+ else
2220
+ {
2221
+ sb.push(", ");
2222
+ }
2223
+ sb.push(valBuff[k]);
2224
+ sb.push(" / ");
2225
+ sb.push(valBuff[k + 1]);
2226
+ if (valBuff[k + 1] != 0)
2227
+ {
2228
+ sb.push(" (");
2229
+ sb.push(valBuff[k] / valBuff[k + 1]);
2230
+ sb.push(")");
2231
+ }
2232
+ k += 2;
2233
+ }
2234
+ }
2235
+ else if (exItem.type == EXIFType.INT16)
2236
+ {
2237
+ let valBuff = exItem.data;
2238
+ k = 0;
2239
+ while (k < valBuff.length)
2240
+ {
2241
+ if (k == 0)
2242
+ {
2243
+ sb.push(", value = ");
2244
+ }
2245
+ else
2246
+ {
2247
+ sb.push(", ");
2248
+ }
2249
+ sb.push(valBuff[k]);
2250
+ k++;
2251
+ }
2252
+ }
2253
+ else if (exItem.type == EXIFType.INT32)
2254
+ {
2255
+ let valBuff = exItem.data;
2256
+ k = 0;
2257
+ while (k < valBuff.length)
2258
+ {
2259
+ if (k == 0)
2260
+ {
2261
+ sb.push(", value = ");
2262
+ }
2263
+ else
2264
+ {
2265
+ sb.push(", ");
2266
+ }
2267
+ sb.push(valBuff[k]);
2268
+ k++;
2269
+ }
2270
+ }
2271
+ else if (exItem.type == EXIFType.Other)
2272
+ {
2273
+ if (this.exifMaker == EXIFMaker.Olympus && exItem.id == 521)
2274
+ {
2275
+ sb.push(", value = ");
2276
+ sb.push(exItem.data);
2277
+ }
2278
+ else
2279
+ {
2280
+ // UInt8 *valBuff;
2281
+ // valBuff = (UInt8*)exItem->dataBuff;
2282
+ sb.push(", Other: size = ");
2283
+ sb.push(exItem.data.length);
2284
+ // sb->AppendHex(valBuff, subExItem->cnt, ' ', Text::StringBuilder::LBT_CRLF);
2285
+ }
2286
+ }
2287
+ else
2288
+ {
2289
+ /* UInt8 *valBuff;
2290
+ if (exItem->cnt <= 4)
2291
+ {
2292
+ valBuff = (UInt8*)&exItem->value;
2293
+ }
2294
+ else
2295
+ {
2296
+ valBuff = (UInt8*)exItem->dataBuff;
2297
+ }*/
2298
+ sb.push(", Unknown: size = ");
2299
+ sb.push(exItem.data.length);
2300
+ // sb->AppendHex(valBuff, subExItem->cnt, ' ', Text::StringBuilder::LBT_CRLF);
2301
+ }
2302
+ }
2303
+ i++;
2304
+ }
2305
+ let loc;
2306
+ if ((loc = this.getPhotoLocation()) != null)
2307
+ {
2308
+ sb.push("\r\nGPS Location: ");
2309
+ sb.push(loc.lat);
2310
+ sb.push(", ");
2311
+ sb.push(loc.lon);
2312
+ sb.push(", ");
2313
+ sb.push(loc.altitude);
2314
+ }
2315
+ return sb.join("");
2316
+ }
2317
+
2318
+ toStringCanonCameraSettings(linePrefix, valBuff)
2319
+ {
2320
+ let sb = [];
2321
+ let isInt16;
2322
+ let isUInt16;
2323
+ let k;
2324
+ k = 0;
2325
+ while (k < valBuff.length)
2326
+ {
2327
+ sb.push("\r\n");
2328
+ if (linePrefix) sb.push(linePrefix);
2329
+ sb.push(" ");
2330
+ isInt16 = false;
2331
+ isUInt16 = false;
2332
+ switch (k)
2333
+ {
2334
+ case 1:
2335
+ sb.push("MacroMode = ");
2336
+ switch (valBuff[k])
2337
+ {
2338
+ case 1:
2339
+ sb.push("1-Macro");
2340
+ break;
2341
+ case 2:
2342
+ sb.push("2-Normal");
2343
+ break;
2344
+ default:
2345
+ sb.push(valBuff[k]);
2346
+ break;
2347
+ }
2348
+ break;
2349
+ case 2:
2350
+ sb.push("SelfTimer = ");
2351
+ isInt16 = true;
2352
+ break;
2353
+ case 3:
2354
+ sb.push("Quality = ");
2355
+ switch (valBuff[k])
2356
+ {
2357
+ case -1:
2358
+ sb.push("-1-n/a");
2359
+ break;
2360
+ case 1:
2361
+ sb.push("1-Economy");
2362
+ break;
2363
+ case 2:
2364
+ sb.push("2-Normal");
2365
+ break;
2366
+ case 3:
2367
+ sb.push("3-Fine");
2368
+ break;
2369
+ case 4:
2370
+ sb.push("4-RAW");
2371
+ break;
2372
+ case 5:
2373
+ sb.push("5-Superfine");
2374
+ break;
2375
+ case 7:
2376
+ sb.push("7-CRAW");
2377
+ break;
2378
+ case 130:
2379
+ sb.push("130-Normal Movie");
2380
+ break;
2381
+ case 131:
2382
+ sb.push("131-Movie (2)");
2383
+ break;
2384
+ default:
2385
+ sb.push(valBuff[k]);
2386
+ break;
2387
+ }
2388
+ break;
2389
+ case 4:
2390
+ sb.push("CanonFlashMode = ");
2391
+ switch (valBuff[k])
2392
+ {
2393
+ case -1:
2394
+ sb.push("-1-n/a");
2395
+ break;
2396
+ case 0:
2397
+ sb.push("0-Off");
2398
+ break;
2399
+ case 1:
2400
+ sb.push("1-Auto");
2401
+ break;
2402
+ case 2:
2403
+ sb.push("2-On");
2404
+ break;
2405
+ case 3:
2406
+ sb.push("3-Red-eye Reduction");
2407
+ break;
2408
+ case 4:
2409
+ sb.push("4-Slow Sync");
2410
+ break;
2411
+ case 5:
2412
+ sb.push("5-Red-eye Reduction (Auto)");
2413
+ break;
2414
+ case 6:
2415
+ sb.push("6-Red-eye Reduction (On)");
2416
+ break;
2417
+ case 16:
2418
+ sb.push("16-External Flash");
2419
+ break;
2420
+ default:
2421
+ sb.push(valBuff[k]);
2422
+ break;
2423
+ }
2424
+ break;
2425
+ case 5:
2426
+ sb.push("ContinuousDrive = ");
2427
+ switch (valBuff[k])
2428
+ {
2429
+ case 0:
2430
+ sb.push("0-Single");
2431
+ break;
2432
+ case 1:
2433
+ sb.push("1-Continuous");
2434
+ break;
2435
+ case 2:
2436
+ sb.push("2-Movie");
2437
+ break;
2438
+ case 3:
2439
+ sb.push("3-Continuous, Speed Priority");
2440
+ break;
2441
+ case 4:
2442
+ sb.push("4-Continuous, Low");
2443
+ break;
2444
+ case 5:
2445
+ sb.push("5-Continuous, High");
2446
+ break;
2447
+ case 6:
2448
+ sb.push("6-Silent Single");
2449
+ break;
2450
+ case 9:
2451
+ sb.push("9-Single, Silent");
2452
+ break;
2453
+ case 10:
2454
+ sb.push("10-Continuous, Silent");
2455
+ break;
2456
+ default:
2457
+ sb.push(valBuff[k]);
2458
+ break;
2459
+ }
2460
+ break;
2461
+ case 7:
2462
+ sb.push("FocusMode = ");
2463
+ switch (valBuff[k])
2464
+ {
2465
+ case 0:
2466
+ sb.push("0-One-shot AF");
2467
+ break;
2468
+ case 1:
2469
+ sb.push("1-AI Servo AF");
2470
+ break;
2471
+ case 2:
2472
+ sb.push("2-AI Focus AF");
2473
+ break;
2474
+ case 3:
2475
+ sb.push("3-Manual Focus");
2476
+ break;
2477
+ case 4:
2478
+ sb.push("4-Single");
2479
+ break;
2480
+ case 5:
2481
+ sb.push("5-Continuous");
2482
+ break;
2483
+ case 6:
2484
+ sb.push("6-Manual Focus");
2485
+ break;
2486
+ case 16:
2487
+ sb.push("16-Pan Focus");
2488
+ break;
2489
+ case 256:
2490
+ sb.push("256-AF+MF");
2491
+ break;
2492
+ case 512:
2493
+ sb.push("512-Movie Snap Focus");
2494
+ break;
2495
+ case 519:
2496
+ sb.push("519-Movie Servo AF");
2497
+ break;
2498
+ default:
2499
+ sb.push(valBuff[k]);
2500
+ break;
2501
+ }
2502
+ break;
2503
+ case 9:
2504
+ sb.push("RecordMode = ");
2505
+ switch (valBuff[k])
2506
+ {
2507
+ case 1:
2508
+ sb.push("1-JPEG");
2509
+ break;
2510
+ case 2:
2511
+ sb.push("2-CRW+THM");
2512
+ break;
2513
+ case 3:
2514
+ sb.push("3-AVI+THM");
2515
+ break;
2516
+ case 4:
2517
+ sb.push("4-TIF");
2518
+ break;
2519
+ case 5:
2520
+ sb.push("5-TIF+JPEG");
2521
+ break;
2522
+ case 6:
2523
+ sb.push("6-CR2");
2524
+ break;
2525
+ case 7:
2526
+ sb.push("7-CR2+JPEG");
2527
+ break;
2528
+ case 9:
2529
+ sb.push("9-MOV");
2530
+ break;
2531
+ case 10:
2532
+ sb.push("10-MP4");
2533
+ break;
2534
+ case 11:
2535
+ sb.push("11-CRM");
2536
+ break;
2537
+ case 12:
2538
+ sb.push("12-CR3");
2539
+ break;
2540
+ case 13:
2541
+ sb.push("13-CR3+JPEG");
2542
+ break;
2543
+ default:
2544
+ sb.push(valBuff[k]);
2545
+ break;
2546
+ }
2547
+ break;
2548
+ case 10:
2549
+ sb.push("CanonImageSize = ");
2550
+ switch (valBuff[k])
2551
+ {
2552
+ case -1:
2553
+ sb.push("-1-n/a");
2554
+ break;
2555
+ case 0:
2556
+ sb.push("0-Large");
2557
+ break;
2558
+ case 1:
2559
+ sb.push("1-Medium");
2560
+ break;
2561
+ case 2:
2562
+ sb.push("2-Small");
2563
+ break;
2564
+ case 5:
2565
+ sb.push("5-Medium 1");
2566
+ break;
2567
+ case 6:
2568
+ sb.push("6-Medium 2");
2569
+ break;
2570
+ case 7:
2571
+ sb.push("7-Medium 3");
2572
+ break;
2573
+ case 8:
2574
+ sb.push("8-Postcard");
2575
+ break;
2576
+ case 9:
2577
+ sb.push("9-Widescreen");
2578
+ break;
2579
+ case 10:
2580
+ sb.push("10-Medium Widescreen");
2581
+ break;
2582
+ case 14:
2583
+ sb.push("14-Small 1");
2584
+ break;
2585
+ case 15:
2586
+ sb.push("15-Small 2");
2587
+ break;
2588
+ case 16:
2589
+ sb.push("16-Small 3");
2590
+ break;
2591
+ case 128:
2592
+ sb.push("128-640x480 Movie");
2593
+ break;
2594
+ case 129:
2595
+ sb.push("129-Medium Movie");
2596
+ break;
2597
+ case 130:
2598
+ sb.push("130-Small Movie");
2599
+ break;
2600
+ case 137:
2601
+ sb.push("137-1280x720 Movie");
2602
+ break;
2603
+ case 142:
2604
+ sb.push("142-1920x1080 Movie");
2605
+ break;
2606
+ case 143:
2607
+ sb.push("143-4096x2160 Movie");
2608
+ break;
2609
+ default:
2610
+ sb.push(valBuff[k]);
2611
+ break;
2612
+ }
2613
+ break;
2614
+ case 11:
2615
+ sb.push("EasyMode = ");
2616
+ switch (valBuff[k])
2617
+ {
2618
+ case 0:
2619
+ sb.push("0-Full auto");
2620
+ break;
2621
+ case 1:
2622
+ sb.push("1-Manual");
2623
+ break;
2624
+ case 2:
2625
+ sb.push("2-Landscape");
2626
+ break;
2627
+ case 3:
2628
+ sb.push("3-Fast shutter");
2629
+ break;
2630
+ case 4:
2631
+ sb.push("4-Slow shutter");
2632
+ break;
2633
+ case 5:
2634
+ sb.push("5-Night");
2635
+ break;
2636
+ case 6:
2637
+ sb.push("6-Grey Scale");
2638
+ break;
2639
+ case 7:
2640
+ sb.push("7-Sepia");
2641
+ break;
2642
+ case 8:
2643
+ sb.push("8-Portrait");
2644
+ break;
2645
+ case 9:
2646
+ sb.push("9-Sports");
2647
+ break;
2648
+ case 10:
2649
+ sb.push("10-Macro");
2650
+ break;
2651
+ case 11:
2652
+ sb.push("11-Black & White");
2653
+ break;
2654
+ case 12:
2655
+ sb.push("12-Pan focus");
2656
+ break;
2657
+ case 13:
2658
+ sb.push("13-Vivid");
2659
+ break;
2660
+ case 14:
2661
+ sb.push("14-Neutral");
2662
+ break;
2663
+ case 15:
2664
+ sb.push("15-Flash Off");
2665
+ break;
2666
+ case 16:
2667
+ sb.push("16-Long Shutter");
2668
+ break;
2669
+ case 17:
2670
+ sb.push("17-Super Macro");
2671
+ break;
2672
+ case 18:
2673
+ sb.push("18-Foliage");
2674
+ break;
2675
+ case 19:
2676
+ sb.push("19-Indoor");
2677
+ break;
2678
+ case 20:
2679
+ sb.push("20-Fireworks");
2680
+ break;
2681
+ case 21:
2682
+ sb.push("21-Beach");
2683
+ break;
2684
+ case 22:
2685
+ sb.push("22-Underwater");
2686
+ break;
2687
+ case 23:
2688
+ sb.push("23-Snow");
2689
+ break;
2690
+ case 24:
2691
+ sb.push("24-Kids & Pets");
2692
+ break;
2693
+ case 25:
2694
+ sb.push("25-Night Snapshot");
2695
+ break;
2696
+ case 26:
2697
+ sb.push("26-Digital Macro");
2698
+ break;
2699
+ case 27:
2700
+ sb.push("27-My Colors");
2701
+ break;
2702
+ case 28:
2703
+ sb.push("28-Movie Snap");
2704
+ break;
2705
+ case 29:
2706
+ sb.push("29-Super Macro 2");
2707
+ break;
2708
+ case 30:
2709
+ sb.push("30-Color Accent");
2710
+ break;
2711
+ case 31:
2712
+ sb.push("31-Color Swap");
2713
+ break;
2714
+ case 32:
2715
+ sb.push("32-Aquarium");
2716
+ break;
2717
+ case 33:
2718
+ sb.push("33-ISO 3200");
2719
+ break;
2720
+ case 34:
2721
+ sb.push("34-ISO 6400");
2722
+ break;
2723
+ case 35:
2724
+ sb.push("35-Creative Light Effect");
2725
+ break;
2726
+ case 36:
2727
+ sb.push("36-Easy");
2728
+ break;
2729
+ case 37:
2730
+ sb.push("37-Quick Shot");
2731
+ break;
2732
+ case 38:
2733
+ sb.push("38-Creative Auto");
2734
+ break;
2735
+ case 39:
2736
+ sb.push("39-Zoom Blur");
2737
+ break;
2738
+ case 40:
2739
+ sb.push("40-Low Light");
2740
+ break;
2741
+ case 41:
2742
+ sb.push("41-Nostalgic");
2743
+ break;
2744
+ case 42:
2745
+ sb.push("42-Super Vivid");
2746
+ break;
2747
+ case 43:
2748
+ sb.push("43-Poster Effect");
2749
+ break;
2750
+ case 44:
2751
+ sb.push("44-Face Self-Time");
2752
+ break;
2753
+ case 45:
2754
+ sb.push("45-Smile");
2755
+ break;
2756
+ case 46:
2757
+ sb.push("46-Wink Self-Timer");
2758
+ break;
2759
+ case 47:
2760
+ sb.push("47-Fisheye Effect");
2761
+ break;
2762
+ case 48:
2763
+ sb.push("48-Miniature Effect");
2764
+ break;
2765
+ case 49:
2766
+ sb.push("49-High-speed Burst");
2767
+ break;
2768
+ case 50:
2769
+ sb.push("50-Best Image Selection");
2770
+ break;
2771
+ case 51:
2772
+ sb.push("51-High Dynamic Range");
2773
+ break;
2774
+ case 52:
2775
+ sb.push("52-Handheld Night Scene");
2776
+ break;
2777
+ case 53:
2778
+ sb.push("53-Movie Digest");
2779
+ break;
2780
+ case 54:
2781
+ sb.push("54-Live View Control");
2782
+ break;
2783
+ case 55:
2784
+ sb.push("55-Discreet");
2785
+ break;
2786
+ case 56:
2787
+ sb.push("56-Blur Reduction");
2788
+ break;
2789
+ case 57:
2790
+ sb.push("57-Monochrome");
2791
+ break;
2792
+ case 58:
2793
+ sb.push("58-Toy Camera Effect");
2794
+ break;
2795
+ case 59:
2796
+ sb.push("59-Scene Intelligent Auto");
2797
+ break;
2798
+ case 60:
2799
+ sb.push("60-High-speed Burst HQ");
2800
+ break;
2801
+ case 61:
2802
+ sb.push("61-Smooth Skin");
2803
+ break;
2804
+ case 62:
2805
+ sb.push("62-Soft Focus");
2806
+ break;
2807
+ case 257:
2808
+ sb.push("257-Spotlight");
2809
+ break;
2810
+ case 258:
2811
+ sb.push("258-Night 2");
2812
+ break;
2813
+ case 259:
2814
+ sb.push("259-Night+");
2815
+ break;
2816
+ case 260:
2817
+ sb.push("260-Super Night");
2818
+ break;
2819
+ case 261:
2820
+ sb.push("261-Sunset");
2821
+ break;
2822
+ case 263:
2823
+ sb.push("263-Night Scene");
2824
+ break;
2825
+ case 264:
2826
+ sb.push("264-Surface");
2827
+ break;
2828
+ case 265:
2829
+ sb.push("265-Low Light 2");
2830
+ break;
2831
+ default:
2832
+ sb.push(valBuff[k]);
2833
+ break;
2834
+ }
2835
+ break;
2836
+ case 12:
2837
+ sb.push("DigitalZoom = ");
2838
+ switch (valBuff[k])
2839
+ {
2840
+ case 0:
2841
+ sb.push("0-None");
2842
+ break;
2843
+ case 1:
2844
+ sb.push("1-2x");
2845
+ break;
2846
+ case 2:
2847
+ sb.push("2-4x");
2848
+ break;
2849
+ case 3:
2850
+ sb.push("3-Other");
2851
+ break;
2852
+ default:
2853
+ sb.push(valBuff[k]);
2854
+ break;
2855
+ }
2856
+ break;
2857
+ case 13:
2858
+ sb.push("Contrast = ");
2859
+ isInt16 = true;
2860
+ break;
2861
+ case 14:
2862
+ sb.push("Saturation = ");
2863
+ isInt16 = true;
2864
+ break;
2865
+ case 15:
2866
+ sb.push("Sharpness = ");
2867
+ isInt16 = true;
2868
+ break;
2869
+ case 16:
2870
+ sb.push("CameraISO = ");
2871
+ isInt16 = true;
2872
+ break;
2873
+ case 17:
2874
+ sb.push("MeteringMode = ");
2875
+ switch (valBuff[k])
2876
+ {
2877
+ case 0:
2878
+ sb.push("0-Default");
2879
+ break;
2880
+ case 1:
2881
+ sb.push("1-Spot");
2882
+ break;
2883
+ case 2:
2884
+ sb.push("2-Average");
2885
+ break;
2886
+ case 3:
2887
+ sb.push("3-Evaluative");
2888
+ break;
2889
+ case 4:
2890
+ sb.push("4-Partial");
2891
+ break;
2892
+ case 5:
2893
+ sb.push("5-Center-weighted average");
2894
+ break;
2895
+ default:
2896
+ sb.push(valBuff[k]);
2897
+ break;
2898
+ }
2899
+ break;
2900
+ case 18:
2901
+ sb.push("FocusRange = ");
2902
+ switch (valBuff[k])
2903
+ {
2904
+ case 0:
2905
+ sb.push("0-Manual");
2906
+ break;
2907
+ case 1:
2908
+ sb.push("1-Auto");
2909
+ break;
2910
+ case 2:
2911
+ sb.push("2-Not Known");
2912
+ break;
2913
+ case 3:
2914
+ sb.push("3-Macro");
2915
+ break;
2916
+ case 4:
2917
+ sb.push("4-Very Close");
2918
+ break;
2919
+ case 5:
2920
+ sb.push("5-Close");
2921
+ break;
2922
+ case 6:
2923
+ sb.push("6-Middle Range");
2924
+ break;
2925
+ case 7:
2926
+ sb.push("7-Far Range");
2927
+ break;
2928
+ case 8:
2929
+ sb.push("8-Pan Focus");
2930
+ break;
2931
+ case 9:
2932
+ sb.push("9-Super Macro");
2933
+ break;
2934
+ case 10:
2935
+ sb.push("10-Infinity");
2936
+ break;
2937
+ default:
2938
+ sb.push(valBuff[k]);
2939
+ break;
2940
+ }
2941
+ break;
2942
+ case 19:
2943
+ sb.push("AFPoint = ");
2944
+ switch (valBuff[k])
2945
+ {
2946
+ case 0x2005:
2947
+ sb.push("0x2005-Manual AF point selection ");
2948
+ break;
2949
+ case 0x3000:
2950
+ sb.push("0x3000-None (MF)");
2951
+ break;
2952
+ case 0x3001:
2953
+ sb.push("0x3001-Auto AF point selection");
2954
+ break;
2955
+ case 0x3002:
2956
+ sb.push("0x3002-Right");
2957
+ break;
2958
+ case 0x3003:
2959
+ sb.push("0x3003-Center");
2960
+ break;
2961
+ case 0x3004:
2962
+ sb.push("0x3004-Left");
2963
+ break;
2964
+ case 0x4001:
2965
+ sb.push("0x4001-Auto AF point selection");
2966
+ break;
2967
+ case 0x4006:
2968
+ sb.push("0x4006-Face Detect");
2969
+ break;
2970
+ default:
2971
+ sb.push(valBuff[k]);
2972
+ break;
2973
+ }
2974
+ break;
2975
+ case 20:
2976
+ sb.push("CanonExposureMode = ");
2977
+ switch (valBuff[k])
2978
+ {
2979
+ case 0:
2980
+ sb.push("0-Easy");
2981
+ break;
2982
+ case 1:
2983
+ sb.push("1-Program AE");
2984
+ break;
2985
+ case 2:
2986
+ sb.push("2-Shutter speed priority AE");
2987
+ break;
2988
+ case 3:
2989
+ sb.push("3-Aperture-priority AE");
2990
+ break;
2991
+ case 4:
2992
+ sb.push("4-Manual");
2993
+ break;
2994
+ case 5:
2995
+ sb.push("5-Depth-of-field AE");
2996
+ break;
2997
+ case 6:
2998
+ sb.push("6-M-Dep");
2999
+ break;
3000
+ case 7:
3001
+ sb.push("7-Bulb");
3002
+ break;
3003
+ default:
3004
+ sb.push(valBuff[k]);
3005
+ break;
3006
+ }
3007
+ break;
3008
+ case 22:
3009
+ sb.push("LensType = ");
3010
+ sb.push(this.toStringCanonLensType(valBuff[k]));
3011
+ break;
3012
+ case 23:
3013
+ sb.push("MaxFocalLength = ");
3014
+ isUInt16 = true;
3015
+ break;
3016
+ case 24:
3017
+ sb.push("MinFocalLength = ");
3018
+ isUInt16 = true;
3019
+ break;
3020
+ case 25:
3021
+ sb.push("FocalUnits = ");
3022
+ isInt16 = true;
3023
+ break;
3024
+ case 26:
3025
+ sb.push("MaxAperture = ");
3026
+ isInt16 = true;
3027
+ break;
3028
+ case 27:
3029
+ sb.push("MinAperture = ");
3030
+ isInt16 = true;
3031
+ break;
3032
+ case 28:
3033
+ sb.push("FlashActivity = ");
3034
+ isInt16 = true;
3035
+ break;
3036
+ case 29:
3037
+ sb.push("FlashBits = 0x");
3038
+ sb.push(text.toHex16(valBuff[k]));
3039
+ break;
3040
+ case 32:
3041
+ sb.push("FocusContinuous = ");
3042
+ switch (valBuff[k])
3043
+ {
3044
+ case 0:
3045
+ sb.push("0-Single");
3046
+ break;
3047
+ case 1:
3048
+ sb.push("1-Continuous");
3049
+ break;
3050
+ case 8:
3051
+ sb.push("8-Manual");
3052
+ break;
3053
+ default:
3054
+ sb.push(valBuff[k]);
3055
+ break;
3056
+ }
3057
+ break;
3058
+ case 33:
3059
+ sb.push("AESetting = ");
3060
+ switch (valBuff[k])
3061
+ {
3062
+ case 0:
3063
+ sb.push("0-Normal AE");
3064
+ break;
3065
+ case 1:
3066
+ sb.push("1-Exposure Compensation");
3067
+ break;
3068
+ case 2:
3069
+ sb.push("2-AE Lock");
3070
+ break;
3071
+ case 3:
3072
+ sb.push("3-AE Lock + Exposure Comp.");
3073
+ break;
3074
+ case 4:
3075
+ sb.push("4-No AE");
3076
+ break;
3077
+ default:
3078
+ sb.push(valBuff[k]);
3079
+ break;
3080
+ }
3081
+ break;
3082
+ case 34:
3083
+ sb.push("ImageStabilization = ");
3084
+ switch (valBuff[k])
3085
+ {
3086
+ case 0:
3087
+ sb.push("0-Off");
3088
+ break;
3089
+ case 1:
3090
+ sb.push("1-On");
3091
+ break;
3092
+ case 2:
3093
+ sb.push("2-Shoot Only");
3094
+ break;
3095
+ case 3:
3096
+ sb.push("3-Panning");
3097
+ break;
3098
+ case 4:
3099
+ sb.push("4-Dynamic");
3100
+ break;
3101
+ case 256:
3102
+ sb.push("256-Off");
3103
+ break;
3104
+ case 257:
3105
+ sb.push("257-On");
3106
+ break;
3107
+ case 258:
3108
+ sb.push("258-Shoot Only");
3109
+ break;
3110
+ case 259:
3111
+ sb.push("259-Panning");
3112
+ break;
3113
+ case 260:
3114
+ sb.push("260-Dynamic");
3115
+ break;
3116
+ default:
3117
+ sb.push(valBuff[k]);
3118
+ break;
3119
+ }
3120
+ break;
3121
+ case 35:
3122
+ sb.push("DisplayAperture = ");
3123
+ isInt16 = true;
3124
+ break;
3125
+ case 36:
3126
+ sb.push("ZoomSourceWidth = ");
3127
+ isInt16 = true;
3128
+ break;
3129
+ case 37:
3130
+ sb.push("ZoomTargetWidth = ");
3131
+ isInt16 = true;
3132
+ break;
3133
+ case 39:
3134
+ sb.push("AESetting = ");
3135
+ switch (valBuff[k])
3136
+ {
3137
+ case 0:
3138
+ sb.push("0-Center");
3139
+ break;
3140
+ case 1:
3141
+ sb.push("1-AF Point");
3142
+ break;
3143
+ default:
3144
+ sb.push(valBuff[k]);
3145
+ break;
3146
+ }
3147
+ break;
3148
+ case 40:
3149
+ sb.push("PhotoEffect = ");
3150
+ switch (valBuff[k])
3151
+ {
3152
+ case 0:
3153
+ sb.push("0-Off");
3154
+ break;
3155
+ case 1:
3156
+ sb.push("1-Vivid");
3157
+ break;
3158
+ case 2:
3159
+ sb.push("2-Neutral");
3160
+ break;
3161
+ case 3:
3162
+ sb.push("3-Smooth");
3163
+ break;
3164
+ case 4:
3165
+ sb.push("4-Sepia");
3166
+ break;
3167
+ case 5:
3168
+ sb.push("5-B&W");
3169
+ break;
3170
+ case 6:
3171
+ sb.push("6-Custom");
3172
+ break;
3173
+ case 100:
3174
+ sb.push("100-My Color Data");
3175
+ break;
3176
+ default:
3177
+ sb.push(valBuff[k]);
3178
+ break;
3179
+ }
3180
+ break;
3181
+ case 41:
3182
+ sb.push("ManualFlashOutput = ");
3183
+ switch (valBuff[k])
3184
+ {
3185
+ case 0:
3186
+ sb.push("0-n/a");
3187
+ break;
3188
+ case 0x500:
3189
+ sb.push("0x500-Full");
3190
+ break;
3191
+ case 0x502:
3192
+ sb.push("0x500-Medium");
3193
+ break;
3194
+ case 0x504:
3195
+ sb.push("0x500-Low");
3196
+ break;
3197
+ case 0x7fff:
3198
+ sb.push("0x7fff-n/a");
3199
+ break;
3200
+ default:
3201
+ sb.push("0x");
3202
+ sb.push(text.toHex16(valBuff[k]));
3203
+ break;
3204
+ }
3205
+ break;
3206
+ case 42:
3207
+ sb.push("ColorTone = ");
3208
+ isInt16 = true;
3209
+ break;
3210
+ case 46:
3211
+ sb.push("SRAWQuality = ");
3212
+ switch (valBuff[k])
3213
+ {
3214
+ case 0:
3215
+ sb.push("0-n/a");
3216
+ break;
3217
+ case 1:
3218
+ sb.push("1-sRAW1(mRAW)");
3219
+ break;
3220
+ case 2:
3221
+ sb.push("2-sRAW2(sRAW)");
3222
+ break;
3223
+ default:
3224
+ sb.push("0x");
3225
+ sb.push(text.toHex16(valBuff[k]));
3226
+ break;
3227
+ }
3228
+ break;
3229
+ default:
3230
+ sb.push("Unknown(");
3231
+ sb.push(k);
3232
+ sb.push(") = ");
3233
+ isInt16 = true;
3234
+ break;
3235
+ }
3236
+ if (isInt16)
3237
+ {
3238
+ sb.push(valBuff[k]);
3239
+ }
3240
+ else if (isUInt16)
3241
+ {
3242
+ sb.push(valBuff[k]);
3243
+ }
3244
+ k++;
3245
+ }
3246
+ return sb.join("");
3247
+ }
3248
+
3249
+ toStringCanonFocalLength(linePrefix, valBuff)
3250
+ {
3251
+ let sb = [];
3252
+ let isInt16;
3253
+ let isUInt16;
3254
+ let k;
3255
+ k = 0;
3256
+ while (k < valBuff.length)
3257
+ {
3258
+ sb.push("\r\n");
3259
+ if (linePrefix) sb.push(linePrefix);
3260
+ sb.push(" ");
3261
+ isInt16 = false;
3262
+ isUInt16 = false;
3263
+ switch (k)
3264
+ {
3265
+ case 0:
3266
+ sb.push("FocalType = ");
3267
+ switch (valBuff[k])
3268
+ {
3269
+ case 1:
3270
+ sb.push("1-Fixed");
3271
+ break;
3272
+ case 2:
3273
+ sb.push("2-Zoom");
3274
+ break;
3275
+ default:
3276
+ sb.push(valBuff[k]);
3277
+ break;
3278
+ }
3279
+ break;
3280
+ case 1:
3281
+ sb.push("FocalLength = ");
3282
+ isUInt16 = true;
3283
+ break;
3284
+ case 2:
3285
+ sb.push("FocalPlaneXSize = ");
3286
+ isUInt16 = true;
3287
+ break;
3288
+ case 3:
3289
+ sb.push("FocalPlaneYSize = ");
3290
+ isUInt16 = true;
3291
+ break;
3292
+ default:
3293
+ sb.push("Unknown(");
3294
+ sb.push(k);
3295
+ sb.push(") = ");
3296
+ isInt16 = true;
3297
+ break;
3298
+ }
3299
+ if (isInt16)
3300
+ {
3301
+ sb.push(valBuff[k]);
3302
+ }
3303
+ else if (isUInt16)
3304
+ {
3305
+ sb.push(valBuff[k]);
3306
+ }
3307
+ k++;
3308
+ }
3309
+ return sb.join("");
3310
+ }
3311
+
3312
+ toStringCanonShotInfo(linePrefix, valBuff)
3313
+ {
3314
+ let sb = [];
3315
+ let isInt16;
3316
+ let isUInt16;
3317
+ let k;
3318
+ k = 0;
3319
+ while (k < valBuff.length)
3320
+ {
3321
+ sb.push("\r\n");
3322
+ if (linePrefix) sb.push(linePrefix);
3323
+ sb.push(" ");
3324
+ isInt16 = false;
3325
+ isUInt16 = false;
3326
+ switch (k)
3327
+ {
3328
+ case 1:
3329
+ sb.push("AutoISO = ");
3330
+ isInt16 = true;
3331
+ break;
3332
+ case 2:
3333
+ sb.push("BaseISO = ");
3334
+ isInt16 = true;
3335
+ break;
3336
+ case 3:
3337
+ sb.push("MeasuredEV = ");
3338
+ isInt16 = true;
3339
+ break;
3340
+ case 4:
3341
+ sb.push("TargetAperture = ");
3342
+ isInt16 = true;
3343
+ break;
3344
+ case 5:
3345
+ sb.push("TargetExposureTime = ");
3346
+ isInt16 = true;
3347
+ break;
3348
+ case 6:
3349
+ sb.push("ExposureCompensation = ");
3350
+ isInt16 = true;
3351
+ break;
3352
+ case 7:
3353
+ sb.push("WhiteBalance = ");
3354
+ isInt16 = true;
3355
+ break;
3356
+ case 8:
3357
+ sb.push("SlowShutter = ");
3358
+ switch (valBuff[k])
3359
+ {
3360
+ case -1:
3361
+ sb.push("-1-n/a");
3362
+ break;
3363
+ case 0:
3364
+ sb.push("0-Off");
3365
+ break;
3366
+ case 1:
3367
+ sb.push("1-Night Scene");
3368
+ break;
3369
+ case 2:
3370
+ sb.push("2-On");
3371
+ break;
3372
+ case 3:
3373
+ sb.push("3-None");
3374
+ break;
3375
+ default:
3376
+ sb.push(valBuff[k]);
3377
+ break;
3378
+ }
3379
+ break;
3380
+ case 9:
3381
+ sb.push("SequenceNumber = ");
3382
+ isInt16 = true;
3383
+ break;
3384
+ case 10:
3385
+ sb.push("OpticalZoomCode = ");
3386
+ isInt16 = true;
3387
+ break;
3388
+ case 12:
3389
+ sb.push("CameraTemperature = ");
3390
+ isInt16 = true;
3391
+ break;
3392
+ case 13:
3393
+ sb.push("FlashGuideNumber = ");
3394
+ isInt16 = true;
3395
+ break;
3396
+ case 14:
3397
+ sb.push("AFPointsInFocus = ");
3398
+ switch (valBuff[k])
3399
+ {
3400
+ case 0x3000:
3401
+ sb.push("0x3000-None (MF)");
3402
+ break;
3403
+ case 0x3001:
3404
+ sb.push("0x3001-Right");
3405
+ break;
3406
+ case 0x3002:
3407
+ sb.push("0x3002-Center");
3408
+ break;
3409
+ case 0x3003:
3410
+ sb.push("0x3003-Center+Right");
3411
+ break;
3412
+ case 0x3004:
3413
+ sb.push("0x3004-Left");
3414
+ break;
3415
+ case 0x3005:
3416
+ sb.push("0x3005-Left+Right");
3417
+ break;
3418
+ case 0x3006:
3419
+ sb.push("0x3006-Left+Center");
3420
+ break;
3421
+ case 0x3007:
3422
+ sb.push("0x3007-All");
3423
+ break;
3424
+ default:
3425
+ sb.push("0x");
3426
+ sb.push(text.toHex16(valBuff[k]));
3427
+ break;
3428
+ }
3429
+ break;
3430
+ case 15:
3431
+ sb.push("FlashExposureComp = ");
3432
+ isInt16 = true;
3433
+ break;
3434
+ case 16:
3435
+ sb.push("AutoExposureBracketing = ");
3436
+ switch (valBuff[k])
3437
+ {
3438
+ case -1:
3439
+ sb.push("-1-On");
3440
+ break;
3441
+ case 0:
3442
+ sb.push("0-Off");
3443
+ break;
3444
+ case 1:
3445
+ sb.push("1-On (shot 1)");
3446
+ break;
3447
+ case 2:
3448
+ sb.push("2-On (shot 2)");
3449
+ break;
3450
+ case 3:
3451
+ sb.push("3-On (shot 3)");
3452
+ break;
3453
+ default:
3454
+ sb.push(valBuff[k]);
3455
+ break;
3456
+ }
3457
+ break;
3458
+ case 17:
3459
+ sb.push("AEBBracketValue = ");
3460
+ isInt16 = true;
3461
+ break;
3462
+ case 18:
3463
+ sb.push("ControlMode = ");
3464
+ switch (valBuff[k])
3465
+ {
3466
+ case 0:
3467
+ sb.push("0-n/a");
3468
+ break;
3469
+ case 1:
3470
+ sb.push("1-Camera Local Control");
3471
+ break;
3472
+ case 3:
3473
+ sb.push("3-Computer Remote Control");
3474
+ break;
3475
+ default:
3476
+ sb.push(valBuff[k]);
3477
+ break;
3478
+ }
3479
+ break;
3480
+ case 19:
3481
+ sb.push("FocusDistanceUpper = ");
3482
+ isUInt16 = true;
3483
+ break;
3484
+ case 20:
3485
+ sb.push("FocusDistanceLower = ");
3486
+ isUInt16 = true;
3487
+ break;
3488
+ case 21:
3489
+ sb.push("FNumber = ");
3490
+ isInt16 = true;
3491
+ break;
3492
+ case 22:
3493
+ sb.push("ExposureTime = ");
3494
+ isInt16 = true;
3495
+ break;
3496
+ case 23:
3497
+ sb.push("MeasuredEV2 = ");
3498
+ isInt16 = true;
3499
+ break;
3500
+ case 24:
3501
+ sb.push("BulbDuration = ");
3502
+ isInt16 = true;
3503
+ break;
3504
+ case 26:
3505
+ sb.push("CameraType = ");
3506
+ switch (valBuff[k])
3507
+ {
3508
+ case 0:
3509
+ sb.push("0-n/a");
3510
+ break;
3511
+ case 248:
3512
+ sb.push("248-EOS High-end");
3513
+ break;
3514
+ case 250:
3515
+ sb.push("250-Compact");
3516
+ break;
3517
+ case 252:
3518
+ sb.push("252-EOS Mid-range");
3519
+ break;
3520
+ case 255:
3521
+ sb.push("255-DV Camera");
3522
+ break;
3523
+ default:
3524
+ sb.push(valBuff[k]);
3525
+ break;
3526
+ }
3527
+ break;
3528
+ case 27:
3529
+ sb.push("AutoRotate = ");
3530
+ switch (valBuff[k])
3531
+ {
3532
+ case -1:
3533
+ sb.push("-1-n/a");
3534
+ break;
3535
+ case 0:
3536
+ sb.push("0-None");
3537
+ break;
3538
+ case 1:
3539
+ sb.push("1-Rotate 90 CW");
3540
+ break;
3541
+ case 2:
3542
+ sb.push("1-Rotate 180");
3543
+ break;
3544
+ case 3:
3545
+ sb.push("3-Rotate 270 CW");
3546
+ break;
3547
+ default:
3548
+ sb.push(valBuff[k]);
3549
+ break;
3550
+ }
3551
+ break;
3552
+ case 28:
3553
+ sb.push("NDFilter = ");
3554
+ switch (valBuff[k])
3555
+ {
3556
+ case -1:
3557
+ sb.push("-1-n/a");
3558
+ break;
3559
+ case 0:
3560
+ sb.push("0-Off");
3561
+ break;
3562
+ case 1:
3563
+ sb.push("1-On");
3564
+ break;
3565
+ default:
3566
+ sb.push(valBuff[k]);
3567
+ break;
3568
+ }
3569
+ break;
3570
+ case 29:
3571
+ sb.push("SelfTimer2 = ");
3572
+ isInt16 = true;
3573
+ break;
3574
+ case 33:
3575
+ sb.push("FlashOutput = ");
3576
+ isInt16 = true;
3577
+ break;
3578
+ default:
3579
+ sb.push("Unknown(");
3580
+ sb.push(k);
3581
+ sb.push(") = ");
3582
+ isInt16 = true;
3583
+ break;
3584
+ }
3585
+ if (isInt16)
3586
+ {
3587
+ sb.push(valBuff[k]);
3588
+ }
3589
+ else if (isUInt16)
3590
+ {
3591
+ sb.push(valBuff[k]);
3592
+ }
3593
+ k++;
3594
+ }
3595
+ return sb.join("");
3596
+ }
3597
+
3598
+ toStringCanonLensType(lensType)
3599
+ {
3600
+ return "0x" + text.toHex16(lensType);
3601
+ }
3602
+
1792
3603
  parseMakerNote(buff)
1793
3604
  {
1794
3605
  let reader = new data.ByteReader(buff);
@@ -1844,93 +3655,98 @@ export class EXIFData
1844
3655
  {
1845
3656
  if (maker == "Canon")
1846
3657
  {
1847
- return EXIFData.parseIFD(reader, 0, true, null, 0, EXIFMaker.Canon);
3658
+ return EXIFData.parseIFD(reader, 0, true, null, null, EXIFMaker.Canon);
1848
3659
  }
1849
3660
  else if (maker == "CASIO")
1850
3661
  {
1851
- return EXIFData.parseIFD(reader, 0, false, null, 0, EXIFMaker.Casio1);
3662
+ return EXIFData.parseIFD(reader, 0, false, null, null, EXIFMaker.Casio1);
1852
3663
  }
1853
3664
  else if (maker == "FLIR Systems AB")
1854
3665
  {
1855
- return EXIFData.parseIFD(reader, 0, true, null, 0, EXIFMaker.FLIR);
3666
+ return EXIFData.parseIFD(reader, 0, true, null, null, EXIFMaker.FLIR);
1856
3667
  }
1857
3668
  }
1858
3669
  }
1859
3670
  return null;
1860
3671
  }
1861
3672
 
1862
- static getEXIFName(exifMaker, id, subId)
3673
+ /**
3674
+ * @param {string} exifMaker
3675
+ * @param {string | number} id
3676
+ * @param {number | undefined} [parentId]
3677
+ */
3678
+ static getEXIFName(exifMaker, id, parentId)
1863
3679
  {
1864
3680
  let name = null;
1865
- if (id == 0)
3681
+ if (parentId === undefined)
1866
3682
  {
1867
3683
  switch (exifMaker)
1868
3684
  {
1869
3685
  case EXIFMaker.Panasonic:
1870
- name = EXIFNamesPanasonic[subId];
3686
+ name = EXIFNamesPanasonic[id];
1871
3687
  break;
1872
3688
  case EXIFMaker.Canon:
1873
- name = EXIFNamesCanon[subId];
3689
+ name = EXIFNamesCanon[id];
1874
3690
  break;
1875
3691
  case EXIFMaker.Olympus:
1876
- name = EXIFNamesOlympus[subId];
3692
+ name = EXIFNamesOlympus[id];
1877
3693
  break;
1878
3694
  case EXIFMaker.Casio1:
1879
- name = EXIFNamesCasio1[subId];
3695
+ name = EXIFNamesCasio1[id];
1880
3696
  break;
1881
3697
  case EXIFMaker.Casio2:
1882
- name = EXIFNamesCasio2[subId];
3698
+ name = EXIFNamesCasio2[id];
1883
3699
  break;
1884
3700
  case EXIFMaker.FLIR:
1885
- name = EXIFNamesFLIR[subId];
3701
+ name = EXIFNamesFLIR[id];
1886
3702
  break;
1887
3703
  case EXIFMaker.Nikon3:
1888
- name = EXIFNamesNikon3[subId];
3704
+ name = EXIFNamesNikon3[id];
1889
3705
  break;
1890
3706
  case EXIFMaker.Sanyo:
1891
- name = EXIFNamesSanyo1[subId];
3707
+ name = EXIFNamesSanyo1[id];
1892
3708
  break;
1893
3709
  case EXIFMaker.Apple:
1894
- name = EXIFNamesApple[subId];
3710
+ name = EXIFNamesApple[id];
1895
3711
  break;
1896
3712
  case EXIFMaker.Standard:
1897
3713
  default:
1898
- name = EXIFNamesStandard[subId];
3714
+ name = EXIFNamesStandard[id];
1899
3715
  break;
1900
3716
  }
1901
3717
  }
1902
- else if (id == 34665)
3718
+ else if (parentId == 34665)
1903
3719
  {
1904
- name = EXIFNamesInfo[subId];
3720
+ name = EXIFNamesInfo[id];
1905
3721
  }
1906
- else if (id == 34853)
3722
+ else if (parentId == 34853)
1907
3723
  {
1908
- name = EXIFNamesGPS[subId];
3724
+ name = EXIFNamesGPS[id];
1909
3725
  }
1910
3726
  else if (exifMaker == EXIFMaker.Olympus)
1911
3727
  {
1912
- if (id == 0x2010)
3728
+ if (parentId == 0x2010)
1913
3729
  {
1914
- name = EXIFNamesOlympus2010[subId];
3730
+ name = EXIFNamesOlympus2010[id];
1915
3731
  }
1916
- else if (id == 0x2020)
3732
+ else if (parentId == 0x2020)
1917
3733
  {
1918
- name = EXIFNamesOlympus2020[subId];
3734
+ name = EXIFNamesOlympus2020[id];
1919
3735
  }
1920
- else if (id == 0x2030)
3736
+ else if (parentId == 0x2030)
1921
3737
  {
1922
- name = EXIFNamesOlympus2030[subId];
3738
+ name = EXIFNamesOlympus2030[id];
1923
3739
  }
1924
- else if (id == 0x2040)
3740
+ else if (parentId == 0x2040)
1925
3741
  {
1926
- name = EXIFNamesOlympus2040[subId];
3742
+ name = EXIFNamesOlympus2040[id];
1927
3743
  }
1928
- else if (id == 0x2050)
3744
+ else if (parentId == 0x2050)
1929
3745
  {
1930
- name = EXIFNamesOlympus2050[subId];
3746
+ name = EXIFNamesOlympus2050[id];
1931
3747
  }
1932
3748
  }
1933
- return name || ("Tag "+subId);
3749
+ return name || ("Tag "+id);
1934
3750
  }
1935
3751
 
1936
3752
  /**
@@ -2125,7 +3941,15 @@ export class EXIFData
2125
3941
  }
2126
3942
  else
2127
3943
  {
2128
- exif.addUInt16(tag, reader.readUInt16Arr(reader.readUInt32(ifdOfst + 8, lsb) + readBase, lsb, fcnt));
3944
+ try
3945
+ {
3946
+ exif.addUInt16(tag, reader.readUInt16Arr(reader.readUInt32(ifdOfst + 8, lsb) + readBase, lsb, fcnt));
3947
+ }
3948
+ catch (e)
3949
+ {
3950
+ console.log("Error in parsing file", e, ifdOfst, readBase, lsb, fcnt, tag);
3951
+ console.log(reader, reader.getLength(), reader.readUInt32(ifdOfst + 8, lsb));
3952
+ }
2129
3953
  }
2130
3954
  break;
2131
3955
  }