19
19
copy them from an earlier, non-GPL Revision of dcraw.c, or (c)
20
20
purchase a license from the author.
21
21
22
-
$Revision: 1.330 $
23
-
$Date: 2006/05/29 18:54:35 $
22
+
$Revision: 1.331 $
23
+
$Date: 2006/06/21 20:00:07 $
24
24
*/
25
25
26
26
#define _GNU_SOURCE
@@ -1447,6 +1447,8 @@ void CLASS phase_one_load_raw_c()
1447
1447
fseek (ifp, ph1.black_off, SEEK_SET);
1448
1448
if (ph1.black_off)
1449
1449
read_shorts ((ushort *) black[0], raw_height*2);
1450
+
for (i=0; i < 256; i++)
1451
+
curve[i] = i*i / 3.969 + 0.5;
1450
1452
for (row=0; row < raw_height; row++) {
1451
1453
fseek (ifp, data_offset + offset[row], SEEK_SET);
1452
1454
ph1_bits(0);
@@ -1463,6 +1465,8 @@ void CLASS phase_one_load_raw_c()
1463
1465
pixel[col] = pred[col & 1] = ph1_bits(16);
1464
1466
else
1465
1467
pixel[col] = pred[col & 1] += ph1_bits(i) + 1 - (1 << (i - 1));
1468
+
if (ph1.format == 5 && pixel[col] < 256)
1469
+
pixel[col] = curve[pixel[col]];
1466
1470
}
1467
1471
if ((unsigned) (row-top_margin) < height)
1468
1472
for (col=0; col < width; col++) {
@@ -2046,6 +2050,26 @@ void CLASS sony_load_raw()
2046
2050
maximum = 0x3ff0;
2047
2051
}
2048
2052
2053
+
void CLASS sony_arw_load_raw()
2054
+
{
2055
+
int col, row, len, diff, sum=0;
2056
+
2057
+
getbits(-1);
2058
+
for (col = raw_width; col--; )
2059
+
for (row=0; row < raw_height+1; row+=2) {
2060
+
if (row == raw_height) row = 1;
2061
+
len = 4 - getbits(2);
2062
+
if (len == 3 && getbits(1)) len = 0;
2063
+
if (len == 4)
2064
+
while (len < 17 && !getbits(1)) len++;
2065
+
diff = getbits(len);
2066
+
if ((diff & (1 << (len-1))) == 0)
2067
+
diff -= (1 << len) - 1;
2068
+
sum += diff;
2069
+
if (row < height) BAYER(row,col) = sum;
2070
+
}
2071
+
}
2072
+
2049
2073
#define HOLE(row) ((holes >> (((row) - raw_height) & 7)) & 1)
2050
2074
2051
2075
/* Kudos to Rich Taylor for figuring out SMaL's compression algorithm. */
@@ -3650,7 +3674,7 @@ void CLASS parse_makernote (int base)
3650
3674
0x3b,0x2d,0xeb,0x25,0x49,0xfa,0xa3,0xaa,0x39,0xa7,0xc5,0xa7,0x50,0x11,0x36,0xfb,
3651
3675
0xc6,0x67,0x4a,0xf5,0xa5,0x12,0x65,0x7e,0xb0,0xdf,0xaf,0x4e,0xb3,0x61,0x7f,0x2f } };
3652
3676
unsigned offset=0, entries, tag, type, len, save, c;
3653
-
unsigned ver97=0, serial=0, i;
3677
+
unsigned ver97=0, serial=0, i, wb[4]={0,0,0,0};
3654
3678
uchar buf97[324], ci, cj, ck;
3655
3679
short sorder;
3656
3680
char buf[10];
@@ -3660,12 +3684,22 @@ void CLASS parse_makernote (int base)
3660
3684
*/
3661
3685
sorder = order;
3662
3686
fread (buf, 1, 10, ifp);
3663
-
if (!strncmp (buf,"KC" ,2) || /* these aren't TIFF format */
3664
-
!strncmp (buf,"KDK" ,3) ||
3665
-
!strncmp (buf,"MLY" ,3) ||
3687
+
if (!strncmp (buf,"KDK" ,3) || /* these aren't TIFF tables */
3666
3688
!strncmp (buf,"VER" ,3) ||
3667
3689
!strncmp (buf,"IIII",4) ||
3668
3690
!strncmp (buf,"MMMM",4)) return;
3691
+
if (!strncmp (buf,"KC" ,2) || /* Konica KD-400Z, KD-510Z */
3692
+
!strncmp (buf,"MLY" ,3)) { /* Minolta DiMAGE G series */
3693
+
order = 0x4d4d;
3694
+
while ((i=ftell(ifp)) < data_offset && i < 16384) {
3695
+
wb[0] = wb[2]; wb[2] = wb[1]; wb[1] = wb[3];
3696
+
wb[3] = get2();
3697
+
if (wb[1] == 256 && wb[3] == 256 &&
3698
+
wb[0] > 256 && wb[0] < 640 && wb[2] > 256 && wb[2] < 640)
3699
+
FORC4 cam_mul[c] = wb[c];
3700
+
}
3701
+
goto quit;
3702
+
}
3669
3703
if (!strcmp (buf,"Nikon")) {
3670
3704
base = ftell(ifp);
3671
3705
order = get2();
@@ -3960,6 +3994,8 @@ void CLASS linear_table (unsigned len)
3960
3994
maximum = curve[0xfff];
3961
3995
}
3962
3996
3997
+
void CLASS parse_minolta (int base);
3998
+
3963
3999
int CLASS parse_tiff_ifd (int base, int level)
3964
4000
{
3965
4001
unsigned entries, tag, type, len, plen=16, save;
@@ -4055,6 +4091,10 @@ int CLASS parse_tiff_ifd (int base, int level)
4055
4091
tiff_ifd[ifd].offset = level ? ftell(ifp) : get4();
4056
4092
break;
4057
4093
case 330: /* SubIFDs */
4094
+
if (!strcmp(model,"DSLR-A100") && tiff_ifd[ifd].width == 3872) {
4095
+
data_offset = get4()+base;
4096
+
ifd++; break;
4097
+
}
4058
4098
while (len--) {
4059
4099
i = ftell(ifp);
4060
4100
fseek (ifp, get4()+base, SEEK_SET);
@@ -4212,7 +4252,10 @@ int CLASS parse_tiff_ifd (int base, int level)
4212
4252
break;
4213
4253
case 50740: /* DNGPrivateData */
4214
4254
if (dng_version) break;
4215
-
fseek (ifp, get4()+base, SEEK_SET);
4255
+
i = order;
4256
+
parse_minolta (j = get4()+base);
4257
+
order = i;
4258
+
fseek (ifp, j, SEEK_SET);
4216
4259
parse_tiff_ifd (base, level+1);
4217
4260
break;
4218
4261
case 50752:
@@ -4265,27 +4308,20 @@ int CLASS parse_tiff_ifd (int base, int level)
4265
4308
void CLASS parse_kodak_ifd (int base)
4266
4309
{
4267
4310
unsigned entries, tag, type, len, save;
4268
-
int i, c, wbi=-2, wbtemp;
4269
-
char line[128];
4270
-
static const char *wbs[] =
4271
-
{ "Auto","Daylight","Tungsten","Fluorescent","Flash" };
4311
+
int i, c, wbi=-2, wbtemp=6500;
4272
4312
float mul[3], num;
4273
4313
4274
4314
entries = get2();
4275
4315
if (entries > 1024) return;
4276
4316
while (entries--) {
4277
4317
tiff_get (base, &tag, &type, &len, &save);
4278
-
if (tag == 1009)
4279
-
while ((int) len > 0) {
4280
-
fgets (line, 128, ifp);
4281
-
len -= strlen(line) + 1;
4282
-
if (!strncmp (line, "White bal", 9)) {
4283
-
wbtemp = atoi (line + strlen(line) - 5);
4284
-
if (wbtemp < 1000) wbtemp = 6500;
4285
-
for (i=0; i < 5; i++)
4286
-
if (strstr (line, wbs[i])) wbi = i-1;
4287
-
}
4288
-
}
4318
+
if (tag == 1020) wbi = getint(type);
4319
+
if (tag == 1021 && len == 72) { /* WB set in software */
4320
+
fseek (ifp, 40, SEEK_CUR);
4321
+
FORC3 cam_mul[c] = 2048.0 / get2();
4322
+
wbi = -2;
4323
+
}
4324
+
if (tag == 2118) wbtemp = getint(type);
4289
4325
if (tag == 2130 + wbi)
4290
4326
FORC3 mul[c] = getreal(type);
4291
4327
if (tag == 2140 + wbi && wbi >= 0)
@@ -4298,7 +4334,6 @@ void CLASS parse_kodak_ifd (int base)
4298
4334
if (tag == 6020) iso_speed = getint(type);
4299
4335
fseek (ifp, save, SEEK_SET);
4300
4336
}
4301
-
if (wbi == -1) cam_mul[0] = -1;
4302
4337
}
4303
4338
4304
4339
void CLASS parse_tiff (int base)
@@ -4393,14 +4428,17 @@ void CLASS parse_tiff (int base)
4393
4428
}
4394
4429
}
4395
4430
4396
-
void CLASS parse_minolta()
4431
+
void CLASS parse_minolta (int base)
4397
4432
{
4398
4433
int save, tag, len, offset, high=0, wide=0, i, c;
4399
4434
4400
-
fseek (ifp, 4, SEEK_SET);
4401
-
offset = get4() + 8;
4435
+
fseek (ifp, base, SEEK_SET);
4436
+
if (fgetc(ifp) || fgetc(ifp)-'M' || fgetc(ifp)-'R') return;
4437
+
order = fgetc(ifp) * 0x101;
4438
+
offset = base + get4() + 8;
4402
4439
while ((save=ftell(ifp)) < offset) {
4403
-
tag = get4();
4440
+
for (tag=i=0; i < 4; i++)
4441
+
tag = tag << 8 | fgetc(ifp);
4404
4442
len = get4();
4405
4443
switch (tag) {
4406
4444
case 0x505244: /* PRD */
@@ -4415,12 +4453,12 @@ void CLASS parse_minolta()
4415
4453
break;
4416
4454
case 0x545457: /* TTW */
4417
4455
parse_tiff (ftell(ifp));
4456
+
data_offset = offset;
4418
4457
}
4419
4458
fseek (ifp, save+len+8, SEEK_SET);
4420
4459
}
4421
4460
raw_height = high;
4422
4461
raw_width = wide;
4423
-
data_offset = offset;
4424
4462
}
4425
4463
4426
4464
/*
@@ -4922,6 +4960,8 @@ void CLASS adobe_coeff (char *make, char *model)
4922
4960
{ 14155,-5065,-1382,-6550,14633,2039,-1623,1824,6561 } },
4923
4961
{ "Canon EOS 20D", 0,
4924
4962
{ 6599,-537,-891,-8071,15783,2424,-1983,2234,7462 } },
4963
+
{ "Canon EOS 30D", 0,
4964
+
{ 6257,-303,-1000,-7880,15621,2396,-1714,1904,7046 } },
4925
4965
{ "Canon EOS 350D", 0,
4926
4966
{ 6018,-617,-965,-8645,15881,2975,-1530,1719,7642 } },
4927
4967
{ "Canon EOS-1Ds Mark II", 0,
@@ -5002,7 +5042,7 @@ void CLASS adobe_coeff (char *make, char *model)
5002
5042
{ 10491,-3423,-1145,-7385,15027,2538,-1809,2275,8692 } },
5003
5043
{ "Imacon Ixpress", 0, /* DJC */
5004
5044
{ 7025,-1415,-704,-5188,13765,1424,-1248,2742,6038 } },
5005
-
{ "KODAK NC2000F", 0, /* DJC */
5045
+
{ "KODAK NC2000", 0, /* DJC */
5006
5046
{ 16475,-6903,-1218,-851,10375,477,2505,-7,1020 } },
5007
5047
{ "Kodak DCS315C", 8,
5008
5048
{ 17523,-4827,-2510,756,8546,-137,6113,1649,2250 } },
@@ -5050,6 +5090,10 @@ void CLASS adobe_coeff (char *make, char *model)
5050
5090
{ 10704,-4187,-1230,-8314,15952,2501,-920,945,8927 } },
5051
5091
{ "Leaf Valeo 6", 0,
5052
5092
{ 3952,2189,449,-6701,14585,2275,-4536,7349,6536 } },
5093
+
{ "Leaf Aptus 65", 0,
5094
+
{ 7914,1414,-1190,-8777,16582,2280,-2811,4605,5562 } },
5095
+
{ "Leaf Aptus 75", 0,
5096
+
{ 7914,1414,-1190,-8777,16582,2280,-2811,4605,5562 } },
5053
5097
{ "Leaf", 0,
5054
5098
{ 8236,1746,-1314,-8251,15953,2428,-3673,5786,5771 } },
5055
5099
{ "Micron 2010", 110, /* DJC */
@@ -5130,12 +5174,18 @@ void CLASS adobe_coeff (char *make, char *model)
5130
5174
{ 13173,-4732,-1499,-5807,14036,1895,-2045,2452,7142 } },
5131
5175
{ "OLYMPUS E-300", 0,
5132
5176
{ 7828,-1761,-348,-5788,14071,1830,-2853,4518,6557 } },
5177
+
{ "OLYMPUS E-330", 0,
5178
+
{ 8961,-2473,-1084,-7979,15990,2067,-2319,3035,8249 } },
5133
5179
{ "OLYMPUS E-500", 0,
5134
5180
{ 8136,-1968,-299,-5481,13742,1871,-2556,4205,6630 } },
5135
5181
{ "OLYMPUS SP350", 0,
5136
5182
{ 12078,-4836,-1069,-6671,14306,2578,-786,939,7418 } },
5183
+
{ "OLYMPUS SP3", 0,
5184
+
{ 11766,-4445,-1067,-6901,14421,2707,-1029,1217,7572 } },
5137
5185
{ "OLYMPUS SP500UZ", 0,
5138
5186
{ 9493,-3415,-666,-5211,12334,3260,-1548,2262,6482 } },
5187
+
{ "PENTAX *ist DL2", 0,
5188
+
{ 10504,-2438,-1189,-8603,16207,2531,-1022,863,12242 } },
5139
5189
{ "PENTAX *ist DL", 0,
5140
5190
{ 10829,-2838,-1115,-8339,15817,2696,-837,680,11939 } },
5141
5191
{ "PENTAX *ist DS2", 0,
@@ -5158,6 +5208,8 @@ void CLASS adobe_coeff (char *make, char *model)
5158
5208
{ 8512,-2641,-694,-8042,15670,2526,-1821,2117,7414 } },
5159
5209
{ "SONY DSC-V3", 0,
5160
5210
{ 7511,-2571,-692,-7894,15088,3060,-948,1111,8128 } },
5211
+
{ "SONY DSLR-A100", 0,
5212
+
{ 8367,-2248,-763,-8758,16447,2422,-1527,1550,8053 } },
5161
5213
};
5162
5214
double cam_xyz[4][3];
5163
5215
char name[130];
@@ -5268,7 +5320,8 @@ void CLASS identify()
5268
5320
{ 3178560, "PENTAX", "Optio S" ,1 },
5269
5321
{ 4841984, "PENTAX", "Optio S" ,1 },
5270
5322
{ 6114240, "PENTAX", "Optio S4" ,1 }, /* or S4i */
5271
-
{ 12582980, "Sinar", "" ,0 } };
5323
+
{ 12582980, "Sinar", "" ,0 },
5324
+
{ 33292868, "Sinar", "" ,0 } };
5272
5325
static const char *corp[] =
5273
5326
{ "Canon", "NIKON", "EPSON", "KODAK", "Kodak", "OLYMPUS", "PENTAX",
5274
5327
"MINOLTA", "Minolta", "Konica", "CASIO", "Sinar", "Phase One" };
@@ -5316,7 +5369,8 @@ void CLASS identify()
5316
5369
} else if (!memcmp (head,"\xff\xd8\xff\xe1",4) &&
5317
5370
!memcmp (head+6,"Exif",4)) {
5318
5371
fseek (ifp, 4, SEEK_SET);
5319
-
fseek (ifp, 4 + get2(), SEEK_SET);
5372
+
data_offset = 4 + get2();
5373
+
fseek (ifp, data_offset, SEEK_SET);
5320
5374
if (fgetc(ifp) != 0xff)
5321
5375
parse_tiff(12);
5322
5376
thumb_offset = 0;
@@ -5374,7 +5428,7 @@ void CLASS identify()
5374
5428
} else if (!memcmp (head,"DSC-Image",9))
5375
5429
parse_rollei();
5376
5430
else if (!memcmp (head,"\0MRM",4))
5377
-
parse_minolta();
5431
+
parse_minolta(0);
5378
5432
else if (!memcmp (head,"FOVb",4))
5379
5433
parse_foveon();
5380
5434
else
@@ -5402,6 +5456,8 @@ void CLASS identify()
5402
5456
i = strlen(make); /* Remove make from model */
5403
5457
if (!strncmp (model, make, i) && model[i++] == ' ')
5404
5458
memmove (model, model+i, 64-i);
5459
+
if (!strncmp (model,"Digital Camera ",15))
5460
+
strcpy (model, model+15);
5405
5461
make[63] = model[63] = model2[63] = 0;
5406
5462
if (!is_raw) return;
5407
5463
@@ -5682,18 +5738,12 @@ void CLASS identify()
5682
5738
data_offset = 513;
5683
5739
filters = 0x61616161;
5684
5740
load_raw = minolta_rd175_load_raw;
5685
-
} else if (!strcmp(model,"Digital Camera KD-400Z")) {
5741
+
} else if (!strcmp(model,"KD-400Z")) {
5686
5742
height = 1712;
5687
5743
width = 2312;
5688
5744
raw_width = 2336;
5689
-
data_offset = 4034;
5690
-
fseek (ifp, 2032, SEEK_SET);
5691
5745
goto konica_400z;
5692
-
} else if (!strcmp(model,"Digital Camera KD-510Z")) {
5693
-
data_offset = 4032;
5694
-
pre_mul[0] = 1.297;
5695
-
pre_mul[2] = 1.438;
5696
-
fseek (ifp, 2032, SEEK_SET);
5746
+
} else if (!strcmp(model,"KD-510Z")) {
5697
5747
goto konica_510z;
5698
5748
} else if (!strcasecmp(make,"MINOLTA")) {
5699
5749
load_raw = unpacked_load_raw;
@@ -5706,40 +5756,29 @@ void CLASS identify()
5706
5756
} else if (!strncmp(model,"ALPHA",5) ||
5707
5757
!strncmp(model,"DYNAX",5) ||
5708
5758
!strncmp(model,"MAXXUM",6)) {
5709
-
sprintf (model, "DYNAX %s", model+6 + (model[0]=='M'));
5759
+
sprintf (model+20, "DYNAX %-10s", model+6+(model[0]=='M'));
5760
+
adobe_coeff (make, model+20);
5710
5761
load_raw = packed_12_load_raw;
5711
5762
maximum = 0xffb;
5712
5763
} else if (!strncmp(model,"DiMAGE G",8)) {
5713
5764
if (model[8] == '4') {
5714
-
data_offset = 5056;
5715
-
pre_mul[0] = 1.602;
5716
-
pre_mul[2] = 1.441;
5717
-
fseek (ifp, 2078, SEEK_SET);
5718
5765
height = 1716;
5719
5766
width = 2304;
5720
5767
} else if (model[8] == '5') {
5721
-
data_offset = 4016;
5722
-
fseek (ifp, 1936, SEEK_SET);
5723
5768
konica_510z:
5724
5769
height = 1956;
5725
5770
width = 2607;
5726
5771
raw_width = 2624;
5727
5772
} else if (model[8] == '6') {
5728
-
data_offset = 4032;
5729
-
fseek (ifp, 2030, SEEK_SET);
5730
5773
height = 2136;
5731
5774
width = 2848;
5732
5775
}
5776
+
data_offset += 14;
5733
5777
filters = 0x61616161;
5734
5778
konica_400z:
5735
5779
load_raw = unpacked_load_raw;
5736
5780
maximum = 0x3df;
5737
5781
order = 0x4d4d;
5738
-
FORC4 cam_mul[(c >> 1) | ((c & 1) << 1)] = get2();
5739
-
}
5740
-
if (pre_mul[0] == 1 && pre_mul[2] == 1) {
5741
-
pre_mul[0] = 1.42;
5742
-
pre_mul[2] = 1.25;
5743
5782
}
5744
5783
} else if (!strcmp(model,"*ist DS")) {
5745
5784
height -= 2;
@@ -5944,11 +5983,15 @@ void CLASS identify()
5944
5983
adobe_coeff ("SONY","DSC-R1");
5945
5984
width = 3925;
5946
5985
order = 0x4d4d;
5986
+
} else if (!strcmp(model,"DSLR-A100")) {
5987
+
height--;
5988
+
load_raw = sony_arw_load_raw;
5989
+
maximum = 0xfeb;
5947
5990
} else if (!strncmp(model,"P850",4)) {
5948
5991
maximum = 0xf7c;
5949
5992
} else if (!strcasecmp(make,"KODAK")) {
5950
5993
if (filters == UINT_MAX) filters = 0x61616161;
5951
-
if (!strcmp(model,"NC2000F")) {
5994
+
if (!strncmp(model,"NC2000",6)) {
5952
5995
width -= 4;
5953
5996
left_margin = 2;
5954
5997
} else if (!strcmp(model,"EOSDCS3B")) {
@@ -5997,7 +6040,7 @@ void CLASS identify()
5997
6040
pre_mul[2] = 1.209;
5998
6041
pre_mul[3] = 1.036;
5999
6042
load_raw = kodak_easy_load_raw;
6000
-
} else if (!strcmp(model,"Digital Camera 40")) {
6043
+
} else if (!strcmp(model,"40")) {
6001
6044
strcpy (model, "DC40");
6002
6045
height = 512;
6003
6046
width = 768;
@@ -6447,7 +6490,7 @@ int CLASS main (int argc, char **argv)
6447
6490
if (argc == 1)
6448
6491
{
6449
6492
fprintf (stderr,
6450
-
"\nRaw Photo Decoder \"dcraw\" v8.21"
6493
+
"\nRaw Photo Decoder \"dcraw\" v8.22"
6451
6494
"\nby Dave Coffin, dcoffin a cybercom o net"
6452
6495
"\n\nUsage: %s [options] file1 file2 ...\n"
6453
6496
"\nValid options:"
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4