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