Asterisk - The Open Source Telephony Project  18.5.0
Data Structures | Macros | Enumerations | Functions
translate.h File Reference

Support for translation of data formats. translate.c. More...

#include "asterisk/frame.h"
#include "asterisk/plc.h"
#include "asterisk/linkedlists.h"
#include "asterisk/format_cap.h"
#include "asterisk/format_cache.h"
Include dependency graph for translate.h:

Go to the source code of this file.

Data Structures

struct  ast_trans_pvt
 Default structure for translators, with the basic fields and buffers, all allocated as part of the same chunk of memory. The buffer is preceded by AST_FRIENDLY_OFFSET bytes in front of the user portion. 'buf' points right after this space. More...
 
struct  ast_translator
 Descriptor of a translator. More...
 

Macros

#define ast_register_translator(t)   __ast_register_translator(t, AST_MODULE_SELF)
 See __ast_register_translator() More...
 

Enumerations

enum  ast_trans_cost_table {
  AST_TRANS_COST_LL_LL_ORIGSAMP = 400000, AST_TRANS_COST_LL_LY_ORIGSAMP = 600000, AST_TRANS_COST_LL_LL_UPSAMP = 800000, AST_TRANS_COST_LL_LY_UPSAMP = 825000,
  AST_TRANS_COST_LL_LL_DOWNSAMP = 850000, AST_TRANS_COST_LL_LY_DOWNSAMP = 875000, AST_TRANS_COST_LL_UNKNOWN = 885000, AST_TRANS_COST_LY_LL_ORIGSAMP = 900000,
  AST_TRANS_COST_LY_LY_ORIGSAMP = 915000, AST_TRANS_COST_LY_LL_UPSAMP = 930000, AST_TRANS_COST_LY_LY_UPSAMP = 945000, AST_TRANS_COST_LY_LL_DOWNSAMP = 960000,
  AST_TRANS_COST_LY_LY_DOWNSAMP = 975000, AST_TRANS_COST_LY_UNKNOWN = 985000
}
 Translator Cost Table definition. More...
 

Functions

int __ast_register_translator (struct ast_translator *t, struct ast_module *module)
 Register a translator This registers a codec translator with asterisk. More...
 
struct ast_frameast_trans_frameout (struct ast_trans_pvt *pvt, int datalen, int samples)
 generic frameout function More...
 
struct ast_frameast_translate (struct ast_trans_pvt *tr, struct ast_frame *f, int consume)
 translates one or more frames Apply an input frame into the translator and receive zero or one output frames. Consume determines whether the original frame should be freed. In case the frame type is AST_FRAME_RTCP, the frame is not translated but passed to the translator codecs via the feedback callback, and a pointer to ast_null_frame is returned after that. More...
 
void ast_translate_available_formats (struct ast_format_cap *dest, struct ast_format_cap *src, struct ast_format_cap *result)
 Find available formats. More...
 
int ast_translate_init (void)
 Initialize the translation matrix and index to format conversion table. More...
 
unsigned int ast_translate_path_steps (struct ast_format *dest, struct ast_format *src)
 Returns the number of steps required to convert from 'src' to 'dest'. More...
 
const char * ast_translate_path_to_str (struct ast_trans_pvt *t, struct ast_str **str)
 Puts a string representation of the translation path into outbuf. More...
 
void ast_translator_activate (struct ast_translator *t)
 Activate a previously deactivated translator. More...
 
int ast_translator_best_choice (struct ast_format_cap *dst_cap, struct ast_format_cap *src_cap, struct ast_format **dst_fmt_out, struct ast_format **src_fmt_out)
 Chooses the best translation path. More...
 
struct ast_trans_pvtast_translator_build_path (struct ast_format *dest, struct ast_format *source)
 Builds a translator path Build a path (possibly NULL) from source to dest. More...
 
void ast_translator_deactivate (struct ast_translator *t)
 Deactivate a translator. More...
 
void ast_translator_free_path (struct ast_trans_pvt *tr)
 Frees a translator path Frees the given translator path structure. More...
 
int ast_unregister_translator (struct ast_translator *t)
 Unregister a translator Unregisters the given tranlator. More...
 

Detailed Description

Support for translation of data formats. translate.c.

Definition in file translate.h.

Macro Definition Documentation

◆ ast_register_translator

#define ast_register_translator (   t)    __ast_register_translator(t, AST_MODULE_SELF)

See __ast_register_translator()

Definition at line 257 of file translate.h.

Referenced by load_module(), and register_translator().

Enumeration Type Documentation

◆ ast_trans_cost_table

Translator Cost Table definition.

Note
The defined values in this table must be used to set the translator's table_cost value.
The cost value of the first two values must always add up to be greater than the largest value defined in this table. This is done to guarantee a direct translation will always have precedence over a multi step translation.

This table is built in a way that allows translation paths to be built that guarantee the best possible balance between performance and quality. With this table direct translation paths between two formats will always take precedence over multi step paths, lossless intermediate steps will always be chosen over lossy intermediate steps, and preservation of sample rate across the translation will always have precedence over a path that involves any re-sampling.

Enumerator
AST_TRANS_COST_LL_LL_ORIGSAMP 

[lossless -> lossless] original sampling

AST_TRANS_COST_LL_LY_ORIGSAMP 

[lossless -> lossy] original sampling

AST_TRANS_COST_LL_LL_UPSAMP 

[lossless -> lossless] up sample

AST_TRANS_COST_LL_LY_UPSAMP 

[lossless -> lossy] up sample

AST_TRANS_COST_LL_LL_DOWNSAMP 

[lossless -> lossless] down sample

AST_TRANS_COST_LL_LY_DOWNSAMP 

[lossless -> lossy] down sample

AST_TRANS_COST_LL_UNKNOWN 

[lossless -> unknown] unknown. This value is for a lossless source translation with an unknown destination and or sample rate conversion.

AST_TRANS_COST_LY_LL_ORIGSAMP 

[lossy -> lossless] original sampling

AST_TRANS_COST_LY_LY_ORIGSAMP 

[lossy -> lossy] original sampling

AST_TRANS_COST_LY_LL_UPSAMP 

[lossy -> lossless] up sample

AST_TRANS_COST_LY_LY_UPSAMP 

[lossy -> lossy] up sample

AST_TRANS_COST_LY_LL_DOWNSAMP 

[lossy -> lossless] down sample

AST_TRANS_COST_LY_LY_DOWNSAMP 

[lossy -> lossy] down sample

AST_TRANS_COST_LY_UNKNOWN 

[lossy -> unknown] unknown. This value is for a lossy source translation with an unknown destination and or sample rate conversion.

Definition at line 61 of file translate.h.

61  {
62 
63  /* Lossless Source Translation Costs */
64 
65  /*! [lossless -> lossless] original sampling */
67  /*! [lossless -> lossy] original sampling */
69 
70  /*! [lossless -> lossless] up sample */
72  /*! [lossless -> lossy] up sample */
74 
75  /*! [lossless -> lossless] down sample */
77  /*! [lossless -> lossy] down sample */
79 
80  /*! [lossless -> unknown] unknown.
81  * This value is for a lossless source translation
82  * with an unknown destination and or sample rate conversion. */
84 
85  /* Lossy Source Translation Costs */
86 
87  /*! [lossy -> lossless] original sampling */
89  /*! [lossy -> lossy] original sampling */
91 
92  /*! [lossy -> lossless] up sample */
94  /*! [lossy -> lossy] up sample */
96 
97  /*! [lossy -> lossless] down sample */
99  /*! [lossy -> lossy] down sample */
101 
102  /*! [lossy -> unknown] unknown.
103  * This value is for a lossy source translation
104  * with an unknown destination and or sample rate conversion. */
105  AST_TRANS_COST_LY_UNKNOWN = 985000,
106 
107 };

Function Documentation

◆ __ast_register_translator()

int __ast_register_translator ( struct ast_translator t,
struct ast_module mod 
)

Register a translator This registers a codec translator with asterisk.

Parameters
tpopulated ast_translator structure
modmodule handle to the module that owns this translator
Returns
0 on success, -1 on failure

Register a translator This registers a codec translator with asterisk.

Definition at line 1220 of file translate.c.

References a, ast_translator::active, add_codec2index(), ao2_cleanup, ast_assert, ast_codec_get(), ast_log, AST_RWLIST_INSERT_BEFORE_CURRENT, AST_RWLIST_INSERT_HEAD, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_verb, b, ast_translator::buf_size, codec2index(), COLOR_BLACK, COLOR_MAGENTA, ast_translator::comp_cost, cur_max_index, default_frameout(), ast_translator::dst_codec, ast_translator::dst_fmt_index, ast_translator::frameout, generate_computational_cost(), generate_table_cost(), LOG_WARNING, matrix_rebuild(), matrix_resize(), ast_translator::module, ast_codec::name, ast_translator::name, NULL, RAII_VAR, ast_codec::sample_rate, ast_translator::src_codec, ast_translator::src_fmt_index, ast_translator::table_cost, term_color(), tmp(), and ast_codec::type.

1221 {
1222  struct ast_translator *u;
1223  char tmp[80];
1226 
1228  if (!src_codec) {
1229  ast_assert(0);
1230  ast_log(LOG_WARNING, "Failed to register translator: unknown source codec %s\n", t->src_codec.name);
1231  return -1;
1232  }
1233 
1235  if (!dst_codec) {
1236  ast_log(LOG_WARNING, "Failed to register translator: unknown destination codec %s\n", t->dst_codec.name);
1237  return -1;
1238  }
1239 
1241  if (matrix_resize(0)) {
1242  ast_log(LOG_WARNING, "Translator matrix can not represent any more translators. Out of resources.\n");
1243  return -1;
1244  }
1247  }
1248 
1249  if (!mod) {
1250  ast_log(LOG_WARNING, "Missing module pointer, you need to supply one\n");
1251  return -1;
1252  }
1253 
1254  if (!t->buf_size) {
1255  ast_log(LOG_WARNING, "empty buf size, you need to supply one\n");
1256  return -1;
1257  }
1259  ast_log(LOG_WARNING, "Table cost could not be generated for %s, "
1260  "Please set table_cost variable on translator.\n", t->name);
1261  return -1;
1262  }
1263 
1264  t->module = mod;
1267  t->active = 1;
1268 
1269  if (t->src_fmt_index < 0 || t->dst_fmt_index < 0) {
1270  ast_log(LOG_WARNING, "Invalid translator path: (%s codec is not valid)\n", t->src_fmt_index < 0 ? "starting" : "ending");
1271  return -1;
1272  }
1273  if (t->src_fmt_index >= cur_max_index) {
1274  ast_log(LOG_WARNING, "Source codec %s is larger than cur_max_index\n", t->src_codec.name);
1275  return -1;
1276  }
1277 
1278  if (t->dst_fmt_index >= cur_max_index) {
1279  ast_log(LOG_WARNING, "Destination codec %s is larger than cur_max_index\n", t->dst_codec.name);
1280  return -1;
1281  }
1282 
1283  if (t->buf_size) {
1284  /*
1285  * Align buf_size properly, rounding up to the machine-specific
1286  * alignment for pointers.
1287  */
1288  struct _test_align { void *a, *b; } p;
1289  int align = (char *)&p.b - (char *)&p.a;
1290 
1291  t->buf_size = ((t->buf_size + align - 1) / align) * align;
1292  }
1293 
1294  if (t->frameout == NULL) {
1296  }
1297 
1299 
1300  ast_verb(2, "Registered translator '%s' from codec %s to %s, table cost, %d, computational cost %d\n",
1301  term_color(tmp, t->name, COLOR_MAGENTA, COLOR_BLACK, sizeof(tmp)),
1302  t->src_codec.name, t->dst_codec.name, t->table_cost, t->comp_cost);
1303 
1305 
1306  /* find any existing translators that provide this same srcfmt/dstfmt,
1307  and put this one in order based on computational cost */
1309  if ((u->src_fmt_index == t->src_fmt_index) &&
1310  (u->dst_fmt_index == t->dst_fmt_index) &&
1311  (u->comp_cost > t->comp_cost)) {
1313  t = NULL;
1314  break;
1315  }
1316  }
1318 
1319  /* if no existing translator was found for this codec combination,
1320  add it to the beginning of the list */
1321  if (t) {
1323  }
1324 
1325  matrix_rebuild(0);
1326 
1328 
1329  return 0;
1330 }
const char * name
Name for this codec.
Definition: codec.h:46
static int matrix_resize(int init)
Definition: translate.c:194
static void matrix_rebuild(int samples)
rebuild a translation matrix.
Definition: translate.c:824
Descriptor of a translator.
Definition: translate.h:137
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define LOG_WARNING
Definition: logger.h:274
static int tmp()
Definition: bt_open.c:389
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
static struct ast_frame * default_frameout(struct ast_trans_pvt *pvt)
Definition: translate.c:468
#define ast_assert(a)
Definition: utils.h:695
static int add_codec2index(struct ast_codec *codec)
Definition: translate.c:147
struct ast_codec * ast_codec_get(const char *name, enum ast_media_type type, unsigned int sample_rate)
Retrieve a codec given a name, type, and sample rate.
Definition: codec.c:326
#define NULL
Definition: resample.c:96
#define ast_verb(level,...)
Definition: logger.h:463
struct ast_module * module
Definition: translate.h:187
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:717
#define ast_log
Definition: astobj2.c:42
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
#define AST_RWLIST_INSERT_BEFORE_CURRENT
Definition: linkedlists.h:609
int buf_size
size of outbuf, in bytes. Mandatory. The wrapper code will also allocate an AST_FRIENDLY_OFFSET space...
Definition: translate.h:182
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:544
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:184
#define COLOR_BLACK
Definition: term.h:47
the list of translators
Definition: codec_dahdi.c:281
struct ast_codec dst_codec
Definition: translate.h:140
static int codec2index(struct ast_codec *codec)
Definition: translate.c:124
struct ast_codec src_codec
Definition: translate.h:139
unsigned int sample_rate
Sample rate (number of samples carried in a second)
Definition: codec.h:52
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
struct ast_frame *(* frameout)(struct ast_trans_pvt *pvt)
Definition: translate.h:158
static void generate_computational_cost(struct ast_translator *t, int seconds)
Definition: translate.c:690
enum ast_media_type type
Type of media this codec contains.
Definition: codec.h:50
static struct test_val b
static int cur_max_index
Definition: translate.c:94
static int generate_table_cost(struct ast_codec *src, struct ast_codec *dst)
Definition: translate.c:768
Represents a media codec within Asterisk.
Definition: codec.h:42
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:616
char name[80]
Definition: translate.h:138
#define COLOR_MAGENTA
Definition: term.h:57
static struct test_val a

◆ ast_trans_frameout()

struct ast_frame* ast_trans_frameout ( struct ast_trans_pvt pvt,
int  datalen,
int  samples 
)

generic frameout function

generic frameout function

Definition at line 438 of file translate.c.

References ast_frisolate, ast_trans_pvt::c, ast_frame::data, ast_frame::datalen, ast_trans_pvt::datalen, ast_trans_pvt::f, NULL, ast_trans_pvt::outbuf, ast_frame::ptr, ast_frame::samples, and ast_trans_pvt::samples.

Referenced by default_frameout(), lintoadpcm_frameout(), lintocodec2_frameout(), lintogsm_frameout(), lintoilbc_frameout(), lintolpc10_frameout(), and lintospeex_frameout().

440 {
441  struct ast_frame *f = &pvt->f;
442 
443  if (samples) {
444  f->samples = samples;
445  } else {
446  if (pvt->samples == 0) {
447  return NULL;
448  }
449  f->samples = pvt->samples;
450  pvt->samples = 0;
451  }
452  if (datalen) {
453  f->datalen = datalen;
454  f->data.ptr = pvt->outbuf.c;
455  } else {
456  f->datalen = pvt->datalen;
457  if (!f->datalen) {
458  f->data.ptr = NULL;
459  } else {
460  f->data.ptr = pvt->outbuf.c;
461  }
462  pvt->datalen = 0;
463  }
464 
465  return ast_frisolate(f);
466 }
int datalen
actual space used in outbuf
Definition: translate.h:218
struct ast_frame f
Definition: translate.h:215
#define NULL
Definition: resample.c:96
union ast_trans_pvt::@327 outbuf
#define ast_frisolate(fr)
Makes a frame independent of any static storage.
Data structure associated with a single frame of data.
union ast_frame::@263 data

◆ ast_translate()

struct ast_frame* ast_translate ( struct ast_trans_pvt path,
struct ast_frame f,
int  consume 
)

translates one or more frames Apply an input frame into the translator and receive zero or one output frames. Consume determines whether the original frame should be freed. In case the frame type is AST_FRAME_RTCP, the frame is not translated but passed to the translator codecs via the feedback callback, and a pointer to ast_null_frame is returned after that.

Parameters
pathtr translator structure to use for translation
fframe to translate
consumeWhether or not to free the original frame
Returns
an ast_frame of the new translation format on success, NULL on failure

translates one or more frames Apply an input frame into the translator and receive zero or one output frames. Consume determines whether the original frame should be freed. In case the frame type is AST_FRAME_RTCP, the frame is not translated but passed to the translator codecs via the feedback callback, and a pointer to ast_null_frame is returned after that.

Definition at line 565 of file translate.c.

References ast_clear_flag, ast_debug, ast_format_get_sample_rate(), AST_FRAME_CNG, AST_FRAME_RTCP, AST_FRFLAG_HAS_TIMING_INFO, ast_frfree, AST_LIST_NEXT, ast_null_frame, ast_samp2tv(), ast_set2_flag, ast_test_flag, ast_tv(), ast_tvadd(), ast_tveq(), ast_tvnow(), ast_tvsub(), ast_tvzero(), ast_frame::delivery, ast_translator::feedback, ast_frame_subclass::format, framein(), ast_frame::frametype, generate_interpolated_slin(), ast_frame::len, len(), ast_trans_pvt::next, ast_trans_pvt::nextin, ast_trans_pvt::nextout, out, ast_frame::samples, ast_frame::seqno, ast_frame::subclass, ast_trans_pvt::t, and ast_frame::ts.

Referenced by __ast_read(), ast_slinfactory_feed(), ast_write_stream(), ast_writestream(), audiohook_list_translate_to_native(), audiohook_list_translate_to_slin(), audiohook_read_frame_helper(), conf_run(), fax_gateway_framehook(), and softmix_process_write_audio().

566 {
567  struct ast_trans_pvt *p = path;
568  struct ast_frame *out;
569  struct timeval delivery;
570  int has_timing_info;
571  long ts;
572  long len;
573  int seqno;
574 
575  if (f->frametype == AST_FRAME_RTCP) {
576  /* Just pass the feedback to the right callback, if it exists.
577  * This "translation" does nothing so return a null frame. */
578  struct ast_trans_pvt *tp;
579  for (tp = p; tp; tp = tp->next) {
580  if (tp->t->feedback)
581  tp->t->feedback(tp, f);
582  }
583  return &ast_null_frame;
584  }
585 
586  has_timing_info = ast_test_flag(f, AST_FRFLAG_HAS_TIMING_INFO);
587  ts = f->ts;
588  len = f->len;
589  seqno = f->seqno;
590 
591  if (!ast_tvzero(f->delivery)) {
592  if (!ast_tvzero(path->nextin)) {
593  /* Make sure this is in line with what we were expecting */
594  if (!ast_tveq(path->nextin, f->delivery)) {
595  /* The time has changed between what we expected and this
596  most recent time on the new packet. If we have a
597  valid prediction adjust our output time appropriately */
598  if (!ast_tvzero(path->nextout)) {
599  path->nextout = ast_tvadd(path->nextout,
600  ast_tvsub(f->delivery, path->nextin));
601  }
602  path->nextin = f->delivery;
603  }
604  } else {
605  /* This is our first pass. Make sure the timing looks good */
606  path->nextin = f->delivery;
607  path->nextout = f->delivery;
608  }
609  /* Predict next incoming sample */
610  path->nextin = ast_tvadd(path->nextin, ast_samp2tv(
612  }
613  delivery = f->delivery;
614  for (out = f; out && p ; p = p->next) {
615  struct ast_frame *current = out;
616 
617  do {
618  framein(p, current);
619  current = AST_LIST_NEXT(current, frame_list);
620  } while (current);
621  if (out != f) {
622  ast_frfree(out);
623  }
624  out = p->t->frameout(p);
625  }
626 
627  if (!out) {
628  out = generate_interpolated_slin(path, f);
629  }
630 
631  if (out) {
632  /* we have a frame, play with times */
633  if (!ast_tvzero(delivery)) {
634  struct ast_frame *current = out;
635 
636  do {
637  /* Regenerate prediction after a discontinuity */
638  if (ast_tvzero(path->nextout)) {
639  path->nextout = ast_tvnow();
640  }
641 
642  /* Use next predicted outgoing timestamp */
643  current->delivery = path->nextout;
644 
645  /* Invalidate prediction if we're entering a silence period */
646  if (current->frametype == AST_FRAME_CNG) {
647  path->nextout = ast_tv(0, 0);
648  /* Predict next outgoing timestamp from samples in this
649  frame. */
650  } else {
651  path->nextout = ast_tvadd(path->nextout, ast_samp2tv(
652  current->samples, ast_format_get_sample_rate(current->subclass.format)));
653  }
654 
655  if (f->samples != current->samples && ast_test_flag(current, AST_FRFLAG_HAS_TIMING_INFO)) {
656  ast_debug(4, "Sample size different %d vs %d\n", f->samples, current->samples);
658  }
659  current = AST_LIST_NEXT(current, frame_list);
660  } while (current);
661  } else {
662  out->delivery = ast_tv(0, 0);
663  ast_set2_flag(out, has_timing_info, AST_FRFLAG_HAS_TIMING_INFO);
664  if (has_timing_info) {
665  out->ts = ts;
666  out->len = len;
667  out->seqno = seqno;
668  }
669  /* Invalidate prediction if we're entering a silence period */
670  if (out->frametype == AST_FRAME_CNG) {
671  path->nextout = ast_tv(0, 0);
672  }
673  }
674  }
675  if (consume) {
676  ast_frfree(f);
677  }
678  return out;
679 }
#define ast_set2_flag(p, value, flag)
Definition: utils.h:94
#define ast_test_flag(p, flag)
Definition: utils.h:63
int ast_tveq(struct timeval _a, struct timeval _b)
Returns true if the two struct timeval arguments are equal.
Definition: time.h:138
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:108
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: linkedlists.h:438
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
struct ast_trans_pvt * next
Definition: translate.h:227
struct timeval nextin
Definition: translate.h:228
struct ast_frame_subclass subclass
static int framein(struct ast_trans_pvt *pvt, struct ast_frame *f)
framein wrapper, deals with bound checks.
Definition: translate.c:396
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
struct timeval ast_samp2tv(unsigned int _nsamp, unsigned int _rate)
Returns a timeval corresponding to the duration of n samples at rate r. Useful to convert samples to ...
Definition: time.h:238
void(* feedback)(struct ast_trans_pvt *pvt, struct ast_frame *feedback)
Definition: translate.h:162
Default structure for translators, with the basic fields and buffers, all allocated as part of the sa...
Definition: translate.h:213
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
struct timeval nextout
Definition: translate.h:229
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
Definition: extconf.c:2283
#define ast_clear_flag(p, flag)
Definition: utils.h:77
struct timeval delivery
struct ast_frame ast_null_frame
Definition: main/frame.c:79
FILE * out
Definition: utils/frame.c:33
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
Definition: time.h:226
#define ast_frfree(fr)
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
Data structure associated with a single frame of data.
struct ast_translator * t
Definition: translate.h:214
struct timeval ast_tvsub(struct timeval a, struct timeval b)
Returns the difference of two timevals a - b.
Definition: extconf.c:2298
enum ast_frame_type frametype
struct ast_format * format
static struct ast_frame * generate_interpolated_slin(struct ast_trans_pvt *p, struct ast_frame *f)
Definition: translate.c:536

◆ ast_translate_available_formats()

void ast_translate_available_formats ( struct ast_format_cap dest,
struct ast_format_cap src,
struct ast_format_cap result 
)

Find available formats.

Parameters
destpossible destination formats
srcsource formats
resultcapabilities structure to store available formats in
Returns
the destination formats that are available in the source or translatable

The result will include all formats from 'dest' that are either present in 'src' or translatable from a format present in 'src'.

Note
Only a single audio format and a single video format can be present in 'src', or the function will produce unexpected results.

Definition at line 1571 of file translate.c.

References ao2_ref, ast_format_cap_append, ast_format_cap_count(), ast_format_cap_get_compatible_format(), ast_format_cap_get_format(), AST_MEDIA_TYPE_AUDIO, AST_MEDIA_TYPE_VIDEO, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, and check_translation_path().

Referenced by ast_rtp_instance_available_formats().

1572 {
1573  struct ast_format *cur_dest, *cur_src;
1574  int index;
1575 
1576  for (index = 0; index < ast_format_cap_count(dest); ++index) {
1577  if (!(cur_dest = ast_format_cap_get_format(dest, index))) {
1578  continue;
1579  }
1580 
1581  /* We give preference to a joint format structure if possible */
1582  if ((cur_src = ast_format_cap_get_compatible_format(src, cur_dest))) {
1583  ast_format_cap_append(result, cur_src, 0);
1584  ao2_ref(cur_src, -1);
1585  } else {
1586  /* Otherwise we just use the destination format */
1587  ast_format_cap_append(result, cur_dest, 0);
1588  }
1589  ao2_ref(cur_dest, -1);
1590  }
1591 
1592  /* if we don't have a source format, we just have to try all
1593  possible destination formats */
1594  if (!src) {
1595  return;
1596  }
1597 
1598  for (index = 0; index < ast_format_cap_count(src); ++index) {
1599  if (!(cur_src = ast_format_cap_get_format(src, index))) {
1600  continue;
1601  }
1602 
1604  check_translation_path(dest, src, result,
1605  cur_src, AST_MEDIA_TYPE_AUDIO);
1606  check_translation_path(dest, src, result,
1607  cur_src, AST_MEDIA_TYPE_VIDEO);
1609  ao2_ref(cur_src, -1);
1610  }
1611 }
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Definition of a media format.
Definition: format.c:43
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_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define ao2_ref(o, delta)
Definition: astobj2.h:464
struct ast_format * ast_format_cap_get_compatible_format(const struct ast_format_cap *cap, const struct ast_format *format)
Find if input ast_format is within the capabilities of the ast_format_cap object then return the comp...
Definition: format_cap.c:548
static void check_translation_path(struct ast_format_cap *dest, struct ast_format_cap *src, struct ast_format_cap *result, struct ast_format *src_fmt, enum ast_media_type type)
Definition: translate.c:1513
#define ast_format_cap_append(cap, format, framing)
Definition: format_cap.h:103
the list of translators
Definition: codec_dahdi.c:281
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

◆ ast_translate_init()

int ast_translate_init ( void  )

Initialize the translation matrix and index to format conversion table.

Return values
0on success
-1on failure

Definition at line 1630 of file translate.c.

References ARRAY_LEN, ast_cli_register_multiple, ast_register_cleanup(), ast_rwlock_init, matrix_resize(), and translate_shutdown().

Referenced by asterisk_daemon().

1631 {
1632  int res = 0;
1634  res = matrix_resize(1);
1637  return res;
1638 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static int matrix_resize(int init)
Definition: translate.c:194
static struct ast_cli_entry cli_translate[]
Definition: translate.c:1215
static ast_rwlock_t tablelock
Definition: translate.c:86
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
#define ast_rwlock_init(rwlock)
wrapper for rwlock with tracking enabled
Definition: lock.h:222
static void translate_shutdown(void)
Definition: translate.c:1613

◆ ast_translate_path_steps()

unsigned int ast_translate_path_steps ( struct ast_format dest,
struct ast_format src 
)

Returns the number of steps required to convert from 'src' to 'dest'.

Parameters
destdestination format
srcsource format
Returns
the number of translation steps required, or -1 if no path is available

Definition at line 1491 of file translate.c.

References ast_log, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, format2index(), LOG_WARNING, matrix_get(), translator_path::multistep, and translator_path::step.

Referenced by ast_channel_make_compatible_helper().

1492 {
1493  unsigned int res = -1;
1494  /* convert bitwise format numbers into array indices */
1495  int src = format2index(src_format);
1496  int dest = format2index(dst_format);
1497 
1498  if (src < 0 || dest < 0) {
1499  ast_log(LOG_WARNING, "No translator path: (%s codec is not valid)\n", src < 0 ? "starting" : "ending");
1500  return -1;
1501  }
1503 
1504  if (matrix_get(src, dest)->step) {
1505  res = matrix_get(src, dest)->multistep + 1;
1506  }
1507 
1509 
1510  return res;
1511 }
#define LOG_WARNING
Definition: logger.h:274
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
static int format2index(struct ast_format *format)
Definition: translate.c:133
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define ast_log
Definition: astobj2.c:42
static struct translator_path * matrix_get(unsigned int x, unsigned int y)
Definition: translate.c:282
the list of translators
Definition: codec_dahdi.c:281
uint8_t multistep
Definition: translate.c:62

◆ ast_translate_path_to_str()

const char* ast_translate_path_to_str ( struct ast_trans_pvt t,
struct ast_str **  str 
)

Puts a string representation of the translation path into outbuf.

Parameters
ttranslator structure containing the translation path
strast_str output buffer
Return values
onsuccess pointer to beginning of outbuf. on failure "".

Definition at line 928 of file translate.c.

References ast_str_append(), ast_str_buffer(), ast_str_reset(), codec_append_name(), ast_translator::dst_codec, ast_trans_pvt::next, ast_translator::src_codec, and ast_trans_pvt::t.

Referenced by chan_pjsip_write_stream(), generate_status(), handle_showchan(), and serialize_showchan().

929 {
930  if (!p || !p->t) {
931  return "";
932  }
933 
934  ast_str_reset(*str);
935  codec_append_name(&p->t->src_codec, str);
936  while (p) {
937  ast_str_append(str, 0, "->");
938  codec_append_name(&p->t->dst_codec, str);
939  p = p->next;
940  }
941 
942  return ast_str_buffer(*str);
943 }
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
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:1091
static void codec_append_name(const struct ast_codec *codec, struct ast_str **buf)
Definition: translate.c:919
void ast_str_reset(struct ast_str *buf)
Reset the content of a dynamic string. Useful before a series of ast_str_append.
Definition: strings.h:653

◆ ast_translator_activate()

void ast_translator_activate ( struct ast_translator t)

Activate a previously deactivated translator.

Parameters
ttranslator to activate
Returns
nothing

Enables the specified translator for use.

Definition at line 1361 of file translate.c.

References ast_translator::active, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, and matrix_rebuild().

1362 {
1364  t->active = 1;
1365  matrix_rebuild(0);
1367 }
static void matrix_rebuild(int samples)
rebuild a translation matrix.
Definition: translate.c:824
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
the list of translators
Definition: codec_dahdi.c:281

◆ ast_translator_best_choice()

int ast_translator_best_choice ( struct ast_format_cap dst_cap,
struct ast_format_cap src_cap,
struct ast_format **  dst_fmt_out,
struct ast_format **  src_fmt_out 
)

Chooses the best translation path.

Given a list of sources, and a designed destination format, which should I choose?

Parameters
dst_capdestination capabilities
src_capsource capabilities
dst_fmt_outdestination format chosen out of destination capabilities
src_fmt_outsource format chosen out of source capabilities
Returns
Returns 0 on success, -1 if no path could be found.
Note
dst_cap and src_cap are not mondified.

Chooses the best translation path.

Definition at line 1385 of file translate.c.

References ao2_cleanup, ao2_ref, ao2_replace, ast_format_cap_alloc, ast_format_cap_count(), ast_format_cap_empty(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_cap_get_compatible(), ast_format_cap_get_format(), ast_format_get_sample_rate(), ast_format_get_type(), ast_log, AST_MEDIA_TYPE_AUDIO, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, format2index(), format_sample_rate_absdiff, LOG_ERROR, matrix_get(), translator_path::multistep, NULL, RAII_VAR, translator_path::step, and translator_path::table_cost.

Referenced by ast_channel_make_compatible_helper(), iax2_request(), local_request_with_stream_topology(), request_channel(), and set_format().

1389 {
1390  unsigned int besttablecost = INT_MAX;
1391  unsigned int beststeps = INT_MAX;
1392  struct ast_format *fmt;
1393  struct ast_format *dst;
1394  struct ast_format *src;
1395  RAII_VAR(struct ast_format *, best, NULL, ao2_cleanup);
1396  RAII_VAR(struct ast_format *, bestdst, NULL, ao2_cleanup);
1397  struct ast_format_cap *joint_cap;
1398  int i;
1399  int j;
1400 
1401  if (ast_format_cap_empty(dst_cap) || ast_format_cap_empty(src_cap)) {
1402  ast_log(LOG_ERROR, "Cannot determine best translation path since one capability supports no formats\n");
1403  return -1;
1404  }
1405 
1407  if (!joint_cap) {
1408  return -1;
1409  }
1410  ast_format_cap_get_compatible(dst_cap, src_cap, joint_cap);
1411 
1412  for (i = 0; i < ast_format_cap_count(joint_cap); ++i, ao2_cleanup(fmt)) {
1413  fmt = ast_format_cap_get_format(joint_cap, i);
1414  if (!fmt
1416  continue;
1417  }
1418 
1419  if (!best
1421  ao2_replace(best, fmt);
1422  }
1423  }
1424  ao2_ref(joint_cap, -1);
1425 
1426  if (best) {
1427  ao2_replace(*dst_fmt_out, best);
1428  ao2_replace(*src_fmt_out, best);
1429  return 0;
1430  }
1431 
1432  /* need to translate */
1434  for (i = 0; i < ast_format_cap_count(dst_cap); ++i, ao2_cleanup(dst)) {
1435  dst = ast_format_cap_get_format(dst_cap, i);
1436  if (!dst
1438  continue;
1439  }
1440 
1441  for (j = 0; j < ast_format_cap_count(src_cap); ++j, ao2_cleanup(src)) {
1442  int x;
1443  int y;
1444 
1445  src = ast_format_cap_get_format(src_cap, j);
1446  if (!src
1448  continue;
1449  }
1450 
1451  x = format2index(src);
1452  y = format2index(dst);
1453  if (x < 0 || y < 0) {
1454  continue;
1455  }
1456  if (!matrix_get(x, y) || !(matrix_get(x, y)->step)) {
1457  continue;
1458  }
1459  if (matrix_get(x, y)->table_cost < besttablecost
1460  || matrix_get(x, y)->multistep < beststeps) {
1461  /* better than what we have so far */
1462  ao2_replace(best, src);
1463  ao2_replace(bestdst, dst);
1464  besttablecost = matrix_get(x, y)->table_cost;
1465  beststeps = matrix_get(x, y)->multistep;
1466  } else if (matrix_get(x, y)->table_cost == besttablecost
1467  && matrix_get(x, y)->multistep == beststeps) {
1468  unsigned int gap_selected = format_sample_rate_absdiff(best, bestdst);
1469  unsigned int gap_current = format_sample_rate_absdiff(src, dst);
1470 
1471  if (gap_current < gap_selected) {
1472  /* better than what we have so far */
1473  ao2_replace(best, src);
1474  ao2_replace(bestdst, dst);
1475  besttablecost = matrix_get(x, y)->table_cost;
1476  beststeps = matrix_get(x, y)->multistep;
1477  }
1478  }
1479  }
1480  }
1482 
1483  if (!best) {
1484  return -1;
1485  }
1486  ao2_replace(*dst_fmt_out, bestdst);
1487  ao2_replace(*src_fmt_out, best);
1488  return 0;
1489 }
enum ast_media_type ast_format_get_type(const struct ast_format *format)
Get the media type of a format.
Definition: format.c:354
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Definition of a media format.
Definition: format.c:43
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 NULL
Definition: resample.c:96
static int format2index(struct ast_format *format)
Definition: translate.c:133
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define ast_log
Definition: astobj2.c:42
#define format_sample_rate_absdiff(fmt1, fmt2)
Definition: translate.c:1378
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
#define ao2_ref(o, delta)
Definition: astobj2.h:464
static struct translator_path * matrix_get(unsigned int x, unsigned int y)
Definition: translate.c:282
#define ast_format_cap_alloc(flags)
Definition: format_cap.h:52
the list of translators
Definition: codec_dahdi.c:281
#define LOG_ERROR
Definition: logger.h:285
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
uint32_t table_cost
Definition: translate.c:61
uint8_t multistep
Definition: translate.c:62
#define ao2_replace(dst, src)
Definition: astobj2.h:517
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
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:746
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
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:630

◆ ast_translator_build_path()

struct ast_trans_pvt* ast_translator_build_path ( struct ast_format dst,
struct ast_format src 
)

Builds a translator path Build a path (possibly NULL) from source to dest.

Parameters
dstdest destination format
srcsource source format
Returns
ast_trans_pvt on success, NULL on failure

Builds a translator path Build a path (possibly NULL) from source to dest.

Definition at line 485 of file translate.c.

References ast_format_get_name(), ast_format_get_sample_rate(), ast_format_get_type(), ast_log, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_translator_free_path(), ast_tv(), ast_translator::dst_codec, ast_translator::dst_fmt_index, format2index(), LOG_WARNING, matrix_get(), newpvt(), ast_trans_pvt::next, ast_trans_pvt::nextin, ast_trans_pvt::nextout, NULL, ast_codec::sample_rate, translator_path::step, ast_trans_pvt::t, and ast_codec::type.

Referenced by ast_set_read_format_path(), ast_set_write_format_path(), ast_slinfactory_feed(), ast_writestream(), audiohook_list_translate_to_native(), audiohook_list_translate_to_slin(), audiohook_read_frame_helper(), conf_run(), set_format(), softmix_process_write_audio(), and softmix_translate_helper_change_rate().

486 {
487  struct ast_trans_pvt *head = NULL, *tail = NULL;
488  int src_index, dst_index;
489 
490  src_index = format2index(src);
491  dst_index = format2index(dst);
492 
493  if (src_index < 0 || dst_index < 0) {
494  ast_log(LOG_WARNING, "No translator path: (%s codec is not valid)\n", src_index < 0 ? "starting" : "ending");
495  return NULL;
496  }
497 
499 
500  while (src_index != dst_index) {
501  struct ast_trans_pvt *cur;
502  struct ast_format *explicit_dst = NULL;
503  struct ast_translator *t = matrix_get(src_index, dst_index)->step;
504  if (!t) {
505  ast_log(LOG_WARNING, "No translator path from %s to %s\n",
509  return NULL;
510  }
512  explicit_dst = dst;
513  }
514  if (!(cur = newpvt(t, explicit_dst))) {
515  ast_log(LOG_WARNING, "Failed to build translator step from %s to %s\n",
519  return NULL;
520  }
521  if (!head) {
522  head = cur;
523  } else {
524  tail->next = cur;
525  }
526  tail = cur;
527  cur->nextin = cur->nextout = ast_tv(0, 0);
528  /* Keep going if this isn't the final destination */
529  src_index = cur->t->dst_fmt_index;
530  }
531 
533  return head;
534 }
enum ast_media_type ast_format_get_type(const struct ast_format *format)
Get the media type of a format.
Definition: format.c:354
Descriptor of a translator.
Definition: translate.h:137
#define LOG_WARNING
Definition: logger.h:274
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Definition of a media format.
Definition: format.c:43
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition: format.c:334
struct ast_trans_pvt * next
Definition: translate.h:227
#define NULL
Definition: resample.c:96
struct ast_translator * step
Definition: translate.c:60
struct timeval nextin
Definition: translate.h:228
static int format2index(struct ast_format *format)
Definition: translate.c:133
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define ast_log
Definition: astobj2.c:42
void ast_translator_free_path(struct ast_trans_pvt *p)
Frees a translator path Frees the given translator path structure.
Definition: translate.c:475
static struct translator_path * matrix_get(unsigned int x, unsigned int y)
Definition: translate.c:282
static struct ast_trans_pvt * newpvt(struct ast_translator *t, struct ast_format *explicit_dst)
Allocate the descriptor, required outbuf space, and possibly desc.
Definition: translate.c:311
the list of translators
Definition: codec_dahdi.c:281
struct ast_codec dst_codec
Definition: translate.h:140
Default structure for translators, with the basic fields and buffers, all allocated as part of the sa...
Definition: translate.h:213
struct timeval nextout
Definition: translate.h:229
unsigned int sample_rate
Sample rate (number of samples carried in a second)
Definition: codec.h:52
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
Definition: time.h:226
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
enum ast_media_type type
Type of media this codec contains.
Definition: codec.h:50
struct ast_translator * t
Definition: translate.h:214

◆ ast_translator_deactivate()

void ast_translator_deactivate ( struct ast_translator t)

Deactivate a translator.

Parameters
ttranslator to deactivate
Returns
nothing

Disables the specified translator from being used.

Definition at line 1369 of file translate.c.

References ast_translator::active, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, and matrix_rebuild().

1370 {
1372  t->active = 0;
1373  matrix_rebuild(0);
1375 }
static void matrix_rebuild(int samples)
rebuild a translation matrix.
Definition: translate.c:824
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
the list of translators
Definition: codec_dahdi.c:281

◆ ast_translator_free_path()

void ast_translator_free_path ( struct ast_trans_pvt tr)

Frees a translator path Frees the given translator path structure.

Parameters
trtranslator path to get rid of

Definition at line 475 of file translate.c.

References destroy(), and ast_trans_pvt::next.

Referenced by ast_audiohook_destroy(), ast_audiohook_detach_list(), ast_channel_destructor(), ast_set_read_format_path(), ast_set_write_format_path(), ast_slinfactory_destroy(), ast_slinfactory_feed(), ast_slinfactory_flush(), ast_translator_build_path(), ast_writestream(), audiohook_list_translate_to_native(), audiohook_list_translate_to_slin(), audiohook_read_frame_helper(), conf_free(), filestream_destructor(), free_translation(), set_format(), softmix_translate_helper_change_rate(), softmix_translate_helper_cleanup(), and softmix_translate_helper_free_entry().

476 {
477  struct ast_trans_pvt *pn = p;
478  while ( (p = pn) ) {
479  pn = p->next;
480  destroy(p);
481  }
482 }
struct ast_trans_pvt * next
Definition: translate.h:227
Default structure for translators, with the basic fields and buffers, all allocated as part of the sa...
Definition: translate.h:213
static void destroy(struct ast_trans_pvt *pvt)
Definition: translate.c:291

◆ ast_unregister_translator()

int ast_unregister_translator ( struct ast_translator t)

Unregister a translator Unregisters the given tranlator.

Parameters
ttranslator to unregister
Returns
0 on success, -1 on failure

Unregister a translator Unregisters the given tranlator.

Definition at line 1333 of file translate.c.

References AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_shutting_down(), ast_verb, COLOR_BLACK, COLOR_MAGENTA, ast_translator::dst_codec, ast_translator::list, matrix_rebuild(), ast_codec::name, ast_translator::name, ast_translator::src_codec, term_color(), and tmp().

Referenced by unload_module(), and unregister_translators().

1334 {
1335  char tmp[80];
1336  struct ast_translator *u;
1337  int found = 0;
1338 
1341  if (u == t) {
1343  ast_verb(2, "Unregistered translator '%s' from codec %s to %s\n",
1344  term_color(tmp, t->name, COLOR_MAGENTA, COLOR_BLACK, sizeof(tmp)),
1345  t->src_codec.name, t->dst_codec.name);
1346  found = 1;
1347  break;
1348  }
1349  }
1351 
1352  if (found && !ast_shutting_down()) {
1353  matrix_rebuild(0);
1354  }
1355 
1357 
1358  return (u ? 0 : -1);
1359 }
const char * name
Name for this codec.
Definition: codec.h:46
int ast_shutting_down(void)
Definition: asterisk.c:1834
static void matrix_rebuild(int samples)
rebuild a translation matrix.
Definition: translate.c:824
Descriptor of a translator.
Definition: translate.h:137
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
static int tmp()
Definition: bt_open.c:389
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define ast_verb(level,...)
Definition: logger.h:463
#define AST_RWLIST_REMOVE_CURRENT
Definition: linkedlists.h:569
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:544
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:184
#define COLOR_BLACK
Definition: term.h:47
the list of translators
Definition: codec_dahdi.c:281
struct ast_codec dst_codec
Definition: translate.h:140
struct ast_translator::@326 list
struct ast_codec src_codec
Definition: translate.h:139
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:616
char name[80]
Definition: translate.h:138
#define COLOR_MAGENTA
Definition: term.h:57