6b2b357f3492a0650d6f717f26d3a448d8a3dea1
[glsdk/omapdrmtest.git] / util / util.h
1 /*
2  * Copyright (C) 2011 Texas Instruments
3  * Author: Rob Clark <rob.clark@linaro.org>
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 as published by
7  * the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
18 #ifndef UTIL_H_
19 #define UTIL_H_
21 #include <stdio.h>
22 #include <stdint.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <errno.h>
26 #include <unistd.h>
27 #include <assert.h>
29 #include <omap_drm.h>
30 #include <omap_drmif.h>
32 /* align x to next highest multiple of 2^n */
33 #define ALIGN2(x,n)   (((x) + ((1 << (n)) - 1)) & ~((1 << (n)) - 1))
35 #ifndef __cplusplus
36 typedef enum {
37         false = 0,
38         true = 1
39 } bool;
40 #endif
42 #include "list.h"
44 /* Display Interface:
45  *
46  * Could be either KMS or X11 depending on build and
47  * environment.  Some of details of opening/connecting, allocating buffers,
48  * etc, differ.  The intention is just to provide as simple as possible
49  * abstraction to avoid lots of duplication in each test app to handle
50  * both cases.
51  */
53 struct buffer {
54         uint32_t fourcc, width, height;
55         int nbo;
56         struct omap_bo *bo[4];
57         uint32_t pitches[4];
58         struct list unlocked;
59         bool multiplanar;       /* True when Y and U/V are in separate buffers. */
60         int fd[4];              /* dmabuf */
61 };
63 /* State variables, used to maintain the playback rate. */
64 struct rate_control {
65         int fps;                /* When > zero, we maintain playback rate. */
66         long last_frame_mark;   /* The time when the last frame was displayed,
67                                  * as returned by the mark() function. */
68         int usecs_to_sleep;     /* Number of useconds we have slep last frame. */
69 };
71 struct display {
72         int fd;
73         uint32_t width, height;
74         struct omap_device *dev;
75         struct list unlocked;
76         struct rate_control rtctl;
78         struct buffer ** (*get_buffers)(struct display *disp, uint32_t n);
79         struct buffer ** (*get_vid_buffers)(struct display *disp,
80                         uint32_t n, uint32_t fourcc, uint32_t w, uint32_t h);
81         int (*post_buffer)(struct display *disp, struct buffer *buf);
82         int (*post_vid_buffer)(struct display *disp, struct buffer *buf,
83                         uint32_t x, uint32_t y, uint32_t w, uint32_t h);
84         void (*close)(struct display *disp);
85         void (*disp_free_buf) (struct display *disp, uint32_t n);
87         bool multiplanar;       /* True when Y and U/V are in separate buffers. */
88         struct buffer **buf;
89 };
91 /* Print display related help */
92 void disp_usage(void);
94 /* Open display.. X11 or KMS depending on cmdline args, environment,
95  * and build args
96  */
97 struct display * disp_open(int argc, char **argv);
99 /* free allocated buffer */
100 void disp_free_buffers(struct display *disp, uint32_t n);
101 /* Close display */
102 static inline void
103 disp_close(struct display *disp)
105         disp->close(disp);
108 /* Get normal RGB/UI buffers (ie. not scaled, not YUV) */
109 static inline struct buffer **
110 disp_get_buffers(struct display *disp, uint32_t n)
112         return disp->get_buffers(disp, n);
115 /* Get video/overlay buffers (ie. can be YUV, scaled, etc) */
116 struct buffer ** disp_get_vid_buffers(struct display *disp, uint32_t n,
117                 uint32_t fourcc, uint32_t w, uint32_t h);
119 /* flip to / post the specified buffer */
120 int
121 disp_post_buffer(struct display *disp, struct buffer *buf);
123 /* flip to / post the specified video buffer */
124 int
125 disp_post_vid_buffer(struct display *disp, struct buffer *buf,
126                 uint32_t x, uint32_t y, uint32_t w, uint32_t h);
128 /* allocate a buffer from pool created by disp_get_vid_buffers() */
129 struct buffer * disp_get_vid_buffer(struct display *disp);
130 /* free to video buffer pool */
131 void disp_put_vid_buffer(struct display *disp, struct buffer *buf);
133 /* helper to setup the display for apps that just need video with
134  * no flipchain on the GUI layer
135  */
136 struct buffer * disp_get_fb(struct display *disp);
139 /* V4L2 utilities:
140  */
142 struct v4l2;
144 /* Print v4l2 related help */
145 void v4l2_usage(void);
147 /* Open v4l2 (and media0??) XXX */
148 struct v4l2 * v4l2_open(int argc, char **argv, uint32_t *fourcc,
149                 uint32_t *width, uint32_t *height);
151 /* Share the buffers w/ v4l2 via dmabuf */
152 int v4l2_reqbufs(struct v4l2 *v4l2, struct buffer **bufs, uint32_t n);
154 int v4l2_streamon(struct v4l2 *v4l2);
155 int v4l2_streamoff(struct v4l2 *v4l2);
157 /* Queue a buffer to the camera */
158 int v4l2_qbuf(struct v4l2 *v4l2, struct buffer *buf);
160 /* Dequeue buffer from camera */
161 struct buffer * v4l2_dqbuf(struct v4l2 *v4l2);
163 /* Other utilities..
164  */
165 extern int debug;
167 int check_args(int argc, char **argv);
169 void fill(struct buffer *buf, int i);
171 #define FOURCC(a, b, c, d) ((uint32_t)(uint8_t)(a) | ((uint32_t)(uint8_t)(b) << 8) | ((uint32_t)(uint8_t)(c) << 16) | ((uint32_t)(uint8_t)(d) << 24 ))
172 #define FOURCC_STR(str)    FOURCC(str[0], str[1], str[2], str[3])
174 /* Dynamic debug. */
175 #define DBG(fmt, ...) \
176                 do { if (debug) fprintf(stderr, fmt "\n", ##__VA_ARGS__); } while (0)
178 #define MSG(fmt, ...) \
179                 do { fprintf(stderr, fmt "\n", ##__VA_ARGS__); } while (0)
180 #define ERROR(fmt, ...) \
181                 do { fprintf(stderr, "ERROR:%s:%d: " fmt "\n", __func__, __LINE__, ##__VA_ARGS__); } while (0)
183 #ifndef container_of
184 #define container_of(ptr, type, member) \
185     (type *)((char *)(ptr) - (char *) &((type *)0)->member)
186 #endif
188 #ifndef MIN
189 #  define MIN(a,b)     (((a) < (b)) ? (a) : (b))
190 #endif
192 #ifndef MAX
193 #  define MAX(a,b)     (((a) > (b)) ? (a) : (b))
194 #endif
196 #ifndef PAGE_SHIFT
197 #  define PAGE_SHIFT 12
198 #endif
200 #ifndef PAGE_SIZE
201 #  define PAGE_SIZE (1 << PAGE_SHIFT)
202 #endif
204 /* align x to next highest multiple of 2^n */
205 #define ALIGN2(x,n)   (((x) + ((1 << (n)) - 1)) & ~((1 << (n)) - 1))
207 #include <sys/time.h>
208 static inline long
209 mark(long *last)
211         struct timeval t;
212         gettimeofday(&t, NULL);
213         if (last) {
214                 long delta = t.tv_usec - *last;
216                 /* Handle the case, where the seconds have changed.
217                  * TODO: keep the whole timeval struct, to be able to cope with
218                  * more than one second deltas? */
219                 if (t.tv_usec < *last)
220                         delta += 1000000;
222                 *last = t.tv_usec;
223                 return delta;
224         }
225         return t.tv_usec;
228 #endif /* UTIL_H_ */