@@ -59,8 +59,8 @@ struct dssim_chan {
5959};
6060
6161struct dssim_image {
62- dssim_chan * chan [MAX_CHANS ];
63- int channels ;
62+ dssim_chan chan [MAX_CHANS ];
63+ int num_channels ;
6464};
6565
6666struct dssim_ssim_map_chan {
@@ -152,14 +152,14 @@ static void dealloc_chan(dssim_chan *chan) {
152152 free (chan -> img_sq_blur );
153153 if (chan -> next_half ) {
154154 dealloc_chan (chan -> next_half );
155+ free (chan -> next_half );
155156 }
156- free (chan );
157157}
158158
159159void dssim_dealloc_image (dssim_image * img )
160160{
161- for (int ch = 0 ; ch < img -> channels ; ch ++ ) {
162- dealloc_chan (img -> chan [ch ]);
161+ for (int ch = 0 ; ch < img -> num_channels ; ch ++ ) {
162+ dealloc_chan (& img -> chan [ch ]);
163163 }
164164 free (img );
165165}
@@ -378,46 +378,46 @@ static void subsampled_copy(dssim_chan *new_chan, const int dest_y_offset, const
378378
379379static void convert_image_subsampled (dssim_image * img , dssim_row_callback cb , void * callback_user_data )
380380{
381- const int width = img -> chan [0 ]-> width ;
382- const int height = img -> chan [0 ]-> height ;
383- dssim_px_t * row_tmp0 [img -> channels ];
384- dssim_px_t * row_tmp1 [img -> channels ];
381+ const int width = img -> chan [0 ]. width ;
382+ const int height = img -> chan [0 ]. height ;
383+ dssim_px_t * row_tmp0 [img -> num_channels ];
384+ dssim_px_t * row_tmp1 [img -> num_channels ];
385385
386- for (int ch = 1 ; ch < img -> channels ; ch ++ ) {
386+ for (int ch = 1 ; ch < img -> num_channels ; ch ++ ) {
387387 row_tmp0 [ch ] = calloc (width * 2 , sizeof (row_tmp0 [0 ])); // for the callback all channels have the same width!
388388 row_tmp1 [ch ] = row_tmp0 [ch ] + width ;
389389 }
390390
391391 for (int y = 0 ; y < height ; y += 2 ) {
392- row_tmp0 [0 ] = & img -> chan [0 ]-> img [width * y ]; // Luma can be written directly (it's unscaled)
393- row_tmp1 [0 ] = & img -> chan [0 ]-> img [width * MIN (height - 1 , y + 1 )];
392+ row_tmp0 [0 ] = & img -> chan [0 ]. img [width * y ]; // Luma can be written directly (it's unscaled)
393+ row_tmp1 [0 ] = & img -> chan [0 ]. img [width * MIN (height - 1 , y + 1 )];
394394
395- cb (row_tmp0 , img -> channels , y , width , callback_user_data );
396- cb (row_tmp1 , img -> channels , MIN (height - 1 , y + 1 ), width , callback_user_data );
395+ cb (row_tmp0 , img -> num_channels , y , width , callback_user_data );
396+ cb (row_tmp1 , img -> num_channels , MIN (height - 1 , y + 1 ), width , callback_user_data );
397397
398398 if (y < height - 1 ) {
399- for (int ch = 1 ; ch < img -> channels ; ch ++ ) { // Chroma is downsampled
400- subsampled_copy (img -> chan [ch ], y /2 , 1 , row_tmp0 [ch ], width );
399+ for (int ch = 1 ; ch < img -> num_channels ; ch ++ ) { // Chroma is downsampled
400+ subsampled_copy (& img -> chan [ch ], y /2 , 1 , row_tmp0 [ch ], width );
401401 }
402402 }
403403 }
404404
405- for (int ch = 1 ; ch < img -> channels ; ch ++ ) {
405+ for (int ch = 1 ; ch < img -> num_channels ; ch ++ ) {
406406 free (row_tmp0 [ch ]);
407407 }
408408}
409409
410410static void convert_image_simple (dssim_image * img , dssim_row_callback cb , void * callback_user_data )
411411{
412- const int width = img -> chan [0 ]-> width ;
413- const int height = img -> chan [0 ]-> height ;
414- dssim_px_t * row_tmp [img -> channels ];
412+ const int width = img -> chan [0 ]. width ;
413+ const int height = img -> chan [0 ]. height ;
414+ dssim_px_t * row_tmp [img -> num_channels ];
415415
416416 for (int y = 0 ; y < height ; y ++ ) {
417- for (int ch = 0 ; ch < img -> channels ; ch ++ ) {
418- row_tmp [ch ] = & img -> chan [ch ]-> img [width * y ];
417+ for (int ch = 0 ; ch < img -> num_channels ; ch ++ ) {
418+ row_tmp [ch ] = & img -> chan [ch ]. img [width * y ];
419419 }
420- cb (row_tmp , img -> channels , y , width , callback_user_data );
420+ cb (row_tmp , img -> num_channels , y , width , callback_user_data );
421421 }
422422}
423423
@@ -562,26 +562,26 @@ dssim_image *dssim_create_image_float_callback(dssim_attr *attr, const int num_c
562562
563563 dssim_image * img = malloc (sizeof (img [0 ]));
564564 * img = (dssim_image ){
565- .channels = num_channels ,
565+ .num_channels = num_channels ,
566566 };
567567
568- for (int ch = 0 ; ch < img -> channels ; ch ++ ) {
568+ for (int ch = 0 ; ch < img -> num_channels ; ch ++ ) {
569569 const bool is_chroma = ch > 0 ;
570- img -> chan [ch ] = create_chan (
570+ img -> chan [ch ] = * create_chan (
571571 subsample_chroma && is_chroma ? width /2 : width ,
572572 subsample_chroma && is_chroma ? height /2 : height ,
573573 is_chroma );
574574 }
575575
576- if (subsample_chroma && img -> channels > 1 ) {
576+ if (subsample_chroma && img -> num_channels > 1 ) {
577577 convert_image_subsampled (img , cb , callback_user_data );
578578 } else {
579579 convert_image_simple (img , cb , callback_user_data );
580580 }
581581
582582 dssim_px_t * tmp = dssim_get_tmp (attr , width * height * sizeof (tmp [0 ]));
583- for (int ch = 0 ; ch < img -> channels ; ch ++ ) {
584- dssim_preprocess_channel (img -> chan [ch ], tmp , attr -> num_scales );
583+ for (int ch = 0 ; ch < img -> num_channels ; ch ++ ) {
584+ dssim_preprocess_channel (& img -> chan [ch ], tmp , attr -> num_scales );
585585 }
586586
587587 return img ;
@@ -596,7 +596,7 @@ static void dssim_preprocess_channel(dssim_chan *chan, dssim_px_t *tmp, int num_
596596 dssim_chan * new_chan = create_chan (chan -> width /2 , chan -> height /2 , chan -> is_chroma );
597597 chan -> next_half = new_chan ;
598598 subsampled_copy (new_chan , 0 , new_chan -> height , chan -> img , chan -> width );
599- dssim_preprocess_channel (chan -> next_half , tmp , num_scales - 1 );
599+ dssim_preprocess_channel (new_chan , tmp , num_scales - 1 );
600600 }
601601
602602 if (chan -> is_chroma ) {
@@ -650,18 +650,18 @@ double dssim_compare(dssim_attr *attr, const dssim_image *restrict original_imag
650650 assert (original_image );
651651 assert (modified_image );
652652
653- const int channels = MIN (original_image -> channels , modified_image -> channels );
653+ const int channels = MIN (original_image -> num_channels , modified_image -> num_channels );
654654 assert (channels > 0 );
655655
656- dssim_px_t * tmp = dssim_get_tmp (attr , original_image -> chan [0 ]-> width * original_image -> chan [0 ]-> height * sizeof (tmp [0 ]));
656+ dssim_px_t * tmp = dssim_get_tmp (attr , original_image -> chan [0 ]. width * original_image -> chan [0 ]. height * sizeof (tmp [0 ]));
657657 assert (tmp );
658658
659659 double ssim_sum = 0 ;
660660 double weight_sum = 0 ;
661661 for (int ch = 0 ; ch < channels ; ch ++ ) {
662662
663- const dssim_chan * original = original_image -> chan [ch ];
664- dssim_chan * modified = modified_image -> chan [ch ];
663+ const dssim_chan * original = & original_image -> chan [ch ];
664+ dssim_chan * modified = & modified_image -> chan [ch ];
665665 assert (original );
666666 assert (modified );
667667
0 commit comments