Version 0.1.0 from FTP
[asterisk/asterisk.git] / include / asterisk / frame.h
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Asterisk internal frame definitions.
5  * 
6  * Copyright (C) 1999, Adtran Inc. and Linux Support Services, LLC
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 #ifndef _ASTERISK_FRAME_H
15 #define _ASTERISK_FRAME_H
16
17 #if defined(__cplusplus) || defined(c_plusplus)
18 extern "C" {
19 #endif
20
21 /* A frame of data read used to communicate between 
22    between channels and applications */
23 struct ast_frame {
24         int frametype;                          /* Kind of frame */
25         int subclass;                           /* Subclass, frame dependent */
26         int datalen;                            /* Length of data */
27         int timelen;                            /* Amount of time associated with this frame */
28         int mallocd;                            /* Was the data malloc'd?  i.e. should we
29                                                                    free it when we discard the frame? */
30         int offset;                                     /* How far into "data" the data really starts */
31         char *src;                                      /* Optional source of frame for debugging */
32         void *data;                                     /* Pointer to actual data */
33 };
34
35 struct ast_frame_chain {
36         /* XXX Should ast_frame chain's be just prt of frames, i.e. should they just link? XXX */
37         struct ast_frame *fr;
38         struct ast_frame_chain *next;
39 };
40
41 #define AST_FRIENDLY_OFFSET     64              /* It's polite for a a new frame to
42                                                                                    have at least this number of bytes
43                                                                                    of offset before your real frame data
44                                                                                    so that additional headers can be
45                                                                                    added. */
46
47 #define AST_MALLOCD_HDR         (1 << 0)        /* Need the header be free'd? */
48 #define AST_MALLOCD_DATA        (1 << 1)        /* Need the data be free'd? */
49 #define AST_MALLOCD_SRC         (1 << 2)        /* Need the source be free'd? (haha!) */
50
51 /* Frame types */
52 #define AST_FRAME_DTMF          1               /* A DTMF digit, subclass is the digit */
53 #define AST_FRAME_VOICE         2               /* Voice data, subclass is AST_FORMAT_* */
54 #define AST_FRAME_VIDEO         3               /* Video frame, maybe?? :) */
55 #define AST_FRAME_CONTROL       4               /* A control frame, subclass is AST_CONTROL_* */
56 #define AST_FRAME_NULL          5               /* An empty, useless frame */
57
58 /* Data formats for capabilities and frames alike */
59 #define AST_FORMAT_G723_1       (1 << 0)        /* G.723.1 compression */
60 #define AST_FORMAT_GSM          (1 << 1)        /* GSM compression */
61 #define AST_FORMAT_ULAW         (1 << 2)        /* Raw mu-law data (G.711) */
62 #define AST_FORMAT_ALAW         (1 << 3)        /* Raw A-law data (G.711) */
63 #define AST_FORMAT_MP3          (1 << 4)        /* MPEG-2 layer 3 */
64 #define AST_FORMAT_ADPCM        (1 << 5)        /* ADPCM */
65 #define AST_FORMAT_SLINEAR      (1 << 6)        /* Raw 16-bit Signed Linear (8000 Hz) PCM */
66 #define AST_FORMAT_MAX_AUDIO (1 << 15)  /* Maximum audio format */
67 #define AST_FORMAT_JPEG         (1 << 16)       /* JPEG Images */
68 #define AST_FORMAT_PNG          (1 << 17)       /* PNG Images */
69 #define AST_FORMAT_H261         (1 << 18)       /* H.261 Video */
70 #define AST_FORMAT_H263         (1 << 19)       /* H.263 Video */
71
72 /* Control frame types */
73 #define AST_CONTROL_HANGUP              1                       /* Other end has hungup */
74 #define AST_CONTROL_RING                2                       /* Local ring */
75 #define AST_CONTROL_RINGING     3                       /* Remote end is ringing */
76 #define AST_CONTROL_ANSWER              4                       /* Remote end has answered */
77 #define AST_CONTROL_BUSY                5                       /* Remote end is busy */
78 #define AST_CONTROL_TAKEOFFHOOK 6                       /* Make it go off hook */
79 #define AST_CONTROL_OFFHOOK             7                       /* Line is off hook */
80
81 /* Request a frame be allocated.  source is an optional source of the frame, 
82    len is the requested length, or "0" if the caller will supply the buffer */
83 struct ast_frame *ast_fralloc(char *source, int len);
84
85 /* Free a frame, and the memory it used if applicable */
86 void ast_frfree(struct ast_frame *fr);
87
88 /* Take a frame, and if it's not been malloc'd, make a malloc'd copy
89    and if the data hasn't been malloced then make the
90    data malloc'd.  If you need to store frames, say for queueing, then
91    you should call this function. */
92 struct ast_frame *ast_frisolate(struct ast_frame *fr);
93
94 void ast_frchain(struct ast_frame_chain *fc);
95
96 #if defined(__cplusplus) || defined(c_plusplus)
97 }
98 #endif
99
100
101 #endif