h264chroma_template.c 6.95 KB
Newer Older
1 2 3 4
/*
 * Copyright (c) 2000, 2001 Fabrice Bellard
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8 9 10 11
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13 14 15 16 17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19 20 21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

22
#include "libavutil/avassert.h"
23 24 25 26

#include "bit_depth_template.c"

#define H264_CHROMA_MC(OPNAME, OP)\
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
static void FUNCC(OPNAME ## h264_chroma_mc1)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\
    pixel *dst = (pixel*)_dst;\
    pixel *src = (pixel*)_src;\
    const int A=(8-x)*(8-y);\
    const int B=(  x)*(8-y);\
    const int C=(8-x)*(  y);\
    const int D=(  x)*(  y);\
    int i;\
    stride >>= sizeof(pixel)-1;\
    \
    av_assert2(x<8 && y<8 && x>=0 && y>=0);\
\
    if(D){\
        for(i=0; i<h; i++){\
            OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
            dst+= stride;\
            src+= stride;\
        }\
45
    } else if (B + C) {\
46 47 48 49 50 51 52
        const int E= B+C;\
        const int step= C ? stride : 1;\
        for(i=0; i<h; i++){\
            OP(dst[0], (A*src[0] + E*src[step+0]));\
            dst+= stride;\
            src+= stride;\
        }\
53 54 55 56 57 58
    } else {\
        for(i=0; i<h; i++){\
            OP(dst[0], (A*src[0]));\
            dst+= stride;\
            src+= stride;\
        }\
59 60
    }\
}\
61 62 63 64 65 66 67 68
static void FUNCC(OPNAME ## h264_chroma_mc2)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\
    pixel *dst = (pixel*)_dst;\
    pixel *src = (pixel*)_src;\
    const int A=(8-x)*(8-y);\
    const int B=(  x)*(8-y);\
    const int C=(8-x)*(  y);\
    const int D=(  x)*(  y);\
    int i;\
69
    stride >>= sizeof(pixel)-1;\
70
    \
71
    av_assert2(x<8 && y<8 && x>=0 && y>=0);\
72 73 74 75 76 77 78 79
\
    if(D){\
        for(i=0; i<h; i++){\
            OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
            OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
            dst+= stride;\
            src+= stride;\
        }\
80
    } else if (B + C) {\
81 82 83 84 85 86 87 88
        const int E= B+C;\
        const int step= C ? stride : 1;\
        for(i=0; i<h; i++){\
            OP(dst[0], (A*src[0] + E*src[step+0]));\
            OP(dst[1], (A*src[1] + E*src[step+1]));\
            dst+= stride;\
            src+= stride;\
        }\
89 90 91 92 93 94 95
    } else {\
        for ( i = 0; i < h; i++){\
            OP(dst[0], A * src[0]);\
            OP(dst[1], A * src[1]);\
            dst += stride;\
            src += stride;\
        }\
96 97 98 99 100 101 102 103 104 105 106
    }\
}\
\
static void FUNCC(OPNAME ## h264_chroma_mc4)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\
    pixel *dst = (pixel*)_dst;\
    pixel *src = (pixel*)_src;\
    const int A=(8-x)*(8-y);\
    const int B=(  x)*(8-y);\
    const int C=(8-x)*(  y);\
    const int D=(  x)*(  y);\
    int i;\
107
    stride >>= sizeof(pixel)-1;\
108
    \
109
    av_assert2(x<8 && y<8 && x>=0 && y>=0);\
110 111 112 113 114 115 116 117 118 119
\
    if(D){\
        for(i=0; i<h; i++){\
            OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
            OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
            OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
            OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
            dst+= stride;\
            src+= stride;\
        }\
120
    } else if (B + C) {\
121 122 123 124 125 126 127 128 129 130
        const int E= B+C;\
        const int step= C ? stride : 1;\
        for(i=0; i<h; i++){\
            OP(dst[0], (A*src[0] + E*src[step+0]));\
            OP(dst[1], (A*src[1] + E*src[step+1]));\
            OP(dst[2], (A*src[2] + E*src[step+2]));\
            OP(dst[3], (A*src[3] + E*src[step+3]));\
            dst+= stride;\
            src+= stride;\
        }\
131 132 133 134 135 136 137 138 139
    } else {\
        for ( i = 0; i < h; i++){\
            OP(dst[0], A * src[0]);\
            OP(dst[1], A * src[1]);\
            OP(dst[2], A * src[2]);\
            OP(dst[3], A * src[3]);\
            dst += stride;\
            src += stride;\
        }\
140 141 142 143 144 145 146 147 148 149 150
    }\
}\
\
static void FUNCC(OPNAME ## h264_chroma_mc8)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\
    pixel *dst = (pixel*)_dst;\
    pixel *src = (pixel*)_src;\
    const int A=(8-x)*(8-y);\
    const int B=(  x)*(8-y);\
    const int C=(8-x)*(  y);\
    const int D=(  x)*(  y);\
    int i;\
151
    stride >>= sizeof(pixel)-1;\
152
    \
153
    av_assert2(x<8 && y<8 && x>=0 && y>=0);\
154 155 156 157 158 159 160 161 162 163 164 165 166 167
\
    if(D){\
        for(i=0; i<h; i++){\
            OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
            OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
            OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
            OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
            OP(dst[4], (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5]));\
            OP(dst[5], (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6]));\
            OP(dst[6], (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7]));\
            OP(dst[7], (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8]));\
            dst+= stride;\
            src+= stride;\
        }\
168
    } else if (B + C) {\
169 170 171 172 173 174 175 176 177 178 179 180 181 182
        const int E= B+C;\
        const int step= C ? stride : 1;\
        for(i=0; i<h; i++){\
            OP(dst[0], (A*src[0] + E*src[step+0]));\
            OP(dst[1], (A*src[1] + E*src[step+1]));\
            OP(dst[2], (A*src[2] + E*src[step+2]));\
            OP(dst[3], (A*src[3] + E*src[step+3]));\
            OP(dst[4], (A*src[4] + E*src[step+4]));\
            OP(dst[5], (A*src[5] + E*src[step+5]));\
            OP(dst[6], (A*src[6] + E*src[step+6]));\
            OP(dst[7], (A*src[7] + E*src[step+7]));\
            dst+= stride;\
            src+= stride;\
        }\
183 184 185 186 187 188 189 190 191 192 193 194 195
    } else {\
        for ( i = 0; i < h; i++){\
            OP(dst[0], A * src[0]);\
            OP(dst[1], A * src[1]);\
            OP(dst[2], A * src[2]);\
            OP(dst[3], A * src[3]);\
            OP(dst[4], A * src[4]);\
            OP(dst[5], A * src[5]);\
            OP(dst[6], A * src[6]);\
            OP(dst[7], A * src[7]);\
            dst += stride;\
            src += stride;\
        }\
196 197 198 199 200 201 202 203 204 205
    }\
}

#define op_avg(a, b) a = (((a)+(((b) + 32)>>6)+1)>>1)
#define op_put(a, b) a = (((b) + 32)>>6)

H264_CHROMA_MC(put_       , op_put)
H264_CHROMA_MC(avg_       , op_avg)
#undef op_avg
#undef op_put