1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "sdp_os_defs.h"
7 #include "sdp_private.h"
11 static const char* logTag
= "sdp_attr_access";
13 /* Attribute access routines are all defined by the following parameters.
15 * sdp_p The SDP handle returned by sdp_init_description.
16 * level The level the attribute is defined. Can be either
17 * SDP_SESSION_LEVEL or 0-n specifying a media line level.
18 * inst_num The instance number of the attribute. Multiple instances
19 * of a particular attribute may exist at each level and so
20 * the inst_num determines the particular attribute at that
21 * level that should be accessed. Note that this is the
22 * instance number of the specified type of attribute, not the
23 * overall attribute number at the level. Also note that the
24 * instance number is 1-based. For example:
26 * o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4
30 * m=audio 1234 RTP/AVP 0 101 102
33 * a=bar 1 # This is instance 1 of attribute bar.
34 * a=foo 3 # This is instance 3 of attribute foo.
35 * cap_num Almost all of the attributes may be defined as X-cpar
36 * parameters (with the exception of X-sqn, X-cap, and X-cpar).
37 * If the cap_num is set to zero, then the attribute is not
38 * an X-cpar parameter attribute. If the cap_num is any other
39 * value, it specifies the capability number that the X-cpar
40 * attribute is specified for.
43 /* Attribute handling:
45 * There are two basic types of attributes handled by the SDP library,
46 * those defined by a= token lines, and those embedded with a=X-cpar lines.
47 * The handling for each of these is described here.
49 * Simple (non X-cpar attributes):
51 * Attributes not embedded in a=X-cpar lines are referenced by level and
52 * instance number. For these attributes the capability number is always
55 * An application will typically process these attributes in one of two ways.
56 * With the first method, the application can determine the total number
57 * of attributes defined at a given level and process them one at a time.
58 * For each attribute, the application will query the library to find out
59 * what type of attribute it is and which instance within that type. The
60 * application can then process this particular attribute referencing it
61 * by level and instance number.
63 * A second method of processing attributes is for applications to determine
64 * each type of attribute they are interested in, query the SDP library to
65 * find out how many of that type of attribute exist at a given level, and
66 * process each one at a time.
68 * X-cpar attribute processing:
70 * X-cpar attributes can contain embedded attributes. They are associated
71 * with X-cap attribute lines. An example of X-cap and X-cpar attributes
72 * found in an SDP is as follows:
75 * o=- 25678 753849 IN IP4 128.96.41.1
79 * m=audio 3456 RTP/AVP 18 96
80 * a=rtpmap:96 telephone-event/8000
81 * a=fmtp:96 0-15,32-35
83 * a=X-cap: 1 audio RTP/AVP 0 18 96 97
84 * a=X-cpar: a=fmtp:96 0-16,32-35
85 * a=X-cpar: a=rtpmap:97 X-NSE/8000
86 * a=X-cpar: a=fmtp:97 195-197
87 * a=X-cap: 5 image udptl t38
88 * a=X-cap: 6 application udp X-tmr
89 * a=X-cap: 7 audio RTP/AVP 100 101
90 * a=X-cpar: a=rtpmap:100 g.711/8000
91 * a=X-cpar: a=rtpmap:101 g.729/8000
93 * X-cap attributes can be defined at the SESSION_LEVEL or any media level.
94 * An X-cap attr is defined by the level and instance number just like
95 * other attributes. In the example above, X-cap attrs are defined at
96 * media level 1 and there are four instances at that level.
98 * The X-cpar attributes can also be referenced by level and instance number.
99 * However, the embedded attribute within an X-cpar attribute must be
100 * referenced by level, instance number, and capability number. This is
101 * because the X-cpar attribute is associated with a particular X-cap/
103 * For all attributes that are not embedded within an X-cpar attribute, the
104 * cap_num should be referenced as zero. But for X-cpar attributes, the
105 * cap_num is specified to be one of the capability numbers of the previous
106 * X-cap line. The number of capabilities specified in an X-cap line is
107 * equal to the number of payloads. Thus, in this example, the first X-cap
108 * attr instance specifies capabilities 1-4, the second specifies capability
109 * 5, the third capability 6, and the fourth capabilities 7-8.
111 * X-cpar attributes can be processed with methods similar to the two
112 * previously mentioned. For each X-cap attribute, the application can
113 * use one of two methods to process the X-cpar attributes. First, it
114 * can query the total number of X-cpar attributes associated with a
115 * given X-cap attribute. The X-cap attribute is here defined by a level
116 * and a capability number. In the example above, the total number of
117 * attributes defined is as follows:
118 * level 1, cap_num 1 - total attrs: 3
119 * level 1, cap_num 5 - total attrs: 0
120 * level 1, cap_num 6 - total attrs: 0
121 * level 1, cap_num 7 - total attrs: 2
123 * Note that if the application queried the number of attributes for
124 * cap_num 2, 3, or 4, it would also return 3 attrs, and for cap_num
125 * 8 the library would return 2.
127 * Once the application determines the total number of attributes for
128 * that capability, it can again query the embedded attribute type and
129 * instance. For example, sdp_get_attr_type would return the following:
130 * level 1, cap_num 1, attr 1 -> attr type fmtp, instance 1
131 * level 1, cap_num 1, attr 2 -> attr type rtpmap, instance 1
132 * level 1, cap_num 1, attr 3 -> attr type fmtp, instance 2
133 * level 1, cap_num 7, attr 1 -> attr type rtpmap, instance 1
134 * level 1, cap_num 7, attr 2 -> attr type rtpmap, instance 2
136 * The individual embedded attributes can then be accessed by level,
137 * cap_num, and instance number.
139 * With the second method for handling X-cpar attributes, the application
140 * determines the types of attributes it is interested in. It can then
141 * query the SDP library to determine the number of attributes of that
142 * type found for that level and cap_num, and then process each one at
143 * a time. e.g., calling sdp_attr_num_instances would give:
144 * level 1, cap_num 1, attr_type fmtp -> two instances
145 * level 1, cap_num 1, attr_type rtpmap -> one instance
146 * level 1, cap_num 7, attr_type fmtp -> zero instances
147 * level 1, cap_num 7, attr_type rtpmap -> two instances
151 /* Function: sdp_add_new_attr
152 * Description: Add a new attribute of the specified type at the given
153 * level and capability level or base attribute if cap_num
155 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
156 * level The level to check for the attribute.
157 * cap_num The capability number associated with the
158 * attribute if any. If none, should be zero.
159 * attr_type The type of attribute to add.
160 * inst_num Pointer to a uint16_t in which to return the instance
161 * number of the newly added attribute.
162 * Returns: SDP_SUCCESS Attribute was added successfully.
163 * SDP_NO_RESOURCE No memory avail for new attribute.
164 * SDP_INVALID_PARAMETER Specified media line is not defined.
166 sdp_result_e
sdp_add_new_attr (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
167 sdp_attr_e attr_type
, uint16_t *inst_num
)
173 sdp_attr_t
*new_attr_p
;
174 sdp_attr_t
*prev_attr_p
=NULL
;
176 sdp_comediadir_t
*comediadir_p
;
180 if ((cap_num
!= 0) &&
181 ((attr_type
== SDP_ATTR_X_CAP
) || (attr_type
== SDP_ATTR_X_CPAR
) ||
182 (attr_type
== SDP_ATTR_X_SQN
) || (attr_type
== SDP_ATTR_CDSC
) ||
183 (attr_type
== SDP_ATTR_CPAR
) || (attr_type
== SDP_ATTR_SQN
))) {
184 if (sdp_p
->debug_flag
[SDP_DEBUG_WARNINGS
]) {
185 SDPLogDebug(logTag
, "%s Warning: Invalid attribute type for X-cpar/cdsc "
186 "parameter.", sdp_p
->debug_str
);
188 sdp_p
->conf_p
->num_invalid_param
++;
189 return (SDP_INVALID_PARAMETER
);
192 /* Some attributes are valid only under media level */
193 if (level
== SDP_SESSION_LEVEL
) {
197 return (SDP_INVALID_MEDIA_LEVEL
);
204 new_attr_p
= (sdp_attr_t
*)SDP_MALLOC(sizeof(sdp_attr_t
));
205 if (new_attr_p
== NULL
) {
206 sdp_p
->conf_p
->num_no_resource
++;
207 return (SDP_NO_RESOURCE
);
210 new_attr_p
->type
= attr_type
;
211 new_attr_p
->next_p
= NULL
;
213 /* Initialize the new attribute structure */
214 if ((new_attr_p
->type
== SDP_ATTR_X_CAP
) ||
215 (new_attr_p
->type
== SDP_ATTR_CDSC
)) {
216 new_attr_p
->attr
.cap_p
= (sdp_mca_t
*)SDP_MALLOC(sizeof(sdp_mca_t
));
217 if (new_attr_p
->attr
.cap_p
== NULL
) {
218 sdp_free_attr(new_attr_p
);
219 sdp_p
->conf_p
->num_no_resource
++;
220 return (SDP_NO_RESOURCE
);
222 } else if (new_attr_p
->type
== SDP_ATTR_FMTP
) {
223 fmtp_p
= &(new_attr_p
->attr
.fmtp
);
224 fmtp_p
->fmtp_format
= SDP_FMTP_UNKNOWN_TYPE
;
225 // set to invalid value
226 fmtp_p
->packetization_mode
= SDP_INVALID_PACKETIZATION_MODE_VALUE
;
227 fmtp_p
->level_asymmetry_allowed
= SDP_INVALID_LEVEL_ASYMMETRY_ALLOWED_VALUE
;
228 fmtp_p
->annexb_required
= FALSE
;
229 fmtp_p
->annexa_required
= FALSE
;
234 fmtp_p
->profile
= SDP_INVALID_VALUE
;
235 fmtp_p
->level
= SDP_INVALID_VALUE
;
236 fmtp_p
->parameter_add
= SDP_FMTP_UNUSED
;
237 fmtp_p
->usedtx
= SDP_FMTP_UNUSED
;
238 fmtp_p
->stereo
= SDP_FMTP_UNUSED
;
239 fmtp_p
->useinbandfec
= SDP_FMTP_UNUSED
;
240 fmtp_p
->cbr
= SDP_FMTP_UNUSED
;
241 for (i
=0; i
< SDP_NE_NUM_BMAP_WORDS
; i
++) {
244 } else if ((new_attr_p
->type
== SDP_ATTR_RTPMAP
) ||
245 (new_attr_p
->type
== SDP_ATTR_SPRTMAP
)) {
246 new_attr_p
->attr
.transport_map
.num_chan
= 1;
247 } else if (new_attr_p
->type
== SDP_ATTR_DIRECTION
) {
248 comediadir_p
= &(new_attr_p
->attr
.comediadir
);
249 comediadir_p
->role
= SDP_MEDIADIR_ROLE_PASSIVE
;
250 comediadir_p
->conn_info_present
= FALSE
;
251 } else if (new_attr_p
->type
== SDP_ATTR_MPTIME
) {
252 sdp_mptime_t
*mptime
= &(new_attr_p
->attr
.mptime
);
253 mptime
->num_intervals
= 0;
257 /* Add a new attribute. */
258 if (level
== SDP_SESSION_LEVEL
) {
259 if (sdp_p
->sess_attrs_p
== NULL
) {
260 sdp_p
->sess_attrs_p
= new_attr_p
;
262 for (attr_p
= sdp_p
->sess_attrs_p
;
264 prev_attr_p
= attr_p
, attr_p
= attr_p
->next_p
) {
265 /* Count the num instances of this type. */
266 if (attr_p
->type
== attr_type
) {
270 prev_attr_p
->next_p
= new_attr_p
;
273 mca_p
= sdp_find_media_level(sdp_p
, level
);
275 sdp_free_attr(new_attr_p
);
276 sdp_p
->conf_p
->num_invalid_param
++;
277 return (SDP_INVALID_PARAMETER
);
279 if (mca_p
->media_attrs_p
== NULL
) {
280 mca_p
->media_attrs_p
= new_attr_p
;
282 for (attr_p
= mca_p
->media_attrs_p
;
284 prev_attr_p
= attr_p
, attr_p
= attr_p
->next_p
) {
285 /* Count the num instances of this type. */
286 if (attr_p
->type
== attr_type
) {
290 prev_attr_p
->next_p
= new_attr_p
;
294 /* Add a new capability attribute - find the capability attr. */
295 attr_p
= sdp_find_capability(sdp_p
, level
, cap_num
);
296 if (attr_p
== NULL
) {
297 sdp_free_attr(new_attr_p
);
298 sdp_p
->conf_p
->num_invalid_param
++;
299 return (SDP_INVALID_PARAMETER
);
301 cap_p
= attr_p
->attr
.cap_p
;
302 if (cap_p
->media_attrs_p
== NULL
) {
303 cap_p
->media_attrs_p
= new_attr_p
;
305 for (attr_p
= cap_p
->media_attrs_p
;
307 prev_attr_p
= attr_p
, attr_p
= attr_p
->next_p
) {
308 /* Count the num instances of this type. */
309 if (attr_p
->type
== attr_type
) {
313 prev_attr_p
->next_p
= new_attr_p
;
317 /* Increment the instance num for the attr just added. */
319 return (SDP_SUCCESS
);
322 /* Function: sdp_attr_num_instances
323 * Description: Get the number of attributes of the specified type at
324 * the given level and capability level.
325 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
326 * level The level to check for the attribute.
327 * cap_num The capability number associated with the
328 * attribute if any. If none, should be zero.
329 * attr_type The type of attribute to add.
330 * num_attr_inst Pointer to a uint16_t in which to return the
331 * number of attributes.
332 * Returns: SDP_SUCCESS Attribute was added successfully.
333 * SDP_INVALID_PARAMETER Specified media line is not defined.
335 sdp_result_e
sdp_attr_num_instances (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
336 sdp_attr_e attr_type
, uint16_t *num_attr_inst
)
340 static char fname
[] = "attr_num_instances";
344 rc
= sdp_find_attr_list(sdp_p
, level
, cap_num
, &attr_p
, fname
);
345 if (rc
== SDP_SUCCESS
) {
346 /* Found the attr list. Count the number of attrs of the given
347 * type at this level. */
348 for (; attr_p
!= NULL
; attr_p
= attr_p
->next_p
) {
349 if (attr_p
->type
== attr_type
) {
359 /* Forward declaration for use in sdp_free_attr */
360 static boolean
sdp_attr_is_long_string(sdp_attr_e attr_type
);
363 /* Internal routine to free the memory associated with an attribute.
364 * Certain attributes allocate additional memory. Free this and then
365 * free the attribute itself.
366 * Note that this routine may be called at any point (i.e., may be
367 * called due to a failure case) and so the additional memory
368 * associated with an attribute may or may not have been already
369 * allocated. This routine should check this carefully.
371 void sdp_free_attr (sdp_attr_t
*attr_p
)
375 sdp_attr_t
*next_cpar_p
;
378 /* If this is an X-cap/cdsc attr, free the cap_p structure and
379 * all X-cpar/cpar attributes. */
380 if ((attr_p
->type
== SDP_ATTR_X_CAP
) ||
381 (attr_p
->type
== SDP_ATTR_CDSC
)) {
382 cap_p
= attr_p
->attr
.cap_p
;
384 for (cpar_p
= cap_p
->media_attrs_p
; cpar_p
!= NULL
;) {
385 next_cpar_p
= cpar_p
->next_p
;
386 sdp_free_attr(cpar_p
);
387 cpar_p
= next_cpar_p
;
391 } else if ((attr_p
->type
== SDP_ATTR_SDESCRIPTIONS
) ||
392 (attr_p
->type
== SDP_ATTR_SRTP_CONTEXT
)) {
393 SDP_FREE(attr_p
->attr
.srtp_context
.session_parameters
);
394 } else if (sdp_attr_is_long_string(attr_p
->type
)) {
395 SDP_FREE(attr_p
->attr
.stringp
);
398 if (attr_p
->type
== SDP_ATTR_GROUP
) {
399 for (i
= 0; i
< attr_p
->attr
.stream_data
.num_group_id
; i
++) {
400 SDP_FREE(attr_p
->attr
.stream_data
.group_ids
[i
]);
402 } else if (attr_p
->type
== SDP_ATTR_MSID_SEMANTIC
) {
403 for (i
= 0; i
< SDP_MAX_MEDIA_STREAMS
; ++i
) {
404 SDP_FREE(attr_p
->attr
.msid_semantic
.msids
[i
]);
408 /* Now free the actual attribute memory. */
414 /* Function: sdp_find_attr_list
415 * Description: Find the attribute list for the specified level and cap_num.
416 * Note: This is not an API for the application but an internal
417 * routine used by the SDP library.
418 * Parameters: sdp_p Pointer to the SDP to search.
419 * level The level to check for the attribute list.
420 * cap_num The capability number associated with the
421 * attribute list. If none, should be zero.
422 * attr_p Pointer to the attr list pointer. Will be
423 * filled in on return if successful.
424 * fname String function name calling this routine.
425 * Use for printing debug.
426 * Returns: SDP_SUCCESS
427 * SDP_INVALID_MEDIA_LEVEL
428 * SDP_INVALID_CAPABILITY
431 sdp_result_e
sdp_find_attr_list (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
432 sdp_attr_t
**attr_p
, char *fname
)
436 sdp_attr_t
*cap_attr_p
;
438 /* Initialize the attr pointer. */
442 /* Find attribute list at the specified level. */
443 if (level
== SDP_SESSION_LEVEL
) {
444 *attr_p
= sdp_p
->sess_attrs_p
;
446 mca_p
= sdp_find_media_level(sdp_p
, level
);
448 sdp_p
->conf_p
->num_invalid_param
++;
449 return (SDP_INVALID_PARAMETER
);
451 *attr_p
= mca_p
->media_attrs_p
;
454 /* Find the attr list for the capability specified. */
455 cap_attr_p
= sdp_find_capability(sdp_p
, level
, cap_num
);
456 if (cap_attr_p
== NULL
) {
457 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
458 SDPLogError(logTag
, "%s %s, invalid capability %u at "
459 "level %u specified.", sdp_p
->debug_str
, fname
,
460 (unsigned)cap_num
, (unsigned)level
);
462 sdp_p
->conf_p
->num_invalid_param
++;
463 return (SDP_INVALID_CAPABILITY
);
465 cap_p
= cap_attr_p
->attr
.cap_p
;
466 *attr_p
= cap_p
->media_attrs_p
;
469 return (SDP_SUCCESS
);
472 /* Find fmtp inst_num with correct payload value or -1 for failure */
473 int sdp_find_fmtp_inst (sdp_t
*sdp_p
, uint16_t level
, uint16_t payload_num
)
475 uint16_t attr_count
=0;
479 /* Attr is at a media level */
480 mca_p
= sdp_find_media_level(sdp_p
, level
);
484 for (attr_p
= mca_p
->media_attrs_p
; attr_p
!= NULL
;
485 attr_p
= attr_p
->next_p
) {
486 if (attr_p
->type
== SDP_ATTR_FMTP
) {
488 if (attr_p
->attr
.fmtp
.payload_num
== payload_num
) {
498 /* Function: sdp_find_attr
499 * Description: Find the specified attribute in an SDP structure.
500 * Note: This is not an API for the application but an internal
501 * routine used by the SDP library.
502 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
503 * level The level to check for the attribute.
504 * cap_num The capability number associated with the
505 * attribute if any. If none, should be zero.
506 * attr_type The type of attribute to find.
507 * inst_num The instance num of the attribute to find.
508 * Range should be (1 - max num insts of this
509 * particular type of attribute at this level).
510 * Returns: Pointer to the attribute or NULL if not found.
512 sdp_attr_t
*sdp_find_attr (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
513 sdp_attr_e attr_type
, uint16_t inst_num
)
515 uint16_t attr_count
=0;
525 if (level
== SDP_SESSION_LEVEL
) {
526 for (attr_p
= sdp_p
->sess_attrs_p
; attr_p
!= NULL
;
527 attr_p
= attr_p
->next_p
) {
528 if (attr_p
->type
== attr_type
) {
530 if (attr_count
== inst_num
) {
535 } else { /* Attr is at a media level */
536 mca_p
= sdp_find_media_level(sdp_p
, level
);
540 for (attr_p
= mca_p
->media_attrs_p
; attr_p
!= NULL
;
541 attr_p
= attr_p
->next_p
) {
542 if (attr_p
->type
== attr_type
) {
544 if (attr_count
== inst_num
) {
549 } /* Attr is at a media level */
551 /* Attr is a capability X-cpar/cpar attribute. */
552 attr_p
= sdp_find_capability(sdp_p
, level
, cap_num
);
553 if (attr_p
== NULL
) {
556 cap_p
= attr_p
->attr
.cap_p
;
557 /* Now find the specific attribute. */
558 for (attr_p
= cap_p
->media_attrs_p
; attr_p
!= NULL
;
559 attr_p
= attr_p
->next_p
) {
560 if (attr_p
->type
== attr_type
) {
562 if (attr_count
== inst_num
) {
572 /* Function: sdp_find_capability
573 * Description: Find the specified capability attribute in an SDP structure.
574 * Note: This is not an API for the application but an internal
575 * routine used by the SDP library.
576 * Parameters: sdp_p The SDP handle.
577 * level The level to check for the capability.
578 * cap_num The capability number to locate.
579 * Returns: Pointer to the capability attribute or NULL if not found.
581 sdp_attr_t
*sdp_find_capability (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
)
583 uint8_t cur_cap_num
=0;
588 if (level
== SDP_SESSION_LEVEL
) {
589 for (attr_p
= sdp_p
->sess_attrs_p
; attr_p
!= NULL
;
590 attr_p
= attr_p
->next_p
) {
591 if ((attr_p
->type
== SDP_ATTR_X_CAP
) ||
592 (attr_p
->type
== SDP_ATTR_CDSC
)) {
593 cap_p
= attr_p
->attr
.cap_p
;
594 cur_cap_num
+= cap_p
->num_payloads
;
595 if (cap_num
<= cur_cap_num
) {
596 /* This is the right capability */
601 } else { /* Capability is at a media level */
602 mca_p
= sdp_find_media_level(sdp_p
, level
);
606 for (attr_p
= mca_p
->media_attrs_p
; attr_p
!= NULL
;
607 attr_p
= attr_p
->next_p
) {
608 if ((attr_p
->type
== SDP_ATTR_X_CAP
) ||
609 (attr_p
->type
== SDP_ATTR_CDSC
)) {
610 cap_p
= attr_p
->attr
.cap_p
;
611 cur_cap_num
+= cap_p
->num_payloads
;
612 if (cap_num
<= cur_cap_num
) {
613 /* This is the right capability */
620 /* We didn't find the specified capability. */
621 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
622 SDPLogError(logTag
, "%s Unable to find specified capability (level %u, "
623 "cap_num %u).", sdp_p
->debug_str
, (unsigned)level
, (unsigned)cap_num
);
625 sdp_p
->conf_p
->num_invalid_param
++;
629 /* Function: sdp_attr_valid(sdp_t *sdp_p)
630 * Description: Returns true or false depending on whether the specified
631 * instance of the given attribute has been defined at the
633 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
634 * attr_type The attribute type to validate.
635 * level The level to check for the attribute.
636 * cap_num The capability number associated with the
637 * attribute if any. If none, should be zero.
638 * inst_num The attribute instance number to check.
639 * Returns: TRUE or FALSE.
641 tinybool
sdp_attr_valid (sdp_t
*sdp_p
, sdp_attr_e attr_type
, uint16_t level
,
642 uint8_t cap_num
, uint16_t inst_num
)
644 if (sdp_find_attr(sdp_p
, level
, cap_num
, attr_type
, inst_num
) == NULL
) {
651 /* Function: sdp_attr_line_number(sdp_t *sdp_p)
652 * Description: Returns the line number this attribute appears on.
653 * Only works if the SDP was parsed rather than created
655 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
656 * attr_type The attribute type to validate.
657 * level The level to check for the attribute.
658 * cap_num The capability number associated with the
659 * attribute if any. If none, should be zero.
660 * inst_num The attribute instance number to check.
661 * Returns: line number, or 0 if an error
663 uint32_t sdp_attr_line_number (sdp_t
*sdp_p
, sdp_attr_e attr_type
, uint16_t level
,
664 uint8_t cap_num
, uint16_t inst_num
)
668 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, attr_type
, inst_num
);
669 if (attr_p
== NULL
) {
672 return attr_p
->line_number
;
676 static boolean
sdp_attr_is_simple_string(sdp_attr_e attr_type
) {
677 if ((attr_type
!= SDP_ATTR_BEARER
) &&
678 (attr_type
!= SDP_ATTR_CALLED
) &&
679 (attr_type
!= SDP_ATTR_CONN_TYPE
) &&
680 (attr_type
!= SDP_ATTR_DIALED
) &&
681 (attr_type
!= SDP_ATTR_DIALING
) &&
682 (attr_type
!= SDP_ATTR_FRAMING
) &&
683 (attr_type
!= SDP_ATTR_MID
) &&
684 (attr_type
!= SDP_ATTR_X_SIDIN
) &&
685 (attr_type
!= SDP_ATTR_X_SIDOUT
)&&
686 (attr_type
!= SDP_ATTR_X_CONFID
) &&
687 (attr_type
!= SDP_ATTR_LABEL
) &&
688 (attr_type
!= SDP_ATTR_ICE_OPTIONS
) &&
689 (attr_type
!= SDP_ATTR_IMAGEATTR
) &&
690 (attr_type
!= SDP_ATTR_SIMULCAST
) &&
691 (attr_type
!= SDP_ATTR_RID
)) {
697 /* Function: sdp_attr_get_simple_string
698 * Description: Returns a pointer to a string attribute parameter. This
699 * routine can only be called for attributes that have just
700 * one string parameter. The value is returned as a const
701 * ptr and so cannot be modified by the application. If the
702 * given attribute is not defined, NULL will be returned.
703 * Attributes with a simple string parameter currently include:
704 * bearer, called, connection_type, dialed, dialing, direction
706 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
707 * attr_type The simple string attribute type.
708 * level The level to check for the attribute.
709 * cap_num The capability number associated with the
710 * attribute if any. If none, should be zero.
711 * inst_num The attribute instance number to check.
712 * Returns: Pointer to the parameter value.
714 const char *sdp_attr_get_simple_string (sdp_t
*sdp_p
, sdp_attr_e attr_type
,
715 uint16_t level
, uint8_t cap_num
, uint16_t inst_num
)
719 if (!sdp_attr_is_simple_string(attr_type
)) {
720 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
721 SDPLogError(logTag
, "%s Attribute type is not a simple string (%s)",
722 sdp_p
->debug_str
, sdp_get_attr_name(attr_type
));
724 sdp_p
->conf_p
->num_invalid_param
++;
728 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, attr_type
, inst_num
);
729 if (attr_p
== NULL
) {
730 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
731 SDPLogError(logTag
, "%s Attribute %s, level %u instance %u not found.",
732 sdp_p
->debug_str
, sdp_get_attr_name(attr_type
),
733 (unsigned)level
, (unsigned)inst_num
);
735 sdp_p
->conf_p
->num_invalid_param
++;
738 return (attr_p
->attr
.string_val
);
742 static boolean
sdp_attr_is_long_string(sdp_attr_e attr_type
) {
743 return (attr_type
== SDP_ATTR_IDENTITY
|| attr_type
== SDP_ATTR_DTLS_MESSAGE
);
746 /* Identical in usage to sdp_attr_get_simple_string() */
747 const char *sdp_attr_get_long_string (sdp_t
*sdp_p
, sdp_attr_e attr_type
,
748 uint16_t level
, uint8_t cap_num
, uint16_t inst_num
)
752 if (!sdp_attr_is_long_string(attr_type
)) {
753 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
754 SDPLogError(logTag
, "%s Attribute type is not a long string (%s)",
755 sdp_p
->debug_str
, sdp_get_attr_name(attr_type
));
757 sdp_p
->conf_p
->num_invalid_param
++;
761 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, attr_type
, inst_num
);
762 if (attr_p
== NULL
) {
763 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
764 SDPLogError(logTag
, "%s Attribute %s, level %u instance %u not found.",
765 sdp_p
->debug_str
, sdp_get_attr_name(attr_type
),
766 (unsigned)level
, (unsigned)inst_num
);
768 sdp_p
->conf_p
->num_invalid_param
++;
771 return (attr_p
->attr
.stringp
);
775 static boolean
sdp_attr_is_simple_u32(sdp_attr_e attr_type
) {
776 if ((attr_type
!= SDP_ATTR_EECID
) &&
777 (attr_type
!= SDP_ATTR_PTIME
) &&
778 (attr_type
!= SDP_ATTR_MAXPTIME
) &&
779 (attr_type
!= SDP_ATTR_SCTPPORT
) &&
780 (attr_type
!= SDP_ATTR_MAXMESSAGESIZE
) &&
781 (attr_type
!= SDP_ATTR_T38_VERSION
) &&
782 (attr_type
!= SDP_ATTR_T38_MAXBITRATE
) &&
783 (attr_type
!= SDP_ATTR_T38_MAXBUFFER
) &&
784 (attr_type
!= SDP_ATTR_T38_MAXDGRAM
) &&
785 (attr_type
!= SDP_ATTR_X_SQN
) &&
786 (attr_type
!= SDP_ATTR_TC1_PAYLOAD_BYTES
) &&
787 (attr_type
!= SDP_ATTR_TC1_WINDOW_SIZE
) &&
788 (attr_type
!= SDP_ATTR_TC2_PAYLOAD_BYTES
) &&
789 (attr_type
!= SDP_ATTR_TC2_WINDOW_SIZE
) &&
790 (attr_type
!= SDP_ATTR_FRAMERATE
)) {
797 /* Function: sdp_attr_get_simple_u32
798 * Description: Returns an unsigned 32-bit attribute parameter. This
799 * routine can only be called for attributes that have just
800 * one uint32_t parameter. If the given attribute is not defined,
801 * zero will be returned. There is no way for the application
802 * to determine if zero is the actual value or the attribute
803 * wasn't defined, so the application must use the
804 * sdp_attr_valid function to determine this.
805 * Attributes with a simple uint32_t parameter currently include:
806 * eecid, ptime, T38FaxVersion, T38maxBitRate, T38FaxMaxBuffer,
807 * T38FaxMaxDatagram, X-sqn, TC1PayloadBytes, TC1WindowSize,
808 * TC2PayloadBytes, TC2WindowSize, rtcp.
809 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
810 * attr_type The simple uint32_t attribute type.
811 * level The level to check for the attribute.
812 * cap_num The capability number associated with the
813 * attribute if any. If none, should be zero.
814 * inst_num The attribute instance number to check.
815 * Returns: uint32_t parameter value.
817 uint32_t sdp_attr_get_simple_u32 (sdp_t
*sdp_p
, sdp_attr_e attr_type
, uint16_t level
,
818 uint8_t cap_num
, uint16_t inst_num
)
822 if (!sdp_attr_is_simple_u32(attr_type
)) {
823 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
824 SDPLogError(logTag
, "%s Attribute type is not a simple uint32_t (%s)",
825 sdp_p
->debug_str
, sdp_get_attr_name(attr_type
));
827 sdp_p
->conf_p
->num_invalid_param
++;
831 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, attr_type
, inst_num
);
832 if (attr_p
== NULL
) {
833 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
834 SDPLogError(logTag
, "%s Attribute %s, level %u instance %u not found.",
835 sdp_p
->debug_str
, sdp_get_attr_name(attr_type
),
836 (unsigned)level
, (unsigned)inst_num
);
838 sdp_p
->conf_p
->num_invalid_param
++;
841 return (attr_p
->attr
.u32_val
);
845 /* Function: sdp_attr_get_simple_boolean
846 * Description: Returns a boolean attribute parameter. This
847 * routine can only be called for attributes that have just
848 * one boolean parameter. If the given attribute is not defined,
849 * FALSE will be returned. There is no way for the application
850 * to determine if FALSE is the actual value or the attribute
851 * wasn't defined, so the application must use the
852 * sdp_attr_valid function to determine this.
853 * Attributes with a simple boolean parameter currently include:
854 * T38FaxFillBitRemoval, T38FaxTranscodingMMR,
855 * T38FaxTranscodingJBIG, and TMRGwXid.
856 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
857 * attr_type The simple boolean attribute type.
858 * level The level to check for the attribute.
859 * cap_num The capability number associated with the
860 * attribute if any. If none, should be zero.
861 * inst_num The attribute instance number to check.
862 * Returns: Boolean value.
864 tinybool
sdp_attr_get_simple_boolean (sdp_t
*sdp_p
, sdp_attr_e attr_type
,
865 uint16_t level
, uint8_t cap_num
, uint16_t inst_num
)
869 if ((attr_type
!= SDP_ATTR_T38_FILLBITREMOVAL
) &&
870 (attr_type
!= SDP_ATTR_T38_TRANSCODINGMMR
) &&
871 (attr_type
!= SDP_ATTR_T38_TRANSCODINGJBIG
) &&
872 (attr_type
!= SDP_ATTR_TMRGWXID
)) {
873 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
874 SDPLogError(logTag
, "%s Attribute type is not a simple boolean (%s)",
875 sdp_p
->debug_str
, sdp_get_attr_name(attr_type
));
877 sdp_p
->conf_p
->num_invalid_param
++;
881 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, attr_type
, inst_num
);
882 if (attr_p
== NULL
) {
883 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
884 SDPLogError(logTag
, "%s Attribute %s, level %u instance %u not found.",
885 sdp_p
->debug_str
, sdp_get_attr_name(attr_type
),
886 (unsigned)level
, (unsigned)inst_num
);
888 sdp_p
->conf_p
->num_invalid_param
++;
891 return (attr_p
->attr
.boolean_val
);
896 * sdp_attr_get_maxprate
898 * This function is used by the application layer to get the packet-rate
899 * within the maxprate attribute.
901 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
902 * level The level to check for the attribute.
903 * inst_num The attribute instance number to set.
905 * Returns a pointer to a constant char array that stores the packet-rate,
906 * OR null if the attribute does not exist.
909 sdp_attr_get_maxprate (sdp_t
*sdp_p
, uint16_t level
, uint16_t inst_num
)
913 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_MAXPRATE
, inst_num
);
914 if (attr_p
== NULL
) {
915 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
916 SDPLogError(logTag
, "%s Attribute %s, level %u instance %u not found.",
917 sdp_p
->debug_str
, sdp_get_attr_name(SDP_ATTR_MAXPRATE
),
918 (unsigned)level
, (unsigned)inst_num
);
920 sdp_p
->conf_p
->num_invalid_param
++;
923 return (attr_p
->attr
.string_val
);
927 /* Function: sdp_attr_get_t38ratemgmt
928 * Description: Returns the value of the t38ratemgmt attribute
929 * parameter specified for the given attribute. If the given
930 * attribute is not defined, SDP_T38_UNKNOWN_RATE is returned.
931 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
932 * level The level to check for the attribute.
933 * cap_num The capability number associated with the
934 * attribute if any. If none, should be zero.
935 * inst_num The attribute instance number to check.
936 * Returns: Ratemgmt value.
938 sdp_t38_ratemgmt_e
sdp_attr_get_t38ratemgmt (sdp_t
*sdp_p
, uint16_t level
,
939 uint8_t cap_num
, uint16_t inst_num
)
943 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
944 SDP_ATTR_T38_RATEMGMT
, inst_num
);
945 if (attr_p
== NULL
) {
946 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
947 SDPLogError(logTag
, "%s t38ratemgmt attribute, level %u instance %u "
948 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
950 sdp_p
->conf_p
->num_invalid_param
++;
951 return (SDP_T38_UNKNOWN_RATE
);
953 return (attr_p
->attr
.t38ratemgmt
);
957 /* Function: sdp_attr_get_t38udpec
958 * Description: Returns the value of the t38udpec attribute
959 * parameter specified for the given attribute. If the given
960 * attribute is not defined, SDP_T38_UDPEC_UNKNOWN is returned.
961 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
962 * level The level to check for the attribute.
963 * cap_num The capability number associated with the
964 * attribute if any. If none, should be zero.
965 * inst_num The attribute instance number to check.
966 * Returns: UDP EC value.
968 sdp_t38_udpec_e
sdp_attr_get_t38udpec (sdp_t
*sdp_p
, uint16_t level
,
969 uint8_t cap_num
, uint16_t inst_num
)
973 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
974 SDP_ATTR_T38_UDPEC
, inst_num
);
975 if (attr_p
== NULL
) {
976 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
977 SDPLogError(logTag
, "%s t38udpec attribute, level %u instance %u "
978 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
980 sdp_p
->conf_p
->num_invalid_param
++;
981 return (SDP_T38_UDPEC_UNKNOWN
);
983 return (attr_p
->attr
.t38udpec
);
987 /* Function: sdp_get_media_direction
988 * Description: Determines the direction defined for a given level. The
989 * direction will be inactive, sendonly, recvonly, or sendrecv
990 * as determined by the last of these attributes specified at
991 * the given level. If none of these attributes are specified,
992 * the direction will be sendrecv by default.
993 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
994 * level The level to check for the attribute.
995 * cap_num The capability number associated with the
996 * attribute if any. If none, should be zero.
997 * Returns: An SDP direction enum value.
999 sdp_direction_e
sdp_get_media_direction (sdp_t
*sdp_p
, uint16_t level
,
1004 sdp_direction_e direction
= SDP_DIRECTION_SENDRECV
;
1007 /* Find the pointer to the attr list for this level. */
1008 if (level
== SDP_SESSION_LEVEL
) {
1009 attr_p
= sdp_p
->sess_attrs_p
;
1010 } else { /* Attr is at a media level */
1011 mca_p
= sdp_find_media_level(sdp_p
, level
);
1012 if (mca_p
== NULL
) {
1015 attr_p
= mca_p
->media_attrs_p
;
1018 /* Scan for direction oriented attributes. Last one wins. */
1019 for (; attr_p
!= NULL
; attr_p
= attr_p
->next_p
) {
1020 if (attr_p
->type
== SDP_ATTR_INACTIVE
) {
1021 direction
= SDP_DIRECTION_INACTIVE
;
1022 } else if (attr_p
->type
== SDP_ATTR_SENDONLY
) {
1023 direction
= SDP_DIRECTION_SENDONLY
;
1024 } else if (attr_p
->type
== SDP_ATTR_RECVONLY
) {
1025 direction
= SDP_DIRECTION_RECVONLY
;
1026 } else if (attr_p
->type
== SDP_ATTR_SENDRECV
) {
1027 direction
= SDP_DIRECTION_SENDRECV
;
1031 if (sdp_p
->debug_flag
[SDP_DEBUG_WARNINGS
]) {
1032 SDPLogDebug(logTag
, "%s Warning: Invalid cap_num for media direction.",
1040 /* Since there are four different attribute names which all have the same
1041 * qos parameters, all of these attributes are accessed through this same
1042 * set of APIs. To distinguish between specific attributes, the application
1043 * must also pass the attribute type. The attribute must be one of:
1044 * SDP_ATTR_QOS, SDP_ATTR_SECURE, SDP_ATTR_X_PC_QOS, and SDP_ATTR_X_QOS.
1046 tinybool
sdp_validate_qos_attr (sdp_attr_e qos_attr
)
1048 if ((qos_attr
== SDP_ATTR_QOS
) ||
1049 (qos_attr
== SDP_ATTR_SECURE
) ||
1050 (qos_attr
== SDP_ATTR_X_PC_QOS
) ||
1051 (qos_attr
== SDP_ATTR_X_QOS
) ||
1052 (qos_attr
== SDP_ATTR_CURR
) ||
1053 (qos_attr
== SDP_ATTR_DES
) ||
1054 (qos_attr
== SDP_ATTR_CONF
)){
1061 /* Function: sdp_attr_get_qos_strength
1062 * Description: Returns the value of the qos attribute strength
1063 * parameter specified for the given attribute. If the given
1064 * attribute is not defined, SDP_QOS_STRENGTH_UNKNOWN is
1066 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1067 * level The level to check for the attribute.
1068 * cap_num The capability number associated with the
1069 * attribute if any. If none, should be zero.
1070 * qos_attr The specific type of qos attribute. May be
1071 * qos, secure, X-pc-qos, or X-qos.
1072 * inst_num The attribute instance number to check.
1073 * Returns: Qos strength value.
1075 sdp_qos_strength_e
sdp_attr_get_qos_strength (sdp_t
*sdp_p
, uint16_t level
,
1076 uint8_t cap_num
, sdp_attr_e qos_attr
, uint16_t inst_num
)
1080 if (sdp_validate_qos_attr(qos_attr
) == FALSE
) {
1081 if (sdp_p
->debug_flag
[SDP_DEBUG_WARNINGS
]) {
1082 SDPLogDebug(logTag
, "%s Warning: Invalid QOS attribute specified for"
1083 "get qos strength.", sdp_p
->debug_str
);
1085 return (SDP_QOS_STRENGTH_UNKNOWN
);
1087 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, qos_attr
, inst_num
);
1088 if (attr_p
== NULL
) {
1089 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1090 SDPLogError(logTag
, "%s %s attribute, level %u instance %u "
1091 "not found.", sdp_p
->debug_str
,
1092 sdp_get_attr_name(qos_attr
), (unsigned)level
, (unsigned)inst_num
);
1094 sdp_p
->conf_p
->num_invalid_param
++;
1095 return (SDP_QOS_STRENGTH_UNKNOWN
);
1099 return (attr_p
->attr
.qos
.strength
);
1101 return (attr_p
->attr
.des
.strength
);
1103 return SDP_QOS_STRENGTH_UNKNOWN
;
1109 /* Function: sdp_attr_get_qos_direction
1110 * Description: Returns the value of the qos attribute direction
1111 * parameter specified for the given attribute. If the given
1112 * attribute is not defined, SDP_QOS_DIR_UNKNOWN is
1114 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1115 * level The level to check for the attribute.
1116 * cap_num The capability number associated with the
1117 * attribute if any. If none, should be zero.
1118 * qos_attr The specific type of qos attribute. May be
1119 * qos, secure, X-pc-qos, or X-qos.
1120 * inst_num The attribute instance number to check.
1121 * Returns: Qos direction value.
1123 sdp_qos_dir_e
sdp_attr_get_qos_direction (sdp_t
*sdp_p
, uint16_t level
,
1124 uint8_t cap_num
, sdp_attr_e qos_attr
, uint16_t inst_num
)
1128 if (sdp_validate_qos_attr(qos_attr
) == FALSE
) {
1129 if (sdp_p
->debug_flag
[SDP_DEBUG_WARNINGS
]) {
1130 SDPLogDebug(logTag
, "%s Warning: Invalid QOS attribute specified "
1131 "for get qos direction.", sdp_p
->debug_str
);
1133 return (SDP_QOS_DIR_UNKNOWN
);
1135 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, qos_attr
, inst_num
);
1136 if (attr_p
== NULL
) {
1137 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1138 SDPLogError(logTag
, "%s %s attribute, level %u instance %u "
1139 "not found.", sdp_p
->debug_str
,
1140 sdp_get_attr_name(qos_attr
), (unsigned)level
, (unsigned)inst_num
);
1142 sdp_p
->conf_p
->num_invalid_param
++;
1143 return (SDP_QOS_DIR_UNKNOWN
);
1147 return (attr_p
->attr
.qos
.direction
);
1149 return (attr_p
->attr
.curr
.direction
);
1151 return (attr_p
->attr
.des
.direction
);
1153 return (attr_p
->attr
.conf
.direction
);
1155 return SDP_QOS_DIR_UNKNOWN
;
1161 /* Function: sdp_attr_get_qos_status_type
1162 * Description: Returns the value of the qos attribute status_type
1163 * parameter specified for the given attribute. If the given
1164 * attribute is not defined, SDP_QOS_STATUS_TYPE_UNKNOWN is
1166 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1167 * level The level to check for the attribute.
1168 * cap_num The capability number associated with the
1169 * attribute if any. If none, should be zero.
1170 * qos_attr The specific type of qos attribute. May be
1171 * qos, secure, X-pc-qos, or X-qos.
1172 * inst_num The attribute instance number to check.
1173 * Returns: Qos direction value.
1175 sdp_qos_status_types_e
sdp_attr_get_qos_status_type (sdp_t
*sdp_p
, uint16_t level
,
1176 uint8_t cap_num
, sdp_attr_e qos_attr
, uint16_t inst_num
)
1180 if (sdp_validate_qos_attr(qos_attr
) == FALSE
) {
1181 if (sdp_p
->debug_flag
[SDP_DEBUG_WARNINGS
]) {
1182 SDPLogDebug(logTag
, "%s Warning: Invalid QOS attribute specified "
1183 "for get qos status_type.", sdp_p
->debug_str
);
1185 return (SDP_QOS_STATUS_TYPE_UNKNOWN
);
1187 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, qos_attr
, inst_num
);
1188 if (attr_p
== NULL
) {
1189 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1190 SDPLogError(logTag
, "%s %s attribute, level %u instance %u "
1191 "not found.", sdp_p
->debug_str
,
1192 sdp_get_attr_name(qos_attr
), (unsigned)level
, (unsigned)inst_num
);
1194 sdp_p
->conf_p
->num_invalid_param
++;
1195 return (SDP_QOS_STATUS_TYPE_UNKNOWN
);
1199 return (attr_p
->attr
.curr
.status_type
);
1201 return (attr_p
->attr
.des
.status_type
);
1203 return (attr_p
->attr
.conf
.status_type
);
1205 return SDP_QOS_STATUS_TYPE_UNKNOWN
;
1211 /* Function: sdp_attr_get_qos_confirm
1212 * Description: Returns the value of the qos attribute confirm
1213 * parameter specified for the given attribute. Returns TRUE if
1214 * the confirm parameter is specified.
1215 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1216 * level The level to check for the attribute.
1217 * cap_num The capability number associated with the
1218 * attribute if any. If none, should be zero.
1219 * qos_attr The specific type of qos attribute. May be
1220 * qos, secure, X-pc-qos, or X-qos.
1221 * inst_num The attribute instance number to check.
1222 * Returns: Boolean value.
1224 tinybool
sdp_attr_get_qos_confirm (sdp_t
*sdp_p
, uint16_t level
,
1225 uint8_t cap_num
, sdp_attr_e qos_attr
, uint16_t inst_num
)
1229 if (sdp_validate_qos_attr(qos_attr
) == FALSE
) {
1230 if (sdp_p
->debug_flag
[SDP_DEBUG_WARNINGS
]) {
1231 SDPLogDebug(logTag
, "%s Warning: Invalid QOS attribute specified "
1232 "for get qos confirm.", sdp_p
->debug_str
);
1236 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, qos_attr
, inst_num
);
1237 if (attr_p
== NULL
) {
1238 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1239 SDPLogError(logTag
, "%s %s attribute, level %u instance %u "
1240 "not found.", sdp_p
->debug_str
,
1241 sdp_get_attr_name(qos_attr
), (unsigned)level
, (unsigned)inst_num
);
1243 sdp_p
->conf_p
->num_invalid_param
++;
1246 return (attr_p
->attr
.qos
.confirm
);
1250 /* Function: sdp_attr_get_curr_type
1251 * Description: Returns the value of the curr attribute status_type
1252 * parameter specified for the given attribute. If the given
1253 * attribute is not defined, SDP_CURR_UNKNOWN_TYPE is
1255 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1256 * level The level to check for the attribute.
1257 * cap_num The capability number associated with the
1258 * attribute if any. If none, should be zero.
1259 * qos_attr The specific type of qos attribute. May be
1260 * qos, secure, X-pc-qos, or X-qos.
1261 * inst_num The attribute instance number to check.
1262 * Returns: Curr type value.
1264 sdp_curr_type_e
sdp_attr_get_curr_type (sdp_t
*sdp_p
, uint16_t level
,
1265 uint8_t cap_num
, sdp_attr_e qos_attr
, uint16_t inst_num
)
1269 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, qos_attr
, inst_num
);
1270 if (attr_p
== NULL
) {
1271 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1272 SDPLogError(logTag
, "%s %s attribute, level %u instance %u "
1273 "not found.", sdp_p
->debug_str
,
1274 sdp_get_attr_name(qos_attr
), (unsigned)level
, (unsigned)inst_num
);
1276 sdp_p
->conf_p
->num_invalid_param
++;
1277 return (SDP_CURR_UNKNOWN_TYPE
);
1279 return (attr_p
->attr
.curr
.type
);
1283 /* Function: sdp_attr_get_des_type
1284 * Description: Returns the value of the des attribute status_type
1285 * parameter specified for the given attribute. If the given
1286 * attribute is not defined, SDP_DES_UNKNOWN_TYPE is
1288 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1289 * level The level to check for the attribute.
1290 * cap_num The capability number associated with the
1291 * attribute if any. If none, should be zero.
1292 * qos_attr The specific type of qos attribute. May be
1293 * qos, secure, X-pc-qos, or X-qos.
1294 * inst_num The attribute instance number to check.
1295 * Returns: DES type value.
1297 sdp_des_type_e
sdp_attr_get_des_type (sdp_t
*sdp_p
, uint16_t level
,
1298 uint8_t cap_num
, sdp_attr_e qos_attr
, uint16_t inst_num
)
1302 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, qos_attr
, inst_num
);
1303 if (attr_p
== NULL
) {
1304 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1305 SDPLogError(logTag
, "%s %s attribute, level %u instance %u "
1306 "not found.", sdp_p
->debug_str
,
1307 sdp_get_attr_name(qos_attr
), (unsigned)level
, (unsigned)inst_num
);
1309 sdp_p
->conf_p
->num_invalid_param
++;
1310 return (SDP_DES_UNKNOWN_TYPE
);
1312 return (attr_p
->attr
.des
.type
);
1316 /* Function: sdp_attr_get_conf_type
1317 * Description: Returns the value of the des attribute status_type
1318 * parameter specified for the given attribute. If the given
1319 * attribute is not defined, SDP_CONF_UNKNOWN_TYPE is
1321 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1322 * level The level to check for the attribute.
1323 * cap_num The capability number associated with the
1324 * attribute if any. If none, should be zero.
1325 * qos_attr The specific type of qos attribute. May be
1326 * qos, secure, X-pc-qos, or X-qos.
1327 * inst_num The attribute instance number to check.
1328 * Returns: CONF type value.
1330 sdp_conf_type_e
sdp_attr_get_conf_type (sdp_t
*sdp_p
, uint16_t level
,
1331 uint8_t cap_num
, sdp_attr_e qos_attr
, uint16_t inst_num
)
1335 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, qos_attr
, inst_num
);
1336 if (attr_p
== NULL
) {
1337 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1338 SDPLogError(logTag
, "%s %s attribute, level %u instance %u "
1339 "not found.", sdp_p
->debug_str
,
1340 sdp_get_attr_name(qos_attr
), (unsigned)level
, (unsigned)inst_num
);
1342 sdp_p
->conf_p
->num_invalid_param
++;
1343 return (SDP_CONF_UNKNOWN_TYPE
);
1345 return (attr_p
->attr
.conf
.type
);
1349 /* Function: sdp_attr_get_subnet_nettype
1350 * Description: Returns the value of the subnet attribute network type
1351 * parameter specified for the given attribute. If the given
1352 * attribute is not defined, SDP_NT_INVALID is returned.
1353 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1354 * level The level to check for the attribute.
1355 * cap_num The capability number associated with the
1356 * attribute if any. If none, should be zero.
1357 * inst_num The attribute instance number to check.
1358 * Returns: Nettype value.
1360 sdp_nettype_e
sdp_attr_get_subnet_nettype (sdp_t
*sdp_p
, uint16_t level
,
1361 uint8_t cap_num
, uint16_t inst_num
)
1365 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
1366 SDP_ATTR_SUBNET
, inst_num
);
1367 if (attr_p
== NULL
) {
1368 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1369 SDPLogError(logTag
, "%s Subnet attribute, level %u instance %u "
1370 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1372 sdp_p
->conf_p
->num_invalid_param
++;
1373 return (SDP_NT_INVALID
);
1375 return (attr_p
->attr
.subnet
.nettype
);
1379 /* Function: sdp_attr_get_subnet_addrtype
1380 * Description: Returns the value of the subnet attribute address type
1381 * parameter specified for the given attribute. If the given
1382 * attribute is not defined, SDP_AT_INVALID is returned.
1383 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1384 * level The level to check for the attribute.
1385 * cap_num The capability number associated with the
1386 * attribute if any. If none, should be zero.
1387 * inst_num The attribute instance number to check.
1388 * Returns: Addrtype value.
1390 sdp_addrtype_e
sdp_attr_get_subnet_addrtype (sdp_t
*sdp_p
, uint16_t level
,
1391 uint8_t cap_num
, uint16_t inst_num
)
1395 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
1396 SDP_ATTR_SUBNET
, inst_num
);
1397 if (attr_p
== NULL
) {
1398 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1399 SDPLogError(logTag
, "%s Subnet attribute, level %u instance %u "
1400 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1402 sdp_p
->conf_p
->num_invalid_param
++;
1403 return (SDP_AT_INVALID
);
1405 return (attr_p
->attr
.subnet
.addrtype
);
1409 /* Function: sdp_attr_get_subnet_addr
1410 * Description: Returns the value of the subnet attribute address
1411 * parameter specified for the given attribute. If the given
1412 * attribute is not defined, NULL is returned. Value is
1413 * returned as a const ptr and so cannot be modified by the
1415 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1416 * level The level to check for the attribute.
1417 * cap_num The capability number associated with the
1418 * attribute if any. If none, should be zero.
1419 * inst_num The attribute instance number to check.
1420 * Returns: Pointer to address or NULL.
1422 const char *sdp_attr_get_subnet_addr (sdp_t
*sdp_p
, uint16_t level
,
1423 uint8_t cap_num
, uint16_t inst_num
)
1427 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
1428 SDP_ATTR_SUBNET
, inst_num
);
1429 if (attr_p
== NULL
) {
1430 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1431 SDPLogError(logTag
, "%s Subnet attribute, level %u instance %u "
1432 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1434 sdp_p
->conf_p
->num_invalid_param
++;
1437 return (attr_p
->attr
.subnet
.addr
);
1441 /* Function: sdp_attr_get_subnet_prefix
1442 * Description: Returns the value of the subnet attribute prefix
1443 * parameter specified for the given attribute. If the given
1444 * attribute is not defined, SDP_INVALID_PARAM is returned.
1445 * Note that this is value is defined to be (-2) and is
1446 * different from the return code SDP_INVALID_PARAMETER.
1447 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1448 * level The level to check for the attribute.
1449 * cap_num The capability number associated with the
1450 * attribute if any. If none, should be zero.
1451 * inst_num The attribute instance number to check.
1452 * Returns: Prefix value or SDP_INVALID_PARAM.
1454 int32_t sdp_attr_get_subnet_prefix (sdp_t
*sdp_p
, uint16_t level
,
1455 uint8_t cap_num
, uint16_t inst_num
)
1459 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
1460 SDP_ATTR_SUBNET
, inst_num
);
1461 if (attr_p
== NULL
) {
1462 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1463 SDPLogError(logTag
, "%s Subnet attribute, level %u instance %u "
1464 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1466 sdp_p
->conf_p
->num_invalid_param
++;
1467 return (SDP_INVALID_VALUE
);
1469 return (attr_p
->attr
.subnet
.prefix
);
1473 /* Function: sdp_attr_rtpmap_payload_valid
1474 * Description: Returns true or false depending on whether an rtpmap
1475 * attribute was specified with the given payload value
1476 * at the given level. If it was, the instance number of
1477 * that attribute is returned.
1478 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1479 * level The level to check for the attribute.
1480 * cap_num The capability number associated with the
1481 * attribute if any. If none, should be zero.
1482 * inst_num The attribute instance number of the attribute
1483 * found is returned via this param.
1484 * Returns: TRUE or FALSE.
1486 tinybool
sdp_attr_rtpmap_payload_valid (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
1487 uint16_t *inst_num
, uint16_t payload_type
)
1491 uint16_t num_instances
;
1495 if (sdp_attr_num_instances(sdp_p
, level
, cap_num
,
1496 SDP_ATTR_RTPMAP
, &num_instances
) != SDP_SUCCESS
) {
1500 for (i
=1; i
<= num_instances
; i
++) {
1501 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_RTPMAP
, i
);
1502 if ((attr_p
!= NULL
) &&
1503 (attr_p
->attr
.transport_map
.payload_num
== payload_type
)) {
1512 /* Function: sdp_attr_get_rtpmap_payload_type
1513 * Description: Returns the value of the rtpmap attribute payload type
1514 * parameter specified for the given attribute. If the given
1515 * attribute is not defined, zero is returned.
1516 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1517 * level The level to check for the attribute.
1518 * cap_num The capability number associated with the
1519 * attribute if any. If none, should be zero.
1520 * inst_num The attribute instance number to check.
1521 * Returns: Payload type value.
1523 uint16_t sdp_attr_get_rtpmap_payload_type (sdp_t
*sdp_p
, uint16_t level
,
1524 uint8_t cap_num
, uint16_t inst_num
)
1528 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_RTPMAP
, inst_num
);
1529 if (attr_p
== NULL
) {
1530 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1531 SDPLogError(logTag
, "%s rtpmap attribute, level %u instance %u "
1535 (unsigned)inst_num
);
1537 sdp_p
->conf_p
->num_invalid_param
++;
1540 return (attr_p
->attr
.transport_map
.payload_num
);
1544 /* Function: sdp_attr_get_rtpmap_encname
1545 * Description: Returns a pointer to the value of the encoding name
1546 * parameter specified for the given attribute. Value is
1547 * returned as a const ptr and so cannot be modified by the
1548 * application. If the given attribute is not defined, NULL
1550 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1551 * level The level to check for the attribute.
1552 * cap_num The capability number associated with the
1553 * attribute if any. If none, should be zero.
1554 * inst_num The attribute instance number to check.
1555 * Returns: Codec value or SDP_CODEC_INVALID.
1557 const char *sdp_attr_get_rtpmap_encname (sdp_t
*sdp_p
, uint16_t level
,
1558 uint8_t cap_num
, uint16_t inst_num
)
1562 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_RTPMAP
, inst_num
);
1563 if (attr_p
== NULL
) {
1564 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1565 SDPLogError(logTag
, "%s rtpmap attribute, level %u instance %u "
1569 (unsigned)inst_num
);
1571 sdp_p
->conf_p
->num_invalid_param
++;
1574 return (attr_p
->attr
.transport_map
.encname
);
1578 /* Function: sdp_attr_get_rtpmap_clockrate
1579 * Description: Returns the value of the rtpmap attribute clockrate
1580 * parameter specified for the given attribute. If the given
1581 * attribute is not defined, zero is returned.
1582 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1583 * level The level to check for the attribute.
1584 * cap_num The capability number associated with the
1585 * attribute if any. If none, should be zero.
1586 * inst_num The attribute instance number to check.
1587 * Returns: Clockrate value.
1589 uint32_t sdp_attr_get_rtpmap_clockrate (sdp_t
*sdp_p
, uint16_t level
,
1590 uint8_t cap_num
, uint16_t inst_num
)
1594 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_RTPMAP
, inst_num
);
1595 if (attr_p
== NULL
) {
1596 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1597 SDPLogError(logTag
, "%s rtpmap attribute, level %u instance %u "
1598 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1600 sdp_p
->conf_p
->num_invalid_param
++;
1603 return (attr_p
->attr
.transport_map
.clockrate
);
1607 /* Function: sdp_attr_get_rtpmap_num_chan
1608 * Description: Returns the value of the rtpmap attribute num_chan
1609 * parameter specified for the given attribute. If the given
1610 * attribute is not defined, zero is returned.
1611 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1612 * level The level to check for the attribute.
1613 * cap_num The capability number associated with the
1614 * attribute if any. If none, should be zero.
1615 * inst_num The attribute instance number to check.
1616 * Returns: Number of channels param or zero.
1618 uint16_t sdp_attr_get_rtpmap_num_chan (sdp_t
*sdp_p
, uint16_t level
,
1619 uint8_t cap_num
, uint16_t inst_num
)
1623 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_RTPMAP
, inst_num
);
1624 if (attr_p
== NULL
) {
1625 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1626 SDPLogError(logTag
, "%s rtpmap attribute, level %u instance %u "
1627 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1629 sdp_p
->conf_p
->num_invalid_param
++;
1632 return (attr_p
->attr
.transport_map
.num_chan
);
1636 /* Function: sdp_attr_get_ice_attribute
1637 * Description: Returns the value of an ice attribute at a given level
1639 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1640 * level The level to check for the attribute.
1641 * cap_num The capability number associated with the
1642 * attribute if any. If none, should be zero.
1643 * inst_num The attribute instance number to check.
1644 * ice_attrib Returns an ice attrib string
1646 * SDP_SUCCESS Attribute param was set successfully.
1647 * SDP_INVALID_SDP_PTR SDP pointer invalid
1648 * SDP_INVALID_PARAMETER Specified attribute is not defined.
1651 sdp_result_e
sdp_attr_get_ice_attribute (sdp_t
*sdp_p
, uint16_t level
,
1652 uint8_t cap_num
, sdp_attr_e sdp_attr
, uint16_t inst_num
,
1657 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, sdp_attr
, inst_num
);
1658 if (attr_p
!= NULL
) {
1659 *out
= attr_p
->attr
.ice_attr
;
1660 return (SDP_SUCCESS
);
1662 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1663 SDPLogError(logTag
, "%s ice attribute, level %u instance %u "
1664 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1666 sdp_p
->conf_p
->num_invalid_param
++;
1667 return (SDP_INVALID_PARAMETER
);
1671 /* Function: sdp_attr_is_present
1672 * Description: Returns a boolean value based on attribute being present or
1675 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1676 * attr_type The attribute type.
1677 * level The level to check for the attribute.
1678 * cap_num The capability number associated with the
1679 * attribute if any. If none, should be zero.
1684 tinybool
sdp_attr_is_present (sdp_t
*sdp_p
, sdp_attr_e attr_type
, uint16_t level
,
1689 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, attr_type
, 1);
1690 if (attr_p
!= NULL
) {
1693 if (sdp_p
->debug_flag
[SDP_DEBUG_WARNINGS
]) {
1694 SDPLogDebug(logTag
, "%s Attribute %s, level %u not found.",
1695 sdp_p
->debug_str
, sdp_get_attr_name(attr_type
), level
);
1703 /* Function: sdp_attr_get_rtcp_mux_attribute
1704 * Description: Returns the value of an rtcp-mux attribute at a given level
1706 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1707 * level The level to check for the attribute.
1708 * cap_num The capability number associated with the
1709 * attribute if any. If none, should be zero.
1710 * inst_num The attribute instance number to check.
1711 * rtcp_mux Returns an rtcp-mux attrib bool
1713 * SDP_SUCCESS Attribute param was set successfully.
1714 * SDP_INVALID_SDP_PTR SDP pointer invalid
1715 * SDP_INVALID_PARAMETER Specified attribute is not defined.
1717 sdp_result_e
sdp_attr_get_rtcp_mux_attribute (sdp_t
*sdp_p
, uint16_t level
,
1718 uint8_t cap_num
, sdp_attr_e sdp_attr
, uint16_t inst_num
,
1723 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, sdp_attr
, inst_num
);
1724 if (attr_p
!= NULL
) {
1725 *rtcp_mux
= attr_p
->attr
.boolean_val
;
1726 return (SDP_SUCCESS
);
1728 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1729 SDPLogError(logTag
, "%s rtcp-mux attribute, level %u instance %u "
1730 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1732 sdp_p
->conf_p
->num_invalid_param
++;
1733 return (SDP_INVALID_PARAMETER
);
1737 /* Function: sdp_attr_get_setup_attribute
1738 * Description: Returns the value of a setup attribute at a given level
1740 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1741 * level The level to check for the attribute.
1742 * cap_num The capability number associated with the
1743 * attribute if any. If none, should be zero.
1744 * inst_num The attribute instance number to check.
1745 * setup_type Returns sdp_setup_type_e enum
1747 * SDP_SUCCESS Attribute param was set successfully.
1748 * SDP_INVALID_SDP_PTR SDP pointer invalid
1749 * SDP_INVALID_PARAMETER Specified attribute is not defined.
1751 sdp_result_e
sdp_attr_get_setup_attribute (sdp_t
*sdp_p
, uint16_t level
,
1752 uint8_t cap_num
, uint16_t inst_num
, sdp_setup_type_e
*setup_type
)
1756 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_SETUP
, inst_num
);
1758 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1760 "%s setup attribute, level %u instance %u not found.",
1761 sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1763 sdp_p
->conf_p
->num_invalid_param
++;
1764 return SDP_INVALID_PARAMETER
;
1767 *setup_type
= attr_p
->attr
.setup
;
1771 /* Function: sdp_attr_get_connection_attribute
1772 * Description: Returns the value of a connection attribute at a given level
1774 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1775 * level The level to check for the attribute.
1776 * cap_num The capability number associated with the
1777 * attribute if any. If none, should be zero.
1778 * inst_num The attribute instance number to check.
1779 * connection_type Returns sdp_connection_type_e enum
1781 * SDP_SUCCESS Attribute param was set successfully.
1782 * SDP_INVALID_SDP_PTR SDP pointer invalid
1783 * SDP_INVALID_PARAMETER Specified attribute is not defined.
1785 sdp_result_e
sdp_attr_get_connection_attribute (sdp_t
*sdp_p
, uint16_t level
,
1786 uint8_t cap_num
, uint16_t inst_num
, sdp_connection_type_e
*connection_type
)
1790 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_CONNECTION
,
1793 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1795 "%s setup attribute, level %u instance %u not found.",
1796 sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1798 sdp_p
->conf_p
->num_invalid_param
++;
1799 return SDP_INVALID_PARAMETER
;
1802 *connection_type
= attr_p
->attr
.connection
;
1806 /* Function: sdp_attr_get_dtls_fingerprint_attribute
1807 * Description: Returns the value of dtls fingerprint attribute at a given level
1809 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1810 * level The level to check for the attribute.
1811 * cap_num The capability number associated with the
1812 * attribute if any. If none, should be zero.
1813 * inst_num The attribute instance number to check.
1814 * dtls_fingerprint Returns an dtls fingerprint attrib string
1816 * SDP_SUCCESS Attribute param was set successfully.
1817 * SDP_INVALID_SDP_PTR SDP pointer invalid
1818 * SDP_INVALID_PARAMETER Specified attribute is not defined.
1820 sdp_result_e
sdp_attr_get_dtls_fingerprint_attribute (sdp_t
*sdp_p
, uint16_t level
,
1821 uint8_t cap_num
, sdp_attr_e sdp_attr
, uint16_t inst_num
,
1826 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, sdp_attr
, inst_num
);
1827 if (attr_p
!= NULL
) {
1828 *out
= attr_p
->attr
.string_val
;
1829 return (SDP_SUCCESS
);
1831 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1832 SDPLogError(logTag
, "%s dtls fingerprint attribute, level %u instance %u "
1833 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1835 sdp_p
->conf_p
->num_invalid_param
++;
1836 return (SDP_INVALID_PARAMETER
);
1840 /* Function: sdp_attr_sprtmap_payload_valid
1841 * Description: Returns true or false depending on whether an sprtmap
1842 * attribute was specified with the given payload value
1843 * at the given level. If it was, the instance number of
1844 * that attribute is returned.
1845 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1846 * level The level to check for the attribute.
1847 * cap_num The capability number associated with the
1848 * attribute if any. If none, should be zero.
1849 * inst_num The attribute instance number of the attribute
1850 * found is returned via this param.
1851 * Returns: TRUE or FALSE.
1853 tinybool
sdp_attr_sprtmap_payload_valid (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
1854 uint16_t *inst_num
, uint16_t payload_type
)
1858 uint16_t num_instances
;
1862 if (sdp_attr_num_instances(sdp_p
, level
, cap_num
,
1863 SDP_ATTR_SPRTMAP
, &num_instances
) != SDP_SUCCESS
) {
1867 for (i
=1; i
<= num_instances
; i
++) {
1868 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_SPRTMAP
, i
);
1869 if ((attr_p
!= NULL
) &&
1870 (attr_p
->attr
.transport_map
.payload_num
== payload_type
)) {
1879 /* Function: sdp_attr_get_sprtmap_payload_type
1880 * Description: Returns the value of the sprtmap attribute payload type
1881 * parameter specified for the given attribute. If the given
1882 * attribute is not defined, zero is returned.
1883 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1884 * level The level to check for the attribute.
1885 * cap_num The capability number associated with the
1886 * attribute if any. If none, should be zero.
1887 * inst_num The attribute instance number to check.
1888 * Returns: Payload type value.
1890 uint16_t sdp_attr_get_sprtmap_payload_type (sdp_t
*sdp_p
, uint16_t level
,
1891 uint8_t cap_num
, uint16_t inst_num
)
1895 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_SPRTMAP
, inst_num
);
1896 if (attr_p
== NULL
) {
1897 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1898 SDPLogError(logTag
, "%s sprtmap attribute, level %u instance %u "
1899 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1901 sdp_p
->conf_p
->num_invalid_param
++;
1904 return (attr_p
->attr
.transport_map
.payload_num
);
1908 /* Function: sdp_attr_get_sprtmap_encname
1909 * Description: Returns a pointer to the value of the encoding name
1910 * parameter specified for the given attribute. Value is
1911 * returned as a const ptr and so cannot be modified by the
1912 * application. If the given attribute is not defined, NULL
1914 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1915 * level The level to check for the attribute.
1916 * cap_num The capability number associated with the
1917 * attribute if any. If none, should be zero.
1918 * inst_num The attribute instance number to check.
1919 * Returns: Codec value or SDP_CODEC_INVALID.
1921 const char *sdp_attr_get_sprtmap_encname (sdp_t
*sdp_p
, uint16_t level
,
1922 uint8_t cap_num
, uint16_t inst_num
)
1926 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_SPRTMAP
, inst_num
);
1927 if (attr_p
== NULL
) {
1928 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1929 SDPLogError(logTag
, "%s sprtmap attribute, level %u instance %u "
1930 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1932 sdp_p
->conf_p
->num_invalid_param
++;
1935 return (attr_p
->attr
.transport_map
.encname
);
1939 /* Function: sdp_attr_get_sprtmap_clockrate
1940 * Description: Returns the value of the sprtmap attribute clockrate
1941 * parameter specified for the given attribute. If the given
1942 * attribute is not defined, zero is returned.
1943 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1944 * level The level to check for the attribute.
1945 * cap_num The capability number associated with the
1946 * attribute if any. If none, should be zero.
1947 * inst_num The attribute instance number to check.
1948 * Returns: Clockrate value.
1950 uint32_t sdp_attr_get_sprtmap_clockrate (sdp_t
*sdp_p
, uint16_t level
,
1951 uint8_t cap_num
, uint16_t inst_num
)
1955 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_SPRTMAP
, inst_num
);
1956 if (attr_p
== NULL
) {
1957 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1958 SDPLogError(logTag
, "%s sprtmap attribute, level %u instance %u "
1959 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1961 sdp_p
->conf_p
->num_invalid_param
++;
1964 return (attr_p
->attr
.transport_map
.clockrate
);
1968 /* Function: sdp_attr_get_sprtmap_num_chan
1969 * Description: Returns the value of the sprtmap attribute num_chan
1970 * parameter specified for the given attribute. If the given
1971 * attribute is not defined, zero is returned.
1972 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
1973 * level The level to check for the attribute.
1974 * cap_num The capability number associated with the
1975 * attribute if any. If none, should be zero.
1976 * inst_num The attribute instance number to check.
1977 * Returns: Number of channels param or zero.
1979 uint16_t sdp_attr_get_sprtmap_num_chan (sdp_t
*sdp_p
, uint16_t level
,
1980 uint8_t cap_num
, uint16_t inst_num
)
1984 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_SPRTMAP
, inst_num
);
1985 if (attr_p
== NULL
) {
1986 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
1987 SDPLogError(logTag
, "%s sprtmap attribute, level %u instance %u "
1988 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
1990 sdp_p
->conf_p
->num_invalid_param
++;
1993 return (attr_p
->attr
.transport_map
.num_chan
);
1997 /* Note: The fmtp attribute formats currently handled are:
1998 * fmtp:<payload type> <event>,<event>...
1999 * fmtp:<payload_type> [annexa=yes/no] [annexb=yes/no] [bitrate=<value>]
2000 * where "value" is a numeric value > 0
2001 * where each event is a single number or a range separated
2003 * Example: fmtp:101 1,3-15,20
2006 /* Function: tinybool sdp_attr_fmtp_valid(sdp_t *sdp_p)
2007 * Description: Returns true or false depending on whether an fmtp
2008 * attribute was specified with the given payload value
2009 * at the given level. If it was, the instance number of
2010 * that attribute is returned.
2011 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2012 * level The level to check for the attribute.
2013 * cap_num The capability number associated with the
2014 * attribute if any. If none, should be zero.
2015 * inst_num The attribute instance number to check.
2016 * Returns: TRUE or FALSE.
2018 tinybool
sdp_attr_fmtp_payload_valid (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
2019 uint16_t *inst_num
, uint16_t payload_type
)
2023 uint16_t num_instances
;
2025 if (sdp_attr_num_instances(sdp_p
, level
, cap_num
,
2026 SDP_ATTR_FMTP
, &num_instances
) != SDP_SUCCESS
) {
2030 for (i
=1; i
<= num_instances
; i
++) {
2031 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
, i
);
2032 if ((attr_p
!= NULL
) &&
2033 (attr_p
->attr
.fmtp
.payload_num
== payload_type
)) {
2042 /* Function: sdp_attr_get_fmtp_payload_type
2043 * Description: Returns the value of the fmtp attribute payload type
2044 * parameter specified for the given attribute. If the given
2045 * attribute is not defined, zero is returned.
2046 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2047 * level The level to check for the attribute.
2048 * cap_num The capability number associated with the
2049 * attribute if any. If none, should be zero.
2050 * inst_num The attribute instance number to check.
2051 * Returns: Payload type value.
2053 uint16_t sdp_attr_get_fmtp_payload_type (sdp_t
*sdp_p
, uint16_t level
,
2054 uint8_t cap_num
, uint16_t inst_num
)
2058 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
, inst_num
);
2059 if (attr_p
== NULL
) {
2060 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2061 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2062 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2064 sdp_p
->conf_p
->num_invalid_param
++;
2067 return (attr_p
->attr
.fmtp
.payload_num
);
2072 /* Function: sdp_attr_fmtp_is_range_set
2073 * Description: Determines if a range of events is set in an fmtp attribute.
2074 * The overall range for events is 0-255.
2075 * This will return either FULL_MATCH, PARTIAL_MATCH, or NO_MATCH
2076 * depending on whether all, some, or none of the specified
2077 * events are defined. If the given attribute is not defined,
2078 * NO_MATCH will be returned. It is up to the appl to verify
2079 * the validity of the attribute before calling this routine.
2080 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2081 * level The level to check for the attribute.
2082 * cap_num The capability number associated with the
2083 * attribute if any. If none, should be zero.
2084 * inst_num The attribute instance number to check.
2085 * low_val Low value of the range. Range is 0-255.
2086 * high_val High value of the range.
2087 * Returns: SDP_FULL_MATCH, SDP_PARTIAL_MATCH, SDP_NO_MATCH
2089 sdp_ne_res_e
sdp_attr_fmtp_is_range_set (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
2090 uint16_t inst_num
, uint8_t low_val
, uint8_t high_val
)
2095 uint32_t num_vals
= 0;
2096 uint32_t num_vals_set
= 0;
2100 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
, inst_num
);
2101 if (attr_p
== NULL
) {
2102 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2103 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2104 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2106 sdp_p
->conf_p
->num_invalid_param
++;
2107 return (SDP_NO_MATCH
);
2110 fmtp_p
= &(attr_p
->attr
.fmtp
);
2111 for (i
= low_val
; i
<= high_val
; i
++) {
2113 mapword
= i
/SDP_NE_BITS_PER_WORD
;
2114 bmap
= SDP_NE_BIT_0
<< (i
%32);
2115 if (fmtp_p
->bmap
[ mapword
] & bmap
) {
2120 if (num_vals
== num_vals_set
) {
2121 return (SDP_FULL_MATCH
);
2122 } else if (num_vals_set
== 0) {
2123 return (SDP_NO_MATCH
);
2125 return (SDP_PARTIAL_MATCH
);
2129 /* Function: sdp_attr_fmtp_valid
2130 * Description: Determines the validity of the events in the fmtp.
2131 * The overall range for events is 0-255.
2132 * The user passes an event list with valid events supported by Appl.
2133 * This routine will do a simple AND comparison and report the result.
2135 * This will return TRUE if ftmp events are valid, and FALSE otherwise.
2136 * It is up to the appl to verify the validity of the attribute
2137 * before calling this routine.
2138 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2139 * level The level to check for the attribute.
2140 * cap_num The capability number associated with the
2141 * attribute if any. If none, should be zero.
2142 * inst_num The attribute instance number to check.
2143 * appl_maxval Max event value supported by Appl. Range is 0-255.
2144 * evt_array Bitmap containing events supported by application.
2145 * Returns: TRUE, FALSE
2148 sdp_attr_fmtp_valid(sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
2149 uint16_t inst_num
, uint16_t appl_maxval
, uint32_t* evt_array
)
2156 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
, inst_num
);
2157 if (attr_p
== NULL
) {
2158 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2159 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2160 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2162 sdp_p
->conf_p
->num_invalid_param
++;
2166 fmtp_p
= &(attr_p
->attr
.fmtp
);
2168 /* Do quick test. If application max value is lower than fmtp's then error */
2169 if (fmtp_p
->maxval
> appl_maxval
)
2172 /* Ok, events are within range. Now check that only
2173 * allowed events have been received
2175 mapword
= appl_maxval
/SDP_NE_BITS_PER_WORD
;
2176 for (i
=0; i
<mapword
; i
++) {
2177 if (fmtp_p
->bmap
[i
] & ~(evt_array
[i
])) {
2178 /* Remote SDP is requesting events not supported by Application */
2185 /* Function: sdp_attr_set_fmtp_payload_type
2186 * Description: Sets the value of the fmtp attribute payload type parameter
2187 * for the given attribute.
2188 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2189 * level The level to check for the attribute.
2190 * cap_num The capability number associated with the
2191 * attribute if any. If none, should be zero.
2192 * inst_num The attribute instance number to check.
2193 * payload_type New payload type value.
2194 * Returns: SDP_SUCCESS Attribute param was set successfully.
2195 * SDP_INVALID_PARAMETER Specified attribute is not defined.
2197 sdp_result_e
sdp_attr_set_fmtp_payload_type (sdp_t
*sdp_p
, uint16_t level
,
2198 uint8_t cap_num
, uint16_t inst_num
,
2199 uint16_t payload_num
)
2203 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
, inst_num
);
2204 if (attr_p
== NULL
) {
2205 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2206 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2207 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2209 sdp_p
->conf_p
->num_invalid_param
++;
2210 return (SDP_INVALID_PARAMETER
);
2212 attr_p
->attr
.fmtp
.payload_num
= payload_num
;
2213 return (SDP_SUCCESS
);
2217 /* Function: sdp_attr_get_fmtp_range
2218 * Description: Get a range of named events for an fmtp attribute.
2219 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2220 * level The level to check for the attribute.
2221 * cap_num The capability number associated with the
2222 * attribute if any. If none, should be zero.
2223 * inst_num The attribute instance number to check.
2224 * bmap The 8 word data array holding the bitmap
2225 * Returns: SDP_SUCCESS
2227 sdp_result_e
sdp_attr_get_fmtp_range (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
2228 uint16_t inst_num
, uint32_t *bmap
)
2233 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
, inst_num
);
2234 if (attr_p
== NULL
) {
2235 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2236 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2237 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2239 sdp_p
->conf_p
->num_invalid_param
++;
2240 return (SDP_INVALID_PARAMETER
);
2243 fmtp_p
= &(attr_p
->attr
.fmtp
);
2244 memcpy(bmap
, fmtp_p
->bmap
, SDP_NE_NUM_BMAP_WORDS
* sizeof(uint32_t) );
2246 return (SDP_SUCCESS
);
2249 /* Function: sdp_attr_clear_fmtp_range
2250 * Description: Clear a range of named events for an fmtp attribute. The low
2251 * value specified must be <= the high value.
2252 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2253 * level The level to check for the attribute.
2254 * cap_num The capability number associated with the
2255 * attribute if any. If none, should be zero.
2256 * inst_num The attribute instance number to check.
2257 * low_val The low value of the range. Range is 0-255
2258 * high_val The high value of the range. May be == low.
2259 * Returns: SDP_SUCCESS
2261 sdp_result_e
sdp_attr_clear_fmtp_range (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
2262 uint16_t inst_num
, uint8_t low_val
, uint8_t high_val
)
2270 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
, inst_num
);
2271 if (attr_p
== NULL
) {
2272 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2273 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2274 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2276 sdp_p
->conf_p
->num_invalid_param
++;
2277 return (SDP_INVALID_PARAMETER
);
2280 fmtp_p
= &(attr_p
->attr
.fmtp
);
2281 for (i
= low_val
; i
<= high_val
; i
++) {
2282 mapword
= i
/SDP_NE_BITS_PER_WORD
;
2283 bmap
= SDP_NE_BIT_0
<< (i
%32);
2284 fmtp_p
->bmap
[ mapword
] &= ~bmap
;
2286 if (high_val
> fmtp_p
->maxval
) {
2287 fmtp_p
->maxval
= high_val
;
2289 return (SDP_SUCCESS
);
2292 /* Function: sdp_attr_compare_fmtp_ranges
2293 * Description: Compare the named events set of two fmtp attributes. If all
2294 * events are the same (either set or not), FULL_MATCH will be
2295 * returned. If no events match, NO_MATCH will be returned.
2296 * Otherwise PARTIAL_MATCH will be returned. If either attr is
2297 * invalid, NO_MATCH will be returned.
2298 * Parameters: src_sdp_p The SDP handle returned by sdp_init_description.
2299 * dst_sdp_p The SDP handle returned by sdp_init_description.
2300 * src_level The level of the src fmtp attribute.
2301 * dst_level The level to the dst fmtp attribute.
2302 * src_cap_num The capability number of the src attr.
2303 * dst_cap_num The capability number of the dst attr.
2304 * src_inst_numh The attribute instance of the src attr.
2305 * dst_inst_numh The attribute instance of the dst attr.
2306 * Returns: SDP_FULL_MATCH, SDP_PARTIAL_MATCH, SDP_NO_MATCH.
2308 sdp_ne_res_e
sdp_attr_compare_fmtp_ranges (sdp_t
*src_sdp_p
,sdp_t
*dst_sdp_p
,
2309 uint16_t src_level
, uint16_t dst_level
,
2310 uint8_t src_cap_num
, uint8_t dst_cap_num
,
2311 uint16_t src_inst_num
, uint16_t dst_inst_num
)
2315 uint32_t num_vals_match
= 0;
2316 sdp_attr_t
*src_attr_p
;
2317 sdp_attr_t
*dst_attr_p
;
2318 sdp_fmtp_t
*src_fmtp_p
;
2319 sdp_fmtp_t
*dst_fmtp_p
;
2321 src_attr_p
= sdp_find_attr(src_sdp_p
, src_level
, src_cap_num
,
2322 SDP_ATTR_FMTP
, src_inst_num
);
2323 dst_attr_p
= sdp_find_attr(dst_sdp_p
, dst_level
, dst_cap_num
,
2324 SDP_ATTR_FMTP
, dst_inst_num
);
2325 if ((src_attr_p
== NULL
) || (dst_attr_p
== NULL
)) {
2326 if (src_sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2327 SDPLogError(logTag
, "%s source or destination fmtp attribute for "
2328 "compare not found.", src_sdp_p
->debug_str
);
2330 src_sdp_p
->conf_p
->num_invalid_param
++;
2331 return (SDP_NO_MATCH
);
2334 src_fmtp_p
= &(src_attr_p
->attr
.fmtp
);
2335 dst_fmtp_p
= &(dst_attr_p
->attr
.fmtp
);
2336 for (i
= 0; i
< SDP_NE_NUM_BMAP_WORDS
; i
++) {
2337 for (j
= 0; j
< SDP_NE_BITS_PER_WORD
; j
++) {
2338 bmap
= SDP_NE_BIT_0
<< j
;
2339 if ((src_fmtp_p
->bmap
[i
] & bmap
) && (dst_fmtp_p
->bmap
[i
] & bmap
)) {
2341 } else if ((!(src_fmtp_p
->bmap
[i
] & bmap
)) &&
2342 (!(dst_fmtp_p
->bmap
[i
] & bmap
))) {
2348 if (num_vals_match
== (SDP_NE_NUM_BMAP_WORDS
* SDP_NE_BITS_PER_WORD
)) {
2349 return (SDP_FULL_MATCH
);
2350 } else if (num_vals_match
== 0) {
2351 return (SDP_NO_MATCH
);
2353 return (SDP_PARTIAL_MATCH
);
2357 /* Function: sdp_attr_copy_fmtp_ranges
2358 * Description: Copy the named events set for one fmtp attribute to another.
2359 * Parameters: src_sdp_p The SDP handle returned by sdp_init_description.
2360 * dst_sdp_p The SDP handle returned by sdp_init_description.
2361 * src_level The level of the src fmtp attribute.
2362 * dst_level The level to the dst fmtp attribute.
2363 * src_cap_num The capability number of the src attr.
2364 * dst_cap_num The capability number of the dst attr.
2365 * src_inst_numh The attribute instance of the src attr.
2366 * dst_inst_numh The attribute instance of the dst attr.
2367 * Returns: SDP_SUCCESS
2369 sdp_result_e
sdp_attr_copy_fmtp_ranges (sdp_t
*src_sdp_p
, sdp_t
*dst_sdp_p
,
2370 uint16_t src_level
, uint16_t dst_level
,
2371 uint8_t src_cap_num
, uint8_t dst_cap_num
,
2372 uint16_t src_inst_num
, uint16_t dst_inst_num
)
2375 sdp_attr_t
*src_attr_p
;
2376 sdp_attr_t
*dst_attr_p
;
2377 sdp_fmtp_t
*src_fmtp_p
;
2378 sdp_fmtp_t
*dst_fmtp_p
;
2380 if (!src_sdp_p
|| !dst_sdp_p
) {
2381 return (SDP_INVALID_SDP_PTR
);
2384 src_attr_p
= sdp_find_attr(src_sdp_p
, src_level
, src_cap_num
,
2385 SDP_ATTR_FMTP
, src_inst_num
);
2386 dst_attr_p
= sdp_find_attr(dst_sdp_p
, dst_level
, dst_cap_num
,
2387 SDP_ATTR_FMTP
, dst_inst_num
);
2388 if ((src_attr_p
== NULL
) || (dst_attr_p
== NULL
)) {
2389 if (src_sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2390 SDPLogError(logTag
, "%s source or destination fmtp attribute for "
2391 "copy not found.", src_sdp_p
->debug_str
);
2393 src_sdp_p
->conf_p
->num_invalid_param
++;
2394 return (SDP_INVALID_PARAMETER
);
2397 src_fmtp_p
= &(src_attr_p
->attr
.fmtp
);
2398 dst_fmtp_p
= &(dst_attr_p
->attr
.fmtp
);
2399 dst_fmtp_p
->maxval
= src_fmtp_p
->maxval
;
2400 for (i
= 0; i
< SDP_NE_NUM_BMAP_WORDS
; i
++) {
2401 dst_fmtp_p
->bmap
[i
] = src_fmtp_p
->bmap
[i
];
2403 return (SDP_SUCCESS
);
2406 /* Function: sdp_attr_get_fmtp_mode
2407 * Description: Gets the value of the fmtp attribute mode parameter
2408 * for the given attribute.
2409 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2410 * level The level to check for the attribute.
2411 * cap_num The capability number associated with the
2412 * attribute if any. If none, should be zero.
2413 * payload_type payload type.
2414 * Returns: mode value or zero if mode attribute not found
2416 uint32_t sdp_attr_get_fmtp_mode_for_payload_type (sdp_t
*sdp_p
, uint16_t level
,
2417 uint8_t cap_num
, uint32_t payload_type
)
2419 uint16_t num_a_lines
= 0;
2424 * Get number of FMTP attributes for the AUDIO line
2426 (void) sdp_attr_num_instances(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2428 for (i
= 0; i
< num_a_lines
; i
++) {
2429 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
, (uint16_t) (i
+ 1));
2430 if ((attr_p
!= NULL
) &&
2431 (attr_p
->attr
.fmtp
.payload_num
== (uint16_t)payload_type
)) {
2432 if (attr_p
->attr
.fmtp
.fmtp_format
== SDP_FMTP_MODE
) {
2433 return attr_p
->attr
.fmtp
.mode
;
2440 sdp_result_e
sdp_attr_set_fmtp_max_fs (sdp_t
*sdp_p
, uint16_t level
,
2441 uint8_t cap_num
, uint16_t inst_num
,
2447 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
, inst_num
);
2448 if (attr_p
== NULL
) {
2449 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2450 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2451 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2453 sdp_p
->conf_p
->num_invalid_param
++;
2454 return (SDP_INVALID_PARAMETER
);
2457 fmtp_p
= &(attr_p
->attr
.fmtp
);
2458 fmtp_p
->fmtp_format
= SDP_FMTP_CODEC_INFO
;
2461 fmtp_p
->max_fs
= max_fs
;
2462 return (SDP_SUCCESS
);
2464 return (SDP_FAILURE
);
2468 sdp_result_e
sdp_attr_set_fmtp_max_fr (sdp_t
*sdp_p
, uint16_t level
,
2469 uint8_t cap_num
, uint16_t inst_num
,
2475 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
, inst_num
);
2476 if (attr_p
== NULL
) {
2477 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2478 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2479 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2481 sdp_p
->conf_p
->num_invalid_param
++;
2482 return (SDP_INVALID_PARAMETER
);
2485 fmtp_p
= &(attr_p
->attr
.fmtp
);
2486 fmtp_p
->fmtp_format
= SDP_FMTP_CODEC_INFO
;
2489 fmtp_p
->max_fr
= max_fr
;
2490 return (SDP_SUCCESS
);
2492 return (SDP_FAILURE
);
2496 /* Function: sdp_attr_get_fmtp_max_average_bitrate
2497 * Description: Gets the value of the fmtp attribute- maxaveragebitrate parameter for the OPUS codec
2498 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2499 * level The level to check for the attribute.
2500 * cap_num The capability number associated with the
2501 * attribute if any. If none, should be zero.
2502 * inst_num The attribute instance number to check.
2503 * Returns: max-br value.
2506 sdp_result_e
sdp_attr_get_fmtp_max_average_bitrate (sdp_t
*sdp_p
, uint16_t level
,
2507 uint8_t cap_num
, uint16_t inst_num
, uint32_t* val
)
2511 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
, 1);
2512 if (attr_p
== NULL
) {
2513 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2514 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2515 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2517 sdp_p
->conf_p
->num_invalid_param
++;
2518 return (SDP_INVALID_PARAMETER
);
2520 *val
= attr_p
->attr
.fmtp
.maxaveragebitrate
;
2521 return (SDP_SUCCESS
);
2526 /* Function: sdp_attr_get_fmtp_usedtx
2527 * Description: Gets the value of the fmtp attribute- usedtx parameter for the OPUS codec
2528 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2529 * level The level to check for the attribute.
2530 * cap_num The capability number associated with the
2531 * attribute if any. If none, should be zero.
2532 * inst_num The attribute instance number to check.
2533 * Returns: usedtx value.
2536 sdp_result_e
sdp_attr_get_fmtp_usedtx (sdp_t
*sdp_p
, uint16_t level
,
2537 uint8_t cap_num
, uint16_t inst_num
, tinybool
* val
)
2541 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2543 if (attr_p
== NULL
) {
2544 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2545 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2546 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2548 sdp_p
->conf_p
->num_invalid_param
++;
2549 return (SDP_INVALID_PARAMETER
);
2551 *val
= (tinybool
)attr_p
->attr
.fmtp
.usedtx
;
2552 return (SDP_SUCCESS
);
2556 /* Function: sdp_attr_get_fmtp_usedtx
2557 * Description: Gets the value of the fmtp attribute- usedtx parameter for the OPUS codec
2558 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2559 * level The level to check for the attribute.
2560 * cap_num The capability number associated with the
2561 * attribute if any. If none, should be zero.
2562 * inst_num The attribute instance number to check.
2563 * Returns: stereo value.
2566 sdp_result_e
sdp_attr_get_fmtp_stereo (sdp_t
*sdp_p
, uint16_t level
,
2567 uint8_t cap_num
, uint16_t inst_num
, tinybool
* val
)
2571 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2573 if (attr_p
== NULL
) {
2574 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2575 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2576 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2578 sdp_p
->conf_p
->num_invalid_param
++;
2579 return (SDP_INVALID_PARAMETER
);
2581 *val
= (tinybool
)attr_p
->attr
.fmtp
.stereo
;
2582 return (SDP_SUCCESS
);
2586 /* Function: sdp_attr_get_fmtp_useinbandfec
2587 * Description: Gets the value of the fmtp attribute useinbandfec parameter for the OPUS codec
2588 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2589 * level The level to check for the attribute.
2590 * cap_num The capability number associated with the
2591 * attribute if any. If none, should be zero.
2592 * inst_num The attribute instance number to check.
2593 * Returns: useinbandfec value.
2596 sdp_result_e
sdp_attr_get_fmtp_useinbandfec (sdp_t
*sdp_p
, uint16_t level
,
2597 uint8_t cap_num
, uint16_t inst_num
, tinybool
* val
)
2601 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2603 if (attr_p
== NULL
) {
2604 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2605 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2606 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2608 sdp_p
->conf_p
->num_invalid_param
++;
2609 return (SDP_INVALID_PARAMETER
);
2611 *val
= (tinybool
)attr_p
->attr
.fmtp
.useinbandfec
;
2612 return (SDP_SUCCESS
);
2616 /* Function: sdp_attr_get_fmtp_maxcodedaudiobandwidth
2617 * Description: Gets the value of the fmtp attribute maxcodedaudiobandwidth parameter for OPUS codec
2618 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2619 * level The level to check for the attribute.
2620 * cap_num The capability number associated with the
2621 * attribute if any. If none, should be zero.
2622 * inst_num The attribute instance number to check.
2623 * Returns: maxcodedaudiobandwidth value.
2625 char* sdp_attr_get_fmtp_maxcodedaudiobandwidth (sdp_t
*sdp_p
, uint16_t level
,
2626 uint8_t cap_num
, uint16_t inst_num
)
2631 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2633 if (attr_p
== NULL
) {
2634 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2635 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2636 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2638 sdp_p
->conf_p
->num_invalid_param
++;
2641 return (attr_p
->attr
.fmtp
.maxcodedaudiobandwidth
);
2645 /* Function: sdp_attr_get_fmtp_cbr
2646 * Description: Gets the value of the fmtp attribute cbr parameter for the OPUS codec
2647 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2648 * level The level to check for the attribute.
2649 * cap_num The capability number associated with the
2650 * attribute if any. If none, should be zero.
2651 * inst_num The attribute instance number to check.
2652 * Returns: cbr value.
2655 sdp_result_e
sdp_attr_get_fmtp_cbr (sdp_t
*sdp_p
, uint16_t level
,
2656 uint8_t cap_num
, uint16_t inst_num
, tinybool
* val
)
2660 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2662 if (attr_p
== NULL
) {
2663 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2664 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2665 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2667 sdp_p
->conf_p
->num_invalid_param
++;
2668 return (SDP_INVALID_PARAMETER
);
2670 *val
= (tinybool
)attr_p
->attr
.fmtp
.cbr
;
2671 return (SDP_SUCCESS
);
2675 uint16_t sdp_attr_get_sctpmap_port(sdp_t
*sdp_p
, uint16_t level
,
2676 uint8_t cap_num
, uint16_t inst_num
)
2680 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_SCTPMAP
, inst_num
);
2682 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2683 SDPLogError(logTag
, "%s sctpmap port, level %u instance %u "
2684 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2686 sdp_p
->conf_p
->num_invalid_param
++;
2689 return attr_p
->attr
.sctpmap
.port
;
2693 sdp_result_e
sdp_attr_get_sctpmap_streams (sdp_t
*sdp_p
, uint16_t level
,
2694 uint8_t cap_num
, uint16_t inst_num
, uint32_t* val
)
2698 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_SCTPMAP
, inst_num
);
2700 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2701 SDPLogError(logTag
, "%s sctpmap streams, level %u instance %u "
2702 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2704 sdp_p
->conf_p
->num_invalid_param
++;
2705 return (SDP_INVALID_PARAMETER
);
2707 *val
= attr_p
->attr
.sctpmap
.streams
;
2708 return (SDP_SUCCESS
);
2712 sdp_result_e
sdp_attr_get_sctpmap_protocol (sdp_t
*sdp_p
, uint16_t level
,
2713 uint8_t cap_num
, uint16_t inst_num
,
2719 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_SCTPMAP
,
2722 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2723 SDPLogError(logTag
, "%s sctpmap, level %u instance %u "
2724 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2726 sdp_p
->conf_p
->num_invalid_param
++;
2727 return (SDP_INVALID_PARAMETER
);
2729 sstrncpy(protocol
, attr_p
->attr
.sctpmap
.protocol
, SDP_MAX_STRING_LEN
+1);
2731 return (SDP_SUCCESS
);
2734 /* Function: sdp_attr_fmtp_is_annexb_set
2735 * Description: Gives the value of the fmtp attribute annexb type parameter
2736 * for the given attribute.
2737 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2738 * level The level to check for the attribute.
2739 * cap_num The capability number associated with the
2740 * attribute if any. If none, should be zero.
2741 * inst_num The attribute instance number to check.
2744 * Returns: TRUE or FALSE.
2746 tinybool
sdp_attr_fmtp_is_annexb_set (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
2752 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2754 if (attr_p
== NULL
) {
2755 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2756 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2757 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2759 sdp_p
->conf_p
->num_invalid_param
++;
2762 return (attr_p
->attr
.fmtp
.annexb
);
2766 /* Function: sdp_attr_fmtp_is_annexa_set
2767 * Description: Gives the value of the fmtp attribute annexa type parameter
2768 * for the given attribute.
2769 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2770 * level The level to check for the attribute.
2771 * cap_num The capability number associated with the
2772 * attribute if any. If none, should be zero.
2773 * inst_num The attribute instance number to check.
2776 * Returns: TRUE or FALSE.
2778 tinybool
sdp_attr_fmtp_is_annexa_set (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
2783 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2785 if (attr_p
== NULL
) {
2786 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2787 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2788 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2790 sdp_p
->conf_p
->num_invalid_param
++;
2793 return (attr_p
->attr
.fmtp
.annexa
);
2797 /* Function: sdp_attr_get_fmtp_bitrate_type
2798 * Description: Gets the value of the fmtp attribute bitrate type parameter
2799 * for the given attribute.
2800 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2801 * level The level to check for the attribute.
2802 * cap_num The capability number associated with the
2803 * attribute if any. If none, should be zero.
2804 * inst_num The attribute instance number to check.
2805 * Returns: Bitrate type value.
2807 int32_t sdp_attr_get_fmtp_bitrate_type (sdp_t
*sdp_p
, uint16_t level
,
2808 uint8_t cap_num
, uint16_t inst_num
)
2813 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2815 if (attr_p
== NULL
) {
2816 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2817 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2818 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2820 sdp_p
->conf_p
->num_invalid_param
++;
2821 return (SDP_INVALID_VALUE
);
2823 return (attr_p
->attr
.fmtp
.bitrate
);
2827 /* Function: sdp_attr_get_fmtp_qcif
2828 * Description: Gets the value of the fmtp attribute QCIF type parameter
2829 * for a given Video codec.
2830 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2831 * level The level to check for the attribute.
2832 * cap_num The capability number associated with the
2833 * attribute if any. If none, should be zero.
2834 * inst_num The attribute instance number to check.
2835 * Returns: QCIF value.
2837 int32_t sdp_attr_get_fmtp_qcif (sdp_t
*sdp_p
, uint16_t level
,
2838 uint8_t cap_num
, uint16_t inst_num
)
2843 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2845 if (attr_p
== NULL
) {
2846 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2847 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2848 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2850 sdp_p
->conf_p
->num_invalid_param
++;
2851 return (SDP_INVALID_VALUE
);
2853 return (attr_p
->attr
.fmtp
.qcif
);
2856 /* Function: sdp_attr_get_fmtp_cif
2857 * Description: Gets the value of the fmtp attribute CIF type parameter
2858 * for a given Video codec.
2859 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2860 * level The level to check for the attribute.
2861 * cap_num The capability number associated with the
2862 * attribute if any. If none, should be zero.
2863 * inst_num The attribute instance number to check.
2864 * Returns: CIF value.
2866 int32_t sdp_attr_get_fmtp_cif (sdp_t
*sdp_p
, uint16_t level
,
2867 uint8_t cap_num
, uint16_t inst_num
)
2872 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2874 if (attr_p
== NULL
) {
2875 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2876 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2877 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2879 sdp_p
->conf_p
->num_invalid_param
++;
2880 return (SDP_INVALID_VALUE
);
2882 return (attr_p
->attr
.fmtp
.cif
);
2887 /* Function: sdp_attr_get_fmtp_sqcif
2888 * Description: Gets the value of the fmtp attribute sqcif type parameter
2889 * for a given Video codec.
2890 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2891 * level The level to check for the attribute.
2892 * cap_num The capability number associated with the
2893 * attribute if any. If none, should be zero.
2894 * inst_num The attribute instance number to check.
2895 * Returns: sqcif value.
2897 int32_t sdp_attr_get_fmtp_sqcif (sdp_t
*sdp_p
, uint16_t level
,
2898 uint8_t cap_num
, uint16_t inst_num
)
2903 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2905 if (attr_p
== NULL
) {
2906 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2907 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2908 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2910 sdp_p
->conf_p
->num_invalid_param
++;
2911 return (SDP_INVALID_VALUE
);
2913 return (attr_p
->attr
.fmtp
.sqcif
);
2917 /* Function: sdp_attr_get_fmtp_cif4
2918 * Description: Gets the value of the fmtp attribute CIF4 type parameter
2919 * for a given Video codec.
2920 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2921 * level The level to check for the attribute.
2922 * cap_num The capability number associated with the
2923 * attribute if any. If none, should be zero.
2924 * inst_num The attribute instance number to check.
2925 * Returns: CIF4 value.
2927 int32_t sdp_attr_get_fmtp_cif4 (sdp_t
*sdp_p
, uint16_t level
,
2928 uint8_t cap_num
, uint16_t inst_num
)
2933 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2935 if (attr_p
== NULL
) {
2936 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2937 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2938 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2940 sdp_p
->conf_p
->num_invalid_param
++;
2941 return (SDP_INVALID_VALUE
);
2943 return (attr_p
->attr
.fmtp
.cif4
);
2947 /* Function: sdp_attr_get_fmtp_cif16
2948 * Description: Gets the value of the fmtp attribute CIF16 type parameter
2949 * for a given Video codec.
2950 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2951 * level The level to check for the attribute.
2952 * cap_num The capability number associated with the
2953 * attribute if any. If none, should be zero.
2954 * inst_num The attribute instance number to check.
2955 * Returns: CIF16 value.
2958 int32_t sdp_attr_get_fmtp_cif16 (sdp_t
*sdp_p
, uint16_t level
,
2959 uint8_t cap_num
, uint16_t inst_num
)
2964 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2966 if (attr_p
== NULL
) {
2967 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2968 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
2969 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
2971 sdp_p
->conf_p
->num_invalid_param
++;
2972 return (SDP_INVALID_VALUE
);
2974 return (attr_p
->attr
.fmtp
.cif16
);
2979 /* Function: sdp_attr_get_fmtp_maxbr
2980 * Description: Gets the value of the fmtp attribute MAXBR type parameter
2981 * for a given Video codec.
2982 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
2983 * level The level to check for the attribute.
2984 * cap_num The capability number associated with the
2985 * attribute if any. If none, should be zero.
2986 * inst_num The attribute instance number to check.
2987 * Returns: MAXBR value.
2989 int32_t sdp_attr_get_fmtp_maxbr (sdp_t
*sdp_p
, uint16_t level
,
2990 uint8_t cap_num
, uint16_t inst_num
)
2995 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
2997 if (attr_p
== NULL
) {
2998 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
2999 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3000 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3002 sdp_p
->conf_p
->num_invalid_param
++;
3003 return (SDP_INVALID_VALUE
);
3005 return (attr_p
->attr
.fmtp
.maxbr
);
3009 /* Function: sdp_attr_get_fmtp_custom_x
3010 * Description: Gets the value of the fmtp attribute CUSTOM type parameter
3011 * for a given Video codec.
3012 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3013 * level The level to check for the attribute.
3014 * cap_num The capability number associated with the
3015 * attribute if any. If none, should be zero.
3016 * inst_num The attribute instance number to check.
3017 * Returns: CUSTOM x value.
3020 int32_t sdp_attr_get_fmtp_custom_x (sdp_t
*sdp_p
, uint16_t level
,
3021 uint8_t cap_num
, uint16_t inst_num
)
3026 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3028 if (attr_p
== NULL
) {
3029 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3030 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3031 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3033 sdp_p
->conf_p
->num_invalid_param
++;
3034 return (SDP_INVALID_VALUE
);
3036 return (attr_p
->attr
.fmtp
.custom_x
);
3039 /* Function: sdp_attr_get_fmtp_custom_y
3040 * Description: Gets the value of the fmtp attribute custom_y type parameter
3041 * for a given Video codec.
3042 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3043 * level The level to check for the attribute.
3044 * cap_num The capability number associated with the
3045 * attribute if any. If none, should be zero.
3046 * inst_num The attribute instance number to check.
3047 * Returns: CUSTOM Y-AXIS value.
3050 int32_t sdp_attr_get_fmtp_custom_y (sdp_t
*sdp_p
, uint16_t level
,
3051 uint8_t cap_num
, uint16_t inst_num
)
3056 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3058 if (attr_p
== NULL
) {
3059 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3060 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3061 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3063 sdp_p
->conf_p
->num_invalid_param
++;
3064 return (SDP_INVALID_VALUE
);
3066 return (attr_p
->attr
.fmtp
.custom_y
);
3070 /* Function: sdp_attr_get_fmtp_custom_mpi
3071 * Description: Gets the value of the fmtp attribute CUSTOM type parameter
3072 * for a given Video codec.
3073 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3074 * level The level to check for the attribute.
3075 * cap_num The capability number associated with the
3076 * attribute if any. If none, should be zero.
3077 * inst_num The attribute instance number to check.
3078 * Returns: CUSTOM MPI value.
3081 int32_t sdp_attr_get_fmtp_custom_mpi (sdp_t
*sdp_p
, uint16_t level
,
3082 uint8_t cap_num
, uint16_t inst_num
)
3087 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3089 if (attr_p
== NULL
) {
3090 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3091 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3092 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3094 sdp_p
->conf_p
->num_invalid_param
++;
3095 return (SDP_INVALID_VALUE
);
3097 return (attr_p
->attr
.fmtp
.custom_mpi
);
3101 /* Function: sdp_attr_get_fmtp_par_width
3102 * Description: Gets the value of the fmtp attribute PAR (width) parameter
3103 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3104 * level The level to check for the attribute.
3105 * cap_num The capability number associated with the
3106 * attribute if any. If none, should be zero.
3107 * inst_num The attribute instance number to check.
3108 * Returns: PAR - width value.
3110 int32_t sdp_attr_get_fmtp_par_width (sdp_t
*sdp_p
, uint16_t level
,
3111 uint8_t cap_num
, uint16_t inst_num
)
3116 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3118 if (attr_p
== NULL
) {
3119 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3120 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3121 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3123 sdp_p
->conf_p
->num_invalid_param
++;
3124 return (SDP_INVALID_VALUE
);
3126 return (attr_p
->attr
.fmtp
.par_width
);
3130 /* Function: sdp_attr_get_fmtp_par_height
3131 * Description: Gets the value of the fmtp attribute PAR (height) parameter
3132 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3133 * level The level to check for the attribute.
3134 * cap_num The capability number associated with the
3135 * attribute if any. If none, should be zero.
3136 * inst_num The attribute instance number to check.
3137 * Returns: PAR - height value.
3139 int32_t sdp_attr_get_fmtp_par_height (sdp_t
*sdp_p
, uint16_t level
,
3140 uint8_t cap_num
, uint16_t inst_num
)
3145 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3147 if (attr_p
== NULL
) {
3148 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3149 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3150 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3152 sdp_p
->conf_p
->num_invalid_param
++;
3153 return (SDP_INVALID_VALUE
);
3155 return (attr_p
->attr
.fmtp
.par_height
);
3159 /* Function: sdp_attr_get_fmtp_cpcf
3160 * Description: Gets the value of the fmtp attribute- CPCF parameter
3161 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3162 * level The level to check for the attribute.
3163 * cap_num The capability number associated with the
3164 * attribute if any. If none, should be zero.
3165 * inst_num The attribute instance number to check.
3166 * Returns: CPCF value.
3168 int32_t sdp_attr_get_fmtp_cpcf (sdp_t
*sdp_p
, uint16_t level
,
3169 uint8_t cap_num
, uint16_t inst_num
)
3174 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3176 if (attr_p
== NULL
) {
3177 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3178 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3179 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3181 sdp_p
->conf_p
->num_invalid_param
++;
3182 return (SDP_INVALID_VALUE
);
3184 return (attr_p
->attr
.fmtp
.cpcf
);
3188 /* Function: sdp_attr_get_fmtp_bpp
3189 * Description: Gets the value of the fmtp attribute- BPP parameter
3190 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3191 * level The level to check for the attribute.
3192 * cap_num The capability number associated with the
3193 * attribute if any. If none, should be zero.
3194 * inst_num The attribute instance number to check.
3195 * Returns: BPP value.
3197 int32_t sdp_attr_get_fmtp_bpp (sdp_t
*sdp_p
, uint16_t level
,
3198 uint8_t cap_num
, uint16_t inst_num
)
3203 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3205 if (attr_p
== NULL
) {
3206 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3207 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3208 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3210 sdp_p
->conf_p
->num_invalid_param
++;
3211 return (SDP_INVALID_VALUE
);
3213 return (attr_p
->attr
.fmtp
.bpp
);
3217 /* Function: sdp_attr_get_fmtp_hrd
3218 * Description: Gets the value of the fmtp attribute- HRD parameter
3219 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3220 * level The level to check for the attribute.
3221 * cap_num The capability number associated with the
3222 * attribute if any. If none, should be zero.
3223 * inst_num The attribute instance number to check.
3224 * Returns: HRD value.
3226 int32_t sdp_attr_get_fmtp_hrd (sdp_t
*sdp_p
, uint16_t level
,
3227 uint8_t cap_num
, uint16_t inst_num
)
3232 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3234 if (attr_p
== NULL
) {
3235 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3236 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3237 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3239 sdp_p
->conf_p
->num_invalid_param
++;
3240 return (SDP_INVALID_VALUE
);
3242 return (attr_p
->attr
.fmtp
.hrd
);
3246 /* Function: sdp_attr_get_fmtp_profile
3247 * Description: Gets the value of the fmtp attribute- PROFILE parameter
3248 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3249 * level The level to check for the attribute.
3250 * cap_num The capability number associated with the
3251 * attribute if any. If none, should be zero.
3252 * inst_num The attribute instance number to check.
3253 * Returns: PROFILE value.
3255 int32_t sdp_attr_get_fmtp_profile (sdp_t
*sdp_p
, uint16_t level
,
3256 uint8_t cap_num
, uint16_t inst_num
)
3261 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3263 if (attr_p
== NULL
) {
3264 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3265 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3266 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3268 sdp_p
->conf_p
->num_invalid_param
++;
3269 return (SDP_INVALID_VALUE
);
3271 return (attr_p
->attr
.fmtp
.profile
);
3275 /* Function: sdp_attr_get_fmtp_level
3276 * Description: Gets the value of the fmtp attribute- LEVEL parameter
3277 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3278 * level The level to check for the attribute.
3279 * cap_num The capability number associated with the
3280 * attribute if any. If none, should be zero.
3281 * inst_num The attribute instance number to check.
3282 * Returns: LEVEL value.
3284 int32_t sdp_attr_get_fmtp_level (sdp_t
*sdp_p
, uint16_t level
,
3285 uint8_t cap_num
, uint16_t inst_num
)
3290 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3292 if (attr_p
== NULL
) {
3293 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3294 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3295 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3297 sdp_p
->conf_p
->num_invalid_param
++;
3298 return (SDP_INVALID_VALUE
);
3300 return (attr_p
->attr
.fmtp
.level
);
3304 /* Function: sdp_attr_get_fmtp_interlace
3305 * Description: Checks if INTERLACE parameter is set.
3306 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3307 * level The level to check for the attribute.
3308 * cap_num The capability number associated with the
3309 * attribute if any. If none, should be zero.
3310 * inst_num The attribute instance number to check.
3311 * Returns: TRUE if INTERLACE is present and FALSE if INTERLACE is absent.
3313 tinybool
sdp_attr_get_fmtp_interlace (sdp_t
*sdp_p
, uint16_t level
,
3314 uint8_t cap_num
, uint16_t inst_num
)
3319 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3321 if (attr_p
== NULL
) {
3322 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3323 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3324 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3326 sdp_p
->conf_p
->num_invalid_param
++;
3329 return (attr_p
->attr
.fmtp
.is_interlace
);
3333 /* Function: sdp_attr_get_fmtp_pack_mode
3334 * Description: Gets the value of the fmtp attribute- packetization-mode parameter for H.264 codec
3335 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3336 * level The level to check for the attribute.
3337 * cap_num The capability number associated with the
3338 * attribute if any. If none, should be zero.
3339 * inst_num The attribute instance number to check.
3340 * Returns: packetization-mode value in the range 0 - 2.
3343 sdp_result_e
sdp_attr_get_fmtp_pack_mode (sdp_t
*sdp_p
, uint16_t level
,
3344 uint8_t cap_num
, uint16_t inst_num
, uint16_t *val
)
3349 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3351 if (attr_p
== NULL
) {
3352 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3353 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3354 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3356 sdp_p
->conf_p
->num_invalid_param
++;
3357 return (SDP_INVALID_PARAMETER
);
3359 if (SDP_INVALID_PACKETIZATION_MODE_VALUE
== attr_p
->attr
.fmtp
.packetization_mode
) {
3360 /* packetization mode unspecified (optional) */
3361 *val
= SDP_DEFAULT_PACKETIZATION_MODE_VALUE
;
3363 *val
= attr_p
->attr
.fmtp
.packetization_mode
;
3365 return (SDP_SUCCESS
);
3369 /* Function: sdp_attr_get_fmtp_level_asymmetry_allowed
3370 * Description: Gets the value of the fmtp attribute- level-asymmetry-allowed parameter for H.264 codec
3371 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3372 * level The level to check for the attribute.
3373 * cap_num The capability number associated with the
3374 * attribute if any. If none, should be zero.
3375 * inst_num The attribute instance number to check.
3376 * Returns: level asymmetry allowed value (0 or 1).
3379 sdp_result_e
sdp_attr_get_fmtp_level_asymmetry_allowed (sdp_t
*sdp_p
, uint16_t level
,
3380 uint8_t cap_num
, uint16_t inst_num
, uint16_t *val
)
3385 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3387 if (attr_p
== NULL
) {
3388 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3389 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3390 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3392 sdp_p
->conf_p
->num_invalid_param
++;
3393 return (SDP_INVALID_PARAMETER
);
3395 *val
= attr_p
->attr
.fmtp
.level_asymmetry_allowed
;
3396 return (SDP_SUCCESS
);
3400 /* Function: sdp_attr_get_fmtp_profile_id
3401 * Description: Gets the value of the fmtp attribute- profile-level-id parameter for H.264 codec
3402 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3403 * level The level to check for the attribute.
3404 * cap_num The capability number associated with the
3405 * attribute if any. If none, should be zero.
3406 * inst_num The attribute instance number to check.
3407 * Returns: profile-level-id value.
3409 const char* sdp_attr_get_fmtp_profile_id (sdp_t
*sdp_p
, uint16_t level
,
3410 uint8_t cap_num
, uint16_t inst_num
)
3415 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3417 if (attr_p
== NULL
) {
3418 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3419 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3420 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3422 sdp_p
->conf_p
->num_invalid_param
++;
3425 return (attr_p
->attr
.fmtp
.profile_level_id
);
3429 /* Function: sdp_attr_get_fmtp_param_sets
3430 * Description: Gets the value of the fmtp attribute- parameter-sets parameter for H.264 codec
3431 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3432 * level The level to check for the attribute.
3433 * cap_num The capability number associated with the
3434 * attribute if any. If none, should be zero.
3435 * inst_num The attribute instance number to check.
3436 * Returns: parameter-sets value.
3438 const char* sdp_attr_get_fmtp_param_sets (sdp_t
*sdp_p
, uint16_t level
,
3439 uint8_t cap_num
, uint16_t inst_num
)
3444 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3446 if (attr_p
== NULL
) {
3447 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3448 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3449 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3451 sdp_p
->conf_p
->num_invalid_param
++;
3454 return (attr_p
->attr
.fmtp
.parameter_sets
);
3458 /* Function: sdp_attr_get_fmtp_interleaving_depth
3459 * Description: Gets the value of the fmtp attribute- interleaving_depth parameter for H.264 codec
3460 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3461 * level The level to check for the attribute.
3462 * cap_num The capability number associated with the
3463 * attribute if any. If none, should be zero.
3464 * inst_num The attribute instance number to check.
3465 * Returns: interleaving_depth value
3468 sdp_result_e
sdp_attr_get_fmtp_interleaving_depth (sdp_t
*sdp_p
, uint16_t level
,
3469 uint8_t cap_num
, uint16_t inst_num
, uint16_t* val
)
3473 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3475 if (attr_p
== NULL
) {
3476 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3477 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3478 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3480 sdp_p
->conf_p
->num_invalid_param
++;
3481 return (SDP_INVALID_PARAMETER
);
3483 *val
= attr_p
->attr
.fmtp
.interleaving_depth
;
3484 return (SDP_SUCCESS
);
3488 /* Function: sdp_attr_get_fmtp_deint_buf_req
3489 * Description: Gets the value of the fmtp attribute- deint-buf-req parameter for H.264 codec
3490 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3491 * level The level to check for the attribute.
3492 * cap_num The capability number associated with the
3493 * attribute if any. If none, should be zero.
3494 * inst_num The attribute instance number to check.
3495 * Returns: deint-buf-req value.
3498 sdp_result_e
sdp_attr_get_fmtp_deint_buf_req (sdp_t
*sdp_p
, uint16_t level
,
3499 uint8_t cap_num
, uint16_t inst_num
,
3504 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3506 if (attr_p
== NULL
) {
3507 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3508 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3509 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3511 sdp_p
->conf_p
->num_invalid_param
++;
3512 return (SDP_INVALID_PARAMETER
);
3514 if (attr_p
->attr
.fmtp
.flag
& SDP_DEINT_BUF_REQ_FLAG
) {
3515 *val
= attr_p
->attr
.fmtp
.deint_buf_req
;
3516 return (SDP_SUCCESS
);
3518 return (SDP_FAILURE
);
3523 /* Function: sdp_attr_get_fmtp_max_don_diff
3524 * Description: Gets the value of the fmtp attribute- max-don-diff parameter for H.264 codec
3525 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3526 * level The level to check for the attribute.
3527 * cap_num The capability number associated with the
3528 * attribute if any. If none, should be zero.
3529 * inst_num The attribute instance number to check.
3530 * Returns: max-don-diff value.
3532 sdp_result_e
sdp_attr_get_fmtp_max_don_diff (sdp_t
*sdp_p
, uint16_t level
,
3533 uint8_t cap_num
, uint16_t inst_num
,
3538 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3540 if (attr_p
== NULL
) {
3541 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3542 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3543 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3545 sdp_p
->conf_p
->num_invalid_param
++;
3546 return (SDP_INVALID_PARAMETER
);
3548 *val
= attr_p
->attr
.fmtp
.max_don_diff
;
3549 return (SDP_SUCCESS
);
3553 /* Function: sdp_attr_get_fmtp_init_buf_time
3554 * Description: Gets the value of the fmtp attribute- init-buf-time parameter for H.264 codec
3555 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3556 * level The level to check for the attribute.
3557 * cap_num The capability number associated with the
3558 * attribute if any. If none, should be zero.
3559 * inst_num The attribute instance number to check.
3560 * Returns: init-buf-time value.
3562 sdp_result_e
sdp_attr_get_fmtp_init_buf_time (sdp_t
*sdp_p
, uint16_t level
,
3563 uint8_t cap_num
, uint16_t inst_num
,
3568 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3570 if (attr_p
== NULL
) {
3571 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3572 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3573 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3575 sdp_p
->conf_p
->num_invalid_param
++;
3576 return (SDP_INVALID_PARAMETER
);
3578 if (attr_p
->attr
.fmtp
.flag
& SDP_INIT_BUF_TIME_FLAG
) {
3579 *val
= attr_p
->attr
.fmtp
.init_buf_time
;
3580 return (SDP_SUCCESS
);
3582 return (SDP_FAILURE
);
3587 /* Function: sdp_attr_get_fmtp_max_mbps
3588 * Description: Gets the value of the fmtp attribute- max-mbps parameter for H.264 codec
3589 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3590 * level The level to check for the attribute.
3591 * cap_num The capability number associated with the
3592 * attribute if any. If none, should be zero.
3593 * inst_num The attribute instance number to check.
3594 * Returns: max-mbps value.
3597 sdp_result_e
sdp_attr_get_fmtp_max_mbps (sdp_t
*sdp_p
, uint16_t level
,
3598 uint8_t cap_num
, uint16_t inst_num
,
3603 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3605 if (attr_p
== NULL
) {
3606 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3607 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3608 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3610 sdp_p
->conf_p
->num_invalid_param
++;
3611 return (SDP_INVALID_PARAMETER
);
3613 *val
= attr_p
->attr
.fmtp
.max_mbps
;
3614 return (SDP_SUCCESS
);
3618 /* Function: sdp_attr_get_fmtp_max_fs
3619 * Description: Gets the value of the fmtp attribute- max-fs parameter for H.264 codec
3620 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3621 * level The level to check for the attribute.
3622 * cap_num The capability number associated with the
3623 * attribute if any. If none, should be zero.
3624 * inst_num The attribute instance number to check.
3625 * Returns: max-fs value.
3628 sdp_result_e
sdp_attr_get_fmtp_max_fs (sdp_t
*sdp_p
, uint16_t level
,
3629 uint8_t cap_num
, uint16_t inst_num
, uint32_t *val
)
3633 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3635 if (attr_p
== NULL
) {
3636 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3637 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3638 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3640 sdp_p
->conf_p
->num_invalid_param
++;
3641 return (SDP_INVALID_PARAMETER
);
3643 *val
= attr_p
->attr
.fmtp
.max_fs
;
3644 return (SDP_SUCCESS
);
3648 /* Function: sdp_attr_get_fmtp_max_fr
3649 * Description: Gets the value of the fmtp attribute- max-fr parameter
3650 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3651 * level The level to check for the attribute.
3652 * cap_num The capability number associated with the
3653 * attribute if any. If none, should be zero.
3654 * inst_num The attribute instance number to check.
3655 * Returns: max-fr value.
3658 sdp_result_e
sdp_attr_get_fmtp_max_fr (sdp_t
*sdp_p
, uint16_t level
,
3659 uint8_t cap_num
, uint16_t inst_num
, uint32_t *val
)
3663 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3665 if (attr_p
== NULL
) {
3666 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3667 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3668 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3670 sdp_p
->conf_p
->num_invalid_param
++;
3671 return (SDP_INVALID_PARAMETER
);
3673 *val
= attr_p
->attr
.fmtp
.max_fr
;
3674 return (SDP_SUCCESS
);
3678 /* Function: sdp_attr_get_fmtp_max_cpb
3679 * Description: Gets the value of the fmtp attribute- max-cpb parameter for H.264 codec
3680 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3681 * level The level to check for the attribute.
3682 * cap_num The capability number associated with the
3683 * attribute if any. If none, should be zero.
3684 * inst_num The attribute instance number to check.
3685 * Returns: max-cpb value.
3688 sdp_result_e
sdp_attr_get_fmtp_max_cpb (sdp_t
*sdp_p
, uint16_t level
,
3689 uint8_t cap_num
, uint16_t inst_num
, uint32_t *val
)
3693 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3695 if (attr_p
== NULL
) {
3696 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3697 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3698 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3700 sdp_p
->conf_p
->num_invalid_param
++;
3701 return (SDP_INVALID_PARAMETER
);
3703 *val
= attr_p
->attr
.fmtp
.max_cpb
;
3704 return (SDP_SUCCESS
);
3708 /* Function: sdp_attr_get_fmtp_max_dpb
3709 * Description: Gets the value of the fmtp attribute- max-dpb parameter for H.264 codec
3710 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3711 * level The level to check for the attribute.
3712 * cap_num The capability number associated with the
3713 * attribute if any. If none, should be zero.
3714 * inst_num The attribute instance number to check.
3715 * Returns: max-dpb value.
3718 sdp_result_e
sdp_attr_get_fmtp_max_dpb (sdp_t
*sdp_p
, uint16_t level
,
3719 uint8_t cap_num
, uint16_t inst_num
, uint32_t *val
)
3723 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3725 if (attr_p
== NULL
) {
3726 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3727 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3728 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3730 sdp_p
->conf_p
->num_invalid_param
++;
3731 return (SDP_INVALID_PARAMETER
);
3733 *val
= attr_p
->attr
.fmtp
.max_dpb
;
3734 return (SDP_SUCCESS
);
3739 /* Function: sdp_attr_get_fmtp_max_br
3740 * Description: Gets the value of the fmtp attribute- max-br parameter for H.264 codec
3741 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3742 * level The level to check for the attribute.
3743 * cap_num The capability number associated with the
3744 * attribute if any. If none, should be zero.
3745 * inst_num The attribute instance number to check.
3746 * Returns: max-br value.
3749 sdp_result_e
sdp_attr_get_fmtp_max_br (sdp_t
*sdp_p
, uint16_t level
,
3750 uint8_t cap_num
, uint16_t inst_num
, uint32_t* val
)
3754 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3756 if (attr_p
== NULL
) {
3757 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3758 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3759 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3761 sdp_p
->conf_p
->num_invalid_param
++;
3762 return (SDP_INVALID_PARAMETER
);
3764 *val
= attr_p
->attr
.fmtp
.max_br
;
3765 return (SDP_SUCCESS
);
3769 /* Function: sdp_attr_fmtp_is_redundant_pic_cap
3770 * Description: Gets the value of the fmtp attribute- redundant_pic_cap parameter for H.264 codec
3771 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3772 * level The level to check for the attribute.
3773 * cap_num The capability number associated with the
3774 * attribute if any. If none, should be zero.
3775 * inst_num The attribute instance number to check.
3776 * Returns: redundant-pic-cap value.
3778 tinybool
sdp_attr_fmtp_is_redundant_pic_cap (sdp_t
*sdp_p
, uint16_t level
,
3779 uint8_t cap_num
, uint16_t inst_num
)
3784 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3786 if (attr_p
== NULL
) {
3787 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3788 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3789 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3791 sdp_p
->conf_p
->num_invalid_param
++;
3794 return (attr_p
->attr
.fmtp
.redundant_pic_cap
);
3798 /* Function: sdp_attr_get_fmtp_deint_buf_cap
3799 * Description: Gets the value of the fmtp attribute- deint-buf-cap parameter for H.264 codec
3800 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3801 * level The level to check for the attribute.
3802 * cap_num The capability number associated with the
3803 * attribute if any. If none, should be zero.
3804 * inst_num The attribute instance number to check.
3805 * Returns: deint-buf-cap value.
3808 sdp_result_e
sdp_attr_get_fmtp_deint_buf_cap (sdp_t
*sdp_p
, uint16_t level
,
3809 uint8_t cap_num
, uint16_t inst_num
,
3815 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3817 if (attr_p
== NULL
) {
3818 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3819 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3820 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3822 sdp_p
->conf_p
->num_invalid_param
++;
3823 return (SDP_INVALID_PARAMETER
);
3825 if (attr_p
->attr
.fmtp
.flag
& SDP_DEINT_BUF_CAP_FLAG
) {
3826 *val
= attr_p
->attr
.fmtp
.deint_buf_cap
;
3827 return (SDP_SUCCESS
);
3829 return (SDP_FAILURE
);
3834 /* Function: sdp_attr_get_fmtp_max_rcmd_nalu_size
3835 * Description: Gets the value of the fmtp attribute- max-rcmd-nalu-size parameter for H.264 codec
3836 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3837 * level The level to check for the attribute.
3838 * cap_num The capability number associated with the
3839 * attribute if any. If none, should be zero.
3840 * inst_num The attribute instance number to check.
3841 * Returns: max-rcmd-nalu-size value.
3843 sdp_result_e
sdp_attr_get_fmtp_max_rcmd_nalu_size (sdp_t
*sdp_p
, uint16_t level
,
3844 uint8_t cap_num
, uint16_t inst_num
,
3850 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3852 if (attr_p
== NULL
) {
3853 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3854 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3855 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3857 sdp_p
->conf_p
->num_invalid_param
++;
3858 return (SDP_INVALID_PARAMETER
);
3860 if (attr_p
->attr
.fmtp
.flag
& SDP_MAX_RCMD_NALU_SIZE_FLAG
) {
3861 *val
= attr_p
->attr
.fmtp
.max_rcmd_nalu_size
;
3862 return (SDP_SUCCESS
);
3864 return (SDP_FAILURE
);
3869 /* Function: sdp_attr_fmtp_is_parameter_add
3870 * Description: Gets the value of the fmtp attribute- parameter-add for H.264 codec
3871 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3872 * level The level to check for the attribute.
3873 * cap_num The capability number associated with the
3874 * attribute if any. If none, should be zero.
3875 * inst_num The attribute instance number to check.
3876 * Returns: TRUE/FALSE ( parameter-add is boolean)
3878 tinybool
sdp_attr_fmtp_is_parameter_add (sdp_t
*sdp_p
, uint16_t level
,
3879 uint8_t cap_num
, uint16_t inst_num
)
3884 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3886 if (attr_p
== NULL
) {
3887 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3888 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3889 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3891 sdp_p
->conf_p
->num_invalid_param
++;
3894 /* Both 1 and SDP_FMTP_UNUSED (parameter not present) should be
3895 * treated as TRUE, per RFC 3984, page 45 */
3896 return (attr_p
->attr
.fmtp
.parameter_add
!= 0);
3900 /****** Following functions are get routines for Annex values
3901 * For each Annex support, the get routine will return the boolean TRUE/FALSE
3902 * Some Annexures for Video codecs have values defined . In those cases,
3903 * (e.g Annex K, P ) , the return values are not boolean.
3905 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
3906 * level The level to check for the attribute.
3907 * cap_num The capability number associated with the
3908 * attribute if any. If none, should be zero.
3909 * inst_num The attribute instance number to check.
3910 * Returns: Annex value
3913 tinybool
sdp_attr_get_fmtp_annex_d (sdp_t
*sdp_p
, uint16_t level
,
3914 uint8_t cap_num
, uint16_t inst_num
)
3919 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3921 if (attr_p
== NULL
) {
3922 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3923 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3924 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3926 sdp_p
->conf_p
->num_invalid_param
++;
3929 return (attr_p
->attr
.fmtp
.annex_d
);
3933 tinybool
sdp_attr_get_fmtp_annex_f (sdp_t
*sdp_p
, uint16_t level
,
3934 uint8_t cap_num
, uint16_t inst_num
)
3939 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3941 if (attr_p
== NULL
) {
3942 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3943 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3944 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3946 sdp_p
->conf_p
->num_invalid_param
++;
3949 return (attr_p
->attr
.fmtp
.annex_f
);
3953 tinybool
sdp_attr_get_fmtp_annex_i (sdp_t
*sdp_p
, uint16_t level
,
3954 uint8_t cap_num
, uint16_t inst_num
)
3959 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3961 if (attr_p
== NULL
) {
3962 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3963 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3964 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3966 sdp_p
->conf_p
->num_invalid_param
++;
3969 return (attr_p
->attr
.fmtp
.annex_i
);
3973 tinybool
sdp_attr_get_fmtp_annex_j (sdp_t
*sdp_p
, uint16_t level
,
3974 uint8_t cap_num
, uint16_t inst_num
)
3979 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
3981 if (attr_p
== NULL
) {
3982 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
3983 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
3984 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
3986 sdp_p
->conf_p
->num_invalid_param
++;
3989 return (attr_p
->attr
.fmtp
.annex_j
);
3993 tinybool
sdp_attr_get_fmtp_annex_t (sdp_t
*sdp_p
, uint16_t level
,
3994 uint8_t cap_num
, uint16_t inst_num
)
3999 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
4001 if (attr_p
== NULL
) {
4002 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4003 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
4004 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4006 sdp_p
->conf_p
->num_invalid_param
++;
4009 return (attr_p
->attr
.fmtp
.annex_t
);
4013 int32_t sdp_attr_get_fmtp_annex_k_val (sdp_t
*sdp_p
, uint16_t level
,
4014 uint8_t cap_num
, uint16_t inst_num
)
4019 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
4021 if (attr_p
== NULL
) {
4022 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4023 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
4024 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4026 sdp_p
->conf_p
->num_invalid_param
++;
4027 return (SDP_INVALID_VALUE
);
4029 return (attr_p
->attr
.fmtp
.annex_k_val
);
4033 int32_t sdp_attr_get_fmtp_annex_n_val (sdp_t
*sdp_p
, uint16_t level
,
4034 uint8_t cap_num
, uint16_t inst_num
)
4039 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
4041 if (attr_p
== NULL
) {
4042 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4043 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
4044 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4046 sdp_p
->conf_p
->num_invalid_param
++;
4047 return (SDP_INVALID_VALUE
);
4049 return (attr_p
->attr
.fmtp
.annex_n_val
);
4053 int32_t sdp_attr_get_fmtp_annex_p_picture_resize (sdp_t
*sdp_p
, uint16_t level
,
4054 uint8_t cap_num
, uint16_t inst_num
)
4060 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
4062 if (attr_p
== NULL
) {
4063 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4064 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
4065 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4067 sdp_p
->conf_p
->num_invalid_param
++;
4068 return (SDP_INVALID_VALUE
);
4070 return (attr_p
->attr
.fmtp
.annex_p_val_picture_resize
);
4074 int32_t sdp_attr_get_fmtp_annex_p_warp (sdp_t
*sdp_p
, uint16_t level
,
4075 uint8_t cap_num
, uint16_t inst_num
)
4080 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
4082 if (attr_p
== NULL
) {
4083 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4084 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
4085 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4087 sdp_p
->conf_p
->num_invalid_param
++;
4088 return (SDP_INVALID_VALUE
);
4090 return (attr_p
->attr
.fmtp
.annex_p_val_warp
);
4094 /* Function: sdp_attr_fmtp_get_fmtp_format
4095 * Description: Gives the value of the fmtp attribute fmtp_format
4097 * for the given attribute.
4098 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4099 * level The level to check for the attribute.
4100 * cap_num The capability number associated with the
4101 * attribute if any. If none, should be zero.
4102 * inst_num The attribute instance number to check.
4105 * Returns: Enum type sdp_fmtp_format_type_e
4107 sdp_fmtp_format_type_e
sdp_attr_fmtp_get_fmtp_format (sdp_t
*sdp_p
,
4108 uint16_t level
, uint8_t cap_num
,
4113 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_FMTP
,
4115 if (attr_p
== NULL
) {
4116 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4117 SDPLogError(logTag
, "%s fmtp attribute, level %u instance %u "
4118 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4120 sdp_p
->conf_p
->num_invalid_param
++;
4121 return (SDP_FMTP_UNKNOWN_TYPE
);
4123 return (attr_p
->attr
.fmtp
.fmtp_format
);
4127 /* Function: sdp_attr_get_pccodec_num_payload_types
4128 * Description: Returns the number of payload types specified for the
4129 * given X-pc-codec attribute. If the given attribute is not
4130 * defined, zero is returned.
4131 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4132 * level The level to check for the attribute.
4133 * cap_num The capability number associated with the
4134 * attribute if any. If none, should be zero.
4135 * inst_num The attribute instance number to check.
4136 * Returns: Number of payload types.
4138 uint16_t sdp_attr_get_pccodec_num_payload_types (sdp_t
*sdp_p
, uint16_t level
,
4139 uint8_t cap_num
, uint16_t inst_num
)
4143 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_X_PC_CODEC
,
4145 if (attr_p
== NULL
) {
4146 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4147 SDPLogError(logTag
, "%s X-pc-codec attribute, level %u instance %u "
4148 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4150 sdp_p
->conf_p
->num_invalid_param
++;
4153 return (attr_p
->attr
.pccodec
.num_payloads
);
4157 /* Function: sdp_attr_get_pccodec_payload_type
4158 * Description: Returns the value of the specified payload type for the
4159 * given X-pc-codec attribute. If the given attribute is not
4160 * defined, zero is returned.
4161 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4162 * level The level to check for the attribute.
4163 * cap_num The capability number associated with the
4164 * attribute if any. If none, should be zero.
4165 * inst_num The attribute instance number to check.
4166 * payload_num The payload number to get. Range is (1 -
4167 * max num payloads).
4168 * Returns: Payload type.
4170 uint16_t sdp_attr_get_pccodec_payload_type (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
4171 uint16_t inst_num
, uint16_t payload_num
)
4175 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_X_PC_CODEC
,
4177 if (attr_p
== NULL
) {
4178 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4179 SDPLogError(logTag
, "%s X-pc-codec attribute, level %u instance %u "
4180 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4182 sdp_p
->conf_p
->num_invalid_param
++;
4185 if ((payload_num
< 1) ||
4186 (payload_num
> attr_p
->attr
.pccodec
.num_payloads
)) {
4187 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4188 SDPLogError(logTag
, "%s X-pc-codec attribute, level %u instance %u, "
4189 "invalid payload number %u requested.",
4190 sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
, (unsigned)payload_num
);
4192 sdp_p
->conf_p
->num_invalid_param
++;
4195 return (attr_p
->attr
.pccodec
.payload_type
[payload_num
-1]);
4200 /* Function: sdp_attr_add_pccodec_payload_type
4201 * Description: Add a new value to the list of payload types specified for
4202 * the given X-pc-codec attribute. The payload type will be
4203 * added to the end of the list so these values should be added
4204 * in the order they will be displayed within the attribute.
4205 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4206 * level The level to check for the attribute.
4207 * cap_num The capability number associated with the
4208 * attribute if any. If none, should be zero.
4209 * inst_num The attribute instance number to check.
4210 * payload_type The payload type to add.
4211 * Returns: SDP_SUCCESS Payload type was added successfully.
4212 * SDP_INVALID_PARAMETER Specified attribute is not defined.
4214 sdp_result_e
sdp_attr_add_pccodec_payload_type (sdp_t
*sdp_p
, uint16_t level
,
4215 uint8_t cap_num
, uint16_t inst_num
,
4216 uint16_t payload_type
)
4218 uint16_t payload_num
;
4221 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_X_PC_CODEC
,
4223 if (attr_p
== NULL
) {
4224 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4225 SDPLogError(logTag
, "%s X-pc-codec attribute, level %u instance %u "
4226 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4228 sdp_p
->conf_p
->num_invalid_param
++;
4229 return (SDP_INVALID_PARAMETER
);
4231 payload_num
= attr_p
->attr
.pccodec
.num_payloads
++;
4232 attr_p
->attr
.pccodec
.payload_type
[payload_num
] = payload_type
;
4233 return (SDP_SUCCESS
);
4237 /* Function: sdp_attr_get_xcap_first_cap_num
4238 * Description: Gets the first capability number valid for the specified
4239 * X-cap attribute instance. If the capability is not
4240 * defined, zero is returned.
4241 * Note: cap_num is not specified. It must be zero.
4242 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4243 * level The level to check for the capability.
4244 * inst_num The X-cap instance number to check.
4245 * Returns: Capability number or zero.
4247 uint16_t sdp_attr_get_xcap_first_cap_num (sdp_t
*sdp_p
, uint16_t level
, uint16_t inst_num
)
4250 uint16_t attr_count
=0;
4254 if (level
== SDP_SESSION_LEVEL
) {
4255 for (attr_p
= sdp_p
->sess_attrs_p
; attr_p
!= NULL
;
4256 attr_p
= attr_p
->next_p
) {
4257 if (attr_p
->type
== SDP_ATTR_X_CAP
) {
4259 if (attr_count
== inst_num
) {
4262 cap_num
+= attr_p
->attr
.cap_p
->num_payloads
;
4266 } else { /* Capability is at a media level */
4267 mca_p
= sdp_find_media_level(sdp_p
, level
);
4268 if (mca_p
== NULL
) {
4269 sdp_p
->conf_p
->num_invalid_param
++;
4272 for (attr_p
= mca_p
->media_attrs_p
; attr_p
!= NULL
;
4273 attr_p
= attr_p
->next_p
) {
4274 if (attr_p
->type
== SDP_ATTR_X_CAP
) {
4276 if (attr_count
== inst_num
) {
4279 cap_num
+= attr_p
->attr
.cap_p
->num_payloads
;
4283 } /* Attr is at a media level */
4285 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4286 SDPLogError(logTag
, "%s X-cap attribute, level %u instance %u "
4287 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4289 sdp_p
->conf_p
->num_invalid_param
++;
4293 /* Function: sdp_attr_get_xcap_media_type
4294 * Description: Returns the media type specified for the given X-cap
4295 * attribute. If the given attribute is not defined,
4296 * SDP_MEDIA_INVALID is returned.
4297 * Note: cap_num is not specified. It must be zero.
4298 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4299 * level The level to check for the attribute.
4300 * inst_num The attribute instance number to check.
4301 * Returns: Media type or SDP_MEDIA_INVALID.
4303 sdp_media_e
sdp_attr_get_xcap_media_type (sdp_t
*sdp_p
, uint16_t level
,
4309 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_X_CAP
, inst_num
);
4310 if ((attr_p
== NULL
) || (attr_p
->attr
.cap_p
== NULL
)) {
4311 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4312 SDPLogError(logTag
, "%s X-cap attribute, level %u instance %u "
4313 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4315 sdp_p
->conf_p
->num_invalid_param
++;
4316 return (SDP_MEDIA_INVALID
);
4318 cap_p
= attr_p
->attr
.cap_p
;
4319 return (cap_p
->media
);
4323 /* Function: sdp_attr_get_xcap_transport_type
4324 * Description: Returns the transport type specified for the given X-cap
4325 * attribute. If the given attribute is not defined,
4326 * SDP_TRANSPORT_INVALID is returned.
4327 * Note: cap_num is not specified. It must be zero.
4328 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4329 * level The level to check for the attribute.
4330 * inst_num The attribute instance number to check.
4331 * Returns: Media type or SDP_TRANSPORT_INVALID.
4333 sdp_transport_e
sdp_attr_get_xcap_transport_type (sdp_t
*sdp_p
, uint16_t level
,
4339 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_X_CAP
,
4341 if ((attr_p
== NULL
) || (attr_p
->attr
.cap_p
== NULL
)) {
4342 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4343 SDPLogError(logTag
, "%s X-cap attribute, level %u instance %u "
4344 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4346 sdp_p
->conf_p
->num_invalid_param
++;
4347 return (SDP_TRANSPORT_INVALID
);
4349 cap_p
= attr_p
->attr
.cap_p
;
4350 return (cap_p
->transport
);
4354 /* Function: sdp_attr_get_xcap_num_payload_types
4355 * Description: Returns the number of payload types associated with the
4356 * specified X-cap attribute. If the attribute is invalid,
4357 * zero will be returned. Application must validate the
4358 * attribute line before using this routine.
4359 * Note: cap_num is not specified. It must be zero.
4360 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4361 * level The level to check for the attribute.
4362 * cap_num The capability number associated with the
4363 * attribute if any. If none, should be zero.
4364 * inst_num The attribute instance number to check.
4365 * Returns: Number of payload types or zero.
4367 uint16_t sdp_attr_get_xcap_num_payload_types (sdp_t
*sdp_p
, uint16_t level
,
4373 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_X_CAP
, inst_num
);
4374 if ((attr_p
== NULL
) || (attr_p
->attr
.cap_p
== NULL
)) {
4375 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4376 SDPLogError(logTag
, "%s X-cap attribute, level %u instance %u "
4377 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4379 sdp_p
->conf_p
->num_invalid_param
++;
4382 cap_p
= attr_p
->attr
.cap_p
;
4383 return (cap_p
->num_payloads
);
4387 /* Function: sdp_attr_get_xcap_payload_type
4388 * Description: Returns the payload type of the specified payload for the
4389 * X-cap attribute line. If the attr line or payload number is
4390 * invalid, zero will be returned. Application must validate
4391 * the X-cap attr before using this routine.
4392 * Note: cap_num is not specified. It must be zero.
4393 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4394 * level The level to check for the attribute.
4395 * inst_num The attribute instance number to check.
4396 * payload_num The payload number to retrieve. Range is
4397 * (1 - max num payloads).
4398 * Returns: Payload type or zero.
4400 uint16_t sdp_attr_get_xcap_payload_type (sdp_t
*sdp_p
, uint16_t level
,
4401 uint16_t inst_num
, uint16_t payload_num
,
4402 sdp_payload_ind_e
*indicator
)
4407 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_X_CAP
, inst_num
);
4408 if ((attr_p
== NULL
) || (attr_p
->attr
.cap_p
== NULL
)) {
4409 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4410 SDPLogError(logTag
, "%s X-cap attribute, level %u instance %u "
4411 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4413 sdp_p
->conf_p
->num_invalid_param
++;
4416 cap_p
= attr_p
->attr
.cap_p
;
4417 if ((payload_num
< 1) ||
4418 (payload_num
> cap_p
->num_payloads
)) {
4419 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4420 SDPLogError(logTag
, "%s X-cap attribute, level %u instance %u, "
4421 "payload num %u invalid.", sdp_p
->debug_str
,
4422 (unsigned)level
, (unsigned)inst_num
, (unsigned)payload_num
);
4424 sdp_p
->conf_p
->num_invalid_param
++;
4427 *indicator
= cap_p
->payload_indicator
[payload_num
-1];
4428 return (cap_p
->payload_type
[payload_num
-1]);
4434 /* Function: sdp_attr_add_xcap_payload_type
4435 * Description: Add a new payload type for the X-cap attribute line
4436 * specified. The new payload type will be added at the end
4437 * of the payload type list.
4438 * Note: cap_num is not specified. It must be zero.
4439 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4440 * level The level to check for the attribute.
4441 * inst_num The attribute instance number to check.
4442 * payload_type The new payload type.
4443 * Returns: SDP_SUCCESS or SDP_INVALID_PARAMETER
4445 sdp_result_e
sdp_attr_add_xcap_payload_type(sdp_t
*sdp_p
, uint16_t level
,
4446 uint16_t inst_num
, uint16_t payload_type
,
4447 sdp_payload_ind_e indicator
)
4452 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_X_CAP
, inst_num
);
4453 if ((attr_p
== NULL
) || (attr_p
->attr
.cap_p
== NULL
)) {
4454 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4455 SDPLogError(logTag
, "%s X-cap attribute, level %u instance %u "
4456 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4458 sdp_p
->conf_p
->num_invalid_param
++;
4459 return (SDP_INVALID_PARAMETER
);
4462 cap_p
= attr_p
->attr
.cap_p
;
4463 cap_p
->payload_indicator
[cap_p
->num_payloads
] = indicator
;
4464 cap_p
->payload_type
[cap_p
->num_payloads
++] = payload_type
;
4465 return (SDP_SUCCESS
);
4468 /* Function: sdp_attr_get_cdsc_first_cap_num
4469 * Description: Gets the first capability number valid for the specified
4470 * CDSC attribute instance. If the capability is not
4471 * defined, zero is returned.
4472 * Note: cap_num is not specified. It must be zero.
4473 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4474 * level The level to check for the capability.
4475 * inst_num The CDSC instance number to check.
4476 * Returns: Capability number or zero.
4478 uint16_t sdp_attr_get_cdsc_first_cap_num(sdp_t
*sdp_p
, uint16_t level
, uint16_t inst_num
)
4481 uint16_t attr_count
=0;
4485 if (level
== SDP_SESSION_LEVEL
) {
4486 for (attr_p
= sdp_p
->sess_attrs_p
; attr_p
!= NULL
;
4487 attr_p
= attr_p
->next_p
) {
4488 if (attr_p
->type
== SDP_ATTR_CDSC
) {
4490 if (attr_count
== inst_num
) {
4493 cap_num
+= attr_p
->attr
.cap_p
->num_payloads
;
4497 } else { /* Capability is at a media level */
4498 mca_p
= sdp_find_media_level(sdp_p
, level
);
4499 if (mca_p
== NULL
) {
4500 sdp_p
->conf_p
->num_invalid_param
++;
4503 for (attr_p
= mca_p
->media_attrs_p
; attr_p
!= NULL
;
4504 attr_p
= attr_p
->next_p
) {
4505 if (attr_p
->type
== SDP_ATTR_CDSC
) {
4507 if (attr_count
== inst_num
) {
4510 cap_num
+= attr_p
->attr
.cap_p
->num_payloads
;
4514 } /* Attr is at a media level */
4516 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4517 SDPLogError(logTag
, "%s CDSC attribute, level %u instance %u "
4518 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4520 sdp_p
->conf_p
->num_invalid_param
++;
4524 /* Function: sdp_attr_get_cdsc_media_type
4525 * Description: Returns the media type specified for the given CDSC
4526 * attribute. If the given attribute is not defined,
4527 * SDP_MEDIA_INVALID is returned.
4528 * Note: cap_num is not specified. It must be zero.
4529 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4530 * level The level to check for the attribute.
4531 * inst_num The attribute instance number to check.
4532 * Returns: Media type or SDP_MEDIA_INVALID.
4534 sdp_media_e
sdp_attr_get_cdsc_media_type(sdp_t
*sdp_p
, uint16_t level
,
4540 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_CDSC
, inst_num
);
4541 if ((attr_p
== NULL
) || (attr_p
->attr
.cap_p
== NULL
)) {
4542 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4543 SDPLogError(logTag
, "%s CDSC attribute, level %u instance %u "
4544 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4546 sdp_p
->conf_p
->num_invalid_param
++;
4547 return (SDP_MEDIA_INVALID
);
4549 cdsc_p
= attr_p
->attr
.cap_p
;
4550 return (cdsc_p
->media
);
4554 /* Function: sdp_attr_get_cdsc_transport_type
4555 * Description: Returns the transport type specified for the given CDSC
4556 * attribute. If the given attribute is not defined,
4557 * SDP_TRANSPORT_INVALID is returned.
4558 * Note: cap_num is not specified. It must be zero.
4559 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4560 * level The level to check for the attribute.
4561 * inst_num The attribute instance number to check.
4562 * Returns: Media type or SDP_TRANSPORT_INVALID.
4564 sdp_transport_e
sdp_attr_get_cdsc_transport_type(sdp_t
*sdp_p
, uint16_t level
,
4570 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_CDSC
,
4572 if ((attr_p
== NULL
) || (attr_p
->attr
.cap_p
== NULL
)) {
4573 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4574 SDPLogError(logTag
, "%s CDSC attribute, level %u instance %u "
4575 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4577 sdp_p
->conf_p
->num_invalid_param
++;
4578 return (SDP_TRANSPORT_INVALID
);
4580 cdsc_p
= attr_p
->attr
.cap_p
;
4581 return (cdsc_p
->transport
);
4585 /* Function: sdp_attr_get_cdsc_num_payload_types
4586 * Description: Returns the number of payload types associated with the
4587 * specified CDSC attribute. If the attribute is invalid,
4588 * zero will be returned. Application must validate the
4589 * attribute line before using this routine.
4590 * Note: cap_num is not specified. It must be zero.
4591 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4592 * level The level to check for the attribute.
4593 * cap_num The capability number associated with the
4594 * attribute if any. If none, should be zero.
4595 * inst_num The attribute instance number to check.
4596 * Returns: Number of payload types or zero.
4598 uint16_t sdp_attr_get_cdsc_num_payload_types (sdp_t
*sdp_p
, uint16_t level
,
4604 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_CDSC
, inst_num
);
4605 if ((attr_p
== NULL
) || (attr_p
->attr
.cap_p
== NULL
)) {
4606 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4607 SDPLogError(logTag
, "%s CDSC attribute, level %u instance %u "
4608 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4610 sdp_p
->conf_p
->num_invalid_param
++;
4613 cdsc_p
= attr_p
->attr
.cap_p
;
4614 return (cdsc_p
->num_payloads
);
4618 /* Function: sdp_attr_get_cdsc_payload_type
4619 * Description: Returns the payload type of the specified payload for the
4620 * CDSC attribute line. If the attr line or payload number is
4621 * invalid, zero will be returned. Application must validate
4622 * the CDSC attr before using this routine.
4623 * Note: cap_num is not specified. It must be zero.
4624 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4625 * level The level to check for the attribute.
4626 * inst_num The attribute instance number to check.
4627 * payload_num The payload number to retrieve. Range is
4628 * (1 - max num payloads).
4629 * Returns: Payload type or zero.
4631 uint16_t sdp_attr_get_cdsc_payload_type (sdp_t
*sdp_p
, uint16_t level
,
4632 uint16_t inst_num
, uint16_t payload_num
,
4633 sdp_payload_ind_e
*indicator
)
4638 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_CDSC
, inst_num
);
4639 if ((attr_p
== NULL
) || (attr_p
->attr
.cap_p
== NULL
)) {
4640 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4641 SDPLogError(logTag
, "%s CDSC attribute, level %u instance %u "
4642 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4644 sdp_p
->conf_p
->num_invalid_param
++;
4647 cdsc_p
= attr_p
->attr
.cap_p
;
4648 if ((payload_num
< 1) ||
4649 (payload_num
> cdsc_p
->num_payloads
)) {
4650 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4651 SDPLogError(logTag
, "%s CDSC attribute, level %u instance %u, "
4652 "payload num %u invalid.", sdp_p
->debug_str
,
4653 (unsigned)level
, (unsigned)inst_num
, (unsigned)payload_num
);
4655 sdp_p
->conf_p
->num_invalid_param
++;
4658 *indicator
= cdsc_p
->payload_indicator
[payload_num
-1];
4659 return (cdsc_p
->payload_type
[payload_num
-1]);
4664 /* Function: sdp_attr_add_cdsc_payload_type
4665 * Description: Add a new payload type for the CDSC attribute line
4666 * specified. The new payload type will be added at the end
4667 * of the payload type list.
4668 * Note: cap_num is not specified. It must be zero.
4669 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4670 * level The level to check for the attribute.
4671 * inst_num The attribute instance number to check.
4672 * payload_type The new payload type.
4673 * Returns: SDP_SUCCESS or SDP_INVALID_PARAMETER
4675 sdp_result_e
sdp_attr_add_cdsc_payload_type (sdp_t
*sdp_p
, uint16_t level
,
4676 uint16_t inst_num
, uint16_t payload_type
,
4677 sdp_payload_ind_e indicator
)
4682 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_CDSC
, inst_num
);
4683 if ((attr_p
== NULL
) || (attr_p
->attr
.cap_p
== NULL
)) {
4684 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4685 SDPLogError(logTag
, "%s CDSC attribute, level %u instance %u "
4686 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4688 sdp_p
->conf_p
->num_invalid_param
++;
4689 return (SDP_INVALID_PARAMETER
);
4692 cdsc_p
= attr_p
->attr
.cap_p
;
4693 cdsc_p
->payload_indicator
[cdsc_p
->num_payloads
] = indicator
;
4694 cdsc_p
->payload_type
[cdsc_p
->num_payloads
++] = payload_type
;
4695 return (SDP_SUCCESS
);
4698 /* Function: sdp_media_dynamic_payload_valid
4699 * Description: Checks if the dynamic payload type passed in is defined
4700 * on the media line m_line
4701 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4702 * payload_type Payload type to be checked
4704 * Returns: TRUE or FALSE. Returns TRUE if payload type is defined on the
4705 * media line, else returns FALSE
4708 tinybool
sdp_media_dynamic_payload_valid (sdp_t
*sdp_p
, uint16_t payload_type
,
4711 uint16_t p_type
,m_ptype
;
4712 ushort num_payload_types
;
4713 sdp_payload_ind_e ind
;
4714 tinybool payload_matches
= FALSE
;
4715 tinybool result
= TRUE
;
4717 if ((payload_type
< SDP_MIN_DYNAMIC_PAYLOAD
) ||
4718 (payload_type
> SDP_MAX_DYNAMIC_PAYLOAD
)) {
4723 sdp_get_media_num_payload_types(sdp_p
, m_line
);
4725 for(p_type
=1; p_type
<=num_payload_types
;p_type
++){
4727 m_ptype
= (uint16_t)sdp_get_media_payload_type(sdp_p
,
4728 m_line
, p_type
, &ind
);
4729 if (payload_type
== m_ptype
) {
4730 payload_matches
= TRUE
;
4736 if (!payload_matches
) {
4744 /* Function: sdp_attr_get_rtr_confirm
4745 * Description: Returns the value of the rtr attribute confirm
4746 * parameter specified for the given attribute. Returns TRUE if
4747 * the confirm parameter is specified.
4748 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4749 * level The level to check for the attribute.
4750 * cap_num The capability number associated with the
4751 * attribute if any. If none, should be zero.
4752 * inst_num The attribute instance number to check.
4753 * Returns: Boolean value.
4755 tinybool
sdp_attr_get_rtr_confirm (sdp_t
*sdp_p
, uint16_t level
,
4756 uint8_t cap_num
, uint16_t inst_num
)
4760 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_RTR
, inst_num
);
4761 if (attr_p
== NULL
) {
4762 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4763 SDPLogError(logTag
, "%s %s attribute, level %u instance %u "
4764 "not found.", sdp_p
->debug_str
,
4765 sdp_get_attr_name(SDP_ATTR_RTR
), (unsigned)level
, (unsigned)inst_num
);
4767 sdp_p
->conf_p
->num_invalid_param
++;
4770 return (attr_p
->attr
.rtr
.confirm
);
4776 sdp_mediadir_role_e
sdp_attr_get_comediadir_role (sdp_t
*sdp_p
, uint16_t level
,
4777 uint8_t cap_num
, uint16_t inst_num
)
4781 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
4782 SDP_ATTR_DIRECTION
, inst_num
);
4783 if (attr_p
== NULL
) {
4784 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4785 SDPLogError(logTag
, "%s Comediadir role attribute, level %u instance %u "
4786 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4788 sdp_p
->conf_p
->num_invalid_param
++;
4789 return (SDP_MEDIADIR_ROLE_UNKNOWN
);
4791 return (attr_p
->attr
.comediadir
.role
);
4795 /* Function: sdp_attr_get_silencesupp_enabled
4796 * Description: Returns the value of the silencesupp attribute enable
4797 * parameter specified for the given attribute. Returns TRUE if
4798 * the confirm parameter is specified.
4799 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4800 * level The level to check for the attribute.
4801 * cap_num The capability number associated with the
4802 * attribute if any. If none, should be zero.
4803 * inst_num The attribute instance number to check.
4804 * Returns: Boolean value.
4806 tinybool
sdp_attr_get_silencesupp_enabled (sdp_t
*sdp_p
, uint16_t level
,
4807 uint8_t cap_num
, uint16_t inst_num
)
4811 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
4812 SDP_ATTR_SILENCESUPP
, inst_num
);
4813 if (attr_p
== NULL
) {
4814 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4815 SDPLogError(logTag
, "%s silenceSuppEnable attribute, level %u instance %u "
4816 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4818 sdp_p
->conf_p
->num_invalid_param
++;
4821 return (attr_p
->attr
.silencesupp
.enabled
);
4825 /* Function: sdp_attr_get_silencesupp_timer
4826 * Description: Returns the value of the silencesupp attribute timer
4827 * parameter specified for the given attribute. null_ind
4828 * is set to TRUE if no value was specified, but instead the
4829 * null "-" value was specified.
4830 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4831 * level The level to check for the attribute.
4832 * cap_num The capability number associated with the
4833 * attribute if any. If none, should be zero.
4834 * inst_num The attribute instance number to check.
4835 * Returns: 16-bit timer value
4838 uint16_t sdp_attr_get_silencesupp_timer (sdp_t
*sdp_p
, uint16_t level
,
4839 uint8_t cap_num
, uint16_t inst_num
,
4844 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
4845 SDP_ATTR_SILENCESUPP
, inst_num
);
4846 if (attr_p
== NULL
) {
4847 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4848 SDPLogError(logTag
, "%s silenceTimer attribute, level %u instance %u "
4849 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4851 sdp_p
->conf_p
->num_invalid_param
++;
4854 *null_ind
= attr_p
->attr
.silencesupp
.timer_null
;
4855 return (attr_p
->attr
.silencesupp
.timer
);
4859 /* Function: sdp_attr_get_silencesupp_pref
4860 * Description: Sets the silencesupp supppref value
4861 * If this parameter is TRUE, the confirm parameter will be
4862 * specified when the SDP description is built.
4863 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4864 * level The level to check for the attribute.
4865 * cap_num The capability number associated with the
4866 * attribute if any. If none, should be zero.
4867 * inst_num The attribute instance number to check.
4868 * confirm New qos confirm parameter.
4869 * Returns: SDP_SUCCESS Attribute param was set successfully.
4870 * SDP_INVALID_PARAMETER Specified attribute is not defined.
4872 sdp_silencesupp_pref_e
sdp_attr_get_silencesupp_pref (sdp_t
*sdp_p
,
4873 uint16_t level
, uint8_t cap_num
,
4878 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
4879 SDP_ATTR_SILENCESUPP
, inst_num
);
4880 if (attr_p
== NULL
) {
4881 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4882 SDPLogError(logTag
, "%s silence suppPref attribute, level %u instance %u "
4883 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4885 sdp_p
->conf_p
->num_invalid_param
++;
4886 return (SDP_SILENCESUPP_PREF_UNKNOWN
);
4888 return (attr_p
->attr
.silencesupp
.pref
);
4892 /* Function: sdp_attr_get_silencesupp_siduse
4893 * Description: Returns the value of the silencesupp attribute siduse
4894 * parameter specified for the given attribute. If the given
4895 * attribute is not defined, SDP_QOS_STRENGTH_UNKNOWN is
4897 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4898 * level The level to check for the attribute.
4899 * cap_num The capability number associated with the
4900 * attribute if any. If none, should be zero.
4901 * inst_num The attribute instance number to check.
4902 * Returns: silencesupp siduse enum.
4904 sdp_silencesupp_siduse_e
sdp_attr_get_silencesupp_siduse (sdp_t
*sdp_p
,
4911 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
4912 SDP_ATTR_SILENCESUPP
, inst_num
);
4913 if (attr_p
== NULL
) {
4914 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4915 SDPLogError(logTag
, "%s silence sidUse attribute, level %u instance %u "
4916 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4918 sdp_p
->conf_p
->num_invalid_param
++;
4919 return (SDP_SILENCESUPP_SIDUSE_UNKNOWN
);
4921 return (attr_p
->attr
.silencesupp
.siduse
);
4925 /* Function: sdp_attr_get_silencesupp_fxnslevel
4926 * Description: Returns the value of the silencesupp attribute fxns
4927 * (fixed noise) parameter specified for the given attribute.
4928 * null_ind is set to TRUE if no value was specified,
4929 * but instead the null "-" value was specified.
4930 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4931 * level The level to check for the attribute.
4932 * cap_num The capability number associated with the
4933 * attribute if any. If none, should be zero.
4934 * inst_num The attribute instance number to check.
4935 * Returns: 7-bit fxns value
4938 uint8_t sdp_attr_get_silencesupp_fxnslevel (sdp_t
*sdp_p
, uint16_t level
,
4939 uint8_t cap_num
, uint16_t inst_num
,
4944 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
4945 SDP_ATTR_SILENCESUPP
, inst_num
);
4946 if (attr_p
== NULL
) {
4947 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4948 SDPLogError(logTag
, "%s silence fxnslevel attribute, level %u instance %u "
4949 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4951 sdp_p
->conf_p
->num_invalid_param
++;
4954 *null_ind
= attr_p
->attr
.silencesupp
.fxnslevel_null
;
4955 return (attr_p
->attr
.silencesupp
.fxnslevel
);
4959 /* Function: sdp_attr_get_mptime_num_intervals
4960 * Description: Returns the number of intervals specified for the
4961 * given mptime attribute. If the given attribute is not
4962 * defined, zero is returned.
4963 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4964 * level The level to check for the attribute.
4965 * cap_num The capability number associated with the
4966 * attribute if any. If none, should be zero.
4967 * inst_num The attribute instance number to check.
4968 * Returns: Number of intervals.
4970 uint16_t sdp_attr_get_mptime_num_intervals (
4974 uint16_t inst_num
) {
4978 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_MPTIME
, inst_num
);
4979 if (attr_p
!= NULL
) {
4980 return attr_p
->attr
.mptime
.num_intervals
;
4983 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
4984 SDPLogError(logTag
, "%s mptime attribute, level %u instance %u not found.",
4985 sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
4987 sdp_p
->conf_p
->num_invalid_param
++;
4991 /* Function: sdp_attr_get_mptime_interval
4992 * Description: Returns the value of the specified interval for the
4993 * given mptime attribute. If the given attribute is not
4994 * defined, zero is returned.
4995 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
4996 * level The level to check for the attribute.
4997 * cap_num The capability number associated with the
4998 * attribute if any. If none, should be zero.
4999 * inst_num The attribute instance number to check.
5000 * interval_num The interval number to get. Range is (1 -
5001 * max num payloads).
5002 * Returns: Interval.
5004 uint16_t sdp_attr_get_mptime_interval (
5009 uint16_t interval_num
) {
5013 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_MPTIME
, inst_num
);
5014 if (attr_p
== NULL
) {
5015 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5016 SDPLogError(logTag
, "%s mptime attribute, level %u instance %u "
5017 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5019 sdp_p
->conf_p
->num_invalid_param
++;
5023 if ((interval_num
<1) || (interval_num
>attr_p
->attr
.mptime
.num_intervals
)) {
5024 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5025 SDPLogError(logTag
, "%s mptime attribute, level %u instance %u, "
5026 "invalid interval number %u requested.",
5027 sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
, (unsigned)interval_num
);
5029 sdp_p
->conf_p
->num_invalid_param
++;
5033 return attr_p
->attr
.mptime
.intervals
[interval_num
-1];
5036 /* Function: sdp_attr_add_mptime_interval
5037 * Description: Add a new value to the list of intervals specified for
5038 * the given mptime attribute. The interval will be
5039 * added to the end of the list so these values should be added
5040 * in the order they will be displayed within the attribute.
5041 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5042 * level The level to check for the attribute.
5043 * cap_num The capability number associated with the
5044 * attribute if any. If none, should be zero.
5045 * inst_num The attribute instance number to check.
5046 * mp_interval The interval to add.
5047 * Returns: SDP_SUCCESS Interval was added successfully.
5048 * SDP_INVALID_PARAMETER Specified attribute is not defined.
5049 * SDP_INVALID_SDP_PTR Supplied SDP pointer is invalid
5051 sdp_result_e
sdp_attr_add_mptime_interval (
5056 uint16_t mp_interval
) {
5058 uint16_t interval_num
;
5061 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
, SDP_ATTR_MPTIME
, inst_num
);
5062 if (attr_p
== NULL
) {
5063 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5064 SDPLogError(logTag
, "%s mptime attribute, level %u instance %u "
5065 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5067 sdp_p
->conf_p
->num_invalid_param
++;
5068 return SDP_INVALID_PARAMETER
;
5071 interval_num
= attr_p
->attr
.mptime
.num_intervals
;
5072 if (interval_num
>=SDP_MAX_PAYLOAD_TYPES
) {
5073 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5074 SDPLogError(logTag
, "%s mptime attribute, level %u instance %u "
5075 "exceeds maximum length.",
5076 sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5078 sdp_p
->conf_p
->num_invalid_param
++;
5079 return SDP_INVALID_PARAMETER
;
5082 attr_p
->attr
.mptime
.intervals
[interval_num
] = mp_interval
;
5083 ++attr_p
->attr
.mptime
.num_intervals
;
5089 /* Function: sdp_get_group_attr
5090 * Description: Returns the attribute parameter from the a=group:<>
5091 * line. If no attrib has been set ,
5092 * SDP_GROUP_ATTR_UNSUPPORTED will be returned.
5093 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5094 * level SDP_SESSION_LEVEL
5095 * Returns: Valid attrib value or SDP_GROUP_ATTR_UNSUPPORTED.
5097 sdp_group_attr_e
sdp_get_group_attr (sdp_t
*sdp_p
, uint16_t level
,
5098 uint8_t cap_num
, uint16_t inst_num
)
5102 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5103 SDP_ATTR_GROUP
, inst_num
);
5104 if (attr_p
== NULL
) {
5105 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5106 SDPLogError(logTag
, "%s Group (a= group line) attribute, level %u instance %u "
5107 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5109 sdp_p
->conf_p
->num_invalid_param
++;
5110 return (SDP_GROUP_ATTR_UNSUPPORTED
);
5112 if (sdp_p
->debug_flag
[SDP_DEBUG_TRACE
]) {
5113 SDP_PRINT("%s Stream data group attr field is :%s ",
5115 sdp_get_group_attr_name(attr_p
->attr
.stream_data
.group_attr
) );
5117 return (attr_p
->attr
.stream_data
.group_attr
);
5121 /* Function: sdp_get_group_num_id
5122 * Description: Returns the number of ids from the a=group:<> line.
5123 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5124 * level SDP_SESSION_LEVEL
5125 * Returns: Num of group ids present or 0 if there is an error.
5127 uint16_t sdp_get_group_num_id (sdp_t
*sdp_p
, uint16_t level
,
5128 uint8_t cap_num
, uint16_t inst_num
)
5132 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5133 SDP_ATTR_GROUP
, inst_num
);
5134 if (attr_p
== NULL
) {
5135 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5136 SDPLogError(logTag
, "%s a=group level attribute, level %u instance %u "
5137 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5139 sdp_p
->conf_p
->num_invalid_param
++;
5142 if (sdp_p
->debug_flag
[SDP_DEBUG_TRACE
]) {
5143 SDP_PRINT("%s Stream data group attr - num of ids is :%u ",
5145 (unsigned)attr_p
->attr
.stream_data
.num_group_id
);
5148 return (attr_p
->attr
.stream_data
.num_group_id
);
5151 /* Function: sdp_get_group_id
5152 * Description: Returns the group id from the a=group:<> line.
5153 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5154 * level SDP_SESSION_LEVEL
5155 * id_num Number of the id to retrieve. The range is (1 -
5156 * SDP_MAX_GROUP_STREAM_ID)
5157 * Returns: Value of the group id at the index specified or
5160 const char* sdp_get_group_id (sdp_t
*sdp_p
, uint16_t level
,
5161 uint8_t cap_num
, uint16_t inst_num
, uint16_t id_num
)
5165 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5166 SDP_ATTR_GROUP
, inst_num
);
5167 if (attr_p
== NULL
) {
5168 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5169 SDPLogError(logTag
, "%s a=group level attribute, level %u instance %u "
5170 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5172 sdp_p
->conf_p
->num_invalid_param
++;
5175 if (sdp_p
->debug_flag
[SDP_DEBUG_TRACE
]) {
5176 SDP_PRINT("%s Stream data group attr - num of ids is :%u ",
5178 (unsigned)attr_p
->attr
.stream_data
.num_group_id
);
5180 if ((id_num
< 1) || (id_num
> attr_p
->attr
.stream_data
.num_group_id
)) {
5184 return (attr_p
->attr
.stream_data
.group_ids
[id_num
-1]);
5187 /* Function: sdp_attr_get_x_sidin
5188 * Description: Returns the attribute parameter from the a=X-sidin:<>
5189 * line. If no attrib has been set NULL will be returned.
5190 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5191 * level media level index
5192 * cap_num The capability number associated with the
5193 * attribute if any. If none, should be zero.
5194 * inst_num The attribute instance number to check.
5195 * Returns: Pointer to sidin or NULL.
5197 const char* sdp_attr_get_x_sidin (sdp_t
*sdp_p
, uint16_t level
,
5198 uint8_t cap_num
, uint16_t inst_num
)
5202 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5203 SDP_ATTR_X_SIDIN
, inst_num
);
5204 if (attr_p
== NULL
) {
5205 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5206 SDPLogError(logTag
, "%s X-sidin attribute, level %u instance %u "
5207 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5209 sdp_p
->conf_p
->num_invalid_param
++;
5212 if (sdp_p
->debug_flag
[SDP_DEBUG_TRACE
]) {
5213 SDP_PRINT("%s Stream X-sidin attr field is :%s ",
5215 attr_p
->attr
.stream_data
.x_sidin
);
5217 return (attr_p
->attr
.stream_data
.x_sidin
);
5221 /* Function: sdp_attr_get_x_sidout
5222 * Description: Returns the attribute parameter from the a=X-sidout:<>
5223 * line. If no attrib has been set NULL will be returned.
5224 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5225 * level media level index
5226 * cap_num The capability number associated with the
5227 * attribute if any. If none, should be zero.
5228 * inst_num The attribute instance number to check.
5229 * Returns: Pointer to sidout or NULL.
5231 const char* sdp_attr_get_x_sidout (sdp_t
*sdp_p
, uint16_t level
,
5232 uint8_t cap_num
, uint16_t inst_num
)
5236 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5237 SDP_ATTR_X_SIDOUT
, inst_num
);
5238 if (attr_p
== NULL
) {
5239 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5240 SDPLogError(logTag
, "%s X-sidout attribute, level %u instance %u "
5241 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5243 sdp_p
->conf_p
->num_invalid_param
++;
5246 if (sdp_p
->debug_flag
[SDP_DEBUG_TRACE
]) {
5247 SDP_PRINT("%s Stream X-sidout attr field is :%s ",
5249 attr_p
->attr
.stream_data
.x_sidout
);
5251 return (attr_p
->attr
.stream_data
.x_sidout
);
5255 /* Function: sdp_attr_get_x_confid
5256 * Description: Returns the attribute parameter from the a=X-confid:<>
5257 * line. If no attrib has been set NULL will be returned.
5258 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5259 * level media level index
5260 * cap_num The capability number associated with the
5261 * attribute if any. If none, should be zero.
5262 * inst_num The attribute instance number to check.
5263 * Returns: Pointer to confid or NULL.
5265 const char* sdp_attr_get_x_confid (sdp_t
*sdp_p
, uint16_t level
,
5266 uint8_t cap_num
, uint16_t inst_num
)
5270 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5271 SDP_ATTR_X_CONFID
, inst_num
);
5272 if (attr_p
== NULL
) {
5273 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5274 SDPLogError(logTag
, "%s X-confid attribute, level %u instance %u "
5275 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5277 sdp_p
->conf_p
->num_invalid_param
++;
5280 if (sdp_p
->debug_flag
[SDP_DEBUG_TRACE
]) {
5281 SDP_PRINT("%s Stream X-confid attr field is :%s ",
5283 attr_p
->attr
.stream_data
.x_confid
);
5285 return (attr_p
->attr
.stream_data
.x_confid
);
5289 /* Function: sdp_get_source_filter_mode
5290 * Description: Gets the filter mode in internal representation
5291 * Parameters: sdp_p The SDP handle which contains the attributes
5292 * level SDP_SESSION_LEVEL/m-line number
5293 * inst_num The attribute instance number
5294 * Returns: Filter mode (incl/excl/not present)
5296 sdp_src_filter_mode_e
5297 sdp_get_source_filter_mode (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
5302 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5303 SDP_ATTR_SOURCE_FILTER
, inst_num
);
5304 if (attr_p
== NULL
) {
5305 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5306 SDPLogError(logTag
, "%s Source filter attribute, level %u, "
5307 "instance %u not found", sdp_p
->debug_str
,
5308 (unsigned)level
, (unsigned)inst_num
);
5310 sdp_p
->conf_p
->num_invalid_param
++;
5311 return (SDP_FILTER_MODE_NOT_PRESENT
);
5313 return (attr_p
->attr
.source_filter
.mode
);
5316 /* Function: sdp_get_filter_destination_attributes
5317 * Description: Gets the destination address parameters
5318 * Parameters: Network type (optional), destination address type
5319 * (optional), and destination address (mandatory) variables
5320 * which gets updated.
5321 * Returns: SDP_SUCCESS or SDP_INVALID_PARAMETER/SDP_INVALID_SDP_PTR
5324 sdp_get_filter_destination_attributes (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
5325 uint16_t inst_num
, sdp_nettype_e
*nettype
,
5326 sdp_addrtype_e
*addrtype
,
5331 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5332 SDP_ATTR_SOURCE_FILTER
, inst_num
);
5333 if (attr_p
== NULL
) {
5334 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5335 SDPLogError(logTag
, "%s Source filter attribute, level %u instance %u "
5336 "not found", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5338 sdp_p
->conf_p
->num_invalid_param
++;
5339 return (SDP_INVALID_PARAMETER
);
5342 *nettype
= attr_p
->attr
.source_filter
.nettype
;
5345 *addrtype
= attr_p
->attr
.source_filter
.addrtype
;
5347 sstrncpy(dest_addr
, attr_p
->attr
.source_filter
.dest_addr
,
5348 SDP_MAX_STRING_LEN
+1);
5350 return (SDP_SUCCESS
);
5353 /* Function: sdp_get_filter_source_address_count
5354 * Description: Gets the number of source addresses in the list
5355 * Parameters: sdp_p The SDP handle which contains the attributes
5356 * level SDP_SESSION_LEVEL/m-line number
5357 * inst_num The attribute instance number
5358 * Returns: Source-list count
5362 sdp_get_filter_source_address_count (sdp_t
*sdp_p
, uint16_t level
,
5363 uint8_t cap_num
, uint16_t inst_num
)
5367 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5368 SDP_ATTR_SOURCE_FILTER
, inst_num
);
5369 if (attr_p
== NULL
) {
5370 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5371 SDPLogError(logTag
, "%s Source filter attribute, level %u instance %u "
5372 "not found", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5374 sdp_p
->conf_p
->num_invalid_param
++;
5375 return (SDP_INVALID_VALUE
);
5377 return (attr_p
->attr
.source_filter
.num_src_addr
);
5380 /* Function: sdp_get_filter_source_address
5381 * Description: Gets one of the source address that is indexed by the user
5382 * Parameters: sdp_p The SDP handle which contains the attributes
5383 * level SDP_SESSION_LEVEL/m-line number
5384 * inst_num The attribute instance number
5385 * src_addr_id User provided index (value in range between
5386 * 0 to (SDP_MAX_SRC_ADDR_LIST-1) which obtains
5387 * the source addr corresponding to it.
5388 * src_addr The user provided variable which gets updated
5389 * with source address corresponding to the index
5392 sdp_get_filter_source_address (sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
5393 uint16_t inst_num
, uint16_t src_addr_id
,
5400 if (src_addr_id
>= SDP_MAX_SRC_ADDR_LIST
) {
5401 return (SDP_INVALID_PARAMETER
);
5403 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5404 SDP_ATTR_SOURCE_FILTER
, inst_num
);
5405 if (attr_p
== NULL
) {
5406 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5407 SDPLogError(logTag
, "%s Source filter attribute, level %u instance %u "
5408 "not found", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5410 sdp_p
->conf_p
->num_invalid_param
++;
5411 return (SDP_INVALID_PARAMETER
);
5413 if (src_addr_id
>= attr_p
->attr
.source_filter
.num_src_addr
) {
5414 return (SDP_INVALID_PARAMETER
);
5416 sstrncpy(src_addr
, attr_p
->attr
.source_filter
.src_list
[src_addr_id
],
5417 SDP_MAX_STRING_LEN
+1);
5419 return (SDP_SUCCESS
);
5422 sdp_rtcp_unicast_mode_e
5423 sdp_get_rtcp_unicast_mode(sdp_t
*sdp_p
, uint16_t level
, uint8_t cap_num
,
5428 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5429 SDP_ATTR_RTCP_UNICAST
, inst_num
);
5430 if (attr_p
== NULL
) {
5431 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5432 SDPLogError(logTag
, "%s RTCP Unicast attribute, level %u, "
5433 "instance %u not found", sdp_p
->debug_str
,
5434 (unsigned)level
, (unsigned)inst_num
);
5436 sdp_p
->conf_p
->num_invalid_param
++;
5437 return (SDP_RTCP_UNICAST_MODE_NOT_PRESENT
);
5439 return ((sdp_rtcp_unicast_mode_e
)attr_p
->attr
.u32_val
);
5443 /* Function: sdp_attr_get_sdescriptions_tag
5444 * Description: Returns the value of the sdescriptions tag
5445 * parameter specified for the given attribute.
5446 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5447 * level The level to check for the attribute.
5448 * cap_num The capability number associated with the
5449 * attribute if any. If none, should be zero.
5450 * inst_num The attribute instance number to check.
5451 * Returns: Tag value or SDP_INVALID_VALUE (-2) if error encountered.
5455 sdp_attr_get_sdescriptions_tag (sdp_t
*sdp_p
, uint16_t level
,
5456 uint8_t cap_num
, uint16_t inst_num
)
5460 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5461 SDP_ATTR_SDESCRIPTIONS
, inst_num
);
5463 if (attr_p
== NULL
) {
5464 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5465 SDPLogError(logTag
, "%s srtp attribute tag, level %u instance %u "
5466 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5468 sdp_p
->conf_p
->num_invalid_param
++;
5469 return SDP_INVALID_VALUE
;
5471 return attr_p
->attr
.srtp_context
.tag
;
5475 /* Function: sdp_attr_get_sdescriptions_crypto_suite
5476 * Description: Returns the value of the sdescriptions crypto suite
5477 * parameter specified for the given attribute. Note that
5478 * this is a common api for both version 2 and version 9
5479 * sdescriptions. It has no knowledge which version is being
5480 * used so it will first try to find if a version 2 sdescriptions
5481 * attribute is present. If it is, return the suite. If it's not,
5482 * try to find the version 9. This assumes you cannot have both
5483 * versions in the same SDP.
5485 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5486 * level The level to check for the attribute.
5487 * cap_num The capability number associated with the
5488 * attribute if any. If none, should be zero.
5489 * inst_num The attribute instance number to check.
5490 * Returns: SDP_SRTP_UNKNOWN_CRYPTO_SUITE is returned if an error was
5491 * encountered otherwise the crypto suite is returned.
5494 sdp_srtp_crypto_suite_t
5495 sdp_attr_get_sdescriptions_crypto_suite (sdp_t
*sdp_p
, uint16_t level
,
5496 uint8_t cap_num
, uint16_t inst_num
)
5501 /* Try version 2 first */
5502 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5503 SDP_ATTR_SRTP_CONTEXT
, inst_num
);
5505 if (attr_p
== NULL
) {
5506 /* There's no version 2 so now try version 9 */
5507 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5508 SDP_ATTR_SDESCRIPTIONS
, inst_num
);
5509 if (attr_p
== NULL
) {
5510 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5511 SDPLogError(logTag
, "%s srtp attribute suite, level %u instance %u "
5512 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5514 sdp_p
->conf_p
->num_invalid_param
++;
5515 return SDP_SRTP_UNKNOWN_CRYPTO_SUITE
;
5519 return attr_p
->attr
.srtp_context
.suite
;
5523 /* Function: sdp_attr_get_sdescriptions_key
5524 * Description: Returns the value of the sdescriptions master key
5525 * parameter specified for the given attribute. Note that
5526 * this is a common api for both version 2 and version 9
5527 * sdescriptions. It has no knowledge which version is being
5528 * used so it will first try to find if a version 2 sdescriptions
5529 * attribute is present. If it is, return the key. If it's not,
5530 * try to find the version 9. This assumes you cannot have both
5531 * versions in the same SDP.
5533 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5534 * level The level to check for the attribute.
5535 * cap_num The capability number associated with the
5536 * attribute if any. If none, should be zero.
5537 * inst_num The attribute instance number to check.
5538 * Returns: NULL if error encountered or master key salt string
5542 sdp_attr_get_sdescriptions_key (sdp_t
*sdp_p
, uint16_t level
,
5543 uint8_t cap_num
, uint16_t inst_num
)
5547 /* Try version 2 first */
5548 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5549 SDP_ATTR_SRTP_CONTEXT
, inst_num
);
5551 if (attr_p
== NULL
) {
5552 /* Couldn't find version 2 now try version 9 */
5553 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5554 SDP_ATTR_SDESCRIPTIONS
, inst_num
);
5556 if (attr_p
== NULL
) {
5557 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5558 SDPLogError(logTag
, "%s srtp attribute key, level %u instance %u "
5559 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5561 sdp_p
->conf_p
->num_invalid_param
++;
5566 return (char*)attr_p
->attr
.srtp_context
.master_key
;
5570 /* Function: sdp_attr_get_sdescriptions_salt
5571 * Description: Returns the value of the sdescriptions master salt
5572 * parameter specified for the given attribute. Note that
5573 * this is a common api for both version 2 and version 9
5574 * sdescriptions. It has no knowledge which version is being
5575 * used so it will first try to find if a version 2 sdescriptions
5576 * attribute is present. If it is, return the salt. If it's not,
5577 * try to find the version 9. This assumes you cannot have both
5578 * versions in the same SDP.
5580 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5581 * level The level to check for the attribute.
5582 * cap_num The capability number associated with the
5583 * attribute if any. If none, should be zero.
5584 * inst_num The attribute instance number to check.
5585 * Returns: NULL if error encountered or master key salt string
5589 sdp_attr_get_sdescriptions_salt (sdp_t
*sdp_p
, uint16_t level
,
5590 uint8_t cap_num
, uint16_t inst_num
)
5594 /* Try version 2 first */
5595 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5596 SDP_ATTR_SRTP_CONTEXT
, inst_num
);
5598 if (attr_p
== NULL
) {
5599 /* Couldn't find version 2 now try version 9 */
5600 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5601 SDP_ATTR_SDESCRIPTIONS
, inst_num
);
5603 if (attr_p
== NULL
) {
5604 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5605 SDPLogError(logTag
, "%s srtp attribute salt, level %u instance %u "
5606 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5608 sdp_p
->conf_p
->num_invalid_param
++;
5613 return (char*) attr_p
->attr
.srtp_context
.master_salt
;
5619 /* Function: sdp_attr_get_sdescriptions_lifetime
5620 * Description: Returns the value of the sdescriptions lifetime
5621 * parameter specified for the given attribute.Note that
5622 * this is a common api for both version 2 and version 9
5623 * sdescriptions. It has no knowledge which version is being
5624 * used so it will first try to find if a version 2 sdescriptions
5625 * attribute is present. If it is, return the lifetime. If it's
5626 * not, try to find the version 9. This assumes you cannot have
5627 * both versions in the same SDP.
5629 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5630 * level The level to check for the attribute.
5631 * cap_num The capability number associated with the
5632 * attribute if any. If none, should be zero.
5633 * inst_num The attribute instance number to check.
5634 * Returns: NULL if error encountered or lifetime string
5638 sdp_attr_get_sdescriptions_lifetime (sdp_t
*sdp_p
, uint16_t level
,
5639 uint8_t cap_num
, uint16_t inst_num
)
5643 /* Try version 2 first. */
5644 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5645 SDP_ATTR_SRTP_CONTEXT
, inst_num
);
5647 if (attr_p
== NULL
) {
5648 /* Couldn't find version 2 now try version 9 */
5649 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5650 SDP_ATTR_SDESCRIPTIONS
, inst_num
);
5652 if (attr_p
== NULL
) {
5653 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5654 SDPLogError(logTag
, "%s srtp attribute lifetime, level %u instance %u "
5655 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5657 sdp_p
->conf_p
->num_invalid_param
++;
5662 return (char*)attr_p
->attr
.srtp_context
.master_key_lifetime
;
5666 /* Function: sdp_attr_get_sdescriptions_mki
5667 * Description: Returns the value of the sdescriptions MKI value and length
5668 * parameter of the specified attribute instance. Note that
5669 * this is a common api for both version 2 and version 9
5670 * sdescriptions. It has no knowledge which version is being
5671 * used so it will first try to find if a version 2 sdescriptions
5672 * attribute is present. If it is, return the MKI. If it's
5673 * not, try to find version 9. This assumes you cannot have
5674 * both versions in the same SDP.
5676 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5677 * level The level to check for the attribute.
5678 * cap_num The capability number associated with the
5679 * attribute if any. If none, should be zero.
5680 * inst_num The attribute instance number to check.
5681 * mki_value application provided pointer that on exit
5682 * is set to the MKI value string if one exists.
5683 * mki_length application provided pointer that on exit
5684 * is set to the MKI length if one exists.
5685 * Returns: SDP_SUCCESS no errors encountered otherwise sdp error
5686 * based upon the specific error.
5690 sdp_attr_get_sdescriptions_mki (sdp_t
*sdp_p
, uint16_t level
,
5691 uint8_t cap_num
, uint16_t inst_num
,
5692 const char **mki_value
,
5693 uint16_t *mki_length
)
5700 /* Try version 2 first */
5701 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5702 SDP_ATTR_SRTP_CONTEXT
, inst_num
);
5704 if (attr_p
== NULL
) {
5705 /* Couldn't find version 2 now try version 9 */
5706 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5707 SDP_ATTR_SDESCRIPTIONS
, inst_num
);
5708 if (attr_p
== NULL
) {
5709 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5710 SDPLogError(logTag
, "%s srtp attribute MKI, level %u instance %u "
5711 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5713 sdp_p
->conf_p
->num_invalid_param
++;
5714 return SDP_INVALID_PARAMETER
;
5718 *mki_value
= (char*)attr_p
->attr
.srtp_context
.mki
;
5719 *mki_length
= attr_p
->attr
.srtp_context
.mki_size_bytes
;
5725 /* Function: sdp_attr_get_sdescriptions_session_params
5726 * Description: Returns the unparsed session parameters string. Note that
5727 * this is a common api for both version 2 and version 9
5728 * sdescriptions. It has no knowledge which version is being
5729 * used so it will first try to find if a version 2 sdescriptions
5730 * attribute is present. If it is, return session parameters. If
5731 * it's not, try to find version 9. This assumes you cannot have
5732 * both versions in the same SDP.
5734 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5735 * level The level to check for the attribute.
5736 * cap_num The capability number associated with the
5737 * attribute if any. If none, should be zero.
5738 * inst_num The attribute instance number to check.
5739 * Returns: NULL if no session parameters were received in the sdp,
5740 * otherwise returns a pointer to the start of the session
5741 * parameters string. Note that the calling function should
5742 * not free the returned pointer.
5746 sdp_attr_get_sdescriptions_session_params (sdp_t
*sdp_p
, uint16_t level
,
5747 uint8_t cap_num
, uint16_t inst_num
)
5751 /* Try version 2 first */
5752 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5753 SDP_ATTR_SRTP_CONTEXT
, inst_num
);
5755 if (attr_p
== NULL
) {
5756 /* Couldn't find version 2 try version 9 */
5757 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5758 SDP_ATTR_SDESCRIPTIONS
, inst_num
);
5759 if (attr_p
== NULL
) {
5760 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5761 SDPLogError(logTag
, "%s srtp attribute session params, level %u instance %u "
5762 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5764 sdp_p
->conf_p
->num_invalid_param
++;
5769 return attr_p
->attr
.srtp_context
.session_parameters
;
5773 /* Function: sdp_attr_get_sdescriptions_key_size
5774 * Description: Returns the master key size. Note that
5775 * this is a common api for both version 2 and version 9
5776 * sdescriptions. It has no knowledge which version is being
5777 * used so it will first try to find if a version 2 sdescriptions
5778 * attribute is present. If it is, return key size. If
5779 * it's not, try to find version 9. This assumes you cannot have
5780 * both versions in the same SDP.
5782 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5783 * level The level to check for the attribute.
5784 * cap_num The capability number associated with the
5785 * attribute if any. If none, should be zero.
5786 * inst_num The attribute instance number to check.
5787 * Returns: 0 (SDP_SDESCRIPTIONS_KEY_SIZE_UNKNOWN) if error was
5788 * encountered, otherwise key size.
5792 sdp_attr_get_sdescriptions_key_size (sdp_t
*sdp_p
,
5800 /* Try version 2 first */
5801 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5802 SDP_ATTR_SRTP_CONTEXT
, inst_num
);
5804 if (attr_p
== NULL
) {
5805 /* Couldn't find version 2 now try version 9 */
5806 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5807 SDP_ATTR_SDESCRIPTIONS
, inst_num
);
5808 if (attr_p
== NULL
) {
5809 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5810 SDPLogError(logTag
, "%s srtp attribute MKI, level %u instance %u "
5811 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5813 sdp_p
->conf_p
->num_invalid_param
++;
5814 return SDP_SDESCRIPTIONS_KEY_SIZE_UNKNOWN
;
5818 return attr_p
->attr
.srtp_context
.master_key_size_bytes
;
5823 /* Function: sdp_attr_get_sdescriptions_salt_size
5824 * Description: Returns the salt key size. Note that
5825 * this is a common api for both version 2 and version 9
5826 * sdescriptions. It has no knowledge which version is being
5827 * used so it will first try to find if a version 2 sdescriptions
5828 * attribute is present. If it is, return salt size. If
5829 * it's not, try to find version 9. This assumes you cannot have
5830 * both versions in the same SDP.
5832 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5833 * level The level to check for the attribute.
5834 * cap_num The capability number associated with the
5835 * attribute if any. If none, should be zero.
5836 * inst_num The attribute instance number to check.
5837 * Returns: 0 (SDP_SDESCRIPTIONS_KEY_SIZE_UNKNOWN) if error was
5838 * encountered, otherwise salt size.
5842 sdp_attr_get_sdescriptions_salt_size (sdp_t
*sdp_p
,
5850 /* Try version 2 first */
5851 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5852 SDP_ATTR_SRTP_CONTEXT
, inst_num
);
5854 if (attr_p
== NULL
) {
5855 /* Couldn't find version 2 now try version 9 */
5856 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5857 SDP_ATTR_SDESCRIPTIONS
, inst_num
);
5858 if (attr_p
== NULL
) {
5859 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5860 SDPLogError(logTag
, "%s srtp attribute MKI, level %u instance %u "
5861 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5863 sdp_p
->conf_p
->num_invalid_param
++;
5864 return SDP_SDESCRIPTIONS_KEY_SIZE_UNKNOWN
;
5868 return attr_p
->attr
.srtp_context
.master_salt_size_bytes
;
5873 /* Function: sdp_attr_get_srtp_crypto_selection_flags
5874 * Description: Returns the selection flags. Note that
5875 * this is a common api for both version 2 and version 9
5876 * sdescriptions. It has no knowledge which version is being
5877 * used so it will first try to find if a version 2 sdescriptions
5878 * attribute is present. If it is, return selection flags. If
5879 * it's not, try to find version 9. This assumes you cannot have
5880 * both versions in the same SDP.
5881 * Currently only necessary for MGCP.
5883 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5884 * level The level to check for the attribute.
5885 * cap_num The capability number associated with the
5886 * attribute if any. If none, should be zero.
5887 * inst_num The attribute instance number to check.
5888 * Returns: 0 (SDP_SRTP_CRYPTO_SELECTION_FLAGS_UNKNOWN) if error was
5889 * encountered, otherwise selection flags.
5893 sdp_attr_get_srtp_crypto_selection_flags (sdp_t
*sdp_p
,
5902 /* Try version 2 first */
5903 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5904 SDP_ATTR_SRTP_CONTEXT
, inst_num
);
5906 if (attr_p
== NULL
) {
5907 /* Couldn't find version 2 now try version 9 */
5908 attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
5909 SDP_ATTR_SDESCRIPTIONS
, inst_num
);
5910 if (attr_p
== NULL
) {
5911 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5912 SDPLogError(logTag
, "%s srtp attribute MKI, level %u instance %u "
5913 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
5915 sdp_p
->conf_p
->num_invalid_param
++;
5916 return SDP_SRTP_CRYPTO_SELECTION_FLAGS_UNKNOWN
;
5920 return attr_p
->attr
.srtp_context
.selection_flags
;
5926 /* Function: sdp_find_rtcp_fb_attr
5927 * Description: Helper to find the nth instance of a rtcp-fb attribute of
5928 * the specified feedback type.
5929 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5930 * level The level to check for the attribute.
5931 * payload_type The payload to get the attribute for
5932 * fb_type The feedback type to look for.
5933 * inst_num The attribute instance number to check.
5934 * Returns: Pointer to the attribute, or NULL if not found.
5938 sdp_find_rtcp_fb_attr (sdp_t
*sdp_p
,
5940 uint16_t payload_type
,
5941 sdp_rtcp_fb_type_e fb_type
,
5944 uint16_t attr_count
=0;
5948 mca_p
= sdp_find_media_level(sdp_p
, level
);
5952 for (attr_p
= mca_p
->media_attrs_p
; attr_p
; attr_p
= attr_p
->next_p
) {
5953 if (attr_p
->type
== SDP_ATTR_RTCP_FB
&&
5954 (attr_p
->attr
.rtcp_fb
.payload_num
== payload_type
||
5955 attr_p
->attr
.rtcp_fb
.payload_num
== SDP_ALL_PAYLOADS
) &&
5956 attr_p
->attr
.rtcp_fb
.feedback_type
== fb_type
) {
5958 if (attr_count
== inst_num
) {
5966 /* Function: sdp_attr_get_rtcp_fb_ack
5967 * Description: Returns the value of the rtcp-fb:...ack attribute
5968 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5969 * level The level to check for the attribute.
5970 * payload_type The payload to get the attribute for
5971 * inst_num The attribute instance number to check.
5972 * Returns: ACK type (SDP_RTCP_FB_ACK_NOT_FOUND if not present)
5974 sdp_rtcp_fb_ack_type_e
5975 sdp_attr_get_rtcp_fb_ack(sdp_t
*sdp_p
, uint16_t level
, uint16_t payload_type
, uint16_t inst
)
5979 attr_p
= sdp_find_rtcp_fb_attr(sdp_p
, level
, payload_type
,
5980 SDP_RTCP_FB_ACK
, inst
);
5982 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
5983 SDPLogError(logTag
, "%s rtcp-fb attribute, level %u, pt %u, "
5984 "instance %u not found.", sdp_p
->debug_str
, (unsigned)level
,
5985 (unsigned)payload_type
, (unsigned)inst
);
5987 sdp_p
->conf_p
->num_invalid_param
++;
5988 return SDP_RTCP_FB_ACK_NOT_FOUND
;
5990 return (attr_p
->attr
.rtcp_fb
.param
.ack
);
5993 /* Function: sdp_attr_get_rtcp_fb_nack
5994 * Description: Returns the value of the rtcp-fb:...nack attribute
5995 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
5996 * level The level to check for the attribute.
5997 * payload_type The payload to get the attribute for
5998 * inst_num The attribute instance number to check.
5999 * Returns: NACK type (SDP_RTCP_FB_NACK_NOT_FOUND if not present)
6001 sdp_rtcp_fb_nack_type_e
6002 sdp_attr_get_rtcp_fb_nack(sdp_t
*sdp_p
, uint16_t level
, uint16_t payload_type
, uint16_t inst
)
6006 attr_p
= sdp_find_rtcp_fb_attr(sdp_p
, level
, payload_type
,
6007 SDP_RTCP_FB_NACK
, inst
);
6009 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6010 SDPLogError(logTag
, "%s rtcp-fb attribute, level %u, pt %u, "
6011 "instance %u not found.", sdp_p
->debug_str
, (unsigned)level
,
6012 (unsigned)payload_type
, (unsigned)inst
);
6014 sdp_p
->conf_p
->num_invalid_param
++;
6015 return SDP_RTCP_FB_NACK_NOT_FOUND
;
6017 return (attr_p
->attr
.rtcp_fb
.param
.nack
);
6020 /* Function: sdp_attr_get_rtcp_fb_trr_int
6021 * Description: Returns the value of the rtcp-fb:...trr-int attribute
6022 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6023 * level The level to check for the attribute.
6024 * payload_type The payload to get the attribute for
6025 * inst_num The attribute instance number to check.
6026 * Returns: trr-int interval (0xFFFFFFFF if not found)
6029 sdp_attr_get_rtcp_fb_trr_int(sdp_t
*sdp_p
, uint16_t level
,
6030 uint16_t payload_type
, uint16_t inst
)
6034 attr_p
= sdp_find_rtcp_fb_attr(sdp_p
, level
, payload_type
,
6035 SDP_RTCP_FB_TRR_INT
, inst
);
6037 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6038 SDPLogError(logTag
, "%s rtcp-fb attribute, level %u, pt %u, "
6039 "instance %u not found.", sdp_p
->debug_str
, (unsigned)level
,
6040 (unsigned)payload_type
, (unsigned)inst
);
6042 sdp_p
->conf_p
->num_invalid_param
++;
6045 return (attr_p
->attr
.rtcp_fb
.param
.trr_int
);
6048 /* Function: sdp_attr_get_rtcp_fb_remb_enabled
6049 * Description: Returns true if rtcp-fb:...goog-remb attribute exists
6050 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6051 * level The level to check for the attribute.
6052 * payload_type The payload to get the attribute for
6053 * Returns: true if rtcp-fb:...goog-remb exists
6056 sdp_attr_get_rtcp_fb_remb_enabled(sdp_t
*sdp_p
,
6058 uint16_t payload_type
)
6062 attr_p
= sdp_find_rtcp_fb_attr(sdp_p
, level
, payload_type
,
6064 1); // always check for 1st instance
6065 return (attr_p
? TRUE
: FALSE
); // either exists or not
6068 /* Function: sdp_attr_get_rtcp_fb_transport_cc_enabled
6069 * Description: Returns true if rtcp-fb:...transport-cc attribute exists
6070 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6071 * level The level to check for the attribute.
6072 * payload_type The payload to get the attribute for
6073 * Returns: true if rtcp-fb:...transport-cc exists
6076 sdp_attr_get_rtcp_fb_transport_cc_enabled(sdp_t
*sdp_p
,
6078 uint16_t payload_type
)
6082 attr_p
= sdp_find_rtcp_fb_attr(sdp_p
, level
, payload_type
,
6083 SDP_RTCP_FB_TRANSPORT_CC
,
6084 1); // always check for 1st instance
6085 return (attr_p
? TRUE
: FALSE
); // either exists or not
6088 /* Function: sdp_attr_get_rtcp_fb_ccm
6089 * Description: Returns the value of the rtcp-fb:...ccm attribute
6090 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6091 * level The level to check for the attribute.
6092 * payload_type The payload to get the attribute for
6093 * inst_num The attribute instance number to check.
6094 * Returns: CCM type (SDP_RTCP_FB_CCM_NOT_FOUND if not present)
6096 sdp_rtcp_fb_ccm_type_e
6097 sdp_attr_get_rtcp_fb_ccm(sdp_t
*sdp_p
, uint16_t level
, uint16_t payload_type
, uint16_t inst
)
6101 attr_p
= sdp_find_rtcp_fb_attr(sdp_p
, level
, payload_type
,
6102 SDP_RTCP_FB_CCM
, inst
);
6104 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6105 SDPLogError(logTag
, "%s rtcp-fb attribute, level %u, pt %u, "
6106 "instance %u not found.", sdp_p
->debug_str
, (unsigned)level
,
6107 (unsigned)payload_type
, (unsigned)inst
);
6109 sdp_p
->conf_p
->num_invalid_param
++;
6110 return SDP_RTCP_FB_CCM_NOT_FOUND
;
6112 return (attr_p
->attr
.rtcp_fb
.param
.ccm
);
6115 /* Function: sdp_attr_set_rtcp_fb_ack
6116 * Description: Sets the value of an rtcp-fb:...ack attribute
6117 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6118 * level The level to set the attribute.
6119 * payload_type The value to set the payload type to for
6120 * this attribute. Can be SDP_ALL_PAYLOADS.
6121 * inst_num The attribute instance number to check.
6122 * type The ack type to indicate
6123 * Returns: SDP_SUCCESS Attribute param was set successfully.
6124 * SDP_INVALID_PARAMETER Specified attribute is not defined.
6127 sdp_attr_set_rtcp_fb_ack(sdp_t
*sdp_p
, uint16_t level
, uint16_t payload_type
, uint16_t inst
,
6128 sdp_rtcp_fb_ack_type_e type
)
6132 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_RTCP_FB
, inst
);
6134 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6135 SDPLogError(logTag
, "%s rtcp_fb ack attribute, level %u "
6136 "instance %u not found.", sdp_p
->debug_str
, (unsigned)level
,
6139 sdp_p
->conf_p
->num_invalid_param
++;
6140 return (SDP_INVALID_PARAMETER
);
6143 attr_p
->attr
.rtcp_fb
.payload_num
= payload_type
;
6144 attr_p
->attr
.rtcp_fb
.feedback_type
= SDP_RTCP_FB_ACK
;
6145 attr_p
->attr
.rtcp_fb
.param
.ack
= type
;
6146 attr_p
->attr
.rtcp_fb
.extra
[0] = '\0';
6147 return (SDP_SUCCESS
);
6151 /* Function: sdp_attr_set_rtcp_fb_nack
6152 * Description: Sets the value of an rtcp-fb:...nack attribute
6153 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6154 * level The level to set the attribute.
6155 * payload_type The value to set the payload type to for
6156 * this attribute. Can be SDP_ALL_PAYLOADS.
6157 * inst_num The attribute instance number to check.
6158 * type The nack type to indicate
6159 * Returns: SDP_SUCCESS Attribute param was set successfully.
6160 * SDP_INVALID_PARAMETER Specified attribute is not defined.
6163 sdp_attr_set_rtcp_fb_nack(sdp_t
*sdp_p
, uint16_t level
, uint16_t payload_type
, uint16_t inst
,
6164 sdp_rtcp_fb_nack_type_e type
)
6168 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_RTCP_FB
, inst
);
6170 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6171 SDPLogError(logTag
, "%s rtcp_fb nack attribute, level %u "
6172 "instance %u not found.", sdp_p
->debug_str
, (unsigned)level
,
6175 sdp_p
->conf_p
->num_invalid_param
++;
6176 return (SDP_INVALID_PARAMETER
);
6179 attr_p
->attr
.rtcp_fb
.payload_num
= payload_type
;
6180 attr_p
->attr
.rtcp_fb
.feedback_type
= SDP_RTCP_FB_NACK
;
6181 attr_p
->attr
.rtcp_fb
.param
.nack
= type
;
6182 attr_p
->attr
.rtcp_fb
.extra
[0] = '\0';
6183 return (SDP_SUCCESS
);
6186 /* Function: sdp_attr_set_rtcp_fb_trr_int
6187 * Description: Sets the value of an rtcp-fb:...trr-int attribute
6188 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6189 * level The level to set the attribute.
6190 * payload_type The value to set the payload type to for
6191 * this attribute. Can be SDP_ALL_PAYLOADS.
6192 * inst_num The attribute instance number to check.
6193 * interval The interval time to indicate
6194 * Returns: SDP_SUCCESS Attribute param was set successfully.
6195 * SDP_INVALID_PARAMETER Specified attribute is not defined.
6198 sdp_attr_set_rtcp_fb_trr_int(sdp_t
*sdp_p
, uint16_t level
, uint16_t payload_type
,
6199 uint16_t inst
, uint32_t interval
)
6203 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_RTCP_FB
, inst
);
6205 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6206 SDPLogError(logTag
, "%s rtcp_fb trr-int attribute, level %u "
6207 "instance %u not found.", sdp_p
->debug_str
, (unsigned)level
,
6210 sdp_p
->conf_p
->num_invalid_param
++;
6211 return (SDP_INVALID_PARAMETER
);
6214 attr_p
->attr
.rtcp_fb
.payload_num
= payload_type
;
6215 attr_p
->attr
.rtcp_fb
.feedback_type
= SDP_RTCP_FB_TRR_INT
;
6216 attr_p
->attr
.rtcp_fb
.param
.trr_int
= interval
;
6217 attr_p
->attr
.rtcp_fb
.extra
[0] = '\0';
6218 return (SDP_SUCCESS
);
6221 /* Function: sdp_attr_set_rtcp_fb_remb
6222 * Description: Sets the value of an rtcp-fb:...goog-remb attribute
6223 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6224 * level The level to set the attribute.
6225 * payload_type The value to set the payload type to for
6226 * this attribute. Can be SDP_ALL_PAYLOADS.
6227 * inst_num The attribute instance number to check.
6228 * Returns: SDP_SUCCESS Attribute param was set successfully.
6229 * SDP_INVALID_PARAMETER Specified attribute is not defined.
6232 sdp_attr_set_rtcp_fb_remb(sdp_t
*sdp_p
, uint16_t level
, uint16_t payload_type
,
6237 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_RTCP_FB
, inst
);
6239 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6240 SDPLogError(logTag
, "%s rtcp_fb goog-remb attribute, level %u "
6241 "instance %u not found.", sdp_p
->debug_str
, (unsigned)level
,
6244 sdp_p
->conf_p
->num_invalid_param
++;
6245 return (SDP_INVALID_PARAMETER
);
6248 attr_p
->attr
.rtcp_fb
.payload_num
= payload_type
;
6249 attr_p
->attr
.rtcp_fb
.feedback_type
= SDP_RTCP_FB_REMB
;
6250 return (SDP_SUCCESS
);
6253 /* Function: sdp_attr_set_rtcp_fb_transport_cc
6254 * Description: Sets the value of an rtcp-fb:...transport-cc attribute
6255 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6256 * level The level to set the attribute.
6257 * payload_type The value to set the payload type to for
6258 * this attribute. Can be SDP_ALL_PAYLOADS.
6259 * inst_num The attribute instance number to check.
6260 * Returns: SDP_SUCCESS Attribute param was set successfully.
6261 * SDP_INVALID_PARAMETER Specified attribute is not defined.
6264 sdp_attr_set_rtcp_fb_transport_cc(sdp_t
*sdp_p
, uint16_t level
, uint16_t payload_type
,
6269 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_RTCP_FB
, inst
);
6271 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6272 SDPLogError(logTag
, "%s rtcp_fb transport-cc attribute, level %u "
6273 "instance %u not found.", sdp_p
->debug_str
, (unsigned)level
,
6276 sdp_p
->conf_p
->num_invalid_param
++;
6277 return (SDP_INVALID_PARAMETER
);
6280 attr_p
->attr
.rtcp_fb
.payload_num
= payload_type
;
6281 attr_p
->attr
.rtcp_fb
.feedback_type
= SDP_RTCP_FB_TRANSPORT_CC
;
6282 return (SDP_SUCCESS
);
6285 /* Function: sdp_attr_set_rtcp_fb_ccm
6286 * Description: Sets the value of an rtcp-fb:...ccm attribute
6287 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6288 * level The level to set the attribute.
6289 * payload_type The value to set the payload type to for
6290 * this attribute. Can be SDP_ALL_PAYLOADS.
6291 * inst_num The attribute instance number to check.
6292 * type The ccm type to indicate
6293 * Returns: SDP_SUCCESS Attribute param was set successfully.
6294 * SDP_INVALID_PARAMETER Specified attribute is not defined.
6297 sdp_attr_set_rtcp_fb_ccm(sdp_t
*sdp_p
, uint16_t level
, uint16_t payload_type
, uint16_t inst
,
6298 sdp_rtcp_fb_ccm_type_e type
)
6302 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_RTCP_FB
, inst
);
6304 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6305 SDPLogError(logTag
, "%s rtcp_fb ccm attribute, level %u "
6306 "instance %u not found.", sdp_p
->debug_str
, (unsigned)level
,
6309 sdp_p
->conf_p
->num_invalid_param
++;
6310 return (SDP_INVALID_PARAMETER
);
6312 attr_p
->attr
.rtcp_fb
.payload_num
= payload_type
;
6313 attr_p
->attr
.rtcp_fb
.feedback_type
= SDP_RTCP_FB_CCM
;
6314 attr_p
->attr
.rtcp_fb
.param
.ccm
= type
;
6315 attr_p
->attr
.rtcp_fb
.extra
[0] = '\0';
6316 return (SDP_SUCCESS
);
6319 /* Function: sdp_attr_get_extmap_uri
6320 * Description: Returns a pointer to the value of the encoding name
6321 * parameter specified for the given attribute. Value is
6322 * returned as a const ptr and so cannot be modified by the
6323 * application. If the given attribute is not defined, NULL
6325 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6326 * level The level to check for the attribute.
6327 * inst_num The attribute instance number to check.
6328 * Returns: Codec value or SDP_CODEC_INVALID.
6330 const char *sdp_attr_get_extmap_uri(sdp_t
*sdp_p
, uint16_t level
,
6335 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_EXTMAP
, inst_num
);
6336 if (attr_p
== NULL
) {
6337 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6338 SDPLogError(logTag
, "%s extmap attribute, level %u instance %u "
6339 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
6341 sdp_p
->conf_p
->num_invalid_param
++;
6344 return (attr_p
->attr
.extmap
.uri
);
6348 /* Function: sdp_attr_get_extmap_id
6349 * Description: Returns the id of the extmap specified for the given
6350 * attribute. If the given attribute is not defined, 0xFFFF
6352 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6353 * level The level to check for the attribute.
6354 * inst_num The attribute instance number to check.
6355 * Returns: The id of the extmap attribute.
6357 uint16_t sdp_attr_get_extmap_id(sdp_t
*sdp_p
, uint16_t level
,
6362 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_EXTMAP
, inst_num
);
6363 if (attr_p
== NULL
) {
6364 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6365 SDPLogError(logTag
, "%s extmap attribute, level %u instance %u "
6366 "not found.", sdp_p
->debug_str
, (unsigned)level
, (unsigned)inst_num
);
6368 sdp_p
->conf_p
->num_invalid_param
++;
6371 return (attr_p
->attr
.extmap
.id
);
6375 /* Function: sdp_attr_set_extmap
6376 * Description: Sets the value of an rtcp-fb:...ccm attribute
6377 * Parameters: sdp_p The SDP handle returned by sdp_init_description.
6378 * level The level to set the attribute.
6379 * id The id to set the attribute.
6380 * uri The uri to set the attribute.
6381 * inst The attribute instance number to check.
6382 * Returns: SDP_SUCCESS Attribute param was set successfully.
6383 * SDP_INVALID_PARAMETER Specified attribute is not defined.
6386 sdp_attr_set_extmap(sdp_t
*sdp_p
, uint16_t level
, uint16_t id
, const char* uri
, uint16_t inst
)
6390 attr_p
= sdp_find_attr(sdp_p
, level
, 0, SDP_ATTR_EXTMAP
, inst
);
6392 if (sdp_p
->debug_flag
[SDP_DEBUG_ERRORS
]) {
6393 SDPLogError(logTag
, "%s extmap attribute, level %u "
6394 "instance %u not found.", sdp_p
->debug_str
, (unsigned)level
,
6397 sdp_p
->conf_p
->num_invalid_param
++;
6398 return (SDP_INVALID_PARAMETER
);
6401 attr_p
->attr
.extmap
.id
= id
;
6402 sstrncpy(attr_p
->attr
.extmap
.uri
, uri
, SDP_MAX_STRING_LEN
+1);
6403 return (SDP_SUCCESS
);
6406 const char *sdp_attr_get_msid_identifier(sdp_t
*sdp_p
, uint16_t level
,
6407 uint8_t cap_num
, uint16_t inst
)
6409 sdp_attr_t
*attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
6410 SDP_ATTR_MSID
, inst
);
6414 return attr_p
->attr
.msid
.identifier
;
6417 const char *sdp_attr_get_msid_appdata(sdp_t
*sdp_p
, uint16_t level
,
6418 uint8_t cap_num
, uint16_t inst
)
6420 sdp_attr_t
*attr_p
= sdp_find_attr(sdp_p
, level
, cap_num
,
6421 SDP_ATTR_MSID
, inst
);
6425 return attr_p
->attr
.msid
.appdata
;