Skip to content

Commit 31f0591

Browse files
committed
wb supports multiframe
1 parent a4a9d78 commit 31f0591

File tree

3 files changed

+61
-31
lines changed

3 files changed

+61
-31
lines changed

src/develop/pixelpipe_hb.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1332,7 +1332,7 @@ static int dt_dev_pixelpipe_process_rec(dt_dev_pixelpipe_t *pipe, dt_develop_t *
13321332
}
13331333

13341334
#ifdef DEBUG_PIXELPIPE
1335-
save_debug_bitmap(pipe,"load",*output,roi_out);
1335+
//save_debug_bitmap(pipe,"load",*output,roi_out);
13361336
#endif
13371337
}
13381338
}

src/iop/temperature.c

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,14 @@ int default_colorspace(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_p
221221
return IOP_CS_RAW;
222222
}
223223

224+
void output_format(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece,
225+
dt_iop_buffer_dsc_t *dsc)
226+
{
227+
default_output_format(self, pipe, piece, dsc);
228+
///TODO is this correct?
229+
dsc->frames = pipe->dsc.frames;
230+
}
231+
224232
/*
225233
* Spectral power distribution functions
226234
* https://en.wikipedia.org/wiki/Spectral_power_distribution
@@ -466,6 +474,8 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const
466474
float *const out = (float *const)ovoid;
467475
const float *const d_coeffs = d->coeffs;
468476

477+
fprintf(stderr, "temperature, %s\n", dt_pixelpipe_name(piece->pipe->type));
478+
469479
if(filters == 9u)
470480
{ // xtrans float mosaiced
471481
#ifdef _OPENMP
@@ -503,39 +513,55 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const
503513
}
504514
else if(filters)
505515
{ // bayer float mosaiced
506-
const int width = roi_out->width;
516+
for(int f=0;f<piece->dsc_in.frames;++f)
517+
{
518+
float const *const frame_in = in + (f * roi_in->width * roi_in->height);
519+
float *const frame_out = out + (f * roi_out->width * roi_out->height);
520+
fprintf(stderr,"frame in %p\n", frame_in);
521+
fprintf(stderr,"frame out %p\n", frame_out);
522+
const int width = roi_out->width;
507523
#ifdef _OPENMP
508524
#pragma omp parallel for default(none) \
509-
dt_omp_firstprivate(d_coeffs, filters, in, out, roi_out, width) \
510-
schedule(static)
525+
dt_omp_firstprivate(d_coeffs, filters, frame_in, frame_out, roi_out, width) \
526+
schedule(static)
511527
#endif
512-
for(int j = 0; j < roi_out->height; j++)
513-
{
514-
int i = 0;
515-
const int alignment = ((4 - (j * width & (4 - 1))) & (4 - 1));
516-
const int offset_j = j + roi_out->y;
517-
518-
// process the unaligned sensels at the start of the row (when width is not a multiple of 4)
519-
for( ; i < alignment; i++)
520-
{
521-
const size_t p = (size_t)j * width + i;
522-
out[p] = in[p] * d_coeffs[FC(offset_j, i + roi_out->x, filters)];
523-
}
524-
const dt_aligned_pixel_t coeffs = { d_coeffs[FC(offset_j, i + roi_out->x, filters)],
525-
d_coeffs[FC(offset_j, i + roi_out->x + 1,filters)],
526-
d_coeffs[FC(offset_j, i + roi_out->x + 2, filters)],
527-
d_coeffs[FC(offset_j, i + roi_out->x + 3, filters)] };
528-
// process sensels four at a time
529-
for(; i < (width & ~3); i += 4)
530-
{
531-
const size_t p = (size_t)j * width + i;
532-
scaled_copy_4wide(out + p,in + p, coeffs);
533-
}
534-
// process the leftover sensels
535-
for(i = width & ~3; i < width; i++)
528+
for(int j = 0; j < roi_out->height; j++)
536529
{
537-
const size_t p = (size_t)j * width + i;
538-
out[p] = in[p] * d_coeffs[FC(j + roi_out->y, i + roi_out->x, filters)];
530+
#if 0
531+
// this optimization does not work for multiframe
532+
int i = 0;
533+
const int alignment = ((4 - (j * width & (4 - 1))) & (4 - 1));
534+
const int offset_j = j + roi_out->y;
535+
536+
// process the unaligned sensels at the start of the row (when width is not a multiple of 4)
537+
for( ; i < alignment; i++)
538+
{
539+
const size_t p = (size_t)j * width + i;
540+
frame_out[p] = frame_in[p] * d_coeffs[FC(offset_j, i + roi_out->x, filters)];
541+
}
542+
const dt_aligned_pixel_t coeffs = { d_coeffs[FC(offset_j, i + roi_out->x, filters)],
543+
d_coeffs[FC(offset_j, i + roi_out->x + 1,filters)],
544+
d_coeffs[FC(offset_j, i + roi_out->x + 2, filters)],
545+
d_coeffs[FC(offset_j, i + roi_out->x + 3, filters)] };
546+
// process sensels four at a time
547+
for(; i < (width & ~3); i += 4)
548+
{
549+
const size_t p = (size_t)j * width + i;
550+
scaled_copy_4wide(frame_out + p,frame_in + p, coeffs);
551+
}
552+
// process the leftover sensels
553+
for(i = width & ~3; i < width; i++)
554+
{
555+
const size_t p = (size_t)j * width + i;
556+
frame_out[p] = frame_in[p] * d_coeffs[FC(j + roi_out->y, i + roi_out->x, filters)];
557+
}
558+
#endif
559+
for(int i = 0; i < roi_out->width; i++)
560+
{
561+
const size_t p = (size_t)j * width + i;
562+
frame_out[p] = frame_in[p] * d_coeffs[FC(j + roi_out->y, i + roi_out->x, filters)];
563+
}
564+
539565
}
540566
}
541567
}
@@ -571,6 +597,7 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const
571597
}
572598
}
573599

600+
#if 0
574601
#if defined(__SSE__)
575602
void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const ivoid,
576603
void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
@@ -621,7 +648,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c
621648
}
622649
}
623650
#endif
651+
#endif
624652

653+
#if 0
625654
#ifdef HAVE_OPENCL
626655
int process_cl(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, cl_mem dev_in, cl_mem dev_out,
627656
const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
@@ -694,6 +723,7 @@ int process_cl(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, cl_m
694723
return FALSE;
695724
}
696725
#endif
726+
#endif
697727

698728
void commit_params(struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_t *pipe,
699729
dt_dev_pixelpipe_iop_t *piece)

0 commit comments

Comments
 (0)