1717 assert_tensor_close_on_at_least ,
1818 get_ffmpeg_major_version ,
1919 get_ffmpeg_minor_version ,
20- in_fbcode ,
2120 IS_WINDOWS ,
2221 NASA_AUDIO_MP3 ,
22+ needs_ffmpeg_cli ,
2323 psnr ,
2424 SINE_MONO_S32 ,
2525 TEST_SRC_2_720P ,
@@ -217,13 +217,22 @@ def test_bad_input_parametrized(self, method, tmp_path):
217217 getattr (decoder , method )(** valid_params , num_channels = num_channels )
218218
219219 @pytest .mark .parametrize ("method" , ("to_file" , "to_tensor" , "to_file_like" ))
220- @pytest .mark .parametrize ("format" , ("wav" , "flac" ))
220+ @pytest .mark .parametrize (
221+ "format" ,
222+ [
223+ pytest .param (
224+ "wav" ,
225+ marks = pytest .mark .skipif (
226+ get_ffmpeg_major_version () == 4 ,
227+ reason = "Swresample with FFmpeg 4 doesn't work on wav files" ,
228+ ),
229+ ),
230+ "flac" ,
231+ ],
232+ )
221233 def test_round_trip (self , method , format , tmp_path ):
222234 # Check that decode(encode(samples)) == samples on lossless formats
223235
224- if get_ffmpeg_major_version () == 4 and format == "wav" :
225- pytest .skip ("Swresample with FFmpeg 4 doesn't work on wav files" )
226-
227236 asset = NASA_AUDIO_MP3
228237 source_samples = self .decode (asset ).data
229238
@@ -249,7 +258,7 @@ def test_round_trip(self, method, format, tmp_path):
249258 self .decode (encoded_source ).data , source_samples , rtol = rtol , atol = atol
250259 )
251260
252- @pytest . mark . skipif ( in_fbcode (), reason = "TODO: enable ffmpeg CLI" )
261+ @needs_ffmpeg_cli
253262 @pytest .mark .parametrize ("asset" , (NASA_AUDIO_MP3 , SINE_MONO_S32 ))
254263 @pytest .mark .parametrize ("bit_rate" , (None , 0 , 44_100 , 999_999_999 ))
255264 @pytest .mark .parametrize ("num_channels" , (None , 1 , 2 ))
@@ -356,17 +365,30 @@ def test_against_cli(
356365 @pytest .mark .parametrize ("asset" , (NASA_AUDIO_MP3 , SINE_MONO_S32 ))
357366 @pytest .mark .parametrize ("bit_rate" , (None , 0 , 44_100 , 999_999_999 ))
358367 @pytest .mark .parametrize ("num_channels" , (None , 1 , 2 ))
359- @pytest .mark .parametrize ("format" , ("mp3" , "wav" , "flac" ))
368+ @pytest .mark .parametrize (
369+ "format" ,
370+ [
371+ pytest .param (
372+ "mp3" ,
373+ marks = pytest .mark .skipif (
374+ IS_WINDOWS and get_ffmpeg_major_version () <= 5 ,
375+ reason = "Encoding mp3 on Windows is weirdly buggy" ,
376+ ),
377+ ),
378+ pytest .param (
379+ "wav" ,
380+ marks = pytest .mark .skipif (
381+ get_ffmpeg_major_version () == 4 ,
382+ reason = "Swresample with FFmpeg 4 doesn't work on wav files" ,
383+ ),
384+ ),
385+ "flac" ,
386+ ],
387+ )
360388 @pytest .mark .parametrize ("method" , ("to_tensor" , "to_file_like" ))
361389 def test_against_to_file (
362390 self , asset , bit_rate , num_channels , format , tmp_path , method
363391 ):
364- if get_ffmpeg_major_version () == 4 and format == "wav" :
365- pytest .skip ("Swresample with FFmpeg 4 doesn't work on wav files" )
366- if IS_WINDOWS and get_ffmpeg_major_version () <= 5 and format == "mp3" :
367- # TODO: https://github.com/pytorch/torchcodec/issues/837
368- pytest .skip ("Encoding mp3 on Windows is weirdly buggy" )
369-
370392 encoder = AudioEncoder (self .decode (asset ).data , sample_rate = asset .sample_rate )
371393
372394 params = dict (bit_rate = bit_rate , num_channels = num_channels )
@@ -816,16 +838,27 @@ def encode_to_tensor(frames):
816838 )
817839
818840 @pytest .mark .parametrize (
819- "format" , ("mov" , "mp4" , "mkv" , pytest .param ("webm" , marks = pytest .mark .slow ))
841+ "format" ,
842+ [
843+ "mov" ,
844+ "mp4" ,
845+ "mkv" ,
846+ pytest .param (
847+ "webm" ,
848+ marks = [
849+ pytest .mark .slow ,
850+ pytest .mark .skipif (
851+ get_ffmpeg_major_version () == 4
852+ or (IS_WINDOWS and get_ffmpeg_major_version () in (6 , 7 )),
853+ reason = "Codec for webm is not available in this FFmpeg installation." ,
854+ ),
855+ ],
856+ ),
857+ ],
820858 )
821859 @pytest .mark .parametrize ("method" , ("to_file" , "to_tensor" , "to_file_like" ))
822860 def test_round_trip (self , tmp_path , format , method ):
823861 # Test that decode(encode(decode(frames))) == decode(frames)
824- ffmpeg_version = get_ffmpeg_major_version ()
825- if format == "webm" and (
826- ffmpeg_version == 4 or (IS_WINDOWS and ffmpeg_version in (6 , 7 ))
827- ):
828- pytest .skip ("Codec for webm is not available in this FFmpeg installation." )
829862 source_frames = self .decode (TEST_SRC_2_720P .path ).data
830863
831864 # Frame rate is fixed with num frames decoded
@@ -859,25 +892,29 @@ def test_round_trip(self, tmp_path, format, method):
859892
860893 @pytest .mark .parametrize (
861894 "format" ,
862- (
895+ [
863896 "mov" ,
864897 "mp4" ,
865898 "avi" ,
866899 "mkv" ,
867900 "flv" ,
868901 "gif" ,
869- pytest .param ("webm" , marks = pytest .mark .slow ),
870- ),
902+ pytest .param (
903+ "webm" ,
904+ marks = [
905+ pytest .mark .slow ,
906+ pytest .mark .skipif (
907+ get_ffmpeg_major_version () == 4
908+ or (IS_WINDOWS and get_ffmpeg_major_version () in (6 , 7 )),
909+ reason = "Codec for webm is not available in this FFmpeg installation." ,
910+ ),
911+ ],
912+ ),
913+ ],
871914 )
872915 @pytest .mark .parametrize ("method" , ("to_tensor" , "to_file_like" ))
873916 def test_against_to_file (self , tmp_path , format , method ):
874917 # Test that to_file, to_tensor, and to_file_like produce the same results
875- ffmpeg_version = get_ffmpeg_major_version ()
876- if format == "webm" and (
877- ffmpeg_version == 4 or (IS_WINDOWS and ffmpeg_version in (6 , 7 ))
878- ):
879- pytest .skip ("Codec for webm is not available in this FFmpeg installation." )
880-
881918 source_frames = self .decode (TEST_SRC_2_720P .path ).data
882919 encoder = VideoEncoder (frames = source_frames , frame_rate = 30 )
883920
@@ -898,17 +935,26 @@ def test_against_to_file(self, tmp_path, format, method):
898935 rtol = 0 ,
899936 )
900937
901- @pytest .mark .skipif (in_fbcode (), reason = "ffmpeg CLI not available" )
902938 @pytest .mark .parametrize (
903939 "format" ,
904- (
940+ [
905941 "mov" ,
906942 "mp4" ,
907943 "avi" ,
908944 "mkv" ,
909945 "flv" ,
910- pytest .param ("webm" , marks = pytest .mark .slow ),
911- ),
946+ pytest .param (
947+ "webm" ,
948+ marks = [
949+ pytest .mark .slow ,
950+ pytest .mark .skipif (
951+ get_ffmpeg_major_version () == 4
952+ or (IS_WINDOWS and get_ffmpeg_major_version () in (6 , 7 )),
953+ reason = "Codec for webm is not available in this FFmpeg installation." ,
954+ ),
955+ ],
956+ ),
957+ ],
912958 )
913959 @pytest .mark .parametrize (
914960 "encode_params" ,
@@ -923,12 +969,6 @@ def test_against_to_file(self, tmp_path, format, method):
923969 def test_video_encoder_against_ffmpeg_cli (
924970 self , tmp_path , format , encode_params , method
925971 ):
926- ffmpeg_version = get_ffmpeg_major_version ()
927- if format == "webm" and (
928- ffmpeg_version == 4 or (IS_WINDOWS and ffmpeg_version in (6 , 7 ))
929- ):
930- pytest .skip ("Codec for webm is not available in this FFmpeg installation." )
931-
932972 pixel_format = encode_params ["pixel_format" ]
933973 crf = encode_params ["crf" ]
934974 preset = encode_params ["preset" ]
@@ -1101,10 +1141,7 @@ def write(self, data):
11011141 ):
11021142 encoder .to_file_like (NoSeekMethod (), format = "mp4" )
11031143
1104- @pytest .mark .skipif (
1105- in_fbcode (),
1106- reason = "ffprobe not available internally" ,
1107- )
1144+ @needs_ffmpeg_cli
11081145 @pytest .mark .parametrize (
11091146 "format,codec_spec" ,
11101147 [
@@ -1132,10 +1169,7 @@ def test_codec_parameter_utilized(self, tmp_path, format, codec_spec):
11321169 ]
11331170 assert actual_codec_spec == codec_spec
11341171
1135- @pytest .mark .skipif (
1136- in_fbcode (),
1137- reason = "ffprobe not available internally" ,
1138- )
1172+ @needs_ffmpeg_cli
11391173 @pytest .mark .parametrize (
11401174 "codec_spec,codec_impl" ,
11411175 [
@@ -1178,7 +1212,7 @@ def test_codec_spec_vs_impl_equivalence(self, tmp_path, codec_spec, codec_impl):
11781212 frames_impl = self .decode (impl_output ).data
11791213 torch .testing .assert_close (frames_spec , frames_impl , rtol = 0 , atol = 0 )
11801214
1181- @pytest . mark . skipif ( in_fbcode (), reason = "ffprobe not available" )
1215+ @needs_ffmpeg_cli
11821216 @pytest .mark .parametrize (
11831217 "profile,colorspace,color_range" ,
11841218 [
0 commit comments