Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals

frame.h File Reference

#include <sys/types.h>
#include <sys/time.h>

Go to the source code of this file.

Data Structures

struct  ast_frame
 Data structure associated with a single frame of data. More...
struct  ast_frame_chain
struct  ast_option_header

Defines

#define AST_FRIENDLY_OFFSET   64
#define AST_MIN_OFFSET   32
#define AST_MALLOCD_HDR   (1 << 0)
#define AST_MALLOCD_DATA   (1 << 1)
#define AST_MALLOCD_SRC   (1 << 2)
#define AST_FRAME_DTMF   1
#define AST_FRAME_VOICE   2
#define AST_FRAME_VIDEO   3
#define AST_FRAME_CONTROL   4
#define AST_FRAME_NULL   5
#define AST_FRAME_IAX   6
#define AST_FRAME_TEXT   7
#define AST_FRAME_IMAGE   8
#define AST_FRAME_HTML   9
#define AST_HTML_URL   1
#define AST_HTML_DATA   2
#define AST_HTML_BEGIN   4
#define AST_HTML_END   8
#define AST_HTML_LDCOMPLETE   16
#define AST_HTML_NOSUPPORT   17
#define AST_HTML_LINKURL   18
#define AST_HTML_UNLINK   19
#define AST_HTML_LINKREJECT   20
#define AST_FORMAT_G723_1   (1 << 0)
#define AST_FORMAT_GSM   (1 << 1)
#define AST_FORMAT_ULAW   (1 << 2)
#define AST_FORMAT_ALAW   (1 << 3)
#define AST_FORMAT_G726   (1 << 4)
#define AST_FORMAT_ADPCM   (1 << 5)
#define AST_FORMAT_SLINEAR   (1 << 6)
#define AST_FORMAT_LPC10   (1 << 7)
#define AST_FORMAT_G729A   (1 << 8)
#define AST_FORMAT_SPEEX   (1 << 9)
#define AST_FORMAT_ILBC   (1 << 10)
#define AST_FORMAT_MAX_AUDIO   (1 << 15)
#define AST_FORMAT_JPEG   (1 << 16)
#define AST_FORMAT_PNG   (1 << 17)
#define AST_FORMAT_H261   (1 << 18)
#define AST_FORMAT_H263   (1 << 19)
#define AST_FORMAT_MAX_VIDEO   (1 << 24)
#define AST_CONTROL_HANGUP   1
#define AST_CONTROL_RING   2
#define AST_CONTROL_RINGING   3
#define AST_CONTROL_ANSWER   4
#define AST_CONTROL_BUSY   5
#define AST_CONTROL_TAKEOFFHOOK   6
#define AST_CONTROL_OFFHOOK   7
#define AST_CONTROL_CONGESTION   8
#define AST_CONTROL_FLASH   9
#define AST_CONTROL_WINK   10
#define AST_CONTROL_OPTION   11
#define AST_CONTROL_RADIO_KEY   12
#define AST_CONTROL_RADIO_UNKEY   13
#define AST_CONTROL_PROGRESS   14
#define AST_CONTROL_PROCEEDING   15
#define AST_SMOOTHER_FLAG_G729   (1 << 0)
#define AST_OPTION_FLAG_REQUEST   0
#define AST_OPTION_FLAG_ACCEPT   1
#define AST_OPTION_FLAG_REJECT   2
#define AST_OPTION_FLAG_QUERY   4
#define AST_OPTION_FLAG_ANSWER   5
#define AST_OPTION_FLAG_WTF   6
#define AST_OPTION_TONE_VERIFY   1
#define AST_OPTION_TDD   2
#define AST_OPTION_RELAXDTMF   3
#define AST_OPTION_AUDIO_MODE   4

Functions

void ast_frfree (struct ast_frame *fr)
 Frees a frame.
ast_frameast_frisolate (struct ast_frame *fr)
 Copies a frame.
ast_frameast_frdup (struct ast_frame *fr)
 Copies a frame.
ast_frameast_fr_fdread (int fd)
 Reads a frame from an fd.
int ast_fr_fdwrite (int fd, struct ast_frame *frame)
 Writes a frame to an fd.
int ast_fr_fdhangup (int fd)
 Sends a hangup to an fd.
char * ast_getformatname (int format)
 Get the name of a format.
char * ast_getformatname_multiple (char *buf, unsigned n, int format)
 Get the names of a set of formats.
int ast_getformatbyname (char *name)
char * ast_codec2str (int codec)
 Get a name from a format.
int ast_best_codec (int fmts)
 Pick the best codec.
ast_smootherast_smoother_new (int bytes)
void ast_smoother_set_flags (struct ast_smoother *smoother, int flags)
int ast_smoother_get_flags (struct ast_smoother *smoother)
void ast_smoother_free (struct ast_smoother *s)
void ast_smoother_reset (struct ast_smoother *s, int bytes)
int ast_smoother_feed (struct ast_smoother *s, struct ast_frame *f)
ast_frameast_smoother_read (struct ast_smoother *s)
void ast_frame_dump (char *name, struct ast_frame *f, char *prefix)


Define Documentation

#define AST_CONTROL_ANSWER   4
 

Remote end has answered Definition at line 194 of file frame.h.

Referenced by __ast_request_and_dial(), ast_dsp_process(), ast_frame_dump(), ast_read(), ast_waitfordigit_full(), ast_waitstream(), ast_waitstream_fr(), and ast_waitstream_full().

#define AST_CONTROL_BUSY   5
 

Remote end is busy Definition at line 196 of file frame.h.

Referenced by __ast_request_and_dial(), ast_dsp_process(), ast_frame_dump(), and ast_indicate().

#define AST_CONTROL_CONGESTION   8
 

Congestion (circuits busy) Definition at line 202 of file frame.h.

Referenced by __ast_request_and_dial(), ast_dsp_process(), ast_frame_dump(), and ast_indicate().

#define AST_CONTROL_FLASH   9
 

Flash hook Definition at line 204 of file frame.h.

Referenced by ast_frame_dump().

#define AST_CONTROL_HANGUP   1
 

Other end has hungup Definition at line 188 of file frame.h.

Referenced by __ast_request_and_dial(), ast_fr_fdhangup(), ast_fr_fdread(), ast_frame_dump(), ast_queue_hangup(), ast_read(), ast_recvchar(), ast_waitfordigit_full(), ast_waitstream(), ast_waitstream_fr(), and ast_waitstream_full().

#define AST_CONTROL_OFFHOOK   7
 

Line is off hook Definition at line 200 of file frame.h.

Referenced by ast_frame_dump().

#define AST_CONTROL_OPTION   11
 

Set a low-level option Definition at line 208 of file frame.h.

Referenced by ast_frame_dump().

#define AST_CONTROL_PROCEEDING   15
 

Indicate CALL PROCEEDING Definition at line 216 of file frame.h.

Referenced by ast_indicate().

#define AST_CONTROL_PROGRESS   14
 

Indicate PROGRESS Definition at line 214 of file frame.h.

Referenced by __ast_request_and_dial(), and ast_indicate().

#define AST_CONTROL_RADIO_KEY   12
 

Key Radio Definition at line 210 of file frame.h.

Referenced by ast_frame_dump().

#define AST_CONTROL_RADIO_UNKEY   13
 

Un-Key Radio Definition at line 212 of file frame.h.

Referenced by ast_frame_dump().

#define AST_CONTROL_RING   2
 

Local ring Definition at line 190 of file frame.h.

Referenced by ast_frame_dump().

#define AST_CONTROL_RINGING   3
 

Remote end is ringing Definition at line 192 of file frame.h.

Referenced by __ast_request_and_dial(), ast_dsp_process(), ast_frame_dump(), ast_indicate(), ast_waitfordigit_full(), ast_waitstream(), ast_waitstream_fr(), and ast_waitstream_full().

#define AST_CONTROL_TAKEOFFHOOK   6
 

Make it go off hook Definition at line 198 of file frame.h.

Referenced by ast_frame_dump().

#define AST_CONTROL_WINK   10
 

Wink Definition at line 206 of file frame.h.

Referenced by ast_frame_dump().

#define AST_FORMAT_ADPCM   (1 << 5)
 

ADPCM (IMA) Definition at line 162 of file frame.h.

Referenced by ast_best_codec(), ast_getformatbyname(), ast_getformatname(), ast_rtp_read(), and ast_rtp_write().

#define AST_FORMAT_ALAW   (1 << 3)
 

Raw A-law data (G.711) Definition at line 158 of file frame.h.

Referenced by ast_best_codec(), ast_dsp_process(), ast_getformatbyname(), ast_getformatname(), ast_rtp_read(), and ast_rtp_write().

#define AST_FORMAT_G723_1   (1 << 0)
 

G.723.1 compression Definition at line 152 of file frame.h.

Referenced by ast_best_codec(), ast_getformatbyname(), ast_getformatname(), ast_rtp_read(), and ast_rtp_write().

#define AST_FORMAT_G726   (1 << 4)
 

ADPCM (G.726, 32kbps) Definition at line 160 of file frame.h.

Referenced by ast_best_codec(), ast_getformatbyname(), ast_getformatname(), ast_rtp_read(), and ast_rtp_write().

#define AST_FORMAT_G729A   (1 << 8)
 

G.729A audio Definition at line 168 of file frame.h.

Referenced by ast_best_codec(), ast_getformatbyname(), ast_getformatname(), ast_rtp_read(), and ast_rtp_write().

#define AST_FORMAT_GSM   (1 << 1)
 

GSM compression Definition at line 154 of file frame.h.

Referenced by ast_best_codec(), ast_getformatbyname(), ast_getformatname(), ast_rtp_read(), and ast_rtp_write().

#define AST_FORMAT_H261   (1 << 18)
 

H.261 Video Definition at line 180 of file frame.h.

Referenced by ast_getformatbyname(), ast_getformatname(), and ast_rtp_write().

#define AST_FORMAT_H263   (1 << 19)
 

H.263 Video Definition at line 182 of file frame.h.

Referenced by ast_getformatbyname(), ast_getformatname(), and ast_rtp_write().

#define AST_FORMAT_ILBC   (1 << 10)
 

iLBC Free Compression Definition at line 172 of file frame.h.

Referenced by ast_best_codec(), ast_getformatbyname(), ast_getformatname(), ast_rtp_read(), and ast_rtp_write().

#define AST_FORMAT_JPEG   (1 << 16)
 

JPEG Images Definition at line 176 of file frame.h.

Referenced by ast_getformatname().

#define AST_FORMAT_LPC10   (1 << 7)
 

LPC10, 180 samples/frame Definition at line 166 of file frame.h.

Referenced by ast_best_codec(), ast_getformatbyname(), and ast_getformatname().

#define AST_FORMAT_MAX_AUDIO   (1 << 15)
 

Maximum audio format Definition at line 174 of file frame.h.

Referenced by ast_closestream(), ast_playstream(), ast_rtp_read(), and ast_writestream().

#define AST_FORMAT_MAX_VIDEO   (1 << 24)
 

Max one Definition at line 184 of file frame.h.

#define AST_FORMAT_PNG   (1 << 17)
 

PNG Images Definition at line 178 of file frame.h.

Referenced by ast_getformatname().

#define AST_FORMAT_SLINEAR   (1 << 6)
 

Raw 16-bit Signed Linear (8000 Hz) PCM Definition at line 164 of file frame.h.

Referenced by ast_app_getvoice(), ast_best_codec(), ast_dsp_call_progress(), ast_dsp_digitdetect(), ast_dsp_process(), ast_dsp_silence(), ast_getformatbyname(), ast_getformatname(), and ast_rtp_read().

#define AST_FORMAT_SPEEX   (1 << 9)
 

SpeeX Free Compression Definition at line 170 of file frame.h.

Referenced by ast_best_codec(), ast_getformatbyname(), ast_getformatname(), ast_rtp_read(), and ast_rtp_write().

#define AST_FORMAT_ULAW   (1 << 2)
 

Raw mu-law data (G.711) Definition at line 156 of file frame.h.

Referenced by ast_best_codec(), ast_dsp_process(), ast_getformatbyname(), ast_getformatname(), ast_rtp_read(), and ast_rtp_write().

#define AST_FRAME_CONTROL   4
 

A control frame, subclass is AST_CONTROL_* Definition at line 118 of file frame.h.

Referenced by __ast_request_and_dial(), ast_channel_bridge(), ast_dsp_process(), ast_fr_fdhangup(), ast_fr_fdread(), ast_frame_dump(), ast_queue_control(), ast_queue_hangup(), ast_read(), ast_recvchar(), ast_waitfordigit_full(), ast_waitstream(), ast_waitstream_fr(), ast_waitstream_full(), and ast_write().

#define AST_FRAME_DTMF   1
 

A DTMF digit, subclass is the digit Definition at line 112 of file frame.h.

Referenced by ast_app_getvoice(), ast_channel_bridge(), ast_dsp_process(), ast_dtmf_stream(), ast_frame_dump(), ast_read(), ast_rtp_bridge(), ast_waitfordigit(), ast_waitfordigit_full(), ast_waitstream(), ast_waitstream_fr(), ast_waitstream_full(), and ast_write().

#define AST_FRAME_HTML   9
 

HTML Frame Definition at line 128 of file frame.h.

Referenced by ast_frame_dump().

#define AST_FRAME_IAX   6
 

Inter Aterisk Exchange private frame type Definition at line 122 of file frame.h.

Referenced by ast_frame_dump().

#define AST_FRAME_IMAGE   8
 

Image Frames Definition at line 126 of file frame.h.

Referenced by ast_channel_bridge(), and ast_frame_dump().

#define AST_FRAME_NULL   5
 

An empty, useless frame Definition at line 120 of file frame.h.

Referenced by ast_channel_masquerade(), ast_dsp_process(), ast_frame_dump(), ast_read(), ast_rtcp_read(), ast_rtp_read(), and ast_softhangup_nolock().

#define AST_FRAME_TEXT   7
 

Text messages Definition at line 124 of file frame.h.

Referenced by ast_channel_bridge(), ast_frame_dump(), ast_recvchar(), and ast_write().

#define AST_FRAME_VIDEO   3
 

Video frame, maybe?? :) Definition at line 116 of file frame.h.

Referenced by ast_channel_bridge(), ast_frame_dump(), ast_rtp_bridge(), ast_rtp_read(), ast_rtp_write(), ast_write(), and ast_writestream().

#define AST_FRAME_VOICE   2
 

Voice data, subclass is AST_FORMAT_* Definition at line 114 of file frame.h.

Referenced by ast_app_getvoice(), ast_channel_bridge(), ast_dsp_call_progress(), ast_dsp_digitdetect(), ast_dsp_process(), ast_dsp_silence(), ast_frame_dump(), ast_prod(), ast_queue_frame(), ast_read(), ast_rtp_bridge(), ast_rtp_read(), ast_rtp_write(), ast_smoother_feed(), ast_smoother_read(), ast_waitfordigit_full(), ast_waitstream_full(), ast_write(), and ast_writestream().

#define AST_FRIENDLY_OFFSET   64
 

Definition at line 98 of file frame.h.

Referenced by ast_frdup(), ast_frisolate(), ast_prod(), ast_rtp_read(), and ast_smoother_read().

#define AST_HTML_BEGIN   4
 

Beginning frame Definition at line 136 of file frame.h.

Referenced by ast_frame_dump().

#define AST_HTML_DATA   2
 

Data frame Definition at line 134 of file frame.h.

Referenced by ast_frame_dump().

#define AST_HTML_END   8
 

End frame Definition at line 138 of file frame.h.

Referenced by ast_frame_dump().

#define AST_HTML_LDCOMPLETE   16
 

Load is complete Definition at line 140 of file frame.h.

Referenced by ast_frame_dump().

#define AST_HTML_LINKREJECT   20
 

Reject link request Definition at line 148 of file frame.h.

Referenced by ast_frame_dump().

#define AST_HTML_LINKURL   18
 

Send URL, and track Definition at line 144 of file frame.h.

Referenced by ast_frame_dump().

#define AST_HTML_NOSUPPORT   17
 

Peer is unable to support HTML Definition at line 142 of file frame.h.

Referenced by ast_frame_dump().

#define AST_HTML_UNLINK   19
 

No more HTML linkage Definition at line 146 of file frame.h.

Referenced by ast_frame_dump().

#define AST_HTML_URL   1
 

Sending a URL Definition at line 132 of file frame.h.

Referenced by ast_channel_sendurl(), and ast_frame_dump().

#define AST_MALLOCD_DATA   (1 << 1)
 

Need the data be free'd? Definition at line 106 of file frame.h.

Referenced by ast_frfree(), and ast_frisolate().

#define AST_MALLOCD_HDR   (1 << 0)
 

Need the header be free'd? Definition at line 104 of file frame.h.

Referenced by ast_frdup(), ast_frfree(), and ast_frisolate().

#define AST_MALLOCD_SRC   (1 << 2)
 

Need the source be free'd? (haha!) Definition at line 108 of file frame.h.

Referenced by ast_frfree(), and ast_frisolate().

#define AST_MIN_OFFSET   32
 

Definition at line 101 of file frame.h.

Referenced by ast_smoother_feed().

#define AST_OPTION_AUDIO_MODE   4
 

Definition at line 239 of file frame.h.

#define AST_OPTION_FLAG_ACCEPT   1
 

Definition at line 222 of file frame.h.

#define AST_OPTION_FLAG_ANSWER   5
 

Definition at line 225 of file frame.h.

#define AST_OPTION_FLAG_QUERY   4
 

Definition at line 224 of file frame.h.

#define AST_OPTION_FLAG_REJECT   2
 

Definition at line 223 of file frame.h.

#define AST_OPTION_FLAG_REQUEST   0
 

Definition at line 221 of file frame.h.

#define AST_OPTION_FLAG_WTF   6
 

Definition at line 226 of file frame.h.

#define AST_OPTION_RELAXDTMF   3
 

Definition at line 236 of file frame.h.

#define AST_OPTION_TDD   2
 

Definition at line 233 of file frame.h.

#define AST_OPTION_TONE_VERIFY   1
 

Definition at line 230 of file frame.h.

#define AST_SMOOTHER_FLAG_G729   (1 << 0)
 

Definition at line 218 of file frame.h.

Referenced by ast_rtp_write(), ast_smoother_feed(), and ast_smoother_read().


Function Documentation

int ast_best_codec int  fmts  ) 
 

Pick the best codec.

Definition at line 233 of file channel.c.

References AST_FORMAT_ADPCM, AST_FORMAT_ALAW, AST_FORMAT_G723_1, AST_FORMAT_G726, AST_FORMAT_G729A, AST_FORMAT_GSM, AST_FORMAT_ILBC, AST_FORMAT_LPC10, AST_FORMAT_SLINEAR, AST_FORMAT_SPEEX, AST_FORMAT_ULAW, ast_log(), and LOG_WARNING.

00234 { 00235 /* This just our opinion, expressed in code. We are asked to choose 00236 the best codec to use, given no information */ 00237 int x; 00238 static int prefs[] = 00239 { 00240 /* Okay, ulaw is used by all telephony equipment, so start with it */ 00241 AST_FORMAT_ULAW, 00242 /* Unless of course, you're a silly European, so then prefer ALAW */ 00243 AST_FORMAT_ALAW, 00244 /* Okay, well, signed linear is easy to translate into other stuff */ 00245 AST_FORMAT_SLINEAR, 00246 /* G.726 is standard ADPCM */ 00247 AST_FORMAT_G726, 00248 /* ADPCM has great sound quality and is still pretty easy to translate */ 00249 AST_FORMAT_ADPCM, 00250 /* Okay, we're down to vocoders now, so pick GSM because it's small and easier to 00251 translate and sounds pretty good */ 00252 AST_FORMAT_GSM, 00253 /* iLBC is not too bad */ 00254 AST_FORMAT_ILBC, 00255 /* Speex is free, but computationally more expensive than GSM */ 00256 AST_FORMAT_SPEEX, 00257 /* Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough 00258 to use it */ 00259 AST_FORMAT_LPC10, 00260 /* G.729a is faster than 723 and slightly less expensive */ 00261 AST_FORMAT_G729A, 00262 /* Down to G.723.1 which is proprietary but at least designed for voice */ 00263 AST_FORMAT_G723_1, 00264 }; 00265 00266 00267 for (x=0;x<sizeof(prefs) / sizeof(prefs[0]); x++) 00268 if (fmts & prefs[x]) 00269 return prefs[x]; 00270 ast_log(LOG_WARNING, "Don't know any of 0x%x formats\n", fmts); 00271 return 0; 00272 }

char* ast_codec2str int  codec  ) 
 

Get a name from a format.

Parameters:
codec codec number (1,2,4,8,16,etc.) Gets a name from a format This returns a static string identifying the format on success, 0 on error.
Definition at line 486 of file frame.c.

Referenced by ast_dsp_process().

00486 { 00487 static char codecs[25][30] = { 00488 /* Audio formats */ 00489 "G.723.1", /* 0 */ 00490 "GSM", /* 1 */ 00491 "G.711 u-law", /* 2 */ 00492 "G.711 A-law", /* 3 */ 00493 "G.726", /* 4 */ 00494 "ADPCM", /* 5 */ 00495 "16 bit Signed Linear PCM", /* 6 */ 00496 "LPC10", /* 7 */ 00497 "G.729A audio", /* 8 */ 00498 "SpeeX", /* 9 */ 00499 "iLBC", /* 10 */ 00500 "undefined", /* 11 */ 00501 "undefined", /* 12 */ 00502 "undefined", /* 13 */ 00503 "undefined", /* 14 */ 00504 "Maximum audio format", /* 15 */ 00505 /* Image formats */ 00506 "JPEG image", /* 16 */ 00507 "PNG image", /* 17 */ 00508 "H.261 Video", /* 18 */ 00509 "H.263 Video", /* 19 */ 00510 "undefined", /* 20 */ 00511 "undefined", /* 21 */ 00512 "undefined", /* 22 */ 00513 "undefined", /* 23 */ 00514 "Maximum video format", /* 24 */ 00515 }; 00516 if ((codec >= 0) && (codec <= 24)) 00517 return codecs[codec]; 00518 else 00519 return "unknown"; 00520 }

int ast_fr_fdhangup int  fd  ) 
 

Sends a hangup to an fd.

Parameters:
fd fd to write to Send a hangup (NULL equivalent) on an fd Returns 0 on success, -1 on failure
Definition at line 382 of file frame.c.

References AST_CONTROL_HANGUP, ast_fr_fdwrite(), and AST_FRAME_CONTROL.

00383 { 00384 struct ast_frame hangup = { 00385 AST_FRAME_CONTROL, 00386 AST_CONTROL_HANGUP 00387 }; 00388 return ast_fr_fdwrite(fd, &hangup); 00389 }

struct ast_frame* ast_fr_fdread int  fd  ) 
 

Reads a frame from an fd.

Parameters:
fd an opened fd to read from Read a frame from a stream or packet fd, as written by fd_write returns a frame on success, NULL on error
Definition at line 320 of file frame.c.

References AST_CONTROL_HANGUP, AST_FRAME_CONTROL, ast_frisolate(), ast_log(), and LOG_WARNING.

00321 { 00322 char buf[65536]; 00323 int res; 00324 int ttl = sizeof(struct ast_frame); 00325 struct ast_frame *f = (struct ast_frame *)buf; 00326 /* Read a frame directly from there. They're always in the 00327 right format. */ 00328 00329 while(ttl) { 00330 res = read(fd, buf, ttl); 00331 if (res < 0) { 00332 ast_log(LOG_WARNING, "Bad read on %d: %s\n", fd, strerror(errno)); 00333 return NULL; 00334 } 00335 ttl -= res; 00336 } 00337 00338 /* read the frame header */ 00339 f->mallocd = 0; 00340 /* Re-write data position */ 00341 f->data = buf + sizeof(struct ast_frame); 00342 f->offset = 0; 00343 /* Forget about being mallocd */ 00344 f->mallocd = 0; 00345 /* Re-write the source */ 00346 f->src = __FUNCTION__; 00347 if (f->datalen > sizeof(buf) - sizeof(struct ast_frame)) { 00348 /* Really bad read */ 00349 ast_log(LOG_WARNING, "Strange read (%d bytes)\n", f->datalen); 00350 return NULL; 00351 } 00352 if (f->datalen) { 00353 if ((res = read(fd, f->data, f->datalen)) != f->datalen) { 00354 /* Bad read */ 00355 ast_log(LOG_WARNING, "How very strange, expected %d, got %d\n", f->datalen, res); 00356 return NULL; 00357 } 00358 } 00359 if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) { 00360 return NULL; 00361 } 00362 return ast_frisolate(f); 00363 }

int ast_fr_fdwrite int  fd,
struct ast_frame frame
 

Writes a frame to an fd.

Parameters:
fd Which fd to write to
frame frame to write to the fd Write a frame to an fd Returns 0 on success, -1 on failure
Definition at line 368 of file frame.c.

References ast_log(), ast_frame::data, ast_frame::datalen, and LOG_WARNING.

Referenced by ast_fr_fdhangup().

00369 { 00370 /* Write the frame exactly */ 00371 if (write(fd, frame, sizeof(struct ast_frame)) != sizeof(struct ast_frame)) { 00372 ast_log(LOG_WARNING, "Write error: %s\n", strerror(errno)); 00373 return -1; 00374 } 00375 if (write(fd, frame->data, frame->datalen) != frame->datalen) { 00376 ast_log(LOG_WARNING, "Write error: %s\n", strerror(errno)); 00377 return -1; 00378 } 00379 return 0; 00380 }

void ast_frame_dump char *  name,
struct ast_frame f,
char *  prefix
 

Definition at line 599 of file frame.c.

References AST_CONTROL_ANSWER, AST_CONTROL_BUSY, AST_CONTROL_CONGESTION, AST_CONTROL_FLASH, AST_CONTROL_HANGUP, AST_CONTROL_OFFHOOK, AST_CONTROL_OPTION, AST_CONTROL_RADIO_KEY, AST_CONTROL_RADIO_UNKEY, AST_CONTROL_RING, AST_CONTROL_RINGING, AST_CONTROL_TAKEOFFHOOK, AST_CONTROL_WINK, AST_FRAME_CONTROL, AST_FRAME_DTMF, AST_FRAME_HTML, AST_FRAME_IAX, AST_FRAME_IMAGE, AST_FRAME_NULL, AST_FRAME_TEXT, AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_getformatname(), 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_verbose(), COLOR_BLACK, COLOR_BRCYAN, COLOR_BRGREEN, COLOR_BRMAGENTA, COLOR_BRRED, COLOR_YELLOW, ast_frame::data, ast_frame::frametype, ast_frame::subclass, and term_color().

Referenced by ast_read(), and ast_write().

00600 { 00601 char *n = "unknown"; 00602 char ftype[40] = "Unknown Frametype"; 00603 char cft[80]; 00604 char subclass[40] = "Unknown Subclass"; 00605 char csub[80]; 00606 char moreinfo[40] = ""; 00607 char cn[40]; 00608 char cp[40]; 00609 char cmn[40]; 00610 if (name) 00611 n = name; 00612 if (!f) { 00613 ast_verbose("%s [ %s (NULL) ] [%s]\n", 00614 term_color(cp, prefix, COLOR_BRMAGENTA, COLOR_BLACK, sizeof(cp)), 00615 term_color(cft, "HANGUP", COLOR_BRRED, COLOR_BLACK, sizeof(cft)), 00616 term_color(cn, n, COLOR_YELLOW, COLOR_BLACK, sizeof(cn))); 00617 return; 00618 } 00619 /* XXX We should probably print one each of voice and video when the format changes XXX */ 00620 if (f->frametype == AST_FRAME_VOICE) 00621 return; 00622 if (f->frametype == AST_FRAME_VIDEO) 00623 return; 00624 switch(f->frametype) { 00625 case AST_FRAME_DTMF: 00626 strcpy(ftype, "DTMF"); 00627 subclass[0] = f->subclass; 00628 subclass[1] = '\0'; 00629 break; 00630 case AST_FRAME_CONTROL: 00631 strcpy(ftype, "Control"); 00632 switch(f->subclass) { 00633 case AST_CONTROL_HANGUP: 00634 strcpy(subclass, "Hangup"); 00635 break; 00636 case AST_CONTROL_RING: 00637 strcpy(subclass, "Ring"); 00638 break; 00639 case AST_CONTROL_RINGING: 00640 strcpy(subclass, "Ringing"); 00641 break; 00642 case AST_CONTROL_ANSWER: 00643 strcpy(subclass, "Answer"); 00644 break; 00645 case AST_CONTROL_BUSY: 00646 strcpy(subclass, "Busy"); 00647 break; 00648 case AST_CONTROL_TAKEOFFHOOK: 00649 strcpy(subclass, "Take Off Hook"); 00650 break; 00651 case AST_CONTROL_OFFHOOK: 00652 strcpy(subclass, "Line Off Hook"); 00653 break; 00654 case AST_CONTROL_CONGESTION: 00655 strcpy(subclass, "Congestion"); 00656 break; 00657 case AST_CONTROL_FLASH: 00658 strcpy(subclass, "Flash"); 00659 break; 00660 case AST_CONTROL_WINK: 00661 strcpy(subclass, "Wink"); 00662 break; 00663 case AST_CONTROL_OPTION: 00664 strcpy(subclass, "Option"); 00665 break; 00666 case AST_CONTROL_RADIO_KEY: 00667 strcpy(subclass, "Key Radio"); 00668 break; 00669 case AST_CONTROL_RADIO_UNKEY: 00670 strcpy(subclass, "Unkey Radio"); 00671 break; 00672 default: 00673 snprintf(subclass, sizeof(subclass), "Unknown control '%d'", f->subclass); 00674 } 00675 case AST_FRAME_NULL: 00676 strcpy(ftype, "Null Frame"); 00677 strcpy(subclass, "N/A"); 00678 break; 00679 case AST_FRAME_IAX: 00680 /* Should never happen */ 00681 strcpy(ftype, "IAX Specific"); 00682 snprintf(subclass, sizeof(subclass), "IAX Frametype %d", f->subclass); 00683 break; 00684 case AST_FRAME_TEXT: 00685 strcpy(ftype, "Text"); 00686 strcpy(subclass, "N/A"); 00687 strncpy(moreinfo, f->data, sizeof(moreinfo) - 1); 00688 break; 00689 case AST_FRAME_IMAGE: 00690 strcpy(ftype, "Image"); 00691 snprintf(subclass, sizeof(subclass), "Image format %s\n", ast_getformatname(f->subclass)); 00692 break; 00693 case AST_FRAME_HTML: 00694 strcpy(ftype, "HTML"); 00695 switch(f->subclass) { 00696 case AST_HTML_URL: 00697 strcpy(subclass, "URL"); 00698 strncpy(moreinfo, f->data, sizeof(moreinfo) - 1); 00699 break; 00700 case AST_HTML_DATA: 00701 strcpy(subclass, "Data"); 00702 break; 00703 case AST_HTML_BEGIN: 00704 strcpy(subclass, "Begin"); 00705 break; 00706 case AST_HTML_END: 00707 strcpy(subclass, "End"); 00708 break; 00709 case AST_HTML_LDCOMPLETE: 00710 strcpy(subclass, "Load Complete"); 00711 break; 00712 case AST_HTML_NOSUPPORT: 00713 strcpy(subclass, "No Support"); 00714 break; 00715 case AST_HTML_LINKURL: 00716 strcpy(subclass, "Link URL"); 00717 strncpy(moreinfo, f->data, sizeof(moreinfo) - 1); 00718 break; 00719 case AST_HTML_UNLINK: 00720 strcpy(subclass, "Unlink"); 00721 break; 00722 case AST_HTML_LINKREJECT: 00723 strcpy(subclass, "Link Reject"); 00724 break; 00725 default: 00726 snprintf(subclass, sizeof(subclass), "Unknown HTML frame '%d'\n", f->subclass); 00727 break; 00728 } 00729 break; 00730 default: 00731 snprintf(ftype, sizeof(ftype), "Unknown Frametype '%d'", f->frametype); 00732 } 00733 if (!ast_strlen_zero(moreinfo)) 00734 ast_verbose("%s [ TYPE: %s (%d) SUBCLASS: %s (%d) '%s' ] [%s]\n", 00735 term_color(cp, prefix, COLOR_BRMAGENTA, COLOR_BLACK, sizeof(cp)), 00736 term_color(cft, ftype, COLOR_BRRED, COLOR_BLACK, sizeof(cft)), 00737 f->frametype, 00738 term_color(csub, subclass, COLOR_BRCYAN, COLOR_BLACK, sizeof(csub)), 00739 f->subclass, 00740 term_color(cmn, moreinfo, COLOR_BRGREEN, COLOR_BLACK, sizeof(cmn)), 00741 term_color(cn, n, COLOR_YELLOW, COLOR_BLACK, sizeof(cn))); 00742 else 00743 ast_verbose("%s [ TYPE: %s (%d) SUBCLASS: %s (%d) ] [%s]\n", 00744 term_color(cp, prefix, COLOR_BRMAGENTA, COLOR_BLACK, sizeof(cp)), 00745 term_color(cft, ftype, COLOR_BRRED, COLOR_BLACK, sizeof(cft)), 00746 f->frametype, 00747 term_color(csub, subclass, COLOR_BRCYAN, COLOR_BLACK, sizeof(csub)), 00748 f->subclass, 00749 term_color(cn, n, COLOR_YELLOW, COLOR_BLACK, sizeof(cn))); 00750 00751 }

struct ast_frame* ast_frdup struct ast_frame fr  ) 
 

Copies a frame.

Parameters:
fr frame to copy Dupliates a frame -- should only rarely be used, typically frisolate is good enough Returns a frame on success, NULL on error
Definition at line 282 of file frame.c.

References AST_FRIENDLY_OFFSET, AST_MALLOCD_HDR, ast_frame::data, ast_frame::datalen, ast_frame::delivery, ast_frame::frametype, malloc, ast_frame::samples, ast_frame::src, and ast_frame::subclass.

Referenced by ast_queue_frame(), and ast_rtp_write().

00283 { 00284 struct ast_frame *out; 00285 int len, srclen = 0; 00286 void *buf; 00287 /* Start with standard stuff */ 00288 len = sizeof(struct ast_frame) + AST_FRIENDLY_OFFSET + f->datalen; 00289 /* If we have a source, add space for it */ 00290 if (f->src) 00291 srclen = strlen(f->src); 00292 if (srclen > 0) 00293 len += srclen + 1; 00294 buf = malloc(len); 00295 if (!buf) 00296 return NULL; 00297 out = buf; 00298 /* Set us as having malloc'd header only, so it will eventually 00299 get freed. */ 00300 out->frametype = f->frametype; 00301 out->subclass = f->subclass; 00302 out->datalen = f->datalen; 00303 out->samples = f->samples; 00304 out->delivery = f->delivery; 00305 out->mallocd = AST_MALLOCD_HDR; 00306 out->offset = AST_FRIENDLY_OFFSET; 00307 out->data = buf + sizeof(struct ast_frame) + AST_FRIENDLY_OFFSET; 00308 if (srclen > 0) { 00309 out->src = out->data + f->datalen; 00310 /* Must have space since we allocated for it */ 00311 strcpy(out->src, f->src); 00312 } else 00313 out->src = NULL; 00314 out->prev = NULL; 00315 out->next = NULL; 00316 memcpy(out->data, f->data, out->datalen); 00317 return out; 00318 }

void ast_frfree struct ast_frame fr  ) 
 

Frees a frame.

Parameters:
fr Frame to free Free a frame, and the memory it used if applicable no return.
Definition at line 215 of file frame.c.

References AST_MALLOCD_DATA, AST_MALLOCD_HDR, AST_MALLOCD_SRC, ast_mutex_lock, ast_mutex_unlock, ast_frame::data, free, ast_frame::mallocd, ast_frame::next, ast_frame::offset, ast_frame::prev, and ast_frame::src.

Referenced by __ast_request_and_dial(), ast_app_getvoice(), ast_channel_bridge(), ast_channel_free(), ast_dsp_process(), ast_queue_frame(), ast_read(), ast_recvchar(), ast_rtp_bridge(), ast_safe_sleep(), ast_safe_sleep_conditional(), ast_send_image(), ast_tonepair(), ast_translate(), ast_waitfordigit(), ast_waitfordigit_full(), ast_waitstream(), ast_waitstream_fr(), ast_waitstream_full(), and ast_write().

00216 { 00217 if (fr->mallocd & AST_MALLOCD_DATA) { 00218 if (fr->data) 00219 free(fr->data - fr->offset); 00220 } 00221 if (fr->mallocd & AST_MALLOCD_SRC) { 00222 if (fr->src) 00223 free(fr->src); 00224 } 00225 if (fr->mallocd & AST_MALLOCD_HDR) { 00226 #ifdef TRACE_FRAMES 00227 headers--; 00228 ast_mutex_lock(&framelock); 00229 if (fr->next) 00230 fr->next->prev = fr->prev; 00231 if (fr->prev) 00232 fr->prev->next = fr->next; 00233 else 00234 headerlist = fr->next; 00235 ast_mutex_unlock(&framelock); 00236 #endif 00237 free(fr); 00238 } 00239 }

struct ast_frame* ast_frisolate struct ast_frame fr  ) 
 

Copies a frame.

Parameters:
fr frame to act upon Take a frame, and if it's not been malloc'd, make a malloc'd copy and if the data hasn't been malloced then make the data malloc'd. If you need to store frames, say for queueing, then you should call this function. Returns a frame on success, NULL on error
Definition at line 241 of file frame.c.

References AST_FRIENDLY_OFFSET, ast_log(), AST_MALLOCD_DATA, AST_MALLOCD_HDR, AST_MALLOCD_SRC, ast_frame::data, ast_frame::datalen, ast_frame::frametype, free, LOG_WARNING, malloc, ast_frame::mallocd, ast_frame::samples, ast_frame::src, strdup, and ast_frame::subclass.

Referenced by ast_fr_fdread().

00242 { 00243 struct ast_frame *out; 00244 if (!(fr->mallocd & AST_MALLOCD_HDR)) { 00245 /* Allocate a new header if needed */ 00246 out = ast_frame_header_new(); 00247 if (!out) { 00248 ast_log(LOG_WARNING, "Out of memory\n"); 00249 return NULL; 00250 } 00251 out->frametype = fr->frametype; 00252 out->subclass = fr->subclass; 00253 out->datalen = 0; 00254 out->samples = fr->samples; 00255 out->offset = 0; 00256 out->src = NULL; 00257 out->data = NULL; 00258 } else { 00259 out = fr; 00260 } 00261 if (!(fr->mallocd & AST_MALLOCD_SRC)) { 00262 if (fr->src) 00263 out->src = strdup(fr->src); 00264 } else 00265 out->src = fr->src; 00266 if (!(fr->mallocd & AST_MALLOCD_DATA)) { 00267 out->data = malloc(fr->datalen + AST_FRIENDLY_OFFSET); 00268 if (!out->data) { 00269 free(out); 00270 ast_log(LOG_WARNING, "Out of memory\n"); 00271 return NULL; 00272 } 00273 out->data += AST_FRIENDLY_OFFSET; 00274 out->offset = AST_FRIENDLY_OFFSET; 00275 out->datalen = fr->datalen; 00276 memcpy(out->data, fr->data, fr->datalen); 00277 } 00278 out->mallocd = AST_MALLOCD_HDR | AST_MALLOCD_SRC | AST_MALLOCD_DATA; 00279 return out; 00280 }

int ast_getformatbyname char *  name  ) 
 

Parameters:
name string of format Gets a format from a name. This returns the form of the format in binary on success, 0 on error.
Definition at line 453 of file frame.c.

References AST_FORMAT_ADPCM, AST_FORMAT_ALAW, AST_FORMAT_G723_1, AST_FORMAT_G726, AST_FORMAT_G729A, AST_FORMAT_GSM, AST_FORMAT_H261, AST_FORMAT_H263, AST_FORMAT_ILBC, AST_FORMAT_LPC10, AST_FORMAT_SLINEAR, AST_FORMAT_SPEEX, and AST_FORMAT_ULAW.

00454 { 00455 if (!strcasecmp(name, "g723.1")) 00456 return AST_FORMAT_G723_1; 00457 else if (!strcasecmp(name, "gsm")) 00458 return AST_FORMAT_GSM; 00459 else if (!strcasecmp(name, "ulaw")) 00460 return AST_FORMAT_ULAW; 00461 else if (!strcasecmp(name, "alaw")) 00462 return AST_FORMAT_ALAW; 00463 else if (!strcasecmp(name, "g726")) 00464 return AST_FORMAT_G726; 00465 else if (!strcasecmp(name, "slinear")) 00466 return AST_FORMAT_SLINEAR; 00467 else if (!strcasecmp(name, "lpc10")) 00468 return AST_FORMAT_LPC10; 00469 else if (!strcasecmp(name, "adpcm")) 00470 return AST_FORMAT_ADPCM; 00471 else if (!strcasecmp(name, "g729")) 00472 return AST_FORMAT_G729A; 00473 else if (!strcasecmp(name, "speex")) 00474 return AST_FORMAT_SPEEX; 00475 else if (!strcasecmp(name, "ilbc")) 00476 return AST_FORMAT_ILBC; 00477 else if (!strcasecmp(name, "h261")) 00478 return AST_FORMAT_H261; 00479 else if (!strcasecmp(name, "h263")) 00480 return AST_FORMAT_H263; 00481 else if (!strcasecmp(name, "all")) 00482 return 0x7FFFFFFF; 00483 return 0; 00484 }

char* ast_getformatname int  format  ) 
 

Get the name of a format.

Parameters:
format id of format
Returns:
A static string containing the name of the format or "UNKN" if unknown.
Definition at line 391 of file frame.c.

References AST_FORMAT_ADPCM, AST_FORMAT_ALAW, AST_FORMAT_G723_1, AST_FORMAT_G726, AST_FORMAT_G729A, AST_FORMAT_GSM, AST_FORMAT_H261, AST_FORMAT_H263, AST_FORMAT_ILBC, AST_FORMAT_JPEG, AST_FORMAT_LPC10, AST_FORMAT_PNG, AST_FORMAT_SLINEAR, AST_FORMAT_SPEEX, and AST_FORMAT_ULAW.

Referenced by ast_frame_dump(), ast_getformatname_multiple(), ast_read(), ast_register_translator(), ast_rtp_read(), ast_rtp_write(), ast_set_read_format(), ast_set_write_format(), ast_streamfile(), ast_translator_build_path(), ast_unregister_translator(), and ast_writestream().

00392 { 00393 if (format == AST_FORMAT_G723_1) 00394 return "G723"; 00395 else if (format == AST_FORMAT_GSM) 00396 return "GSM"; 00397 else if (format == AST_FORMAT_ULAW) 00398 return "ULAW"; 00399 else if (format == AST_FORMAT_ALAW) 00400 return "ALAW"; 00401 else if (format == AST_FORMAT_G726) 00402 return "G726"; 00403 else if (format == AST_FORMAT_SLINEAR) 00404 return "SLINR"; 00405 else if (format == AST_FORMAT_LPC10) 00406 return "LPC10"; 00407 else if (format == AST_FORMAT_ADPCM) 00408 return "ADPCM"; 00409 else if (format == AST_FORMAT_G729A) 00410 return "G729A"; 00411 else if (format == AST_FORMAT_SPEEX) 00412 return "SPEEX"; 00413 else if (format == AST_FORMAT_ILBC) 00414 return "ILBC"; 00415 else if (format == AST_FORMAT_JPEG) 00416 return "JPEG"; 00417 else if (format == AST_FORMAT_PNG) 00418 return "PNG"; 00419 else if (format == AST_FORMAT_H261) 00420 return "H261"; 00421 else if (format == AST_FORMAT_H263) 00422 return "H263"; 00423 return "UNKN"; 00424 }

char* ast_getformatname_multiple char *  buf,
unsigned  n,
int  format
 

Get the names of a set of formats.

Parameters:
buf a buffer for the output string
n size of buf (bytes)
format the format (combined IDs of codecs) Prints a list of readable codec names corresponding to "format". ex: for format=AST_FORMAT_GSM|AST_FORMAT_SPEEX|AST_FORMAT_ILBC it will return "0x602(GSM|SPEEX|ILBC)"
Returns:
The return value is buf.
Definition at line 426 of file frame.c.

References ast_getformatname().

00426 { 00427 unsigned u=1; 00428 unsigned len; 00429 char *b = buf; 00430 char *start = buf; 00431 if (!n) return buf; 00432 snprintf(b,n,"0x%x(",format); 00433 len = strlen(b); 00434 b += len; 00435 n -= len; 00436 start = b; 00437 while (u) { 00438 if (u&format) { 00439 snprintf(b,n,"%s|",ast_getformatname(u)); 00440 len = strlen(b); 00441 b += len; 00442 n -= len; 00443 } 00444 u *= 2; 00445 } 00446 if (start==b) 00447 snprintf(start,n,"EMPTY)"); 00448 else if (n>1) 00449 b[-1]=')'; 00450 return buf; 00451 }

int ast_smoother_feed struct ast_smoother s,
struct ast_frame f
 

Definition at line 78 of file frame.c.

References AST_FRAME_VOICE, ast_log(), AST_MIN_OFFSET, AST_SMOOTHER_FLAG_G729, ast_frame::data, ast_frame::datalen, ast_frame::delivery, ast_frame::frametype, LOG_NOTICE, LOG_WARNING, ast_frame::offset, s, ast_frame::samples, SMOOTHER_SIZE, and ast_frame::subclass.

Referenced by ast_rtp_write().

00079 { 00080 if (f->frametype != AST_FRAME_VOICE) { 00081 ast_log(LOG_WARNING, "Huh? Can't smooth a non-voice frame!\n"); 00082 return -1; 00083 } 00084 if (!s->format) { 00085 s->format = f->subclass; 00086 s->samplesperbyte = (float)f->samples / (float)f->datalen; 00087 } else if (s->format != f->subclass) { 00088 ast_log(LOG_WARNING, "Smoother was working on %d format frames, now trying to feed %d?\n", s->format, f->subclass); 00089 return -1; 00090 } 00091 if (s->len + f->datalen > SMOOTHER_SIZE) { 00092 ast_log(LOG_WARNING, "Out of smoother space\n"); 00093 return -1; 00094 } 00095 if (((f->datalen == s->size) || ((f->datalen < 10) && (s->flags & AST_SMOOTHER_FLAG_G729))) 00096 && !s->opt && (f->offset >= AST_MIN_OFFSET)) { 00097 if (!s->len) { 00098 /* Optimize by sending the frame we just got 00099 on the next read, thus eliminating the douple 00100 copy */ 00101 s->opt = f; 00102 return 0; 00103 } else { 00104 s->optimizablestream++; 00105 if (s->optimizablestream > 10) { 00106 /* For the past 10 rounds, we have input and output 00107 frames of the correct size for this smoother, yet 00108 we were unable to optimize because there was still 00109 some cruft left over. Lets just drop the cruft so 00110 we can move to a fully optimized path */ 00111 s->len = 0; 00112 s->opt = f; 00113 return 0; 00114 } 00115 } 00116 } else 00117 s->optimizablestream = 0; 00118 if (s->flags & AST_SMOOTHER_FLAG_G729) { 00119 if (s->len % 10) { 00120 ast_log(LOG_NOTICE, "Dropping extra frame of G.729 since we already have a VAD frame at the end\n"); 00121 return 0; 00122 } 00123 } 00124 memcpy(s->data + s->len, f->data, f->datalen); 00125 /* If either side is empty, reset the delivery time */ 00126 if (!s->len || (!f->delivery.tv_sec && !f->delivery.tv_usec) || 00127 (!s->delivery.tv_sec && !s->delivery.tv_usec)) 00128 s->delivery = f->delivery; 00129 s->len += f->datalen; 00130 return 0; 00131 }

void ast_smoother_free struct ast_smoother s  ) 
 

Definition at line 184 of file frame.c.

References free, and s.

Referenced by ast_rtp_destroy(), and ast_rtp_write().

00185 { 00186 free(s); 00187 }

int ast_smoother_get_flags struct ast_smoother smoother  ) 
 

Definition at line 68 of file frame.c.

References s.

00069 { 00070 return s->flags; 00071 }

struct ast_smoother* ast_smoother_new int  bytes  ) 
 

Definition at line 57 of file frame.c.

References ast_smoother_reset(), malloc, and s.

Referenced by ast_rtp_write().

00058 { 00059 struct ast_smoother *s; 00060 if (size < 1) 00061 return NULL; 00062 s = malloc(sizeof(struct ast_smoother)); 00063 if (s) 00064 ast_smoother_reset(s, size); 00065 return s; 00066 }

struct ast_frame* ast_smoother_read struct ast_smoother s  ) 
 

Definition at line 133 of file frame.c.

References AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, AST_SMOOTHER_FLAG_G729, and s.

Referenced by ast_rtp_write().

00134 { 00135 struct ast_frame *opt; 00136 int len; 00137 /* IF we have an optimization frame, send it */ 00138 if (s->opt) { 00139 opt = s->opt; 00140 s->opt = NULL; 00141 return opt; 00142 } 00143 00144 /* Make sure we have enough data */ 00145 if (s->len < s->size) { 00146 /* Or, if this is a G.729 frame with VAD on it, send it immediately anyway */ 00147 if (!((s->flags & AST_SMOOTHER_FLAG_G729) && (s->size % 10))) 00148 return NULL; 00149 } 00150 len = s->size; 00151 if (len > s->len) 00152 len = s->len; 00153 /* Make frame */ 00154 s->f.frametype = AST_FRAME_VOICE; 00155 s->f.subclass = s->format; 00156 s->f.data = s->framedata + AST_FRIENDLY_OFFSET; 00157 s->f.offset = AST_FRIENDLY_OFFSET; 00158 s->f.datalen = len; 00159 /* Samples will be improper given VAD, but with VAD the concept really doesn't even exist */ 00160 s->f.samples = len * s->samplesperbyte; 00161 s->f.delivery = s->delivery; 00162 /* Fill Data */ 00163 memcpy(s->f.data, s->data, len); 00164 s->len -= len; 00165 /* Move remaining data to the front if applicable */ 00166 if (s->len) { 00167 /* In principle this should all be fine because if we are sending 00168 G.729 VAD, the next timestamp will take over anyawy */ 00169 memmove(s->data, s->data + len, s->len); 00170 if (s->delivery.tv_sec || s->delivery.tv_usec) { 00171 /* If we have delivery time, increment it, otherwise, leave it at 0 */ 00172 s->delivery.tv_sec += (len * s->samplesperbyte) / 8000.0; 00173 s->delivery.tv_usec += (((int)(len * s->samplesperbyte)) % 8000) * 125; 00174 if (s->delivery.tv_usec > 1000000) { 00175 s->delivery.tv_usec -= 1000000; 00176 s->delivery.tv_sec += 1; 00177 } 00178 } 00179 } 00180 /* Return frame */ 00181 return &s->f; 00182 }

void ast_smoother_reset struct ast_smoother s,
int  bytes
 

Definition at line 51 of file frame.c.

References s.

Referenced by ast_smoother_new().

00052 { 00053 memset(s, 0, sizeof(struct ast_smoother)); 00054 s->size = size; 00055 }

void ast_smoother_set_flags struct ast_smoother smoother,
int  flags
 

Definition at line 73 of file frame.c.

References s.

Referenced by ast_rtp_write().

00074 { 00075 s->flags = flags; 00076 }


Generated on Tue Aug 17 16:13:55 2004 for Asterisk by doxygen 1.3.8