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
24 #include "bit_depth_template.c"
26 static void FUNC(ff_emulated_edge_mc
)(uint8_t *buf
, const uint8_t *src
,
27 ptrdiff_t buf_linesize
,
28 ptrdiff_t src_linesize
,
29 int block_w
, int block_h
,
30 int src_x
, int src_y
, int w
, int h
)
33 int start_y
, start_x
, end_y
, end_x
;
36 src
+= (h
- 1 - src_y
) * src_linesize
;
38 } else if (src_y
<= -block_h
) {
39 src
+= (1 - block_h
- src_y
) * src_linesize
;
43 src
+= (w
- 1 - src_x
) * sizeof(pixel
);
45 } else if (src_x
<= -block_w
) {
46 src
+= (1 - block_w
- src_x
) * sizeof(pixel
);
50 start_y
= FFMAX(0, -src_y
);
51 start_x
= FFMAX(0, -src_x
);
52 end_y
= FFMIN(block_h
, h
-src_y
);
53 end_x
= FFMIN(block_w
, w
-src_x
);
54 assert(start_y
< end_y
&& block_h
);
55 assert(start_x
< end_x
&& block_w
);
58 src
+= start_y
* src_linesize
+ start_x
* sizeof(pixel
);
59 buf
+= start_x
* sizeof(pixel
);
62 for (y
= 0; y
< start_y
; y
++) {
63 memcpy(buf
, src
, w
* sizeof(pixel
));
68 for (; y
< end_y
; y
++) {
69 memcpy(buf
, src
, w
* sizeof(pixel
));
76 for (; y
< block_h
; y
++) {
77 memcpy(buf
, src
, w
* sizeof(pixel
));
81 buf
-= block_h
* buf_linesize
+ start_x
* sizeof(pixel
);
83 pixel
*bufp
= (pixel
*) buf
;
86 for(x
= 0; x
< start_x
; x
++) {
87 bufp
[x
] = bufp
[start_x
];
91 for (x
= end_x
; x
< block_w
; x
++) {
92 bufp
[x
] = bufp
[end_x
- 1];