Fixes for Nikon Z raw decoding
Fix to curve decoding ported from rawspeed See #4998
This commit is contained in:
parent
c9044485a6
commit
f8fc658d71
@ -1303,10 +1303,10 @@ void CLASS nikon_load_raw()
|
|||||||
if (ver0 == 0x46) tree = 2;
|
if (ver0 == 0x46) tree = 2;
|
||||||
if (tiff_bps == 14) tree += 3;
|
if (tiff_bps == 14) tree += 3;
|
||||||
read_shorts (vpred[0], 4);
|
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)
|
if ((csize = get2()) > 1)
|
||||||
step = max / (csize-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++)
|
for (int i=0; i < csize; i++)
|
||||||
curve[i*step] = get2();
|
curve[i*step] = get2();
|
||||||
for (int i=0; i < max; i++)
|
for (int i=0; i < max; i++)
|
||||||
@ -2562,6 +2562,7 @@ void CLASS packed_load_raw()
|
|||||||
|
|
||||||
bwide = raw_width * tiff_bps / 8;
|
bwide = raw_width * tiff_bps / 8;
|
||||||
bwide += bwide & load_flags >> 9;
|
bwide += bwide & load_flags >> 9;
|
||||||
|
bwide += row_padding;
|
||||||
rbits = bwide * 8 - raw_width * tiff_bps;
|
rbits = bwide * 8 - raw_width * tiff_bps;
|
||||||
if (load_flags & 1) bwide = bwide * 16 / 15;
|
if (load_flags & 1) bwide = bwide * 16 / 15;
|
||||||
bite = 8 + (load_flags & 56);
|
bite = 8 + (load_flags & 56);
|
||||||
@ -6759,8 +6760,13 @@ void CLASS apply_tiff()
|
|||||||
load_raw = &CLASS packed_load_raw;
|
load_raw = &CLASS packed_load_raw;
|
||||||
} else if ((raw_width * 2 * tiff_bps / 16 + 8) * raw_height == tiff_ifd[raw].bytes) {
|
} else if ((raw_width * 2 * tiff_bps / 16 + 8) * raw_height == tiff_ifd[raw].bytes) {
|
||||||
// 14 bit uncompressed from Nikon Z7, still wrong
|
// 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
|
// each line has 8 padding byte.
|
||||||
load_flags = 8 << 9;
|
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;
|
load_raw = &CLASS packed_load_raw;
|
||||||
} else
|
} else
|
||||||
load_raw = &CLASS nikon_load_raw; break;
|
load_raw = &CLASS nikon_load_raw; break;
|
||||||
|
@ -47,7 +47,9 @@ public:
|
|||||||
,order(0x4949)
|
,order(0x4949)
|
||||||
,ifname(nullptr)
|
,ifname(nullptr)
|
||||||
,meta_data(nullptr)
|
,meta_data(nullptr)
|
||||||
,shot_select(0),multi_out(0)
|
,shot_select(0)
|
||||||
|
,multi_out(0)
|
||||||
|
,row_padding(0)
|
||||||
,float_raw_image(nullptr)
|
,float_raw_image(nullptr)
|
||||||
,image(nullptr)
|
,image(nullptr)
|
||||||
,bright(1.)
|
,bright(1.)
|
||||||
@ -88,7 +90,7 @@ protected:
|
|||||||
unsigned tiff_nifds, tiff_samples, tiff_bps, tiff_compress;
|
unsigned tiff_nifds, tiff_samples, tiff_bps, tiff_compress;
|
||||||
unsigned black, cblack[4102], maximum, mix_green, raw_color, zero_is_bad;
|
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 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;
|
bool xtransCompressed = false;
|
||||||
struct fuji_compressed_params
|
struct fuji_compressed_params
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user