@@ -7,6 +7,10 @@ defmodule ExWebRTC.Recorder do
77 Can optionally upload the saved files to S3-compatible storage.
88 See `ExWebRTC.Recorder.S3` and `t:options/0` for more info.
99 """
10+ require Protocol
11+ Protocol . derive ( Jason.Encoder , ExWebRTC.RTPCodecParameters )
12+ Protocol . derive ( Jason.Encoder , ExSDP.Attribute.FMTP )
13+ Protocol . derive ( Jason.Encoder , ExSDP.Attribute.RTCPFeedback )
1014
1115 alias ExWebRTC.MediaStreamTrack
1216 alias __MODULE__ . S3
@@ -121,11 +125,12 @@ defmodule ExWebRTC.Recorder do
121125 recorder ( ) ,
122126 MediaStreamTrack . id ( ) ,
123127 MediaStreamTrack . rid ( ) | nil ,
128+ ExWebRTC.RTPCodecParameters . t ( ) | nil ,
124129 ExRTP.Packet . t ( )
125130 ) :: :ok
126- def record ( recorder , track_id , rid , % ExRTP.Packet { } = packet ) do
131+ def record ( recorder , track_id , rid , codec , % ExRTP.Packet { } = packet ) do
127132 recv_time = System . monotonic_time ( :millisecond )
128- GenServer . cast ( recorder , { :record , track_id , rid , recv_time , packet } )
133+ GenServer . cast ( recorder , { :record , track_id , rid , codec , recv_time , packet } )
129134 end
130135
131136 @ doc """
@@ -220,10 +225,12 @@ defmodule ExWebRTC.Recorder do
220225 end
221226
222227 @ impl true
223- def handle_cast ( { :record , track_id , rid , recv_time , packet } , state )
228+ def handle_cast ( { :record , track_id , rid , codec , recv_time , packet } , state )
224229 when is_map_key ( state . track_data , track_id ) do
225230 % { file: file , rid_map: rid_map } = state . track_data [ track_id ]
226231
232+ state = if codec , do: update_codec ( state , track_id , codec ) , else: state
233+
227234 with { :ok , rid_idx } <- Map . fetch ( rid_map , rid ) ,
228235 false <- is_nil ( file ) do
229236 :ok = IO . binwrite ( file , serialize_packet ( packet , rid_idx , recv_time ) )
@@ -243,7 +250,7 @@ defmodule ExWebRTC.Recorder do
243250 end
244251
245252 @ impl true
246- def handle_cast ( { :record , track_id , _rid , _recv_time , _packet } , state ) do
253+ def handle_cast ( { :record , track_id , _rid , _codec , _recv_time , _packet } , state ) do
247254 Logger . warning ( """
248255 Tried to save packet for unknown track id. Ignoring. Track id: #{ inspect ( track_id ) } .\
249256 """ )
@@ -290,6 +297,7 @@ defmodule ExWebRTC.Recorder do
290297 start_time: start_time ,
291298 kind: track . kind ,
292299 streams: track . streams ,
300+ codec: nil ,
293301 rid_map: ( track . rids || [ nil ] ) |> Enum . with_index ( ) |> Map . new ( ) ,
294302 location: file_path ,
295303 file: File . open! ( file_path , [ :write ] )
@@ -342,6 +350,20 @@ defmodule ExWebRTC.Recorder do
342350 end )
343351 end
344352
353+ defp update_codec ( state , track_id , codec ) do
354+ case get_in ( state , [ :track_data , track_id , :codec ] ) do
355+ nil ->
356+ updated_track_data = Map . update! ( state . track_data , track_id , & Map . put ( & 1 , :codec , codec ) )
357+ state = % { state | track_data: updated_track_data }
358+ :ok = File . write! ( state . manifest_path , state . track_data |> to_manifest |> Jason . encode! ( ) )
359+ Logger . info ( "Updated manifest with codec info for track #{ track_id } " )
360+ state
361+
362+ _ ->
363+ state
364+ end
365+ end
366+
345367 defp serialize_packet ( packet , rid_idx , recv_time ) do
346368 packet = ExRTP.Packet . encode ( packet )
347369 packet_size = byte_size ( packet )
0 commit comments