2 * Copyright (c) 2002-2012 Michael Niedermayer
3 * Copyright (C) 2012 Ronald S. Bultje
5 * This file is part of FFmpeg.
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.
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.
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
24 #include "bit_depth_template.c"
25 void FUNC(ff_emulated_edge_mc
)(uint8_t *buf
, const uint8_t *src
,
26 ptrdiff_t buf_linesize
,
27 ptrdiff_t src_linesize
,
28 int block_w
, int block_h
,
29 int src_x
, int src_y
, int w
, int h
)
32 int start_y
, start_x
, end_y
, end_x
;
38 src
-= src_y
* src_linesize
;
39 src
+= (h
- 1) * src_linesize
;
41 } else if (src_y
<= -block_h
) {
42 src
-= src_y
* src_linesize
;
43 src
+= (1 - block_h
) * src_linesize
;
47 src
+= (w
- 1 - src_x
) * sizeof(pixel
);
49 } else if (src_x
<= -block_w
) {
50 src
+= (1 - block_w
- src_x
) * sizeof(pixel
);
54 start_y
= FFMAX(0, -src_y
);
55 start_x
= FFMAX(0, -src_x
);
56 end_y
= FFMIN(block_h
, h
-src_y
);
57 end_x
= FFMIN(block_w
, w
-src_x
);
58 av_assert2(start_y
< end_y
&& block_h
);
59 av_assert2(start_x
< end_x
&& block_w
);
62 src
+= start_y
* src_linesize
+ start_x
* sizeof(pixel
);
63 buf
+= start_x
* sizeof(pixel
);
66 for (y
= 0; y
< start_y
; y
++) {
67 memcpy(buf
, src
, w
* sizeof(pixel
));
72 for (; y
< end_y
; y
++) {
73 memcpy(buf
, src
, w
* sizeof(pixel
));
80 for (; y
< block_h
; y
++) {
81 memcpy(buf
, src
, w
* sizeof(pixel
));
85 buf
-= block_h
* buf_linesize
+ start_x
* sizeof(pixel
);
87 pixel
*bufp
= (pixel
*) buf
;
90 for(x
= 0; x
< start_x
; x
++) {
91 bufp
[x
] = bufp
[start_x
];
95 for (x
= end_x
; x
< block_w
; x
++) {
96 bufp
[x
] = bufp
[end_x
- 1];