@@ -67,6 +67,9 @@ pub struct Denoiser<T> {
6767 metadatas : Vec < T > ,
6868}
6969
70+ #[ derive( Debug ) ]
71+ pub struct WrongSizeError ;
72+
7073impl < T > Denoiser < T > {
7174 #[ inline]
7275 pub fn new ( width : usize , height : usize , quality : u8 ) -> Self {
@@ -118,17 +121,18 @@ impl<T> Denoiser<T> {
118121 }
119122 }
120123
121- pub fn push_frame ( & mut self , frame : ImgRef < RGBA8 > , frame_metadata : T ) {
122- assert_eq ! ( frame. width( ) , self . splat. width( ) ) ;
123- assert_eq ! ( frame. height( ) , self . splat. height( ) ) ;
124+ pub fn push_frame ( & mut self , frame : ImgRef < RGBA8 > , frame_metadata : T ) -> Result < ( ) , WrongSizeError > {
125+ if frame. width ( ) != self . splat . width ( ) || frame. height ( ) != self . splat . height ( ) {
126+ return Err ( WrongSizeError ) ;
127+ }
124128
125129 self . metadatas . insert ( 0 , frame_metadata) ;
126130
127131 self . frames += 1 ;
128132 // Can't output anything yet
129133 if self . frames < LOOKAHEAD {
130134 self . quick_append ( frame) ;
131- return ;
135+ return Ok ( ( ) ) ;
132136 }
133137
134138 let mut median = Vec :: with_capacity ( frame. width ( ) * frame. height ( ) ) ;
@@ -144,6 +148,7 @@ impl<T> Denoiser<T> {
144148 let median = ImgVec :: new ( median, frame. width ( ) , frame. height ( ) ) ;
145149 let imp_map = ImgVec :: new ( imp_map, frame. width ( ) , frame. height ( ) ) ;
146150 self . processed . insert ( 0 , ( median, imp_map) ) ;
151+ Ok ( ( ) )
147152 }
148153
149154 pub fn pop ( & mut self ) -> Denoised < T > {
@@ -303,7 +308,7 @@ fn px<T>(f: Denoised<T>) -> (RGBA8, T) {
303308fn one ( ) {
304309 let mut d = Denoiser :: new ( 1 , 1 , 100 ) ;
305310 let w = RGBA8 :: new ( 255 , 255 , 255 , 255 ) ;
306- d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) ;
311+ d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) . unwrap ( ) ;
307312 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
308313 d. flush ( ) ;
309314 assert_eq ! ( px( d. pop( ) ) , ( w, 0 ) ) ;
@@ -315,8 +320,8 @@ fn two() {
315320 let mut d = Denoiser :: new ( 1 , 1 , 100 ) ;
316321 let w = RGBA8 :: new ( 254 , 253 , 252 , 255 ) ;
317322 let b = RGBA8 :: new ( 8 , 7 , 0 , 255 ) ;
318- d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) ;
319- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 1 ) ;
323+ d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) . unwrap ( ) ;
324+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 1 ) . unwrap ( ) ;
320325 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
321326 d. flush ( ) ;
322327 assert_eq ! ( px( d. pop( ) ) , ( w, 0 ) ) ;
@@ -329,9 +334,9 @@ fn three() {
329334 let mut d = Denoiser :: new ( 1 , 1 , 100 ) ;
330335 let w = RGBA8 :: new ( 254 , 253 , 252 , 255 ) ;
331336 let b = RGBA8 :: new ( 8 , 7 , 0 , 255 ) ;
332- d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) ;
333- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 1 ) ;
334- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 2 ) ;
337+ d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) . unwrap ( ) ;
338+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 1 ) . unwrap ( ) ;
339+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 2 ) . unwrap ( ) ;
335340 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
336341 d. flush ( ) ;
337342 assert_eq ! ( px( d. pop( ) ) , ( w, 0 ) ) ;
@@ -347,10 +352,10 @@ fn four() {
347352 let w = RGBA8 :: new ( 254 , 253 , 252 , 255 ) ;
348353 let b = RGBA8 :: new ( 8 , 7 , 0 , 255 ) ;
349354 let t = RGBA8 :: new ( 0 , 0 , 0 , 0 ) ;
350- d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) ;
351- d. push_frame ( ImgVec :: new ( vec ! [ t] , 1 , 1 ) . as_ref ( ) , 1 ) ;
352- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 2 ) ;
353- d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 3 ) ;
355+ d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) . unwrap ( ) ;
356+ d. push_frame ( ImgVec :: new ( vec ! [ t] , 1 , 1 ) . as_ref ( ) , 1 ) . unwrap ( ) ;
357+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 2 ) . unwrap ( ) ;
358+ d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 3 ) . unwrap ( ) ;
354359 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
355360 d. flush ( ) ;
356361 assert_eq ! ( px( d. pop( ) ) , ( w, 0 ) ) ;
@@ -366,12 +371,12 @@ fn five() {
366371 let w = RGBA8 :: new ( 254 , 253 , 252 , 255 ) ;
367372 let b = RGBA8 :: new ( 8 , 7 , 0 , 255 ) ;
368373 let t = RGBA8 :: new ( 0 , 0 , 0 , 0 ) ;
369- d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) ;
370- d. push_frame ( ImgVec :: new ( vec ! [ t] , 1 , 1 ) . as_ref ( ) , 1 ) ;
371- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 2 ) ;
372- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 3 ) ;
374+ d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) . unwrap ( ) ;
375+ d. push_frame ( ImgVec :: new ( vec ! [ t] , 1 , 1 ) . as_ref ( ) , 1 ) . unwrap ( ) ;
376+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 2 ) . unwrap ( ) ;
377+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 3 ) . unwrap ( ) ;
373378 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
374- d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 4 ) ;
379+ d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 4 ) . unwrap ( ) ;
375380 assert_eq ! ( px( d. pop( ) ) , ( w, 0 ) ) ;
376381 d. flush ( ) ;
377382 assert_eq ! ( px( d. pop( ) ) , ( t, 1 ) ) ;
@@ -388,17 +393,17 @@ fn six() {
388393 let b = RGBA8 :: new ( 8 , 7 , 0 , 255 ) ;
389394 let t = RGBA8 :: new ( 0 , 0 , 0 , 0 ) ;
390395 let x = RGBA8 :: new ( 4 , 5 , 6 , 255 ) ;
391- d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) ;
396+ d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 0 ) . unwrap ( ) ;
392397 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
393- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 1 ) ;
398+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 1 ) . unwrap ( ) ;
394399 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
395- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 2 ) ;
400+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , 2 ) . unwrap ( ) ;
396401 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
397- d. push_frame ( ImgVec :: new ( vec ! [ t] , 1 , 1 ) . as_ref ( ) , 3 ) ;
402+ d. push_frame ( ImgVec :: new ( vec ! [ t] , 1 , 1 ) . as_ref ( ) , 3 ) . unwrap ( ) ;
398403 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
399- d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 4 ) ;
404+ d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , 4 ) . unwrap ( ) ;
400405 assert_eq ! ( px( d. pop( ) ) , ( w, 0 ) ) ;
401- d. push_frame ( ImgVec :: new ( vec ! [ x] , 1 , 1 ) . as_ref ( ) , 5 ) ;
406+ d. push_frame ( ImgVec :: new ( vec ! [ x] , 1 , 1 ) . as_ref ( ) , 5 ) . unwrap ( ) ;
402407 d. flush ( ) ;
403408 assert_eq ! ( px( d. pop( ) ) , ( b, 1 ) ) ;
404409 assert_eq ! ( px( d. pop( ) ) , ( b, 2 ) ) ;
@@ -415,19 +420,19 @@ fn many() {
415420 let w = RGBA8 :: new ( 255 , 254 , 253 , 255 ) ;
416421 let b = RGBA8 :: new ( 1 , 2 , 3 , 255 ) ;
417422 let t = RGBA8 :: new ( 0 , 0 , 0 , 0 ) ;
418- d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , "w0" ) ;
423+ d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , "w0" ) . unwrap ( ) ;
419424 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
420- d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , "w1" ) ;
425+ d. push_frame ( ImgVec :: new ( vec ! [ w] , 1 , 1 ) . as_ref ( ) , "w1" ) . unwrap ( ) ;
421426 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
422- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , "b2" ) ;
427+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , "b2" ) . unwrap ( ) ;
423428 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
424- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , "b3" ) ;
429+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , "b3" ) . unwrap ( ) ;
425430 assert ! ( matches!( d. pop( ) , Denoised :: NotYet ) ) ;
426- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , "b4" ) ;
431+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , "b4" ) . unwrap ( ) ;
427432 assert_eq ! ( px( d. pop( ) ) , ( w, "w0" ) ) ;
428- d. push_frame ( ImgVec :: new ( vec ! [ t] , 1 , 1 ) . as_ref ( ) , "t5" ) ;
433+ d. push_frame ( ImgVec :: new ( vec ! [ t] , 1 , 1 ) . as_ref ( ) , "t5" ) . unwrap ( ) ;
429434 assert_eq ! ( px( d. pop( ) ) , ( w, "w1" ) ) ;
430- d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , "b6" ) ;
435+ d. push_frame ( ImgVec :: new ( vec ! [ b] , 1 , 1 ) . as_ref ( ) , "b6" ) . unwrap ( ) ;
431436 assert_eq ! ( px( d. pop( ) ) , ( b, "b2" ) ) ;
432437 d. flush ( ) ;
433438 assert_eq ! ( px( d. pop( ) ) , ( b, "b3" ) ) ;
0 commit comments