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