Fixes for Nikon Z raw decoding

Fix to curve decoding ported from rawspeed

See #4998
This commit is contained in:
Alberto Griggio 2018-11-19 22:02:03 +01:00
parent c9044485a6
commit f8fc658d71
2 changed files with 14 additions and 6 deletions

View File

@ -1303,10 +1303,10 @@ void CLASS nikon_load_raw()
if (ver0 == 0x46) tree = 2;
if (tiff_bps == 14) tree += 3;
read_shorts (vpred[0], 4);
max = 1 << tiff_bps & 0x7fff;
max = 1 << (tiff_bps - (ver0 == 0x44 && ver1 == 0x40 ? 2 : 0)) & 0x7fff;
if ((csize = get2()) > 1)
step = max / (csize-1);
if (ver0 == 0x44 && ver1 == 0x20 && step > 0) {
if (ver0 == 0x44 && (ver1 == 0x20 || ver1 == 0x40) && step > 0) {
for (int i=0; i < csize; i++)
curve[i*step] = get2();
for (int i=0; i < max; i++)
@ -2562,6 +2562,7 @@ void CLASS packed_load_raw()
bwide = raw_width * tiff_bps / 8;
bwide += bwide & load_flags >> 9;
bwide += row_padding;
rbits = bwide * 8 - raw_width * tiff_bps;
if (load_flags & 1) bwide = bwide * 16 / 15;
bite = 8 + (load_flags & 56);
@ -6759,8 +6760,13 @@ void CLASS apply_tiff()
load_raw = &CLASS packed_load_raw;
} else if ((raw_width * 2 * tiff_bps / 16 + 8) * raw_height == tiff_ifd[raw].bytes) {
// 14 bit uncompressed from Nikon Z7, still wrong
// each line has 8 padding byte. To inform 'packed_load_raw' about his padding, we have to set load_flags = padding << 9
load_flags = 8 << 9;
// each line has 8 padding byte.
row_padding = 8;
load_raw = &CLASS packed_load_raw;
} else if ((raw_width * 2 * tiff_bps / 16 + 12) * raw_height == tiff_ifd[raw].bytes) {
// 14 bit uncompressed from Nikon Z6, still wrong
// each line has 12 padding byte.
row_padding = 12;
load_raw = &CLASS packed_load_raw;
} else
load_raw = &CLASS nikon_load_raw; break;

View File

@ -47,7 +47,9 @@ public:
,order(0x4949)
,ifname(nullptr)
,meta_data(nullptr)
,shot_select(0),multi_out(0)
,shot_select(0)
,multi_out(0)
,row_padding(0)
,float_raw_image(nullptr)
,image(nullptr)
,bright(1.)
@ -88,7 +90,7 @@ protected:
unsigned tiff_nifds, tiff_samples, tiff_bps, tiff_compress;
unsigned black, cblack[4102], maximum, mix_green, raw_color, zero_is_bad;
unsigned zero_after_ff, is_raw, dng_version, is_foveon, data_error;
unsigned tile_width, tile_length, gpsdata[32], load_flags;
unsigned tile_width, tile_length, gpsdata[32], load_flags, row_padding;
bool xtransCompressed = false;
struct fuji_compressed_params
{