Skip to content

Commit 25cba57

Browse files
committed
add codec info to manifest
1 parent a01510e commit 25cba57

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

lib/ex_webrtc_recorder.ex

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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)

lib/ex_webrtc_recorder/manifest.ex

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ defmodule ExWebRTC.Recorder.Manifest do
2020
kind: :video | :audio,
2121
streams: [MediaStreamTrack.stream_id()],
2222
rid_map: %{MediaStreamTrack.rid() => integer()},
23+
codec: ExWebRTC.RTPCodecParameters.t() | nil,
2324
location: location()
2425
}
2526

@@ -38,14 +39,16 @@ defmodule ExWebRTC.Recorder.Manifest do
3839
"kind" => kind,
3940
"streams" => streams,
4041
"rid_map" => rid_map,
42+
"codec" => codec,
4143
"location" => location
4244
}) do
4345
%{
4446
streams: streams,
4547
location: location,
4648
start_time: parse_start_time(start_time),
4749
rid_map: parse_rid_map(rid_map),
48-
kind: parse_kind(kind)
50+
kind: parse_kind(kind),
51+
codec: codec
4952
}
5053
end
5154

0 commit comments

Comments
 (0)