Skip to content

Commit dd0cf68

Browse files
committed
Inline dssim_chan storage
1 parent 6209638 commit dd0cf68

File tree

1 file changed

+34
-34
lines changed

1 file changed

+34
-34
lines changed

src/dssim.c

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ struct dssim_chan {
5959
};
6060

6161
struct dssim_image {
62-
dssim_chan *chan[MAX_CHANS];
63-
int channels;
62+
dssim_chan chan[MAX_CHANS];
63+
int num_channels;
6464
};
6565

6666
struct 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

159159
void 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

379379
static 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

410410
static 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

Comments
 (0)