@@ -5,6 +5,7 @@ defmodule ExSDP.Attribute.FMTP do
5
5
Parameters for:
6
6
7
7
* H264 (not all, RFC 6184),
8
+ * H265 (not all, RFC 7798)
8
9
* VP8, VP9, OPUS (RFC 7587)
9
10
* RTX (RFC 4588)
10
11
* FLEXFEC (RFC 8627)
@@ -30,6 +31,15 @@ defmodule ExSDP.Attribute.FMTP do
30
31
:max_dpb ,
31
32
:max_br ,
32
33
:sprop_parameter_sets ,
34
+ # H265
35
+ :profile_space ,
36
+ :profile_id ,
37
+ :tier_flag ,
38
+ :level_id ,
39
+ :interop_constraints ,
40
+ :sprop_vps ,
41
+ :sprop_sps ,
42
+ :sprop_pps ,
33
43
# OPUS
34
44
:maxaveragebitrate ,
35
45
:maxplaybackrate ,
@@ -42,7 +52,6 @@ defmodule ExSDP.Attribute.FMTP do
42
52
:useinbandfec ,
43
53
:usedtx ,
44
54
# VP8/9
45
- :profile_id ,
46
55
:max_fr ,
47
56
# RTX
48
57
:apt ,
@@ -66,6 +75,15 @@ defmodule ExSDP.Attribute.FMTP do
66
75
level_asymmetry_allowed: boolean ( ) | nil ,
67
76
packetization_mode: non_neg_integer ( ) | nil ,
68
77
sprop_parameter_sets: % { sps: binary ( ) , pps: binary ( ) } | nil ,
78
+ # H265
79
+ profile_space: non_neg_integer ( ) | nil ,
80
+ profile_id: non_neg_integer ( ) | nil ,
81
+ tier_flag: non_neg_integer ( ) | nil ,
82
+ level_id: non_neg_integer ( ) | nil ,
83
+ interop_constraints: non_neg_integer ( ) | nil ,
84
+ sprop_vps: [ binary ( ) ] | nil ,
85
+ sprop_sps: [ binary ( ) ] | nil ,
86
+ sprop_pps: [ binary ( ) ] | nil ,
69
87
# OPUS
70
88
maxaveragebitrate: non_neg_integer ( ) | nil ,
71
89
maxplaybackrate: non_neg_integer ( ) | nil ,
@@ -78,7 +96,6 @@ defmodule ExSDP.Attribute.FMTP do
78
96
useinbandfec: boolean ( ) | nil ,
79
97
usedtx: boolean ( ) | nil ,
80
98
# VP8/9
81
- profile_id: non_neg_integer ( ) | nil ,
82
99
max_fr: non_neg_integer ( ) | nil ,
83
100
# RTX
84
101
apt: RTPMapping . payload_type_t ( ) | nil ,
@@ -103,6 +120,7 @@ defmodule ExSDP.Attribute.FMTP do
103
120
"""
104
121
@ type reason ::
105
122
:invalid_fmtp
123
+ | :invalid_ps
106
124
| :invalid_pt
107
125
| :invalid_sprop_parameter_sets
108
126
| :string_nan
@@ -153,6 +171,46 @@ defmodule ExSDP.Attribute.FMTP do
153
171
do: { rest , % { fmtp | sprop_parameter_sets: value } }
154
172
end
155
173
174
+ defp parse_param ( [ "profile-space=" <> profile_space | rest ] , fmtp ) do
175
+ with { :ok , value } <- Utils . parse_numeric_string ( profile_space ) ,
176
+ do: { rest , % { fmtp | profile_space: value } }
177
+ end
178
+
179
+ defp parse_param ( [ "profile-id=" <> profile_id | rest ] , fmtp ) do
180
+ with { :ok , value } <- Utils . parse_numeric_string ( profile_id ) ,
181
+ do: { rest , % { fmtp | profile_id: value } }
182
+ end
183
+
184
+ defp parse_param ( [ "tier-flag=" <> tier_flag | rest ] , fmtp ) do
185
+ with { :ok , value } <- Utils . parse_numeric_bool_string ( tier_flag ) ,
186
+ do: { rest , % { fmtp | tier_flag: value } }
187
+ end
188
+
189
+ defp parse_param ( [ "level-id=" <> level_id | rest ] , fmtp ) do
190
+ with { :ok , value } <- Utils . parse_numeric_string ( level_id ) ,
191
+ do: { rest , % { fmtp | level_id: value } }
192
+ end
193
+
194
+ defp parse_param ( [ "interop-constraints=" <> interop_constraints | rest ] , fmtp ) do
195
+ with { :ok , value } <- Utils . parse_numeric_hex_string ( interop_constraints ) ,
196
+ do: { rest , % { fmtp | interop_constraints: value } }
197
+ end
198
+
199
+ defp parse_param ( [ "sprop-vps=" <> vps | rest ] , fmtp ) do
200
+ with { :ok , value } <- Utils . parse_sprop_ps ( vps ) ,
201
+ do: { rest , % { fmtp | sprop_vps: value } }
202
+ end
203
+
204
+ defp parse_param ( [ "sprop-sps=" <> sps | rest ] , fmtp ) do
205
+ with { :ok , value } <- Utils . parse_sprop_ps ( sps ) ,
206
+ do: { rest , % { fmtp | sprop_sps: value } }
207
+ end
208
+
209
+ defp parse_param ( [ "sprop-pps=" <> pps | rest ] , fmtp ) do
210
+ with { :ok , value } <- Utils . parse_sprop_ps ( pps ) ,
211
+ do: { rest , % { fmtp | sprop_pps: value } }
212
+ end
213
+
156
214
defp parse_param ( [ "max-mbps=" <> max_mbps | rest ] , fmtp ) do
157
215
with { :ok , value } <- Utils . parse_numeric_string ( max_mbps ) ,
158
216
do: { rest , % { fmtp | max_mbps: value } }
@@ -231,11 +289,6 @@ defmodule ExSDP.Attribute.FMTP do
231
289
do: { rest , % { fmtp | max_fr: value } }
232
290
end
233
291
234
- defp parse_param ( [ "profile-id=" <> profile_id | rest ] , fmtp ) do
235
- with { :ok , value } <- Utils . parse_numeric_string ( profile_id ) ,
236
- do: { rest , % { fmtp | profile_id: value } }
237
- end
238
-
239
292
defp parse_param ( [ "apt=" <> value | rest ] , fmtp ) do
240
293
with { :ok , value } <- Utils . parse_payload_type ( value ) , do: { rest , % { fmtp | apt: value } }
241
294
end
@@ -319,6 +372,15 @@ defimpl String.Chars, for: ExSDP.Attribute.FMTP do
319
372
Serializer . maybe_serialize ( "level-asymmetry-allowed" , fmtp . level_asymmetry_allowed ) ,
320
373
Serializer . maybe_serialize ( "packetization-mode" , fmtp . packetization_mode ) ,
321
374
Serializer . maybe_serialize ( "sprop-parameter-sets" , fmtp . sprop_parameter_sets ) ,
375
+ # H265
376
+ Serializer . maybe_serialize ( "profile-space" , fmtp . profile_space ) ,
377
+ Serializer . maybe_serialize ( "profile-id" , fmtp . profile_id ) ,
378
+ Serializer . maybe_serialize ( "tier-flag" , fmtp . tier_flag ) ,
379
+ Serializer . maybe_serialize ( "level-id" , fmtp . level_id ) ,
380
+ Serializer . maybe_serialize_hex ( "interop-constraints" , fmtp . interop_constraints ) ,
381
+ Serializer . maybe_serialize_base64 ( "sprop-vps" , fmtp . sprop_vps ) ,
382
+ Serializer . maybe_serialize_base64 ( "sprop-sps" , fmtp . sprop_sps ) ,
383
+ Serializer . maybe_serialize_base64 ( "sprop-pps" , fmtp . sprop_pps ) ,
322
384
# OPUS
323
385
Serializer . maybe_serialize ( "maxaveragebitrate" , fmtp . maxaveragebitrate ) ,
324
386
Serializer . maybe_serialize ( "maxplaybackrate" , fmtp . maxplaybackrate ) ,
@@ -331,7 +393,6 @@ defimpl String.Chars, for: ExSDP.Attribute.FMTP do
331
393
Serializer . maybe_serialize ( "useinbandfec" , fmtp . useinbandfec ) ,
332
394
Serializer . maybe_serialize ( "usedtx" , fmtp . usedtx ) ,
333
395
# VP8/9
334
- Serializer . maybe_serialize ( "profile-id" , fmtp . profile_id ) ,
335
396
Serializer . maybe_serialize ( "max-fr" , fmtp . max_fr ) ,
336
397
# RTX
337
398
Serializer . maybe_serialize ( "apt" , fmtp . apt ) ,
0 commit comments