1*a97c2a1fSXin Li /******************************************************************************
2*a97c2a1fSXin Li *
3*a97c2a1fSXin Li * Copyright (C) 2015 The Android Open Source Project
4*a97c2a1fSXin Li *
5*a97c2a1fSXin Li * Licensed under the Apache License, Version 2.0 (the "License");
6*a97c2a1fSXin Li * you may not use this file except in compliance with the License.
7*a97c2a1fSXin Li * You may obtain a copy of the License at:
8*a97c2a1fSXin Li *
9*a97c2a1fSXin Li * http://www.apache.org/licenses/LICENSE-2.0
10*a97c2a1fSXin Li *
11*a97c2a1fSXin Li * Unless required by applicable law or agreed to in writing, software
12*a97c2a1fSXin Li * distributed under the License is distributed on an "AS IS" BASIS,
13*a97c2a1fSXin Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*a97c2a1fSXin Li * See the License for the specific language governing permissions and
15*a97c2a1fSXin Li * limitations under the License.
16*a97c2a1fSXin Li *
17*a97c2a1fSXin Li *****************************************************************************
18*a97c2a1fSXin Li * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*a97c2a1fSXin Li */
20*a97c2a1fSXin Li /**
21*a97c2a1fSXin Li *******************************************************************************
22*a97c2a1fSXin Li * @file
23*a97c2a1fSXin Li * impeg2d_mcu.c
24*a97c2a1fSXin Li *
25*a97c2a1fSXin Li * @brief
26*a97c2a1fSXin Li * Contains MC function definitions for MPEG2 decoder
27*a97c2a1fSXin Li *
28*a97c2a1fSXin Li * @author
29*a97c2a1fSXin Li * Harish
30*a97c2a1fSXin Li *
31*a97c2a1fSXin Li * @par List of Functions:
32*a97c2a1fSXin Li * - impeg2_copy_mb()
33*a97c2a1fSXin Li * - impeg2_interpolate()
34*a97c2a1fSXin Li * - impeg2_mc_halfx_halfy_8x8()
35*a97c2a1fSXin Li * - impeg2_mc_halfx_fully_8x8()
36*a97c2a1fSXin Li * - impeg2_mc_fullx_halfy_8x8()
37*a97c2a1fSXin Li * - impeg2_mc_fullx_fully_8x8()
38*a97c2a1fSXin Li *
39*a97c2a1fSXin Li * @remarks
40*a97c2a1fSXin Li * None
41*a97c2a1fSXin Li *
42*a97c2a1fSXin Li *******************************************************************************
43*a97c2a1fSXin Li */
44*a97c2a1fSXin Li
45*a97c2a1fSXin Li #include <stdio.h>
46*a97c2a1fSXin Li #include <string.h>
47*a97c2a1fSXin Li #include "iv_datatypedef.h"
48*a97c2a1fSXin Li #include "iv.h"
49*a97c2a1fSXin Li #include "impeg2_buf_mgr.h"
50*a97c2a1fSXin Li #include "impeg2_disp_mgr.h"
51*a97c2a1fSXin Li #include "impeg2_defs.h"
52*a97c2a1fSXin Li #include "impeg2_platform_macros.h"
53*a97c2a1fSXin Li
54*a97c2a1fSXin Li #include "impeg2_inter_pred.h"
55*a97c2a1fSXin Li #include "impeg2_globals.h"
56*a97c2a1fSXin Li #include "impeg2_macros.h"
57*a97c2a1fSXin Li #include "impeg2_idct.h"
58*a97c2a1fSXin Li
59*a97c2a1fSXin Li /*******************************************************************************
60*a97c2a1fSXin Li * Function Name : impeg2_copy_mb
61*a97c2a1fSXin Li *
62*a97c2a1fSXin Li * Description : copies 3 components to the frame from mc_buf
63*a97c2a1fSXin Li *
64*a97c2a1fSXin Li * Arguments :
65*a97c2a1fSXin Li * src_buf : Source Buffer
66*a97c2a1fSXin Li * dst_buf : Destination Buffer
67*a97c2a1fSXin Li * src_offset_x : X offset for source
68*a97c2a1fSXin Li * src_offset_y : Y offset for source
69*a97c2a1fSXin Li * dst_offset_x : X offset for destination
70*a97c2a1fSXin Li * dst_offset_y : Y offset for destination
71*a97c2a1fSXin Li * src_wd : Source Width
72*a97c2a1fSXin Li * dst_wd : destination Width
73*a97c2a1fSXin Li * rows : Number of rows
74*a97c2a1fSXin Li * cols : Number of columns
75*a97c2a1fSXin Li *
76*a97c2a1fSXin Li * Values Returned : None
77*a97c2a1fSXin Li *******************************************************************************/
impeg2_copy_mb(yuv_buf_t * ps_src_buf,yuv_buf_t * ps_dst_buf,UWORD32 u4_src_wd,UWORD32 u4_dst_wd)78*a97c2a1fSXin Li void impeg2_copy_mb(yuv_buf_t *ps_src_buf,
79*a97c2a1fSXin Li yuv_buf_t *ps_dst_buf,
80*a97c2a1fSXin Li UWORD32 u4_src_wd,
81*a97c2a1fSXin Li UWORD32 u4_dst_wd)
82*a97c2a1fSXin Li {
83*a97c2a1fSXin Li UWORD8 *pu1_src;
84*a97c2a1fSXin Li UWORD8 *pu1_dst;
85*a97c2a1fSXin Li UWORD32 i;
86*a97c2a1fSXin Li UWORD32 u4_rows = MB_SIZE;
87*a97c2a1fSXin Li UWORD32 u4_cols = MB_SIZE;
88*a97c2a1fSXin Li
89*a97c2a1fSXin Li /*******************************************************/
90*a97c2a1fSXin Li /* copy Y */
91*a97c2a1fSXin Li /*******************************************************/
92*a97c2a1fSXin Li pu1_src = ps_src_buf->pu1_y;
93*a97c2a1fSXin Li pu1_dst = ps_dst_buf->pu1_y;
94*a97c2a1fSXin Li for(i = 0; i < u4_rows; i++)
95*a97c2a1fSXin Li {
96*a97c2a1fSXin Li memcpy(pu1_dst, pu1_src, u4_cols);
97*a97c2a1fSXin Li pu1_src += u4_src_wd;
98*a97c2a1fSXin Li pu1_dst += u4_dst_wd;
99*a97c2a1fSXin Li }
100*a97c2a1fSXin Li
101*a97c2a1fSXin Li u4_src_wd >>= 1;
102*a97c2a1fSXin Li u4_dst_wd >>= 1;
103*a97c2a1fSXin Li u4_rows >>= 1;
104*a97c2a1fSXin Li u4_cols >>= 1;
105*a97c2a1fSXin Li
106*a97c2a1fSXin Li /*******************************************************/
107*a97c2a1fSXin Li /* copy U */
108*a97c2a1fSXin Li /*******************************************************/
109*a97c2a1fSXin Li pu1_src = ps_src_buf->pu1_u;
110*a97c2a1fSXin Li pu1_dst = ps_dst_buf->pu1_u;
111*a97c2a1fSXin Li for(i = 0; i < u4_rows; i++)
112*a97c2a1fSXin Li {
113*a97c2a1fSXin Li memcpy(pu1_dst, pu1_src, u4_cols);
114*a97c2a1fSXin Li
115*a97c2a1fSXin Li pu1_src += u4_src_wd;
116*a97c2a1fSXin Li pu1_dst += u4_dst_wd;
117*a97c2a1fSXin Li }
118*a97c2a1fSXin Li /*******************************************************/
119*a97c2a1fSXin Li /* copy V */
120*a97c2a1fSXin Li /*******************************************************/
121*a97c2a1fSXin Li pu1_src = ps_src_buf->pu1_v;
122*a97c2a1fSXin Li pu1_dst = ps_dst_buf->pu1_v;
123*a97c2a1fSXin Li for(i = 0; i < u4_rows; i++)
124*a97c2a1fSXin Li {
125*a97c2a1fSXin Li memcpy(pu1_dst, pu1_src, u4_cols);
126*a97c2a1fSXin Li
127*a97c2a1fSXin Li pu1_src += u4_src_wd;
128*a97c2a1fSXin Li pu1_dst += u4_dst_wd;
129*a97c2a1fSXin Li }
130*a97c2a1fSXin Li
131*a97c2a1fSXin Li }
132*a97c2a1fSXin Li
133*a97c2a1fSXin Li /*****************************************************************************/
134*a97c2a1fSXin Li /* */
135*a97c2a1fSXin Li /* Function Name : impeg2_interpolate */
136*a97c2a1fSXin Li /* */
137*a97c2a1fSXin Li /* Description : averages the contents of buf_src1 and buf_src2 and stores*/
138*a97c2a1fSXin Li /* result in buf_dst */
139*a97c2a1fSXin Li /* */
140*a97c2a1fSXin Li /* Inputs : buf_src1 - First Source */
141*a97c2a1fSXin Li /* buf_src2 - Second Source */
142*a97c2a1fSXin Li /* */
143*a97c2a1fSXin Li /* Globals : None */
144*a97c2a1fSXin Li /* */
145*a97c2a1fSXin Li /* Processing : Avg the values from two sources and store the result in */
146*a97c2a1fSXin Li /* destination buffer */
147*a97c2a1fSXin Li /* */
148*a97c2a1fSXin Li /* Outputs : buf_dst - Avg of contents of buf_src1 and buf_src2 */
149*a97c2a1fSXin Li /* */
150*a97c2a1fSXin Li /* Returns : None */
151*a97c2a1fSXin Li /* */
152*a97c2a1fSXin Li /* Issues : Assumes that all 3 buffers are of same size */
153*a97c2a1fSXin Li /* */
154*a97c2a1fSXin Li /* Revision History: */
155*a97c2a1fSXin Li /* */
156*a97c2a1fSXin Li /* DD MM YYYY Author(s) Changes */
157*a97c2a1fSXin Li /* 14 09 2005 Harish M First Version */
158*a97c2a1fSXin Li /* 15 09 2010 Venkat Added stride */
159*a97c2a1fSXin Li /* */
160*a97c2a1fSXin Li /*****************************************************************************/
impeg2_interpolate(yuv_buf_t * ps_buf_src1,yuv_buf_t * ps_buf_src2,yuv_buf_t * ps_buf_dst,UWORD32 u4_stride)161*a97c2a1fSXin Li void impeg2_interpolate(yuv_buf_t *ps_buf_src1,
162*a97c2a1fSXin Li yuv_buf_t *ps_buf_src2,
163*a97c2a1fSXin Li yuv_buf_t *ps_buf_dst,
164*a97c2a1fSXin Li UWORD32 u4_stride)
165*a97c2a1fSXin Li {
166*a97c2a1fSXin Li
167*a97c2a1fSXin Li UWORD32 i,j;
168*a97c2a1fSXin Li UWORD8 *pu1_src1,*pu1_src2,*pu1_dst;
169*a97c2a1fSXin Li pu1_src1 = ps_buf_src1->pu1_y;
170*a97c2a1fSXin Li pu1_src2 = ps_buf_src2->pu1_y;
171*a97c2a1fSXin Li pu1_dst = ps_buf_dst->pu1_y;
172*a97c2a1fSXin Li for(i = MB_SIZE; i > 0; i--)
173*a97c2a1fSXin Li {
174*a97c2a1fSXin Li for(j = MB_SIZE; j > 0; j--)
175*a97c2a1fSXin Li {
176*a97c2a1fSXin Li *pu1_dst++ = ((*pu1_src1++) + (*pu1_src2++) + 1) >> 1;
177*a97c2a1fSXin Li }
178*a97c2a1fSXin Li
179*a97c2a1fSXin Li pu1_dst += u4_stride - MB_SIZE;
180*a97c2a1fSXin Li
181*a97c2a1fSXin Li }
182*a97c2a1fSXin Li
183*a97c2a1fSXin Li u4_stride >>= 1;
184*a97c2a1fSXin Li
185*a97c2a1fSXin Li pu1_src1 = ps_buf_src1->pu1_u;
186*a97c2a1fSXin Li pu1_src2 = ps_buf_src2->pu1_u;
187*a97c2a1fSXin Li pu1_dst = ps_buf_dst->pu1_u;
188*a97c2a1fSXin Li for(i = MB_CHROMA_SIZE; i > 0 ; i--)
189*a97c2a1fSXin Li {
190*a97c2a1fSXin Li for(j = MB_CHROMA_SIZE; j > 0; j--)
191*a97c2a1fSXin Li {
192*a97c2a1fSXin Li *pu1_dst++ = ((*pu1_src1++) + (*pu1_src2++) + 1) >> 1;
193*a97c2a1fSXin Li }
194*a97c2a1fSXin Li
195*a97c2a1fSXin Li pu1_dst += u4_stride - MB_CHROMA_SIZE;
196*a97c2a1fSXin Li }
197*a97c2a1fSXin Li
198*a97c2a1fSXin Li pu1_src1 = ps_buf_src1->pu1_v;
199*a97c2a1fSXin Li pu1_src2 = ps_buf_src2->pu1_v;
200*a97c2a1fSXin Li pu1_dst = ps_buf_dst->pu1_v;
201*a97c2a1fSXin Li for(i = MB_CHROMA_SIZE; i > 0 ; i--)
202*a97c2a1fSXin Li {
203*a97c2a1fSXin Li for(j = MB_CHROMA_SIZE; j > 0; j--)
204*a97c2a1fSXin Li {
205*a97c2a1fSXin Li *pu1_dst++ = ((*pu1_src1++) + (*pu1_src2++) + 1) >> 1;
206*a97c2a1fSXin Li }
207*a97c2a1fSXin Li
208*a97c2a1fSXin Li pu1_dst += u4_stride - MB_CHROMA_SIZE;
209*a97c2a1fSXin Li }
210*a97c2a1fSXin Li
211*a97c2a1fSXin Li }
212*a97c2a1fSXin Li
213*a97c2a1fSXin Li /*****************************************************************************/
214*a97c2a1fSXin Li /* */
215*a97c2a1fSXin Li /* Function Name : impeg2_mc_halfx_halfy_8x8() */
216*a97c2a1fSXin Li /* */
217*a97c2a1fSXin Li /* Description : Gets the buffer from (0.5,0.5) to (8.5,8.5) */
218*a97c2a1fSXin Li /* and the above block of size 8 x 8 will be placed as a */
219*a97c2a1fSXin Li /* block from the current position of out_buf */
220*a97c2a1fSXin Li /* */
221*a97c2a1fSXin Li /* Inputs : ref - Reference frame from which the block will be */
222*a97c2a1fSXin Li /* block will be extracted. */
223*a97c2a1fSXin Li /* ref_wid - WIdth of reference frame */
224*a97c2a1fSXin Li /* out_wid - WIdth of the output frame */
225*a97c2a1fSXin Li /* blk_width - width of the block */
226*a97c2a1fSXin Li /* blk_width - height of the block */
227*a97c2a1fSXin Li /* */
228*a97c2a1fSXin Li /* Globals : None */
229*a97c2a1fSXin Li /* */
230*a97c2a1fSXin Li /* Processing : Point to the (0,0),(1,0),(0,1),(1,1) position in */
231*a97c2a1fSXin Li /* the ref frame.Interpolate these four values to get the */
232*a97c2a1fSXin Li /* value at(0.5,0.5).Repeat this to get an 8 x 8 block */
233*a97c2a1fSXin Li /* using 9 x 9 block from reference frame */
234*a97c2a1fSXin Li /* */
235*a97c2a1fSXin Li /* Outputs : out - Output containing the extracted block */
236*a97c2a1fSXin Li /* */
237*a97c2a1fSXin Li /* Returns : None */
238*a97c2a1fSXin Li /* */
239*a97c2a1fSXin Li /* Issues : None */
240*a97c2a1fSXin Li /* */
241*a97c2a1fSXin Li /* Revision History: */
242*a97c2a1fSXin Li /* */
243*a97c2a1fSXin Li /* DD MM YYYY Author(s) Changes */
244*a97c2a1fSXin Li /* 05 09 2005 Harish M First Version */
245*a97c2a1fSXin Li /* */
246*a97c2a1fSXin Li /*****************************************************************************/
impeg2_mc_halfx_halfy_8x8(UWORD8 * pu1_out,UWORD8 * pu1_ref,UWORD32 u4_ref_wid,UWORD32 u4_out_wid)247*a97c2a1fSXin Li void impeg2_mc_halfx_halfy_8x8(UWORD8 *pu1_out,
248*a97c2a1fSXin Li UWORD8 *pu1_ref,
249*a97c2a1fSXin Li UWORD32 u4_ref_wid,
250*a97c2a1fSXin Li UWORD32 u4_out_wid)
251*a97c2a1fSXin Li {
252*a97c2a1fSXin Li UWORD8 *pu1_ref_p0,*pu1_ref_p1,*pu1_ref_p2,*pu1_ref_p3;
253*a97c2a1fSXin Li UWORD32 i,j;
254*a97c2a1fSXin Li /* P0-P3 are the pixels in the reference frame and Q is the value being */
255*a97c2a1fSXin Li /* estimated */
256*a97c2a1fSXin Li /*
257*a97c2a1fSXin Li P0 P1
258*a97c2a1fSXin Li Q
259*a97c2a1fSXin Li P2 P3
260*a97c2a1fSXin Li */
261*a97c2a1fSXin Li
262*a97c2a1fSXin Li pu1_ref_p0 = pu1_ref;
263*a97c2a1fSXin Li pu1_ref_p1 = pu1_ref + 1;
264*a97c2a1fSXin Li pu1_ref_p2 = pu1_ref + u4_ref_wid;
265*a97c2a1fSXin Li pu1_ref_p3 = pu1_ref + u4_ref_wid + 1;
266*a97c2a1fSXin Li
267*a97c2a1fSXin Li for(i = 0; i < BLK_SIZE; i++)
268*a97c2a1fSXin Li {
269*a97c2a1fSXin Li for(j = 0; j < BLK_SIZE; j++)
270*a97c2a1fSXin Li {
271*a97c2a1fSXin Li *pu1_out++ = (( (*pu1_ref_p0++ )
272*a97c2a1fSXin Li + (*pu1_ref_p1++ )
273*a97c2a1fSXin Li + (*pu1_ref_p2++ )
274*a97c2a1fSXin Li + (*pu1_ref_p3++ ) + 2 ) >> 2);
275*a97c2a1fSXin Li }
276*a97c2a1fSXin Li pu1_ref_p0 += u4_ref_wid - BLK_SIZE;
277*a97c2a1fSXin Li pu1_ref_p1 += u4_ref_wid - BLK_SIZE;
278*a97c2a1fSXin Li pu1_ref_p2 += u4_ref_wid - BLK_SIZE;
279*a97c2a1fSXin Li pu1_ref_p3 += u4_ref_wid - BLK_SIZE;
280*a97c2a1fSXin Li
281*a97c2a1fSXin Li pu1_out += u4_out_wid - BLK_SIZE;
282*a97c2a1fSXin Li }
283*a97c2a1fSXin Li return;
284*a97c2a1fSXin Li }
285*a97c2a1fSXin Li
286*a97c2a1fSXin Li /*****************************************************************************/
287*a97c2a1fSXin Li /* */
288*a97c2a1fSXin Li /* Function Name : impeg2_mc_halfx_fully_8x8() */
289*a97c2a1fSXin Li /* */
290*a97c2a1fSXin Li /* Description : Gets the buffer from (0.5,0) to (8.5,8) */
291*a97c2a1fSXin Li /* and the above block of size 8 x 8 will be placed as a */
292*a97c2a1fSXin Li /* block from the current position of out_buf */
293*a97c2a1fSXin Li /* */
294*a97c2a1fSXin Li /* Inputs : ref - Reference frame from which the block will be */
295*a97c2a1fSXin Li /* block will be extracted. */
296*a97c2a1fSXin Li /* ref_wid - WIdth of reference frame */
297*a97c2a1fSXin Li /* out_wid - WIdth of the output frame */
298*a97c2a1fSXin Li /* blk_width - width of the block */
299*a97c2a1fSXin Li /* blk_width - height of the block */
300*a97c2a1fSXin Li /* */
301*a97c2a1fSXin Li /* Globals : None */
302*a97c2a1fSXin Li /* */
303*a97c2a1fSXin Li /* Processing : Point to the (0,0) and (1,0) position in the ref frame */
304*a97c2a1fSXin Li /* Interpolate these two values to get the value at(0.5,0) */
305*a97c2a1fSXin Li /* Repeat this to get an 8 x 8 block using 9 x 8 block from */
306*a97c2a1fSXin Li /* reference frame */
307*a97c2a1fSXin Li /* */
308*a97c2a1fSXin Li /* Outputs : out - Output containing the extracted block */
309*a97c2a1fSXin Li /* */
310*a97c2a1fSXin Li /* Returns : None */
311*a97c2a1fSXin Li /* */
312*a97c2a1fSXin Li /* Issues : None */
313*a97c2a1fSXin Li /* */
314*a97c2a1fSXin Li /* Revision History: */
315*a97c2a1fSXin Li /* */
316*a97c2a1fSXin Li /* DD MM YYYY Author(s) Changes */
317*a97c2a1fSXin Li /* 05 09 2005 Harish M First Version */
318*a97c2a1fSXin Li /* */
319*a97c2a1fSXin Li /*****************************************************************************/
impeg2_mc_halfx_fully_8x8(UWORD8 * pu1_out,UWORD8 * pu1_ref,UWORD32 u4_ref_wid,UWORD32 u4_out_wid)320*a97c2a1fSXin Li void impeg2_mc_halfx_fully_8x8(UWORD8 *pu1_out,
321*a97c2a1fSXin Li UWORD8 *pu1_ref,
322*a97c2a1fSXin Li UWORD32 u4_ref_wid,
323*a97c2a1fSXin Li UWORD32 u4_out_wid)
324*a97c2a1fSXin Li {
325*a97c2a1fSXin Li UWORD8 *pu1_ref_p0, *pu1_ref_p1;
326*a97c2a1fSXin Li UWORD32 i,j;
327*a97c2a1fSXin Li
328*a97c2a1fSXin Li /* P0-P3 are the pixels in the reference frame and Q is the value being */
329*a97c2a1fSXin Li /* estimated */
330*a97c2a1fSXin Li /*
331*a97c2a1fSXin Li P0 Q P1
332*a97c2a1fSXin Li */
333*a97c2a1fSXin Li
334*a97c2a1fSXin Li pu1_ref_p0 = pu1_ref;
335*a97c2a1fSXin Li pu1_ref_p1 = pu1_ref + 1;
336*a97c2a1fSXin Li
337*a97c2a1fSXin Li for(i = 0; i < BLK_SIZE; i++)
338*a97c2a1fSXin Li {
339*a97c2a1fSXin Li for(j = 0; j < BLK_SIZE; j++)
340*a97c2a1fSXin Li {
341*a97c2a1fSXin Li *pu1_out++ = ((( *pu1_ref_p0++ )
342*a97c2a1fSXin Li + (*pu1_ref_p1++) + 1 ) >> 1);
343*a97c2a1fSXin Li }
344*a97c2a1fSXin Li pu1_ref_p0 += u4_ref_wid - BLK_SIZE;
345*a97c2a1fSXin Li pu1_ref_p1 += u4_ref_wid - BLK_SIZE;
346*a97c2a1fSXin Li
347*a97c2a1fSXin Li pu1_out += u4_out_wid - BLK_SIZE;
348*a97c2a1fSXin Li }
349*a97c2a1fSXin Li return;
350*a97c2a1fSXin Li }
351*a97c2a1fSXin Li
352*a97c2a1fSXin Li /*****************************************************************************/
353*a97c2a1fSXin Li /* */
354*a97c2a1fSXin Li /* Function Name : impeg2_mc_fullx_halfy_8x8() */
355*a97c2a1fSXin Li /* */
356*a97c2a1fSXin Li /* Description : Gets the buffer from (0,0.5) to (8,8.5) */
357*a97c2a1fSXin Li /* and the above block of size 8 x 8 will be placed as a */
358*a97c2a1fSXin Li /* block from the current position of out_buf */
359*a97c2a1fSXin Li /* */
360*a97c2a1fSXin Li /* Inputs : ref - Reference frame from which the block will be */
361*a97c2a1fSXin Li /* block will be extracted. */
362*a97c2a1fSXin Li /* ref_wid - WIdth of reference frame */
363*a97c2a1fSXin Li /* out_wid - WIdth of the output frame */
364*a97c2a1fSXin Li /* blk_width - width of the block */
365*a97c2a1fSXin Li /* blk_width - height of the block */
366*a97c2a1fSXin Li /* */
367*a97c2a1fSXin Li /* Globals : None */
368*a97c2a1fSXin Li /* */
369*a97c2a1fSXin Li /* Processing : Point to the (0,0) and (0,1) position in the ref frame */
370*a97c2a1fSXin Li /* Interpolate these two values to get the value at(0,0.5) */
371*a97c2a1fSXin Li /* Repeat this to get an 8 x 8 block using 8 x 9 block from */
372*a97c2a1fSXin Li /* reference frame */
373*a97c2a1fSXin Li /* */
374*a97c2a1fSXin Li /* Outputs : out - Output containing the extracted block */
375*a97c2a1fSXin Li /* */
376*a97c2a1fSXin Li /* Returns : None */
377*a97c2a1fSXin Li /* */
378*a97c2a1fSXin Li /* Issues : None */
379*a97c2a1fSXin Li /* */
380*a97c2a1fSXin Li /* Revision History: */
381*a97c2a1fSXin Li /* */
382*a97c2a1fSXin Li /* DD MM YYYY Author(s) Changes */
383*a97c2a1fSXin Li /* 05 09 2005 Harish M First Version */
384*a97c2a1fSXin Li /* */
385*a97c2a1fSXin Li /*****************************************************************************/
impeg2_mc_fullx_halfy_8x8(UWORD8 * pu1_out,UWORD8 * pu1_ref,UWORD32 u4_ref_wid,UWORD32 u4_out_wid)386*a97c2a1fSXin Li void impeg2_mc_fullx_halfy_8x8(UWORD8 *pu1_out,
387*a97c2a1fSXin Li UWORD8 *pu1_ref,
388*a97c2a1fSXin Li UWORD32 u4_ref_wid,
389*a97c2a1fSXin Li UWORD32 u4_out_wid)
390*a97c2a1fSXin Li {
391*a97c2a1fSXin Li
392*a97c2a1fSXin Li UWORD8 *pu1_ref_p0, *pu1_ref_p1;
393*a97c2a1fSXin Li UWORD32 i,j;
394*a97c2a1fSXin Li /* P0-P3 are the pixels in the reference frame and Q is the value being */
395*a97c2a1fSXin Li /* estimated */
396*a97c2a1fSXin Li /*
397*a97c2a1fSXin Li P0
398*a97c2a1fSXin Li x
399*a97c2a1fSXin Li P1
400*a97c2a1fSXin Li */
401*a97c2a1fSXin Li pu1_ref_p0 = pu1_ref;
402*a97c2a1fSXin Li pu1_ref_p1 = pu1_ref + u4_ref_wid;
403*a97c2a1fSXin Li
404*a97c2a1fSXin Li for(i = 0; i < BLK_SIZE; i++)
405*a97c2a1fSXin Li {
406*a97c2a1fSXin Li for(j = 0; j < BLK_SIZE; j++)
407*a97c2a1fSXin Li {
408*a97c2a1fSXin Li *pu1_out++ = ((( *pu1_ref_p0++)
409*a97c2a1fSXin Li + (*pu1_ref_p1++) + 1 ) >> 1);
410*a97c2a1fSXin Li }
411*a97c2a1fSXin Li pu1_ref_p0 += u4_ref_wid - BLK_SIZE;
412*a97c2a1fSXin Li pu1_ref_p1 += u4_ref_wid - BLK_SIZE;
413*a97c2a1fSXin Li
414*a97c2a1fSXin Li pu1_out += u4_out_wid - BLK_SIZE;
415*a97c2a1fSXin Li }
416*a97c2a1fSXin Li
417*a97c2a1fSXin Li return;
418*a97c2a1fSXin Li }
419*a97c2a1fSXin Li
420*a97c2a1fSXin Li /*****************************************************************************/
421*a97c2a1fSXin Li /* */
422*a97c2a1fSXin Li /* Function Name : impeg2_mc_fullx_fully_8x8() */
423*a97c2a1fSXin Li /* */
424*a97c2a1fSXin Li /* Description : Gets the buffer from (x,y) to (x+8,y+8) */
425*a97c2a1fSXin Li /* and the above block of size 8 x 8 will be placed as a */
426*a97c2a1fSXin Li /* block from the current position of out_buf */
427*a97c2a1fSXin Li /* */
428*a97c2a1fSXin Li /* Inputs : ref - Reference frame from which the block will be */
429*a97c2a1fSXin Li /* block will be extracted. */
430*a97c2a1fSXin Li /* ref_wid - WIdth of reference frame */
431*a97c2a1fSXin Li /* out_wid - WIdth of the output frame */
432*a97c2a1fSXin Li /* blk_width - width of the block */
433*a97c2a1fSXin Li /* blk_width - height of the block */
434*a97c2a1fSXin Li /* */
435*a97c2a1fSXin Li /* Globals : None */
436*a97c2a1fSXin Li /* */
437*a97c2a1fSXin Li /* Processing : Point to the (0,0) position in the ref frame */
438*a97c2a1fSXin Li /* Get an 8 x 8 block from reference frame */
439*a97c2a1fSXin Li /* */
440*a97c2a1fSXin Li /* Outputs : out - Output containing the extracted block */
441*a97c2a1fSXin Li /* */
442*a97c2a1fSXin Li /* Returns : None */
443*a97c2a1fSXin Li /* */
444*a97c2a1fSXin Li /* Issues : None */
445*a97c2a1fSXin Li /* */
446*a97c2a1fSXin Li /* Revision History: */
447*a97c2a1fSXin Li /* */
448*a97c2a1fSXin Li /* DD MM YYYY Author(s) Changes */
449*a97c2a1fSXin Li /* 05 09 2005 Harish M First Version */
450*a97c2a1fSXin Li /* */
451*a97c2a1fSXin Li /*****************************************************************************/
impeg2_mc_fullx_fully_8x8(UWORD8 * pu1_out,UWORD8 * pu1_ref,UWORD32 u4_ref_wid,UWORD32 u4_out_wid)452*a97c2a1fSXin Li void impeg2_mc_fullx_fully_8x8(UWORD8 *pu1_out,
453*a97c2a1fSXin Li UWORD8 *pu1_ref,
454*a97c2a1fSXin Li UWORD32 u4_ref_wid,
455*a97c2a1fSXin Li UWORD32 u4_out_wid)
456*a97c2a1fSXin Li {
457*a97c2a1fSXin Li
458*a97c2a1fSXin Li UWORD32 i;
459*a97c2a1fSXin Li
460*a97c2a1fSXin Li for(i = 0; i < BLK_SIZE; i++)
461*a97c2a1fSXin Li {
462*a97c2a1fSXin Li memmove(pu1_out, pu1_ref, BLK_SIZE);
463*a97c2a1fSXin Li pu1_ref += u4_ref_wid;
464*a97c2a1fSXin Li pu1_out += u4_out_wid;
465*a97c2a1fSXin Li }
466*a97c2a1fSXin Li return;
467*a97c2a1fSXin Li }
468