"""Test validate video analysis.""" import pytest from video.constants import job_io_fields from video.logic.activities import validate_analysis from video.models import ows_video def format_video_resizing_rule( input_inner_width, input_inner_height, output_inner_width, output_outer_width, output_inner_height, output_outer_height): """Format video resizing rule.""" return { 'input_inner_width': input_inner_width, 'input_inner_height': input_inner_height, 'output_inner_width': output_inner_width, 'output_outer_width': output_outer_width, 'output_inner_height': output_inner_height, 'output_outer_height': output_outer_height } def format_supported_video_resolution(output_outer_width, output_outer_height): """Format supported video resolution.""" ignored_id = 123 return [ignored_id, output_outer_width, output_outer_height] @pytest.mark.parametrize( ('seconds', 'frames_per_second', 'expected_timecode'), [ (1 / 25, 25, '00:00:00:01'), (2 / 30, 30, '00:00:00:02'), (1234567.89, 12.2, '342:56:07:10') ] ) def test_seconds_to_timecode(seconds, frames_per_second, expected_timecode): """Test seconds_to_timecode.""" assert expected_timecode == validate_analysis.seconds_to_timecode( seconds, frames_per_second) @pytest.mark.parametrize(( 'test_description', 'input_mod', 'output_mod', 'video_resizing_rules', 'supported_outer_resolutions', ), [ ( 'Video resizing rule match.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 1000, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(2000, 1000, 2000, 2000, 1000, 1000)], [], ), ( 'Horizontal resolution with supported outer resolution exact match.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 1000, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 1000)], ), ( 'Horizontal resolution with supported outer resolution scale down match with exact fit horizontally.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 2020, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 1000, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 990, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 1000)], ), ( 'Horizontal resolution with supported outer resolution scale down match with exact fit vertically.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 1020, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 1960, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 1000)], ), ( 'Horizontal resolution with supported outer resolution scale up match with exact fit horizontally.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 1980, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 900, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 910, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 1000)], ), ( 'Horizontal resolution with supported outer resolution scale up match with exact fit vertically.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 1900, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 980, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 1938, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 1000)], ), ( 'Vertical resolution with supported outer resolution exact match.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 1000, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 2000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(1000, 2000)], ), ( 'Vertical resolution with supported outer resolution scale down match with exact fit horizontally.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 1000, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 2020, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 990, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 2000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(1000, 2000)], ), ( 'Vertical resolution with supported outer resolution scale down match with exact fit vertically.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 1020, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1960, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 2000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(1000, 2000)], ), ( 'Vertical resolution with supported outer resolution scale up match with exact fit horizontally.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 900, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 1980, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 910, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 2000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(1000, 2000)], ), ( 'Vertical resolution with supported outer resolution scale up match with exact fit vertically.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 980, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 1900, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1938, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 2000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(1000, 2000)], ), ( 'Square resolution with supported outer resolution exact match.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 2000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 2000)], ), ( 'Square resolution with supported outer resolution scale down match with exact fit.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 2020, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 2020, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 2000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 2000)], ), ( 'Square resolution with supported outer resolution scale down match with exact fit horizontally.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 2020, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 2020, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 3000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 3000)], ), ( 'Vertical resolution with supported outer resolution scale down match with exact fit vertically.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 2020, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 2020, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 3000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 2000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(3000, 2000)], ), ( 'Vertical resolution with supported outer resolution scale up match with exact fit horizontally.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 1980, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 1980, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 3000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 3000)], ), ( 'Vertical resolution with supported outer resolution scale up match with exact fit vertically.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 1980, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 1980, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 3000, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 2000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(3000, 2000)], ), ( 'Choose closest supported outer resolution from list.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 1000, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 2002, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1000, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1000, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [ format_supported_video_resolution(1998, 998), format_supported_video_resolution(1998, 1000), format_supported_video_resolution(2000, 998), format_supported_video_resolution(2000, 1002), format_supported_video_resolution(2002, 1000), format_supported_video_resolution(2002, 1002), ], ), ( 'Width too large.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 3000, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 1000, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.ERROR_CANNOT_RESIZE_TO_STANDARD_RESOLUTION: 'Cannot convert video to a standard resolution.', job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 1000)], ), ( 'Height too large.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 2000, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 2000, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.ERROR_CANNOT_RESIZE_TO_STANDARD_RESOLUTION: 'Cannot convert video to a standard resolution.', job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 1000)], ), ( 'Width and height too small.', { job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 1000, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 500, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, }, { job_io_fields.ERROR_CANNOT_RESIZE_TO_STANDARD_RESOLUTION: 'Cannot convert video to a standard resolution.', job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1, 2, 3, 4, 5, 6)], [format_supported_video_resolution(2000, 1000)], ), ( 'Volume too low.', { job_io_fields.MAX_VOLUME_DECIBELS: -10.3, }, { job_io_fields.ERROR_VOLUME_TOO_LOW: 'Volume level must be at least -8 dB.', job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1080, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1080, }, [format_video_resizing_rule(1920, 1080, 1920, 1920, 1080, 1080),], [], ), ( 'Dual mono audio.', { job_io_fields.LEFT_AUDIO_CHANNEL_RMS_VOLUME_DECIBELS: -12.252345, job_io_fields.RIGHT_AUDIO_CHANNEL_RMS_VOLUME_DECIBELS: -12.252345, }, { job_io_fields.ERROR_DUAL_MONO_AUDIO: 'Left and right audio channels must be different.', job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1080, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1080, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1920, 1080, 1920, 1920, 1080, 1080),], [], ), ( 'No input clipping', { job_io_fields.SILENT_INTERVAL_AT_BEGINNING_ENDS_AT_SECONDS: None, job_io_fields.SILENT_INTERVAL_AT_END_BEGINS_AT_SECONDS: None, job_io_fields.BLACK_INTERVAL_AT_BEGINNING_ENDS_AT_SECONDS: None, job_io_fields.BLACK_INTERVAL_AT_END_BEGINS_AT_SECONDS: None, }, { job_io_fields.INPUT_CLIP_START_TIMECODE: None, job_io_fields.INPUT_CLIP_END_TIMECODE: None, job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1080, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1080, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1920, 1080, 1920, 1920, 1080, 1080),], [], ), ( 'Operator clip override wins over the black/silent-derived trim', { job_io_fields.INPUT_CLIP_START_TIMECODE: '00:00:10:00', job_io_fields.INPUT_CLIP_END_TIMECODE: '00:04:00:00', }, { job_io_fields.INPUT_CLIP_START_TIMECODE: '00:00:10:00', job_io_fields.INPUT_CLIP_END_TIMECODE: '00:04:00:00', job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1080, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1080, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: 2.6, }, [format_video_resizing_rule(1920, 1080, 1920, 1920, 1080, 1080),], [], ), ]) def test_validate_analysis( mocker, test_description, input_mod, output_mod, video_resizing_rules, supported_outer_resolutions, ): """Test test_validate_analysis.""" test_inputs = { job_io_fields.VALIDATE_ANALYSIS_JOB_ID: 123, job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 1586, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 1080, job_io_fields.SILENT_INTERVAL_AT_BEGINNING_ENDS_AT_SECONDS: 0.563, job_io_fields.SILENT_INTERVAL_AT_END_BEGINS_AT_SECONDS: 302.3, job_io_fields.MAX_VOLUME_DECIBELS: -4.6, job_io_fields.BLACK_INTERVAL_AT_BEGINNING_ENDS_AT_SECONDS: 0.23, job_io_fields.BLACK_INTERVAL_AT_END_BEGINS_AT_SECONDS: 301.2, job_io_fields.LEFT_AUDIO_CHANNEL_RMS_VOLUME_DECIBELS: -13.256345, job_io_fields.RIGHT_AUDIO_CHANNEL_RMS_VOLUME_DECIBELS: -13.452341, job_io_fields.VIDEO_STREAM_FRAME_RATE_FRAMES_PER_SECOND: 25, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1.211, **input_mod, } mocker.patch.object( ows_video, 'get_video_resizing_rules', autospec=True, return_value=video_resizing_rules ) mocker.patch.object( ows_video, 'get_supported_outer_resolutions', autospec=True, return_value=supported_outer_resolutions ) outputs = validate_analysis.validate_analysis(test_inputs) assert { job_io_fields.INPUT_CLIP_START_TIMECODE: '00:00:00:05', job_io_fields.INPUT_CLIP_END_TIMECODE: '00:05:02:07', **output_mod, } == outputs