Speedup for cr2 decode
This commit is contained in:
parent
ea9dfc9c5c
commit
f794cf684b
@ -10,6 +10,8 @@
|
|||||||
/*RT*/#define LOCALTIME
|
/*RT*/#define LOCALTIME
|
||||||
/*RT*/#define DJGPP
|
/*RT*/#define DJGPP
|
||||||
|
|
||||||
|
#include "StopWatch.h"
|
||||||
|
#include "opthelper.h"
|
||||||
/*
|
/*
|
||||||
dcraw.c -- Dave Coffin's raw photo decoder
|
dcraw.c -- Dave Coffin's raw photo decoder
|
||||||
Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net
|
Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net
|
||||||
@ -551,13 +553,13 @@ int CLASS canon_s2is()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned CLASS getbithuff_t::operator() (int nbits, ushort *huff)
|
inline unsigned CLASS getbithuff_t::operator() (int nbits, ushort *huff)
|
||||||
{
|
{
|
||||||
/*RT static unsigned bitbuf=0; */
|
/*RT static unsigned bitbuf=0; */
|
||||||
/*RT static int vbits=0, reset=0; */
|
/*RT static int vbits=0, reset=0; */
|
||||||
unsigned c;
|
unsigned c;
|
||||||
|
|
||||||
if (nbits > 25) return 0;
|
if (UNLIKELY(nbits > 25)) return 0;
|
||||||
if (nbits < 0)
|
if (nbits < 0)
|
||||||
return bitbuf = vbits = reset = 0;
|
return bitbuf = vbits = reset = 0;
|
||||||
if (nbits == 0 || vbits < 0) return 0;
|
if (nbits == 0 || vbits < 0) return 0;
|
||||||
@ -828,7 +830,7 @@ int CLASS ljpeg_start (struct jhead *jh, int info_only)
|
|||||||
FORC(4) jh->huff[2+c] = jh->huff[1];
|
FORC(4) jh->huff[2+c] = jh->huff[1];
|
||||||
FORC(jh->sraw) jh->huff[1+c] = jh->huff[0];
|
FORC(jh->sraw) jh->huff[1+c] = jh->huff[0];
|
||||||
}
|
}
|
||||||
jh->row = (ushort *) calloc (jh->wide*jh->clrs, 4);
|
jh->row = (ushort *) calloc (2 * jh->wide*jh->clrs, 4);
|
||||||
merror (jh->row, "ljpeg_start()");
|
merror (jh->row, "ljpeg_start()");
|
||||||
return zero_after_ff = 1;
|
return zero_after_ff = 1;
|
||||||
}
|
}
|
||||||
@ -840,7 +842,7 @@ void CLASS ljpeg_end (struct jhead *jh)
|
|||||||
free (jh->row);
|
free (jh->row);
|
||||||
}
|
}
|
||||||
|
|
||||||
int CLASS ljpeg_diff (ushort *huff)
|
inline int CLASS ljpeg_diff (ushort *huff)
|
||||||
{
|
{
|
||||||
int len, diff;
|
int len, diff;
|
||||||
|
|
||||||
@ -867,7 +869,7 @@ ushort * CLASS ljpeg_row (int jrow, struct jhead *jh)
|
|||||||
}
|
}
|
||||||
getbits(-1);
|
getbits(-1);
|
||||||
}
|
}
|
||||||
FORC3 row[c] = jh->row + jh->wide*jh->clrs*((jrow+c) & 1);
|
FORC3 row[c] = (jh->row + ((jrow & 1) + 1) * (jh->wide*jh->clrs*((jrow+c) & 1)));
|
||||||
for (col=0; col < jh->wide; col++)
|
for (col=0; col < jh->wide; col++)
|
||||||
FORC(jh->clrs) {
|
FORC(jh->clrs) {
|
||||||
diff = ljpeg_diff (jh->huff[c]);
|
diff = ljpeg_diff (jh->huff[c]);
|
||||||
@ -875,8 +877,7 @@ ushort * CLASS ljpeg_row (int jrow, struct jhead *jh)
|
|||||||
pred = spred;
|
pred = spred;
|
||||||
else if (col) pred = row[0][-jh->clrs];
|
else if (col) pred = row[0][-jh->clrs];
|
||||||
else pred = (jh->vpred[c] += diff) - diff;
|
else pred = (jh->vpred[c] += diff) - diff;
|
||||||
if (jrow && col) switch (jh->psv) {
|
if (jh->psv != 1 && jrow && col) switch (jh->psv) {
|
||||||
case 1: break;
|
|
||||||
case 2: pred = row[1][0]; break;
|
case 2: pred = row[1][0]; break;
|
||||||
case 3: pred = row[1][-jh->clrs]; break;
|
case 3: pred = row[1][-jh->clrs]; break;
|
||||||
case 4: pred = pred + row[1][0] - row[1][-jh->clrs]; break;
|
case 4: pred = pred + row[1][0] - row[1][-jh->clrs]; break;
|
||||||
@ -885,7 +886,7 @@ ushort * CLASS ljpeg_row (int jrow, struct jhead *jh)
|
|||||||
case 7: pred = (pred + row[1][0]) >> 1; break;
|
case 7: pred = (pred + row[1][0]) >> 1; break;
|
||||||
default: pred = 0;
|
default: pred = 0;
|
||||||
}
|
}
|
||||||
if ((**row = pred + diff) >> jh->bits) derror();
|
if (UNLIKELY((**row = pred + diff) >> jh->bits)) derror();
|
||||||
if (c <= jh->sraw) spred = **row;
|
if (c <= jh->sraw) spred = **row;
|
||||||
row[0]++; row[1]++;
|
row[0]++; row[1]++;
|
||||||
}
|
}
|
||||||
@ -894,22 +895,40 @@ ushort * CLASS ljpeg_row (int jrow, struct jhead *jh)
|
|||||||
|
|
||||||
void CLASS lossless_jpeg_load_raw()
|
void CLASS lossless_jpeg_load_raw()
|
||||||
{
|
{
|
||||||
int jwide, jrow, jcol, val, jidx, i, j, row=0, col=0;
|
StopWatch Stop1("decode");
|
||||||
struct jhead jh;
|
struct jhead jh;
|
||||||
ushort *rp;
|
|
||||||
|
|
||||||
if (!ljpeg_start (&jh, 0)) return;
|
if (!ljpeg_start (&jh, 0)) return;
|
||||||
jwide = jh.wide * jh.clrs;
|
int jwide = jh.wide * jh.clrs;
|
||||||
|
ushort *rp[2];
|
||||||
|
rp[0] = ljpeg_row (0, &jh);
|
||||||
|
|
||||||
|
for (int jrow=0; jrow < jh.high; jrow++) {
|
||||||
|
#ifdef _OPENMP
|
||||||
|
#pragma omp parallel sections
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
#ifdef _OPENMP
|
||||||
|
#pragma omp section
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if(jrow < jh.high - 1)
|
||||||
|
rp[(jrow + 1)&1] = ljpeg_row (jrow + 1, &jh);
|
||||||
|
}
|
||||||
|
#ifdef _OPENMP
|
||||||
|
#pragma omp section
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
int row=0, col=0;
|
||||||
|
|
||||||
for (jrow=0; jrow < jh.high; jrow++) {
|
|
||||||
rp = ljpeg_row (jrow, &jh);
|
|
||||||
if (load_flags & 1)
|
if (load_flags & 1)
|
||||||
row = jrow & 1 ? height-1-jrow/2 : jrow/2;
|
row = jrow & 1 ? height-1-jrow/2 : jrow/2;
|
||||||
for (jcol=0; jcol < jwide; jcol++) {
|
for (int jcol=0; jcol < jwide; jcol++) {
|
||||||
val = curve[*rp++];
|
int val = curve[*rp[jrow&1]++];
|
||||||
if (cr2_slice[0]) {
|
if (cr2_slice[0]) {
|
||||||
jidx = jrow*jwide + jcol;
|
int jidx = jrow*jwide + jcol;
|
||||||
i = jidx / (cr2_slice[1]*raw_height);
|
int i = jidx / (cr2_slice[1]*raw_height);
|
||||||
|
int j;
|
||||||
if ((j = i >= cr2_slice[0]))
|
if ((j = i >= cr2_slice[0]))
|
||||||
i = cr2_slice[0];
|
i = cr2_slice[0];
|
||||||
jidx -= i * (cr2_slice[1]*raw_height);
|
jidx -= i * (cr2_slice[1]*raw_height);
|
||||||
@ -922,6 +941,8 @@ void CLASS lossless_jpeg_load_raw()
|
|||||||
if (++col >= raw_width)
|
if (++col >= raw_width)
|
||||||
col = (row++,0);
|
col = (row++,0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ljpeg_end (&jh);
|
ljpeg_end (&jh);
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ inline void fseek (IMFILE* f, int p, int how)
|
|||||||
inline int fgetc (IMFILE* f)
|
inline int fgetc (IMFILE* f)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (f->pos < f->size) {
|
if (LIKELY(f->pos < f->size)) {
|
||||||
if (f->plistener && ++f->progress_current >= f->progress_next) {
|
if (f->plistener && ++f->progress_current >= f->progress_next) {
|
||||||
imfile_update_progress(f);
|
imfile_update_progress(f);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user