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

frame.h

Go to the documentation of this file.
00001 /* 00002 * Asterisk -- A telephony toolkit for Linux. 00003 * 00004 * Asterisk internal frame definitions. 00005 * 00006 * Copyright (C) 1999, Mark Spencer 00007 * 00008 * Mark Spencer <markster@linux-support.net> 00009 * 00010 * This program is free software, distributed under the terms of 00011 * the GNU Lesser General Public License. Other components of 00012 * Asterisk are distributed under The GNU General Public License 00013 * only. 00014 */ 00015 00016 #ifndef _ASTERISK_FRAME_H 00017 #define _ASTERISK_FRAME_H 00018 00019 #if defined(__cplusplus) || defined(c_plusplus) 00020 extern "C" { 00021 #endif 00022 00023 #include <sys/types.h> 00024 #include <sys/time.h> 00025 00026 /* 00027 * Autodetect system endianess 00028 */ 00029 #ifndef __BYTE_ORDER 00030 #ifdef __linux__ 00031 #include <endian.h> 00032 #elif defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__APPLE__) 00033 #if defined(__OpenBSD__) 00034 #include <machine/types.h> 00035 #endif /* __OpenBSD__ */ 00036 #include <machine/endian.h> 00037 #define __BYTE_ORDER BYTE_ORDER 00038 #define __LITTLE_ENDIAN LITTLE_ENDIAN 00039 #define __BIG_ENDIAN BIG_ENDIAN 00040 #else 00041 #ifdef __LITTLE_ENDIAN__ 00042 #define __BYTE_ORDER __LITTLE_ENDIAN 00043 #endif /* __LITTLE_ENDIAN */ 00044 00045 #if defined(i386) || defined(__i386__) 00046 #define __BYTE_ORDER __LITTLE_ENDIAN 00047 #endif /* defined i386 */ 00048 00049 #if defined(sun) && defined(unix) && defined(sparc) 00050 #define __BYTE_ORDER __BIG_ENDIAN 00051 #endif /* sun unix sparc */ 00052 00053 #endif /* linux */ 00054 00055 #endif /* __BYTE_ORDER */ 00056 00057 #ifndef __BYTE_ORDER 00058 #error Need to know endianess 00059 #endif /* __BYTE_ORDER */ 00060 00061 //! Data structure associated with a single frame of data 00062 /* A frame of data read used to communicate between 00063 between channels and applications */ 00064 struct ast_frame { 00065 /*! Kind of frame */ 00066 int frametype; 00067 /*! Subclass, frame dependent */ 00068 int subclass; 00069 /*! Length of data */ 00070 int datalen; 00071 /*! Number of 8khz samples in this frame */ 00072 int samples; 00073 /*! Was the data malloc'd? i.e. should we free it when we discard the frame? */ 00074 int mallocd; 00075 /*! How far into "data" the data really starts */ 00076 int offset; 00077 /*! Optional source of frame for debugging */ 00078 char *src; 00079 /*! Pointer to actual data */ 00080 void *data; 00081 /*! Global delivery time */ 00082 struct timeval delivery; 00083 /*! Next/Prev for linking stand alone frames */ 00084 struct ast_frame *prev; 00085 /*! Next/Prev for linking stand alone frames */ 00086 struct ast_frame *next; 00087 /* Unused except if debugging is turned on, but left 00088 in the struct so that it can be turned on without 00089 requiring a recompile of the whole thing */ 00090 }; 00091 00092 struct ast_frame_chain { 00093 /* XXX Should ast_frame chain's be just prt of frames, i.e. should they just link? XXX */ 00094 struct ast_frame *fr; 00095 struct ast_frame_chain *next; 00096 }; 00097 00098 #define AST_FRIENDLY_OFFSET 64 /*! It's polite for a a new frame to 00099 have this number of bytes for additional 00100 headers. */ 00101 #define AST_MIN_OFFSET 32 /*! Make sure we keep at least this much handy */ 00102 00103 /*! Need the header be free'd? */ 00104 #define AST_MALLOCD_HDR (1 << 0) 00105 /*! Need the data be free'd? */ 00106 #define AST_MALLOCD_DATA (1 << 1) 00107 /*! Need the source be free'd? (haha!) */ 00108 #define AST_MALLOCD_SRC (1 << 2) 00109 00110 /* Frame types */ 00111 /*! A DTMF digit, subclass is the digit */ 00112 #define AST_FRAME_DTMF 1 00113 /*! Voice data, subclass is AST_FORMAT_* */ 00114 #define AST_FRAME_VOICE 2 00115 /*! Video frame, maybe?? :) */ 00116 #define AST_FRAME_VIDEO 3 00117 /*! A control frame, subclass is AST_CONTROL_* */ 00118 #define AST_FRAME_CONTROL 4 00119 /*! An empty, useless frame */ 00120 #define AST_FRAME_NULL 5 00121 /*! Inter Asterisk Exchange private frame type */ 00122 #define AST_FRAME_IAX 6 00123 /*! Text messages */ 00124 #define AST_FRAME_TEXT 7 00125 /*! Image Frames */ 00126 #define AST_FRAME_IMAGE 8 00127 /*! HTML Frame */ 00128 #define AST_FRAME_HTML 9 00129 /*! Comfort Noise frame (subclass is level of CNG in -dBov), 00130 body may include zero or more 8-bit quantization coefficients */ 00131 #define AST_FRAME_CNG 10 00132 00133 /* HTML subclasses */ 00134 /*! Sending a URL */ 00135 #define AST_HTML_URL 1 00136 /*! Data frame */ 00137 #define AST_HTML_DATA 2 00138 /*! Beginning frame */ 00139 #define AST_HTML_BEGIN 4 00140 /*! End frame */ 00141 #define AST_HTML_END 8 00142 /*! Load is complete */ 00143 #define AST_HTML_LDCOMPLETE 16 00144 /*! Peer is unable to support HTML */ 00145 #define AST_HTML_NOSUPPORT 17 00146 /*! Send URL, and track */ 00147 #define AST_HTML_LINKURL 18 00148 /*! No more HTML linkage */ 00149 #define AST_HTML_UNLINK 19 00150 /*! Reject link request */ 00151 #define AST_HTML_LINKREJECT 20 00152 00153 /* Data formats for capabilities and frames alike */ 00154 /*! G.723.1 compression */ 00155 #define AST_FORMAT_G723_1 (1 << 0) 00156 /*! GSM compression */ 00157 #define AST_FORMAT_GSM (1 << 1) 00158 /*! Raw mu-law data (G.711) */ 00159 #define AST_FORMAT_ULAW (1 << 2) 00160 /*! Raw A-law data (G.711) */ 00161 #define AST_FORMAT_ALAW (1 << 3) 00162 /*! ADPCM (G.726, 32kbps) */ 00163 #define AST_FORMAT_G726 (1 << 4) 00164 /*! ADPCM (IMA) */ 00165 #define AST_FORMAT_ADPCM (1 << 5) 00166 /*! Raw 16-bit Signed Linear (8000 Hz) PCM */ 00167 #define AST_FORMAT_SLINEAR (1 << 6) 00168 /*! LPC10, 180 samples/frame */ 00169 #define AST_FORMAT_LPC10 (1 << 7) 00170 /*! G.729A audio */ 00171 #define AST_FORMAT_G729A (1 << 8) 00172 /*! SpeeX Free Compression */ 00173 #define AST_FORMAT_SPEEX (1 << 9) 00174 /*! iLBC Free Compression */ 00175 #define AST_FORMAT_ILBC (1 << 10) 00176 /*! Maximum audio format */ 00177 #define AST_FORMAT_MAX_AUDIO (1 << 15) 00178 /*! JPEG Images */ 00179 #define AST_FORMAT_JPEG (1 << 16) 00180 /*! PNG Images */ 00181 #define AST_FORMAT_PNG (1 << 17) 00182 /*! H.261 Video */ 00183 #define AST_FORMAT_H261 (1 << 18) 00184 /*! H.263 Video */ 00185 #define AST_FORMAT_H263 (1 << 19) 00186 /*! Max one */ 00187 #define AST_FORMAT_MAX_VIDEO (1 << 24) 00188 00189 /* Control frame types */ 00190 /*! Other end has hungup */ 00191 #define AST_CONTROL_HANGUP 1 00192 /*! Local ring */ 00193 #define AST_CONTROL_RING 2 00194 /*! Remote end is ringing */ 00195 #define AST_CONTROL_RINGING 3 00196 /*! Remote end has answered */ 00197 #define AST_CONTROL_ANSWER 4 00198 /*! Remote end is busy */ 00199 #define AST_CONTROL_BUSY 5 00200 /*! Make it go off hook */ 00201 #define AST_CONTROL_TAKEOFFHOOK 6 00202 /*! Line is off hook */ 00203 #define AST_CONTROL_OFFHOOK 7 00204 /*! Congestion (circuits busy) */ 00205 #define AST_CONTROL_CONGESTION 8 00206 /*! Flash hook */ 00207 #define AST_CONTROL_FLASH 9 00208 /*! Wink */ 00209 #define AST_CONTROL_WINK 10 00210 /*! Set a low-level option */ 00211 #define AST_CONTROL_OPTION 11 00212 /*! Key Radio */ 00213 #define AST_CONTROL_RADIO_KEY 12 00214 /*! Un-Key Radio */ 00215 #define AST_CONTROL_RADIO_UNKEY 13 00216 /*! Indicate PROGRESS */ 00217 #define AST_CONTROL_PROGRESS 14 00218 /*! Indicate CALL PROCEEDING */ 00219 #define AST_CONTROL_PROCEEDING 15 00220 00221 #define AST_SMOOTHER_FLAG_G729 (1 << 0) 00222 00223 /* Option identifiers and flags */ 00224 #define AST_OPTION_FLAG_REQUEST 0 00225 #define AST_OPTION_FLAG_ACCEPT 1 00226 #define AST_OPTION_FLAG_REJECT 2 00227 #define AST_OPTION_FLAG_QUERY 4 00228 #define AST_OPTION_FLAG_ANSWER 5 00229 #define AST_OPTION_FLAG_WTF 6 00230 00231 /* Verify touchtones by muting audio transmission 00232 (and reception) and verify the tone is still present */ 00233 #define AST_OPTION_TONE_VERIFY 1 00234 00235 /* Put a compatible channel into TDD (TTY for the hearing-impared) mode */ 00236 #define AST_OPTION_TDD 2 00237 00238 /* Relax the parameters for DTMF reception (mainly for radio use) */ 00239 #define AST_OPTION_RELAXDTMF 3 00240 00241 /* Set (or clear) Audio (Not-Clear) Mode */ 00242 #define AST_OPTION_AUDIO_MODE 4 00243 00244 struct ast_option_header { 00245 /* Always keep in network byte order */ 00246 #if __BYTE_ORDER == __BIG_ENDIAN 00247 u_int16_t flag:3; 00248 u_int16_t option:13; 00249 #else 00250 #if __BYTE_ORDER == __LITTLE_ENDIAN 00251 u_int16_t option:13; 00252 u_int16_t flag:3; 00253 #else 00254 #error Byte order not defined 00255 #endif 00256 #endif 00257 u_int8_t data[0]; 00258 }; 00259 00260 // Requests a frame to be allocated 00261 /* 00262 * \param source 00263 * Request a frame be allocated. source is an optional source of the frame, 00264 * len is the requested length, or "0" if the caller will supply the buffer 00265 */ 00266 #if 0 /* Unimplemented */ 00267 struct ast_frame *ast_fralloc(char *source, int len); 00268 #endif 00269 00270 //! Frees a frame 00271 /*! 00272 * \param fr Frame to free 00273 * Free a frame, and the memory it used if applicable 00274 * no return. 00275 */ 00276 void ast_frfree(struct ast_frame *fr); 00277 00278 //! Copies a frame 00279 /*! 00280 * \param fr frame to act upon 00281 * Take a frame, and if it's not been malloc'd, make a malloc'd copy 00282 * and if the data hasn't been malloced then make the 00283 * data malloc'd. If you need to store frames, say for queueing, then 00284 * you should call this function. 00285 * Returns a frame on success, NULL on error 00286 */ 00287 struct ast_frame *ast_frisolate(struct ast_frame *fr); 00288 00289 //! Copies a frame 00290 /*! 00291 * \param fr frame to copy 00292 * Dupliates a frame -- should only rarely be used, typically frisolate is good enough 00293 * Returns a frame on success, NULL on error 00294 */ 00295 struct ast_frame *ast_frdup(struct ast_frame *fr); 00296 00297 //! Chains a frame -- unimplemented 00298 #if 0 /* unimplemented */ 00299 void ast_frchain(struct ast_frame_chain *fc); 00300 #endif 00301 00302 //! Reads a frame from an fd 00303 /*! 00304 * \param fd an opened fd to read from 00305 * Read a frame from a stream or packet fd, as written by fd_write 00306 * returns a frame on success, NULL on error 00307 */ 00308 struct ast_frame *ast_fr_fdread(int fd); 00309 00310 //! Writes a frame to an fd 00311 /*! 00312 * \param fd Which fd to write to 00313 * \param frame frame to write to the fd 00314 * Write a frame to an fd 00315 * Returns 0 on success, -1 on failure 00316 */ 00317 int ast_fr_fdwrite(int fd, struct ast_frame *frame); 00318 00319 //! Sends a hangup to an fd 00320 /*! 00321 * \param fd fd to write to 00322 * Send a hangup (NULL equivalent) on an fd 00323 * Returns 0 on success, -1 on failure 00324 */ 00325 int ast_fr_fdhangup(int fd); 00326 00327 //! Get the name of a format 00328 /*! 00329 * \param format id of format 00330 * \return A static string containing the name of the format or "UNKN" if unknown. 00331 */ 00332 extern char* ast_getformatname(int format); 00333 00334 //! Get the names of a set of formats 00335 /*! 00336 * \param buf a buffer for the output string 00337 * \param n size of buf (bytes) 00338 * \param format the format (combined IDs of codecs) 00339 * Prints a list of readable codec names corresponding to "format". 00340 * ex: for format=AST_FORMAT_GSM|AST_FORMAT_SPEEX|AST_FORMAT_ILBC it will return "0x602(GSM|SPEEX|ILBC)" 00341 * \return The return value is buf. 00342 */ 00343 extern char* ast_getformatname_multiple(char *buf, unsigned n, int format); 00344 00345 00346 /*! 00347 * \param name string of format 00348 * Gets a format from a name. 00349 * This returns the form of the format in binary on success, 0 on error. 00350 */ 00351 extern int ast_getformatbyname(char *name); 00352 00353 //! Get a name from a format 00354 /*! 00355 * \param codec codec number (1,2,4,8,16,etc.) 00356 * Gets a name from a format 00357 * This returns a static string identifying the format on success, 0 on error. 00358 */ 00359 extern char *ast_codec2str(int codec); 00360 00361 //! Pick the best codec 00362 /* Choose the best codec... Uhhh... Yah. */ 00363 extern int ast_best_codec(int fmts); 00364 00365 struct ast_smoother; 00366 00367 extern struct ast_smoother *ast_smoother_new(int bytes); 00368 extern void ast_smoother_set_flags(struct ast_smoother *smoother, int flags); 00369 extern int ast_smoother_get_flags(struct ast_smoother *smoother); 00370 extern void ast_smoother_free(struct ast_smoother *s); 00371 extern void ast_smoother_reset(struct ast_smoother *s, int bytes); 00372 extern int ast_smoother_feed(struct ast_smoother *s, struct ast_frame *f); 00373 extern struct ast_frame *ast_smoother_read(struct ast_smoother *s); 00374 00375 extern void ast_frame_dump(char *name, struct ast_frame *f, char *prefix); 00376 00377 #if defined(__cplusplus) || defined(c_plusplus) 00378 } 00379 #endif 00380 00381 00382 #endif

Generated on Fri Sep 24 21:03:47 2004 for Asterisk by doxygen 1.3.8