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