2 * This file is part of FFmpeg.
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 #include "libavutil/attributes.h"
21 #include "libavutil/common.h"
22 #include "mpegvideodsp.h"
24 static void gmc1_c(uint8_t *dst
, uint8_t *src
, int stride
, int h
,
25 int x16
, int y16
, int rounder
)
27 const int A
= (16 - x16
) * (16 - y16
);
28 const int B
= (x16
) * (16 - y16
);
29 const int C
= (16 - x16
) * (y16
);
30 const int D
= (x16
) * (y16
);
33 for (i
= 0; i
< h
; i
++) {
34 dst
[0] = (A
* src
[0] + B
* src
[1] + C
* src
[stride
+ 0] + D
* src
[stride
+ 1] + rounder
) >> 8;
35 dst
[1] = (A
* src
[1] + B
* src
[2] + C
* src
[stride
+ 1] + D
* src
[stride
+ 2] + rounder
) >> 8;
36 dst
[2] = (A
* src
[2] + B
* src
[3] + C
* src
[stride
+ 2] + D
* src
[stride
+ 3] + rounder
) >> 8;
37 dst
[3] = (A
* src
[3] + B
* src
[4] + C
* src
[stride
+ 3] + D
* src
[stride
+ 4] + rounder
) >> 8;
38 dst
[4] = (A
* src
[4] + B
* src
[5] + C
* src
[stride
+ 4] + D
* src
[stride
+ 5] + rounder
) >> 8;
39 dst
[5] = (A
* src
[5] + B
* src
[6] + C
* src
[stride
+ 5] + D
* src
[stride
+ 6] + rounder
) >> 8;
40 dst
[6] = (A
* src
[6] + B
* src
[7] + C
* src
[stride
+ 6] + D
* src
[stride
+ 7] + rounder
) >> 8;
41 dst
[7] = (A
* src
[7] + B
* src
[8] + C
* src
[stride
+ 7] + D
* src
[stride
+ 8] + rounder
) >> 8;
47 void ff_gmc_c(uint8_t *dst
, uint8_t *src
, int stride
, int h
, int ox
, int oy
,
48 int dxx
, int dxy
, int dyx
, int dyy
, int shift
, int r
,
49 int width
, int height
)
52 const int s
= 1 << shift
;
57 for (y
= 0; y
< h
; y
++) {
62 for (x
= 0; x
< 8; x
++) { // FIXME: optimize
66 int frac_x
= src_x
& (s
- 1);
67 int frac_y
= src_y
& (s
- 1);
72 if ((unsigned) src_x
< width
) {
73 if ((unsigned) src_y
< height
) {
74 index
= src_x
+ src_y
* stride
;
76 ((src
[index
] * (s
- frac_x
) +
77 src
[index
+ 1] * frac_x
) * (s
- frac_y
) +
78 (src
[index
+ stride
] * (s
- frac_x
) +
79 src
[index
+ stride
+ 1] * frac_x
) * frac_y
+
82 index
= src_x
+ av_clip(src_y
, 0, height
) * stride
;
84 ((src
[index
] * (s
- frac_x
) +
85 src
[index
+ 1] * frac_x
) * s
+
89 if ((unsigned) src_y
< height
) {
90 index
= av_clip(src_x
, 0, width
) + src_y
* stride
;
92 ((src
[index
] * (s
- frac_y
) +
93 src
[index
+ stride
] * frac_y
) * s
+
96 index
= av_clip(src_x
, 0, width
) +
97 av_clip(src_y
, 0, height
) * stride
;
98 dst
[y
* stride
+ x
] = src
[index
];
110 av_cold
void ff_mpegvideodsp_init(MpegVideoDSPContext
*c
)
116 ff_mpegvideodsp_init_ppc(c
);
118 ff_mpegvideodsp_init_x86(c
);