@@ -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__ )
575602void 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
626655int 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
698728void 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