import exynos 7570 bsp
[GitHub/LineageOS/android_hardware_samsung_slsi_exynos.git] / libhwjpeg / libcsc.cpp
1 #include <linux/videodev2.h>
2
3 #include <ui/PixelFormat.h>
4
5 #include <exynos_format.h>
6
7 #include "hwjpeg-internal.h"
8 #include "hwjpeg-libcsc.h"
9
10 int V4L2FMT2HALFMT(int fmt)
11 {
12 switch (fmt) {
13 case V4L2_PIX_FMT_RGB32:
14 return HAL_PIXEL_FORMAT_RGBA_8888;
15 case V4L2_PIX_FMT_RGB24:
16 return HAL_PIXEL_FORMAT_RGB_888;
17 case V4L2_PIX_FMT_RGB565:
18 return HAL_PIXEL_FORMAT_RGB_565;
19 case V4L2_PIX_FMT_BGR32:
20 return HAL_PIXEL_FORMAT_BGRA_8888;
21 case V4L2_PIX_FMT_YVU420M:
22 return HAL_PIXEL_FORMAT_EXYNOS_YV12_M;
23 case V4L2_PIX_FMT_YUV420M:
24 return HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_P_M;
25 case V4L2_PIX_FMT_YVU420:
26 return HAL_PIXEL_FORMAT_YV12;
27 case V4L2_PIX_FMT_YUV420:
28 return HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_P;
29 case V4L2_PIX_FMT_NV16:
30 return HAL_PIXEL_FORMAT_YCbCr_422_SP;
31 case V4L2_PIX_FMT_NV12:
32 return HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP;
33 case V4L2_PIX_FMT_NV12M:
34 return HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M;
35 case V4L2_PIX_FMT_YUYV:
36 return HAL_PIXEL_FORMAT_YCbCr_422_I;
37 case V4L2_PIX_FMT_UYVY:
38 return HAL_PIXEL_FORMAT_EXYNOS_CbYCrY_422_I;
39 case V4L2_PIX_FMT_NV61:
40 return HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_SP;
41 case V4L2_PIX_FMT_NV21M:
42 return HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M;
43 case V4L2_PIX_FMT_NV21:
44 return HAL_PIXEL_FORMAT_YCrCb_420_SP;
45 case V4L2_PIX_FMT_NV12MT_16X16:
46 return HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_TILED;
47 case V4L2_PIX_FMT_YVYU:
48 return HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_I;
49 case V4L2_PIX_FMT_VYUY:
50 return HAL_PIXEL_FORMAT_EXYNOS_CrYCbY_422_I;
51 default:
52 ALOGE("Unkown HAL format %d", fmt);
53 }
54
55 return -1;
56 }
57
58 #define CSC_ERR(ret) (ret != CSC_ErrorNone)
59
60 void CLibCSC::destroy()
61 {
62 if (m_hdlLibCSC) {
63 CSC_ERRORCODE ret = csc_deinit(m_hdlLibCSC);
64 if (CSC_ERR(ret))
65 ALOGE("Failed to deinit LibCSC: %d", ret);
66 m_hdlLibCSC = NULL;
67 }
68 }
69
70 bool CLibCSC::init(int devid)
71 {
72 destroy();
73 m_hdlLibCSC = csc_init(CSC_METHOD_HW);
74 if (!m_hdlLibCSC) {
75 ALOGE("Failed to create CSC handle");
76 return false;
77 }
78
79 CSC_ERRORCODE ret;
80
81 ret = csc_set_method(m_hdlLibCSC, CSC_METHOD_HW);
82 if (CSC_ERR(ret)) {
83 ALOGE("Failed to set CSC method to H/W");
84 return false;
85 }
86
87 ret = csc_set_hw_property(m_hdlLibCSC, CSC_HW_PROPERTY_FIXED_NODE, CSC_HW_SC0 + devid);
88 if (CSC_ERR(ret)) {
89 ALOGE("Failed to set CSC H/W selection to Scaler%d", devid);
90 return false;
91 }
92
93 return true;
94 }
95
96 bool CLibCSC::set_src_format(
97 unsigned int width,
98 unsigned int height,
99 unsigned int crop_left,
100 unsigned int crop_top,
101 unsigned int crop_width,
102 unsigned int crop_height,
103 unsigned int color_format)
104 {
105 CSC_ERRORCODE ret;
106 ret = csc_set_src_format(
107 m_hdlLibCSC, width, height,
108 crop_left, crop_top, crop_width, crop_height, color_format,
109 false);
110 if (CSC_ERR(ret)) {
111 ALOGE("Failed to set source format: %d", ret);
112 return false;
113 }
114
115 return true;
116 }
117
118 bool CLibCSC::set_dst_format(
119 unsigned int width,
120 unsigned int height,
121 unsigned int crop_left,
122 unsigned int crop_top,
123 unsigned int crop_width,
124 unsigned int crop_height,
125 unsigned int color_format)
126 {
127 CSC_ERRORCODE ret;
128 ret = csc_set_dst_format(
129 m_hdlLibCSC, width, height,
130 crop_left, crop_top, crop_width, crop_height, color_format,
131 false);
132 if (CSC_ERR(ret)) {
133 ALOGE("Failed to set source format: %d", ret);
134 return false;
135 }
136
137 return true;
138 }
139
140 bool CLibCSC::set_src_buffer(void *addrs[CSC_MAX_PLANES], int mem_type)
141 {
142 CSC_ERRORCODE ret;
143 ret = csc_set_src_buffer(m_hdlLibCSC, addrs, mem_type);
144 if (CSC_ERR(ret)) {
145 ALOGE("Failed to set source buffer: %d", ret);
146 return false;
147 }
148
149 return true;
150 }
151
152 bool CLibCSC::set_dst_buffer(void *addrs[CSC_MAX_PLANES], int mem_type)
153 {
154 CSC_ERRORCODE ret;
155 ret = csc_set_dst_buffer(m_hdlLibCSC, addrs, mem_type);
156 if (CSC_ERR(ret)) {
157 ALOGE("Failed to set source buffer: %d", ret);
158 return false;
159 }
160
161 return true;
162 }
163
164 bool CLibCSC::convert()
165 {
166 CSC_ERRORCODE ret;
167 ret = csc_convert(m_hdlLibCSC);
168 if (CSC_ERR(ret)) {
169 ALOGE("Failed to convert(): %d", ret);
170 return false;
171 }
172
173 return true;
174 }