xref: /aosp_15_r20/external/libmpeg2/common/impeg2_inter_pred.c (revision a97c2a1f0a796dc32bed80d3353c69c5fc07c750)
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