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