| // Copyright 2014 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| #include <linux/videodev2.h> |
| #include <stdio.h> |
| #include <string.h> |
| |
| #include "label_detect.h" |
| |
| /* Returns true if device fd supports given format of buffer type. |
| * Example of buf_type: V4L2_BUF_TYPE_VIDEO_OUTPUT, |
| * V4L2_BUF_TYPE_VIDEO_CAPTURE. |
| * */ |
| bool is_v4l2_support_format(int fd, |
| enum v4l2_buf_type buf_type, |
| uint32_t fourcc) { |
| int i; |
| bool found = false; |
| char fourcc_str[5]; |
| |
| convert_fourcc_to_str(fourcc, fourcc_str); |
| TRACE("is_v4l2_support_format(%s)\n", fourcc_str); |
| for (i = 0;; ++i) { |
| struct v4l2_fmtdesc format_desc; |
| memset(&format_desc, 0, sizeof(format_desc)); |
| format_desc.type = (enum v4l2_buf_type)buf_type; |
| format_desc.index = i; |
| if (-1 == do_ioctl(fd, VIDIOC_ENUM_FMT, &format_desc)) { |
| break; |
| } |
| convert_fourcc_to_str(format_desc.pixelformat, fourcc_str); |
| TRACE("%s supported\n", fourcc_str); |
| if (format_desc.pixelformat == fourcc) { |
| found = true; |
| /* continue the loop in order to output all supported formats */ |
| } |
| } |
| TRACE("is_v4l2_support_format: %s\n", found ? "true" : "false"); |
| return found; |
| } |
| |
| /* Returns true if device fd is V4L2 video encode/decode device. */ |
| bool is_hw_video_acc_device(int fd) { |
| struct v4l2_capability cap; |
| int ret = do_ioctl(fd, VIDIOC_QUERYCAP, &cap); |
| if (ret == 0) { |
| if ((cap.capabilities & V4L2_CAP_STREAMING) && |
| (cap.capabilities & V4L2_CAP_VIDEO_M2M_MPLANE)) { |
| TRACE("is_hw_video_acc_device: true\n"); |
| return true; |
| } |
| } |
| TRACE("is_hw_video_acc_device: false\n"); |
| return false; |
| } |
| |
| /* Returns true if device fd is V4L2 jpeg encode/decode device. */ |
| bool is_hw_jpeg_acc_device(int fd) { |
| struct v4l2_capability cap; |
| int ret = do_ioctl(fd, VIDIOC_QUERYCAP, &cap); |
| if (ret == 0) { |
| if ((cap.capabilities & V4L2_CAP_STREAMING) && |
| (cap.capabilities & V4L2_CAP_VIDEO_M2M_MPLANE)) { |
| TRACE("is_hw_jpeg_acc_device: true\n"); |
| return true; |
| } |
| } |
| TRACE("is_hw_jpeg_acc_device: false\n"); |
| return false; |
| } |
| |
| /* Returns success or failure of getting resolution. The maximum resolution is |
| returned through arguments. */ |
| bool get_v4l2_max_resolution(int fd, |
| uint32_t fourcc, |
| int32_t* const resolution_width, |
| int32_t* const resolution_height) { |
| *resolution_width = 0; |
| *resolution_height = 0; |
| |
| struct v4l2_frmsizeenum frame_size; |
| memset(&frame_size, 0, sizeof(frame_size)); |
| frame_size.pixel_format = fourcc; |
| |
| for (; do_ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frame_size) == 0; |
| ++frame_size.index) { |
| if (frame_size.type == V4L2_FRMSIZE_TYPE_DISCRETE) { |
| if (frame_size.discrete.width >= *resolution_width && |
| frame_size.discrete.height >= *resolution_height) { |
| *resolution_width = frame_size.discrete.width; |
| *resolution_height = frame_size.discrete.height; |
| } |
| } else if (frame_size.type == V4L2_FRMSIZE_TYPE_STEPWISE || |
| frame_size.type == V4L2_FRMSIZE_TYPE_CONTINUOUS) { |
| *resolution_width = frame_size.stepwise.max_width; |
| *resolution_height = frame_size.stepwise.max_height; |
| break; |
| } |
| } |
| return *resolution_width > 0 && *resolution_height > 0; |
| } |