Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6148 serge 1
/*
2
 * Copyright (c) 2000, 2001 Fabrice Bellard
3
 * Copyright (c) 2002-2004 Michael Niedermayer 
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * 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
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21
 
22
#include "libavutil/avassert.h"
23
 
24
#include "bit_depth_template.c"
25
 
26
#define H264_CHROMA_MC(OPNAME, OP)\
27
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){\
28
    pixel *dst = (pixel*)_dst;\
29
    pixel *src = (pixel*)_src;\
30
    const int A=(8-x)*(8-y);\
31
    const int B=(  x)*(8-y);\
32
    const int C=(8-x)*(  y);\
33
    const int D=(  x)*(  y);\
34
    int i;\
35
    stride >>= sizeof(pixel)-1;\
36
    \
37
    av_assert2(x<8 && y<8 && x>=0 && y>=0);\
38
\
39
    if(D){\
40
        for(i=0; i
41
            OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
42
            dst+= stride;\
43
            src+= stride;\
44
        }\
45
    }else{\
46
        const int E= B+C;\
47
        const int step= C ? stride : 1;\
48
        for(i=0; i
49
            OP(dst[0], (A*src[0] + E*src[step+0]));\
50
            dst+= stride;\
51
            src+= stride;\
52
        }\
53
    }\
54
}\
55
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){\
56
    pixel *dst = (pixel*)_dst;\
57
    pixel *src = (pixel*)_src;\
58
    const int A=(8-x)*(8-y);\
59
    const int B=(  x)*(8-y);\
60
    const int C=(8-x)*(  y);\
61
    const int D=(  x)*(  y);\
62
    int i;\
63
    stride >>= sizeof(pixel)-1;\
64
    \
65
    av_assert2(x<8 && y<8 && x>=0 && y>=0);\
66
\
67
    if(D){\
68
        for(i=0; i
69
            OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
70
            OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
71
            dst+= stride;\
72
            src+= stride;\
73
        }\
74
    }else{\
75
        const int E= B+C;\
76
        const int step= C ? stride : 1;\
77
        for(i=0; i
78
            OP(dst[0], (A*src[0] + E*src[step+0]));\
79
            OP(dst[1], (A*src[1] + E*src[step+1]));\
80
            dst+= stride;\
81
            src+= stride;\
82
        }\
83
    }\
84
}\
85
\
86
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){\
87
    pixel *dst = (pixel*)_dst;\
88
    pixel *src = (pixel*)_src;\
89
    const int A=(8-x)*(8-y);\
90
    const int B=(  x)*(8-y);\
91
    const int C=(8-x)*(  y);\
92
    const int D=(  x)*(  y);\
93
    int i;\
94
    stride >>= sizeof(pixel)-1;\
95
    \
96
    av_assert2(x<8 && y<8 && x>=0 && y>=0);\
97
\
98
    if(D){\
99
        for(i=0; i
100
            OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
101
            OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
102
            OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
103
            OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
104
            dst+= stride;\
105
            src+= stride;\
106
        }\
107
    }else{\
108
        const int E= B+C;\
109
        const int step= C ? stride : 1;\
110
        for(i=0; i
111
            OP(dst[0], (A*src[0] + E*src[step+0]));\
112
            OP(dst[1], (A*src[1] + E*src[step+1]));\
113
            OP(dst[2], (A*src[2] + E*src[step+2]));\
114
            OP(dst[3], (A*src[3] + E*src[step+3]));\
115
            dst+= stride;\
116
            src+= stride;\
117
        }\
118
    }\
119
}\
120
\
121
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){\
122
    pixel *dst = (pixel*)_dst;\
123
    pixel *src = (pixel*)_src;\
124
    const int A=(8-x)*(8-y);\
125
    const int B=(  x)*(8-y);\
126
    const int C=(8-x)*(  y);\
127
    const int D=(  x)*(  y);\
128
    int i;\
129
    stride >>= sizeof(pixel)-1;\
130
    \
131
    av_assert2(x<8 && y<8 && x>=0 && y>=0);\
132
\
133
    if(D){\
134
        for(i=0; i
135
            OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
136
            OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
137
            OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
138
            OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
139
            OP(dst[4], (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5]));\
140
            OP(dst[5], (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6]));\
141
            OP(dst[6], (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7]));\
142
            OP(dst[7], (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8]));\
143
            dst+= stride;\
144
            src+= stride;\
145
        }\
146
    }else{\
147
        const int E= B+C;\
148
        const int step= C ? stride : 1;\
149
        for(i=0; i
150
            OP(dst[0], (A*src[0] + E*src[step+0]));\
151
            OP(dst[1], (A*src[1] + E*src[step+1]));\
152
            OP(dst[2], (A*src[2] + E*src[step+2]));\
153
            OP(dst[3], (A*src[3] + E*src[step+3]));\
154
            OP(dst[4], (A*src[4] + E*src[step+4]));\
155
            OP(dst[5], (A*src[5] + E*src[step+5]));\
156
            OP(dst[6], (A*src[6] + E*src[step+6]));\
157
            OP(dst[7], (A*src[7] + E*src[step+7]));\
158
            dst+= stride;\
159
            src+= stride;\
160
        }\
161
    }\
162
}
163
 
164
#define op_avg(a, b) a = (((a)+(((b) + 32)>>6)+1)>>1)
165
#define op_put(a, b) a = (((b) + 32)>>6)
166
 
167
H264_CHROMA_MC(put_       , op_put)
168
H264_CHROMA_MC(avg_       , op_avg)
169
#undef op_avg
170
#undef op_put