@@ -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: [ ]
69156end
0 commit comments