2 * Copyright (c) 2002-2004 Michael Niedermayer
3 * Copyright (C) 2012 Ronald S. Bultje
5 * This file is part of Libav.
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.
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.
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
22 #include "bit_depth_template.c"
24 static void FUNC(ff_emulated_edge_mc
)(uint8_t *buf
, const uint8_t *src
,
26 int block_w
, int block_h
,
27 int src_x
, int src_y
, int w
, int h
)
30 int start_y
, start_x
, end_y
, end_x
;
33 src
+= (h
- 1 - src_y
) * linesize
;
35 } else if (src_y
<= -block_h
) {
36 src
+= (1 - block_h
- src_y
) * linesize
;
40 src
+= (w
- 1 - src_x
) * sizeof(pixel
);
42 } else if (src_x
<= -block_w
) {
43 src
+= (1 - block_w
- src_x
) * sizeof(pixel
);
47 start_y
= FFMAX(0, -src_y
);
48 start_x
= FFMAX(0, -src_x
);
49 end_y
= FFMIN(block_h
, h
-src_y
);
50 end_x
= FFMIN(block_w
, w
-src_x
);
51 assert(start_y
< end_y
&& block_h
);
52 assert(start_x
< end_x
&& block_w
);
55 src
+= start_y
* linesize
+ start_x
* sizeof(pixel
);
56 buf
+= start_x
* sizeof(pixel
);
59 for (y
= 0; y
< start_y
; y
++) {
60 memcpy(buf
, src
, w
* sizeof(pixel
));
65 for (; y
< end_y
; y
++) {
66 memcpy(buf
, src
, w
* sizeof(pixel
));
73 for (; y
< block_h
; y
++) {
74 memcpy(buf
, src
, w
* sizeof(pixel
));
78 buf
-= block_h
* linesize
+ start_x
* sizeof(pixel
);
80 pixel
*bufp
= (pixel
*) buf
;
83 for(x
= 0; x
< start_x
; x
++) {
84 bufp
[x
] = bufp
[start_x
];
88 for (x
= end_x
; x
< block_w
; x
++) {
89 bufp
[x
] = bufp
[end_x
- 1];