Skip to content

Commit 2d0df2b

Browse files
committed
serialize, deserialize
1 parent 25cba57 commit 2d0df2b

File tree

2 files changed

+91
-10
lines changed

2 files changed

+91
-10
lines changed

lib/ex_webrtc_recorder.ex

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +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-
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)
14-
1510
alias ExWebRTC.MediaStreamTrack
1611
alias __MODULE__.S3
1712

@@ -310,7 +305,7 @@ defmodule ExWebRTC.Recorder do
310305

311306
state = %{state | track_data: Map.merge(state.track_data, new_track_data)}
312307

313-
:ok = File.write!(state.manifest_path, state.track_data |> to_manifest() |> Jason.encode!())
308+
:ok = File.write!(state.manifest_path, state.track_data |> to_manifest() |> ExWebRTC.Recorder.Manifest.to_map() |> Jason.encode!())
314309

315310
{manifest_diff, state}
316311
end
@@ -352,10 +347,9 @@ defmodule ExWebRTC.Recorder do
352347

353348
defp update_codec(state, track_id, codec) do
354349
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))
350+
updated_track_data = put_in(state.track_data , [track_id, :codec], codec)
357351
state = %{state | track_data: updated_track_data}
358-
:ok = File.write!(state.manifest_path, state.track_data |> to_manifest |> Jason.encode!())
352+
:ok = File.write!(state.manifest_path, state.track_data |> to_manifest |> ExWebRTC.Recorder.Manifest.to_map() |> Jason.encode!())
359353
Logger.info("Updated manifest with codec info for track #{track_id}")
360354
state
361355

lib/ex_webrtc_recorder/manifest.ex

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,57 @@ defmodule ExWebRTC.Recorder.Manifest do
2626

2727
@type t :: %{MediaStreamTrack.id() => track_manifest()}
2828

29+
@doc false
30+
@spec to_map(t()) :: map()
31+
def to_map(manifest) do
32+
Map.new(manifest, fn {id, entry} ->
33+
{
34+
id,
35+
%{
36+
"start_time" => DateTime.to_iso8601(entry.start_time),
37+
"kind" => Atom.to_string(entry.kind),
38+
"streams" => entry.streams,
39+
"rid_map" => encode_rid_map(entry.rid_map),
40+
"codec" => encode_codec(entry.codec),
41+
"location" => entry.location
42+
}
43+
}
44+
end)
45+
end
46+
47+
defp encode_rid_map(rid_map) do
48+
Map.new(rid_map, fn
49+
{nil, v} -> {"nil", v}
50+
{layer, v} -> {layer, v}
51+
end)
52+
end
53+
54+
defp encode_codec(nil), do: nil
55+
56+
defp encode_codec(%ExWebRTC.RTPCodecParameters{} = codec) do
57+
%{
58+
"payload_type" => codec.payload_type,
59+
"mime_type" => codec.mime_type,
60+
"clock_rate" => codec.clock_rate,
61+
"channels" => codec.channels,
62+
"sdp_fmtp_line" => fmtp_to_string(codec.sdp_fmtp_line),
63+
"rtcp_fbs" => rtcp_fbs_to_strings(codec.rtcp_fbs)
64+
}
65+
end
66+
67+
defp fmtp_to_string([]), do: nil
68+
defp fmtp_to_string(nil), do: nil
69+
defp fmtp_to_string(fmtp), do: fmtp |> to_string() |> String.replace_prefix("fmtp:", "")
70+
71+
defp rtcp_fbs_to_strings(nil), do: nil
72+
defp rtcp_fbs_to_strings([]), do: nil
73+
74+
defp rtcp_fbs_to_strings(list) when is_list(list) do
75+
list
76+
|> Enum.map(&to_string/1)
77+
|> Enum.map(&String.replace_prefix(&1, "rtcp-fb:", ""))
78+
end
79+
2980
@doc false
3081
@spec from_json!(map()) :: t()
3182
def from_json!(json_manifest) do
@@ -48,7 +99,7 @@ defmodule ExWebRTC.Recorder.Manifest do
4899
start_time: parse_start_time(start_time),
49100
rid_map: parse_rid_map(rid_map),
50101
kind: parse_kind(kind),
51-
codec: codec
102+
codec: parse_codec(codec)
52103
}
53104
end
54105

@@ -66,4 +117,40 @@ defmodule ExWebRTC.Recorder.Manifest do
66117

67118
defp parse_kind("video"), do: :video
68119
defp parse_kind("audio"), do: :audio
120+
121+
defp parse_codec(%{
122+
"payload_type" => payload_type,
123+
"mime_type" => mime_type,
124+
"clock_rate" => clock_rate,
125+
"channels" => channels,
126+
"sdp_fmtp_line" => sdp_fmtp_line,
127+
"rtcp_fbs" => rtcp_fbs
128+
}) do
129+
%ExWebRTC.RTPCodecParameters{
130+
payload_type: payload_type,
131+
mime_type: mime_type,
132+
clock_rate: clock_rate,
133+
channels: channels,
134+
sdp_fmtp_line: parse_sdp_fmtp_line(sdp_fmtp_line),
135+
rtcp_fbs: parse_rtcp_fbs(rtcp_fbs)
136+
}
137+
end
138+
139+
defp parse_codec(nil), do: nil
140+
141+
defp parse_sdp_fmtp_line(sdp_fmtp_line) when is_binary(sdp_fmtp_line) do
142+
{:ok, fmtp} = ExSDP.Attribute.FMTP.parse(sdp_fmtp_line)
143+
fmtp
144+
end
145+
146+
defp parse_sdp_fmtp_line(nil), do: []
147+
148+
defp parse_rtcp_fbs(rtcp_fbs) when is_list(rtcp_fbs) do
149+
Enum.map(rtcp_fbs, fn fb ->
150+
{:ok, rtcp_fb} = ExSDP.Attribute.RTCPFeedback.parse(fb)
151+
rtcp_fb
152+
end)
153+
end
154+
155+
defp parse_rtcp_fbs(nil), do: []
69156
end

0 commit comments

Comments
 (0)