1 | /* |
2 | Copyright (c) 2012, Broadcom Europe Ltd |
3 | All rights reserved. |
4 | |
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the following conditions are met: |
7 | * Redistributions of source code must retain the above copyright |
8 | notice, this list of conditions and the following disclaimer. |
9 | * Redistributions in binary form must reproduce the above copyright |
10 | notice, this list of conditions and the following disclaimer in the |
11 | documentation and/or other materials provided with the distribution. |
12 | * Neither the name of the copyright holder nor the |
13 | names of its contributors may be used to endorse or promote products |
14 | derived from this software without specific prior written permission. |
15 | |
16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY |
20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ |
27 | |
28 | #ifndef MMAL_BUFFER_H |
29 | #define MMAL_BUFFER_H |
30 | |
31 | #ifdef __cplusplus |
32 | extern "C" { |
33 | #endif |
34 | |
35 | /** \defgroup MmalBufferHeader Buffer headers |
36 | * Definition of a buffer header and its associated API. |
37 | * Buffer headers are the basic element used to pass data and information between different |
38 | * parts of the system. They are passed to components via ports and sent back to the client |
39 | * using a callback mechanism. |
40 | */ |
41 | /* @{ */ |
42 | |
43 | /** Specific data associated with video frames */ |
44 | typedef struct { |
45 | uint32_t planes; /**< Number of planes composing the video frame */ |
46 | uint32_t offset[4]; /**< Offsets to the different planes. These must point within the |
47 | payload buffer */ |
48 | uint32_t pitch[4]; /**< Pitch (size in bytes of a line of a plane) of the different |
49 | planes */ |
50 | uint32_t flags; /**< Flags describing video specific properties of a buffer header |
51 | (see \ref videobufferheaderflags "Video buffer header flags") */ |
52 | /* TBD stereoscopic support */ |
53 | } ; |
54 | |
55 | /** Type specific data that's associated with a payload buffer */ |
56 | typedef union |
57 | { |
58 | /** Specific data associated with video frames */ |
59 | MMAL_BUFFER_HEADER_VIDEO_SPECIFIC_T video; |
60 | |
61 | } ; |
62 | |
63 | /** Definition of the buffer header structure. |
64 | * A buffer header does not directly carry the data to be passed to a component but instead |
65 | * it references the actual data using a pointer (and an associated length). |
66 | * It also contains an internal area which can be used to store command to be associated |
67 | * with the external data. |
68 | */ |
69 | typedef struct |
70 | { |
71 | struct MMAL_BUFFER_HEADER_T *; /**< Used to link several buffer headers together */ |
72 | |
73 | struct *; /**< Data private to the framework */ |
74 | |
75 | uint32_t ; /**< Defines what the buffer header contains. This is a FourCC |
76 | with 0 as a special value meaning stream data */ |
77 | |
78 | uint8_t *; /**< Pointer to the start of the payload buffer (should not be |
79 | changed by component) */ |
80 | uint32_t ; /**< Allocated size in bytes of payload buffer */ |
81 | uint32_t ; /**< Number of bytes currently used in the payload buffer (starting |
82 | from offset) */ |
83 | uint32_t ; /**< Offset in bytes to the start of valid data in the payload buffer */ |
84 | |
85 | uint32_t ; /**< Flags describing properties of a buffer header (see |
86 | \ref bufferheaderflags "Buffer header flags") */ |
87 | |
88 | int64_t ; /**< Presentation timestamp in microseconds. \ref MMAL_TIME_UNKNOWN |
89 | is used when the pts is unknown. */ |
90 | int64_t ; /**< Decode timestamp in microseconds (dts = pts, except in the case |
91 | of video streams with B frames). \ref MMAL_TIME_UNKNOWN |
92 | is used when the dts is unknown. */ |
93 | |
94 | /** Type specific data that's associated with a payload buffer */ |
95 | MMAL_BUFFER_HEADER_TYPE_SPECIFIC_T *; |
96 | |
97 | void *; /**< Field reserved for use by the client */ |
98 | |
99 | } ; |
100 | |
101 | /** \name Buffer header flags |
102 | * \anchor bufferheaderflags |
103 | * The following flags describe properties of a buffer header */ |
104 | /* @{ */ |
105 | /** Signals that the current payload is the end of the stream of data */ |
106 | #define (1<<0) |
107 | /** Signals that the start of the current payload starts a frame */ |
108 | #define (1<<1) |
109 | /** Signals that the end of the current payload ends a frame */ |
110 | #define (1<<2) |
111 | /** Signals that the current payload contains only complete frames (1 or more) */ |
112 | #define (MMAL_BUFFER_HEADER_FLAG_FRAME_START|MMAL_BUFFER_HEADER_FLAG_FRAME_END) |
113 | /** Signals that the current payload is a keyframe (i.e. self decodable) */ |
114 | #define (1<<3) |
115 | /** Signals a discontinuity in the stream of data (e.g. after a seek). |
116 | * Can be used for instance by a decoder to reset its state */ |
117 | #define (1<<4) |
118 | /** Signals a buffer containing some kind of config data for the component |
119 | * (e.g. codec config data) */ |
120 | #define (1<<5) |
121 | /** Signals an encrypted payload */ |
122 | #define (1<<6) |
123 | /** Signals a buffer containing side information */ |
124 | #define (1<<7) |
125 | /** Signals a buffer which is the snapshot/postview image from a stills capture */ |
126 | #define (1<<8) |
127 | /** Signals a buffer which contains data known to be corrupted */ |
128 | #define (1<<9) |
129 | /** Signals that a buffer failed to be transmitted */ |
130 | #define (1<<10) |
131 | /** Signals the output buffer won't be used, just update reference frames */ |
132 | #define (1<<11) |
133 | /** Signals that the end of the current payload ends a NAL */ |
134 | #define (1<<12) |
135 | /** User flags - can be passed in and will get returned */ |
136 | #define (1<<28) |
137 | #define (1<<29) |
138 | #define (1<<30) |
139 | #define (1<<31) |
140 | /* @} */ |
141 | |
142 | /** \name Video buffer header flags |
143 | * \anchor videobufferheaderflags |
144 | * The following flags describe properties of a video buffer header. |
145 | * As there is no collision with the MMAL_BUFFER_HEADER_FLAGS_ defines, these |
146 | * flags will also be present in the MMAL_BUFFER_HEADER_T flags field. |
147 | */ |
148 | #define 16 |
149 | #define (1<<MMAL_BUFFER_HEADER_FLAG_FORMAT_SPECIFIC_START_BIT) |
150 | /* @{ */ |
151 | /** 16: Signals an interlaced video frame */ |
152 | #define (MMAL_BUFFER_HEADER_FLAG_FORMAT_SPECIFIC_START<<0) |
153 | /** 17: Signals that the top field of the current interlaced frame should be displayed first */ |
154 | #define (MMAL_BUFFER_HEADER_FLAG_FORMAT_SPECIFIC_START<<1) |
155 | /** 19: Signals that the buffer should be displayed on external display if attached. */ |
156 | #define (MMAL_BUFFER_HEADER_FLAG_FORMAT_SPECIFIC_START<<3) |
157 | /** 20: Signals that contents of the buffer requires copy protection. */ |
158 | #define (MMAL_BUFFER_HEADER_FLAG_FORMAT_SPECIFIC_START<<4) |
159 | /** 27-24: If non-zero it signals the video frame is encoded in column mode, |
160 | * with a column width equal to 2^<masked value>. |
161 | * Zero is raster order. */ |
162 | #define MMAL_BUFFER_HEADER_VIDEO_FLAG_COLUMN_LOG2_SHIFT (MMAL_BUFFER_HEADER_FLAG_FORMAT_SPECIFIC_START_BIT+8) |
163 | #define MMAL_BUFFER_HEADER_VIDEO_FLAG_COLUMN_LOG2_MASK (0xF<<MMAL_BUFFER_HEADER_VIDEO_FLAG_COLUMN_LOG2_SHIFT) |
164 | /* @} */ |
165 | |
166 | /** Acquire a buffer header. |
167 | * Acquiring a buffer header increases a reference counter on it and makes sure that the |
168 | * buffer header won't be recycled until all the references to it are gone. |
169 | * This is useful for instance if a component needs to return a buffer header but still needs |
170 | * access to it for some internal processing (e.g. reference frames in video codecs). |
171 | * |
172 | * @param header buffer header to acquire |
173 | */ |
174 | void (MMAL_BUFFER_HEADER_T *); |
175 | |
176 | /** Reset a buffer header. |
177 | * Resets all header variables to default values. |
178 | * |
179 | * @param header buffer header to reset |
180 | */ |
181 | void (MMAL_BUFFER_HEADER_T *); |
182 | |
183 | /** Release a buffer header. |
184 | * Releasing a buffer header will decrease its reference counter and when no more references |
185 | * are left, the buffer header will be recycled by calling its 'release' callback function. |
186 | * |
187 | * If a pre-release callback is set (\ref MMAL_BH_PRE_RELEASE_CB_T), this will be invoked |
188 | * before calling the buffer's release callback and potentially postpone buffer recycling. |
189 | * Once pre-release is complete the buffer header is recycled with |
190 | * \ref mmal_buffer_header_release_continue. |
191 | * |
192 | * @param header buffer header to release |
193 | */ |
194 | void (MMAL_BUFFER_HEADER_T *); |
195 | |
196 | /** Continue the buffer header release process. |
197 | * This should be called to complete buffer header recycling once all pre-release activity |
198 | * has been completed. |
199 | * |
200 | * @param header buffer header to release |
201 | */ |
202 | void (MMAL_BUFFER_HEADER_T *); |
203 | |
204 | /** Buffer header pre-release callback. |
205 | * The callback is invoked just before a buffer is released back into a |
206 | * pool. This is used by clients who need to trigger additional actions |
207 | * before the buffer can finally be released (e.g. wait for a bulk transfer |
208 | * to complete). |
209 | * |
210 | * The callback should return TRUE if the buffer release need to be post-poned. |
211 | * |
212 | * @param header buffer header about to be released |
213 | * @param userdata user-specific data |
214 | * |
215 | * @return TRUE if the buffer should not be released |
216 | */ |
217 | typedef MMAL_BOOL_T (*MMAL_BH_PRE_RELEASE_CB_T)(MMAL_BUFFER_HEADER_T *, void *userdata); |
218 | |
219 | /** Set a buffer header pre-release callback. |
220 | * If the callback is NULL, the buffer will be released back into the pool |
221 | * immediately as usual. |
222 | * |
223 | * @param header buffer header to associate callback with |
224 | * @param cb pre-release callback to invoke |
225 | * @param userdata user-specific data |
226 | */ |
227 | void (MMAL_BUFFER_HEADER_T *, MMAL_BH_PRE_RELEASE_CB_T cb, void *userdata); |
228 | |
229 | /** Replicate a buffer header into another one. |
230 | * Replicating a buffer header will not only do an exact copy of all the public fields of the |
231 | * buffer header (including data and alloc_size), but it will also acquire a reference to the |
232 | * source buffer header which will only be released once the replicate has been released. |
233 | * |
234 | * @param dest buffer header into which to replicate |
235 | * @param src buffer header to use as the source for the replication |
236 | * @return MMAL_SUCCESS on success |
237 | */ |
238 | MMAL_STATUS_T (MMAL_BUFFER_HEADER_T *dest, MMAL_BUFFER_HEADER_T *src); |
239 | |
240 | /** Lock the data buffer contained in the buffer header in memory. |
241 | * This call does nothing on all platforms except VideoCore where it is needed to pin a |
242 | * buffer in memory before any access to it. |
243 | * |
244 | * @param header buffer header to lock |
245 | */ |
246 | MMAL_STATUS_T (MMAL_BUFFER_HEADER_T *); |
247 | |
248 | /** Unlock the data buffer contained in the buffer header. |
249 | * This call does nothing on all platforms except VideoCore where it is needed to un-pin a |
250 | * buffer in memory after any access to it. |
251 | * |
252 | * @param header buffer header to unlock |
253 | */ |
254 | void (MMAL_BUFFER_HEADER_T *); |
255 | |
256 | /* @} */ |
257 | |
258 | #ifdef __cplusplus |
259 | } |
260 | #endif |
261 | |
262 | #endif /* MMAL_BUFFER_H */ |
263 | |