Asterisk - The Open Source Telephony Project GIT-master-a358458
Data Structures | Macros | Functions | Variables
main/frame.c File Reference

Frame and codec manipulation routines. More...

#include "asterisk.h"
#include "asterisk/_private.h"
#include "asterisk/lock.h"
#include "asterisk/frame.h"
#include "asterisk/format_cache.h"
#include "asterisk/channel.h"
#include "asterisk/cli.h"
#include "asterisk/term.h"
#include "asterisk/utils.h"
#include "asterisk/threadstorage.h"
#include "asterisk/linkedlists.h"
#include "asterisk/translate.h"
#include "asterisk/dsp.h"
#include "asterisk/file.h"
#include <math.h>
Include dependency graph for main/frame.c:

Go to the source code of this file.

Data Structures

struct  ast_frame_cache
 
struct  ast_frames
 This is just so ast_frames, a list head struct for holding a list of ast_frame structures, is defined. More...
 

Macros

#define FRAME_CACHE_MAX_SIZE   10
 Maximum ast_frame cache size. More...
 

Functions

struct ast_frame__ast_frdup (const struct ast_frame *f, const char *file, int line, const char *func)
 
struct ast_frame__ast_frisolate (struct ast_frame *fr, const char *file, int line, const char *func)
 'isolates' a frame by duplicating non-malloc'ed components (header, src, data). On return all components are malloc'ed More...
 
static void __frame_free (struct ast_frame *fr, int cache)
 
static void __init_frame_cache (void)
 A per-thread cache of frame headers. More...
 
int ast_frame_adjust_volume (struct ast_frame *f, int adjustment)
 Adjusts the volume of the audio samples contained in a frame. More...
 
int ast_frame_adjust_volume_float (struct ast_frame *f, float adjustment)
 Adjusts the volume of the audio samples contained in a frame. More...
 
int ast_frame_clear (struct ast_frame *frame)
 Clear all audio samples from an ast_frame. The frame must be AST_FRAME_VOICE and AST_FORMAT_SLINEAR. More...
 
void ast_frame_dtor (struct ast_frame *f)
 NULL-safe wrapper for ast_frfree, good for RAII_VAR. More...
 
void ast_frame_dump (const char *name, struct ast_frame *f, char *prefix)
 
void ast_frame_free (struct ast_frame *frame, int cache)
 Frees a frame or list of frames. More...
 
static struct ast_frameast_frame_header_new (const char *file, int line, const char *func)
 
int ast_frame_slinear_sum (struct ast_frame *f1, struct ast_frame *f2)
 Sums two frames of audio samples. More...
 
char * ast_frame_subclass2str (struct ast_frame *f, char *subclass, size_t slen, char *moreinfo, size_t mlen)
 Copy the discription of a frame's subclass into the provided string. More...
 
char * ast_frame_type2str (enum ast_frame_type frame_type, char *ftype, size_t len)
 Copy the discription of a frame type into the provided string. More...
 
void ast_swapcopy_samples (void *dst, const void *src, int samples)
 
static void frame_cache_cleanup (void *data)
 

Variables

struct ast_frame ast_null_frame = { AST_FRAME_NULL, }
 
static struct ast_threadstorage frame_cache = { .once = PTHREAD_ONCE_INIT , .key_init = __init_frame_cache , .custom_init = NULL , }
 

Detailed Description

Frame and codec manipulation routines.

Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m

Definition in file main/frame.c.

Macro Definition Documentation

◆ FRAME_CACHE_MAX_SIZE

#define FRAME_CACHE_MAX_SIZE   10

Maximum ast_frame cache size.

In most cases where the frame header cache will be useful, the size of the cache will stay very small. However, it is not always the case that the same thread that allocates the frame will be the one freeing them, so sometimes a thread will never have any frames in its cache, or the cache will never be pulled from. For the latter case, we limit the maximum size.

Definition at line 67 of file main/frame.c.

Function Documentation

◆ __ast_frdup()

struct ast_frame * __ast_frdup ( const struct ast_frame f,
const char *  file,
int  line,
const char *  func 
)

Definition at line 305 of file main/frame.c.

306{
307 struct ast_frame *out = NULL;
308 int len, srclen = 0;
309 void *buf = NULL;
310
311#if !defined(NO_FRAME_CACHE)
312 struct ast_frame_cache *frames;
313#endif
314
315 /* Start with standard stuff */
316 len = sizeof(*out) + AST_FRIENDLY_OFFSET + f->datalen;
317 /* If we have a source, add space for it */
318 /*
319 * XXX Watch out here - if we receive a src which is not terminated
320 * properly, we can be easily attacked. Should limit the size we deal with.
321 */
322 if (f->src)
323 srclen = strlen(f->src);
324 if (srclen > 0)
325 len += srclen + 1;
326
327#if !defined(NO_FRAME_CACHE)
328 if ((frames = ast_threadstorage_get(&frame_cache, sizeof(*frames)))) {
330 if (out->mallocd_hdr_len >= len) {
331 size_t mallocd_len = out->mallocd_hdr_len;
332
334 memset(out, 0, sizeof(*out));
335 out->mallocd_hdr_len = mallocd_len;
336 buf = out;
337 frames->size--;
338 break;
339 }
340 }
342 }
343#endif
344
345 if (!buf) {
346 if (!(buf = __ast_calloc(1, len, file, line, func)))
347 return NULL;
348 out = buf;
349 out->mallocd_hdr_len = len;
350 }
351
352 out->frametype = f->frametype;
353 out->subclass = f->subclass;
354 if ((f->frametype == AST_FRAME_VOICE) || (f->frametype == AST_FRAME_VIDEO) ||
355 (f->frametype == AST_FRAME_IMAGE)) {
356 ao2_bump(out->subclass.format);
358 ao2_bump(out->subclass.topology);
359 }
360
361 out->datalen = f->datalen;
362 out->samples = f->samples;
363 out->delivery = f->delivery;
364 /* Even though this new frame was allocated from the heap, we can't mark it
365 * with AST_MALLOCD_HDR, AST_MALLOCD_DATA and AST_MALLOCD_SRC, because that
366 * would cause ast_frfree() to attempt to individually free each of those
367 * under the assumption that they were separately allocated. Since this frame
368 * was allocated in a single allocation, we'll only mark it as if the header
369 * was heap-allocated; this will result in the entire frame being properly freed.
370 */
371 out->mallocd = AST_MALLOCD_HDR;
372 out->offset = AST_FRIENDLY_OFFSET;
373 /* Make sure that empty text frames have a valid data.ptr */
374 if (out->datalen || f->frametype == AST_FRAME_TEXT) {
375 out->data.ptr = buf + sizeof(*out) + AST_FRIENDLY_OFFSET;
376 memcpy(out->data.ptr, f->data.ptr, out->datalen);
377 } else {
378 out->data.uint32 = f->data.uint32;
379 }
380 if (srclen > 0) {
381 /* This may seem a little strange, but it's to avoid a gcc (4.2.4) compiler warning */
382 char *src;
383 out->src = buf + sizeof(*out) + AST_FRIENDLY_OFFSET + f->datalen;
384 src = (char *) out->src;
385 /* Must have space since we allocated for it */
386 strcpy(src, f->src);
387 }
389 out->ts = f->ts;
390 out->len = f->len;
391 out->seqno = f->seqno;
392 out->stream_num = f->stream_num;
393 return out;
394}
void * __ast_calloc(size_t nmemb, size_t size, const char *file, int lineno, const char *func) attribute_malloc
Definition: astmm.c:1603
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition: astobj2.h:480
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define AST_MALLOCD_HDR
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.
@ AST_FRAME_VIDEO
@ AST_FRAME_IMAGE
@ AST_FRAME_VOICE
@ AST_FRAME_CONTROL
@ AST_FRAME_TEXT
@ AST_CONTROL_ANSWER
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:615
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:529
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:557
static struct ast_threadstorage frame_cache
Definition: main/frame.c:56
static int frames
Definition: parser.c:51
#define NULL
Definition: resample.c:96
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
union ast_frame::@226 data
struct timeval delivery
enum ast_frame_type frametype
const char * src
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
FILE * out
Definition: utils/frame.c:33
#define ast_copy_flags(dest, src, flagz)
Definition: utils.h:84
#define AST_FLAGS_ALL
Definition: utils.h:196

References __ast_calloc(), ao2_bump, AST_CONTROL_ANSWER, ast_copy_flags, AST_FLAGS_ALL, AST_FRAME_CONTROL, AST_FRAME_IMAGE, AST_FRAME_TEXT, AST_FRAME_VIDEO, AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_MALLOCD_HDR, ast_threadstorage_get(), buf, ast_frame::data, ast_frame::datalen, ast_frame::delivery, make_ari_stubs::file, frame_cache, frames, ast_frame::frametype, ast_frame_subclass::integer, len(), ast_frame::len, NULL, out, ast_frame::ptr, ast_frame::samples, ast_frame::seqno, ast_frame::src, ast_frame::stream_num, ast_frame::subclass, ast_frame::ts, and ast_frame::uint32.

Referenced by __ast_frisolate().

◆ __ast_frisolate()

struct ast_frame * __ast_frisolate ( struct ast_frame fr,
const char *  file,
int  line,
const char *  func 
)

'isolates' a frame by duplicating non-malloc'ed components (header, src, data). On return all components are malloc'ed

Definition at line 197 of file main/frame.c.

198{
199 struct ast_frame *out;
200 void *newdata;
201
202 /* if none of the existing frame is malloc'd, let ast_frdup() do it
203 since it is more efficient
204 */
205 if (fr->mallocd == 0) {
206 return __ast_frdup(fr, file, line, func);
207 }
208
209 /* if everything is already malloc'd, we are done */
212 return fr;
213 }
214
215 if (!(fr->mallocd & AST_MALLOCD_HDR)) {
216 /* Allocate a new header if needed */
217 if (!(out = ast_frame_header_new(file, line, func))) {
218 return NULL;
219 }
220 out->frametype = fr->frametype;
221 out->subclass = fr->subclass;
222 if ((fr->frametype == AST_FRAME_VOICE) || (fr->frametype == AST_FRAME_VIDEO) ||
223 (fr->frametype == AST_FRAME_IMAGE)) {
224 ao2_bump(out->subclass.format);
225 } else if (fr->frametype == AST_FRAME_VOICE && fr->subclass.integer == AST_CONTROL_ANSWER) {
226 ao2_bump(out->subclass.topology);
227 }
228 out->datalen = fr->datalen;
229 out->samples = fr->samples;
230 out->mallocd = AST_MALLOCD_HDR;
231 out->offset = fr->offset;
232 /* Copy the timing data */
235 out->ts = fr->ts;
236 out->len = fr->len;
237 out->seqno = fr->seqno;
238 }
239 out->stream_num = fr->stream_num;
240 } else {
241 out = fr;
242 }
243
244 if (fr->src) {
245 /* The original frame has a source string */
246 if (!(fr->mallocd & AST_MALLOCD_SRC)) {
247 /*
248 * The original frame has a non-malloced source string.
249 *
250 * Duplicate the string and put it into the isolated frame
251 * which may also be the original frame.
252 */
253 newdata = ast_strdup(fr->src);
254 if (!newdata) {
255 if (out != fr) {
257 }
258 return NULL;
259 }
260 out->src = newdata;
261 out->mallocd |= AST_MALLOCD_SRC;
262 } else if (out != fr) {
263 /* Steal the source string from the original frame. */
264 out->src = fr->src;
265 fr->src = NULL;
266 fr->mallocd &= ~AST_MALLOCD_SRC;
267 out->mallocd |= AST_MALLOCD_SRC;
268 }
269 }
270
271 if (!(fr->mallocd & AST_MALLOCD_DATA)) {
272 /* The original frame has a non-malloced data buffer. */
273 if (!fr->datalen && fr->frametype != AST_FRAME_TEXT) {
274 /* Actually it's just an int so we can simply copy it. */
275 out->data.uint32 = fr->data.uint32;
276 return out;
277 }
278 /*
279 * Duplicate the data buffer and put it into the isolated frame
280 * which may also be the original frame.
281 */
282 newdata = ast_malloc(fr->datalen + AST_FRIENDLY_OFFSET);
283 if (!newdata) {
284 if (out != fr) {
286 }
287 return NULL;
288 }
289 newdata += AST_FRIENDLY_OFFSET;
290 out->offset = AST_FRIENDLY_OFFSET;
291 memcpy(newdata, fr->data.ptr, fr->datalen);
292 out->data.ptr = newdata;
293 out->mallocd |= AST_MALLOCD_DATA;
294 } else if (out != fr) {
295 /* Steal the data buffer from the original frame. */
296 out->data = fr->data;
297 memset(&fr->data, 0, sizeof(fr->data));
298 fr->mallocd &= ~AST_MALLOCD_DATA;
299 out->mallocd |= AST_MALLOCD_DATA;
300 }
301
302 return out;
303}
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
@ AST_FRFLAG_HAS_TIMING_INFO
#define AST_MALLOCD_DATA
#define AST_MALLOCD_SRC
static struct ast_frame * ast_frame_header_new(const char *file, int line, const char *func)
Definition: main/frame.c:81
struct ast_frame * __ast_frdup(const struct ast_frame *f, const char *file, int line, const char *func)
Definition: main/frame.c:305
void ast_frame_free(struct ast_frame *frame, int cache)
Frees a frame or list of frames.
Definition: main/frame.c:176
#define ast_test_flag(p, flag)
Definition: utils.h:63

References __ast_frdup(), ao2_bump, AST_CONTROL_ANSWER, ast_copy_flags, AST_FLAGS_ALL, ast_frame_free(), ast_frame_header_new(), AST_FRAME_IMAGE, AST_FRAME_TEXT, AST_FRAME_VIDEO, AST_FRAME_VOICE, AST_FRFLAG_HAS_TIMING_INFO, AST_FRIENDLY_OFFSET, ast_malloc, AST_MALLOCD_DATA, AST_MALLOCD_HDR, AST_MALLOCD_SRC, ast_strdup, ast_test_flag, ast_frame::data, ast_frame::datalen, make_ari_stubs::file, ast_frame::frametype, ast_frame_subclass::integer, ast_frame::len, ast_frame::mallocd, NULL, ast_frame::offset, out, ast_frame::ptr, ast_frame::samples, ast_frame::seqno, ast_frame::src, ast_frame::stream_num, ast_frame::subclass, ast_frame::ts, and ast_frame::uint32.

◆ __frame_free()

static void __frame_free ( struct ast_frame fr,
int  cache 
)
static

Definition at line 122 of file main/frame.c.

123{
124 if (!fr->mallocd)
125 return;
126
127#if !defined(NO_FRAME_CACHE)
128 if (fr->mallocd == AST_MALLOCD_HDR
129 && cache
131 /* Cool, only the header is malloc'd, let's just cache those for now
132 * to keep things simple... */
133 struct ast_frame_cache *frames;
134
136 if (frames && frames->size < FRAME_CACHE_MAX_SIZE) {
137 if (fr->frametype == AST_FRAME_VOICE
138 || fr->frametype == AST_FRAME_VIDEO
139 || fr->frametype == AST_FRAME_IMAGE) {
141 } else if (fr->frametype == AST_FRAME_CONTROL && fr->subclass.integer == AST_CONTROL_ANSWER) {
143 }
144
146 frames->size++;
147 return;
148 }
149 }
150#endif
151
152 if (fr->mallocd & AST_MALLOCD_DATA) {
153 if (fr->data.ptr) {
154 ast_free(fr->data.ptr - fr->offset);
155 }
156 }
157 if (fr->mallocd & AST_MALLOCD_SRC) {
158 ast_free((void *) fr->src);
159 }
160 if (fr->mallocd & AST_MALLOCD_HDR) {
161 if (fr->frametype == AST_FRAME_VOICE
162 || fr->frametype == AST_FRAME_VIDEO
163 || fr->frametype == AST_FRAME_IMAGE) {
165 } else if (fr->frametype == AST_FRAME_CONTROL && fr->subclass.integer == AST_CONTROL_ANSWER) {
167 }
168
169 ast_free(fr);
170 } else {
171 fr->mallocd = 0;
172 }
173}
#define ast_free(a)
Definition: astmm.h:180
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
Definition: linkedlists.h:711
#define FRAME_CACHE_MAX_SIZE
Maximum ast_frame cache size.
Definition: main/frame.c:67
#define ast_opt_cache_media_frames
Definition: options.h:121
struct ao2_container * cache
Definition: pbx_realtime.c:77
struct ast_stream_topology * topology
struct ast_format * format

References ao2_cleanup, AST_CONTROL_ANSWER, AST_FRAME_CONTROL, AST_FRAME_IMAGE, AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_free, AST_LIST_INSERT_HEAD, AST_MALLOCD_DATA, AST_MALLOCD_HDR, AST_MALLOCD_SRC, ast_opt_cache_media_frames, ast_threadstorage_get(), cache, ast_frame::data, ast_frame_subclass::format, frame_cache, FRAME_CACHE_MAX_SIZE, frames, ast_frame::frametype, ast_frame_subclass::integer, ast_frame::mallocd, ast_frame::offset, ast_frame::ptr, ast_frame::src, ast_frame::subclass, and ast_frame_subclass::topology.

Referenced by ast_frame_free().

◆ __init_frame_cache()

static void __init_frame_cache ( void  )
static

A per-thread cache of frame headers.

Definition at line 56 of file main/frame.c.

73{

◆ ast_frame_adjust_volume()

int ast_frame_adjust_volume ( struct ast_frame f,
int  adjustment 
)

Adjusts the volume of the audio samples contained in a frame.

Parameters
fThe frame containing the samples (must be AST_FRAME_VOICE and AST_FORMAT_SLINEAR)
adjustmentThe number of dB to adjust up or down.
Returns
0 for success, non-zero for an error

Definition at line 787 of file main/frame.c.

788{
789 int count;
790 short *fdata = f->data.ptr;
791 short adjust_value = abs(adjustment);
792
794 return -1;
795 }
796
797 if (!adjustment) {
798 return 0;
799 }
800
801 for (count = 0; count < f->samples; count++) {
802 if (adjustment > 0) {
803 ast_slinear_saturated_multiply(&fdata[count], &adjust_value);
804 } else if (adjustment < 0) {
805 ast_slinear_saturated_divide(&fdata[count], &adjust_value);
806 }
807 }
808
809 return 0;
810}
#define abs(x)
Definition: f2c.h:195
int ast_format_cache_is_slinear(struct ast_format *format)
Determines if a format is one of the cached slin formats.
Definition: format_cache.c:534
static force_inline void ast_slinear_saturated_multiply(short *input, short *value)
Definition: utils.h:476
static force_inline void ast_slinear_saturated_divide(short *input, short *value)
Definition: utils.h:502

References abs, ast_format_cache_is_slinear(), AST_FRAME_VOICE, ast_slinear_saturated_divide(), ast_slinear_saturated_multiply(), ast_frame::data, ast_frame_subclass::format, ast_frame::frametype, ast_frame::ptr, ast_frame::samples, and ast_frame::subclass.

Referenced by audiohook_read_frame_single(), audiohook_volume_callback(), and conf_run().

◆ ast_frame_adjust_volume_float()

int ast_frame_adjust_volume_float ( struct ast_frame f,
float  adjustment 
)

Adjusts the volume of the audio samples contained in a frame.

Parameters
fThe frame containing the samples (must be AST_FRAME_VOICE and AST_FORMAT_SLINEAR)
adjustmentThe number of dB to adjust up or down.
Returns
0 for success, non-zero for an error

Definition at line 812 of file main/frame.c.

813{
814 int count;
815 short *fdata = f->data.ptr;
816 float adjust_value = fabs(adjustment);
817
819 return -1;
820 }
821
822 if (!adjustment) {
823 return 0;
824 }
825
826 for (count = 0; count < f->samples; count++) {
827 if (adjustment > 0) {
828 ast_slinear_saturated_multiply_float(&fdata[count], &adjust_value);
829 } else if (adjustment < 0) {
830 ast_slinear_saturated_divide_float(&fdata[count], &adjust_value);
831 }
832 }
833
834 return 0;
835}
static force_inline void ast_slinear_saturated_divide_float(short *input, float *value)
Definition: utils.h:507
static force_inline void ast_slinear_saturated_multiply_float(short *input, float *value)
Definition: utils.h:489

References ast_format_cache_is_slinear(), AST_FRAME_VOICE, ast_slinear_saturated_divide_float(), ast_slinear_saturated_multiply_float(), ast_frame::data, ast_frame_subclass::format, ast_frame::frametype, ast_frame::ptr, ast_frame::samples, and ast_frame::subclass.

Referenced by volume_callback().

◆ ast_frame_clear()

int ast_frame_clear ( struct ast_frame frame)

Clear all audio samples from an ast_frame. The frame must be AST_FRAME_VOICE and AST_FORMAT_SLINEAR.

Definition at line 859 of file main/frame.c.

860{
861 struct ast_frame *next;
862
863 for (next = AST_LIST_NEXT(frame, frame_list);
864 frame;
865 frame = next, next = frame ? AST_LIST_NEXT(frame, frame_list) : NULL) {
866 memset(frame->data.ptr, 0, frame->datalen);
867 }
868 return 0;
869}
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: linkedlists.h:439
struct ast_frame * next

References AST_LIST_NEXT, ast_frame::data, ast_frame::datalen, ast_frame::next, NULL, and ast_frame::ptr.

Referenced by audiohook_read_frame_single().

◆ ast_frame_dtor()

void ast_frame_dtor ( struct ast_frame frame)

NULL-safe wrapper for ast_frfree, good for RAII_VAR.

Parameters
frameFrame to free, or head of list to free.

Definition at line 187 of file main/frame.c.

188{
189 ast_frfree(f);
190}
#define ast_frfree(fr)

References ast_frfree.

Referenced by __ast_play_and_record(), and stasis_app_exec().

◆ ast_frame_dump()

void ast_frame_dump ( const char *  name,
struct ast_frame f,
char *  prefix 
)

Dump a frame for debugging purposes

Definition at line 731 of file main/frame.c.

732{
733 const char noname[] = "unknown";
734 char ftype[40] = "Unknown Frametype";
735 char cft[80];
736 char subclass[40] = "Unknown Subclass";
737 char csub[80];
738 char moreinfo[40] = "";
739 char cn[60];
740 char cp[40];
741 char cmn[40];
742
743 if (!name) {
744 name = noname;
745 }
746
747 if (!f) {
748 ast_verb(-1, "%s [ %s (NULL) ] [%s]\n",
749 term_color(cp, prefix, COLOR_BRMAGENTA, COLOR_BLACK, sizeof(cp)),
750 term_color(cft, "HANGUP", COLOR_BRRED, COLOR_BLACK, sizeof(cft)),
751 term_color(cn, name, COLOR_YELLOW, COLOR_BLACK, sizeof(cn)));
752 return;
753 }
754 /* XXX We should probably print one each of voice and video when the format changes XXX */
755 if (f->frametype == AST_FRAME_VOICE) {
756 return;
757 }
758 if (f->frametype == AST_FRAME_VIDEO) {
759 return;
760 }
761 if (f->frametype == AST_FRAME_RTCP) {
762 return;
763 }
764
765 ast_frame_type2str(f->frametype, ftype, sizeof(ftype));
766 ast_frame_subclass2str(f, subclass, sizeof(subclass), moreinfo, sizeof(moreinfo));
767
768 if (!ast_strlen_zero(moreinfo))
769 ast_verb(-1, "%s [ TYPE: %s (%u) SUBCLASS: %s (%d) '%s' ] [%s]\n",
770 term_color(cp, prefix, COLOR_BRMAGENTA, COLOR_BLACK, sizeof(cp)),
771 term_color(cft, ftype, COLOR_BRRED, COLOR_BLACK, sizeof(cft)),
772 f->frametype,
773 term_color(csub, subclass, COLOR_BRCYAN, COLOR_BLACK, sizeof(csub)),
774 f->subclass.integer,
775 term_color(cmn, moreinfo, COLOR_BRGREEN, COLOR_BLACK, sizeof(cmn)),
776 term_color(cn, name, COLOR_YELLOW, COLOR_BLACK, sizeof(cn)));
777 else
778 ast_verb(-1, "%s [ TYPE: %s (%u) SUBCLASS: %s (%d) ] [%s]\n",
779 term_color(cp, prefix, COLOR_BRMAGENTA, COLOR_BLACK, sizeof(cp)),
780 term_color(cft, ftype, COLOR_BRRED, COLOR_BLACK, sizeof(cft)),
781 f->frametype,
782 term_color(csub, subclass, COLOR_BRCYAN, COLOR_BLACK, sizeof(csub)),
783 f->subclass.integer,
784 term_color(cn, name, COLOR_YELLOW, COLOR_BLACK, sizeof(cn)));
785}
static const char name[]
Definition: format_mp3.c:68
static char prefix[MAX_PREFIX]
Definition: http.c:144
@ AST_FRAME_RTCP
#define ast_verb(level,...)
char * ast_frame_type2str(enum ast_frame_type frame_type, char *ftype, size_t len)
Copy the discription of a frame type into the provided string.
Definition: main/frame.c:671
char * ast_frame_subclass2str(struct ast_frame *f, char *subclass, size_t slen, char *moreinfo, size_t mlen)
Copy the discription of a frame's subclass into the provided string.
Definition: main/frame.c:406
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
#define COLOR_BRGREEN
Definition: term.h:55
#define COLOR_BRRED
Definition: term.h:53
#define COLOR_BRCYAN
Definition: term.h:63
#define COLOR_YELLOW
Definition: term.h:57
#define COLOR_BLACK
Definition: term.h:50
char * term_color(char *outbuf, const char *inbuf, int fgcolor, int bgcolor, int maxout)
Colorize a specified string by adding terminal color codes.
Definition: term.c:235
#define COLOR_BRMAGENTA
Definition: term.h:61

References AST_FRAME_RTCP, ast_frame_subclass2str(), ast_frame_type2str(), AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_strlen_zero(), ast_verb, COLOR_BLACK, COLOR_BRCYAN, COLOR_BRGREEN, COLOR_BRMAGENTA, COLOR_BRRED, COLOR_YELLOW, ast_frame::frametype, ast_frame_subclass::integer, name, prefix, ast_frame::subclass, and term_color().

Referenced by __ast_read(), and ast_write_stream().

◆ ast_frame_free()

void ast_frame_free ( struct ast_frame frame,
int  cache 
)

Frees a frame or list of frames.

Parameters
frameFrame to free, or head of list to free
cacheWhether to consider this frame for frame caching

Definition at line 176 of file main/frame.c.

177{
178 struct ast_frame *next;
179
180 while (frame) {
181 next = AST_LIST_NEXT(frame, frame_list);
182 __frame_free(frame, cache);
183 frame = next;
184 }
185}
static void __frame_free(struct ast_frame *fr, int cache)
Definition: main/frame.c:122

References __frame_free(), AST_LIST_NEXT, cache, and ast_frame::next.

Referenced by __ast_frisolate(), ast_rtp_read(), mixmonitor_thread(), and spy_generate().

◆ ast_frame_header_new()

static struct ast_frame * ast_frame_header_new ( const char *  file,
int  line,
const char *  func 
)
static

Definition at line 81 of file main/frame.c.

82{
83 struct ast_frame *f;
84
85#if !defined(NO_FRAME_CACHE)
86 struct ast_frame_cache *frames;
87
88 if ((frames = ast_threadstorage_get(&frame_cache, sizeof(*frames)))) {
89 if ((f = AST_LIST_REMOVE_HEAD(&frames->list, frame_list))) {
90 size_t mallocd_len = f->mallocd_hdr_len;
91
92 memset(f, 0, sizeof(*f));
93 f->mallocd_hdr_len = mallocd_len;
94 frames->size--;
95 return f;
96 }
97 }
98#endif
99
100 if (!(f = __ast_calloc(1, sizeof(*f), file, line, func))) {
101 return NULL;
102 }
103
104 f->mallocd_hdr_len = sizeof(*f);
105
106 return f;
107}
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:833

References __ast_calloc(), AST_LIST_REMOVE_HEAD, ast_threadstorage_get(), make_ari_stubs::file, frame_cache, frames, ast_frame::mallocd_hdr_len, and NULL.

Referenced by __ast_frisolate().

◆ ast_frame_slinear_sum()

int ast_frame_slinear_sum ( struct ast_frame f1,
struct ast_frame f2 
)

Sums two frames of audio samples.

Parameters
f1The first frame (which will contain the result)
f2The second frame
Returns
0 for success, non-zero for an error

The frames must be AST_FRAME_VOICE and must contain AST_FORMAT_SLINEAR samples, and must contain the same number of samples.

Definition at line 837 of file main/frame.c.

838{
839 int count;
840 short *data1, *data2;
841
843 return -1;
844
846 return -1;
847
848 if (f1->samples != f2->samples)
849 return -1;
850
851 for (count = 0, data1 = f1->data.ptr, data2 = f2->data.ptr;
852 count < f1->samples;
853 count++, data1++, data2++)
854 ast_slinear_saturated_add(data1, data2);
855
856 return 0;
857}
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_NOT_EQUAL
Definition: format.h:38
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.
Definition: format_cache.c:41
static force_inline void ast_slinear_saturated_add(short *input, short *value)
Definition: utils.h:450

References ast_format_cmp(), AST_FORMAT_CMP_NOT_EQUAL, ast_format_slin, AST_FRAME_VOICE, ast_slinear_saturated_add(), ast_frame::data, ast_frame_subclass::format, ast_frame::frametype, ast_frame::ptr, ast_frame::samples, and ast_frame::subclass.

◆ ast_frame_subclass2str()

char * ast_frame_subclass2str ( struct ast_frame f,
char *  subclass,
size_t  slen,
char *  moreinfo,
size_t  mlen 
)

Copy the discription of a frame's subclass into the provided string.

Parameters
fThe frame to get the information from
subclassBuffer to fill with subclass information
slenLength of subclass buffer
moreinfoBuffer to fill with additional information
mlenLength of moreinfo buffer
Returns
Pointer to subclass
Since
11

Definition at line 406 of file main/frame.c.

407{
408 switch(f->frametype) {
410 if (slen > 1) {
411 subclass[0] = f->subclass.integer;
412 subclass[1] = '\0';
413 }
414 break;
416 if (slen > 1) {
417 subclass[0] = f->subclass.integer;
418 subclass[1] = '\0';
419 }
420 break;
422 switch (f->subclass.integer) {
424 ast_copy_string(subclass, "Hangup", slen);
425 break;
426 case AST_CONTROL_RING:
427 ast_copy_string(subclass, "Ring", slen);
428 break;
430 ast_copy_string(subclass, "Ringing", slen);
431 break;
433 ast_copy_string(subclass, "Answer", slen);
434 break;
435 case AST_CONTROL_BUSY:
436 ast_copy_string(subclass, "Busy", slen);
437 break;
439 ast_copy_string(subclass, "Take Off Hook", slen);
440 break;
442 ast_copy_string(subclass, "Line Off Hook", slen);
443 break;
445 ast_copy_string(subclass, "Congestion", slen);
446 break;
448 ast_copy_string(subclass, "Flash", slen);
449 break;
450 case AST_CONTROL_WINK:
451 ast_copy_string(subclass, "Wink", slen);
452 break;
454 ast_copy_string(subclass, "Option", slen);
455 break;
457 ast_copy_string(subclass, "Key Radio", slen);
458 break;
460 ast_copy_string(subclass, "Unkey Radio", slen);
461 break;
463 ast_copy_string(subclass, "Progress", slen);
464 break;
466 ast_copy_string(subclass, "Proceeding", slen);
467 break;
468 case AST_CONTROL_HOLD:
469 ast_copy_string(subclass, "Hold", slen);
470 break;
472 ast_copy_string(subclass, "Unhold", slen);
473 break;
475 ast_copy_string(subclass, "Video Update", slen);
476 break;
478 char *message = "Unknown";
479 if (f->datalen != sizeof(struct ast_control_t38_parameters)) {
480 message = "Invalid";
481 } else {
482 struct ast_control_t38_parameters *parameters = f->data.ptr;
483 enum ast_control_t38 state = parameters->request_response;
485 message = "Negotiation Requested";
487 message = "Negotiation Request Terminated";
488 else if (state == AST_T38_NEGOTIATED)
489 message = "Negotiated";
490 else if (state == AST_T38_TERMINATED)
491 message = "Terminated";
492 else if (state == AST_T38_REFUSED)
493 message = "Refused";
494 }
495 snprintf(subclass, slen, "T38_Parameters/%s", message);
496 break;
497 }
498
500 ast_copy_string(subclass, "Stop stream", slen);
501 break;
503 ast_copy_string(subclass, "Suspend stream", slen);
504 break;
506 ast_copy_string(subclass, "Restart stream", slen);
507 break;
509 ast_copy_string(subclass, "Reverse stream", slen);
510 break;
512 ast_copy_string(subclass, "Forward stream", slen);
513 break;
515 ast_copy_string(subclass, "Cancel stream", slen);
516 break;
518 ast_copy_string(subclass, "Record stop", slen);
519 break;
521 ast_copy_string(subclass, "Record suspend", slen);
522 break;
524 ast_copy_string(subclass, "Record mute", slen);
525 break;
527 ast_copy_string(subclass, "Media source update", slen);
528 break;
530 ast_copy_string(subclass, "Transfer", slen);
531 break;
533 ast_copy_string(subclass, "Connected line update", slen);
534 break;
536 ast_copy_string(subclass, "Redirect", slen);
537 break;
538 case AST_CONTROL_CC:
539 ast_copy_string(subclass, "CC", slen);
540 break;
542 ast_copy_string(subclass, "Media SSRC change", slen);
543 break;
545 ast_copy_string(subclass, "Read action", slen);
546 break;
547 case AST_CONTROL_AOC:
548 ast_copy_string(subclass, "AOC", slen);
549 break;
551 ast_copy_string(subclass, "Endof Q", slen);
552 break;
554 ast_copy_string(subclass, "Incomplete", slen);
555 break;
556 case AST_CONTROL_MCID:
557 ast_copy_string(subclass, "MCID", slen);
558 break;
560 ast_copy_string(subclass, "Update RTP peer", slen);
561 break;
563 ast_copy_string(subclass, "Private Cause Code", slen);
564 break;
566 ast_copy_string(subclass, "Masquerade notify", slen);
567 break;
569 ast_copy_string(subclass, "Stream topology request change", slen);
570 break;
572 ast_copy_string(subclass, "Stream topology changed", slen);
573 break;
575 ast_copy_string(subclass, "Stream topology source changed", slen);
576 break;
577 case -1:
578 ast_copy_string(subclass, "Stop generators", slen);
579 break;
580 default:
581 snprintf(subclass, slen, "Unknown control '%d'", f->subclass.integer);
582 }
583 break;
584 case AST_FRAME_NULL:
585 ast_copy_string(subclass, "N/A", slen);
586 break;
587 case AST_FRAME_IAX:
588 /* Should never happen */
589 snprintf(subclass, slen, "IAX Frametype %d", f->subclass.integer);
590 break;
592 /* Should never happen */
593 snprintf(subclass, slen, "Bridge Frametype %d", f->subclass.integer);
594 break;
596 /* Should never happen */
597 snprintf(subclass, slen, "Synchronous Bridge Frametype %d", f->subclass.integer);
598 break;
599 case AST_FRAME_TEXT:
600 ast_copy_string(subclass, "N/A", slen);
601 if (moreinfo) {
602 ast_copy_string(moreinfo, f->data.ptr, mlen);
603 }
604 break;
605 case AST_FRAME_IMAGE:
606 snprintf(subclass, slen, "Image format %s\n", ast_format_get_name(f->subclass.format));
607 break;
608 case AST_FRAME_HTML:
609 switch (f->subclass.integer) {
610 case AST_HTML_URL:
611 ast_copy_string(subclass, "URL", slen);
612 if (moreinfo) {
613 ast_copy_string(moreinfo, f->data.ptr, mlen);
614 }
615 break;
616 case AST_HTML_DATA:
617 ast_copy_string(subclass, "Data", slen);
618 break;
619 case AST_HTML_BEGIN:
620 ast_copy_string(subclass, "Begin", slen);
621 break;
622 case AST_HTML_END:
623 ast_copy_string(subclass, "End", slen);
624 break;
626 ast_copy_string(subclass, "Load Complete", slen);
627 break;
629 ast_copy_string(subclass, "No Support", slen);
630 break;
631 case AST_HTML_LINKURL:
632 ast_copy_string(subclass, "Link URL", slen);
633 if (moreinfo) {
634 ast_copy_string(moreinfo, f->data.ptr, mlen);
635 }
636 break;
637 case AST_HTML_UNLINK:
638 ast_copy_string(subclass, "Unlink", slen);
639 break;
641 ast_copy_string(subclass, "Link Reject", slen);
642 break;
643 default:
644 snprintf(subclass, slen, "Unknown HTML frame '%d'\n", f->subclass.integer);
645 break;
646 }
647 break;
648 case AST_FRAME_MODEM:
649 switch (f->subclass.integer) {
650 case AST_MODEM_T38:
651 ast_copy_string(subclass, "T.38", slen);
652 break;
653 case AST_MODEM_V150:
654 ast_copy_string(subclass, "V.150", slen);
655 break;
656 default:
657 snprintf(subclass, slen, "Unknown MODEM frame '%d'\n", f->subclass.integer);
658 break;
659 }
660 break;
661 case AST_FRAME_RTCP:
662 ast_copy_string(subclass, "RTCP", slen);
663 default:
664 ast_copy_string(subclass, "Unknown Subclass", slen);
665 break;
666 }
667
668 return subclass;
669}
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition: format.c:334
@ AST_T38_TERMINATED
@ AST_T38_REFUSED
@ AST_T38_REQUEST_TERMINATE
@ AST_T38_NEGOTIATED
@ AST_T38_REQUEST_NEGOTIATE
#define AST_HTML_UNLINK
#define AST_MODEM_T38
#define AST_HTML_LINKURL
#define AST_HTML_URL
#define AST_HTML_NOSUPPORT
#define AST_HTML_LDCOMPLETE
#define AST_HTML_END
#define AST_HTML_DATA
#define AST_HTML_LINKREJECT
#define AST_MODEM_V150
#define AST_HTML_BEGIN
@ AST_FRAME_NULL
@ AST_FRAME_HTML
@ AST_FRAME_DTMF_END
@ AST_FRAME_DTMF_BEGIN
@ AST_FRAME_BRIDGE_ACTION_SYNC
@ AST_FRAME_MODEM
@ AST_FRAME_BRIDGE_ACTION
@ AST_CONTROL_RING
@ AST_CONTROL_SRCUPDATE
@ AST_CONTROL_RECORD_CANCEL
@ AST_CONTROL_WINK
@ AST_CONTROL_PROGRESS
@ AST_CONTROL_STREAM_TOPOLOGY_SOURCE_CHANGED
@ AST_CONTROL_OFFHOOK
@ AST_CONTROL_STREAM_RESTART
@ AST_CONTROL_STREAM_SUSPEND
@ AST_CONTROL_RADIO_UNKEY
@ AST_CONTROL_BUSY
@ AST_CONTROL_UNHOLD
@ AST_CONTROL_VIDUPDATE
@ AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE
@ AST_CONTROL_STREAM_REVERSE
@ AST_CONTROL_PROCEEDING
@ AST_CONTROL_REDIRECTING
@ AST_CONTROL_TAKEOFFHOOK
@ AST_CONTROL_MCID
@ AST_CONTROL_T38_PARAMETERS
@ AST_CONTROL_READ_ACTION
@ AST_CONTROL_RECORD_STOP
@ AST_CONTROL_CONGESTION
@ AST_CONTROL_CC
@ AST_CONTROL_RECORD_MUTE
@ AST_CONTROL_RINGING
@ AST_CONTROL_HANGUP
@ AST_CONTROL_STREAM_STOP
@ AST_CONTROL_RADIO_KEY
@ AST_CONTROL_HOLD
@ AST_CONTROL_OPTION
@ AST_CONTROL_STREAM_TOPOLOGY_CHANGED
@ AST_CONTROL_CONNECTED_LINE
@ AST_CONTROL_END_OF_Q
@ AST_CONTROL_TRANSFER
@ AST_CONTROL_STREAM_FORWARD
@ AST_CONTROL_FLASH
@ AST_CONTROL_RECORD_SUSPEND
@ AST_CONTROL_AOC
@ AST_CONTROL_SRCCHANGE
@ AST_CONTROL_INCOMPLETE
@ AST_CONTROL_MASQUERADE_NOTIFY
@ AST_CONTROL_PVT_CAUSE_CODE
@ AST_CONTROL_UPDATE_RTP_PEER
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
enum ast_control_t38 request_response

References AST_CONTROL_ANSWER, AST_CONTROL_AOC, AST_CONTROL_BUSY, AST_CONTROL_CC, AST_CONTROL_CONGESTION, AST_CONTROL_CONNECTED_LINE, AST_CONTROL_END_OF_Q, AST_CONTROL_FLASH, AST_CONTROL_HANGUP, AST_CONTROL_HOLD, AST_CONTROL_INCOMPLETE, AST_CONTROL_MASQUERADE_NOTIFY, AST_CONTROL_MCID, AST_CONTROL_OFFHOOK, AST_CONTROL_OPTION, AST_CONTROL_PROCEEDING, AST_CONTROL_PROGRESS, AST_CONTROL_PVT_CAUSE_CODE, AST_CONTROL_RADIO_KEY, AST_CONTROL_RADIO_UNKEY, AST_CONTROL_READ_ACTION, AST_CONTROL_RECORD_CANCEL, AST_CONTROL_RECORD_MUTE, AST_CONTROL_RECORD_STOP, AST_CONTROL_RECORD_SUSPEND, AST_CONTROL_REDIRECTING, AST_CONTROL_RING, AST_CONTROL_RINGING, AST_CONTROL_SRCCHANGE, AST_CONTROL_SRCUPDATE, AST_CONTROL_STREAM_FORWARD, AST_CONTROL_STREAM_RESTART, AST_CONTROL_STREAM_REVERSE, AST_CONTROL_STREAM_STOP, AST_CONTROL_STREAM_SUSPEND, AST_CONTROL_STREAM_TOPOLOGY_CHANGED, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, AST_CONTROL_STREAM_TOPOLOGY_SOURCE_CHANGED, AST_CONTROL_T38_PARAMETERS, AST_CONTROL_TAKEOFFHOOK, AST_CONTROL_TRANSFER, AST_CONTROL_UNHOLD, AST_CONTROL_UPDATE_RTP_PEER, AST_CONTROL_VIDUPDATE, AST_CONTROL_WINK, ast_copy_string(), ast_format_get_name(), AST_FRAME_BRIDGE_ACTION, AST_FRAME_BRIDGE_ACTION_SYNC, AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, AST_FRAME_HTML, AST_FRAME_IAX, AST_FRAME_IMAGE, AST_FRAME_MODEM, AST_FRAME_NULL, AST_FRAME_RTCP, AST_FRAME_TEXT, AST_HTML_BEGIN, AST_HTML_DATA, AST_HTML_END, AST_HTML_LDCOMPLETE, AST_HTML_LINKREJECT, AST_HTML_LINKURL, AST_HTML_NOSUPPORT, AST_HTML_UNLINK, AST_HTML_URL, AST_MODEM_T38, AST_MODEM_V150, AST_T38_NEGOTIATED, AST_T38_REFUSED, AST_T38_REQUEST_NEGOTIATE, AST_T38_REQUEST_TERMINATE, AST_T38_TERMINATED, ast_frame::data, ast_frame::datalen, ast_frame_subclass::format, ast_frame::frametype, ast_frame_subclass::integer, ast_frame::ptr, ast_control_t38_parameters::request_response, and ast_frame::subclass.

Referenced by ast_frame_dump(), chan_pjsip_indicate(), and handle_dump_frames().

◆ ast_frame_type2str()

char * ast_frame_type2str ( enum ast_frame_type  frame_type,
char *  ftype,
size_t  len 
)

Copy the discription of a frame type into the provided string.

Parameters
frame_typeThe frame type to be described
ftypeBuffer to fill with frame type description
lenLength of subclass buffer
Returns
Pointer to ftype
Since
11

Definition at line 671 of file main/frame.c.

672{
673 switch (frame_type) {
675 ast_copy_string(ftype, "DTMF Begin", len);
676 break;
678 ast_copy_string(ftype, "DTMF End", len);
679 break;
681 ast_copy_string(ftype, "Control", len);
682 break;
683 case AST_FRAME_NULL:
684 ast_copy_string(ftype, "Null Frame", len);
685 break;
686 case AST_FRAME_IAX:
687 /* Should never happen */
688 ast_copy_string(ftype, "IAX Specific", len);
689 break;
691 /* Should never happen */
692 ast_copy_string(ftype, "Bridge Specific", len);
693 break;
695 /* Should never happen */
696 ast_copy_string(ftype, "Bridge Specific", len);
697 break;
698 case AST_FRAME_TEXT:
699 ast_copy_string(ftype, "Text", len);
700 break;
702 ast_copy_string(ftype, "Text Data", len);
703 break;
704 case AST_FRAME_IMAGE:
705 ast_copy_string(ftype, "Image", len);
706 break;
707 case AST_FRAME_HTML:
708 ast_copy_string(ftype, "HTML", len);
709 break;
710 case AST_FRAME_MODEM:
711 ast_copy_string(ftype, "Modem", len);
712 break;
713 case AST_FRAME_VOICE:
714 ast_copy_string(ftype, "Voice", len);
715 break;
716 case AST_FRAME_VIDEO:
717 ast_copy_string(ftype, "Video", len);
718 break;
719 case AST_FRAME_RTCP:
720 ast_copy_string(ftype, "RTCP", len);
721 break;
722 default:
723 snprintf(ftype, len, "Unknown Frametype '%u'", frame_type);
724 break;
725 }
726
727 return ftype;
728}
frame_type
Definition: codec_builtin.c:44
@ AST_FRAME_TEXT_DATA

References ast_copy_string(), AST_FRAME_BRIDGE_ACTION, AST_FRAME_BRIDGE_ACTION_SYNC, AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, AST_FRAME_HTML, AST_FRAME_IAX, AST_FRAME_IMAGE, AST_FRAME_MODEM, AST_FRAME_NULL, AST_FRAME_RTCP, AST_FRAME_TEXT, AST_FRAME_TEXT_DATA, AST_FRAME_VIDEO, AST_FRAME_VOICE, and len().

Referenced by ast_frame_dump(), handle_dump_frames(), softmix_bridge_write_text(), and stream_echo_write_error().

◆ ast_swapcopy_samples()

void ast_swapcopy_samples ( void *  dst,
const void *  src,
int  samples 
)

Definition at line 396 of file main/frame.c.

397{
398 int i;
399 unsigned short *dst_s = dst;
400 const unsigned short *src_s = src;
401
402 for (i = 0; i < samples; i++)
403 dst_s[i] = (src_s[i]<<8) | (src_s[i]>>8);
404}

Referenced by __ast_smoother_feed(), iax_frame_wrap(), and smoother_frame_feed().

◆ frame_cache_cleanup()

static void frame_cache_cleanup ( void *  data)
static

Definition at line 110 of file main/frame.c.

111{
112 struct ast_frame_cache *frames = data;
113 struct ast_frame *f;
114
115 while ((f = AST_LIST_REMOVE_HEAD(&frames->list, frame_list)))
116 ast_free(f);
117
119}

References ast_free, AST_LIST_REMOVE_HEAD, and frames.

Variable Documentation

◆ ast_null_frame

struct ast_frame ast_null_frame = { AST_FRAME_NULL, }

◆ frame_cache

struct ast_threadstorage frame_cache = { .once = PTHREAD_ONCE_INIT , .key_init = __init_frame_cache , .custom_init = NULL , }
static

Definition at line 56 of file main/frame.c.

Referenced by __ast_frdup(), __frame_free(), and ast_frame_header_new().