Asterisk - The Open Source Telephony Project GIT-master-f36a736
Data Structures | Macros | Functions | Variables
stream.c File Reference

Media Stream API. More...

#include "asterisk.h"
#include "asterisk/logger.h"
#include "asterisk/stream.h"
#include "asterisk/strings.h"
#include "asterisk/format.h"
#include "asterisk/format_cap.h"
#include "asterisk/vector.h"
#include "asterisk/config.h"
#include "asterisk/rtp_engine.h"
Include dependency graph for stream.c:

Go to the source code of this file.

Data Structures

struct  ast_stream
 
struct  ast_stream_metadata_entry
 
struct  ast_stream_topology
 

Macros

#define MIN_STREAM_NAME_LEN   16
 
#define set_pref_value(_name, _value, _prefs, _UC, _lc, _error_message)
 
#define TOPOLOGY_INITIAL_STREAM_COUNT   2
 

Functions

struct ast_streamast_stream_alloc (const char *name, enum ast_media_type type)
 Create a new media stream representation. More...
 
struct ast_streamast_stream_clone (const struct ast_stream *stream, const char *name)
 Create a deep clone of an existing stream. More...
 
int ast_stream_codec_prefs_parse (const char *pref_string, struct ast_stream_codec_negotiation_prefs *prefs, struct ast_str **error_message)
 Parses a string representing the codec prefs into a ast_stream_codec_negotiation_pref structure. More...
 
const char * ast_stream_codec_prefs_to_str (const struct ast_stream_codec_negotiation_prefs *prefs, struct ast_str **buf)
 Return a string representing the codec preferences. More...
 
struct ast_streamast_stream_create_resolved (struct ast_stream *pending_stream, struct ast_stream *validation_stream, struct ast_stream_codec_negotiation_prefs *prefs, struct ast_str **error_message)
 Create a resolved stream from 2 streams. More...
 
void ast_stream_free (struct ast_stream *stream)
 Destroy a media stream representation. More...
 
int ast_stream_get_format_count (const struct ast_stream *stream)
 Get the count of the current negotiated formats of a stream. More...
 
const struct ast_format_capast_stream_get_formats (const struct ast_stream *stream)
 Get the current negotiated formats of a stream. More...
 
int ast_stream_get_group (const struct ast_stream *stream)
 Get the stream group that a stream is part of. More...
 
const char * ast_stream_get_metadata (const struct ast_stream *stream, const char *m_key)
 Get a stream metadata value. More...
 
struct ast_variableast_stream_get_metadata_list (const struct ast_stream *stream)
 Get all stream metadata keys. More...
 
const char * ast_stream_get_name (const struct ast_stream *stream)
 Get the name of a stream. More...
 
int ast_stream_get_position (const struct ast_stream *stream)
 Get the position of the stream in the topology. More...
 
struct ast_rtp_codecsast_stream_get_rtp_codecs (const struct ast_stream *stream)
 Get rtp_codecs associated with the stream. More...
 
enum ast_stream_state ast_stream_get_state (const struct ast_stream *stream)
 Get the current state of a stream. More...
 
enum ast_media_type ast_stream_get_type (const struct ast_stream *stream)
 Get the media type of a stream. More...
 
void ast_stream_set_formats (struct ast_stream *stream, struct ast_format_cap *caps)
 Set the current negotiated formats of a stream. More...
 
void ast_stream_set_group (struct ast_stream *stream, int group)
 Set the stream group for a stream. More...
 
int ast_stream_set_metadata (struct ast_stream *stream, const char *m_key, const char *value)
 Set a stream metadata value. More...
 
void ast_stream_set_rtp_codecs (struct ast_stream *stream, struct ast_rtp_codecs *rtp_codecs)
 Set rtp_codecs associated with the stream. More...
 
void ast_stream_set_state (struct ast_stream *stream, enum ast_stream_state state)
 Set the state of a stream. More...
 
void ast_stream_set_type (struct ast_stream *stream, enum ast_media_type type)
 Change the media type of a stream. More...
 
const char * ast_stream_state2str (enum ast_stream_state state)
 Convert the state of a stream into a string. More...
 
enum ast_stream_state ast_stream_str2state (const char *str)
 Convert a string to a stream state. More...
 
const char * ast_stream_to_str (const struct ast_stream *stream, struct ast_str **buf)
 Get a string representing the stream for debugging/display purposes. More...
 
struct ast_stream_topologyast_stream_topology_alloc (void)
 Create a stream topology. More...
 
int ast_stream_topology_append_stream (struct ast_stream_topology *topology, struct ast_stream *stream)
 Append a stream to the topology. More...
 
struct ast_stream_topologyast_stream_topology_clone (const struct ast_stream_topology *topology)
 Create a deep clone of an existing stream topology. More...
 
struct ast_stream_topologyast_stream_topology_create_from_format_cap (struct ast_format_cap *cap)
 A helper function that, given a format capabilities structure, creates a topology and separates the media types in format_cap into separate streams. More...
 
struct ast_stream_topologyast_stream_topology_create_resolved (struct ast_stream_topology *pending_topology, struct ast_stream_topology *configured_topology, struct ast_stream_codec_negotiation_prefs *prefs, struct ast_str **error_message)
 Create a resolved stream topology from 2 topologies. More...
 
int ast_stream_topology_del_stream (struct ast_stream_topology *topology, unsigned int position)
 Delete a specified stream from the given topology. More...
 
int ast_stream_topology_equal (const struct ast_stream_topology *left, const struct ast_stream_topology *right)
 Compare two stream topologies to see if they are equal. More...
 
void ast_stream_topology_free (struct ast_stream_topology *topology)
 Unreference and destroy a stream topology. More...
 
int ast_stream_topology_get_active_count (const struct ast_stream_topology *topology)
 Get the number of active (non-REMOVED) streams in a topology. More...
 
int ast_stream_topology_get_count (const struct ast_stream_topology *topology)
 Get the number of streams in a topology. More...
 
struct ast_streamast_stream_topology_get_first_stream_by_type (const struct ast_stream_topology *topology, enum ast_media_type type)
 Gets the first active stream of a specific type from the topology. More...
 
struct ast_format_capast_stream_topology_get_formats (struct ast_stream_topology *topology)
 Create a format capabilities structure representing the topology. More...
 
struct ast_format_capast_stream_topology_get_formats_by_type (struct ast_stream_topology *topology, enum ast_media_type type)
 Create a format capabilities structure containing all the formats from all the streams of a particular type in the topology. More...
 
struct ast_streamast_stream_topology_get_stream (const struct ast_stream_topology *topology, unsigned int stream_num)
 Get a specific stream from the topology. More...
 
void ast_stream_topology_map (const struct ast_stream_topology *topology, struct ast_vector_int *types, struct ast_vector_int *v0, struct ast_vector_int *v1)
 Map a given topology's streams to the given types. More...
 
int ast_stream_topology_set_stream (struct ast_stream_topology *topology, unsigned int position, struct ast_stream *stream)
 Set a specific position in a topology. More...
 
const char * ast_stream_topology_to_str (const struct ast_stream_topology *topology, struct ast_str **buf)
 Get a string representing the topology for debugging/display purposes. More...
 
static void stream_topology_destroy (void *data)
 

Variables

const char * ast_stream_codec_negotiation_keep_map []
 "keep" enum to string map More...
 
const char * ast_stream_codec_negotiation_operation_map []
 "operation" enum to string map More...
 
const char * ast_stream_codec_negotiation_params_map []
 Preference enum to string map. More...
 
const char * ast_stream_codec_negotiation_prefer_map []
 "prefer" enum to string map More...
 
const char * ast_stream_codec_negotiation_transcode_map []
 "transcode" state enum to string map More...
 
const char * ast_stream_state_map []
 Stream state enum to string map. More...
 

Detailed Description

Media Stream API.

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

Definition in file stream.c.

Macro Definition Documentation

◆ MIN_STREAM_NAME_LEN

#define MIN_STREAM_NAME_LEN   16

Definition at line 231 of file stream.c.

◆ set_pref_value

#define set_pref_value (   _name,
  _value,
  _prefs,
  _UC,
  _lc,
  _error_message 
)

Definition at line 159 of file stream.c.

◆ TOPOLOGY_INITIAL_STREAM_COUNT

#define TOPOLOGY_INITIAL_STREAM_COUNT   2

Definition at line 651 of file stream.c.

Function Documentation

◆ ast_stream_alloc()

struct ast_stream * ast_stream_alloc ( const char *  name,
enum ast_media_type  type 
)

Create a new media stream representation.

Parameters
nameA name for the stream
typeThe media type the stream is handling
Return values
non-NULLsuccess
NULLfailure
Note
This is NOT an AO2 object and has no locking. It is expected that a higher level object provides protection.
The stream will default to an inactive state until changed.
Since
15

Definition at line 233 of file stream.c.

234{
235 struct ast_stream *stream;
236 size_t name_len = MAX(strlen(S_OR(name, "")), MIN_STREAM_NAME_LEN); /* Ensure there is enough room for 'removed' or a type-position */
237
238 stream = ast_calloc(1, sizeof(*stream) + name_len + 1);
239 if (!stream) {
240 return NULL;
241 }
242
243 stream->type = type;
245 stream->group = -1;
246 strcpy(stream->name, S_OR(name, "")); /* Safe */
247
249 if (!stream->formats) {
250 ast_free(stream);
251 return NULL;
252 }
253
254 return stream;
255}
#define ast_free(a)
Definition: astmm.h:180
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
static const char type[]
Definition: chan_ooh323.c:109
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition: format_cap.h:38
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition: format_cap.h:49
static const char name[]
Definition: format_mp3.c:68
#define NULL
Definition: resample.c:96
#define MIN_STREAM_NAME_LEN
Definition: stream.c:231
@ AST_STREAM_STATE_INACTIVE
Set when the stream is not sending OR receiving media.
Definition: stream.h:94
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
int group
The group that the stream is part of.
Definition: stream.c:110
struct ast_format_cap * formats
Current formats negotiated on the stream.
Definition: stream.c:95
enum ast_media_type type
The type of media the stream is handling.
Definition: stream.c:85
enum ast_stream_state state
The current state of the stream.
Definition: stream.c:100
char name[0]
Name for the stream within the context of the channel it is on.
Definition: stream.c:120
#define MAX(a, b)
Definition: utils.h:233

References ast_calloc, ast_format_cap_alloc, AST_FORMAT_CAP_FLAG_DEFAULT, ast_free, AST_STREAM_STATE_INACTIVE, ast_stream::formats, ast_stream::group, MAX, MIN_STREAM_NAME_LEN, ast_stream::name, name, NULL, S_OR, ast_stream::state, type, and ast_stream::type.

Referenced by ast_stream_topology_create_from_format_cap(), AST_TEST_DEFINE(), ast_unreal_indicate(), handle_incoming_sdp(), make_channel(), sdp_requires_deferral(), and t38_create_media_state().

◆ ast_stream_clone()

struct ast_stream * ast_stream_clone ( const struct ast_stream stream,
const char *  name 
)

Create a deep clone of an existing stream.

Parameters
streamThe existing stream
nameOptional for cloned stream. If NULL, then existing stream's name is copied.
Return values
non-NULLsuccess
NULLfailure
Note
Opaque data pointers set with ast_stream_set_data() are not part of the deep clone. We have no way to clone the data.
Since
15

Definition at line 257 of file stream.c.

258{
259 struct ast_stream *new_stream;
260 const char *stream_name;
261 size_t name_len;
262
263 if (!stream) {
264 return NULL;
265 }
266
267 stream_name = name ?: stream->name;
268 name_len = MAX(strlen(S_OR(stream_name, "")), MIN_STREAM_NAME_LEN); /* Ensure there is enough room for 'removed' or a type-position */
269 new_stream = ast_calloc(1, sizeof(*stream) + name_len + 1);
270 if (!new_stream) {
271 return NULL;
272 }
273
274 memcpy(new_stream, stream, sizeof(*new_stream));
275 strcpy(new_stream->name, stream_name); /* Safe */
276 new_stream->group = -1;
277
279 if (!new_stream->formats) {
280 ast_free(new_stream);
281 return NULL;
282 }
284
285 new_stream->metadata = ast_stream_get_metadata_list(stream);
286
287 /* rtp_codecs aren't cloned */
288
289 return new_stream;
290}
@ AST_MEDIA_TYPE_UNKNOWN
Definition: codec.h:31
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.
Definition: format_cap.c:269
struct ast_variable * ast_stream_get_metadata_list(const struct ast_stream *stream)
Get all stream metadata keys.
Definition: stream.c:439
struct ast_variable * metadata
Stream metadata vector.
Definition: stream.c:105

References ast_calloc, ast_format_cap_alloc, ast_format_cap_append_from_cap(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_free, AST_MEDIA_TYPE_UNKNOWN, ast_stream_get_metadata_list(), ast_stream::formats, ast_stream::group, MAX, ast_stream::metadata, MIN_STREAM_NAME_LEN, ast_stream::name, name, NULL, and S_OR.

Referenced by append_all_streams(), append_source_stream(), ast_sip_session_create_joint_call_stream(), ast_stream_create_resolved(), ast_stream_topology_clone(), ast_stream_topology_create_resolved(), remove_all_original_streams(), resolve_refresh_media_states(), sip_session_refresh(), and stream_echo_topology_alloc().

◆ ast_stream_codec_prefs_parse()

int ast_stream_codec_prefs_parse ( const char *  pref_string,
struct ast_stream_codec_negotiation_prefs prefs,
struct ast_str **  error_message 
)

Parses a string representing the codec prefs into a ast_stream_codec_negotiation_pref structure.

Since
18

This function is mainly used by pjsip_configuration as a sorcery parameter handler.

Parameters
pref_stringA string in the format described by ast_stream_codec_prefs_to_str().
prefsPointer to a ast_stream_codec_negotiation_prefs structure to receive the parsed values.
error_messageAn optional ast_str** into which parsing errors will be placed.
Return values
0if success
-1if failed

Whitespace around the ':' and ',' separators is ignored and the parameters can be specified in any order. Parameters missing in the input string will have their values set to the appropriate *_UNSPECIFIED value and will not be considered an error. It's up to the caller to decide whether set a default value, return an error, etc.

Sample input: "prefer : configured , operation: union,keep:all, transcode:prevent"

Definition at line 181 of file stream.c.

183{
184 char *initial_value = ast_strdupa(pref_string);
185 char *current_value;
186 char *pref;
187 char *saveptr1;
188 char *saveptr2;
189 char *name;
190 char *value;
191
192 if (!prefs) {
193 return -1;
194 }
195
200
201 for (current_value = initial_value; (pref = strtok_r(current_value, ",", &saveptr1)) != NULL; ) {
202 name = strtok_r(pref, ": ", &saveptr2);
203 value = strtok_r(NULL, ": ", &saveptr2);
204
205 if (!name || !value) {
206 if (error_message) {
207 ast_str_append(error_message, 0, "Codec preference '%s' is invalid", pref);
208 }
209 return -1;
210 }
211
212 set_pref_value(name, value, prefs, OPERATION, operation, error_message);
213 set_pref_value(name, value, prefs, PREFER, prefer, error_message);
214 set_pref_value(name, value, prefs, KEEP, keep, error_message);
215 set_pref_value(name, value, prefs, TRANSCODE, transcode, error_message);
216
217 current_value = NULL;
218 }
219
220 return 0;
221}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define set_pref_value(_name, _value, _prefs, _UC, _lc, _error_message)
Definition: stream.c:159
@ CODEC_NEGOTIATION_OPERATION_UNSPECIFIED
Definition: stream.h:160
@ CODEC_NEGOTIATION_KEEP_UNSPECIFIED
Definition: stream.h:178
@ CODEC_NEGOTIATION_TRANSCODE_UNSPECIFIED
Definition: stream.h:192
@ CODEC_NEGOTIATION_PREFER_UNSPECIFIED
Definition: stream.h:146
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
enum ast_stream_codec_negotiation_prefs_transcode_values transcode
Definition: stream.h:300
enum ast_stream_codec_negotiation_prefs_operation_values operation
Definition: stream.h:296
enum ast_stream_codec_negotiation_prefs_keep_values keep
Definition: stream.h:298
enum ast_stream_codec_negotiation_prefs_prefer_values prefer
Definition: stream.h:294
int value
Definition: syslog.c:37

References ast_str_append(), ast_strdupa, CODEC_NEGOTIATION_KEEP_UNSPECIFIED, CODEC_NEGOTIATION_OPERATION_UNSPECIFIED, CODEC_NEGOTIATION_PREFER_UNSPECIFIED, CODEC_NEGOTIATION_TRANSCODE_UNSPECIFIED, ast_stream_codec_negotiation_prefs::keep, name, NULL, ast_stream_codec_negotiation_prefs::operation, ast_stream_codec_negotiation_prefs::prefer, set_pref_value, ast_stream_codec_negotiation_prefs::transcode, and value.

Referenced by codec_prefs_handler().

◆ ast_stream_codec_prefs_to_str()

const char * ast_stream_codec_prefs_to_str ( const struct ast_stream_codec_negotiation_prefs prefs,
struct ast_str **  buf 
)

Return a string representing the codec preferences.

Since
18

This function can be used for debugging purposes but is also used in pjsip_configuration as a sorcery parameter handler

Parameters
prefsA pointer to a ast_stream_codec_negotiation_prefs structure
bufA pointer to an ast_str* used for the output. See note below.
Returns
the contents of the ast_str as a const char *.
Warning
No attempt should ever be made to free the returned char * and it should be dup'd if needed after the ast_str is freed.
Note
buf can't be NULL but it CAN contain a NULL value. If so, a new ast_str will be allocated and the value of buf updated with a pointer to it. Whether the caller supplies the ast_str or it's allocated by this function, it's the caller's responsibility to free it.

Sample output: "prefer: configured, operation: union, keep:all, transcode:prevent"

Definition at line 132 of file stream.c.

133{
134 if (!prefs || !buf || !*buf) {
135 return "";
136 }
137
138 ast_str_append(buf, 0, "%s:%s, %s:%s, %s:%s, %s:%s",
147 );
148
149 return ast_str_buffer(*buf);
150}
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define ast_stream_codec_operation_to_str(value)
Safely get the name of an "operation" parameter value.
Definition: stream.h:264
#define ast_stream_codec_transcode_to_str(value)
Safely get the name of a "transcode" parameter value.
Definition: stream.h:284
@ CODEC_NEGOTIATION_PARAM_PREFER
Definition: stream.h:130
@ CODEC_NEGOTIATION_PARAM_TRANSCODE
Definition: stream.h:136
@ CODEC_NEGOTIATION_PARAM_KEEP
Definition: stream.h:134
@ CODEC_NEGOTIATION_PARAM_OPERATION
Definition: stream.h:132
#define ast_stream_codec_param_to_str(value)
Safely get the name of a preference parameter.
Definition: stream.h:244
#define ast_stream_codec_prefer_to_str(value)
Safely get the name of a "prefer" parameter value.
Definition: stream.h:254
#define ast_stream_codec_keep_to_str(value)
Safely get the name of a "keep" parameter value.
Definition: stream.h:274
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761

References ast_str_append(), ast_str_buffer(), ast_stream_codec_keep_to_str, ast_stream_codec_operation_to_str, ast_stream_codec_param_to_str, ast_stream_codec_prefer_to_str, ast_stream_codec_transcode_to_str, buf, CODEC_NEGOTIATION_PARAM_KEEP, CODEC_NEGOTIATION_PARAM_OPERATION, CODEC_NEGOTIATION_PARAM_PREFER, CODEC_NEGOTIATION_PARAM_TRANSCODE, ast_stream_codec_negotiation_prefs::keep, ast_stream_codec_negotiation_prefs::operation, ast_stream_codec_negotiation_prefs::prefer, and ast_stream_codec_negotiation_prefs::transcode.

Referenced by ast_stream_create_resolved(), and codec_prefs_to_str().

◆ ast_stream_create_resolved()

struct ast_stream * ast_stream_create_resolved ( struct ast_stream pending_stream,
struct ast_stream configured_stream,
struct ast_stream_codec_negotiation_prefs prefs,
struct ast_str **  error_message 
)

Create a resolved stream from 2 streams.

Since
18
Parameters
pending_streamThe "live" stream created from an SDP, passed through the core, or used to create an SDP.
configured_streamThe static stream used to validate the pending stream.
prefsA pointer to an ast_stream_codec_negotiation_prefs structure.
error_messageIf supplied, error messages will be appended.

The resulting stream will contain all of the attributes and metadata of the pending stream but will contain only the formats that passed the validation specified by the ast_stream_codec_negotiation_prefs structure. This may mean that the stream's format_caps will be empty. It's up to the caller to determine what to do with the stream in that case. I.E. Free it, set it to the REMOVED state, etc. A stream will always be returned unless there was some catastrophic allocation failure.

Return values
NULLif there was some allocation failure.
Returns
A new, resolved stream.

Definition at line 525 of file stream.c.

528{
529 struct ast_format_cap *preferred_caps = NULL;
530 struct ast_format_cap *nonpreferred_caps = NULL;
532 struct ast_stream *joint_stream;
533 enum ast_media_type media_type = pending_stream ? pending_stream->type : AST_MEDIA_TYPE_UNKNOWN;
534 int res = 0;
535 SCOPE_ENTER(4, "Pending: %s Validation: %s Prefs: %s\n",
536 ast_str_tmp(128, ast_stream_to_str(pending_stream, &STR_TMP)),
537 ast_str_tmp(128, ast_stream_to_str(validation_stream, &STR_TMP)),
538 ast_str_tmp(128, ast_stream_codec_prefs_to_str(prefs, &STR_TMP)));
539
540 if (!pending_stream || !validation_stream || !prefs || !joint_caps
541 || media_type == AST_MEDIA_TYPE_UNKNOWN) {
542 if (error_message) {
543 ast_str_append(error_message, 0, "Invalid arguments");
544 }
545 ao2_cleanup(joint_caps);
546 SCOPE_EXIT_RTN_VALUE(NULL, "Invalid arguments\n");
547 }
548
550 preferred_caps = pending_stream->formats;
551 nonpreferred_caps = validation_stream->formats;
552 } else {
553 preferred_caps = validation_stream->formats;
554 nonpreferred_caps = pending_stream->formats;
555 }
557
558 switch(prefs->operation) {
560 res = ast_format_cap_append_from_cap(joint_caps, preferred_caps, media_type);
561 break;
563 res = ast_format_cap_append_from_cap(joint_caps, nonpreferred_caps, media_type);
564 break;
566 res = ast_format_cap_get_compatible(preferred_caps, nonpreferred_caps, joint_caps);
567 break;
569 res = ast_format_cap_append_from_cap(joint_caps, preferred_caps, media_type);
570 if (res == 0) {
571 res = ast_format_cap_append_from_cap(joint_caps, nonpreferred_caps, media_type);
572 }
573 break;
574 default:
575 break;
576 }
577
578 if (res) {
579 if (error_message) {
580 ast_str_append(error_message, 0, "No common formats available for media type '%s' ",
581 ast_codec_media_type2str(pending_stream->type));
582 ast_format_cap_append_names(preferred_caps, error_message);
583 ast_str_append(error_message, 0, "<>");
584 ast_format_cap_append_names(nonpreferred_caps, error_message);
585 ast_str_append(error_message, 0, " with prefs: ");
586 ast_stream_codec_prefs_to_str(prefs, error_message);
587 }
588
589 ao2_cleanup(joint_caps);
590 SCOPE_EXIT_RTN_VALUE(NULL, "No common formats available\n");
591 }
592
593 if (!ast_format_cap_empty(joint_caps)) {
594 if (prefs->keep == CODEC_NEGOTIATION_KEEP_FIRST) {
595 struct ast_format *single = ast_format_cap_get_format(joint_caps, 0);
597 ast_format_cap_append(joint_caps, single, 0);
598 ao2_ref(single, -1);
599 }
600 } else {
601 if (error_message) {
602 ast_str_append(error_message, 0, "No common formats available for media type '%s' ",
603 ast_codec_media_type2str(pending_stream->type));
604 ast_format_cap_append_names(preferred_caps, error_message);
605 ast_str_append(error_message, 0, "<>");
606 ast_format_cap_append_names(nonpreferred_caps, error_message);
607 ast_str_append(error_message, 0, " with prefs: ");
608 ast_stream_codec_prefs_to_str(prefs, error_message);
609 }
610 }
611
612 joint_stream = ast_stream_clone(pending_stream, NULL);
613 if (!joint_stream) {
614 ao2_cleanup(joint_caps);
615 return NULL;
616 }
617
618 /* ref to joint_caps will be transferred to the stream */
619 ast_stream_set_formats(joint_stream, joint_caps);
620
621 if (TRACE_ATLEAST(3)) {
623 if (buf) {
624 ast_str_set(&buf, 0, "Resolved '%s' stream ", ast_codec_media_type2str(pending_stream->type));
625 ast_format_cap_append_names(preferred_caps, &buf);
626 ast_str_append(&buf, 0, "<>");
627 ast_format_cap_append_names(nonpreferred_caps, &buf);
628 ast_str_append(&buf, 0, " to ");
629 ast_format_cap_append_names(joint_caps, &buf);
630 ast_str_append(&buf, 0, " with prefs: ");
632 ast_trace(1, "%s\n", ast_str_buffer(buf));
633 ast_free(buf);
634 }
635 }
636
637 ao2_cleanup(joint_caps);
638 SCOPE_EXIT_RTN_VALUE(joint_stream, "Joint stream: %s\n", ast_str_tmp(128, ast_stream_to_str(joint_stream, &STR_TMP)));
639}
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
ast_media_type
Types of media.
Definition: codec.h:30
const char * ast_codec_media_type2str(enum ast_media_type type)
Conversion function to take a media type and turn it into a string.
Definition: codec.c:348
#define AST_FORMAT_CAP_NAMES_LEN
Definition: format_cap.h:324
int ast_format_cap_empty(const struct ast_format_cap *cap)
Determine if a format cap has no formats in it.
Definition: format_cap.c:744
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:400
unsigned int ast_format_cap_get_framing(const struct ast_format_cap *cap)
Get the global framing.
Definition: format_cap.c:438
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.
Definition: format_cap.c:628
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.
Definition: format_cap.c:739
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:523
#define ast_format_cap_append(cap, format, framing)
Add format capability to capabilities structure.
Definition: format_cap.h:99
void ast_format_cap_set_framing(struct ast_format_cap *cap, unsigned int framing)
Set the global framing.
Definition: format_cap.c:136
#define TRACE_ATLEAST(level)
#define SCOPE_EXIT_RTN_VALUE(__return_value,...)
#define SCOPE_ENTER(level,...)
#define ast_trace(level,...)
const char * ast_stream_to_str(const struct ast_stream *stream, struct ast_str **buf)
Get a string representing the stream for debugging/display purposes.
Definition: stream.c:337
struct ast_stream * ast_stream_clone(const struct ast_stream *stream, const char *name)
Create a deep clone of an existing stream.
Definition: stream.c:257
void ast_stream_set_formats(struct ast_stream *stream, struct ast_format_cap *caps)
Set the current negotiated formats of a stream.
Definition: stream.c:365
const char * ast_stream_codec_prefs_to_str(const struct ast_stream_codec_negotiation_prefs *prefs, struct ast_str **buf)
Return a string representing the codec preferences.
Definition: stream.c:132
#define AST_STREAM_MAX_CODEC_PREFS_LENGTH
Define for allocating buffer space for to_str() functions.
Definition: stream.h:307
@ CODEC_NEGOTIATION_OPERATION_ONLY_PREFERRED
Definition: stream.h:166
@ CODEC_NEGOTIATION_OPERATION_ONLY_NONPREFERRED
Definition: stream.h:168
@ CODEC_NEGOTIATION_OPERATION_UNION
Definition: stream.h:164
@ CODEC_NEGOTIATION_OPERATION_INTERSECT
Definition: stream.h:162
@ CODEC_NEGOTIATION_KEEP_FIRST
Definition: stream.h:182
@ CODEC_NEGOTIATION_PREFER_PENDING
Definition: stream.h:148
#define ast_str_tmp(init_len, __expr)
Provides a temporary ast_str and returns a copy of its buffer.
Definition: strings.h:1189
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
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
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
Definition of a media format.
Definition: format.c:43
Support for dynamic strings.
Definition: strings.h:623

References ao2_cleanup, ao2_ref, ast_codec_media_type2str(), ast_format_cap_alloc, ast_format_cap_append, ast_format_cap_append_from_cap(), ast_format_cap_append_names(), ast_format_cap_empty(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_cap_get_compatible(), ast_format_cap_get_format(), ast_format_cap_get_framing(), AST_FORMAT_CAP_NAMES_LEN, ast_format_cap_remove_by_type(), ast_format_cap_set_framing(), ast_free, AST_MEDIA_TYPE_UNKNOWN, ast_str_append(), ast_str_buffer(), ast_str_create, ast_str_set(), ast_str_tmp, ast_stream_clone(), ast_stream_codec_prefs_to_str(), AST_STREAM_MAX_CODEC_PREFS_LENGTH, ast_stream_set_formats(), ast_stream_to_str(), ast_trace, buf, CODEC_NEGOTIATION_KEEP_FIRST, CODEC_NEGOTIATION_OPERATION_INTERSECT, CODEC_NEGOTIATION_OPERATION_ONLY_NONPREFERRED, CODEC_NEGOTIATION_OPERATION_ONLY_PREFERRED, CODEC_NEGOTIATION_OPERATION_UNION, CODEC_NEGOTIATION_PREFER_PENDING, ast_stream::formats, ast_stream_codec_negotiation_prefs::keep, NULL, ast_stream_codec_negotiation_prefs::operation, ast_stream_codec_negotiation_prefs::prefer, SCOPE_ENTER, SCOPE_EXIT_RTN_VALUE, TRACE_ATLEAST, and ast_stream::type.

Referenced by ast_stream_topology_create_resolved().

◆ ast_stream_free()

void ast_stream_free ( struct ast_stream stream)

Destroy a media stream representation.

Parameters
streamThe media stream
Since
15

Definition at line 292 of file stream.c.

293{
294 if (!stream) {
295 return;
296 }
297
299
300 if (stream->rtp_codecs) {
302 }
303
304 ao2_cleanup(stream->formats);
305
306 ast_free(stream);
307}
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Definition: extconf.c:1262
void ast_rtp_codecs_payloads_destroy(struct ast_rtp_codecs *codecs)
Destroy the contents of an RTP codecs structure (but not the structure itself)
Definition: rtp_engine.c:996
struct ast_rtp_codecs * rtp_codecs
The rtp_codecs used by the stream.
Definition: stream.c:115

References ao2_cleanup, ast_free, ast_rtp_codecs_payloads_destroy(), ast_variables_destroy(), ast_stream::formats, ast_stream::metadata, and ast_stream::rtp_codecs.

Referenced by append_all_streams(), append_source_stream(), ast_sip_session_create_outgoing(), ast_stream_topology_clone(), ast_stream_topology_create_from_format_cap(), ast_stream_topology_create_resolved(), ast_stream_topology_del_stream(), ast_stream_topology_set_stream(), AST_TEST_DEFINE(), handle_incoming_sdp(), remove_all_original_streams(), sdp_requires_deferral(), sip_session_refresh(), stream_echo_topology_alloc(), stream_topology_destroy(), and t38_create_media_state().

◆ ast_stream_get_format_count()

int ast_stream_get_format_count ( const struct ast_stream stream)

Get the count of the current negotiated formats of a stream.

Parameters
streamThe media stream
Returns
The count of negotiated formats
Since
18

Definition at line 358 of file stream.c.

359{
360 ast_assert(stream != NULL);
361
362 return stream->formats ? ast_format_cap_count(stream->formats) : 0;
363}
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:395
#define ast_assert(a)
Definition: utils.h:739

References ast_assert, ast_format_cap_count(), ast_stream::formats, and NULL.

Referenced by ast_sip_session_create_outgoing(), and ast_stream_topology_create_resolved().

◆ ast_stream_get_formats()

const struct ast_format_cap * ast_stream_get_formats ( const struct ast_stream stream)

Get the current negotiated formats of a stream.

Parameters
streamThe media stream
Return values
non-NULLsuccess
NULLfailure
Note
The reference count is not increased
Since
15

Definition at line 330 of file stream.c.

331{
332 ast_assert(stream != NULL);
333
334 return stream->formats;
335}

References ast_assert, ast_stream::formats, and NULL.

Referenced by ast_sip_session_create_joint_call_stream(), ast_stream_topology_equal(), AST_TEST_DEFINE(), create_outgoing_sdp_stream(), handle_showchan(), is_compatible_format(), local_request_with_stream_topology(), media_offer_read_av(), media_offer_write_av(), native_rtp_request_stream_topology_update(), simple_bridge_request_stream_topology_update(), and sip_session_refresh().

◆ ast_stream_get_group()

int ast_stream_get_group ( const struct ast_stream stream)

Get the stream group that a stream is part of.

Parameters
streamThe stream
Returns
the numerical stream group (-1 if not in a group)
Since
15.2.0

Definition at line 1080 of file stream.c.

1081{
1082 ast_assert(stream != NULL);
1083
1084 return stream->group;
1085}

References ast_assert, ast_stream::group, and NULL.

Referenced by add_msid_to_stream(), ast_stream_topology_clone(), and handle_showchan().

◆ ast_stream_get_metadata()

const char * ast_stream_get_metadata ( const struct ast_stream stream,
const char *  m_key 
)

Get a stream metadata value.

Parameters
streamThe media stream
m_keyAn arbitrary metadata key
Return values
non-NULLmetadata value
NULLfailure or not found
Since
15.5

Definition at line 423 of file stream.c.

424{
425 struct ast_variable *v;
426
427 ast_assert_return(stream != NULL, NULL);
428 ast_assert_return(m_key != NULL, NULL);
429
430 for (v = stream->metadata; v; v = v->next) {
431 if (strcmp(v->name, m_key) == 0) {
432 return v->value;
433 }
434 }
435
436 return NULL;
437}
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
#define ast_assert_return(a,...)
Definition: utils.h:740

References ast_assert_return, ast_stream::metadata, ast_variable::name, ast_variable::next, NULL, and ast_variable::value.

Referenced by add_msid_to_stream(), AST_TEST_DEFINE(), handle_incoming_sdp(), sdp_requires_deferral(), and sip_session_refresh().

◆ ast_stream_get_metadata_list()

struct ast_variable * ast_stream_get_metadata_list ( const struct ast_stream stream)

Get all stream metadata keys.

Parameters
streamThe media stream
Returns
An ast_variable list of the metadata key/value pairs.
Return values
NULLif error or no variables are set.

When you're finished with the list, you must call ast_variables_destroy(list);

Since
15.5

Definition at line 439 of file stream.c.

440{
441 struct ast_variable *v;
442 struct ast_variable *vout = NULL;
443
444 ast_assert_return(stream != NULL, NULL);
445
446 for (v = stream->metadata; v; v = v->next) {
447 struct ast_variable *vt = ast_variable_new(v->name, v->value, "");
448
449 if (!vt) {
451 return NULL;
452 }
453
454 ast_variable_list_append(&vout, vt);
455 }
456
457 return vout;
458}
#define ast_variable_new(name, value, filename)
#define ast_variable_list_append(head, new_var)

References ast_assert_return, ast_variable_list_append, ast_variable_new, ast_variables_destroy(), ast_stream::metadata, ast_variable::name, ast_variable::next, NULL, and ast_variable::value.

Referenced by ast_stream_clone(), and handle_showchan().

◆ ast_stream_get_name()

const char * ast_stream_get_name ( const struct ast_stream stream)

Get the name of a stream.

Parameters
streamThe media stream
Return values
non-NULLsuccess
NULLfailure
Since
15

Definition at line 309 of file stream.c.

310{
311 ast_assert(stream != NULL);
312
313 return stream->name;
314}

References ast_assert, ast_stream::name, and NULL.

Referenced by ast_sip_session_media_state_add(), ast_stream_topology_equal(), AST_TEST_DEFINE(), handle_incoming_sdp(), handle_showchan(), is_media_state_valid(), is_video_dest(), is_video_source(), remove_all_original_streams(), resolve_refresh_media_states(), sdp_requires_deferral(), sip_session_refresh(), and softmix_bridge_stream_sources_update().

◆ ast_stream_get_position()

int ast_stream_get_position ( const struct ast_stream stream)

Get the position of the stream in the topology.

Parameters
streamThe media stream
Returns
The position of the stream (-1 on error)
Since
15

Definition at line 500 of file stream.c.

501{
502 ast_assert(stream != NULL);
503
504 return stream->position;
505}
unsigned int position
The position of the stream in the topology.
Definition: stream.c:90

References ast_assert, NULL, and ast_stream::position.

Referenced by __ast_read(), apply_negotiated_sdp_stream(), AST_TEST_DEFINE(), ast_write_stream(), check_stream_positions(), create_outgoing_sdp_stream(), stream_echo_write_error(), and tech_write().

◆ ast_stream_get_rtp_codecs()

struct ast_rtp_codecs * ast_stream_get_rtp_codecs ( const struct ast_stream stream)

Get rtp_codecs associated with the stream.

Parameters
streamThe media stream
Returns
The rtp_codecs
Since
15.5

Definition at line 507 of file stream.c.

508{
509 ast_assert(stream != NULL);
510
511 return stream->rtp_codecs;
512}

References ast_assert, NULL, and ast_stream::rtp_codecs.

◆ ast_stream_get_state()

enum ast_stream_state ast_stream_get_state ( const struct ast_stream stream)

◆ ast_stream_get_type()

enum ast_media_type ast_stream_get_type ( const struct ast_stream stream)

◆ ast_stream_set_formats()

void ast_stream_set_formats ( struct ast_stream stream,
struct ast_format_cap caps 
)

Set the current negotiated formats of a stream.

Parameters
streamThe media stream
capsThe current negotiated formats
Note
The new format capabilities structure has its refcount bumped and any existing format capabilities structure has its refcount decremented.
Since
15

Definition at line 365 of file stream.c.

366{
367 ast_assert(stream != NULL);
368
369 ao2_cleanup(stream->formats);
370 stream->formats = ao2_bump(caps);
371}
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition: astobj2.h:480

References ao2_bump, ao2_cleanup, ast_assert, ast_stream::formats, and NULL.

Referenced by apply_cap_to_bundled(), ast_sip_session_create_joint_call_stream(), ast_stream_create_resolved(), ast_stream_topology_create_from_format_cap(), AST_TEST_DEFINE(), local_request_with_stream_topology(), media_offer_write_av(), native_rtp_request_stream_topology_update(), simple_bridge_request_stream_topology_update(), sip_session_refresh(), and t38_create_media_state().

◆ ast_stream_set_group()

void ast_stream_set_group ( struct ast_stream stream,
int  group 
)

Set the stream group for a stream.

Parameters
streamThe stream
groupThe group the stream is part of
Since
15.2.0

Definition at line 1087 of file stream.c.

1088{
1089 ast_assert(stream != NULL);
1090
1091 stream->group = group;
1092}

References ast_assert, ast_stream::group, and NULL.

Referenced by ast_stream_topology_clone(), and set_remote_mslabel_and_stream_group().

◆ ast_stream_set_metadata()

int ast_stream_set_metadata ( struct ast_stream stream,
const char *  m_key,
const char *  value 
)

Set a stream metadata value.

Parameters
streamThe media stream
m_keyAn arbitrary metadata key
valueString metadata value or NULL to remove existing value
Return values
-1failure
0success
Since
15.5

Definition at line 460 of file stream.c.

461{
462 struct ast_variable *v;
463 struct ast_variable *prev;
464
465 ast_assert_return(stream != NULL, -1);
466 ast_assert_return(m_key != NULL, -1);
467
468 prev = NULL;
469 v = stream->metadata;
470 while(v) {
471 struct ast_variable *next = v->next;
472 if (strcmp(v->name, m_key) == 0) {
473 if (prev) {
474 prev->next = next;
475 } else {
476 stream->metadata = next;
477 }
478 ast_free(v);
479 break;
480 } else {
481 prev = v;
482 }
483 v = next;
484 }
485
486 if (!value) {
487 return 0;
488 }
489
490 v = ast_variable_new(m_key, value, "");
491 if (!v) {
492 return -1;
493 }
494
496
497 return 0;
498}

References ast_assert_return, ast_free, ast_variable_list_append, ast_variable_new, ast_stream::metadata, ast_variable::name, ast_variable::next, NULL, and value.

Referenced by add_msid_to_stream(), append_source_stream(), AST_TEST_DEFINE(), handle_incoming_sdp(), media_offer_write_av(), and sdp_requires_deferral().

◆ ast_stream_set_rtp_codecs()

void ast_stream_set_rtp_codecs ( struct ast_stream stream,
struct ast_rtp_codecs rtp_codecs 
)

Set rtp_codecs associated with the stream.

Parameters
streamThe media stream
rtp_codecsThe rtp_codecs
Since
15.5

Definition at line 514 of file stream.c.

515{
516 ast_assert(stream != NULL);
517
518 if (stream->rtp_codecs) {
520 }
521
522 stream->rtp_codecs = rtp_codecs;
523}

References ast_assert, ast_rtp_codecs_payloads_destroy(), NULL, and ast_stream::rtp_codecs.

◆ ast_stream_set_state()

void ast_stream_set_state ( struct ast_stream stream,
enum ast_stream_state  state 
)

◆ ast_stream_set_type()

void ast_stream_set_type ( struct ast_stream stream,
enum ast_media_type  type 
)

Change the media type of a stream.

Parameters
streamThe media stream
typeThe new media type
Since
15

Definition at line 323 of file stream.c.

324{
325 ast_assert(stream != NULL);
326
327 stream->type = type;
328}

References ast_assert, NULL, type, and ast_stream::type.

Referenced by AST_TEST_DEFINE().

◆ ast_stream_state2str()

const char * ast_stream_state2str ( enum ast_stream_state  state)

Convert the state of a stream into a string.

Parameters
stateThe stream state
Returns
The state of the stream in string format
Since
15

Definition at line 388 of file stream.c.

389{
390 switch (state) {
392 return "removed";
394 return "sendrecv";
396 return "sendonly";
398 return "recvonly";
400 return "inactive";
401 default:
402 return "<unknown>";
403 }
404}
@ AST_STREAM_STATE_RECVONLY
Set when the stream is receiving media only.
Definition: stream.h:90
@ AST_STREAM_STATE_REMOVED
Set when the stream has been removed/declined.
Definition: stream.h:78
@ AST_STREAM_STATE_SENDRECV
Set when the stream is sending and receiving media.
Definition: stream.h:82
@ AST_STREAM_STATE_SENDONLY
Set when the stream is sending media only.
Definition: stream.h:86

References AST_STREAM_STATE_INACTIVE, AST_STREAM_STATE_RECVONLY, AST_STREAM_STATE_REMOVED, AST_STREAM_STATE_SENDONLY, and AST_STREAM_STATE_SENDRECV.

Referenced by handle_showchan(), resolve_refresh_media_states(), and softmix_bridge_stream_sources_update().

◆ ast_stream_str2state()

enum ast_stream_state ast_stream_str2state ( const char *  str)

Convert a string to a stream state.

Parameters
strThe string to convert
Returns
The stream state
Since
15.0.0

Definition at line 406 of file stream.c.

407{
408 if (!strcmp("sendrecv", str)) {
410 }
411 if (!strcmp("sendonly", str)) {
413 }
414 if (!strcmp("recvonly", str)) {
416 }
417 if (!strcmp("inactive", str)) {
419 }
421}
const char * str
Definition: app_jack.c:147

References AST_STREAM_STATE_INACTIVE, AST_STREAM_STATE_RECVONLY, AST_STREAM_STATE_REMOVED, AST_STREAM_STATE_SENDONLY, AST_STREAM_STATE_SENDRECV, and str.

◆ ast_stream_to_str()

const char * ast_stream_to_str ( const struct ast_stream stream,
struct ast_str **  buf 
)

Get a string representing the stream for debugging/display purposes.

Since
18
Parameters
streamA stream
bufA pointer to an ast_str* used for the output.
Return values
""(empty string) if either buf or *buf are NULL
(null stream)if *stream was NULL
Returns
<stream_representation> otherwise
Warning
No attempt should ever be made to free the returned char * and it should be dup'd if needed after the ast_str is freed.

Return format:

<name>:<media_type>:<stream_state> (formats) 

Sample return:

"audio:audio:sendrecv (ulaw,g722)" 

Definition at line 337 of file stream.c.

338{
339 if (!buf || !*buf) {
340 return "";
341 }
342
343 if (!stream) {
344 ast_str_append(buf, 0, "(null stream)");
345 return ast_str_buffer(*buf);
346 }
347
348 ast_str_append(buf, 0, "%d:%s:%s:%s ",
349 stream->position,
350 S_OR(stream->name, "noname"),
352 ast_stream_state_map[stream->state]);
354
355 return ast_str_buffer(*buf);
356}
const char * ast_stream_state_map[]
Stream state enum to string map.
Definition: stream.c:223

References ast_codec_media_type2str(), ast_format_cap_append_names(), ast_str_append(), ast_str_buffer(), ast_stream_state_map, buf, ast_stream::formats, ast_stream::name, ast_stream::position, S_OR, ast_stream::state, and ast_stream::type.

Referenced by add_sdp_streams(), apply_negotiated_sdp_stream(), ast_stream_create_resolved(), ast_stream_topology_to_str(), create_local_sdp(), create_outgoing_sdp_stream(), handle_incoming_sdp(), is_media_state_valid(), resolve_refresh_media_states(), and softmix_bridge_stream_sources_update().

◆ ast_stream_topology_alloc()

struct ast_stream_topology * ast_stream_topology_alloc ( void  )

Create a stream topology.

Return values
non-NULLsuccess
NULLfailure
Since
15
Note
This returns an ao2 refcounted object

Definition at line 652 of file stream.c.

653{
654 struct ast_stream_topology *topology;
655 SCOPE_ENTER(4, "Topology Create\n");
656
658 if (!topology) {
659 SCOPE_EXIT_RTN_VALUE(NULL, "Allocation failed\n");
660 }
661
663 ao2_ref(topology, -1);
664 SCOPE_EXIT_RTN_VALUE(NULL, "Vector init failed\n");
665 }
666
667 SCOPE_EXIT_RTN_VALUE(topology, "Created: %p\n", topology);
668}
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition: astobj2.h:367
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition: astobj2.h:404
static void stream_topology_destroy(void *data)
Definition: stream.c:641
#define TOPOLOGY_INITIAL_STREAM_COUNT
Definition: stream.c:651
struct ast_stream_topology::@402 streams
A vector of all the streams in this topology.
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
Definition: vector.h:113

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_ref, AST_VECTOR_INIT, NULL, SCOPE_ENTER, SCOPE_EXIT_RTN_VALUE, stream_topology_destroy(), ast_stream_topology::streams, and TOPOLOGY_INITIAL_STREAM_COUNT.

Referenced by __ast_channel_alloc_ap(), ast_channel_set_stream_topology(), ast_sip_session_create_outgoing(), ast_stream_topology_clone(), ast_stream_topology_create_from_format_cap(), ast_stream_topology_create_resolved(), AST_TEST_DEFINE(), ast_unreal_indicate(), handle_incoming_sdp(), make_channel(), sdp_requires_deferral(), sfu_topologies_on_join(), sfu_topologies_on_source_change(), softmix_bridge_stream_sources_update(), stream_echo_topology_alloc(), and t38_create_media_state().

◆ ast_stream_topology_append_stream()

int ast_stream_topology_append_stream ( struct ast_stream_topology topology,
struct ast_stream stream 
)

Append a stream to the topology.

Parameters
topologyThe topology of streams
streamThe stream to append
Returns
The position of the stream in the topology (-1 on error)
Since
15
Note
If the stream's name is empty, it'll be set to <stream_type>-<position>

Definition at line 751 of file stream.c.

752{
753 ast_assert(topology && stream);
754
755 if (AST_VECTOR_APPEND(&topology->streams, stream)) {
756 return -1;
757 }
758
759 stream->position = AST_VECTOR_SIZE(&topology->streams) - 1;
760
761 if (ast_strlen_zero(stream->name)) {
762 snprintf(stream->name, MIN_STREAM_NAME_LEN, "%s-%d", ast_codec_media_type2str(stream->type), stream->position);
763 }
764
765 return AST_VECTOR_SIZE(&topology->streams) - 1;
766}
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:609
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition: vector.h:256

References ast_assert, ast_codec_media_type2str(), ast_strlen_zero(), AST_VECTOR_APPEND, AST_VECTOR_SIZE, MIN_STREAM_NAME_LEN, ast_stream::name, ast_stream::position, ast_stream_topology::streams, and ast_stream::type.

Referenced by append_all_streams(), append_source_stream(), ast_sip_session_create_outgoing(), ast_stream_topology_create_from_format_cap(), ast_stream_topology_create_resolved(), AST_TEST_DEFINE(), ast_unreal_indicate(), make_channel(), resolve_refresh_media_states(), sip_session_refresh(), and stream_echo_topology_alloc().

◆ ast_stream_topology_clone()

struct ast_stream_topology * ast_stream_topology_clone ( const struct ast_stream_topology topology)

Create a deep clone of an existing stream topology.

Parameters
topologyThe existing topology of streams
Return values
non-NULLsuccess
NULLfailure
Since
15
Note
This returns an ao2 refcounted object

Definition at line 670 of file stream.c.

672{
673 struct ast_stream_topology *new_topology;
674 int i;
675
676 ast_assert(topology != NULL);
677
678 new_topology = ast_stream_topology_alloc();
679 if (!new_topology) {
680 return NULL;
681 }
682
683 for (i = 0; i < AST_VECTOR_SIZE(&topology->streams); i++) {
684 struct ast_stream *existing = AST_VECTOR_GET(&topology->streams, i);
685 struct ast_stream *stream = ast_stream_clone(existing, NULL);
686
687 if (!stream || AST_VECTOR_APPEND(&new_topology->streams, stream)) {
688 ast_stream_free(stream);
689 ast_stream_topology_free(new_topology);
690 return NULL;
691 }
692
694 }
695
696 return new_topology;
697}
struct ast_stream_topology * ast_stream_topology_alloc(void)
Create a stream topology.
Definition: stream.c:652
int ast_stream_get_group(const struct ast_stream *stream)
Get the stream group that a stream is part of.
Definition: stream.c:1080
void ast_stream_topology_free(struct ast_stream_topology *topology)
Unreference and destroy a stream topology.
Definition: stream.c:746
void ast_stream_free(struct ast_stream *stream)
Destroy a media stream representation.
Definition: stream.c:292
void ast_stream_set_group(struct ast_stream *stream, int group)
Set the stream group for a stream.
Definition: stream.c:1087
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:680

References ast_assert, ast_stream_clone(), ast_stream_free(), ast_stream_get_group(), ast_stream_set_group(), ast_stream_topology_alloc(), ast_stream_topology_free(), AST_VECTOR_APPEND, AST_VECTOR_GET, AST_VECTOR_SIZE, NULL, and ast_stream_topology::streams.

Referenced by ast_sip_session_create_outgoing(), ast_sip_session_media_state_clone(), AST_TEST_DEFINE(), ast_unreal_alloc_stream_topology(), ast_unreal_new_channels(), chan_pjsip_new(), create_local_sdp(), dial_exec_full(), do_forward(), handle_negotiated_sdp(), local_request_with_stream_topology(), media_offer_read_av(), media_offer_write_av(), native_rtp_request_stream_topology_update(), session_refresh_state_get_or_alloc(), sfu_topologies_on_join(), sfu_topologies_on_source_change(), simple_bridge_request_stream_topology_update(), softmix_bridge_stream_sources_update(), topology_change_refresh_data_alloc(), and unreal_colp_stream_topology_request_change().

◆ ast_stream_topology_create_from_format_cap()

struct ast_stream_topology * ast_stream_topology_create_from_format_cap ( struct ast_format_cap cap)

A helper function that, given a format capabilities structure, creates a topology and separates the media types in format_cap into separate streams.

Parameters
capThe format capabilities structure (NULL creates an empty topology)
Return values
non-NULLsuccess
NULLfailure
Note
The format capabilities reference is NOT altered by this function since a new format capabilities structure is created for each media type.
Each stream will have its name set to the corresponding media type. For example: "audio".
Each stream will be set to the sendrecv state.
Since
15

Definition at line 851 of file stream.c.

853{
854 struct ast_stream_topology *topology;
855 enum ast_media_type type;
856
857 topology = ast_stream_topology_alloc();
858 if (!topology || !cap || !ast_format_cap_count(cap)) {
859 return topology;
860 }
861
863 struct ast_format_cap *new_cap;
864 struct ast_stream *stream;
865
866 if (!ast_format_cap_has_type(cap, type)) {
867 continue;
868 }
869
871 if (!new_cap) {
872 ast_stream_topology_free(topology);
873 return NULL;
874 }
875
877 if (ast_format_cap_append_from_cap(new_cap, cap, type)) {
878 ao2_cleanup(new_cap);
879 ast_stream_topology_free(topology);
880 return NULL;
881 }
882
883 stream = ast_stream_alloc(NULL, type);
884 if (!stream) {
885 ao2_cleanup(new_cap);
886 ast_stream_topology_free(topology);
887 return NULL;
888 }
889
890 ast_stream_set_formats(stream, new_cap);
891 ao2_ref(new_cap, -1);
893 if (ast_stream_topology_append_stream(topology, stream) == -1) {
894 ast_stream_free(stream);
895 ast_stream_topology_free(topology);
896 return NULL;
897 }
898
899 snprintf(stream->name, MIN_STREAM_NAME_LEN, "%s-%d", ast_codec_media_type2str(stream->type), stream->position);
900 }
901
902 return topology;
903}
@ AST_MEDIA_TYPE_END
Definition: codec.h:36
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.
Definition: format_cap.c:613
struct ast_stream * ast_stream_alloc(const char *name, enum ast_media_type type)
Create a new media stream representation.
Definition: stream.c:233
int ast_stream_topology_append_stream(struct ast_stream_topology *topology, struct ast_stream *stream)
Append a stream to the topology.
Definition: stream.c:751

References ao2_cleanup, ao2_ref, ast_codec_media_type2str(), ast_format_cap_alloc, ast_format_cap_append_from_cap(), ast_format_cap_count(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_cap_get_framing(), ast_format_cap_has_type(), ast_format_cap_set_framing(), AST_MEDIA_TYPE_END, AST_MEDIA_TYPE_UNKNOWN, ast_stream_alloc(), ast_stream_free(), ast_stream_set_formats(), AST_STREAM_STATE_SENDRECV, ast_stream_topology_alloc(), ast_stream_topology_append_stream(), ast_stream_topology_free(), MIN_STREAM_NAME_LEN, ast_stream::name, NULL, ast_stream::position, ast_stream::state, type, and ast_stream::type.

Referenced by ast_channel_nativeformats_set(), AST_TEST_DEFINE(), ast_unreal_alloc(), chan_pjsip_request(), local_request(), request_channel(), and sip_endpoint_apply_handler().

◆ ast_stream_topology_create_resolved()

struct ast_stream_topology * ast_stream_topology_create_resolved ( struct ast_stream_topology pending_topology,
struct ast_stream_topology validation_topology,
struct ast_stream_codec_negotiation_prefs prefs,
struct ast_str **  error_message 
)

Create a resolved stream topology from 2 topologies.

Since
18
Parameters
pending_topologyThe "live" topology created from an SDP, passed through the core, or used to create an SDP.
validation_topologyThe static topology used to validate the pending topology. It MUST have only 1 stream per media type.
prefsA pointer to an ast_stream_codec_negotiation_prefs structure.
error_messageIf supplied, error messages will be appended.

The streams in the resolved topology will contain all of the attributes of the corresponding stream from the pending topology. It's format_caps however will contain only the formats that passed the validation specified by the ast_stream_codec_negotiation_prefs structure. This may mean that some of the streams format_caps will be empty. If that's the case, the stream will be in a REMOVED state. With those rules in mind, a resolved topology will always be returned (unless there's some catastrophic allocation failure) and the resolved topology is guaranteed to have the same number of streams, in the same order, as the pending topology.

Return values
NULLif there was some allocation failure.
Returns
The joint topology.

Definition at line 1033 of file stream.c.

1036{
1037 struct ast_stream_topology *joint_topology = ast_stream_topology_alloc();
1038 int res = 0;
1039 int i;
1040
1041 if (!pending_topology || !configured_topology || !joint_topology) {
1042 ao2_cleanup(joint_topology);
1043 return NULL;
1044 }
1045
1046 for (i = 0; i < AST_VECTOR_SIZE(&pending_topology->streams); i++) {
1047 struct ast_stream *pending_stream = AST_VECTOR_GET(&pending_topology->streams, i);
1048 struct ast_stream *configured_stream =
1049 ast_stream_topology_get_first_stream_by_type(configured_topology, pending_stream->type);
1050 struct ast_stream *joint_stream;
1051
1052 if (!configured_stream) {
1053 joint_stream = ast_stream_clone(pending_stream, NULL);
1054 if (!joint_stream) {
1055 ao2_cleanup(joint_topology);
1056 return NULL;
1057 }
1059 } else {
1060 joint_stream = ast_stream_create_resolved(pending_stream, configured_stream, prefs, error_message);
1061 if (!joint_stream) {
1062 ao2_cleanup(joint_topology);
1063 return NULL;
1064 } else if (ast_stream_get_format_count(joint_stream) == 0) {
1066 }
1067 }
1068
1069 res = ast_stream_topology_append_stream(joint_topology, joint_stream);
1070 if (res < 0) {
1071 ast_stream_free(joint_stream);
1072 ao2_cleanup(joint_topology);
1073 return NULL;
1074 }
1075 }
1076
1077 return joint_topology;
1078}
void ast_stream_set_state(struct ast_stream *stream, enum ast_stream_state state)
Set the state of a stream.
Definition: stream.c:380
int ast_stream_get_format_count(const struct ast_stream *stream)
Get the count of the current negotiated formats of a stream.
Definition: stream.c:358
struct ast_stream * ast_stream_create_resolved(struct ast_stream *pending_stream, struct ast_stream *validation_stream, struct ast_stream_codec_negotiation_prefs *prefs, struct ast_str **error_message)
Create a resolved stream from 2 streams.
Definition: stream.c:525
struct ast_stream * ast_stream_topology_get_first_stream_by_type(const struct ast_stream_topology *topology, enum ast_media_type type)
Gets the first active stream of a specific type from the topology.
Definition: stream.c:967

References ao2_cleanup, ast_stream_clone(), ast_stream_create_resolved(), ast_stream_free(), ast_stream_get_format_count(), ast_stream_set_state(), AST_STREAM_STATE_REMOVED, ast_stream_topology_alloc(), ast_stream_topology_append_stream(), ast_stream_topology_get_first_stream_by_type(), AST_VECTOR_GET, AST_VECTOR_SIZE, NULL, ast_stream_topology::streams, and ast_stream::type.

◆ ast_stream_topology_del_stream()

int ast_stream_topology_del_stream ( struct ast_stream_topology topology,
unsigned int  position 
)

Delete a specified stream from the given topology.

Since
15.0.0
Parameters
topologyThe topology of streams.
positionThe topology position to delete.
Note
Deleting a stream will completely remove it from the topology as if it never existed in it. i.e., Any following stream positions will shift down so there is no gap.
Return values
0on success.
-1on failure.

Definition at line 828 of file stream.c.

830{
831 struct ast_stream *stream;
832
833 ast_assert(topology != NULL);
834
835 if (AST_VECTOR_SIZE(&topology->streams) <= position) {
836 return -1;
837 }
838
839 stream = AST_VECTOR_REMOVE_ORDERED(&topology->streams, position);
840 ast_stream_free(stream);
841
842 /* Fix up higher stream position indices */
843 for (; position < AST_VECTOR_SIZE(&topology->streams); ++position) {
844 stream = AST_VECTOR_GET(&topology->streams, position);
845 stream->position = position;
846 }
847
848 return 0;
849}
#define AST_VECTOR_REMOVE_ORDERED(vec, idx)
Remove an element from a vector by index while maintaining order.
Definition: vector.h:448

References ast_assert, ast_stream_free(), AST_VECTOR_GET, AST_VECTOR_REMOVE_ORDERED, AST_VECTOR_SIZE, NULL, ast_stream::position, and ast_stream_topology::streams.

Referenced by AST_TEST_DEFINE(), and sip_session_refresh().

◆ ast_stream_topology_equal()

int ast_stream_topology_equal ( const struct ast_stream_topology left,
const struct ast_stream_topology right 
)

Compare two stream topologies to see if they are equal.

Parameters
leftThe left topology
rightThe right topology
Return values
1topologies are equivalent
0topologies differ
Since
15

Definition at line 699 of file stream.c.

701{
702 int index;
703
704 ast_assert(left != NULL);
705 ast_assert(right != NULL);
706
708 return 0;
709 }
710
711 for (index = 0; index < ast_stream_topology_get_count(left); ++index) {
712 const struct ast_stream *left_stream = ast_stream_topology_get_stream(left, index);
713 const struct ast_stream *right_stream = ast_stream_topology_get_stream(right, index);
714
715 if (ast_stream_get_type(left_stream) != ast_stream_get_type(right_stream)) {
716 return 0;
717 }
718
719 if (ast_stream_get_state(left_stream) != ast_stream_get_state(right_stream)) {
720 return 0;
721 }
722
723 if (!ast_stream_get_formats(left_stream) && ast_stream_get_formats(right_stream) &&
725 /* A NULL format capabilities and an empty format capabilities are the same, as they have
726 * no formats inside. If one does though... they are not equal.
727 */
728 return 0;
729 } else if (!ast_stream_get_formats(right_stream) && ast_stream_get_formats(left_stream) &&
731 return 0;
732 } else if (ast_stream_get_formats(left_stream) && ast_stream_get_formats(right_stream) &&
734 /* But if both are actually present we need to do an actual identical check. */
735 return 0;
736 }
737
738 if (strcmp(ast_stream_get_name(left_stream), ast_stream_get_name(right_stream))) {
739 return 0;
740 }
741 }
742
743 return 1;
744}
int ast_format_cap_identical(const struct ast_format_cap *cap1, const struct ast_format_cap *cap2)
Determine if two capabilities structures are identical.
Definition: format_cap.c:687
struct ast_stream * ast_stream_topology_get_stream(const struct ast_stream_topology *topology, unsigned int stream_num)
Get a specific stream from the topology.
Definition: stream.c:791
const char * ast_stream_get_name(const struct ast_stream *stream)
Get the name of a stream.
Definition: stream.c:309
int ast_stream_topology_get_count(const struct ast_stream_topology *topology)
Get the number of streams in a topology.
Definition: stream.c:768
enum ast_stream_state ast_stream_get_state(const struct ast_stream *stream)
Get the current state of a stream.
Definition: stream.c:373
enum ast_media_type ast_stream_get_type(const struct ast_stream *stream)
Get the media type of a stream.
Definition: stream.c:316
const struct ast_format_cap * ast_stream_get_formats(const struct ast_stream *stream)
Get the current negotiated formats of a stream.
Definition: stream.c:330

References ast_assert, ast_format_cap_count(), ast_format_cap_identical(), ast_stream_get_formats(), ast_stream_get_name(), ast_stream_get_state(), ast_stream_get_type(), ast_stream_topology_get_count(), ast_stream_topology_get_stream(), and NULL.

Referenced by ast_channel_request_stream_topology_change(), handle_negotiated_sdp(), reschedule_reinvite(), simple_bridge_join(), and sip_session_refresh().

◆ ast_stream_topology_free()

void ast_stream_topology_free ( struct ast_stream_topology topology)

◆ ast_stream_topology_get_active_count()

int ast_stream_topology_get_active_count ( const struct ast_stream_topology topology)

Get the number of active (non-REMOVED) streams in a topology.

Parameters
topologyThe topology of streams
Returns
the number of active streams
Since
18

Definition at line 775 of file stream.c.

776{
777 int i;
778 int count = 0;
779 ast_assert(topology != NULL);
780
781 for (i = 0; i < AST_VECTOR_SIZE(&topology->streams); i++) {
782 struct ast_stream *stream = AST_VECTOR_GET(&topology->streams, i);
783 if (stream->state != AST_STREAM_STATE_REMOVED) {
784 count++;
785 }
786 }
787
788 return count;
789}

References ast_assert, AST_STREAM_STATE_REMOVED, AST_VECTOR_GET, AST_VECTOR_SIZE, NULL, ast_stream::state, and ast_stream_topology::streams.

◆ ast_stream_topology_get_count()

int ast_stream_topology_get_count ( const struct ast_stream_topology topology)

◆ ast_stream_topology_get_first_stream_by_type()

struct ast_stream * ast_stream_topology_get_first_stream_by_type ( const struct ast_stream_topology topology,
enum ast_media_type  type 
)

Gets the first active stream of a specific type from the topology.

Parameters
topologyThe topology of streams
typeThe media type
Return values
non-NULLsuccess
NULLfailure
Since
15

Definition at line 967 of file stream.c.

970{
971 int i;
972
973 ast_assert(topology != NULL);
974
975 for (i = 0; i < AST_VECTOR_SIZE(&topology->streams); i++) {
976 struct ast_stream *stream;
977
978 stream = AST_VECTOR_GET(&topology->streams, i);
979 if (stream->type == type
980 && stream->state != AST_STREAM_STATE_REMOVED) {
981 return stream;
982 }
983 }
984
985 return NULL;
986}

References ast_assert, AST_STREAM_STATE_REMOVED, AST_VECTOR_GET, AST_VECTOR_SIZE, NULL, ast_stream::state, ast_stream_topology::streams, type, and ast_stream::type.

Referenced by ast_stream_topology_create_resolved(), AST_TEST_DEFINE(), channel_set_default_streams(), cli_channelstats_print_body(), and media_offer_write_av().

◆ ast_stream_topology_get_formats()

struct ast_format_cap * ast_stream_topology_get_formats ( struct ast_stream_topology topology)

Create a format capabilities structure representing the topology.

A helper function that, given a stream topology, creates a format capabilities structure containing all formats from all active streams.

Parameters
topologyThe topology of streams
Return values
non-NULLsuccess (the resulting format caps must be unreffed by the caller)
NULLfailure
Note
The stream topology is NOT altered by this function.
Since
15

Definition at line 933 of file stream.c.

935{
937}
struct ast_format_cap * ast_stream_topology_get_formats_by_type(struct ast_stream_topology *topology, enum ast_media_type type)
Create a format capabilities structure containing all the formats from all the streams of a particula...
Definition: stream.c:905

References AST_MEDIA_TYPE_UNKNOWN, and ast_stream_topology_get_formats_by_type().

Referenced by AST_TEST_DEFINE(), ast_unreal_alloc_stream_topology(), chan_pjsip_new(), compatible_formats_exist(), and request_channel().

◆ ast_stream_topology_get_formats_by_type()

struct ast_format_cap * ast_stream_topology_get_formats_by_type ( struct ast_stream_topology topology,
enum ast_media_type  type 
)

Create a format capabilities structure containing all the formats from all the streams of a particular type in the topology.

Since
18

A helper function that, given a stream topology and a media type, creates a format capabilities structure containing all formats from all active streams with the particular type.

Parameters
topologyThe topology of streams
typeThe media type
Return values
non-NULLsuccess (the resulting format caps must be unreffed by the caller)
NULLfailure
Note
The stream topology is NOT altered by this function.

Definition at line 905 of file stream.c.

907{
908 struct ast_format_cap *caps;
909 int i;
910
911 ast_assert(topology != NULL);
912
914 if (!caps) {
915 return NULL;
916 }
917
918 for (i = 0; i < AST_VECTOR_SIZE(&topology->streams); i++) {
919 struct ast_stream *stream;
920
921 stream = AST_VECTOR_GET(&topology->streams, i);
922 if (!stream->formats || stream->state == AST_STREAM_STATE_REMOVED) {
923 continue;
924 }
925 if (type == AST_MEDIA_TYPE_UNKNOWN || type == stream->type) {
927 }
928 }
929
930 return caps;
931}

References ast_assert, ast_format_cap_alloc, ast_format_cap_append_from_cap(), AST_FORMAT_CAP_FLAG_DEFAULT, AST_MEDIA_TYPE_UNKNOWN, AST_STREAM_STATE_REMOVED, AST_VECTOR_GET, AST_VECTOR_SIZE, ast_stream::formats, NULL, ast_stream::state, ast_stream_topology::streams, type, and ast_stream::type.

Referenced by ast_stream_topology_get_formats().

◆ ast_stream_topology_get_stream()

struct ast_stream * ast_stream_topology_get_stream ( const struct ast_stream_topology topology,
unsigned int  position 
)

◆ ast_stream_topology_map()

void ast_stream_topology_map ( const struct ast_stream_topology topology,
struct ast_vector_int types,
struct ast_vector_int v0,
struct ast_vector_int v1 
)

Map a given topology's streams to the given types.

Note
The given vectors in which mapping values are placed are reset by this function. This means if those vectors already contain mapping values they will be lost.
Parameters
topologyThe topology to map
typesThe media types to be mapped
v0Index mapping of topology to types
v1Index mapping of types to topology
Since
15

Definition at line 988 of file stream.c.

990{
991 int i;
992 int nths[AST_MEDIA_TYPE_END] = {0};
993 int size = ast_stream_topology_get_count(topology);
994
995 /*
996 * Clear out any old mappings and initialize the new ones
997 */
998 AST_VECTOR_FREE(v0);
999 AST_VECTOR_FREE(v1);
1000
1001 /*
1002 * Both vectors are sized to the topology. The media types vector is always
1003 * guaranteed to be the size of the given topology or greater.
1004 */
1005 AST_VECTOR_INIT(v0, size);
1006 AST_VECTOR_INIT(v1, size);
1007
1008 for (i = 0; i < size; ++i) {
1009 struct ast_stream *stream = ast_stream_topology_get_stream(topology, i);
1011 int index = AST_VECTOR_GET_INDEX_NTH(types, ++nths[type],
1013
1014 if (index == -1) {
1015 /*
1016 * If a given type is not found for an index level then update the
1017 * media types vector with that type. This keeps the media types
1018 * vector always at the max topology size.
1019 */
1020 AST_VECTOR_APPEND(types, type);
1021 index = AST_VECTOR_SIZE(types) - 1;
1022 }
1023
1024 /*
1025 * The mapping is reflexive in the sense that if it maps in one direction
1026 * then the reverse direction maps back to the other's index.
1027 */
1028 AST_VECTOR_REPLACE(v0, i, index);
1029 AST_VECTOR_REPLACE(v1, index, i);
1030 }
1031}
#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:284
#define AST_VECTOR_GET_INDEX_NTH(vec, nth, value, cmp)
Get the nth index from a vector that matches the given comparison.
Definition: vector.h:696
#define AST_VECTOR_FREE(vec)
Deallocates this vector.
Definition: vector.h:174
#define AST_VECTOR_ELEM_DEFAULT_CMP(elem, value)
Default comparator for AST_VECTOR_REMOVE_ELEM_UNORDERED()
Definition: vector.h:564

References AST_MEDIA_TYPE_END, ast_stream_get_type(), ast_stream_topology_get_count(), ast_stream_topology_get_stream(), AST_VECTOR_APPEND, AST_VECTOR_ELEM_DEFAULT_CMP, AST_VECTOR_FREE, AST_VECTOR_GET_INDEX_NTH, AST_VECTOR_INIT, AST_VECTOR_REPLACE, AST_VECTOR_SIZE, and type.

Referenced by ast_bridge_channel_stream_map(), and AST_TEST_DEFINE().

◆ ast_stream_topology_set_stream()

int ast_stream_topology_set_stream ( struct ast_stream_topology topology,
unsigned int  position,
struct ast_stream stream 
)

Set a specific position in a topology.

Parameters
topologyThe topology of streams
positionThe topology position to set
streamThe stream to put in its place
Return values
0success
-1failure
Note
If an existing stream exists it will be destroyed
You can overwrite an existing position in the topology or set the first unused position. You can't set positions beyond that.
Since
15
Note
If the stream's name is empty, it'll be set to <stream_type>-<position>

Definition at line 799 of file stream.c.

801{
802 struct ast_stream *existing_stream;
803
804 ast_assert(topology && stream);
805
806 if (position > AST_VECTOR_SIZE(&topology->streams)) {
807 return -1;
808 }
809
810 if (position < AST_VECTOR_SIZE(&topology->streams)) {
811 existing_stream = AST_VECTOR_GET(&topology->streams, position);
812 ast_stream_free(existing_stream);
813 }
814
815 stream->position = position;
816
817 if (position == AST_VECTOR_SIZE(&topology->streams)) {
818 return AST_VECTOR_APPEND(&topology->streams, stream);
819 }
820
821 if (ast_strlen_zero(stream->name)) {
822 snprintf(stream->name, MIN_STREAM_NAME_LEN, "%s-%d", ast_codec_media_type2str(stream->type), stream->position);
823 }
824
825 return AST_VECTOR_REPLACE(&topology->streams, position, stream);
826}

References ast_assert, ast_codec_media_type2str(), ast_stream_free(), ast_strlen_zero(), AST_VECTOR_APPEND, AST_VECTOR_GET, AST_VECTOR_REPLACE, AST_VECTOR_SIZE, MIN_STREAM_NAME_LEN, ast_stream::name, ast_stream::position, ast_stream_topology::streams, and ast_stream::type.

Referenced by append_all_streams(), AST_TEST_DEFINE(), handle_incoming_sdp(), remove_all_original_streams(), resolve_refresh_media_states(), sdp_requires_deferral(), and t38_create_media_state().

◆ ast_stream_topology_to_str()

const char * ast_stream_topology_to_str ( const struct ast_stream_topology topology,
struct ast_str **  buf 
)

Get a string representing the topology for debugging/display purposes.

Since
18
Parameters
topologyA stream topology
bufA pointer to an ast_str* used for the output.
Return values
""(empty string) if either buf or *buf are NULL
(null topology)if *topology was NULL
Returns
<topology_representation> otherwise
Warning
No attempt should ever be made to free the returned char * and it should be dup'd if needed after the ast_str is freed.

Return format:

<final>? <stream> ... 

Sample return:

"final <audio:audio:sendrecv (ulaw,g722)> <video:video:sendonly (h264)>" 

Definition at line 939 of file stream.c.

941{
942 int i;
943
944 if (!buf ||!*buf) {
945 return "";
946 }
947
948 if (!topology) {
949 ast_str_append(buf, 0, "(null topology)");
950 return ast_str_buffer(*buf);
951 }
952
953 ast_str_append(buf, 0, "%s", S_COR(topology->final, "final", ""));
954
955 for (i = 0; i < AST_VECTOR_SIZE(&topology->streams); i++) {
956 struct ast_stream *stream;
957
958 stream = AST_VECTOR_GET(&topology->streams, i);
959 ast_str_append(buf, 0, " <");
960 ast_stream_to_str(stream, buf);
961 ast_str_append(buf, 0, ">");
962 }
963
964 return ast_str_buffer(*buf);
965}
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition: strings.h:87

References ast_str_append(), ast_str_buffer(), ast_stream_to_str(), AST_VECTOR_GET, AST_VECTOR_SIZE, buf, ast_stream_topology::final, S_COR, and ast_stream_topology::streams.

Referenced by ast_channel_request_stream_topology_change(), ast_channel_set_stream_topology(), ast_sip_session_create_outgoing(), call(), chan_pjsip_call(), chan_pjsip_indicate(), chan_pjsip_request_with_stream_topology(), compatible_formats_exist(), dial_exec_full(), is_media_state_valid(), on_topology_change_response(), resolve_refresh_media_states(), send_topology_change_refresh(), session_on_tsx_state(), simple_bridge_join(), sip_session_refresh(), softmix_bridge_stream_sources_update(), stream_topology_destroy(), and wait_for_answer().

◆ stream_topology_destroy()

static void stream_topology_destroy ( void *  data)
static

Definition at line 641 of file stream.c.

642{
643 struct ast_stream_topology *topology = data;
644 SCOPE_ENTER(4, "Topology: %p: %s\n", topology, ast_str_tmp(128, ast_stream_topology_to_str(topology, &STR_TMP)));
645
647 AST_VECTOR_FREE(&topology->streams);
648 SCOPE_EXIT_RTN("Destroyed: %p\n", topology);
649}
#define SCOPE_EXIT_RTN(...)
const char * ast_stream_topology_to_str(const struct ast_stream_topology *topology, struct ast_str **buf)
Get a string representing the topology for debugging/display purposes.
Definition: stream.c:939
#define AST_VECTOR_CALLBACK_VOID(vec, callback,...)
Execute a callback on every element in a vector disregarding callback return.
Definition: vector.h:862

References ast_str_tmp, ast_stream_free(), ast_stream_topology_to_str(), AST_VECTOR_CALLBACK_VOID, AST_VECTOR_FREE, SCOPE_ENTER, SCOPE_EXIT_RTN, and ast_stream_topology::streams.

Referenced by ast_stream_topology_alloc().

Variable Documentation

◆ ast_stream_codec_negotiation_keep_map

const char* ast_stream_codec_negotiation_keep_map[]
Initial value:
= {
}
@ CODEC_NEGOTIATION_KEEP_ALL
Definition: stream.h:180

"keep" enum to string map

Definition at line 69 of file stream.c.

◆ ast_stream_codec_negotiation_operation_map

const char* ast_stream_codec_negotiation_operation_map[]

"operation" enum to string map

Definition at line 61 of file stream.c.

◆ ast_stream_codec_negotiation_params_map

const char* ast_stream_codec_negotiation_params_map[]

Preference enum to string map.

Definition at line 47 of file stream.c.

◆ ast_stream_codec_negotiation_prefer_map

const char* ast_stream_codec_negotiation_prefer_map[]
Initial value:
= {
}
@ CODEC_NEGOTIATION_PREFER_CONFIGURED
Definition: stream.h:150

"prefer" enum to string map

Definition at line 55 of file stream.c.

◆ ast_stream_codec_negotiation_transcode_map

const char* ast_stream_codec_negotiation_transcode_map[]
Initial value:
= {
}
@ CODEC_NEGOTIATION_TRANSCODE_PREVENT
Definition: stream.h:196
@ CODEC_NEGOTIATION_TRANSCODE_ALLOW
Definition: stream.h:194

"transcode" state enum to string map

Definition at line 75 of file stream.c.

◆ ast_stream_state_map

const char* ast_stream_state_map[]

Stream state enum to string map.

Definition at line 223 of file stream.c.

Referenced by ast_stream_to_str().