2 * Support for Intel Camera Imaging ISP subsystem.
3 * Copyright (c) 2015, Intel Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 #include "ia_css_util.h"
16 #include <ia_css_frame.h>
17 #include <assert_support.h>
18 #include <math_support.h>
20 /* for ia_css_binary_max_vf_width() */
21 #include "ia_css_binary.h"
23 enum ia_css_err ia_css_convert_errno(
26 enum ia_css_err out_err;
30 out_err = IA_CSS_SUCCESS;
33 out_err = IA_CSS_ERR_INVALID_ARGUMENTS;
36 out_err = IA_CSS_ERR_QUEUE_IS_EMPTY;
40 out_err = IA_CSS_ERR_INTERNAL_ERROR;
43 out_err = IA_CSS_ERR_QUEUE_IS_FULL;
46 out_err = IA_CSS_ERR_INTERNAL_ERROR;
52 /* MW: Table look-up ??? */
53 unsigned int ia_css_util_input_format_bpp(
54 enum atomisp_input_format format,
57 unsigned int rval = 0;
60 case ATOMISP_INPUT_FORMAT_YUV420_8_LEGACY:
61 case ATOMISP_INPUT_FORMAT_YUV420_8:
62 case ATOMISP_INPUT_FORMAT_YUV422_8:
63 case ATOMISP_INPUT_FORMAT_RGB_888:
64 case ATOMISP_INPUT_FORMAT_RAW_8:
65 case ATOMISP_INPUT_FORMAT_BINARY_8:
66 case ATOMISP_INPUT_FORMAT_EMBEDDED:
69 case ATOMISP_INPUT_FORMAT_YUV420_10:
70 case ATOMISP_INPUT_FORMAT_YUV422_10:
71 case ATOMISP_INPUT_FORMAT_RAW_10:
74 case ATOMISP_INPUT_FORMAT_YUV420_16:
75 case ATOMISP_INPUT_FORMAT_YUV422_16:
78 case ATOMISP_INPUT_FORMAT_RGB_444:
81 case ATOMISP_INPUT_FORMAT_RGB_555:
84 case ATOMISP_INPUT_FORMAT_RGB_565:
87 case ATOMISP_INPUT_FORMAT_RGB_666:
88 case ATOMISP_INPUT_FORMAT_RAW_6:
91 case ATOMISP_INPUT_FORMAT_RAW_7:
94 case ATOMISP_INPUT_FORMAT_RAW_12:
97 case ATOMISP_INPUT_FORMAT_RAW_14:
103 case ATOMISP_INPUT_FORMAT_RAW_16:
116 enum ia_css_err ia_css_util_check_vf_info(
117 const struct ia_css_frame_info *const info)
120 unsigned int max_vf_width;
123 err = ia_css_frame_check_info(info);
124 if (err != IA_CSS_SUCCESS)
126 max_vf_width = ia_css_binary_max_vf_width();
127 if (max_vf_width != 0 && info->res.width > max_vf_width * 2)
128 return IA_CSS_ERR_INVALID_ARGUMENTS;
129 return IA_CSS_SUCCESS;
132 enum ia_css_err ia_css_util_check_vf_out_info(
133 const struct ia_css_frame_info *const out_info,
134 const struct ia_css_frame_info *const vf_info)
141 err = ia_css_frame_check_info(out_info);
142 if (err != IA_CSS_SUCCESS)
144 err = ia_css_util_check_vf_info(vf_info);
145 if (err != IA_CSS_SUCCESS)
147 return IA_CSS_SUCCESS;
150 enum ia_css_err ia_css_util_check_res(unsigned int width, unsigned int height)
152 /* height can be odd number for jpeg/embedded data from ISYS2401 */
156 return IA_CSS_ERR_INVALID_ARGUMENTS;
158 return IA_CSS_SUCCESS;
162 bool ia_css_util_res_leq(struct ia_css_resolution a, struct ia_css_resolution b)
164 return a.width <= b.width && a.height <= b.height;
168 bool ia_css_util_resolution_is_zero(const struct ia_css_resolution resolution)
170 return (resolution.width == 0) || (resolution.height == 0);
174 bool ia_css_util_resolution_is_even(const struct ia_css_resolution resolution)
176 return IS_EVEN(resolution.height) && IS_EVEN(resolution.width);
179 bool ia_css_util_is_input_format_raw(enum atomisp_input_format format)
181 return ((format == ATOMISP_INPUT_FORMAT_RAW_6) ||
182 (format == ATOMISP_INPUT_FORMAT_RAW_7) ||
183 (format == ATOMISP_INPUT_FORMAT_RAW_8) ||
184 (format == ATOMISP_INPUT_FORMAT_RAW_10) ||
185 (format == ATOMISP_INPUT_FORMAT_RAW_12));
186 /* raw_14 and raw_16 are not supported as input formats to the ISP.
187 * They can only be copied to a frame in memory using the
192 bool ia_css_util_is_input_format_yuv(enum atomisp_input_format format)
194 return format == ATOMISP_INPUT_FORMAT_YUV420_8_LEGACY ||
195 format == ATOMISP_INPUT_FORMAT_YUV420_8 ||
196 format == ATOMISP_INPUT_FORMAT_YUV420_10 ||
197 format == ATOMISP_INPUT_FORMAT_YUV420_16 ||
198 format == ATOMISP_INPUT_FORMAT_YUV422_8 ||
199 format == ATOMISP_INPUT_FORMAT_YUV422_10 ||
200 format == ATOMISP_INPUT_FORMAT_YUV422_16;
203 enum ia_css_err ia_css_util_check_input(
204 const struct ia_css_stream_config *const stream_config,
208 assert(stream_config);
211 return IA_CSS_ERR_INVALID_ARGUMENTS;
213 if (stream_config->input_config.effective_res.width == 0 ||
214 stream_config->input_config.effective_res.height == 0)
215 return IA_CSS_ERR_INVALID_ARGUMENTS;
217 !ia_css_util_is_input_format_raw(stream_config->input_config.format))
218 return IA_CSS_ERR_INVALID_ARGUMENTS;
221 !ia_css_util_is_input_format_yuv(stream_config->input_config.format))
222 return IA_CSS_ERR_INVALID_ARGUMENTS;
224 return IA_CSS_SUCCESS;