v4l2: add mcf pipeline setup
[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>
28 #include <omap_drm.h>
29 #include <omap_drmif.h>
32 /* Display Interface:
33  *
34  * Could be either KMS or X11 depending on build and
35  * environment.  Some of details of opening/connecting, allocating buffers,
36  * etc, differ.  The intention is just to provide as simple as possible
37  * abstraction to avoid lots of duplication in each test app to handle
38  * both cases.
39  */
41 struct buffer {
42         uint32_t fourcc, width, height, stride;
43         struct omap_bo *bo;
44 };
46 struct display {
47         int fd;
48         uint32_t width, height;
49         struct omap_device *dev;
51         struct buffer ** (*get_buffers)(struct display *disp, uint32_t n);
52         struct buffer ** (*get_vid_buffers)(struct display *disp,
53                         uint32_t n, uint32_t fourcc, uint32_t w, uint32_t h);
54         int (*post_buffer)(struct display *disp, struct buffer *buf);
55 };
57 /* Print display related help */
58 void disp_usage(void);
60 /* Open display.. X11 or KMS depending on cmdline args, environment,
61  * and build args
62  */
63 struct display * disp_open(int argc, char **argv);
65 /* Get normal RGB/UI buffers (ie. not scaled, not YUV) */
66 static inline struct buffer **
67 disp_get_buffers(struct display *disp, uint32_t n)
68 {
69         return disp->get_buffers(disp, n);
70 }
72 /* Get video/overlay buffers (ie. can be YUV, scaled, etc) */
73 static inline struct buffer **
74 disp_get_vid_buffers(struct display *disp, uint32_t n,
75                 uint32_t fourcc, uint32_t w, uint32_t h)
76 {
77         return disp->get_vid_buffers(disp, n, fourcc, w, h);
78 }
80 /* flip to / post the specified buffer */
81 static inline int
82 disp_post_buffer(struct display *disp, struct buffer *buf)
83 {
84         return disp->post_buffer(disp, buf);
85 }
87 /* V4L2 utilities:
88  */
90 struct v4l2;
92 /* Print v4l2 related help */
93 void v4l2_usage(void);
95 /* Open v4l2 (and media0??) XXX */
96 struct v4l2 * v4l2_open(int argc, char **argv);
98 /* Share the buffers w/ v4l2 via dmabuf */
99 int v4l2_reqbufs(struct v4l2 *v4l2, struct buffer **bufs, uint32_t n);
101 int v4l2_streamon(struct v4l2 *v4l2);
102 int v4l2_streamoff(struct v4l2 *v4l2);
104 /* Queue a buffer to the camera */
105 int v4l2_qbuf(struct v4l2 *v4l2, struct buffer *buf);
107 /* Dequeue buffer from camera */
108 struct buffer * v4l2_dqbuf(struct v4l2 *v4l2);
110 /* Other utilities..
111  */
113 int check_args(int argc, char **argv);
115 void fill(struct buffer *buf, int i);
117 #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 ))
118 #define FOURCC_STR(str)    FOURCC(str[0], str[1], str[2], str[3])
120 #define MSG(fmt, ...) \
121                 do { fprintf(stderr, fmt "\n", ##__VA_ARGS__); } while (0)
122 #define ERROR(fmt, ...) \
123                 do { fprintf(stderr, "ERROR:%s:%d: " fmt "\n", __func__, __LINE__, ##__VA_ARGS__); } while (0)
125 #ifndef container_of
126 #define container_of(ptr, type, member) \
127     (type *)((char *)(ptr) - (char *) &((type *)0)->member)
128 #endif
130 typedef enum {
131         false = 0,
132         true = 1
133 } bool;
135 #endif /* UTIL_H_ */