1e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang/*
2e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * Copyright (C) 2011 The Android Open Source Project
3e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang *
4e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * Licensed under the Apache License, Version 2.0 (the "License");
5e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * you may not use this file except in compliance with the License.
6e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * You may obtain a copy of the License at
7e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang *
8e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang *      http://www.apache.org/licenses/LICENSE-2.0
9e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang *
10e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * Unless required by applicable law or agreed to in writing, software
11e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * distributed under the License is distributed on an "AS IS" BASIS,
12e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * See the License for the specific language governing permissions and
14e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * limitations under the License.
15e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang */
16e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
17e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang/*!
18e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * \file      exynos_v4l2.c
19e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * \brief     source file for libv4l2
20e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * \author    Jinsung Yang (jsgood.yang@samsung.com)
21e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * \author    Sangwoo Park (sw5771.park@samsung.com)
22e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * \date      2012/01/17
23e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang *
24e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * <b>Revision History: </b>
25e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang * - 2012/01/17: Jinsung Yang (jsgood.yang@samsung.com) \n
26e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang *   Initial version
27e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang *
28e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang */
29e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
30e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <stdio.h>
31d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang#include <errno.h>
32e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <stdarg.h>
33e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <fcntl.h>
34e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <string.h>
35e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <sys/types.h>
36e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <sys/ioctl.h>
37e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <sys/stat.h>
38e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
39e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include "exynos_v4l2.h"
40e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
41e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang//#define LOG_NDEBUG 0
42e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#define LOG_TAG "libexynosv4l2"
43e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <utils/Log.h>
44d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang#include "Exynos_log.h"
45e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
46e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#define VIDEODEV_MINOR_MAX 63
47e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
48d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang//#define EXYNOS_V4L2_TRACE 0
49d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang#ifdef EXYNOS_V4L2_TRACE
50d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang#define Exynos_v4l2_In() Exynos_Log(EXYNOS_DEV_LOG_DEBUG, LOG_TAG, "%s In , Line: %d", __FUNCTION__, __LINE__)
51d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang#define Exynos_v4l2_Out() Exynos_Log(EXYNOS_DEV_LOG_DEBUG, LOG_TAG, "%s Out , Line: %d", __FUNCTION__, __LINE__)
52d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang#else
53d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang#define Exynos_v4l2_In() ((void *)0)
54d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang#define Exynos_v4l2_Out() ((void *)0)
55d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang#endif
56d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
57e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changstatic bool __v4l2_check_buf_type(enum v4l2_buf_type type)
58e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
59e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    bool supported;
60e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
61e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    switch (type) {
62e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    case V4L2_BUF_TYPE_VIDEO_CAPTURE:
63e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
64e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    case V4L2_BUF_TYPE_VIDEO_OUTPUT:
65e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
66e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    case V4L2_BUF_TYPE_VIDEO_OVERLAY:
67e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        supported = true;
68e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        break;
69e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
70e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    default:
71e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        supported = (type >= V4L2_BUF_TYPE_PRIVATE) ? true : false;
72e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        break;
73e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
74e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
75e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return supported;
76e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
77e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
78e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changstatic int __v4l2_open(const char *filename, int oflag, va_list ap)
79e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
80e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    mode_t mode = 0;
81e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int fd;
82e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
83e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (oflag & O_CREAT)
84e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        mode = va_arg(ap, int);
85e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
86e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    fd = open(filename, oflag, mode);
87e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
88e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return fd;
89e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
90e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
91e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_open(const char *filename, int oflag, ...)
92e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
93e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    va_list ap;
94e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int fd;
95e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
96d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
97d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
98e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    va_start(ap, oflag);
99e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    fd = __v4l2_open(filename, oflag, ap);
100e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    va_end(ap);
101e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
102d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
103d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
104e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return fd;
105e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
106e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
107e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_open_devname(const char *devname, int oflag, ...)
108e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
109e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    bool found = false;
110e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int fd = -1;
111e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct stat s;
112e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    va_list ap;
113e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    FILE *stream_fd;
114e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    char filename[64], name[64];
115e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int minor, size, i = 0;
116e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
117d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
118d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
119e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    do {
120e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        if (i > VIDEODEV_MINOR_MAX)
121e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            break;
122e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
123e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        /* video device node */
124e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        sprintf(filename, "/dev/video%d", i++);
125e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
126e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        /* if the node is video device */
127e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        if ((lstat(filename, &s) == 0) && S_ISCHR(s.st_mode) &&
128e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                ((int)((unsigned short)(s.st_rdev) >> 8) == 81)) {
129e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            minor = (int)((unsigned short)(s.st_rdev & 0x3f));
1307642c64b6834edd132584e143495b048fe0cadceDima Zavin            ALOGD("try node: %s, minor: %d", filename, minor);
131e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            /* open sysfs entry */
132e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            sprintf(filename, "/sys/class/video4linux/video%d/name", minor);
133e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            stream_fd = fopen(filename, "r");
134d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang            if (stream_fd == NULL) {
1357642c64b6834edd132584e143495b048fe0cadceDima Zavin                ALOGE("failed to open sysfs entry for videodev");
136e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                continue;   /* try next */
137e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            }
138e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
139e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            /* read sysfs entry for device name */
140e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            size = (int)fgets(name, sizeof(name), stream_fd);
141e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            fclose(stream_fd);
142e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
143e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            /* check read size */
144e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            if (size == 0) {
1457642c64b6834edd132584e143495b048fe0cadceDima Zavin                ALOGE("failed to read sysfs entry for videodev");
146e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            } else {
147e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                /* matched */
148e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                if (strncmp(name, devname, strlen(devname)) == 0) {
1497642c64b6834edd132584e143495b048fe0cadceDima Zavin                    ALOGI("node found for device %s: /dev/video%d", devname, minor);
150e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                    found = true;
151e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                }
152e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            }
153e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        }
154e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    } while (found == false);
155e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
156e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (found) {
157e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        sprintf(filename, "/dev/video%d", minor);
158e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        va_start(ap, oflag);
159e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        fd = __v4l2_open(filename, oflag, ap);
160e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        va_end(ap);
161e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
162e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        if (fd > 0)
1637642c64b6834edd132584e143495b048fe0cadceDima Zavin            ALOGI("open video device %s", filename);
164e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        else
1657642c64b6834edd132584e143495b048fe0cadceDima Zavin            ALOGE("failed to open video device %s", filename);
166e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    } else {
1677642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("no video device found");
168e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
169e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
170d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
171d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
172e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return fd;
173e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
174e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
175e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_close(int fd)
176e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
177e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
178e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
179d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
180d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
181e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0)
1827642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
183e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    else
184e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        ret = close(fd);
185e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
186d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
187d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
188e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
189e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
190e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
191e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changbool exynos_v4l2_enuminput(int fd, int index, char *input_name_buf)
192e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
193e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
194e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_input input;
195e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
196d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
197d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
198e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
1997642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
200e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return NULL;
201e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
202e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
203e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    input.index = index;
204e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_ENUMINPUT, &input);
205e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
2067642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: no matching index founds", __func__);
207e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
208e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
209e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
2107642c64b6834edd132584e143495b048fe0cadceDima Zavin    ALOGI("Name of input channel[%d] is %s", input.index, input.name);
211e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
212e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    strcpy(input_name_buf, (const char *)input.name);
213e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
214d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
215d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
216e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return true;
217e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
218e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
219e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_input(int fd, int index)
220e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
221e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
222e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_input input;
223e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
224d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
225d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
226e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
2277642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
228e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
229e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
230e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
231e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    input.index = index;
232e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
233e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_S_INPUT, &input);
234e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret){
235453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_S_INPUT (%d - %s)", errno, strerror(errno));
236e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
237e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
238e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
239d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
240d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
241e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
242e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
243e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
244e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changbool exynos_v4l2_querycap(int fd, unsigned int need_caps)
245e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
246e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_capability cap;
247e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret;
248e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
249d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
250d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
251e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
2527642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
253e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
254e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
255e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
256e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!(need_caps & V4L2_CAP_VIDEO_CAPTURE) &&
257e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            !(need_caps & V4L2_CAP_VIDEO_CAPTURE_MPLANE) &&
258e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            !(need_caps & V4L2_CAP_VIDEO_OUTPUT) &&
259e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            !(need_caps & V4L2_CAP_VIDEO_OUTPUT_MPLANE) &&
260e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            !(need_caps & V4L2_CAP_VIDEO_OVERLAY)) {
2617642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported capabilities", __func__);
262e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
263e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
264e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
265e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    memset(&cap, 0, sizeof(cap));
266e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
267e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);
268e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
269453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_QUERYCAP (%d - %s)", errno, strerror(errno));
270e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
271e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
272e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
273e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if ((need_caps & cap.capabilities) != need_caps) {
2747642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported capabilities", __func__);
275e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
276e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
277e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
278d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
279d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
280e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return true;
281e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
282e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
283e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changbool exynos_v4l2_enum_fmt(int fd, enum v4l2_buf_type type, unsigned int fmt)
284e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
285e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_fmtdesc fmtdesc;
286e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int found = 0;
287e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
288d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
289d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
290e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    fmtdesc.type = type;
291e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    fmtdesc.index = 0;
292e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
293e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    while (ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) == 0) {
294e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        if (fmtdesc.pixelformat == fmt) {
2957642c64b6834edd132584e143495b048fe0cadceDima Zavin            ALOGE("Passed fmt = %#x found pixel format[%d]: %s", fmt, fmtdesc.index, fmtdesc.description);
296e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            found = 1;
297e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            break;
298e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        }
299e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
300e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        fmtdesc.index++;
301e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
302e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
303e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!found) {
3047642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported pixel format", __func__);
305e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
306e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
307e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
308d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
309d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
310e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return true;
311e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
312e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
313e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_g_fmt(int fd, struct v4l2_format *fmt)
314e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
315e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
316e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
317d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
318d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
319e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
3207642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
321e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
322e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
323e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
324e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!fmt) {
3257642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: fmt is NULL", __func__);
326e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
327e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
328e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
329e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(fmt->type) == false) {
3307642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
331e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
332e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
333e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
334e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_G_FMT, fmt);
335e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
336453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_G_FMT (%d - %s)", errno, strerror(errno));
337e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
338e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
339e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
340d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
341d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
342e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
343e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
344e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
345e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changstatic int __v4l2_s_fmt(int fd, unsigned int request, struct v4l2_format *fmt)
346e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
347e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
348e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
349d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
350d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
351e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
3527642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
353e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
354e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
355e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
356e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!fmt) {
3577642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: fmt is NULL", __func__);
358e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
359e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
360e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
361e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(fmt->type) == false) {
3627642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
363e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
364e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    } else {
365e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        ret = ioctl(fd, request, fmt);
366e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        if (ret) {
367e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            if (request == VIDIOC_TRY_FMT)
368453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin                ALOGE("failed to ioctl: VIDIOC_TRY_FMT (%d - %s)", errno, strerror(errno));
369e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            else
370453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin                ALOGE("failed to ioctl: VIDIOC_S_FMT (%d - %s)", errno, strerror(errno));
371e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
372e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            return ret;
373e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        }
374e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
375e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
376d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
377d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
378e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
379e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
380e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
381e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_try_fmt(int fd, struct v4l2_format *fmt)
382e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
383e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return __v4l2_s_fmt(fd, VIDIOC_TRY_FMT, fmt);
384e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
385e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
386e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_fmt(int fd, struct v4l2_format *fmt)
387e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
388e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return __v4l2_s_fmt(fd, VIDIOC_S_FMT, fmt);
389e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
390e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
391e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_reqbufs(int fd, struct v4l2_requestbuffers *req)
392e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
393e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
394e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    unsigned int count;
395e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
396d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
397d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
398e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
3997642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
400e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
401e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
402e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
403e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!req) {
4047642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: req is NULL", __func__);
405e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
406e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
407e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
408471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin    if ((req->memory != V4L2_MEMORY_MMAP) &&
409471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin	(req->memory != V4L2_MEMORY_USERPTR) &&
410471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin	(req->memory != V4L2_MEMORY_DMABUF)) {
4117642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported memory type", __func__);
412e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
413e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
414e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
415e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(req->type) == false) {
4167642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
417e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
418e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
419e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
420e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    count = req->count;
421e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
422e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_REQBUFS, req);
423e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
424453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_REQBUFS (%d - %s)", ret, strerror(errno));
425e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
426e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
427e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
428e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (count != req->count) {
4297642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGW("number of buffers had been changed: %d => %d", count, req->count);
430e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
431e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
432d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
433d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
434e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
435e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
436e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
437e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_querybuf(int fd, struct v4l2_buffer *buf)
438e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
439e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
440e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
441d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
442d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
443e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
4447642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
445e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
446e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
447e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
448e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!buf) {
4497642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: buf is NULL", __func__);
450e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
451e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
452e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
453471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin    if ((buf->memory != V4L2_MEMORY_MMAP) &&
454471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin	(buf->memory != V4L2_MEMORY_DMABUF)) {
4557642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported memory type", __func__);
456e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
457e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
458e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
459e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(buf->type) == false) {
4607642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
461e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
462e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
463e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
464e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_QUERYBUF, buf);
465e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
466453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_QUERYBUF (%d - %s)", errno, strerror(errno));
467e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
468e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
469e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
470d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
471d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
472e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
473e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
474e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
475e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_qbuf(int fd, struct v4l2_buffer *buf)
476e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
477e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
478e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
479d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
480d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
481e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
4827642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
483e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
484e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
485e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
486e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!buf) {
4877642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: buf is NULL", __func__);
488e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
489e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
490e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
491471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin    if ((buf->memory != V4L2_MEMORY_MMAP) &&
492471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin	(buf->memory != V4L2_MEMORY_USERPTR) &&
493471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin	(buf->memory != V4L2_MEMORY_DMABUF)) {
4947642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported memory type", __func__);
495e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
496e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
497e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
498e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(buf->type) == false) {
4997642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
500e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
501e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
502e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
503e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_QBUF, buf);
504e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
505453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_QBUF (%d - %s)", errno, strerror(errno));
506e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
507e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
508e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
509d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
510d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
511e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
512e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
513e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
514e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_dqbuf(int fd, struct v4l2_buffer *buf)
515e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
516e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
517e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
518d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
519d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
520e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
5217642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
522e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
523e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
524e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
525e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!buf) {
5267642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: buf is NULL", __func__);
527e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
528e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
529e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
530471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin    if ((buf->memory != V4L2_MEMORY_MMAP) &&
531471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin	(buf->memory != V4L2_MEMORY_USERPTR) &&
532471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin	(buf->memory != V4L2_MEMORY_DMABUF)) {
5337642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported memory type", __func__);
534e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
535e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
536e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
537e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(buf->type) == false) {
5387642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
539e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
540e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
541e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
542e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_DQBUF, buf);
543e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
544453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_DQBUF (%d - %s)", errno, strerror(errno));
545e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
546e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
547e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
548d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
549d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
550e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
551e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
552e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
553e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_streamon(int fd, enum v4l2_buf_type type)
554e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
555e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
556e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
557d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
558d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
559e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
5607642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
561e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
562e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
563e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
564e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(type) == false) {
5657642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
566e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
567e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
568e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
569e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_STREAMON, &type);
570e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
571453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_STREAMON (%d - %s)", errno, strerror(errno));
572e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
573e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
574e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
575d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
576d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
577e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
578e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
579e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
580e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_streamoff(int fd, enum v4l2_buf_type type)
581e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
582e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
583e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
584d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
585d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
586e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
5877642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
588e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
589e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
590e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
591e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(type) == false) {
5927642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
593e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
594e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
595e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
596e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_STREAMOFF, &type);
597e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
598453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_STREAMOFF (%d - %s)", errno, strerror(errno));
599e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
600e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
601e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
602d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
603d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
604e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
605e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
606e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
607e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_cropcap(int fd, struct v4l2_cropcap *crop)
608e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
609e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
610e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
611d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
612d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
613e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
6147642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
615e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
616e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
617e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
618e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!crop) {
6197642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: crop is NULL", __func__);
620e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
621e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
622e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
623e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(crop->type) == false) {
6247642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
625e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
626e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
627e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
628e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_CROPCAP, crop);
629e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
630453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_CROPCAP (%d - %s)", errno, strerror(errno));
631e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
632e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
633e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
634d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
635d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
636e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
637e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
638e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
639e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_g_crop(int fd, struct v4l2_crop *crop)
640e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
641e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
642e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
643d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
644d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
645e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
6467642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
647e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
648e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
649e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
650e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!crop) {
6517642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: crop is NULL", __func__);
652e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
653e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
654e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
655e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(crop->type) == false) {
6567642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
657e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
658e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
659e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
660e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_G_CROP, crop);
661e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
662453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_G_CROP (%d - %s)", errno, strerror(errno));
663e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
664e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
665e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
666d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
667d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
668e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
669e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
670e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
671e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_crop(int fd, struct v4l2_crop *crop)
672e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
673e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
674e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
675d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
676d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
677e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
6787642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
679e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
680e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
681e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
682e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!crop) {
6837642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: crop is NULL", __func__);
684e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
685e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
686e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
687e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(crop->type) == false) {
6887642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
689e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
690e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
691e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
692e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_S_CROP, crop);
693e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
694453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_S_CROP (%d - %s)", errno, strerror(errno));
695e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
696e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
697e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
698d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
699d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
700e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
701e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
702e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
703e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_g_ctrl(int fd, unsigned int id, int *value)
704e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
705e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
706e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_control ctrl;
707e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
708d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
709d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
710e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ctrl.id = id;
711e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
712e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
7137642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
714e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
715e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
716e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
717e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_G_CTRL, &ctrl);
718e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
719453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_G_CTRL (%d - %s)", errno, strerror(errno));
720e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
721e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
722e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
723e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    *value = ctrl.value;
724e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
725d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
726d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
727e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
728e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
729e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
730e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_ctrl(int fd, unsigned int id, int value)
731e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
732e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
733e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_control ctrl;
734e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
735d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
736d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
737e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ctrl.id = id;
738e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ctrl.value = value;
739e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
740e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
7417642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
742e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
743e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
744e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
745e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_S_CTRL, &ctrl);
746e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
747471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin        ALOGE("failed to ioctl: VIDIOC_S_CTRL (%d)", errno);
748e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
749e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
750e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
751d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
752d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
753e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
754e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
755e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
756e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_g_parm(int fd, struct v4l2_streamparm *streamparm)
757e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
758e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
759e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
760d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
761d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
762e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
7637642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
764e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
765e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
766e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
767e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(streamparm->type) == false) {
7687642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
769e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
770e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
771e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
772e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_G_PARM, streamparm);
773e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
774453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_G_PARM (%d - %s)", errno, strerror(errno));
775e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
776e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
777e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
778d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
779d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
780e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
781e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
782e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
783e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_parm(int fd, struct v4l2_streamparm *streamparm)
784e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
785e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
786e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
787d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
788d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
789e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
7907642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
791e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
792e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
793e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
794e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(streamparm->type) == false) {
7957642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
796e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
797e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
798e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
799e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_S_PARM, streamparm);
800e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
801453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_S_PARM (%d - %s)", errno, strerror(errno));
802e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
803e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
804e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
805d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
806d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
807e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
808e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
809e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
810e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_g_ext_ctrl(int fd, struct v4l2_ext_controls *ctrl)
811e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
812e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
813e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
814d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
815d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
816e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
8177642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
818e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
819e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
820e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
821e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ctrl == NULL) {
8227642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: ctrl is NULL", __func__);
823e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
824e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
825e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
826e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_G_EXT_CTRLS, ctrl);
827e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret)
828453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_G_EXT_CTRLS (%d - %s)", errno, strerror(errno));
829e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
830d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
831d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
832e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
833e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
834e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
835e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_ext_ctrl(int fd, struct v4l2_ext_controls *ctrl)
836e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
837e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
838e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
839d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_In();
840d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
841e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
8427642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
843e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
844e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
845e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
846e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ctrl == NULL) {
8477642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: ctrl is NULL", __func__);
848e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
849e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
850e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
851e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_S_EXT_CTRLS, ctrl);
852e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret)
853453bcedadc94f375f34a3bf64996b5fa97d017a5Dima Zavin        ALOGE("failed to ioctl: VIDIOC_S_EXT_CTRLS (%d - %s)", errno, strerror(errno));
854e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
855d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang    Exynos_v4l2_Out();
856d970bdc0636895887d8a5b3931d39fddd7411317Jiho Chang
857e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
858e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
859