5 * (The transform code is in wavelet_xform.c)
9 #define MAX(a,b) ((a) > (b) ? (a) : (b))
10 #define MAX3(a,b,c) (MAX(a,MAX(b,c)))
14 Wavelet3DBuf
* wavelet_3d_buf_new (uint32_t width
, uint32_t height
,
17 Wavelet3DBuf
* buf
= (Wavelet3DBuf
*) MALLOC (sizeof (Wavelet3DBuf
));
26 buf
->data
= (TYPE
*) MALLOC (width
* height
* frames
* sizeof (TYPE
));
29 wavelet_3d_buf_destroy (buf
);
38 while (_w
> 1 || _h
> 1 || _f
> 1) {
45 buf
->w
= (uint32_t*) MALLOC (buf
->scales
* sizeof (uint32_t));
46 buf
->h
= (uint32_t*) MALLOC (buf
->scales
* sizeof (uint32_t));
47 buf
->f
= (uint32_t*) MALLOC (buf
->scales
* sizeof (uint32_t));
48 buf
->offset
= (uint32_t (*) [8]) MALLOC (8 * buf
->scales
* sizeof (uint32_t));
50 buf
->scratchbuf
= (TYPE
*) MALLOC (MAX3(width
, height
, frames
) * sizeof (TYPE
));
52 if (!buf
->w
|| !buf
->h
|| !buf
->f
|| !buf
->offset
|| !buf
->scratchbuf
) {
53 wavelet_3d_buf_destroy (buf
);
57 buf
->w
[buf
->scales
-1] = width
;
58 buf
->h
[buf
->scales
-1] = height
;
59 buf
->f
[buf
->scales
-1] = frames
;
61 for (level
=buf
->scales
-2; level
>=0; level
--) {
62 buf
->w
[level
] = (buf
->w
[level
+1] + 1) / 2;
63 buf
->h
[level
] = (buf
->h
[level
+1] + 1) / 2;
64 buf
->f
[level
] = (buf
->f
[level
+1] + 1) / 2;
65 buf
->offset
[level
][0] = 0;
66 buf
->offset
[level
][1] = buf
->w
[level
];
67 buf
->offset
[level
][2] = buf
->h
[level
] * width
;
68 buf
->offset
[level
][3] = buf
->f
[level
] * width
* height
;
69 buf
->offset
[level
][4] = buf
->offset
[level
][2] + buf
->w
[level
];
70 buf
->offset
[level
][5] = buf
->offset
[level
][3] + buf
->w
[level
];
71 buf
->offset
[level
][6] = buf
->offset
[level
][3] + buf
->offset
[level
][2];
72 buf
->offset
[level
][7] = buf
->offset
[level
][6] + buf
->w
[level
];
79 void wavelet_3d_buf_destroy (Wavelet3DBuf
* buf
)
93 FREE (buf
->scratchbuf
);
99 #if defined(DBG_XFORM)
103 void wavelet_3d_buf_dump (char *fmt
,
104 uint32_t first_frame_in_buf
,
112 for (f
=0; f
<buf
->frames
; f
++) {
113 snprintf (fname
, 256, fmt
, id
, first_frame_in_buf
+ f
);
115 write_pgm16 (fname
, buf
->data
+ f
* buf
->width
* buf
->height
,
116 buf
->width
, buf
->height
, offset
);