1/*
2Copyright (c) 2012, Broadcom Europe Ltd
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without
6modification, 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
16THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
20DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23ON 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
25SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*/
27
28#ifndef MMAL_CLOCK_PRIVATE_H
29#define MMAL_CLOCK_PRIVATE_H
30
31#include "interface/mmal/mmal.h"
32#include "interface/mmal/mmal_clock.h"
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38
39/** Handle to a clock. */
40typedef struct MMAL_CLOCK_T
41{
42 void *user_data; /**< Client-supplied data (not used by the clock). */
43} MMAL_CLOCK_T;
44
45/** Create a new instance of a clock.
46 *
47 * @param clock Returned clock
48 *
49 * @return MMAL_SUCCESS on success
50 */
51MMAL_STATUS_T mmal_clock_create(MMAL_CLOCK_T **clock);
52
53/** Destroy a previously created clock.
54 *
55 * @param clock The clock to destroy
56 *
57 * @return MMAL_SUCCESS on success
58 */
59MMAL_STATUS_T mmal_clock_destroy(MMAL_CLOCK_T *clock);
60
61/** Definition of a clock request callback.
62 * This is invoked when the media-time requested by the client is reached.
63 *
64 * @param clock The clock which serviced the request
65 * @param media_time The current media-time
66 * @param cb_data Client-supplied data
67 * @param priv Function pointer used by the framework
68 */
69typedef void (*MMAL_CLOCK_VOID_FP)(void);
70typedef void (*MMAL_CLOCK_REQUEST_CB)(MMAL_CLOCK_T *clock, int64_t media_time, void *cb_data, MMAL_CLOCK_VOID_FP priv);
71
72/** Register a request with the clock.
73 * When the specified media-time is reached, the clock will invoke the supplied callback.
74 *
75 * @param clock The clock
76 * @param media_time The media-time at which the callback should be invoked (microseconds)
77 * @param cb Callback to invoke
78 * @param cb_data Client-supplied callback data
79 * @param priv Function pointer used by the framework
80 *
81 * @return MMAL_SUCCESS on success
82 */
83MMAL_STATUS_T mmal_clock_request_add(MMAL_CLOCK_T *clock, int64_t media_time,
84 MMAL_CLOCK_REQUEST_CB cb, void *cb_data, MMAL_CLOCK_VOID_FP priv);
85
86/** Remove all previously registered clock requests.
87 *
88 * @param clock The clock
89 *
90 * @return MMAL_SUCCESS on success
91 */
92MMAL_STATUS_T mmal_clock_request_flush(MMAL_CLOCK_T *clock);
93
94/** Update the clock's media-time.
95 *
96 * @param clock The clock to update
97 * @param media_time New media-time to be applied (microseconds)
98 *
99 * @return MMAL_SUCCESS on success
100 */
101MMAL_STATUS_T mmal_clock_media_time_set(MMAL_CLOCK_T *clock, int64_t media_time);
102
103/** Set the clock's scale.
104 *
105 * @param clock The clock
106 * @param scale Scale factor
107 *
108 * @return MMAL_SUCCESS on success
109 */
110MMAL_STATUS_T mmal_clock_scale_set(MMAL_CLOCK_T *clock, MMAL_RATIONAL_T scale);
111
112/** Set the clock state.
113 *
114 * @param clock The clock
115 * @param active TRUE -> clock is active and media-time is advancing
116 *
117 * @return MMAL_SUCCESS on success
118 */
119MMAL_STATUS_T mmal_clock_active_set(MMAL_CLOCK_T *clock, MMAL_BOOL_T active);
120
121/** Get the clock's scale.
122 *
123 * @param clock The clock
124 *
125 * @return Current clock scale
126 */
127MMAL_RATIONAL_T mmal_clock_scale_get(MMAL_CLOCK_T *clock);
128
129/** Get the clock's current media-time.
130 * This takes the clock scale and media-time offset into account.
131 *
132 * @param clock The clock to query
133 *
134 * @return Current media-time in microseconds
135 */
136int64_t mmal_clock_media_time_get(MMAL_CLOCK_T *clock);
137
138/** Get the clock's state.
139 *
140 * @param clock The clock to query
141 *
142 * @return TRUE if clock is running (i.e. local media-time is advancing)
143 */
144MMAL_BOOL_T mmal_clock_is_active(MMAL_CLOCK_T *clock);
145
146/** Get the clock's media-time update threshold values.
147 *
148 * @param clock The clock
149 * @param update_threshold Pointer to clock update threshold values to fill
150 *
151 * @return MMAL_SUCCESS on success
152 */
153MMAL_STATUS_T mmal_clock_update_threshold_get(MMAL_CLOCK_T *clock, MMAL_CLOCK_UPDATE_THRESHOLD_T *update_threshold);
154
155/** Set the clock's media-time update threshold values.
156 *
157 * @param clock The clock
158 * @param update_threshold Pointer to new clock update threshold values
159 *
160 * @return MMAL_SUCCESS on success
161 */
162MMAL_STATUS_T mmal_clock_update_threshold_set(MMAL_CLOCK_T *clock, const MMAL_CLOCK_UPDATE_THRESHOLD_T *update_threshold);
163
164/** Get the clock's discontinuity threshold values.
165 *
166 * @param clock The clock
167 * @param discont Pointer to clock discontinuity threshold values to fill
168 *
169 * @return MMAL_SUCCESS on success
170 */
171MMAL_STATUS_T mmal_clock_discont_threshold_get(MMAL_CLOCK_T *clock, MMAL_CLOCK_DISCONT_THRESHOLD_T *discont);
172
173/** Set the clock's discontinuity threshold values.
174 *
175 * @param clock The clock
176 * @param discont Pointer to new clock discontinuity threshold values
177 *
178 * @return MMAL_SUCCESS on success
179 */
180MMAL_STATUS_T mmal_clock_discont_threshold_set(MMAL_CLOCK_T *clock, const MMAL_CLOCK_DISCONT_THRESHOLD_T *discont);
181
182/** Get the clock's request threshold values.
183 *
184 * @param clock The clock
185 * @param future Pointer to clock request threshold values to fill
186 *
187 * @return MMAL_SUCCESS on success
188 */
189MMAL_STATUS_T mmal_clock_request_threshold_get(MMAL_CLOCK_T *clock, MMAL_CLOCK_REQUEST_THRESHOLD_T *req);
190
191/** Set the clock's request threshold values.
192 *
193 * @param clock The clock
194 * @param discont Pointer to new clock request threshold values
195 *
196 * @return MMAL_SUCCESS on success
197 */
198MMAL_STATUS_T mmal_clock_request_threshold_set(MMAL_CLOCK_T *clock, const MMAL_CLOCK_REQUEST_THRESHOLD_T *req);
199
200#ifdef __cplusplus
201}
202#endif
203
204#endif /* MMAL_CLOCK_PRIVATE_H */
205