@@ -130,3 +130,75 @@ TEST_CASE( "Normalize & scale waveform data piano.wav", "[libopenshot][audiowave
130130 // Clean up
131131 r.Close ();
132132}
133+
134+ TEST_CASE ( " Extract waveform from image (no audio)" , " [libopenshot][audiowaveformer]" )
135+ {
136+ // Create a reader
137+ std::stringstream path;
138+ path << TEST_MEDIA_PATH << " front.png" ;
139+ FFmpegReader r (path.str ());
140+
141+ // Create AudioWaveformer and extract a smaller "average" sample set of audio data
142+ AudioWaveformer waveformer (&r);
143+ AudioWaveformData waveform = waveformer.ExtractSamples (-1 , 20 , false );
144+
145+ CHECK (waveform.rms_samples .size () == 0 );
146+ CHECK (waveform.max_samples .size () == 0 );
147+
148+ // Clean up
149+ r.Close ();
150+ }
151+
152+ TEST_CASE ( " AudioWaveformData struct methods" , " [libopenshot][audiowaveformer]" )
153+ {
154+ // Create a reader
155+ AudioWaveformData waveform;
156+
157+ // Resize data to 10 elements
158+ waveform.resize (10 );
159+ CHECK (waveform.rms_samples .size () == 10 );
160+ CHECK (waveform.max_samples .size () == 10 );
161+
162+ // Set all values = 1.0
163+ for (auto s = 0 ; s < waveform.rms_samples .size (); s++) {
164+ waveform.rms_samples [s] = 1.0 ;
165+ waveform.max_samples [s] = 1.0 ;
166+ }
167+ CHECK (waveform.rms_samples [0 ] == Approx (1 .0f ).margin (0.00001 ));
168+ CHECK (waveform.rms_samples [9 ] == Approx (1 .0f ).margin (0.00001 ));
169+ CHECK (waveform.max_samples [0 ] == Approx (1 .0f ).margin (0.00001 ));
170+ CHECK (waveform.max_samples [9 ] == Approx (1 .0f ).margin (0.00001 ));
171+
172+ // Scale all values by 2
173+ waveform.scale (10 , 2.0 );
174+ CHECK (waveform.rms_samples .size () == 10 );
175+ CHECK (waveform.max_samples .size () == 10 );
176+ CHECK (waveform.rms_samples [0 ] == Approx (2 .0f ).margin (0.00001 ));
177+ CHECK (waveform.rms_samples [9 ] == Approx (2 .0f ).margin (0.00001 ));
178+ CHECK (waveform.max_samples [0 ] == Approx (2 .0f ).margin (0.00001 ));
179+ CHECK (waveform.max_samples [9 ] == Approx (2 .0f ).margin (0.00001 ));
180+
181+ // Zero out all values
182+ waveform.zero (10 );
183+ CHECK (waveform.rms_samples .size () == 10 );
184+ CHECK (waveform.max_samples .size () == 10 );
185+ CHECK (waveform.rms_samples [0 ] == Approx (0 .0f ).margin (0.00001 ));
186+ CHECK (waveform.rms_samples [9 ] == Approx (0 .0f ).margin (0.00001 ));
187+ CHECK (waveform.max_samples [0 ] == Approx (0 .0f ).margin (0.00001 ));
188+ CHECK (waveform.max_samples [9 ] == Approx (0 .0f ).margin (0.00001 ));
189+
190+ // Access vectors and verify size
191+ std::vector<std::vector<float >> vectors = waveform.vectors ();
192+ CHECK (vectors.size () == 2 );
193+ CHECK (vectors[0 ].size () == 10 );
194+ CHECK (vectors[0 ].size () == 10 );
195+
196+ // Clear and verify internal data is empty
197+ waveform.clear ();
198+ CHECK (waveform.rms_samples .size () == 0 );
199+ CHECK (waveform.max_samples .size () == 0 );
200+ vectors = waveform.vectors ();
201+ CHECK (vectors.size () == 2 );
202+ CHECK (vectors[0 ].size () == 0 );
203+ CHECK (vectors[0 ].size () == 0 );
204+ }
0 commit comments