13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------
23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo
33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License.
63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at
73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software
113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied.
143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions
153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License.
163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * -------------------------------------------------------------------
173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */
183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*
193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong INPUT AND OUTPUT DEFINITIONS
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Inputs:
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    xpos = x half-pixel of (x,y) coordinates within a VOP; motion
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           compensated coordinates; native data type
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ypos = y half-pixel of (x,y) coordinates within a VOP; motion
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           compensated coordinates; native data type
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    comp = pointer to 8-bit compensated prediction values within a VOP;
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           computed by this module (i/o); full-pel resolution; 8-bit data
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    c_prev = pointer to previous 8-bit prediction values within a VOP;
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong         values range from (0-255); full-pel resolution; 8-bit data
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    sh_d = pointer to residual values used to compensate the predicted
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           value; values range from (-512 to 511); full-pel resolution;
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           native data type
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width = width of the VOP in pixels (x axis); full-pel resolution;
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        native data type
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    height = height of the VOP in pixels (y axis); full-pel resolution;
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong         native data type
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    rnd1 = rounding value for case when one dimension uses half-pel
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           resolution; native data type
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    rnd2 = rounding value for case when two dimensions uses half-pel
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           resolution; native data type
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Outputs:
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    returns 1
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores/Buffers/Pointers Needed:
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores/Buffers/Pointers Needed:
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Pointers and Buffers Modified:
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    comp = buffer contains newly computed compensated prediction values
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores Modified:
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores Modified:
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FUNCTION DESCRIPTION
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Summary:
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong This function performs motion compensated prediction for the case where
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong the motion vector points to a block outside the VOP. The function interpolates
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong the pixels that are outside the VOP using the boundary pixels for the block.
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Once the values are interpolated, the pixel values are computed for a block
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong in the current VOP. The prediction values are generated by averaging pixel
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong values in the previous VOP; the block position in the previous frame is
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong computed from the current block's motion vector. The computed pixel values
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong are calculated by adding the prediction values to the block residual values.
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Details:
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong First, this functions determines which VOP boundary(ies) the motion vector
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong is outside, i.e., left, right, top, bottom. xpos is compared to the left and
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong right boundaries; ypos is compared to the top and bottom boundaries. The number
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong of block pixels inside the the boundary in the x and y directions are stored
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong in endx and endy, respectively. If the entire block is inside the x or y
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong boundary, the respectively end is set to 0.
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong After the boundaries are tested, any pixels lying outside a boundary are
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong interpolated from the boundary pixels. For example, if the block is outside the
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong bottom boundary, boundary pixels alone the bottom of the VOP as used to
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong interpolated those pixels lying outside the bottom boundary. The interpolation
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong used is a simple column-wise or row-wise copy of the boundary pixels (inside the
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block) depending on which boundary the block is outside. In our example, each
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong boundary pixel would be copied column-wise to the pixel beneath it. If the
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block was outside right boundary, the boundary pixels would be copied row-wise
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong to the pixel to the right of it. If the block was outside both an x and y
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong boundary, the boundary pixels would be copied row-wise for the portion of the
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block outside the x boundary, and column-wise for the portion of the block
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong outside the y boundary. And so on.
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Once the pixel interpolation is complete, the motion compensated output values
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (comp[]) are calculed from the motion compensated prediction (pred[])values and
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong the residual values (sh_d[]) of the current frame. The prediction values are
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong generated by averaging pixel values in the previous VOP; the block position in
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong the previous frame is computed from the current block's motion vector. The
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong computed pixel values are calculated by adding the prediction values to the
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block residual values.
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*/
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; INCLUDES
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h"
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "motion_comp.h"
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define PAD_CORNER {    temp = *prev; \
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp |= (temp<<8);  \
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp |= (temp<<16); \
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)ptr) = temp; \
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp;  \
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp;  \
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp;  \
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp;  \
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp;  \
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp;  \
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp;  \
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp;  \
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp;  \
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp;  \
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp;  \
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp;  \
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp;  \
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp;  \
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp;  }
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define PAD_ROW  {  temp = *((uint32*)prev); \
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp2 = *((uint32*)(prev+4)); \
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)ptr) =  temp;\
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) =  temp2; \
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp2;\
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp2;\
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp2;\
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp2;\
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp2;\
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp2;\
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp2;}
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define PAD_EXTRA_4x8           {   temp = *((uint32*)(prev+8)); \
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *((uint32*)ptr) =  temp; \
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *((uint32*)(ptr+=16)) = temp; \
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *((uint32*)(ptr+=16)) = temp; \
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *((uint32*)(ptr+=16)) = temp; \
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *((uint32*)(ptr+=16)) = temp; \
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *((uint32*)(ptr+=16)) = temp; \
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *((uint32*)(ptr+=16)) = temp; \
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *((uint32*)(ptr+=16)) = temp; }
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define PAD_COL { temp = *prev; \
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp|=(temp<<8);  temp|=(temp<<16); \
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)ptr) = temp; \
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp; \
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = *(prev+=16); \
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp|=(temp<<8);  temp|=(temp<<16); \
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp; \
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = *(prev+=16); \
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp|=(temp<<8);  temp|=(temp<<16); \
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp; \
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = *(prev+=16); \
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp|=(temp<<8);  temp|=(temp<<16); \
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp; \
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = *(prev+=16); \
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp|=(temp<<8);  temp|=(temp<<16); \
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp; \
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = *(prev+=16); \
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp|=(temp<<8);  temp|=(temp<<16); \
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp; \
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = *(prev+=16); \
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp|=(temp<<8);  temp|=(temp<<16); \
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp; \
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = *(prev+=16); \
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp|=(temp<<8);  temp|=(temp<<16); \
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = temp; \
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = temp;}
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* copy 8x8 block */
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define COPY_BLOCK  {           *((uint32*)ptr) = *((uint32*)prev); \
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4));  }
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define COPY_12x8       {       *((uint32*)ptr) = *((uint32*)prev); \
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+8)) = *((uint32*)(prev+8)); \
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+8)) = *((uint32*)(prev+8)); \
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+8)) = *((uint32*)(prev+8)); \
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+8)) = *((uint32*)(prev+8)); \
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+8)) = *((uint32*)(prev+8)); \
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+8)) = *((uint32*)(prev+8)); \
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+8)) = *((uint32*)(prev+8)); \
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+=16)) = *((uint32*)(prev+=width)); \
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+4)) = *((uint32*)(prev+4)); \
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr+8)) = *((uint32*)(prev+8)); }
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; FUNCTION CODE
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint GetPredOutside(
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int xpos,       /* i */
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int ypos,       /* i */
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *c_prev,      /* i */
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *pred_block,      /* i */
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int width,      /* i */
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int height,     /* i */
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int rnd1,       /* i */
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int pred_width
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong)
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Define all local variables
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8   *prev;      /* pointers to adjacent pixels in the    */
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8   pred[256];  /* storage for padded pixel values, 16x16 */
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8   *ptr;
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int xoffset;
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 temp, temp2;
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Function body here
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* saturate xpos and ypos */
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (xpos < -16) xpos = -16;
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (xpos > ((width - 1) << 1)) xpos = (width - 1) << 1;
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (ypos < -16) ypos = -16;
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (ypos > ((height - 1) << 1)) ypos = (height - 1) << 1;
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (xpos < 0)
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (ypos < 0) /* pad top left of frame */
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* copy the block */
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (8 << 4) + 8;
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = c_prev;
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            COPY_BLOCK
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad the corner */
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred;
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = pred + (8 << 4) + 8;
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_CORNER
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad top */
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + 8;
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = pred + (8 << 4) + 8;
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_ROW
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad left */
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (8 << 4);
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = pred + (8 << 4) + 8;
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_COL
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (((ypos >> 1) + 8) << 4) + (xpos >> 1) + 8;
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            GetPredAdvBTable[ypos&1][xpos&1](ptr, pred_block, 16, (pred_width << 1) | rnd1);
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return 1;
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else if ((ypos >> 1) < (height - B_SIZE)) /* pad left of frame */
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* copy block */
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + 8;
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = c_prev + (ypos >> 1) * width;
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            COPY_BLOCK
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* copy extra line */
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr += 16)) = *((uint32*)(prev += width));
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr + 4)) = *((uint32*)(prev + 4));
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad left */
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred;
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = pred + 8;
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_COL
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad extra line */
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = *(prev += 16);
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp |= (temp << 8);
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp |= (temp << 16);
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr += 16)) = temp;
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr + 4)) = temp;
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + 8 + (xpos >> 1);
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            GetPredAdvBTable[ypos&1][xpos&1](ptr, pred_block, 16, (pred_width << 1) | rnd1);
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return 1;
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else /* pad bottom left of frame */
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* copy the block */
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + 8; /* point to the center */
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = c_prev + width * (height - 8);
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            COPY_BLOCK
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad the corner */
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (8 << 4);
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = ptr - 8;
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_CORNER
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad bottom */
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (8 << 4) + 8;
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = ptr - 16;
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_ROW
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad left */
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred ;
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = ptr + 8;
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_COL
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + 8 + (((ypos >> 1) - (height - 8)) << 4) + (xpos >> 1);
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            GetPredAdvBTable[ypos&1][xpos&1](ptr, pred_block, 16, (pred_width << 1) | rnd1);
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return 1;
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else if ((xpos >> 1) < (width - B_SIZE))
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (ypos < 0) /* pad top of frame */
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            xoffset = xpos >> 1;
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            xoffset = xoffset & 0x3; /* word align ptr */
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* copy block */
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (8 << 4);
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = c_prev + (xpos >> 1) - xoffset;
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (xoffset || (xpos&1)) /* copy extra 4x8 */
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                COPY_12x8
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                COPY_BLOCK
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad top */
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred;
3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = pred + (8 << 4);
3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_ROW
3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (xoffset || (xpos&1)) /* pad extra 4x8 */
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ptr = pred + 8;
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PAD_EXTRA_4x8
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (((ypos >> 1) + 8) << 4) + xoffset;
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            GetPredAdvBTable[ypos&1][xpos&1](ptr, pred_block, 16, (pred_width << 1) | rnd1);
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return 1;
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else /* pad bottom of frame */
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            xoffset = xpos >> 1;
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            xoffset = xoffset & 0x3; /* word align ptr */
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* copy block */
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred ;
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = c_prev + width * (height - 8) + (xpos >> 1) - xoffset;
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (xoffset  || (xpos&1))
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                COPY_12x8
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                COPY_BLOCK
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad bottom */
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (8 << 4);
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = ptr - 16;
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_ROW
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (xoffset || (xpos&1))
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ptr = pred + (8 << 4) + 8;
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PAD_EXTRA_4x8
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (((ypos >> 1) - (height - 8)) << 4) + xoffset;
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            GetPredAdvBTable[ypos&1][xpos&1](ptr, pred_block, 16, (pred_width << 1) | rnd1);
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return 1;
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (ypos < 0) /* pad top right of frame */
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* copy block */
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (8 << 4);
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = c_prev + width - 8;
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            COPY_BLOCK
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad top-right */
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + 8;
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = pred + (8 << 4) + 7;
4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_CORNER
4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad top */
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred ;
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = pred + (8 << 4);
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_ROW;
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad right */
4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (8 << 4) + 8;
4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = ptr - 1;
4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_COL;
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + ((8 + (ypos >> 1)) << 4) + (8 - (width - (xpos >> 1)));
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            GetPredAdvBTable[ypos&1][xpos&1](ptr, pred_block, 16, (pred_width << 1) | rnd1);
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return 1;
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else if ((ypos >> 1) < (height - B_SIZE)) /* pad right of frame */
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* copy block */
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred;
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = c_prev + (ypos >> 1) * width + width - 8;
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            COPY_BLOCK
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* copy extra line */
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr += 16)) = *((uint32*)(prev += width));
4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr + 4)) = *((uint32*)(prev + 4));
4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad right */
4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + 8;
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = ptr - 1;
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_COL;
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad extra line */
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = *(prev += 16);
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp |= (temp << 8);
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp |= (temp << 16);
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr += 16)) = temp;
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *((uint32*)(ptr + 4)) = temp;
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + 8 - (width - (xpos >> 1));
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            GetPredAdvBTable[ypos&1][xpos&1](ptr, pred_block, 16, (pred_width << 1) | rnd1);
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return 1;
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else /* pad bottom right of frame */
4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* copy block */
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred;
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = c_prev + width * (height - 8) + width - 8;
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            COPY_BLOCK
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad bottom-right */
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (8 << 4) + 8;
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = ptr - 17;
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_CORNER
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad right */
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + 8;
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = ptr - 1;
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_COL
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pad bottom */
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + (8 << 4);
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            prev = ptr - 16;
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PAD_ROW
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ptr = pred + 8 - (width - (xpos >> 1)) + ((8 - (height - (ypos >> 1))) << 4);
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            GetPredAdvBTable[ypos&1][xpos&1](ptr, pred_block, 16, (pred_width << 1) | rnd1);
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return 1;
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
515