Add disp_close, disp_x11_close
[gstreamer-omap: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  */
17
18 #ifndef UTIL_H_
19 #define UTIL_H_
20
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>
28
29 #include <omap_drm.h>
30 #include <omap_drmif.h>
31
32 /* align x to next highest multiple of 2^n */
33 #define ALIGN2(x,n)   (((x) + ((1 << (n)) - 1)) & ~((1 << (n)) - 1))
34
35 typedef enum {
36         false = 0,
37         true = 1
38 } bool;
39
40 #include "list.h"
41
42 /* Display Interface:
43  *
44  * Could be either KMS or X11 depending on build and
45  * environment.  Some of details of opening/connecting, allocating buffers,
46  * etc, differ.  The intention is just to provide as simple as possible
47  * abstraction to avoid lots of duplication in each test app to handle
48  * both cases.
49  */
50
51 struct buffer {
52         uint32_t fourcc, width, height;
53         int nbo;
54         struct omap_bo *bo[4];
55         uint32_t pitches[4];
56         struct list unlocked;
57 };
58
59 struct display {
60         int fd;
61         uint32_t width, height;
62         struct omap_device *dev;
63         struct list unlocked;
64
65         struct buffer ** (*get_buffers)(struct display *disp, uint32_t n);
66         struct buffer ** (*get_vid_buffers)(struct display *disp,
67                         uint32_t n, uint32_t fourcc, uint32_t w, uint32_t h);
68         int (*post_buffer)(struct display *disp, struct buffer *buf);
69         int (*post_vid_buffer)(struct display *disp, struct buffer *buf,
70                         uint32_t x, uint32_t y, uint32_t w, uint32_t h);
71 };
72
73 /* Print display related help */
74 void disp_usage(void);
75
76 /* Open display.. X11 or KMS depending on cmdline args, environment,
77  * and build args
78  */
79 struct display * disp_open(int argc, char **argv);
80
81 /* Close display */
82 void disp_close(struct display *disp);
83
84 /* Get normal RGB/UI buffers (ie. not scaled, not YUV) */
85 static inline struct buffer **
86 disp_get_buffers(struct display *disp, uint32_t n)
87 {
88         return disp->get_buffers(disp, n);
89 }
90
91 /* Get video/overlay buffers (ie. can be YUV, scaled, etc) */
92 struct buffer ** disp_get_vid_buffers(struct display *disp, uint32_t n,
93                 uint32_t fourcc, uint32_t w, uint32_t h);
94
95 /* flip to / post the specified buffer */
96 static inline int
97 disp_post_buffer(struct display *disp, struct buffer *buf)
98 {
99         return disp->post_buffer(disp, buf);
100 }
101
102 /* flip to / post the specified video buffer */
103 static inline int
104 disp_post_vid_buffer(struct display *disp, struct buffer *buf,
105                 uint32_t x, uint32_t y, uint32_t w, uint32_t h)
106 {
107         return disp->post_vid_buffer(disp, buf, x, y, w, h);
108 }
109
110 /* allocate a buffer from pool created by disp_get_vid_buffers() */
111 struct buffer * disp_get_vid_buffer(struct display *disp);
112 /* free to video buffer pool */
113 void disp_put_vid_buffer(struct display *disp, struct buffer *buf);
114
115 /* helper to setup the display for apps that just need video with
116  * no flipchain on the GUI layer
117  */
118 struct buffer * disp_get_fb(struct display *disp);
119
120
121 /* V4L2 utilities:
122  */
123
124 struct v4l2;
125
126 /* Print v4l2 related help */
127 void v4l2_usage(void);
128
129 /* Open v4l2 (and media0??) XXX */
130 struct v4l2 * v4l2_open(int argc, char **argv, uint32_t *fourcc,
131                 uint32_t *width, uint32_t *height);
132
133 /* Share the buffers w/ v4l2 via dmabuf */
134 int v4l2_reqbufs(struct v4l2 *v4l2, struct buffer **bufs, uint32_t n);
135
136 int v4l2_streamon(struct v4l2 *v4l2);
137 int v4l2_streamoff(struct v4l2 *v4l2);
138
139 /* Queue a buffer to the camera */
140 int v4l2_qbuf(struct v4l2 *v4l2, struct buffer *buf);
141
142 /* Dequeue buffer from camera */
143 struct buffer * v4l2_dqbuf(struct v4l2 *v4l2);
144
145 /* Other utilities..
146  */
147
148 int check_args(int argc, char **argv);
149
150 void fill(struct buffer *buf, int i);
151
152 #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 ))
153 #define FOURCC_STR(str)    FOURCC(str[0], str[1], str[2], str[3])
154
155 #define MSG(fmt, ...) \
156                 do { fprintf(stderr, fmt "\n", ##__VA_ARGS__); } while (0)
157 #define ERROR(fmt, ...) \
158                 do { fprintf(stderr, "ERROR:%s:%d: " fmt "\n", __func__, __LINE__, ##__VA_ARGS__); } while (0)
159
160 #ifndef container_of
161 #define container_of(ptr, type, member) \
162     (type *)((char *)(ptr) - (char *) &((type *)0)->member)
163 #endif
164
165 #ifndef MIN
166 #  define MIN(a,b)     (((a) < (b)) ? (a) : (b))
167 #endif
168
169 #ifndef MAX
170 #  define MAX(a,b)     (((a) > (b)) ? (a) : (b))
171 #endif
172
173 #ifndef PAGE_SHIFT
174 #  define PAGE_SHIFT 12
175 #endif
176
177 #ifndef PAGE_SIZE
178 #  define PAGE_SIZE (1 << PAGE_SHIFT)
179 #endif
180
181 /* align x to next highest multiple of 2^n */
182 #define ALIGN2(x,n)   (((x) + ((1 << (n)) - 1)) & ~((1 << (n)) - 1))
183
184 #include <sys/time.h>
185 static inline long
186 mark(long *last)
187 {
188         struct timeval t;
189         gettimeofday(&t, NULL);
190         if (last) {
191                 long delta = t.tv_usec - *last;
192                 *last = t.tv_usec;
193                 return delta;
194         }
195         return t.tv_usec;
196 }
197
198 #endif /* UTIL_H_ */