"""Test calculate_audio_stats.""" import ffmpeg import pytest from video.connectors import s3 as s3_connector from video.constants import job_io_fields from video.logic.activities import calculate_audio_stats @pytest.mark.parametrize(( 'test_description', 'test_stderr', 'expected_left_rms_db', 'expected_right_rms_db', ), [ ( 'RMS levels found.', b""" noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] Channel: 1 [Parsed_astats_0 @ 0x7f9709d1dbc0] DC offset: 0.000033 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min level: -26029.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max level: 26028.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min difference: 0.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max difference: 31081.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Mean difference: 1486.657759 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS difference: 2572.508595 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak level dB: -1.999584 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS level dB: -13.042948 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS peak dB: -5.528504 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS trough dB: -inf [Parsed_astats_0 @ 0x7f9709d1dbc0] Crest factor: 3.565892 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] Flat factor: 34.644918 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak count: 4896 [Parsed_astats_0 @ 0x7f9709d1dbc0] Bit depth: 16/16 [Parsed_astats_0 @ 0x7f9709d1dbc0] Dynamic range: 94.329750 [Parsed_astats_0 @ 0x7f9709d1dbc0] Channel: 2 [Parsed_astats_0 @ 0x7f9709d1dbc0] DC offset: -0.000022 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min level: -26029.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max level: 26028.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min difference: 0.000000 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] Max difference: 34856.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Mean difference: 1490.661393 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS difference: 2591.996228 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak level dB: -1.999584 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS level dB: -13.145148 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS peak dB: -6.889574 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS trough dB: -inf [Parsed_astats_0 @ 0x7f9709d1dbc0] Crest factor: 3.608097 [Parsed_astats_0 @ 0x7f9709d1dbc0] Flat factor: 22.969751 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak count: 2819 [Parsed_astats_0 @ 0x7f9709d1dbc0] Bit depth: 16/16 [Parsed_astats_0 @ 0x7f9709d1dbc0] Dynamic range: 94.329750 [Parsed_astats_0 @ 0x7f9709d1dbc0] Overall [Parsed_astats_0 @ 0x7f9709d1dbc0] DC offset: 0.000033 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min level: -26029.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max level: 26028.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min difference: 0.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max difference: 34856.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Mean difference: 1488.659576 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS difference: 2582.270795 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak level dB: -1.999584 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS level dB: -13.093747 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS peak dB: -5.528504 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS trough dB: -inf [Parsed_astats_0 @ 0x7f9709d1dbc0] Flat factor: 31.910039 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak count: 3857.500000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Bit depth: 16/16 [Parsed_astats_0 @ 0x7f9709d1dbc0] Number of samples: 11980801 noisenoisenoise """, # noqa -13.042948, -13.145148, ), ( '-inf RMS levels found.', b""" noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] Channel: 1 [Parsed_astats_0 @ 0x7f9709d1dbc0] DC offset: 0.000033 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min level: -26029.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max level: 26028.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min difference: 0.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max difference: 31081.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Mean difference: 1486.657759 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS difference: 2572.508595 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak level dB: -1.999584 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS level dB: -inf [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS peak dB: -5.528504 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS trough dB: -inf [Parsed_astats_0 @ 0x7f9709d1dbc0] Crest factor: 3.565892 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] Flat factor: 34.644918 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak count: 4896 [Parsed_astats_0 @ 0x7f9709d1dbc0] Bit depth: 16/16 [Parsed_astats_0 @ 0x7f9709d1dbc0] Dynamic range: 94.329750 [Parsed_astats_0 @ 0x7f9709d1dbc0] Channel: 2 [Parsed_astats_0 @ 0x7f9709d1dbc0] DC offset: -0.000022 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min level: -26029.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max level: 26028.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min difference: 0.000000 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] Max difference: 34856.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Mean difference: 1490.661393 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS difference: 2591.996228 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak level dB: -1.999584 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS level dB: -inf [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS peak dB: -6.889574 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS trough dB: -inf [Parsed_astats_0 @ 0x7f9709d1dbc0] Crest factor: 3.608097 [Parsed_astats_0 @ 0x7f9709d1dbc0] Flat factor: 22.969751 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak count: 2819 [Parsed_astats_0 @ 0x7f9709d1dbc0] Bit depth: 16/16 [Parsed_astats_0 @ 0x7f9709d1dbc0] Dynamic range: 94.329750 [Parsed_astats_0 @ 0x7f9709d1dbc0] Overall [Parsed_astats_0 @ 0x7f9709d1dbc0] DC offset: 0.000033 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min level: -26029.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max level: 26028.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min difference: 0.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max difference: 34856.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Mean difference: 1488.659576 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS difference: 2582.270795 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak level dB: -1.999584 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS level dB: -13.093747 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS peak dB: -5.528504 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS trough dB: -inf [Parsed_astats_0 @ 0x7f9709d1dbc0] Flat factor: 31.910039 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak count: 3857.500000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Bit depth: 16/16 [Parsed_astats_0 @ 0x7f9709d1dbc0] Number of samples: 11980801 noisenoisenoise """, # noqa -60, -60, ), ( '0 (max possible) RMS levels found.', b""" noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] Channel: 1 [Parsed_astats_0 @ 0x7f9709d1dbc0] DC offset: 0.000033 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min level: -26029.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max level: 26028.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min difference: 0.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max difference: 31081.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Mean difference: 1486.657759 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS difference: 2572.508595 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak level dB: -1.999584 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS level dB: 0 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS peak dB: -5.528504 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS trough dB: -inf [Parsed_astats_0 @ 0x7f9709d1dbc0] Crest factor: 3.565892 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] Flat factor: 34.644918 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak count: 4896 [Parsed_astats_0 @ 0x7f9709d1dbc0] Bit depth: 16/16 [Parsed_astats_0 @ 0x7f9709d1dbc0] Dynamic range: 94.329750 [Parsed_astats_0 @ 0x7f9709d1dbc0] Channel: 2 [Parsed_astats_0 @ 0x7f9709d1dbc0] DC offset: -0.000022 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min level: -26029.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max level: 26028.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min difference: 0.000000 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] Max difference: 34856.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Mean difference: 1490.661393 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS difference: 2591.996228 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak level dB: -1.999584 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS level dB: 0 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS peak dB: -6.889574 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS trough dB: -inf [Parsed_astats_0 @ 0x7f9709d1dbc0] Crest factor: 3.608097 [Parsed_astats_0 @ 0x7f9709d1dbc0] Flat factor: 22.969751 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak count: 2819 [Parsed_astats_0 @ 0x7f9709d1dbc0] Bit depth: 16/16 [Parsed_astats_0 @ 0x7f9709d1dbc0] Dynamic range: 94.329750 [Parsed_astats_0 @ 0x7f9709d1dbc0] Overall [Parsed_astats_0 @ 0x7f9709d1dbc0] DC offset: 0.000033 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min level: -26029.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max level: 26028.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Min difference: 0.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Max difference: 34856.000000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Mean difference: 1488.659576 noisenoisenoise [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS difference: 2582.270795 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak level dB: -1.999584 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS level dB: -13.093747 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS peak dB: -5.528504 [Parsed_astats_0 @ 0x7f9709d1dbc0] RMS trough dB: -inf [Parsed_astats_0 @ 0x7f9709d1dbc0] Flat factor: 31.910039 [Parsed_astats_0 @ 0x7f9709d1dbc0] Peak count: 3857.500000 [Parsed_astats_0 @ 0x7f9709d1dbc0] Bit depth: 16/16 [Parsed_astats_0 @ 0x7f9709d1dbc0] Number of samples: 11980801 noisenoisenoise """, # noqa 0, 0, ), ( 'RMS levels not found.', b""" applesauce bananas """, None, None, ), ]) def test_detect_video_location_and_dimensions_within_black_border( mocker, test_description, test_stderr, expected_left_rms_db, expected_right_rms_db, ): """Test calculate_audio_stats.""" mocker.patch.object( s3_connector, 'get_url_for_s3_object', return_value='test_url', autospec=True, ) mocker.patch.object( ffmpeg, 'input', autospec=True, ) input_mock = ffmpeg.input filter_mock = input_mock.return_value.filter output_mock = filter_mock.return_value.output run_mock = output_mock.return_value.run run_mock.return_value = 'test stdout'.encode(), test_stderr inputs = { job_io_fields.CALCULATE_AUDIO_STATS_JOB_ID: 123, job_io_fields.INPUT_VIDEO_S3_BUCKET: 'test_bucket', job_io_fields.INPUT_VIDEO_S3_KEY: 'test_key/123.mov', } expected_outputs = { job_io_fields.LEFT_AUDIO_CHANNEL_RMS_VOLUME_DECIBELS: ( expected_left_rms_db), job_io_fields.RIGHT_AUDIO_CHANNEL_RMS_VOLUME_DECIBELS: ( expected_right_rms_db) } outputs = calculate_audio_stats.calculate_audio_stats(inputs) assert expected_outputs == outputs input_mock.assert_called_once_with('test_url') filter_mock.assert_called_once_with('astats') output_mock.assert_called_once_with( 'pipe:', format='null', **{'vn': None}, ) run_mock.assert_called_once_with( capture_stderr=True, )