]> git.sesse.net Git - ffmpeg/blob - libavcodec/hpel_template.c
x86: h264qpel: Move stray comment to the right spot and clarify it
[ffmpeg] / libavcodec / hpel_template.c
1 /*
2  * Copyright (c) 2000, 2001 Fabrice Bellard
3  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
4  *
5  * This file is part of Libav.
6  *
7  * Libav 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  * Libav 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 Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 #define DEF_HPEL(OPNAME, OP) \
23 static inline void FUNCC(OPNAME ## _pixels2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
24     int i;\
25     for(i=0; i<h; i++){\
26         OP(*((pixel2*)(block  )), AV_RN2P(pixels  ));\
27         pixels+=line_size;\
28         block +=line_size;\
29     }\
30 }\
31 static inline void FUNCC(OPNAME ## _pixels4)(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
32     int i;\
33     for(i=0; i<h; i++){\
34         OP(*((pixel4*)(block  )), AV_RN4P(pixels  ));\
35         pixels+=line_size;\
36         block +=line_size;\
37     }\
38 }\
39 static inline void FUNCC(OPNAME ## _pixels8)(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
40     int i;\
41     for(i=0; i<h; i++){\
42         OP(*((pixel4*)(block                )), AV_RN4P(pixels                ));\
43         OP(*((pixel4*)(block+4*sizeof(pixel))), AV_RN4P(pixels+4*sizeof(pixel)));\
44         pixels+=line_size;\
45         block +=line_size;\
46     }\
47 }\
48 \
49 static inline void FUNC(OPNAME ## _pixels8_l2)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
50                                                 int src_stride1, int src_stride2, int h){\
51     int i;\
52     for(i=0; i<h; i++){\
53         pixel4 a,b;\
54         a= AV_RN4P(&src1[i*src_stride1  ]);\
55         b= AV_RN4P(&src2[i*src_stride2  ]);\
56         OP(*((pixel4*)&dst[i*dst_stride  ]), rnd_avg_pixel4(a, b));\
57         a= AV_RN4P(&src1[i*src_stride1+4*sizeof(pixel)]);\
58         b= AV_RN4P(&src2[i*src_stride2+4*sizeof(pixel)]);\
59         OP(*((pixel4*)&dst[i*dst_stride+4*sizeof(pixel)]), rnd_avg_pixel4(a, b));\
60     }\
61 }\
62 \
63 static inline void FUNC(OPNAME ## _pixels4_l2)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
64                                                 int src_stride1, int src_stride2, int h){\
65     int i;\
66     for(i=0; i<h; i++){\
67         pixel4 a,b;\
68         a= AV_RN4P(&src1[i*src_stride1  ]);\
69         b= AV_RN4P(&src2[i*src_stride2  ]);\
70         OP(*((pixel4*)&dst[i*dst_stride  ]), rnd_avg_pixel4(a, b));\
71     }\
72 }\
73 \
74 static inline void FUNC(OPNAME ## _pixels2_l2)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
75                                                 int src_stride1, int src_stride2, int h){\
76     int i;\
77     for(i=0; i<h; i++){\
78         pixel4 a,b;\
79         a= AV_RN2P(&src1[i*src_stride1  ]);\
80         b= AV_RN2P(&src2[i*src_stride2  ]);\
81         OP(*((pixel2*)&dst[i*dst_stride  ]), rnd_avg_pixel4(a, b));\
82     }\
83 }\
84 \
85 static inline void FUNC(OPNAME ## _pixels16_l2)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
86                                                 int src_stride1, int src_stride2, int h){\
87     FUNC(OPNAME ## _pixels8_l2)(dst  , src1  , src2  , dst_stride, src_stride1, src_stride2, h);\
88     FUNC(OPNAME ## _pixels8_l2)(dst+8*sizeof(pixel), src1+8*sizeof(pixel), src2+8*sizeof(pixel), dst_stride, src_stride1, src_stride2, h);\
89 }\
90 \
91 CALL_2X_PIXELS(FUNCC(OPNAME ## _pixels16)    , FUNCC(OPNAME ## _pixels8)    , 8*sizeof(pixel))
92
93
94 #define op_avg(a, b) a = rnd_avg_pixel4(a, b)
95 #define op_put(a, b) a = b
96
97 DEF_HPEL(avg, op_avg)
98 DEF_HPEL(put, op_put)
99 #undef op_avg
100 #undef op_put