Removed TRUE and FALSE defines from 3rdparty code
[unified-camera-hal:unified-camera-hal.git] / src / 3rdparty / NV12_resize.cpp
1 #include "NV12_resize.h"
2
3 //#define LOG_NDEBUG 0
4 #define LOG_NIDEBUG 0
5 #define LOG_NDDEBUG 0
6
7 #ifdef LOG_TAG
8 #undef LOG_TAG
9 #endif
10 #define LOG_TAG "NV12_resize"
11
12 #define STRIDE 4096
13 #include <utils/Log.h>
14
15 /*==========================================================================
16 * Function Name  : VT_resizeFrame_Video_opt2_lp
17 *
18 * Description    : Resize a yuv frame.
19 *
20 * Input(s)       : input_img_ptr        -> Input Image Structure
21 *                : output_img_ptr       -> Output Image Structure
22 *                : cropout             -> crop structure
23 *
24 * Value Returned : mmBool               -> FALSE on error TRUE on success
25 * NOTE:
26 *            Not tested for crop funtionallity.
27 *            faster version.
28 ============================================================================*/
29 mmBool
30 VT_resizeFrame_Video_opt2_lp
31 (
32  structConvImage* i_img_ptr,        /* Points to the input image           */
33  structConvImage* o_img_ptr,        /* Points to the output image          */
34  IC_rect_type*  cropout,          /* how much to resize to in final image */
35  mmUint16 dummy                         /* Transparent pixel value              */
36  )
37 {
38   LOGV("VT_resizeFrame_Video_opt2_lp+");
39
40   mmUint16 row,col;
41   mmUint32 resizeFactorX;
42   mmUint32 resizeFactorY;
43
44
45   mmUint16 x, y;
46
47   mmUchar* ptr8;
48   mmUchar *ptr8Cb, *ptr8Cr;
49
50
51   mmUint16 xf, yf;
52   mmUchar* inImgPtrY;
53   mmUchar* inImgPtrU;
54   mmUchar* inImgPtrV;
55   mmUint32 cox, coy, codx, cody;
56   mmUint16 idx,idy, idxC;
57
58   if(i_img_ptr->uWidth == o_img_ptr->uWidth)
59         {
60                 if(i_img_ptr->uHeight == o_img_ptr->uHeight)
61                         {
62                                 LOGV("************************f(i_img_ptr->uHeight == o_img_ptr->uHeight) are same *********************\n");
63                                 LOGV("************************(i_img_ptr->width == %d" , i_img_ptr->uWidth );
64                                 LOGV("************************(i_img_ptr->uHeight == %d" , i_img_ptr->uHeight );
65                                 LOGV("************************(o_img_ptr->width == %d" ,o_img_ptr->uWidth );
66                                 LOGV("************************(o_img_ptr->uHeight == %d" , o_img_ptr->uHeight );
67                         }
68         }
69
70   if (!i_img_ptr || !i_img_ptr->imgPtr ||
71     !o_img_ptr || !o_img_ptr->imgPtr)
72   {
73         LOGE("Image Point NULL");
74         LOGV("VT_resizeFrame_Video_opt2_lp-");
75         return false;
76   }
77
78   inImgPtrY = (mmUchar *) i_img_ptr->imgPtr + i_img_ptr->uOffset;
79   inImgPtrU = (mmUchar *) i_img_ptr->clrPtr + i_img_ptr->uOffset/2;
80   inImgPtrV = (mmUchar*)inImgPtrU + 1;
81
82   if (cropout == NULL)
83   {
84     cox = 0;
85     coy = 0;
86     codx = o_img_ptr->uWidth;
87     cody = o_img_ptr->uHeight;
88   }
89   else
90   {
91     cox = cropout->x;
92     coy = cropout->y;
93     codx = cropout->uWidth;
94     cody = cropout->uHeight;
95   }
96   idx = i_img_ptr->uWidth;
97   idy = i_img_ptr->uHeight;
98
99   /* make sure valid input size */
100   if (idx < 1 || idy < 1 || i_img_ptr->uStride < 1)
101         {
102         LOGE("idx or idy less then 1 idx = %d idy = %d stride = %d", idx, idy, i_img_ptr->uStride);
103         LOGV("VT_resizeFrame_Video_opt2_lp-");
104         return false;
105         }
106
107   resizeFactorX = ((idx-1)<<9) / codx;
108   resizeFactorY = ((idy-1)<<9) / cody;
109
110   if(i_img_ptr->eFormat == IC_FORMAT_YCbCr420_lp &&
111     o_img_ptr->eFormat == IC_FORMAT_YCbCr420_lp)
112   {
113     ptr8 = (mmUchar*)o_img_ptr->imgPtr + cox + coy*o_img_ptr->uWidth;
114
115
116     ////////////////////////////for Y//////////////////////////
117     for (row=0; row < cody; row++)
118     {
119         mmUchar *pu8Yrow1 = NULL;
120         mmUchar *pu8Yrow2 = NULL;
121         y  = (mmUint16) ((mmUint32) (row*resizeFactorY) >> 9);
122         yf = (mmUchar)  ((mmUint32)((row*resizeFactorY) >> 6) & 0x7);
123         pu8Yrow1 = inImgPtrY + (y) * i_img_ptr->uStride;
124         pu8Yrow2 = pu8Yrow1 + i_img_ptr->uStride;
125
126         for (col=0; col < codx; col++)
127         {
128             mmUchar in11, in12, in21, in22;
129             mmUchar *pu8ptr1 = NULL;
130             mmUchar *pu8ptr2 = NULL;
131             mmUchar w;
132             mmUint16 accum_1;
133             //mmUint32 accum_W;
134
135
136
137             x  = (mmUint16) ((mmUint32)  (col*resizeFactorX) >> 9);
138             xf = (mmUchar)  ((mmUint32) ((col*resizeFactorX) >> 6) & 0x7);
139
140
141             //accum_W = 0;
142             accum_1 =  0;
143
144             pu8ptr1 = pu8Yrow1 + (x);
145             pu8ptr2 = pu8Yrow2 + (x);
146
147             /* A pixel */
148             //in = *(inImgPtrY + (y)*idx + (x));
149             in11 = *(pu8ptr1);
150
151             w = bWeights[xf][yf][0];
152             accum_1 = (w * in11);
153             //accum_W += (w);
154
155             /* B pixel */
156             //in = *(inImgPtrY + (y)*idx + (x+1));
157             in12 = *(pu8ptr1+1);
158             w = bWeights[xf][yf][1];
159             accum_1 += (w * in12);
160             //accum_W += (w);
161
162             /* C pixel */
163             //in = *(inImgPtrY + (y+1)*idx + (x));
164             in21 = *(pu8ptr2);
165             w = bWeights[xf][yf][3];
166             accum_1 += (w * in21);
167             //accum_W += (w);
168
169             /* D pixel */
170             //in = *(inImgPtrY + (y+1)*idx + (x+1));
171             in22 = *(pu8ptr2+1);
172             w = bWeights[xf][yf][2];
173             accum_1 += (w * in22);
174             //accum_W += (w);
175
176             /* divide by sum of the weights */
177             //accum_1 /= (accum_W);
178             //accum_1 = (accum_1/64);
179             accum_1 = (accum_1>>6);
180             *ptr8 = (mmUchar)accum_1 ;
181
182
183             ptr8++;
184         }
185         ptr8 = ptr8 + (o_img_ptr->uStride - codx);
186     }
187     ////////////////////////////for Y//////////////////////////
188
189     ///////////////////////////////for Cb-Cr//////////////////////
190
191     ptr8Cb = (mmUchar*)o_img_ptr->clrPtr + cox + coy*o_img_ptr->uWidth;
192
193     ptr8Cr = (mmUchar*)(ptr8Cb+1);
194
195     idxC = (idx>>1);
196     for (row=0; row < (((cody)>>1)); row++)
197     {
198         mmUchar *pu8Cbr1 = NULL;
199         mmUchar *pu8Cbr2 = NULL;
200         mmUchar *pu8Crr1 = NULL;
201         mmUchar *pu8Crr2 = NULL;
202
203         y  = (mmUint16) ((mmUint32) (row*resizeFactorY) >> 9);
204         yf = (mmUchar)  ((mmUint32)((row*resizeFactorY) >> 6) & 0x7);
205
206         pu8Cbr1 = inImgPtrU + (y) * i_img_ptr->uStride;
207         pu8Cbr2 = pu8Cbr1 + i_img_ptr->uStride;
208         pu8Crr1 = inImgPtrV + (y) * i_img_ptr->uStride;
209         pu8Crr2 = pu8Crr1 + i_img_ptr->uStride;
210
211         for (col=0; col < (((codx)>>1)); col++)
212         {
213             mmUchar in11, in12, in21, in22;
214             mmUchar *pu8Cbc1 = NULL;
215             mmUchar *pu8Cbc2 = NULL;
216             mmUchar *pu8Crc1 = NULL;
217             mmUchar *pu8Crc2 = NULL;
218
219             mmUchar w;
220             mmUint16 accum_1Cb, accum_1Cr;
221             //mmUint32 accum_WCb, accum_WCr;
222
223
224             x  = (mmUint16) ((mmUint32)  (col*resizeFactorX) >> 9);
225             xf = (mmUchar)  ((mmUint32) ((col*resizeFactorX) >> 6) & 0x7);
226
227
228             //accum_WCb = accum_WCr =  0;
229             accum_1Cb = accum_1Cr =  0;
230
231             pu8Cbc1 = pu8Cbr1 + (x*2);
232             pu8Cbc2 = pu8Cbr2 + (x*2);
233         pu8Crc1 = pu8Crr1 + (x*2);
234             pu8Crc2 = pu8Crr2 + (x*2);
235
236
237
238             /* A pixel */
239             w = bWeights[xf][yf][0];
240
241             in11 = *(pu8Cbc1);
242             accum_1Cb = (w * in11);
243             //    accum_WCb += (w);
244
245             in11 = *(pu8Crc1);
246             accum_1Cr = (w * in11);
247             //accum_WCr += (w);
248
249             /* B pixel */
250             w = bWeights[xf][yf][1];
251
252             in12 = *(pu8Cbc1+2);
253             accum_1Cb += (w * in12);
254             //accum_WCb += (w);
255
256             in12 = *(pu8Crc1+2);
257             accum_1Cr += (w * in12);
258             //accum_WCr += (w);
259
260             /* C pixel */
261             w = bWeights[xf][yf][3];
262
263             in21 = *(pu8Cbc2);
264             accum_1Cb += (w * in21);
265             //accum_WCb += (w);
266
267             in21 = *(pu8Crc2);
268             accum_1Cr += (w * in21);
269             //accum_WCr += (w);
270
271             /* D pixel */
272             w = bWeights[xf][yf][2];
273
274             in22 = *(pu8Cbc2+2);
275             accum_1Cb += (w * in22);
276             //accum_WCb += (w);
277
278             in22 = *(pu8Crc2+2);
279             accum_1Cr += (w * in22);
280             //accum_WCr += (w);
281
282             /* divide by sum of the weights */
283             //accum_1Cb /= (accum_WCb);
284             accum_1Cb = (accum_1Cb>>6);
285             *ptr8Cb = (mmUchar)accum_1Cb ;
286
287
288             accum_1Cr = (accum_1Cr >> 6);
289             *ptr8Cr = (mmUchar)accum_1Cr ;
290
291             ptr8Cb++;
292             ptr8Cr++;
293
294             ptr8Cb++;
295             ptr8Cr++;
296         }
297         ptr8Cb = ptr8Cb + (o_img_ptr->uStride-codx);
298         ptr8Cr = ptr8Cr + (o_img_ptr->uStride-codx);
299     }
300     ///////////////////For Cb- Cr////////////////////////////////////////
301   }
302   else
303   {
304         LOGE("eFormat not supported");
305         LOGV("VT_resizeFrame_Video_opt2_lp-");
306         return false;
307   }
308   LOGV("success");
309   LOGV("VT_resizeFrame_Video_opt2_lp-");
310   return true;
311 }