exynos_v4l2.c revision 7642c64b6834edd132584e143495b048fe0cadce
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>
31e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <stdarg.h>
32e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <fcntl.h>
33e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <string.h>
34e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <sys/types.h>
35e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <sys/ioctl.h>
36e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <sys/stat.h>
37e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
38e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include "exynos_v4l2.h"
39e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
40e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang//#define LOG_NDEBUG 0
41e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#define LOG_TAG "libexynosv4l2"
42e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#include <utils/Log.h>
43e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
44e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang#define VIDEODEV_MINOR_MAX 63
45e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
46e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changstatic bool __v4l2_check_buf_type(enum v4l2_buf_type type)
47e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
48e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    bool supported;
49e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
50e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    switch (type) {
51e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    case V4L2_BUF_TYPE_VIDEO_CAPTURE:
52e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
53e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    case V4L2_BUF_TYPE_VIDEO_OUTPUT:
54e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
55e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    case V4L2_BUF_TYPE_VIDEO_OVERLAY:
56e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        supported = true;
57e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        break;
58e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
59e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    default:
60e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        supported = (type >= V4L2_BUF_TYPE_PRIVATE) ? true : false;
61e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        break;
62e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
63e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
64e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return supported;
65e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
66e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
67e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changstatic int __v4l2_open(const char *filename, int oflag, va_list ap)
68e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
69e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    mode_t mode = 0;
70e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int fd;
71e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
72e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (oflag & O_CREAT)
73e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        mode = va_arg(ap, int);
74e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
75e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    fd = open(filename, oflag, mode);
76e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
77e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return fd;
78e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
79e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
80e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_open(const char *filename, int oflag, ...)
81e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
82e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    va_list ap;
83e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int fd;
84e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
85e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    va_start(ap, oflag);
86e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    fd = __v4l2_open(filename, oflag, ap);
87e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    va_end(ap);
88e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
89e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return fd;
90e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
91e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
92e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_open_devname(const char *devname, int oflag, ...)
93e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
94e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    bool found = false;
95e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int fd = -1;
96e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct stat s;
97e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    va_list ap;
98e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    FILE *stream_fd;
99e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    char filename[64], name[64];
100e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int minor, size, i = 0;
101e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
102e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    do {
103e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        if (i > VIDEODEV_MINOR_MAX)
104e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            break;
105e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
106e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        /* video device node */
107e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        sprintf(filename, "/dev/video%d", i++);
108e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
109e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        /* if the node is video device */
110e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        if ((lstat(filename, &s) == 0) && S_ISCHR(s.st_mode) &&
111e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                ((int)((unsigned short)(s.st_rdev) >> 8) == 81)) {
112e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            minor = (int)((unsigned short)(s.st_rdev & 0x3f));
1137642c64b6834edd132584e143495b048fe0cadceDima Zavin            ALOGD("try node: %s, minor: %d", filename, minor);
114e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            /* open sysfs entry */
115e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            sprintf(filename, "/sys/class/video4linux/video%d/name", minor);
116e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            stream_fd = fopen(filename, "r");
117e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            if (stream_fd < 0) {
1187642c64b6834edd132584e143495b048fe0cadceDima Zavin                ALOGE("failed to open sysfs entry for videodev");
119e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                continue;   /* try next */
120e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            }
121e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
122e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            /* read sysfs entry for device name */
123e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            size = (int)fgets(name, sizeof(name), stream_fd);
124e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            fclose(stream_fd);
125e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
126e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            /* check read size */
127e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            if (size == 0) {
1287642c64b6834edd132584e143495b048fe0cadceDima Zavin                ALOGE("failed to read sysfs entry for videodev");
129e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            } else {
130e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                /* matched */
131e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                if (strncmp(name, devname, strlen(devname)) == 0) {
1327642c64b6834edd132584e143495b048fe0cadceDima Zavin                    ALOGI("node found for device %s: /dev/video%d", devname, minor);
133e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                    found = true;
134e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang                }
135e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            }
136e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        }
137e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    } while (found == false);
138e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
139e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (found) {
140e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        sprintf(filename, "/dev/video%d", minor);
141e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        va_start(ap, oflag);
142e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        fd = __v4l2_open(filename, oflag, ap);
143e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        va_end(ap);
144e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
145e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        if (fd > 0)
1467642c64b6834edd132584e143495b048fe0cadceDima Zavin            ALOGI("open video device %s", filename);
147e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        else
1487642c64b6834edd132584e143495b048fe0cadceDima Zavin            ALOGE("failed to open video device %s", filename);
149e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    } else {
1507642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("no video device found");
151e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
152e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
153e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return fd;
154e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
155e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
156e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_close(int fd)
157e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
158e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
159e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
160e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0)
1617642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
162e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    else
163e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        ret = close(fd);
164e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
165e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
166e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
167e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
168e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changbool exynos_v4l2_enuminput(int fd, int index, char *input_name_buf)
169e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
170e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
171e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_input input;
172e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
173e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
1747642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
175e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return NULL;
176e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
177e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
178e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    input.index = index;
179e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_ENUMINPUT, &input);
180e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
1817642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: no matching index founds", __func__);
182e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
183e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
184e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
1857642c64b6834edd132584e143495b048fe0cadceDima Zavin    ALOGI("Name of input channel[%d] is %s", input.index, input.name);
186e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
187e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    strcpy(input_name_buf, (const char *)input.name);
188e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
189e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return true;
190e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
191e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
192e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_input(int fd, int index)
193e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
194e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
195e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_input input;
196e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
197e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
1987642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
199e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
200e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
201e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
202e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    input.index = index;
203e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
204e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_S_INPUT, &input);
205e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret){
2067642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_S_INPUT (%d)", ret);
207e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
208e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
209e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
210e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
211e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
212e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
213e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changbool exynos_v4l2_querycap(int fd, unsigned int need_caps)
214e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
215e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_capability cap;
216e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret;
217e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
218e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
2197642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
220e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
221e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
222e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
223e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!(need_caps & V4L2_CAP_VIDEO_CAPTURE) &&
224e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            !(need_caps & V4L2_CAP_VIDEO_CAPTURE_MPLANE) &&
225e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            !(need_caps & V4L2_CAP_VIDEO_OUTPUT) &&
226e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            !(need_caps & V4L2_CAP_VIDEO_OUTPUT_MPLANE) &&
227e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            !(need_caps & V4L2_CAP_VIDEO_OVERLAY)) {
2287642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported capabilities", __func__);
229e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
230e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
231e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
232e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    memset(&cap, 0, sizeof(cap));
233e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
234e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);
235e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
2367642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_QUERYCAP (%d)", ret);
237e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
238e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
239e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
240e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if ((need_caps & cap.capabilities) != need_caps) {
2417642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported capabilities", __func__);
242e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
243e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
244e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
245e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return true;
246e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
247e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
248e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changbool exynos_v4l2_enum_fmt(int fd, enum v4l2_buf_type type, unsigned int fmt)
249e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
250e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_fmtdesc fmtdesc;
251e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int found = 0;
252e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
253e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    fmtdesc.type = type;
254e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    fmtdesc.index = 0;
255e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
256e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    while (ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) == 0) {
257e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        if (fmtdesc.pixelformat == fmt) {
2587642c64b6834edd132584e143495b048fe0cadceDima Zavin            ALOGE("Passed fmt = %#x found pixel format[%d]: %s", fmt, fmtdesc.index, fmtdesc.description);
259e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            found = 1;
260e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            break;
261e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        }
262e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
263e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        fmtdesc.index++;
264e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
265e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
266e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!found) {
2677642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported pixel format", __func__);
268e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return false;
269e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
270e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
271e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return true;
272e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
273e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
274e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_g_fmt(int fd, struct v4l2_format *fmt)
275e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
276e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
277e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
278e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
2797642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
280e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
281e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
282e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
283e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!fmt) {
2847642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: fmt is NULL", __func__);
285e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
286e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
287e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
288e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(fmt->type) == false) {
2897642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
290e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
291e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
292e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
293e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_G_FMT, fmt);
294e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
2957642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_G_FMT");
296e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
297e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
298e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
299e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
300e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
301e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
302e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changstatic int __v4l2_s_fmt(int fd, unsigned int request, struct v4l2_format *fmt)
303e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
304e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
305e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
306e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
3077642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
308e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
309e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
310e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
311e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!fmt) {
3127642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: fmt is NULL", __func__);
313e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
314e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
315e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
316e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(fmt->type) == false) {
3177642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
318e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
319e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    } else {
320e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        ret = ioctl(fd, request, fmt);
321e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        if (ret) {
322e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            if (request == VIDIOC_TRY_FMT)
3237642c64b6834edd132584e143495b048fe0cadceDima Zavin                ALOGE("failed to ioctl: VIDIOC_TRY_FMT (%d)", ret);
324e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            else
3257642c64b6834edd132584e143495b048fe0cadceDima Zavin                ALOGE("failed to ioctl: VIDIOC_S_FMT (%d)", ret);
326e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
327e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang            return ret;
328e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        }
329e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
330e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
331e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
332e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
333e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
334e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_try_fmt(int fd, struct v4l2_format *fmt)
335e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
336e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return __v4l2_s_fmt(fd, VIDIOC_TRY_FMT, fmt);
337e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
338e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
339e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_fmt(int fd, struct v4l2_format *fmt)
340e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
341e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return __v4l2_s_fmt(fd, VIDIOC_S_FMT, fmt);
342e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
343e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
344e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_reqbufs(int fd, struct v4l2_requestbuffers *req)
345e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
346e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
347e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    unsigned int count;
348e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
349e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
3507642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
351e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
352e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
353e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
354e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!req) {
3557642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: req is NULL", __func__);
356e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
357e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
358e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
359e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if ((req->memory != V4L2_MEMORY_MMAP) && (req->memory != V4L2_MEMORY_USERPTR)) {
3607642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported memory type", __func__);
361e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
362e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
363e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
364e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(req->type) == false) {
3657642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
366e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
367e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
368e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
369e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    count = req->count;
370e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
371e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_REQBUFS, req);
372e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
3737642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_REQBUFS (%d)", ret);
374e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
375e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
376e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
377e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (count != req->count) {
3787642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGW("number of buffers had been changed: %d => %d", count, req->count);
379e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
380e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
381e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
382e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
383e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
384e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_querybuf(int fd, struct v4l2_buffer *buf)
385e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
386e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
387e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
388e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
3897642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
390e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
391e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
392e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
393e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!buf) {
3947642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: buf is NULL", __func__);
395e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
396e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
397e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
398e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (buf->memory != V4L2_MEMORY_MMAP) {
3997642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported memory type", __func__);
400e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
401e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
402e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
403e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(buf->type) == false) {
4047642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
405e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
406e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
407e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
408e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_QUERYBUF, buf);
409e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
4107642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_QUERYBUF (%d)", ret);
411e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
412e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
413e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
414e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
415e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
416e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
417e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_qbuf(int fd, struct v4l2_buffer *buf)
418e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
419e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
420e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
421e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
4227642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
423e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
424e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
425e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
426e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!buf) {
4277642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: buf is NULL", __func__);
428e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
429e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
430e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
431e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if ((buf->memory != V4L2_MEMORY_MMAP) && (buf->memory != V4L2_MEMORY_USERPTR)) {
4327642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported memory type", __func__);
433e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
434e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
435e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
436e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(buf->type) == false) {
4377642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
438e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
439e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
440e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
441e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_QBUF, buf);
442e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
4437642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_QBUF (%d)", ret);
444e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
445e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
446e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
447e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
448e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
449e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
450e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_dqbuf(int fd, struct v4l2_buffer *buf)
451e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
452e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
453e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
454e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
4557642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
456e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
457e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
458e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
459e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!buf) {
4607642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: buf is NULL", __func__);
461e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
462e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
463e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
464e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if ((buf->memory != V4L2_MEMORY_MMAP) && (buf->memory != V4L2_MEMORY_USERPTR)) {
4657642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported memory type", __func__);
466e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
467e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
468e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
469e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(buf->type) == false) {
4707642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
471e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
472e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
473e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
474e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_DQBUF, buf);
475e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
4767642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_DQBUF (%d)", ret);
477e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
478e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
479e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
480e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
481e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
482e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
483e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_streamon(int fd, enum v4l2_buf_type type)
484e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
485e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
486e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
487e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
4887642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
489e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
490e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
491e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
492e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(type) == false) {
4937642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
494e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
495e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
496e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
497e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_STREAMON, &type);
498e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
4997642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_STREAMON (%d)", ret);
500e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
501e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
502e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
503e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
504e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
505e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
506e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_streamoff(int fd, enum v4l2_buf_type type)
507e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
508e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
509e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
510e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
5117642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
512e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
513e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
514e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
515e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(type) == false) {
5167642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
517e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
518e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
519e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
520e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_STREAMOFF, &type);
521e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
5227642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_STREAMOFF (%d)", ret);
523e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
524e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
525e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
526e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
527e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
528e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
529e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_cropcap(int fd, struct v4l2_cropcap *crop)
530e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
531e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
532e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
533e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
5347642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
535e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
536e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
537e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
538e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!crop) {
5397642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: crop is NULL", __func__);
540e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
541e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
542e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
543e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(crop->type) == false) {
5447642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
545e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
546e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
547e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
548e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_CROPCAP, crop);
549e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
5507642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_CROPCAP (%d)", ret);
551e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
552e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
553e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
554e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
555e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
556e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
557e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_g_crop(int fd, struct v4l2_crop *crop)
558e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
559e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
560e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
561e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
5627642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
563e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
564e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
565e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
566e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!crop) {
5677642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: crop is NULL", __func__);
568e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
569e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
570e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
571e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(crop->type) == false) {
5727642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
573e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
574e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
575e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
576e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_G_CROP, crop);
577e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
5787642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_G_CROP (%d)", ret);
579e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
580e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
581e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
582e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
583e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
584e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
585e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_crop(int fd, struct v4l2_crop *crop)
586e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
587e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
588e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
589e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
5907642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
591e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
592e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
593e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
594e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (!crop) {
5957642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: crop is NULL", __func__);
596e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
597e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
598e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
599e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(crop->type) == false) {
6007642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
601e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
602e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
603e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
604e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_S_CROP, crop);
605e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
6067642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_S_CROP (%d)", ret);
607e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
608e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
609e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
610e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
611e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
612e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
613e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_g_ctrl(int fd, unsigned int id, int *value)
614e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
615e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
616e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_control ctrl;
617e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
618e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ctrl.id = id;
619e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
620e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
6217642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
622e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
623e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
624e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
625e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_G_CTRL, &ctrl);
626e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
6277642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_G_CTRL (%d)", ret);
628e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
629e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
630e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
631e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    *value = ctrl.value;
632e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
633e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
634e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
635e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
636e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_ctrl(int fd, unsigned int id, int value)
637e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
638e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
639e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    struct v4l2_control ctrl;
640e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
641e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ctrl.id = id;
642e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ctrl.value = value;
643e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
644e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
6457642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
646e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
647e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
648e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
649e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_S_CTRL, &ctrl);
650e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
6517642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_S_CTRL (%d)", ret);
652e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
653e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
654e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
655e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
656e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
657e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
658e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_g_parm(int fd, struct v4l2_streamparm *streamparm)
659e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
660e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
661e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
662e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
6637642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
664e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
665e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
666e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
667e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(streamparm->type) == false) {
6687642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
669e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
670e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
671e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
672e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_G_PARM, streamparm);
673e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
6747642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_G_PARM (%d)", ret);
675e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
676e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
677e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
678e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
679e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
680e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
681e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_parm(int fd, struct v4l2_streamparm *streamparm)
682e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
683e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
684e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
685e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
6867642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
687e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
688e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
689e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
690e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (__v4l2_check_buf_type(streamparm->type) == false) {
6917642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: unsupported buffer type", __func__);
692e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
693e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
694e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
695e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_S_PARM, streamparm);
696e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret) {
6977642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_S_PARM (%d)", ret);
698e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
699e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
700e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
701e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
702e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
703e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
704e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_g_ext_ctrl(int fd, struct v4l2_ext_controls *ctrl)
705e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
706e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
707e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
708e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
7097642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
710e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
711e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
712e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
713e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ctrl == NULL) {
7147642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: ctrl is NULL", __func__);
715e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
716e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
717e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
718e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_G_EXT_CTRLS, ctrl);
719e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret)
7207642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_G_EXT_CTRLS (%d)", ret);
721e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
722e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
723e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
724e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
725e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Changint exynos_v4l2_s_ext_ctrl(int fd, struct v4l2_ext_controls *ctrl)
726e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang{
727e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    int ret = -1;
728e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
729e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (fd < 0) {
7307642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: invalid fd: %d", __func__, fd);
731e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
732e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
733e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
734e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ctrl == NULL) {
7357642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("%s: ctrl is NULL", __func__);
736e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang        return ret;
737e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    }
738e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
739e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    ret = ioctl(fd, VIDIOC_S_EXT_CTRLS, ctrl);
740e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    if (ret)
7417642c64b6834edd132584e143495b048fe0cadceDima Zavin        ALOGE("failed to ioctl: VIDIOC_S_EXT_CTRLS (%d)", ret);
742e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang
743e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang    return ret;
744e5931c34383266bf0faa2c1a2cbc18bac7afeb5fJiho Chang}
745