Move printing functions to main.c
[media-ctl.git] / subdev.c
1 /*
2  * Media controller test application
3  *
4  * Copyright (C) 2010 Ideas on board SPRL <laurent.pinchart@ideasonboard.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  */
19
20 #include <sys/ioctl.h>
21 #include <sys/stat.h>
22 #include <sys/types.h>
23
24 #include <errno.h>
25 #include <fcntl.h>
26 #include <stdio.h>
27 #include <string.h>
28 #include <unistd.h>
29
30 #include <linux/v4l2-subdev.h>
31
32 #include "media.h"
33 #include "subdev.h"
34 #include "tools.h"
35
36 static int v4l2_subdev_open(struct media_entity *entity)
37 {
38         if (entity->fd != -1)
39                 return 0;
40
41         entity->fd = open(entity->devname, O_RDWR);
42         if (entity->fd == -1) {
43                 printf("%s: Failed to open subdev device node %s\n", __func__,
44                         entity->devname);
45                 return -errno;
46         }
47
48         return 0;
49 }
50
51 int v4l2_subdev_get_format(struct media_entity *entity,
52         struct v4l2_mbus_framefmt *format, unsigned int pad,
53         enum v4l2_subdev_format_whence which)
54 {
55         struct v4l2_subdev_format fmt;
56         int ret;
57
58         ret = v4l2_subdev_open(entity);
59         if (ret < 0)
60                 return ret;
61
62         memset(&fmt, 0, sizeof(fmt));
63         fmt.pad = pad;
64         fmt.which = which;
65
66         ret = ioctl(entity->fd, VIDIOC_SUBDEV_G_FMT, &fmt);
67         if (ret < 0)
68                 return -errno;
69
70         *format = fmt.format;
71         return 0;
72 }
73
74 int v4l2_subdev_set_format(struct media_entity *entity,
75         struct v4l2_mbus_framefmt *format, unsigned int pad,
76         enum v4l2_subdev_format_whence which)
77 {
78         struct v4l2_subdev_format fmt;
79         int ret;
80
81         ret = v4l2_subdev_open(entity);
82         if (ret < 0)
83                 return ret;
84
85         memset(&fmt, 0, sizeof(fmt));
86         fmt.pad = pad;
87         fmt.which = which;
88         fmt.format = *format;
89
90         ret = ioctl(entity->fd, VIDIOC_SUBDEV_S_FMT, &fmt);
91         if (ret < 0)
92                 return -errno;
93
94         *format = fmt.format;
95         return 0;
96 }
97
98 int v4l2_subdev_get_crop(struct media_entity *entity, struct v4l2_rect *rect,
99                          unsigned int pad, enum v4l2_subdev_format_whence which)
100 {
101         struct v4l2_subdev_crop crop;
102         int ret;
103
104         ret = v4l2_subdev_open(entity);
105         if (ret < 0)
106                 return ret;
107
108         memset(&crop, 0, sizeof(crop));
109         crop.pad = pad;
110         crop.which = which;
111
112         ret = ioctl(entity->fd, VIDIOC_SUBDEV_G_CROP, &crop);
113         if (ret < 0)
114                 return -errno;
115
116         *rect = crop.rect;
117         return 0;
118 }
119
120 int v4l2_subdev_set_crop(struct media_entity *entity, struct v4l2_rect *rect,
121                          unsigned int pad, enum v4l2_subdev_format_whence which)
122 {
123         struct v4l2_subdev_crop crop;
124         int ret;
125
126         ret = v4l2_subdev_open(entity);
127         if (ret < 0)
128                 return ret;
129
130         memset(&crop, 0, sizeof(crop));
131         crop.pad = pad;
132         crop.which = which;
133         crop.rect = *rect;
134
135         ret = ioctl(entity->fd, VIDIOC_SUBDEV_S_CROP, &crop);
136         if (ret < 0)
137                 return -errno;
138
139         *rect = crop.rect;
140         return 0;
141 }
142
143 int v4l2_subdev_set_frame_interval(struct media_entity *entity,
144                                    struct v4l2_fract *interval)
145 {
146         struct v4l2_subdev_frame_interval ival;
147         int ret;
148
149         ret = v4l2_subdev_open(entity);
150         if (ret < 0)
151                 return ret;
152
153         memset(&ival, 0, sizeof(ival));
154         ival.interval = *interval;
155
156         ret = ioctl(entity->fd, VIDIOC_SUBDEV_S_FRAME_INTERVAL, &ival);
157         if (ret < 0)
158                 return -errno;
159
160         *interval = ival.interval;
161         return 0;
162 }