@@ -7,7 +7,6 @@ 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-
1110 alias ExWebRTC.MediaStreamTrack
1211 alias __MODULE__ . S3
1312
@@ -121,11 +120,12 @@ defmodule ExWebRTC.Recorder do
121120 recorder ( ) ,
122121 MediaStreamTrack . id ( ) ,
123122 MediaStreamTrack . rid ( ) | nil ,
123+ ExWebRTC.RTPCodecParameters . t ( ) | nil ,
124124 ExRTP.Packet . t ( )
125125 ) :: :ok
126- def record ( recorder , track_id , rid , % ExRTP.Packet { } = packet ) do
126+ def record ( recorder , track_id , rid , codec , % ExRTP.Packet { } = packet ) do
127127 recv_time = System . monotonic_time ( :millisecond )
128- GenServer . cast ( recorder , { :record , track_id , rid , recv_time , packet } )
128+ GenServer . cast ( recorder , { :record , track_id , rid , codec , recv_time , packet } )
129129 end
130130
131131 @ doc """
@@ -220,10 +220,12 @@ defmodule ExWebRTC.Recorder do
220220 end
221221
222222 @ impl true
223- def handle_cast ( { :record , track_id , rid , recv_time , packet } , state )
223+ def handle_cast ( { :record , track_id , rid , codec , recv_time , packet } , state )
224224 when is_map_key ( state . track_data , track_id ) do
225225 % { file: file , rid_map: rid_map } = state . track_data [ track_id ]
226226
227+ state = if codec , do: update_codec ( state , track_id , codec ) , else: state
228+
227229 with { :ok , rid_idx } <- Map . fetch ( rid_map , rid ) ,
228230 false <- is_nil ( file ) do
229231 :ok = IO . binwrite ( file , serialize_packet ( packet , rid_idx , recv_time ) )
@@ -243,7 +245,7 @@ defmodule ExWebRTC.Recorder do
243245 end
244246
245247 @ impl true
246- def handle_cast ( { :record , track_id , _rid , _recv_time , _packet } , state ) do
248+ def handle_cast ( { :record , track_id , _rid , _codec , _recv_time , _packet } , state ) do
247249 Logger . warning ( """
248250 Tried to save packet for unknown track id. Ignoring. Track id: #{ inspect ( track_id ) } .\
249251 """ )
@@ -290,6 +292,7 @@ defmodule ExWebRTC.Recorder do
290292 start_time: start_time ,
291293 kind: track . kind ,
292294 streams: track . streams ,
295+ codec: nil ,
293296 rid_map: ( track . rids || [ nil ] ) |> Enum . with_index ( ) |> Map . new ( ) ,
294297 location: file_path ,
295298 file: File . open! ( file_path , [ :write ] )
@@ -302,7 +305,7 @@ defmodule ExWebRTC.Recorder do
302305
303306 state = % { state | track_data: Map . merge ( state . track_data , new_track_data ) }
304307
305- :ok = File . write! ( state . manifest_path , state . track_data |> to_manifest ( ) |> Jason . encode! ( ) )
308+ :ok = write_manifest ( state )
306309
307310 { manifest_diff , state }
308311 end
@@ -342,6 +345,20 @@ defmodule ExWebRTC.Recorder do
342345 end )
343346 end
344347
348+ defp update_codec ( state , track_id , codec ) do
349+ case get_in ( state , [ :track_data , track_id , :codec ] ) do
350+ nil ->
351+ state = put_in ( state , [ :track_data , track_id , :codec ] , codec )
352+
353+ :ok = write_manifest ( state )
354+ Logger . info ( "Updated manifest with codec info for track #{ track_id } " )
355+ state
356+
357+ _ ->
358+ state
359+ end
360+ end
361+
345362 defp serialize_packet ( packet , rid_idx , recv_time ) do
346363 packet = ExRTP.Packet . encode ( packet )
347364 packet_size = byte_size ( packet )
@@ -355,4 +372,14 @@ defmodule ExWebRTC.Recorder do
355372 :io_lib . format ( "~4..0w~2..0w~2..0w-~2..0w~2..0w~2..0w" , [ y , mo , d , h , m , s ] )
356373 |> to_string ( )
357374 end
375+
376+ defp write_manifest ( state ) do
377+ File . write! (
378+ state . manifest_path ,
379+ state . track_data
380+ |> to_manifest ( )
381+ |> ExWebRTC.Recorder.Manifest . to_json! ( )
382+ |> Jason . encode! ( )
383+ )
384+ end
358385end
0 commit comments