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