stream_format.cpp revision 3841a7f4951fe1498bf5ba88466def3ea18f8867
1c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen/*
2c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen * Copyright 2016 The Android Open Source Project
3c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen *
4c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen * Licensed under the Apache License, Version 2.0 (the "License");
5c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen * you may not use this file except in compliance with the License.
6c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen * You may obtain a copy of the License at
7c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen *
8c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen *      http://www.apache.org/licenses/LICENSE-2.0
9c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen *
10c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen * Unless required by applicable law or agreed to in writing, software
11c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen * distributed under the License is distributed on an "AS IS" BASIS,
12c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen * See the License for the specific language governing permissions and
14c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen * limitations under the License.
15c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen */
16c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
173841a7f4951fe1498bf5ba88466def3ea18f8867Ari Hausman-Cohen#include "stream_format.h"
18c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
19c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen#include <linux/videodev2.h>
20c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
213841a7f4951fe1498bf5ba88466def3ea18f8867Ari Hausman-Cohen#include "common.h"
223841a7f4951fe1498bf5ba88466def3ea18f8867Ari Hausman-Cohen#include "stream.h"
23c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
24c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohennamespace v4l2_camera_hal {
25c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
26c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-CohenStreamFormat::StreamFormat(const default_camera_hal::Stream& stream)
27c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    // TODO(b/30000211): multiplanar support.
28c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    : type_(V4L2_BUF_TYPE_VIDEO_CAPTURE),
29c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      v4l2_pixel_format_(
30c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen          StreamFormat::HalToV4L2PixelFormat(stream.getFormat())),
31c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      width_(stream.getWidth()),
32c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      height_(stream.getHeight()),
33c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      bytes_per_line_(0),
34c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      min_buffer_size_(0) {
35c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  HAL_LOG_ENTER();
36c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen}
37c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
38c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-CohenStreamFormat::StreamFormat(const v4l2_format& format)
39c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    : type_(format.type),
40c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      // TODO(b/30000211): multiplanar support.
41c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      v4l2_pixel_format_(format.fmt.pix.pixelformat),
42c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      width_(format.fmt.pix.width),
43c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      height_(format.fmt.pix.height),
44c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      bytes_per_line_(format.fmt.pix.bytesperline),
45c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      min_buffer_size_(format.fmt.pix.sizeimage) {
46c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  HAL_LOG_ENTER();
47c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen}
48c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
49c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohenvoid StreamFormat::FillFormatRequest(v4l2_format* format) const {
50c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  HAL_LOG_ENTER();
51c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
52c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  memset(format, 0, sizeof(*format));
53c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  format->type = type_;
54c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  format->fmt.pix.pixelformat = v4l2_pixel_format_;
55c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  format->fmt.pix.width = width_;
56c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  format->fmt.pix.height = height_;
57c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  // Bytes per line and min buffer size are outputs set by the driver,
58c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  // not part of the request.
59c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen}
60c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
61c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-CohenFormatCategory StreamFormat::Category() const {
62c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  switch (v4l2_pixel_format_) {
63c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    case V4L2_PIX_FMT_JPEG:
64c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      return kFormatCategoryStalling;
65c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    case V4L2_PIX_FMT_YUV420:
66c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      return kFormatCategoryNonStalling;
67c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    default:
68c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      // Note: currently no supported RAW formats.
69c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      return kFormatCategoryUnknown;
70c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  }
71c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen}
72c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
73c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohenbool StreamFormat::operator==(const StreamFormat& other) const {
74c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  // Used to check that a requested format was actually set, so
75c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  // don't compare bytes per line or min buffer size.
76c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  return (type_ == other.type_ &&
77c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen          v4l2_pixel_format_ == other.v4l2_pixel_format_ &&
78c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen          width_ == other.width_ && height_ == other.height_);
79c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen}
80c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
81c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohenbool StreamFormat::operator!=(const StreamFormat& other) const {
82c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  return !(*this == other);
83c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen}
84c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
85c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohenint StreamFormat::V4L2ToHalPixelFormat(uint32_t v4l2_pixel_format) {
86c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  // Translate V4L2 format to HAL format.
87c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  int hal_pixel_format = -1;
88c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  switch (v4l2_pixel_format) {
89c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    case V4L2_PIX_FMT_JPEG:
90c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      hal_pixel_format = HAL_PIXEL_FORMAT_BLOB;
91c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      break;
92c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    case V4L2_PIX_FMT_YUV420:
93c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_888;
94c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      break;
95c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    default:
96c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      // Unrecognized format.
97c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      break;
98c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  }
99c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  return hal_pixel_format;
100c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen}
101c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
102c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohenuint32_t StreamFormat::HalToV4L2PixelFormat(int hal_pixel_format) {
103c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  // Translate HAL format to V4L2 format.
104c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  uint32_t v4l2_pixel_format = 0;
105c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  switch (hal_pixel_format) {
106c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:  // fall-through.
107c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    case HAL_PIXEL_FORMAT_YCbCr_420_888:
108c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      v4l2_pixel_format = V4L2_PIX_FMT_YUV420;
109c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      break;
110c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    case HAL_PIXEL_FORMAT_BLOB:
111c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      v4l2_pixel_format = V4L2_PIX_FMT_JPEG;
112c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      break;
113c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen    default:
114c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      // Unrecognized format.
115c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen      break;
116c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  }
117c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen  return v4l2_pixel_format;
118c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen}
119c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen
120c17fd09be838b093d3de3033c3a65a75b1813e19Ari Hausman-Cohen}  // namespace v4l2_camera_hal
121