11import fractions
2+ from typing import Optional
23
34from aiortc .codecs import depayload , get_decoder , get_encoder
45from aiortc .jitterbuffer import JitterFrame
@@ -20,7 +21,7 @@ def assertAudioFrame(
2021 pts : int ,
2122 samples : int ,
2223 sample_rate : int ,
23- data : bytes ,
24+ data : Optional [ bytes ] ,
2425 ) -> None :
2526 assert isinstance (frame , AudioFrame )
2627 self .assertEqual (frame .format .name , "s16" )
@@ -30,8 +31,9 @@ def assertAudioFrame(
3031 self .assertEqual (frame .sample_rate , sample_rate )
3132 self .assertEqual (frame .time_base , fractions .Fraction (1 , sample_rate ))
3233
33- plane_data = bytes (frame .planes [0 ])
34- self .assertEqual (plane_data [: len (data )], data )
34+ if data is not None :
35+ plane_data = bytes (frame .planes [0 ])
36+ self .assertEqual (plane_data [: len (data )], data )
3537
3638 def create_audio_frame (
3739 self , samples : int , pts : int , layout : str = "mono" , sample_rate : int = 48000
@@ -115,10 +117,8 @@ def create_video_frames(
115117 def roundtrip_audio (
116118 self ,
117119 codec : RTCRtpCodecParameters ,
118- output_layout : str ,
119- output_sample_rate : int ,
120- input_layout : str = "mono" ,
121- input_sample_rate : int = 8000 ,
120+ layout : str ,
121+ sample_rate : int ,
122122 drop : list [int ] = [],
123123 ) -> None :
124124 """
@@ -127,15 +127,16 @@ def roundtrip_audio(
127127 encoder = get_encoder (codec )
128128 decoder = get_decoder (codec )
129129
130+ samples = int (sample_rate * AUDIO_PTIME )
131+ time_base = fractions .Fraction (1 , sample_rate )
132+
130133 input_frames = self .create_audio_frames (
131- layout = input_layout , sample_rate = input_sample_rate , count = 10
134+ layout = layout , sample_rate = sample_rate , count = 10
132135 )
133-
134- output_sample_count = int (output_sample_rate * AUDIO_PTIME )
135-
136136 for i , frame in enumerate (input_frames ):
137137 # encode
138138 packages , timestamp = encoder .encode (frame )
139+ self .assertEqual (timestamp , i * codec .clockRate * AUDIO_PTIME )
139140
140141 if i not in drop :
141142 # depacketize
@@ -148,13 +149,11 @@ def roundtrip_audio(
148149 self .assertEqual (len (frames ), 1 )
149150 assert isinstance (frames [0 ], AudioFrame )
150151 self .assertEqual (frames [0 ].format .name , "s16" )
151- self .assertEqual (frames [0 ].layout .name , output_layout )
152- self .assertEqual (frames [0 ].samples , output_sample_rate * AUDIO_PTIME )
153- self .assertEqual (frames [0 ].sample_rate , output_sample_rate )
154- self .assertEqual (frames [0 ].pts , i * output_sample_count )
155- self .assertEqual (
156- frames [0 ].time_base , fractions .Fraction (1 , output_sample_rate )
157- )
152+ self .assertEqual (frames [0 ].layout .name , layout )
153+ self .assertEqual (frames [0 ].samples , samples )
154+ self .assertEqual (frames [0 ].sample_rate , sample_rate )
155+ self .assertEqual (frames [0 ].pts , i * samples )
156+ self .assertEqual (frames [0 ].time_base , time_base )
158157
159158 def roundtrip_video (
160159 self ,
0 commit comments