@@ -1054,10 +1054,10 @@ def test_png_yuv_read_out(self):
1054
1054
self .assertEqual (chunks [10 ], bgra , atol = 0 , rtol = 0 )
1055
1055
1056
1056
1057
- @skipIfNoFFmpeg
1058
1057
@skipIfNoHWAccel ("h264_cuvid" )
1059
1058
class CuvidHWAccelInterfaceTest (TorchaudioTestCase ):
1060
1059
def test_dup_hw_acel (self ):
1060
+ """Specifying the same source stream with and without HW accel should fail (instead of segfault later)"""
1061
1061
src = get_asset_path ("nasa_13013.mp4" )
1062
1062
r = StreamReader (src )
1063
1063
r .add_video_stream (- 1 , decoder = "h264_cuvid" )
@@ -1070,55 +1070,87 @@ def test_dup_hw_acel(self):
1070
1070
r .add_video_stream (- 1 , decoder = "h264_cuvid" )
1071
1071
1072
1072
1073
- @skipIfNoFFmpeg
1074
- @skipIfNoHWAccel ("h264_cuvid" )
1075
1073
@_media_source
1076
- class H264CuvidDecoderTest (_MediaSourceMixin , TempDirMixin , TorchaudioTestCase ):
1074
+ class CudaDecoderTest (_MediaSourceMixin , TempDirMixin , TorchaudioTestCase ):
1075
+ @skipIfNoHWAccel ("h264_cuvid" )
1077
1076
def test_h264_cuvid (self ):
1077
+ """GPU decoder works for H264"""
1078
1078
src = self .get_src (get_asset_path ("nasa_13013.mp4" ))
1079
1079
r = StreamReader (src )
1080
- r .add_video_stream (- 1 , decoder = "h264_cuvid" )
1081
- r .process_all_packets ()
1082
- (chunk ,) = r .pop_chunks ()
1080
+ r .add_video_stream (10 , decoder = "h264_cuvid" )
1083
1081
1084
- self .assertEqual (chunk .device , torch .device ("cpu" ))
1085
- self .assertEqual (chunk .dtype , torch .uint8 )
1086
- self .assertEqual (chunk .shape , torch .Size ([390 , 3 , 270 , 480 ]))
1082
+ num_frames = 0
1083
+ for (chunk ,) in r .stream ():
1084
+ self .assertEqual (chunk .device , torch .device ("cpu" ))
1085
+ self .assertEqual (chunk .dtype , torch .uint8 )
1086
+ self .assertEqual (chunk .shape , torch .Size ([10 , 3 , 270 , 480 ]))
1087
+ num_frames += chunk .size (0 )
1088
+ assert num_frames == 390
1087
1089
1090
+ @skipIfNoHWAccel ("h264_cuvid" )
1088
1091
def test_h264_cuvid_hw_accel (self ):
1092
+ """GPU decoder works for H264 with HW acceleration, and put the frames on CUDA tensor"""
1089
1093
src = self .get_src (get_asset_path ("nasa_13013.mp4" ))
1090
1094
r = StreamReader (src )
1091
- r .add_video_stream (- 1 , decoder = "h264_cuvid" , hw_accel = "cuda" )
1092
- r .process_all_packets ()
1093
- (chunk ,) = r .pop_chunks ()
1094
-
1095
- self .assertEqual (chunk .device , torch .device ("cuda:0" ))
1096
- self .assertEqual (chunk .dtype , torch .uint8 )
1097
- self .assertEqual (chunk .shape , torch .Size ([390 , 3 , 270 , 480 ]))
1095
+ r .add_video_stream (10 , decoder = "h264_cuvid" , hw_accel = "cuda" )
1098
1096
1097
+ num_frames = 0
1098
+ for (chunk ,) in r .stream ():
1099
+ self .assertEqual (chunk .device , torch .device ("cuda:0" ))
1100
+ self .assertEqual (chunk .dtype , torch .uint8 )
1101
+ self .assertEqual (chunk .shape , torch .Size ([10 , 3 , 270 , 480 ]))
1102
+ num_frames += chunk .size (0 )
1103
+ assert num_frames == 390
1099
1104
1100
- @skipIfNoFFmpeg
1101
- @skipIfNoHWAccel ("hevc_cuvid" )
1102
- @_media_source
1103
- class HevcCuvidDecoderTest (_MediaSourceMixin , TempDirMixin , TorchaudioTestCase ):
1105
+ @skipIfNoHWAccel ("hevc_cuvid" )
1104
1106
def test_hevc_cuvid (self ):
1107
+ """GPU decoder works for H265/HEVC"""
1105
1108
src = self .get_src (get_asset_path ("testsrc.hevc" ))
1106
1109
r = StreamReader (src )
1107
- r .add_video_stream (- 1 , decoder = "hevc_cuvid" )
1108
- r .process_all_packets ()
1109
- (chunk ,) = r .pop_chunks ()
1110
+ r .add_video_stream (10 , decoder = "hevc_cuvid" )
1110
1111
1111
- self .assertEqual (chunk .device , torch .device ("cpu" ))
1112
- self .assertEqual (chunk .dtype , torch .uint8 )
1113
- self .assertEqual (chunk .shape , torch .Size ([300 , 3 , 144 , 256 ]))
1112
+ num_frames = 0
1113
+ for (chunk ,) in r .stream ():
1114
+ self .assertEqual (chunk .device , torch .device ("cpu" ))
1115
+ self .assertEqual (chunk .dtype , torch .uint8 )
1116
+ self .assertEqual (chunk .shape , torch .Size ([10 , 3 , 144 , 256 ]))
1117
+ num_frames += chunk .size (0 )
1118
+ assert num_frames == 300
1114
1119
1120
+ @skipIfNoHWAccel ("hevc_cuvid" )
1115
1121
def test_hevc_cuvid_hw_accel (self ):
1122
+ """GPU decoder works for H265/HEVC with HW acceleration, and put the frames on CUDA tensor"""
1116
1123
src = self .get_src (get_asset_path ("testsrc.hevc" ))
1117
1124
r = StreamReader (src )
1118
- r .add_video_stream (- 1 , decoder = "hevc_cuvid" , hw_accel = "cuda" )
1119
- r .process_all_packets ()
1120
- (chunk ,) = r .pop_chunks ()
1125
+ r .add_video_stream (10 , decoder = "hevc_cuvid" , hw_accel = "cuda" )
1121
1126
1122
- self .assertEqual (chunk .device , torch .device ("cuda:0" ))
1123
- self .assertEqual (chunk .dtype , torch .int16 )
1124
- self .assertEqual (chunk .shape , torch .Size ([300 , 3 , 144 , 256 ]))
1127
+ num_frames = 0
1128
+ for (chunk ,) in r .stream ():
1129
+ self .assertEqual (chunk .device , torch .device ("cuda:0" ))
1130
+ self .assertEqual (chunk .dtype , torch .int16 )
1131
+ self .assertEqual (chunk .shape , torch .Size ([10 , 3 , 144 , 256 ]))
1132
+ num_frames += chunk .size (0 )
1133
+ assert num_frames == 300
1134
+
1135
+
1136
+ @skipIfNoHWAccel ("h264_cuvid" )
1137
+ class FilterGraphWithCudaAccel (TorchaudioTestCase ):
1138
+ def test_sclae_cuda_change_size (self ):
1139
+ """scale_cuda filter can be used when HW accel is on"""
1140
+ src = get_asset_path ("nasa_13013.mp4" )
1141
+ r = StreamReader (src )
1142
+ r .add_video_stream (10 , decoder = "h264_cuvid" , hw_accel = "cuda" , filter_desc = "scale_cuda=iw/2:ih/2" )
1143
+ num_frames = 0
1144
+ for (chunk ,) in r .stream ():
1145
+ self .assertEqual (chunk .device , torch .device ("cuda:0" ))
1146
+ self .assertEqual (chunk .dtype , torch .uint8 )
1147
+ self .assertEqual (chunk .shape , torch .Size ([10 , 3 , 135 , 240 ]))
1148
+ num_frames += chunk .size (0 )
1149
+ assert num_frames == 390
1150
+
1151
+ def test_scale_cuda_format (self ):
1152
+ """yuv444p format conversion does not work (yet)"""
1153
+ src = get_asset_path ("nasa_13013.mp4" )
1154
+ r = StreamReader (src )
1155
+ with self .assertRaises (RuntimeError ):
1156
+ r .add_video_stream (10 , decoder = "h264_cuvid" , hw_accel = "cuda" , filter_desc = "scale_cuda=format=yuv444p" )
0 commit comments