Asterisk - The Open Source Telephony Project GIT-master-5467495
Loading...
Searching...
No Matches
Data Structures | Macros | Functions | Variables
format_cap.c File Reference

Format Capabilities API. More...

#include "asterisk.h"
#include "asterisk/logger.h"
#include "asterisk/format.h"
#include "asterisk/format_cap.h"
#include "asterisk/format_cache.h"
#include "asterisk/codec.h"
#include "asterisk/astobj2.h"
#include "asterisk/strings.h"
#include "asterisk/vector.h"
#include "asterisk/linkedlists.h"
#include "asterisk/utils.h"
Include dependency graph for format_cap.c:

Go to the source code of this file.

Data Structures

struct  ast_format_cap
 Format capabilities structure, holds formats + preference order + etc. More...
 
struct  format_cap_framed
 Structure used for capability formats, adds framing. More...
 
struct  format_cap_framed_list
 Linked list for formats. More...
 

Macros

#define FORMAT_CAP_FRAMED_ELEM_CLEANUP(elem)   ao2_cleanup((elem))
 format_cap_framed vector element cleanup.
 
#define FORMAT_CAP_FRAMED_ELEM_CMP(elem, value)   ((elem)->format == (value))
 format_cap_framed comparator for AST_VECTOR_REMOVE_CMP_ORDERED()
 

Functions

struct ast_format_cap__ast_format_cap_alloc (enum ast_format_cap_flags flags, const char *tag, const char *file, int line, const char *func)
 
int __ast_format_cap_append (struct ast_format_cap *cap, struct ast_format *format, unsigned int framing, const char *tag, const char *file, int line, const char *func)
 
static const char * __ast_format_cap_get_names (const struct ast_format_cap *cap, struct ast_str **buf, int append)
 
int ast_format_cap_append_by_type (struct ast_format_cap *cap, enum ast_media_type type)
 Add all codecs Asterisk knows about for a specific type to the capabilities structure.
 
int ast_format_cap_append_from_cap (struct ast_format_cap *dst, const struct ast_format_cap *src, enum ast_media_type type)
 Append the formats of provided type in src to dst.
 
const char * ast_format_cap_append_names (const struct ast_format_cap *cap, struct ast_str **buf)
 Append the names of codecs of a set of formats to an ast_str buffer.
 
size_t ast_format_cap_count (const struct ast_format_cap *cap)
 Get the number of formats present within the capabilities structure.
 
int ast_format_cap_empty (const struct ast_format_cap *cap)
 Determine if a format cap has no formats in it.
 
struct ast_formatast_format_cap_get_best_by_type (const struct ast_format_cap *cap, enum ast_media_type type)
 Get the most preferred format for a particular media type.
 
int ast_format_cap_get_compatible (const struct ast_format_cap *cap1, const struct ast_format_cap *cap2, struct ast_format_cap *result)
 Find the compatible formats between two capabilities structures.
 
struct ast_formatast_format_cap_get_compatible_format (const struct ast_format_cap *cap, const struct ast_format *format)
 Find if input ast_format is within the capabilities of the ast_format_cap object then return the compatible format from the capabilities structure in the result.
 
struct ast_formatast_format_cap_get_format (const struct ast_format_cap *cap, int position)
 Get the format at a specific index.
 
unsigned int ast_format_cap_get_format_framing (const struct ast_format_cap *cap, const struct ast_format *format)
 Get the framing for a format.
 
unsigned int ast_format_cap_get_framing (const struct ast_format_cap *cap)
 Get the global framing.
 
const char * ast_format_cap_get_names (const struct ast_format_cap *cap, struct ast_str **buf)
 Get the names of codecs of a set of formats.
 
int ast_format_cap_has_type (const struct ast_format_cap *cap, enum ast_media_type type)
 Find out if the capabilities structure has any formats of a specific type.
 
int ast_format_cap_identical (const struct ast_format_cap *cap1, const struct ast_format_cap *cap2)
 Determine if two capabilities structures are identical.
 
int ast_format_cap_iscompatible (const struct ast_format_cap *cap1, const struct ast_format_cap *cap2)
 Determine if any joint capabilities exist between two capabilities structures.
 
enum ast_format_cmp_res ast_format_cap_iscompatible_format (const struct ast_format_cap *cap, const struct ast_format *format)
 Find if ast_format is within the capabilities of the ast_format_cap object.
 
int ast_format_cap_remove (struct ast_format_cap *cap, struct ast_format *format)
 Remove format capability from capability structure.
 
void ast_format_cap_remove_by_type (struct ast_format_cap *cap, enum ast_media_type type)
 Remove all formats matching a specific format type.
 
void ast_format_cap_replace_from_cap (struct ast_format_cap *dst, const struct ast_format_cap *src, enum ast_media_type type)
 Replace the formats of provided type in dst with equivalent formats from src.
 
void ast_format_cap_set_framing (struct ast_format_cap *cap, unsigned int framing)
 Set the global framing.
 
int ast_format_cap_update_by_allow_disallow (struct ast_format_cap *cap, const char *list, int allowing)
 Parse an "allow" or "deny" list and modify a format capabilities structure accordingly.
 
static void format_cap_destroy (void *obj)
 Destructor for format capabilities structure.
 
static void format_cap_framed_destroy (void *obj)
 Destructor for format capabilities framed structure.
 
static int format_cap_framed_init (struct format_cap_framed *framed, struct ast_format_cap *cap, struct ast_format *format, unsigned int framing)
 
static int format_cap_init (struct ast_format_cap *cap, enum ast_format_cap_flags flags)
 Initialize values on an ast_format_cap.
 
static int format_cap_replace (struct ast_format_cap *cap, struct ast_format *format, unsigned int framing)
 
static int format_in_format_cap (struct ast_format_cap *cap, struct ast_format *format)
 
static int internal_format_cap_identical (const struct ast_format_cap *cap1, const struct ast_format_cap *cap2)
 

Variables

static const struct format_cap_framed_list format_cap_framed_list_empty = AST_LIST_HEAD_NOLOCK_INIT_VALUE
 Dummy empty list for when we are inserting a new list.
 

Detailed Description

Format Capabilities API.

Author
Joshua Colp jcolp.nosp@m.@dig.nosp@m.ium.c.nosp@m.om

Definition in file format_cap.c.

Macro Definition Documentation

◆ FORMAT_CAP_FRAMED_ELEM_CLEANUP

#define FORMAT_CAP_FRAMED_ELEM_CLEANUP (   elem)    ao2_cleanup((elem))

format_cap_framed vector element cleanup.

Parameters
elemElement to cleanup

Definition at line 501 of file format_cap.c.

◆ FORMAT_CAP_FRAMED_ELEM_CMP

#define FORMAT_CAP_FRAMED_ELEM_CMP (   elem,
  value 
)    ((elem)->format == (value))

format_cap_framed comparator for AST_VECTOR_REMOVE_CMP_ORDERED()

Parameters
elemElement to compare against
valueValue to compare with the vector element.
Return values
0if element does not match.
Non-zeroif element matches.

Definition at line 494 of file format_cap.c.

Function Documentation

◆ __ast_format_cap_alloc()

struct ast_format_cap * __ast_format_cap_alloc ( enum ast_format_cap_flags  flags,
const char *  tag,
const char *  file,
int  line,
const char *  func 
)

Definition at line 117 of file format_cap.c.

119{
120 struct ast_format_cap *cap;
121
123 tag, file, line, func);
124 if (!cap) {
125 return NULL;
126 }
127
128 if (format_cap_init(cap, flags)) {
129 ao2_ref(cap, -1);
130 return NULL;
131 }
132
133 return cap;
134}
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition astobj2.h:367
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
void * __ao2_alloc(size_t data_size, ao2_destructor_fn destructor_fn, unsigned int options, const char *tag, const char *file, int line, const char *func) attribute_warn_unused_result
Definition astobj2.c:768
static void format_cap_destroy(void *obj)
Destructor for format capabilities structure.
Definition format_cap.c:70
static int format_cap_init(struct ast_format_cap *cap, enum ast_format_cap_flags flags)
Initialize values on an ast_format_cap.
Definition format_cap.c:102
#define NULL
Definition resample.c:96
Format capabilities structure, holds formats + preference order + etc.
Definition format_cap.c:54

References __ao2_alloc(), AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_ref, format_cap_destroy(), format_cap_init(), and NULL.

◆ __ast_format_cap_append()

int __ast_format_cap_append ( struct ast_format_cap cap,
struct ast_format format,
unsigned int  framing,
const char *  tag,
const char *  file,
int  line,
const char *  func 
)

Definition at line 195 of file format_cap.c.

196{
197 struct format_cap_framed *framed;
198
200
201 if (format_in_format_cap(cap, format)) {
202 return 0;
203 }
204
206 if (!framed) {
207 return -1;
208 }
209
210 __ao2_ref(format, +1, tag, file, line, func);
211 framed->format = format;
212
213 return format_cap_framed_init(framed, cap, format, framing);
214}
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition astobj2.h:404
int __ao2_ref(void *o, int delta, const char *tag, const char *file, int line, const char *func)
Definition astobj2.c:498
static void format_cap_framed_destroy(void *obj)
Destructor for format capabilities framed structure.
Definition format_cap.c:142
static int format_in_format_cap(struct ast_format_cap *cap, struct ast_format *format)
Definition format_cap.c:179
static int format_cap_framed_init(struct format_cap_framed *framed, struct ast_format_cap *cap, struct ast_format *format, unsigned int framing)
Definition format_cap.c:149
Structure used for capability formats, adds framing.
Definition format_cap.c:44
struct ast_format * format
A pointer to the format.
Definition format_cap.c:46
unsigned int framing
The format framing size.
Definition format_cap.c:48
#define ast_assert(a)
Definition utils.h:779

References __ao2_ref(), AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ast_assert, format_cap_framed::format, format_cap_framed_destroy(), format_cap_framed_init(), format_in_format_cap(), format_cap_framed::framing, and NULL.

◆ __ast_format_cap_get_names()

static const char * __ast_format_cap_get_names ( const struct ast_format_cap cap,
struct ast_str **  buf,
int  append 
)
static

Definition at line 708 of file format_cap.c.

709{
710 int i;
711
712 if (!buf || !*buf) {
713 return "";
714 }
715
716 if (append) {
717 ast_str_append(buf, 0, "(");
718 } else {
719 ast_str_set(buf, 0, "(");
720 }
721
722 if (!cap || !AST_VECTOR_SIZE(&cap->preference_order)) {
723 ast_str_append(buf, 0, "nothing)");
724 return ast_str_buffer(*buf);
725 }
726
727 for (i = 0; i < AST_VECTOR_SIZE(&cap->preference_order); ++i) {
728 int res;
729 struct format_cap_framed *framed = AST_VECTOR_GET(&cap->preference_order, i);
730
731 res = ast_str_append(buf, 0, "%s%s", ast_format_get_name(framed->format),
732 i < AST_VECTOR_SIZE(&cap->preference_order) - 1 ? "|" : "");
733 if (res < 0) {
734 break;
735 }
736 }
737 ast_str_append(buf, 0, ")");
738
739 return ast_str_buffer(*buf);
740}
char buf[BUFSIZE]
Definition eagi_proxy.c:66
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition format.c:334
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition strings.h:1139
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition strings.h:1113
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761
struct ast_format_cap::@383 preference_order
Vector of formats, added in preference order.
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition vector.h:637
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition vector.h:708

References ast_format_get_name(), ast_str_append(), ast_str_buffer(), ast_str_set(), AST_VECTOR_GET, AST_VECTOR_SIZE, buf, format_cap_framed::format, and ast_format_cap::preference_order.

Referenced by ast_format_cap_append_names(), and ast_format_cap_get_names().

◆ ast_format_cap_append_by_type()

int ast_format_cap_append_by_type ( struct ast_format_cap cap,
enum ast_media_type  type 
)

Add all codecs Asterisk knows about for a specific type to the capabilities structure.

Parameters
capThe capabilities structure to add to.
typeThe type of formats to add.
Return values
0success
-1failure
Note
A generic format with no attributes is created using the codec.
If AST_MEDIA_TYPE_UNKNOWN is passed as the type all known codecs will be added.

Definition at line 216 of file format_cap.c.

217{
218 int id;
219
220 for (id = 1; id < ast_codec_get_max(); ++id) {
221 struct ast_codec *codec = ast_codec_get_by_id(id);
222 struct ast_codec *codec2 = NULL;
223 struct ast_format *format;
224 int res;
225
226 if (!codec) {
227 continue;
228 }
229
230 if ((type != AST_MEDIA_TYPE_UNKNOWN) && codec->type != type) {
231 ao2_ref(codec, -1);
232 continue;
233 }
234
236
237 if (format == ast_format_none) {
238 ao2_ref(format, -1);
239 ao2_ref(codec, -1);
240 continue;
241 }
242
243 if (format) {
245 }
246 if (codec != codec2) {
247 ao2_cleanup(format);
248 format = ast_format_create(codec);
249 }
251 ao2_ref(codec, -1);
252
253 if (!format) {
254 return -1;
255 }
256
257 /* Use the global framing or default framing of the codec */
258 res = ast_format_cap_append(cap, format, 0);
259 ao2_ref(format, -1);
260
261 if (res) {
262 return -1;
263 }
264 }
265
266 return 0;
267}
enum queue_result id
Definition app_queue.c:1790
#define ao2_cleanup(obj)
Definition astobj2.h:1934
static const char type[]
@ AST_MEDIA_TYPE_UNKNOWN
Definition codec.h:31
struct ast_codec * ast_codec_get_by_id(int id)
Retrieve a codec given the unique identifier.
Definition codec.c:338
int ast_codec_get_max(void)
Retrieve the current maximum identifier for codec iteration.
Definition codec.c:343
static struct ast_codec codec2
struct ast_codec * ast_format_get_codec(const struct ast_format *format)
Get the codec associated with a format.
Definition format.c:324
struct ast_format * ast_format_create(struct ast_codec *codec)
Create a new media format.
Definition format.c:196
struct ast_format * ast_format_cache_get_by_codec(const struct ast_codec *codec)
Retrieve a format from the cache by its codec.
struct ast_format * ast_format_none
Built-in "null" format.
#define ast_format_cap_append(cap, format, framing)
Add format capability to capabilities structure.
Definition format_cap.h:99
Represents a media codec within Asterisk.
Definition codec.h:42
enum ast_media_type type
Type of media this codec contains.
Definition codec.h:50
Definition of a media format.
Definition format.c:43
struct ast_codec * codec
Pointer to the codec in use for this format.
Definition format.c:47

References ao2_cleanup, ao2_ref, ast_codec_get_by_id(), ast_codec_get_max(), ast_format_cache_get_by_codec(), ast_format_cap_append, ast_format_create(), ast_format_get_codec(), ast_format_none, AST_MEDIA_TYPE_UNKNOWN, ast_format::codec, codec2, id, NULL, type, and ast_codec::type.

Referenced by ast_ari_channels_create(), ast_format_cap_update_by_allow_disallow(), ast_local_init(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), begin_dial_prerun(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), rec_request(), and register_channel_tech().

◆ ast_format_cap_append_from_cap()

int ast_format_cap_append_from_cap ( struct ast_format_cap dst,
const struct ast_format_cap src,
enum ast_media_type  type 
)

Append the formats of provided type in src to dst.

Parameters
dstThe destination capabilities structure
srcThe source capabilities structure
typeThe type of formats to append.
Return values
0success
-1failure
Note
If AST_MEDIA_TYPE_UNKNOWN is passed as the type all known codecs will be added.

Definition at line 269 of file format_cap.c.

271{
272 int idx, res = 0;
273
274 if (!src) {
275 return 0;
276 }
277
278 /* NOTE: The streams API is dependent on the formats being in "preference" order */
279 for (idx = 0; (idx < AST_VECTOR_SIZE(&src->preference_order)) && !res; ++idx) {
280 struct format_cap_framed *framed = AST_VECTOR_GET(&src->preference_order, idx);
281
283 res = ast_format_cap_append(dst, framed->format, framed->framing);
284 }
285 }
286
287 return res;
288}
enum ast_media_type ast_format_get_type(const struct ast_format *format)
Get the media type of a format.
Definition format.c:354

References ast_format_cap_append, ast_format_get_type(), AST_MEDIA_TYPE_UNKNOWN, AST_VECTOR_GET, AST_VECTOR_SIZE, format_cap_framed::format, format_cap_framed::framing, ast_format_cap::preference_order, and type.

Referenced by ast_media_get_format_cap(), ast_sip_create_joint_call_cap(), ast_stream_clone(), ast_stream_create_resolved(), ast_stream_topology_create_from_format_cap(), ast_stream_topology_get_formats_by_type(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), build_device(), build_peer(), build_user(), chan_pjsip_get_codec(), chan_pjsip_new(), chan_pjsip_read_stream(), chan_rtp_get_codec(), channel_do_masquerade(), create_outgoing_sdp_stream(), func_channel_read(), jingle_alloc(), jingle_call(), jingle_interpret_content(), jingle_new(), load_module(), media_offer_write_av(), ooh323_alloc(), ooh323_get_codec(), ooh323_onReceivedSetup(), ooh323_request(), request_channel(), send_direct_media_request(), set_caps(), speech_engine_alloc_and_register(), unistim_line_copy(), unistim_new(), and unistim_request().

◆ ast_format_cap_append_names()

const char * ast_format_cap_append_names ( const struct ast_format_cap cap,
struct ast_str **  buf 
)

Append the names of codecs of a set of formats to an ast_str buffer.

Since
18
Parameters
capThe capabilities structure containing the formats
bufA ast_str buffer to append the names of the formats to
Returns
The contents of the buffer in buf

Definition at line 747 of file format_cap.c.

748{
749 return __ast_format_cap_get_names(cap, buf, 1);
750}
static const char * __ast_format_cap_get_names(const struct ast_format_cap *cap, struct ast_str **buf, int append)
Definition format_cap.c:708

References __ast_format_cap_get_names(), and buf.

Referenced by ast_stream_create_resolved(), and ast_stream_to_str().

◆ ast_format_cap_count()

size_t ast_format_cap_count ( const struct ast_format_cap cap)

◆ ast_format_cap_empty()

int ast_format_cap_empty ( const struct ast_format_cap cap)

Determine if a format cap has no formats in it.

Parameters
capThe format cap to check for emptiness
Return values
1The format cap has zero formats or only ast_format_none
0The format cap has at least one format

Definition at line 752 of file format_cap.c.

753{
754 int count = ast_format_cap_count(cap);
755
756 if (count > 1) {
757 return 0;
758 }
759
760 if (count == 0 || AST_VECTOR_GET(&cap->preference_order, 0)->format == ast_format_none) {
761 return 1;
762 }
763
764 return 0;
765}
size_t ast_format_cap_count(const struct ast_format_cap *cap)
Get the number of formats present within the capabilities structure.
Definition format_cap.c:403

References ast_format_cap_count(), ast_format_none, AST_VECTOR_GET, and ast_format_cap::preference_order.

Referenced by ast_sip_create_joint_call_cap(), ast_stream_create_resolved(), ast_translator_best_choice(), chan_pjsip_new(), request_channel(), set_format(), and set_incoming_call_offer_cap().

◆ ast_format_cap_get_best_by_type()

struct ast_format * ast_format_cap_get_best_by_type ( const struct ast_format_cap cap,
enum ast_media_type  type 
)

Get the most preferred format for a particular media type.

Parameters
capThe capabilities structure
typeThe type of media to get
Return values
non-NULLthe preferred format
NULLno media of type present
Note
The reference count of the returned format is increased. It must be released using ao2_ref or ao2_cleanup.

Definition at line 425 of file format_cap.c.

426{
427 int i;
428
430 return ast_format_cap_get_format(cap, 0);
431 }
432
433 for (i = 0; i < AST_VECTOR_SIZE(&cap->preference_order); i++) {
434 struct format_cap_framed *framed = AST_VECTOR_GET(&cap->preference_order, i);
435
436 if (ast_format_get_type(framed->format) == type) {
437 ao2_ref(framed->format, +1);
439 return framed->format;
440 }
441 }
442
443 return NULL;
444}
struct ast_format * ast_format_cap_get_format(const struct ast_format_cap *cap, int position)
Get the format at a specific index.
Definition format_cap.c:408

References ao2_ref, ast_assert, ast_format_cap_get_format(), ast_format_get_type(), ast_format_none, AST_MEDIA_TYPE_UNKNOWN, AST_VECTOR_GET, AST_VECTOR_SIZE, format_cap_framed::format, NULL, ast_format_cap::preference_order, and type.

Referenced by AST_TEST_DEFINE(), chan_pjsip_new(), set_caps(), set_format(), and sip_session_response_cb().

◆ ast_format_cap_get_compatible()

int ast_format_cap_get_compatible ( const struct ast_format_cap cap1,
const struct ast_format_cap cap2,
struct ast_format_cap result 
)

Find the compatible formats between two capabilities structures.

Parameters
cap1The first capabilities structure
cap2The second capabilities structure
[out]resultThe capabilities structure to place the results into
Return values
0success
-1failure
Note
The preference order of cap1 is respected.
If failure occurs the result format capabilities structure may contain a partial result.

Definition at line 636 of file format_cap.c.

638{
639 int idx, res = 0;
640
641 for (idx = 0; idx < AST_VECTOR_SIZE(&cap1->preference_order); ++idx) {
642 struct format_cap_framed *framed = AST_VECTOR_GET(&cap1->preference_order, idx);
643 struct ast_format *format;
644
645 format = ast_format_cap_get_compatible_format(cap2, framed->format);
646 if (!format) {
647 continue;
648 }
649
650 res = ast_format_cap_append(result, format, framed->framing);
651 ao2_ref(format, -1);
652
653 if (res) {
654 break;
655 }
656 }
657
658 return res;
659}
static PGresult * result
Definition cel_pgsql.c:84
struct ast_format * ast_format_cap_get_compatible_format(const struct ast_format_cap *cap, const struct ast_format *format)
Find if input ast_format is within the capabilities of the ast_format_cap object then return the comp...
Definition format_cap.c:554

References ao2_ref, ast_format_cap_append, ast_format_cap_get_compatible_format(), AST_VECTOR_GET, AST_VECTOR_SIZE, format_cap_framed::format, format_cap_framed::framing, ast_format_cap::preference_order, and result.

Referenced by ast_sip_create_joint_call_cap(), ast_speech_new(), ast_stream_create_resolved(), AST_TEST_DEFINE(), ast_translator_best_choice(), create_outgoing_sdp_stream(), iax2_request(), jingle_interpret_description(), set_caps(), and sip_session_refresh().

◆ ast_format_cap_get_compatible_format()

struct ast_format * ast_format_cap_get_compatible_format ( const struct ast_format_cap cap,
const struct ast_format format 
)

Find if input ast_format is within the capabilities of the ast_format_cap object then return the compatible format from the capabilities structure in the result.

Return values
non-NULLif format is compatible
NULLif not compatible
Note
The reference count of the returned format is increased. It must be released using ao2_ref or ao2_cleanup.

Definition at line 554 of file format_cap.c.

555{
556 struct format_cap_framed_list *list;
557 struct format_cap_framed *framed;
558 struct ast_format *result = NULL;
559
560 ast_assert(format != NULL);
561
562 if (ast_format_get_codec_id(format) >= AST_VECTOR_SIZE(&cap->formats)) {
563 return NULL;
564 }
565
567
568 AST_LIST_TRAVERSE(list, framed, entry) {
569 enum ast_format_cmp_res res = ast_format_cmp(format, framed->format);
570
571 if (res == AST_FORMAT_CMP_NOT_EQUAL) {
572 continue;
573 }
574
575 /* Replace any current result, this one will also be a subset OR an exact match */
577
578 result = ast_format_joint(format, framed->format);
579
580 /* If it's a match we can do no better so return asap */
581 if (res == AST_FORMAT_CMP_EQUAL) {
582 break;
583 }
584 }
585
586 return result;
587}
unsigned int ast_format_get_codec_id(const struct ast_format *format)
Get the codec identifier associated with a format.
Definition format.c:329
struct ast_format * ast_format_joint(const struct ast_format *format1, const struct ast_format *format2)
Get a common joint capability between two formats.
Definition format.c:226
enum ast_format_cmp_res ast_format_cmp(const struct ast_format *format1, const struct ast_format *format2)
Compare two formats.
Definition format.c:201
ast_format_cmp_res
Format comparison results.
Definition format.h:34
@ AST_FORMAT_CMP_EQUAL
Definition format.h:36
@ AST_FORMAT_CMP_NOT_EQUAL
Definition format.h:38
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
struct ast_format_cap::@382 formats
Vector of formats, indexed using the codec identifier.
Linked list for formats.
Definition format_cap.c:64
#define AST_VECTOR_GET_ADDR(vec, idx)
Get an address of element in a vector.
Definition vector.h:696

References ao2_cleanup, ast_assert, ast_format_cmp(), AST_FORMAT_CMP_EQUAL, AST_FORMAT_CMP_NOT_EQUAL, ast_format_get_codec_id(), ast_format_joint(), AST_LIST_TRAVERSE, AST_VECTOR_GET_ADDR, AST_VECTOR_SIZE, format_cap_framed::format, ast_format_cap::formats, NULL, and result.

Referenced by ast_format_cap_get_compatible(), AST_TEST_DEFINE(), ast_translate_available_formats(), and codec_choose_from_prefs().

◆ ast_format_cap_get_format()

struct ast_format * ast_format_cap_get_format ( const struct ast_format_cap cap,
int  position 
)

Get the format at a specific index.

Parameters
capThe capabilities structure
positionThe position to get
Return values
non-NULLsuccess
NULLfailure
Note
This is a zero based index.
Formats are returned in order of preference.
The reference count of the returned format is increased. It must be released using ao2_ref or ao2_cleanup.

Definition at line 408 of file format_cap.c.

409{
410 struct format_cap_framed *framed;
411
413
414 if (position >= AST_VECTOR_SIZE(&cap->preference_order)) {
415 return NULL;
416 }
417
418 framed = AST_VECTOR_GET(&cap->preference_order, position);
419
421 ao2_ref(framed->format, +1);
422 return framed->format;
423}

References ao2_ref, ast_assert, ast_format_none, AST_VECTOR_GET, AST_VECTOR_SIZE, format_cap_framed::format, NULL, and ast_format_cap::preference_order.

Referenced by add_format_information_cb(), apply_cap_to_bundled(), ast_format_cap_get_best_by_type(), ast_iax2_new(), ast_openvstream(), ast_rtp_lookup_mime_multiple2(), ast_sip_create_joint_call_cap(), ast_speech_new(), ast_stream_create_resolved(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_translate_available_formats(), ast_translator_best_choice(), ast_unreal_new_channels(), audiosocket_request(), chan_pjsip_new(), check_translation_path(), configure_local_rtp(), create_addr(), create_outgoing_sdp_stream(), derive_format_from_cap(), iax2_codec_pref_string(), iax2_format_compatibility_cap2bitfield(), iax2_parse_allow_disallow(), iax2_request(), internal_format_cap_identical(), jingle_add_payloads_to_description(), jingle_interpret_content(), jingle_new(), media_offer_read_av(), mp3_exec(), ooh323_new(), ooh323c_set_capability(), ooh323c_set_capability_for_call(), set_caps(), show_sound_info_cb(), start_rtp(), unistim_new(), and webchan_request().

◆ ast_format_cap_get_format_framing()

unsigned int ast_format_cap_get_format_framing ( const struct ast_format_cap cap,
const struct ast_format format 
)

Get the framing for a format.

Parameters
capThe capabilities structure
formatThe format to retrieve
Returns
the framing (in milliseconds)

Definition at line 451 of file format_cap.c.

452{
453 unsigned int framing;
454 struct format_cap_framed_list *list;
455 struct format_cap_framed *framed, *result = NULL;
456
458 return 0;
459 }
460
461 framing = cap->framing != UINT_MAX ? cap->framing : ast_format_get_default_ms(format);
463
464 AST_LIST_TRAVERSE(list, framed, entry) {
465 enum ast_format_cmp_res res = ast_format_cmp(format, framed->format);
466
467 if (res == AST_FORMAT_CMP_NOT_EQUAL) {
468 continue;
469 }
470
471 result = framed;
472
473 if (res == AST_FORMAT_CMP_EQUAL) {
474 break;
475 }
476 }
477
478 if (result && result->framing) {
480 }
481
482 return framing;
483}
unsigned int ast_format_get_default_ms(const struct ast_format *format)
Get the default framing size (in milliseconds) for a format.
Definition format.c:359
unsigned int framing
Global framing size, applies to all formats if no framing present on format.
Definition format_cap.c:60
struct format_cap_framed::@381 entry
Linked list information.

References ast_format_cmp(), AST_FORMAT_CMP_EQUAL, AST_FORMAT_CMP_NOT_EQUAL, ast_format_get_codec_id(), ast_format_get_default_ms(), AST_LIST_TRAVERSE, AST_VECTOR_GET_ADDR, AST_VECTOR_SIZE, format_cap_framed::entry, format_cap_framed::format, ast_format_cap::formats, format_cap_framed::framing, ast_format_cap::framing, NULL, and result.

Referenced by AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), create_addr(), iax2_parse_allow_disallow(), native_rtp_bridge_compatible_check(), and ooh323c_set_capability_for_call().

◆ ast_format_cap_get_framing()

unsigned int ast_format_cap_get_framing ( const struct ast_format_cap cap)

Get the global framing.

Parameters
capThe capabilities structure.
Return values
0if no formats are in the structure and no framing has been provided
Returns
The global framing value (in milliseconds)
Note
This will be the minimum framing allowed across all formats in the capabilities structure, or an overridden value

Definition at line 446 of file format_cap.c.

447{
448 return (cap->framing != UINT_MAX) ? cap->framing : 0;
449}

References ast_format_cap::framing.

Referenced by ast_stream_create_resolved(), ast_stream_topology_create_from_format_cap(), AST_TEST_DEFINE(), configure_local_rtp(), create_outgoing_sdp_stream(), jingle_enable_video(), jingle_new(), and set_caps().

◆ ast_format_cap_get_names()

const char * ast_format_cap_get_names ( const struct ast_format_cap cap,
struct ast_str **  buf 
)

◆ ast_format_cap_has_type()

int ast_format_cap_has_type ( const struct ast_format_cap cap,
enum ast_media_type  type 
)

Find out if the capabilities structure has any formats of a specific type.

Return values
1true
0false, no formats of specific type.

Definition at line 621 of file format_cap.c.

622{
623 int idx;
624
625 for (idx = 0; idx < AST_VECTOR_SIZE(&cap->preference_order); ++idx) {
626 struct format_cap_framed *framed = AST_VECTOR_GET(&cap->preference_order, idx);
627
628 if (ast_format_get_type(framed->format) == type) {
629 return 1;
630 }
631 }
632
633 return 0;
634}

References ast_format_get_type(), AST_VECTOR_GET, AST_VECTOR_SIZE, format_cap_framed::format, ast_format_cap::preference_order, and type.

Referenced by ast_bridge_update_talker_src_video_mode(), ast_channel_make_compatible_helper(), ast_openvstream(), ast_sendtext_data(), ast_stream_topology_create_from_format_cap(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), jingle_enable_video(), jingle_request(), negotiate_incoming_sdp_stream(), ooh323_request(), and openstream_internal().

◆ ast_format_cap_identical()

int ast_format_cap_identical ( const struct ast_format_cap cap1,
const struct ast_format_cap cap2 
)

Determine if two capabilities structures are identical.

Parameters
cap1The first capabilities structure
cap2The second capabilities structure
Return values
0capabilities are not identical
1capabilities are identical

Definition at line 695 of file format_cap.c.

696{
698 return 0; /* if they are not the same size, they are not identical */
699 }
700
701 if (!internal_format_cap_identical(cap1, cap2)) {
702 return 0;
703 }
704
705 return internal_format_cap_identical(cap2, cap1);
706}
static int internal_format_cap_identical(const struct ast_format_cap *cap1, const struct ast_format_cap *cap2)
Definition format_cap.c:676

References AST_VECTOR_SIZE, internal_format_cap_identical(), and ast_format_cap::preference_order.

Referenced by ast_stream_topology_equal(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), load_engine(), and send_direct_media_request().

◆ ast_format_cap_iscompatible()

int ast_format_cap_iscompatible ( const struct ast_format_cap cap1,
const struct ast_format_cap cap2 
)

Determine if any joint capabilities exist between two capabilities structures.

Parameters
cap1The first capabilities structure
cap2The second capabilities structure
Return values
0no joint capabilities exist
1joint capabilities exist

Definition at line 661 of file format_cap.c.

662{
663 int idx;
664
665 for (idx = 0; idx < AST_VECTOR_SIZE(&cap1->preference_order); ++idx) {
666 struct format_cap_framed *framed = AST_VECTOR_GET(&cap1->preference_order, idx);
667
669 return 1;
670 }
671 }
672
673 return 0;
674}
enum ast_format_cmp_res ast_format_cap_iscompatible_format(const struct ast_format_cap *cap, const struct ast_format *format)
Find if ast_format is within the capabilities of the ast_format_cap object.
Definition format_cap.c:589

References ast_format_cap_iscompatible_format(), AST_FORMAT_CMP_NOT_EQUAL, AST_VECTOR_GET, AST_VECTOR_SIZE, format_cap_framed::format, and ast_format_cap::preference_order.

Referenced by ast_openvstream(), ast_rtp_instance_early_bridge(), ast_rtp_instance_early_bridge_make_compatible(), AST_TEST_DEFINE(), compatible_formats_exist(), console_request(), native_rtp_bridge_compatible_check(), and unistim_request().

◆ ast_format_cap_iscompatible_format()

enum ast_format_cmp_res ast_format_cap_iscompatible_format ( const struct ast_format_cap cap,
const struct ast_format format 
)

Find if ast_format is within the capabilities of the ast_format_cap object.

Returns
ast_format_cmp_res representing the result of the compatibility check between cap and format.

Definition at line 589 of file format_cap.c.

591{
593 struct format_cap_framed_list *list;
594 struct format_cap_framed *framed;
595
597
600 }
601
603
604 AST_LIST_TRAVERSE(list, framed, entry) {
605 enum ast_format_cmp_res cmp = ast_format_cmp(format, framed->format);
606
607 if (cmp == AST_FORMAT_CMP_NOT_EQUAL) {
608 continue;
609 }
610
611 res = cmp;
612
613 if (res == AST_FORMAT_CMP_EQUAL) {
614 break;
615 }
616 }
617
618 return res;
619}

References ast_assert, ast_format_cmp(), AST_FORMAT_CMP_EQUAL, AST_FORMAT_CMP_NOT_EQUAL, ast_format_get_codec_id(), AST_LIST_TRAVERSE, AST_VECTOR_GET_ADDR, AST_VECTOR_SIZE, format_cap_framed::entry, format_cap_framed::format, ast_format_cap::formats, and NULL.

Referenced by ast_format_cap_iscompatible(), ast_speech_new(), AST_TEST_DEFINE(), chan_pjsip_indicate(), chan_pjsip_read_stream(), chan_pjsip_write_stream(), check_translation_path(), internal_format_cap_identical(), is_compatible_format(), jingle_read(), jingle_write(), mbl_request(), ooh323_rtp_read(), ooh323_write(), start_rtp(), unistim_rtp_read(), and unistim_write().

◆ ast_format_cap_remove()

int ast_format_cap_remove ( struct ast_format_cap cap,
struct ast_format format 
)

Remove format capability from capability structure.

Note
format must be an exact pointer match to remove from capabilities structure.
Return values
0remove was successful
-1remove failed. Could not find format to remove

Definition at line 503 of file format_cap.c.

504{
505 struct format_cap_framed_list *list;
506 struct format_cap_framed *framed;
507
509
511 return -1;
512 }
513
515
516 AST_LIST_TRAVERSE_SAFE_BEGIN(list, framed, entry) {
517 if (!FORMAT_CAP_FRAMED_ELEM_CMP(framed, format)) {
518 continue;
519 }
520
523 break;
524 }
526
529}
#define FORMAT_CAP_FRAMED_ELEM_CLEANUP(elem)
format_cap_framed vector element cleanup.
Definition format_cap.c:501
#define FORMAT_CAP_FRAMED_ELEM_CMP(elem, value)
format_cap_framed comparator for AST_VECTOR_REMOVE_CMP_ORDERED()
Definition format_cap.c:494
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
#define AST_VECTOR_REMOVE_CMP_ORDERED(vec, value, cmp, cleanup)
Remove an element from a vector that matches the given comparison while maintaining order.
Definition vector.h:568

References ast_assert, ast_format_get_codec_id(), AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_VECTOR_GET_ADDR, AST_VECTOR_REMOVE_CMP_ORDERED, AST_VECTOR_SIZE, format_cap_framed::entry, format_cap_framed::format, FORMAT_CAP_FRAMED_ELEM_CLEANUP, FORMAT_CAP_FRAMED_ELEM_CMP, ast_format_cap::formats, NULL, and ast_format_cap::preference_order.

Referenced by ast_format_cap_update_by_allow_disallow(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), and check_translation_path().

◆ ast_format_cap_remove_by_type()

void ast_format_cap_remove_by_type ( struct ast_format_cap cap,
enum ast_media_type  type 
)

Remove all formats matching a specific format type.

Parameters
capThe capabilities structure
typeThe media type to remove formats of
Note
All formats can be removed by using the AST_MEDIA_TYPE_UNKNOWN type.

Definition at line 531 of file format_cap.c.

532{
533 int idx;
534
535 for (idx = 0; idx < AST_VECTOR_SIZE(&cap->formats); ++idx) {
536 struct format_cap_framed_list *list = AST_VECTOR_GET_ADDR(&cap->formats, idx);
537 struct format_cap_framed *framed;
538
539 AST_LIST_TRAVERSE_SAFE_BEGIN(list, framed, entry) {
540 if ((type != AST_MEDIA_TYPE_UNKNOWN) &&
541 ast_format_get_type(framed->format) != type) {
542 continue;
543 }
544
548 ao2_ref(framed, -1);
549 }
551 }
552}

References ao2_ref, ast_format_get_type(), AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_MEDIA_TYPE_UNKNOWN, AST_VECTOR_GET_ADDR, AST_VECTOR_REMOVE_CMP_ORDERED, AST_VECTOR_SIZE, format_cap_framed::entry, format_cap_framed::format, FORMAT_CAP_FRAMED_ELEM_CLEANUP, FORMAT_CAP_FRAMED_ELEM_CMP, ast_format_cap::formats, ast_format_cap::preference_order, and type.

Referenced by action_originate(), ast_format_cap_update_by_allow_disallow(), ast_rtp_codecs_payload_formats(), ast_sip_create_joint_call_cap(), ast_stream_create_resolved(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), chan_pjsip_read_stream(), get_codecs(), jingle_interpret_description(), media_offer_write_av(), originate_exec(), reload_config(), request_channel(), send_direct_media_request(), and set_caps().

◆ ast_format_cap_replace_from_cap()

void ast_format_cap_replace_from_cap ( struct ast_format_cap dst,
const struct ast_format_cap src,
enum ast_media_type  type 
)

Replace the formats of provided type in dst with equivalent formats from src.

Parameters
dstThe destination capabilities structure
srcThe source capabilities structure
typeThe type of formats to replace.
Note
If AST_MEDIA_TYPE_UNKNOWN is passed as the type all known codecs will be replaced.
Formats present in src but not dst will not be appended to dst.

Definition at line 310 of file format_cap.c.

312{
313 int idx;
314
315 if (!src) {
316 return;
317 }
318
319 for (idx = 0; (idx < AST_VECTOR_SIZE(&src->preference_order)); ++idx) {
320 struct format_cap_framed *framed = AST_VECTOR_GET(&src->preference_order, idx);
321
323 format_cap_replace(dst, framed->format, framed->framing);
324 }
325 }
326}
static int format_cap_replace(struct ast_format_cap *cap, struct ast_format *format, unsigned int framing)
Definition format_cap.c:290

References ast_format_get_type(), AST_MEDIA_TYPE_UNKNOWN, AST_VECTOR_GET, AST_VECTOR_SIZE, format_cap_framed::format, format_cap_replace(), format_cap_framed::framing, ast_format_cap::preference_order, and type.

Referenced by AST_TEST_DEFINE().

◆ ast_format_cap_set_framing()

void ast_format_cap_set_framing ( struct ast_format_cap cap,
unsigned int  framing 
)

Set the global framing.

Parameters
capThe capabilities structure.
framingThe framing value (in milliseconds).
Note
This is used if a format does not provide a framing itself. Note that adding subsequent formats to the ast_format_cap structure may override this value, if the framing they require is less than the value set by this function.

Definition at line 136 of file format_cap.c.

137{
138 cap->framing = framing;
139}

References ast_format_cap::framing.

Referenced by ast_rtp_codecs_payload_formats(), ast_stream_create_resolved(), ast_stream_topology_create_from_format_cap(), AST_TEST_DEFINE(), get_codecs(), and ooh323_set_write_format().

◆ ast_format_cap_update_by_allow_disallow()

int ast_format_cap_update_by_allow_disallow ( struct ast_format_cap cap,
const char *  list,
int  allowing 
)

Parse an "allow" or "deny" list and modify a format capabilities structure accordingly.

Parameters
capThe capabilities structure to modify
listThe list containing formats to append or remove
allowingIf zero, start removing formats specified in the list. If non-zero, start appending formats specified in the list.
Return values
0on success
-1on failure

Definition at line 328 of file format_cap.c.

329{
330 int res = 0, all = 0, iter_allowing;
331 char *parse = NULL, *this = NULL, *psize = NULL;
332
333 if (!allowing && ast_strlen_zero(list)) {
334 return 0;
335 }
336
337 parse = ast_strdupa(list);
338
339 /* If the list is being fed to us as a result of ast_format_cap_get_names,
340 * strip off the parenthesis and immediately apply the inverse of the
341 * allowing option
342 */
343 if (parse[0] == '(' && parse[strlen(parse) - 1] == ')') {
344 parse++;
345 parse[strlen(parse) - 1] = '\0';
346
347 if (allowing) {
349 } else {
351 }
352 }
353
354
355 while ((this = ast_strip(strsep(&parse, ",|")))) {
356 int framems = 0;
357 struct ast_format *format = NULL;
358
359 iter_allowing = allowing;
360 if (*this == '!') {
361 this++;
362 iter_allowing = !allowing;
363 }
364 if ((psize = strrchr(this, ':'))) {
365 *psize++ = '\0';
366 ast_debug(1, "Packetization for codec: %s is %s\n", this, psize);
367 if (!sscanf(psize, "%30d", &framems) || (framems < 0)) {
368 framems = 0;
369 res = -1;
370 ast_log(LOG_WARNING, "Bad packetization value for codec %s\n", this);
371 continue;
372 }
373 }
374 all = strcasecmp(this, "all") ? 0 : 1;
375
376 if (!all && !(format = ast_format_cache_get(this))) {
377 ast_log(LOG_WARNING, "Cannot %s unknown format '%s'\n", iter_allowing ? "allow" : "disallow", this);
378 res = -1;
379 continue;
380 }
381
382 if (cap) {
383 if (iter_allowing) {
384 if (all) {
386 } else {
387 ast_format_cap_append(cap, format, framems);
388 }
389 } else {
390 if (all) {
392 } else {
393 ast_format_cap_remove(cap, format);
394 }
395 }
396 }
397
398 ao2_cleanup(format);
399 }
400 return res;
401}
char * strsep(char **str, const char *delims)
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition astmm.h:298
#define ast_log
Definition astobj2.c:42
#define ast_format_cache_get(name)
Retrieve a named format from the cache.
int ast_format_cap_append_by_type(struct ast_format_cap *cap, enum ast_media_type type)
Add all codecs Asterisk knows about for a specific type to the capabilities structure.
Definition format_cap.c:216
int ast_format_cap_remove(struct ast_format_cap *cap, struct ast_format *format)
Remove format capability from capability structure.
Definition format_cap.c:503
void ast_format_cap_remove_by_type(struct ast_format_cap *cap, enum ast_media_type type)
Remove all formats matching a specific format type.
Definition format_cap.c:531
#define ast_debug(level,...)
Log a DEBUG message.
#define LOG_WARNING
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition strings.h:223

References ao2_cleanup, ast_debug, ast_format_cache_get, ast_format_cap_append, ast_format_cap_append_by_type(), ast_format_cap_remove(), ast_format_cap_remove_by_type(), ast_log, AST_MEDIA_TYPE_UNKNOWN, ast_strdupa, ast_strip(), ast_strlen_zero(), LOG_WARNING, NULL, and strsep().

Referenced by action_originate(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), build_peer(), build_user(), codec_handler_fn(), iax2_parse_allow_disallow(), media_offer_write_av(), originate_exec(), parse_line(), reload_config(), and test_create_joint().

◆ format_cap_destroy()

static void format_cap_destroy ( void *  obj)
static

Destructor for format capabilities structure.

Definition at line 70 of file format_cap.c.

71{
72 struct ast_format_cap *cap = obj;
73 int idx;
74
75 for (idx = 0; idx < AST_VECTOR_SIZE(&cap->formats); idx++) {
76 struct format_cap_framed_list *list = AST_VECTOR_GET_ADDR(&cap->formats, idx);
77 struct format_cap_framed *framed;
78
79 while ((framed = AST_LIST_REMOVE_HEAD(list, entry))) {
80 ao2_ref(framed, -1);
81 }
82 }
84
85 for (idx = 0; idx < AST_VECTOR_SIZE(&cap->preference_order); idx++) {
86 struct format_cap_framed *framed = AST_VECTOR_GET(&cap->preference_order, idx);
87
88 /* This will always be non-null, unlike formats */
89 ao2_ref(framed, -1);
90 }
92}
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
#define AST_VECTOR_FREE(vec)
Deallocates this vector.
Definition vector.h:185

References ao2_ref, AST_LIST_REMOVE_HEAD, AST_VECTOR_FREE, AST_VECTOR_GET, AST_VECTOR_GET_ADDR, AST_VECTOR_SIZE, format_cap_framed::entry, ast_format_cap::formats, and ast_format_cap::preference_order.

Referenced by __ast_format_cap_alloc().

◆ format_cap_framed_destroy()

static void format_cap_framed_destroy ( void *  obj)
static

Destructor for format capabilities framed structure.

Definition at line 142 of file format_cap.c.

143{
144 struct format_cap_framed *framed = obj;
145
146 ao2_cleanup(framed->format);
147}

References ao2_cleanup, and format_cap_framed::format.

Referenced by __ast_format_cap_append().

◆ format_cap_framed_init()

static int format_cap_framed_init ( struct format_cap_framed framed,
struct ast_format_cap cap,
struct ast_format format,
unsigned int  framing 
)
inlinestatic

Definition at line 149 of file format_cap.c.

150{
151 struct format_cap_framed_list *list;
152
153 framed->framing = framing;
154
155 if (ast_format_get_codec_id(format) >= AST_VECTOR_SIZE(&cap->formats)) {
157 ao2_ref(framed, -1);
158 return -1;
159 }
160 }
162
163 /* This takes the allocation reference */
164 if (AST_VECTOR_APPEND(&cap->preference_order, framed)) {
165 ao2_ref(framed, -1);
166 return -1;
167 }
168
169 /* Order doesn't matter for formats, so insert at the head for performance reasons */
170 ao2_ref(framed, +1);
171 AST_LIST_INSERT_HEAD(list, framed, entry);
172
173 cap->framing = MIN(cap->framing, framing ? framing : ast_format_get_default_ms(format));
174
175 return 0;
176}
static const struct format_cap_framed_list format_cap_framed_list_empty
Dummy empty list for when we are inserting a new list.
Definition format_cap.c:67
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
#define MIN(a, b)
Definition utils.h:252
#define AST_VECTOR_REPLACE(vec, idx, elem)
Replace an element at a specific position in a vector, growing the vector if needed.
Definition vector.h:295
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition vector.h:267

References ao2_ref, ast_format_get_codec_id(), ast_format_get_default_ms(), AST_LIST_INSERT_HEAD, AST_VECTOR_APPEND, AST_VECTOR_GET_ADDR, AST_VECTOR_REPLACE, AST_VECTOR_SIZE, format_cap_framed_list_empty, ast_format_cap::formats, format_cap_framed::framing, ast_format_cap::framing, MIN, and ast_format_cap::preference_order.

Referenced by __ast_format_cap_append().

◆ format_cap_init()

static int format_cap_init ( struct ast_format_cap cap,
enum ast_format_cap_flags  flags 
)
inlinestatic

Initialize values on an ast_format_cap.

Parameters
capast_format_cap to initialize
flagsUnused.
Return values
0Success
-1Failure

Definition at line 102 of file format_cap.c.

103{
104 if (AST_VECTOR_INIT(&cap->formats, 0)) {
105 return -1;
106 }
107
108 /* TODO: Look at common usage of this and determine a good starting point */
109 if (AST_VECTOR_INIT(&cap->preference_order, 5)) {
110 return -1;
111 }
112
113 cap->framing = UINT_MAX;
114 return 0;
115}
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
Definition vector.h:124

References AST_VECTOR_INIT, ast_format_cap::formats, ast_format_cap::framing, and ast_format_cap::preference_order.

Referenced by __ast_format_cap_alloc().

◆ format_cap_replace()

static int format_cap_replace ( struct ast_format_cap cap,
struct ast_format format,
unsigned int  framing 
)
static

Definition at line 290 of file format_cap.c.

291{
292 struct format_cap_framed *framed;
293 int i;
294
296
297 for (i = 0; i < AST_VECTOR_SIZE(&cap->preference_order); i++) {
298 framed = AST_VECTOR_GET(&cap->preference_order, i);
299
301 ao2_t_replace(framed->format, format, "replacing with new format");
302 framed->framing = framing;
303 return 0;
304 }
305 }
306
307 return -1;
308}
#define ao2_t_replace(dst, src, tag)
Definition astobj2.h:504

References ao2_t_replace, ast_assert, ast_format_get_codec_id(), AST_VECTOR_GET, AST_VECTOR_SIZE, format_cap_framed::format, format_cap_framed::framing, NULL, and ast_format_cap::preference_order.

Referenced by ast_format_cap_replace_from_cap().

◆ format_in_format_cap()

static int format_in_format_cap ( struct ast_format_cap cap,
struct ast_format format 
)
static

Definition at line 179 of file format_cap.c.

180{
181 struct format_cap_framed *framed;
182 int i;
183
184 for (i = 0; i < AST_VECTOR_SIZE(&cap->preference_order); i++) {
185 framed = AST_VECTOR_GET(&cap->preference_order, i);
186
188 return 1;
189 }
190 }
191
192 return 0;
193}

References ast_format_get_codec_id(), AST_VECTOR_GET, AST_VECTOR_SIZE, format_cap_framed::format, and ast_format_cap::preference_order.

Referenced by __ast_format_cap_append().

◆ internal_format_cap_identical()

static int internal_format_cap_identical ( const struct ast_format_cap cap1,
const struct ast_format_cap cap2 
)
static

Definition at line 676 of file format_cap.c.

677{
678 int idx;
679 struct ast_format *tmp;
680
681 for (idx = 0; idx < AST_VECTOR_SIZE(&cap1->preference_order); ++idx) {
682 tmp = ast_format_cap_get_format(cap1, idx);
683
685 ao2_ref(tmp, -1);
686 return 0;
687 }
688
689 ao2_ref(tmp, -1);
690 }
691
692 return 1;
693}

References ao2_ref, ast_format_cap_get_format(), ast_format_cap_iscompatible_format(), AST_FORMAT_CMP_EQUAL, AST_VECTOR_SIZE, and ast_format_cap::preference_order.

Referenced by ast_format_cap_identical().

Variable Documentation

◆ format_cap_framed_list_empty

const struct format_cap_framed_list format_cap_framed_list_empty = AST_LIST_HEAD_NOLOCK_INIT_VALUE
static

Dummy empty list for when we are inserting a new list.

Definition at line 67 of file format_cap.c.

Referenced by format_cap_framed_init().