blob: c2b0131ad4403b119d82efb149e0d3c8facf5a7f [file] [log] [blame]
Jiho Change5931c32012-03-24 05:59:38 +09001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/*!
18 * \file exynos_v4l2.c
19 * \brief source file for libv4l2
20 * \author Jinsung Yang (jsgood.yang@samsung.com)
21 * \author Sangwoo Park (sw5771.park@samsung.com)
22 * \date 2012/01/17
23 *
24 * <b>Revision History: </b>
25 * - 2012/01/17: Jinsung Yang (jsgood.yang@samsung.com) \n
26 * Initial version
27 *
28 */
29
30#include <stdio.h>
Jiho Changd970bdc2012-04-26 15:55:33 -070031#include <errno.h>
Jiho Change5931c32012-03-24 05:59:38 +090032#include <stdarg.h>
33#include <fcntl.h>
34#include <string.h>
35#include <sys/types.h>
36#include <sys/ioctl.h>
37#include <sys/stat.h>
38
39#include "exynos_v4l2.h"
40
41//#define LOG_NDEBUG 0
42#define LOG_TAG "libexynosv4l2"
43#include <utils/Log.h>
Jiho Changd970bdc2012-04-26 15:55:33 -070044#include "Exynos_log.h"
Jiho Change5931c32012-03-24 05:59:38 +090045
46#define VIDEODEV_MINOR_MAX 63
47
Jiho Changd970bdc2012-04-26 15:55:33 -070048//#define EXYNOS_V4L2_TRACE 0
49#ifdef EXYNOS_V4L2_TRACE
50#define Exynos_v4l2_In() Exynos_Log(EXYNOS_DEV_LOG_DEBUG, LOG_TAG, "%s In , Line: %d", __FUNCTION__, __LINE__)
51#define Exynos_v4l2_Out() Exynos_Log(EXYNOS_DEV_LOG_DEBUG, LOG_TAG, "%s Out , Line: %d", __FUNCTION__, __LINE__)
52#else
53#define Exynos_v4l2_In() ((void *)0)
54#define Exynos_v4l2_Out() ((void *)0)
55#endif
56
Jiho Change5931c32012-03-24 05:59:38 +090057static bool __v4l2_check_buf_type(enum v4l2_buf_type type)
58{
59 bool supported;
60
61 switch (type) {
62 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
63 case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
64 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
65 case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
66 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
67 supported = true;
68 break;
69
70 default:
71 supported = (type >= V4L2_BUF_TYPE_PRIVATE) ? true : false;
72 break;
73 }
74
75 return supported;
76}
77
78static int __v4l2_open(const char *filename, int oflag, va_list ap)
79{
80 mode_t mode = 0;
81 int fd;
82
83 if (oflag & O_CREAT)
84 mode = va_arg(ap, int);
85
86 fd = open(filename, oflag, mode);
87
88 return fd;
89}
90
91int exynos_v4l2_open(const char *filename, int oflag, ...)
92{
93 va_list ap;
94 int fd;
95
Jiho Changd970bdc2012-04-26 15:55:33 -070096 Exynos_v4l2_In();
97
Jiho Change5931c32012-03-24 05:59:38 +090098 va_start(ap, oflag);
99 fd = __v4l2_open(filename, oflag, ap);
100 va_end(ap);
101
Jiho Changd970bdc2012-04-26 15:55:33 -0700102 Exynos_v4l2_Out();
103
Jiho Change5931c32012-03-24 05:59:38 +0900104 return fd;
105}
106
107int exynos_v4l2_open_devname(const char *devname, int oflag, ...)
108{
109 bool found = false;
110 int fd = -1;
111 struct stat s;
112 va_list ap;
113 FILE *stream_fd;
114 char filename[64], name[64];
115 int minor, size, i = 0;
116
Jiho Changd970bdc2012-04-26 15:55:33 -0700117 Exynos_v4l2_In();
118
Jiho Change5931c32012-03-24 05:59:38 +0900119 do {
120 if (i > VIDEODEV_MINOR_MAX)
121 break;
122
123 /* video device node */
124 sprintf(filename, "/dev/video%d", i++);
125
126 /* if the node is video device */
127 if ((lstat(filename, &s) == 0) && S_ISCHR(s.st_mode) &&
128 ((int)((unsigned short)(s.st_rdev) >> 8) == 81)) {
129 minor = (int)((unsigned short)(s.st_rdev & 0x3f));
Dima Zavin7642c642012-04-02 23:45:46 -0700130 ALOGD("try node: %s, minor: %d", filename, minor);
Jiho Change5931c32012-03-24 05:59:38 +0900131 /* open sysfs entry */
132 sprintf(filename, "/sys/class/video4linux/video%d/name", minor);
133 stream_fd = fopen(filename, "r");
Jiho Changd970bdc2012-04-26 15:55:33 -0700134 if (stream_fd == NULL) {
Dima Zavin7642c642012-04-02 23:45:46 -0700135 ALOGE("failed to open sysfs entry for videodev");
Jiho Change5931c32012-03-24 05:59:38 +0900136 continue; /* try next */
137 }
138
139 /* read sysfs entry for device name */
140 size = (int)fgets(name, sizeof(name), stream_fd);
141 fclose(stream_fd);
142
143 /* check read size */
144 if (size == 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700145 ALOGE("failed to read sysfs entry for videodev");
Jiho Change5931c32012-03-24 05:59:38 +0900146 } else {
147 /* matched */
148 if (strncmp(name, devname, strlen(devname)) == 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700149 ALOGI("node found for device %s: /dev/video%d", devname, minor);
Jiho Change5931c32012-03-24 05:59:38 +0900150 found = true;
151 }
152 }
153 }
154 } while (found == false);
155
156 if (found) {
157 sprintf(filename, "/dev/video%d", minor);
158 va_start(ap, oflag);
159 fd = __v4l2_open(filename, oflag, ap);
160 va_end(ap);
161
162 if (fd > 0)
Dima Zavin7642c642012-04-02 23:45:46 -0700163 ALOGI("open video device %s", filename);
Jiho Change5931c32012-03-24 05:59:38 +0900164 else
Dima Zavin7642c642012-04-02 23:45:46 -0700165 ALOGE("failed to open video device %s", filename);
Jiho Change5931c32012-03-24 05:59:38 +0900166 } else {
Dima Zavin7642c642012-04-02 23:45:46 -0700167 ALOGE("no video device found");
Jiho Change5931c32012-03-24 05:59:38 +0900168 }
169
Jiho Changd970bdc2012-04-26 15:55:33 -0700170 Exynos_v4l2_Out();
171
Jiho Change5931c32012-03-24 05:59:38 +0900172 return fd;
173}
174
175int exynos_v4l2_close(int fd)
176{
177 int ret = -1;
178
Jiho Changd970bdc2012-04-26 15:55:33 -0700179 Exynos_v4l2_In();
180
Jiho Change5931c32012-03-24 05:59:38 +0900181 if (fd < 0)
Dima Zavin7642c642012-04-02 23:45:46 -0700182 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900183 else
184 ret = close(fd);
185
Jiho Changd970bdc2012-04-26 15:55:33 -0700186 Exynos_v4l2_Out();
187
Jiho Change5931c32012-03-24 05:59:38 +0900188 return ret;
189}
190
191bool exynos_v4l2_enuminput(int fd, int index, char *input_name_buf)
192{
193 int ret = -1;
194 struct v4l2_input input;
195
Jiho Changd970bdc2012-04-26 15:55:33 -0700196 Exynos_v4l2_In();
197
Jiho Change5931c32012-03-24 05:59:38 +0900198 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700199 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900200 return NULL;
201 }
202
203 input.index = index;
204 ret = ioctl(fd, VIDIOC_ENUMINPUT, &input);
205 if (ret) {
Dima Zavin7642c642012-04-02 23:45:46 -0700206 ALOGE("%s: no matching index founds", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900207 return false;
208 }
209
Dima Zavin7642c642012-04-02 23:45:46 -0700210 ALOGI("Name of input channel[%d] is %s", input.index, input.name);
Jiho Change5931c32012-03-24 05:59:38 +0900211
212 strcpy(input_name_buf, (const char *)input.name);
213
Jiho Changd970bdc2012-04-26 15:55:33 -0700214 Exynos_v4l2_Out();
215
Jiho Change5931c32012-03-24 05:59:38 +0900216 return true;
217}
218
219int exynos_v4l2_s_input(int fd, int index)
220{
221 int ret = -1;
222 struct v4l2_input input;
223
Jiho Changd970bdc2012-04-26 15:55:33 -0700224 Exynos_v4l2_In();
225
Jiho Change5931c32012-03-24 05:59:38 +0900226 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700227 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900228 return ret;
229 }
230
231 input.index = index;
232
233 ret = ioctl(fd, VIDIOC_S_INPUT, &input);
234 if (ret){
Dima Zavin453bced2012-06-13 16:30:53 -0700235 ALOGE("failed to ioctl: VIDIOC_S_INPUT (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900236 return ret;
237 }
238
Jiho Changd970bdc2012-04-26 15:55:33 -0700239 Exynos_v4l2_Out();
240
Jiho Change5931c32012-03-24 05:59:38 +0900241 return ret;
242}
243
244bool exynos_v4l2_querycap(int fd, unsigned int need_caps)
245{
246 struct v4l2_capability cap;
247 int ret;
248
Jiho Changd970bdc2012-04-26 15:55:33 -0700249 Exynos_v4l2_In();
250
Jiho Change5931c32012-03-24 05:59:38 +0900251 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700252 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900253 return false;
254 }
255
256 if (!(need_caps & V4L2_CAP_VIDEO_CAPTURE) &&
257 !(need_caps & V4L2_CAP_VIDEO_CAPTURE_MPLANE) &&
258 !(need_caps & V4L2_CAP_VIDEO_OUTPUT) &&
259 !(need_caps & V4L2_CAP_VIDEO_OUTPUT_MPLANE) &&
260 !(need_caps & V4L2_CAP_VIDEO_OVERLAY)) {
Dima Zavin7642c642012-04-02 23:45:46 -0700261 ALOGE("%s: unsupported capabilities", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900262 return false;
263 }
264
265 memset(&cap, 0, sizeof(cap));
266
267 ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);
268 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700269 ALOGE("failed to ioctl: VIDIOC_QUERYCAP (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900270 return false;
271 }
272
273 if ((need_caps & cap.capabilities) != need_caps) {
Dima Zavin7642c642012-04-02 23:45:46 -0700274 ALOGE("%s: unsupported capabilities", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900275 return false;
276 }
277
Jiho Changd970bdc2012-04-26 15:55:33 -0700278 Exynos_v4l2_Out();
279
Jiho Change5931c32012-03-24 05:59:38 +0900280 return true;
281}
282
283bool exynos_v4l2_enum_fmt(int fd, enum v4l2_buf_type type, unsigned int fmt)
284{
285 struct v4l2_fmtdesc fmtdesc;
286 int found = 0;
287
Jiho Changd970bdc2012-04-26 15:55:33 -0700288 Exynos_v4l2_In();
289
Jiho Change5931c32012-03-24 05:59:38 +0900290 fmtdesc.type = type;
291 fmtdesc.index = 0;
292
293 while (ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) == 0) {
294 if (fmtdesc.pixelformat == fmt) {
Dima Zavin7642c642012-04-02 23:45:46 -0700295 ALOGE("Passed fmt = %#x found pixel format[%d]: %s", fmt, fmtdesc.index, fmtdesc.description);
Jiho Change5931c32012-03-24 05:59:38 +0900296 found = 1;
297 break;
298 }
299
300 fmtdesc.index++;
301 }
302
303 if (!found) {
Dima Zavin7642c642012-04-02 23:45:46 -0700304 ALOGE("%s: unsupported pixel format", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900305 return false;
306 }
307
Jiho Changd970bdc2012-04-26 15:55:33 -0700308 Exynos_v4l2_Out();
309
Jiho Change5931c32012-03-24 05:59:38 +0900310 return true;
311}
312
313int exynos_v4l2_g_fmt(int fd, struct v4l2_format *fmt)
314{
315 int ret = -1;
316
Jiho Changd970bdc2012-04-26 15:55:33 -0700317 Exynos_v4l2_In();
318
Jiho Change5931c32012-03-24 05:59:38 +0900319 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700320 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900321 return ret;
322 }
323
324 if (!fmt) {
Dima Zavin7642c642012-04-02 23:45:46 -0700325 ALOGE("%s: fmt is NULL", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900326 return ret;
327 }
328
329 if (__v4l2_check_buf_type(fmt->type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700330 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900331 return ret;
332 }
333
334 ret = ioctl(fd, VIDIOC_G_FMT, fmt);
335 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700336 ALOGE("failed to ioctl: VIDIOC_G_FMT (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900337 return ret;
338 }
339
Jiho Changd970bdc2012-04-26 15:55:33 -0700340 Exynos_v4l2_Out();
341
Jiho Change5931c32012-03-24 05:59:38 +0900342 return ret;
343}
344
345static int __v4l2_s_fmt(int fd, unsigned int request, struct v4l2_format *fmt)
346{
347 int ret = -1;
348
Jiho Changd970bdc2012-04-26 15:55:33 -0700349 Exynos_v4l2_In();
350
Jiho Change5931c32012-03-24 05:59:38 +0900351 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700352 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900353 return ret;
354 }
355
356 if (!fmt) {
Dima Zavin7642c642012-04-02 23:45:46 -0700357 ALOGE("%s: fmt is NULL", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900358 return ret;
359 }
360
361 if (__v4l2_check_buf_type(fmt->type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700362 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900363 return ret;
364 } else {
365 ret = ioctl(fd, request, fmt);
366 if (ret) {
367 if (request == VIDIOC_TRY_FMT)
Dima Zavin453bced2012-06-13 16:30:53 -0700368 ALOGE("failed to ioctl: VIDIOC_TRY_FMT (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900369 else
Dima Zavin453bced2012-06-13 16:30:53 -0700370 ALOGE("failed to ioctl: VIDIOC_S_FMT (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900371
372 return ret;
373 }
374 }
375
Jiho Changd970bdc2012-04-26 15:55:33 -0700376 Exynos_v4l2_Out();
377
Jiho Change5931c32012-03-24 05:59:38 +0900378 return ret;
379}
380
381int exynos_v4l2_try_fmt(int fd, struct v4l2_format *fmt)
382{
383 return __v4l2_s_fmt(fd, VIDIOC_TRY_FMT, fmt);
384}
385
386int exynos_v4l2_s_fmt(int fd, struct v4l2_format *fmt)
387{
388 return __v4l2_s_fmt(fd, VIDIOC_S_FMT, fmt);
389}
390
391int exynos_v4l2_reqbufs(int fd, struct v4l2_requestbuffers *req)
392{
393 int ret = -1;
394 unsigned int count;
395
Jiho Changd970bdc2012-04-26 15:55:33 -0700396 Exynos_v4l2_In();
397
Jiho Change5931c32012-03-24 05:59:38 +0900398 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700399 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900400 return ret;
401 }
402
403 if (!req) {
Dima Zavin7642c642012-04-02 23:45:46 -0700404 ALOGE("%s: req is NULL", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900405 return ret;
406 }
407
Rebecca Schultz Zavin471812b2012-05-15 16:49:56 -0700408 if ((req->memory != V4L2_MEMORY_MMAP) &&
409 (req->memory != V4L2_MEMORY_USERPTR) &&
410 (req->memory != V4L2_MEMORY_DMABUF)) {
Dima Zavin7642c642012-04-02 23:45:46 -0700411 ALOGE("%s: unsupported memory type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900412 return ret;
413 }
414
415 if (__v4l2_check_buf_type(req->type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700416 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900417 return ret;
418 }
419
420 count = req->count;
421
422 ret = ioctl(fd, VIDIOC_REQBUFS, req);
423 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700424 ALOGE("failed to ioctl: VIDIOC_REQBUFS (%d - %s)", ret, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900425 return ret;
426 }
427
428 if (count != req->count) {
Dima Zavin7642c642012-04-02 23:45:46 -0700429 ALOGW("number of buffers had been changed: %d => %d", count, req->count);
Jiho Change5931c32012-03-24 05:59:38 +0900430 }
431
Jiho Changd970bdc2012-04-26 15:55:33 -0700432 Exynos_v4l2_Out();
433
Jiho Change5931c32012-03-24 05:59:38 +0900434 return ret;
435}
436
437int exynos_v4l2_querybuf(int fd, struct v4l2_buffer *buf)
438{
439 int ret = -1;
440
Jiho Changd970bdc2012-04-26 15:55:33 -0700441 Exynos_v4l2_In();
442
Jiho Change5931c32012-03-24 05:59:38 +0900443 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700444 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900445 return ret;
446 }
447
448 if (!buf) {
Dima Zavin7642c642012-04-02 23:45:46 -0700449 ALOGE("%s: buf is NULL", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900450 return ret;
451 }
452
Rebecca Schultz Zavin471812b2012-05-15 16:49:56 -0700453 if ((buf->memory != V4L2_MEMORY_MMAP) &&
454 (buf->memory != V4L2_MEMORY_DMABUF)) {
Dima Zavin7642c642012-04-02 23:45:46 -0700455 ALOGE("%s: unsupported memory type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900456 return ret;
457 }
458
459 if (__v4l2_check_buf_type(buf->type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700460 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900461 return ret;
462 }
463
464 ret = ioctl(fd, VIDIOC_QUERYBUF, buf);
465 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700466 ALOGE("failed to ioctl: VIDIOC_QUERYBUF (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900467 return ret;
468 }
469
Jiho Changd970bdc2012-04-26 15:55:33 -0700470 Exynos_v4l2_Out();
471
Jiho Change5931c32012-03-24 05:59:38 +0900472 return ret;
473}
474
475int exynos_v4l2_qbuf(int fd, struct v4l2_buffer *buf)
476{
477 int ret = -1;
478
Jiho Changd970bdc2012-04-26 15:55:33 -0700479 Exynos_v4l2_In();
480
Jiho Change5931c32012-03-24 05:59:38 +0900481 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700482 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900483 return ret;
484 }
485
486 if (!buf) {
Dima Zavin7642c642012-04-02 23:45:46 -0700487 ALOGE("%s: buf is NULL", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900488 return ret;
489 }
490
Rebecca Schultz Zavin471812b2012-05-15 16:49:56 -0700491 if ((buf->memory != V4L2_MEMORY_MMAP) &&
492 (buf->memory != V4L2_MEMORY_USERPTR) &&
493 (buf->memory != V4L2_MEMORY_DMABUF)) {
Dima Zavin7642c642012-04-02 23:45:46 -0700494 ALOGE("%s: unsupported memory type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900495 return ret;
496 }
497
498 if (__v4l2_check_buf_type(buf->type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700499 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900500 return ret;
501 }
502
503 ret = ioctl(fd, VIDIOC_QBUF, buf);
504 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700505 ALOGE("failed to ioctl: VIDIOC_QBUF (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900506 return ret;
507 }
508
Jiho Changd970bdc2012-04-26 15:55:33 -0700509 Exynos_v4l2_Out();
510
Jiho Change5931c32012-03-24 05:59:38 +0900511 return ret;
512}
513
514int exynos_v4l2_dqbuf(int fd, struct v4l2_buffer *buf)
515{
516 int ret = -1;
517
Jiho Changd970bdc2012-04-26 15:55:33 -0700518 Exynos_v4l2_In();
519
Jiho Change5931c32012-03-24 05:59:38 +0900520 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700521 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900522 return ret;
523 }
524
525 if (!buf) {
Dima Zavin7642c642012-04-02 23:45:46 -0700526 ALOGE("%s: buf is NULL", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900527 return ret;
528 }
529
Rebecca Schultz Zavin471812b2012-05-15 16:49:56 -0700530 if ((buf->memory != V4L2_MEMORY_MMAP) &&
531 (buf->memory != V4L2_MEMORY_USERPTR) &&
532 (buf->memory != V4L2_MEMORY_DMABUF)) {
Dima Zavin7642c642012-04-02 23:45:46 -0700533 ALOGE("%s: unsupported memory type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900534 return ret;
535 }
536
537 if (__v4l2_check_buf_type(buf->type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700538 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900539 return ret;
540 }
541
542 ret = ioctl(fd, VIDIOC_DQBUF, buf);
543 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700544 ALOGE("failed to ioctl: VIDIOC_DQBUF (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900545 return ret;
546 }
547
Jiho Changd970bdc2012-04-26 15:55:33 -0700548 Exynos_v4l2_Out();
549
Jiho Change5931c32012-03-24 05:59:38 +0900550 return ret;
551}
552
553int exynos_v4l2_streamon(int fd, enum v4l2_buf_type type)
554{
555 int ret = -1;
556
Jiho Changd970bdc2012-04-26 15:55:33 -0700557 Exynos_v4l2_In();
558
Jiho Change5931c32012-03-24 05:59:38 +0900559 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700560 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900561 return ret;
562 }
563
564 if (__v4l2_check_buf_type(type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700565 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900566 return ret;
567 }
568
569 ret = ioctl(fd, VIDIOC_STREAMON, &type);
570 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700571 ALOGE("failed to ioctl: VIDIOC_STREAMON (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900572 return ret;
573 }
574
Jiho Changd970bdc2012-04-26 15:55:33 -0700575 Exynos_v4l2_Out();
576
Jiho Change5931c32012-03-24 05:59:38 +0900577 return ret;
578}
579
580int exynos_v4l2_streamoff(int fd, enum v4l2_buf_type type)
581{
582 int ret = -1;
583
Jiho Changd970bdc2012-04-26 15:55:33 -0700584 Exynos_v4l2_In();
585
Jiho Change5931c32012-03-24 05:59:38 +0900586 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700587 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900588 return ret;
589 }
590
591 if (__v4l2_check_buf_type(type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700592 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900593 return ret;
594 }
595
596 ret = ioctl(fd, VIDIOC_STREAMOFF, &type);
597 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700598 ALOGE("failed to ioctl: VIDIOC_STREAMOFF (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900599 return ret;
600 }
601
Jiho Changd970bdc2012-04-26 15:55:33 -0700602 Exynos_v4l2_Out();
603
Jiho Change5931c32012-03-24 05:59:38 +0900604 return ret;
605}
606
607int exynos_v4l2_cropcap(int fd, struct v4l2_cropcap *crop)
608{
609 int ret = -1;
610
Jiho Changd970bdc2012-04-26 15:55:33 -0700611 Exynos_v4l2_In();
612
Jiho Change5931c32012-03-24 05:59:38 +0900613 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700614 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900615 return ret;
616 }
617
618 if (!crop) {
Dima Zavin7642c642012-04-02 23:45:46 -0700619 ALOGE("%s: crop is NULL", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900620 return ret;
621 }
622
623 if (__v4l2_check_buf_type(crop->type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700624 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900625 return ret;
626 }
627
628 ret = ioctl(fd, VIDIOC_CROPCAP, crop);
629 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700630 ALOGE("failed to ioctl: VIDIOC_CROPCAP (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900631 return ret;
632 }
633
Jiho Changd970bdc2012-04-26 15:55:33 -0700634 Exynos_v4l2_Out();
635
Jiho Change5931c32012-03-24 05:59:38 +0900636 return ret;
637}
638
639int exynos_v4l2_g_crop(int fd, struct v4l2_crop *crop)
640{
641 int ret = -1;
642
Jiho Changd970bdc2012-04-26 15:55:33 -0700643 Exynos_v4l2_In();
644
Jiho Change5931c32012-03-24 05:59:38 +0900645 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700646 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900647 return ret;
648 }
649
650 if (!crop) {
Dima Zavin7642c642012-04-02 23:45:46 -0700651 ALOGE("%s: crop is NULL", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900652 return ret;
653 }
654
655 if (__v4l2_check_buf_type(crop->type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700656 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900657 return ret;
658 }
659
660 ret = ioctl(fd, VIDIOC_G_CROP, crop);
661 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700662 ALOGE("failed to ioctl: VIDIOC_G_CROP (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900663 return ret;
664 }
665
Jiho Changd970bdc2012-04-26 15:55:33 -0700666 Exynos_v4l2_Out();
667
Jiho Change5931c32012-03-24 05:59:38 +0900668 return ret;
669}
670
671int exynos_v4l2_s_crop(int fd, struct v4l2_crop *crop)
672{
673 int ret = -1;
674
Jiho Changd970bdc2012-04-26 15:55:33 -0700675 Exynos_v4l2_In();
676
Jiho Change5931c32012-03-24 05:59:38 +0900677 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700678 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900679 return ret;
680 }
681
682 if (!crop) {
Dima Zavin7642c642012-04-02 23:45:46 -0700683 ALOGE("%s: crop is NULL", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900684 return ret;
685 }
686
687 if (__v4l2_check_buf_type(crop->type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700688 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900689 return ret;
690 }
691
692 ret = ioctl(fd, VIDIOC_S_CROP, crop);
693 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700694 ALOGE("failed to ioctl: VIDIOC_S_CROP (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900695 return ret;
696 }
697
Jiho Changd970bdc2012-04-26 15:55:33 -0700698 Exynos_v4l2_Out();
699
Jiho Change5931c32012-03-24 05:59:38 +0900700 return ret;
701}
702
703int exynos_v4l2_g_ctrl(int fd, unsigned int id, int *value)
704{
705 int ret = -1;
706 struct v4l2_control ctrl;
707
Jiho Changd970bdc2012-04-26 15:55:33 -0700708 Exynos_v4l2_In();
709
Jiho Change5931c32012-03-24 05:59:38 +0900710 ctrl.id = id;
711
712 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700713 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900714 return ret;
715 }
716
717 ret = ioctl(fd, VIDIOC_G_CTRL, &ctrl);
718 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700719 ALOGE("failed to ioctl: VIDIOC_G_CTRL (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900720 return ret;
721 }
722
723 *value = ctrl.value;
724
Jiho Changd970bdc2012-04-26 15:55:33 -0700725 Exynos_v4l2_Out();
726
Jiho Change5931c32012-03-24 05:59:38 +0900727 return ret;
728}
729
730int exynos_v4l2_s_ctrl(int fd, unsigned int id, int value)
731{
732 int ret = -1;
733 struct v4l2_control ctrl;
734
Jiho Changd970bdc2012-04-26 15:55:33 -0700735 Exynos_v4l2_In();
736
Jiho Change5931c32012-03-24 05:59:38 +0900737 ctrl.id = id;
738 ctrl.value = value;
739
740 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700741 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900742 return ret;
743 }
744
745 ret = ioctl(fd, VIDIOC_S_CTRL, &ctrl);
746 if (ret) {
Rebecca Schultz Zavin471812b2012-05-15 16:49:56 -0700747 ALOGE("failed to ioctl: VIDIOC_S_CTRL (%d)", errno);
Jiho Change5931c32012-03-24 05:59:38 +0900748 return ret;
749 }
750
Jiho Changd970bdc2012-04-26 15:55:33 -0700751 Exynos_v4l2_Out();
752
Jiho Change5931c32012-03-24 05:59:38 +0900753 return ret;
754}
755
756int exynos_v4l2_g_parm(int fd, struct v4l2_streamparm *streamparm)
757{
758 int ret = -1;
759
Jiho Changd970bdc2012-04-26 15:55:33 -0700760 Exynos_v4l2_In();
761
Jiho Change5931c32012-03-24 05:59:38 +0900762 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700763 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900764 return ret;
765 }
766
767 if (__v4l2_check_buf_type(streamparm->type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700768 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900769 return ret;
770 }
771
772 ret = ioctl(fd, VIDIOC_G_PARM, streamparm);
773 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700774 ALOGE("failed to ioctl: VIDIOC_G_PARM (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900775 return ret;
776 }
777
Jiho Changd970bdc2012-04-26 15:55:33 -0700778 Exynos_v4l2_Out();
779
Jiho Change5931c32012-03-24 05:59:38 +0900780 return ret;
781}
782
783int exynos_v4l2_s_parm(int fd, struct v4l2_streamparm *streamparm)
784{
785 int ret = -1;
786
Jiho Changd970bdc2012-04-26 15:55:33 -0700787 Exynos_v4l2_In();
788
Jiho Change5931c32012-03-24 05:59:38 +0900789 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700790 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900791 return ret;
792 }
793
794 if (__v4l2_check_buf_type(streamparm->type) == false) {
Dima Zavin7642c642012-04-02 23:45:46 -0700795 ALOGE("%s: unsupported buffer type", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900796 return ret;
797 }
798
799 ret = ioctl(fd, VIDIOC_S_PARM, streamparm);
800 if (ret) {
Dima Zavin453bced2012-06-13 16:30:53 -0700801 ALOGE("failed to ioctl: VIDIOC_S_PARM (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900802 return ret;
803 }
804
Jiho Changd970bdc2012-04-26 15:55:33 -0700805 Exynos_v4l2_Out();
806
Jiho Change5931c32012-03-24 05:59:38 +0900807 return ret;
808}
809
810int exynos_v4l2_g_ext_ctrl(int fd, struct v4l2_ext_controls *ctrl)
811{
812 int ret = -1;
813
Jiho Changd970bdc2012-04-26 15:55:33 -0700814 Exynos_v4l2_In();
815
Jiho Change5931c32012-03-24 05:59:38 +0900816 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700817 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900818 return ret;
819 }
820
821 if (ctrl == NULL) {
Dima Zavin7642c642012-04-02 23:45:46 -0700822 ALOGE("%s: ctrl is NULL", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900823 return ret;
824 }
825
826 ret = ioctl(fd, VIDIOC_G_EXT_CTRLS, ctrl);
827 if (ret)
Dima Zavin453bced2012-06-13 16:30:53 -0700828 ALOGE("failed to ioctl: VIDIOC_G_EXT_CTRLS (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900829
Jiho Changd970bdc2012-04-26 15:55:33 -0700830 Exynos_v4l2_Out();
831
Jiho Change5931c32012-03-24 05:59:38 +0900832 return ret;
833}
834
835int exynos_v4l2_s_ext_ctrl(int fd, struct v4l2_ext_controls *ctrl)
836{
837 int ret = -1;
838
Jiho Changd970bdc2012-04-26 15:55:33 -0700839 Exynos_v4l2_In();
840
Jiho Change5931c32012-03-24 05:59:38 +0900841 if (fd < 0) {
Dima Zavin7642c642012-04-02 23:45:46 -0700842 ALOGE("%s: invalid fd: %d", __func__, fd);
Jiho Change5931c32012-03-24 05:59:38 +0900843 return ret;
844 }
845
846 if (ctrl == NULL) {
Dima Zavin7642c642012-04-02 23:45:46 -0700847 ALOGE("%s: ctrl is NULL", __func__);
Jiho Change5931c32012-03-24 05:59:38 +0900848 return ret;
849 }
850
851 ret = ioctl(fd, VIDIOC_S_EXT_CTRLS, ctrl);
852 if (ret)
Dima Zavin453bced2012-06-13 16:30:53 -0700853 ALOGE("failed to ioctl: VIDIOC_S_EXT_CTRLS (%d - %s)", errno, strerror(errno));
Jiho Change5931c32012-03-24 05:59:38 +0900854
Jiho Changd970bdc2012-04-26 15:55:33 -0700855 Exynos_v4l2_Out();
856
Jiho Change5931c32012-03-24 05:59:38 +0900857 return ret;
858}