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

frame.h File Reference

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

Include dependency graph for frame.h:

Include dependency graph

This graph shows which files directly or indirectly include this file:

Included by dependency graph

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
#define AST_MIN_OFFSET   32 /*! Make sure we keep at least this much handy */
#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_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_PROGRESS   14
 

Indicate CALL_PROCEEDING or 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
 

Value:

64 /*! It's polite for a a new frame to have this number of bytes for additional headers. */

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 /*! Make sure we keep at least this much handy */
 

Definition at line 101 of file frame.h.

Referenced by ast_smoother_feed().

#define AST_OPTION_AUDIO_MODE   4
 

Definition at line 237 of file frame.h.

#define AST_OPTION_FLAG_ACCEPT   1
 

Definition at line 220 of file frame.h.

#define AST_OPTION_FLAG_ANSWER   5
 

Definition at line 223 of file frame.h.

#define AST_OPTION_FLAG_QUERY   4
 

Definition at line 222 of file frame.h.

#define AST_OPTION_FLAG_REJECT   2
 

Definition at line 221 of file frame.h.

#define AST_OPTION_FLAG_REQUEST   0
 

Definition at line 219 of file frame.h.

#define AST_OPTION_FLAG_WTF   6
 

Definition at line 224 of file frame.h.

#define AST_OPTION_RELAXDTMF   3
 

Definition at line 234 of file frame.h.

#define AST_OPTION_TDD   2
 

Definition at line 231 of file frame.h.

#define AST_OPTION_TONE_VERIFY   1
 

Definition at line 228 of file frame.h.

#define AST_SMOOTHER_FLAG_G729   (1 << 0)
 

Definition at line 216 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 487 of file frame.c.

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

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 383 of file frame.c.

References AST_CONTROL_HANGUP, ast_fr_fdwrite(), and AST_FRAME_CONTROL.

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

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 321 of file frame.c.

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

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

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 369 of file frame.c.

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

Referenced by ast_fr_fdhangup().

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

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

Definition at line 600 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().

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

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 283 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().

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

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 216 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().

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

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 242 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().

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

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 454 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.

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

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 392 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().

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

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 427 of file frame.c.

References ast_getformatname().

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

int ast_smoother_feed struct ast_smoother s,
struct ast_frame f
 

Definition at line 79 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().

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

void ast_smoother_free struct ast_smoother s  ) 
 

Definition at line 185 of file frame.c.

References free, and s.

Referenced by ast_rtp_destroy(), and ast_rtp_write().

00186 { 00187 free(s); 00188 }

int ast_smoother_get_flags struct ast_smoother smoother  ) 
 

Definition at line 69 of file frame.c.

References s.

00070 { 00071 return s->flags; 00072 }

struct ast_smoother* ast_smoother_new int  bytes  ) 
 

Definition at line 58 of file frame.c.

References ast_smoother_reset(), malloc, and s.

Referenced by ast_rtp_write().

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

struct ast_frame* ast_smoother_read struct ast_smoother s  ) 
 

Definition at line 134 of file frame.c.

References AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, AST_SMOOTHER_FLAG_G729, and s.

Referenced by ast_rtp_write().

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

void ast_smoother_reset struct ast_smoother s,
int  bytes
 

Definition at line 52 of file frame.c.

References s.

Referenced by ast_smoother_new().

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

void ast_smoother_set_flags struct ast_smoother smoother,
int  flags
 

Definition at line 74 of file frame.c.

References s.

Referenced by ast_rtp_write().

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


Generated on Sat Jun 12 16:41:34 2004 for Asterisk by doxygen 1.3.7