yading@10: /* yading@10: * Copyright (c) 2002-2012 Michael Niedermayer yading@10: * Copyright (C) 2012 Ronald S. Bultje yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: #include "bit_depth_template.c" yading@10: void FUNC(ff_emulated_edge_mc)(uint8_t *buf, const uint8_t *src, yading@10: ptrdiff_t linesize_arg, yading@10: int block_w, int block_h, yading@10: int src_x, int src_y, int w, int h) yading@10: { yading@10: int x, y; yading@10: int start_y, start_x, end_y, end_x; yading@10: int linesize = linesize_arg; yading@10: yading@10: if (!w || !h) yading@10: return; yading@10: yading@10: if (src_y >= h) { yading@10: src -= src_y * linesize; yading@10: src += (h - 1) * linesize; yading@10: src_y = h - 1; yading@10: } else if (src_y <= -block_h) { yading@10: src -= src_y * linesize; yading@10: src += (1 - block_h) * linesize; yading@10: src_y = 1 - block_h; yading@10: } yading@10: if (src_x >= w) { yading@10: src += (w - 1 - src_x) * sizeof(pixel); yading@10: src_x = w - 1; yading@10: } else if (src_x <= -block_w) { yading@10: src += (1 - block_w - src_x) * sizeof(pixel); yading@10: src_x = 1 - block_w; yading@10: } yading@10: yading@10: start_y = FFMAX(0, -src_y); yading@10: start_x = FFMAX(0, -src_x); yading@10: end_y = FFMIN(block_h, h-src_y); yading@10: end_x = FFMIN(block_w, w-src_x); yading@10: av_assert2(start_y < end_y && block_h); yading@10: av_assert2(start_x < end_x && block_w); yading@10: yading@10: w = end_x - start_x; yading@10: src += start_y * linesize + start_x * sizeof(pixel); yading@10: buf += start_x * sizeof(pixel); yading@10: yading@10: // top yading@10: for (y = 0; y < start_y; y++) { yading@10: memcpy(buf, src, w * sizeof(pixel)); yading@10: buf += linesize; yading@10: } yading@10: yading@10: // copy existing part yading@10: for (; y < end_y; y++) { yading@10: memcpy(buf, src, w * sizeof(pixel)); yading@10: src += linesize; yading@10: buf += linesize; yading@10: } yading@10: yading@10: // bottom yading@10: src -= linesize; yading@10: for (; y < block_h; y++) { yading@10: memcpy(buf, src, w * sizeof(pixel)); yading@10: buf += linesize; yading@10: } yading@10: yading@10: buf -= block_h * linesize + start_x * sizeof(pixel); yading@10: while (block_h--) { yading@10: pixel *bufp = (pixel *) buf; yading@10: yading@10: // left yading@10: for(x = 0; x < start_x; x++) { yading@10: bufp[x] = bufp[start_x]; yading@10: } yading@10: yading@10: // right yading@10: for (x = end_x; x < block_w; x++) { yading@10: bufp[x] = bufp[end_x - 1]; yading@10: } yading@10: buf += linesize; yading@10: } yading@10: }