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 Thu Oct 28 11:32:54 2004 for Asterisk by doxygen1.2.15