FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
videodsp_template.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2002-2012 Michael Niedermayer
3  * Copyright (C) 2012 Ronald S. Bultje
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21 
22 #include <assert.h>
23 
24 #include "bit_depth_template.c"
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)
30 {
31  int x, y;
32  int start_y, start_x, end_y, end_x;
33 
34  if (!w || !h)
35  return;
36 
37  if (src_y >= h) {
38  src -= src_y * src_linesize;
39  src += (h - 1) * src_linesize;
40  src_y = h - 1;
41  } else if (src_y <= -block_h) {
42  src -= src_y * src_linesize;
43  src += (1 - block_h) * src_linesize;
44  src_y = 1 - block_h;
45  }
46  if (src_x >= w) {
47  src += (w - 1 - src_x) * sizeof(pixel);
48  src_x = w - 1;
49  } else if (src_x <= -block_w) {
50  src += (1 - block_w - src_x) * sizeof(pixel);
51  src_x = 1 - block_w;
52  }
53 
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);
60 
61  w = end_x - start_x;
62  src += start_y * src_linesize + start_x * sizeof(pixel);
63  buf += start_x * sizeof(pixel);
64 
65  // top
66  for (y = 0; y < start_y; y++) {
67  memcpy(buf, src, w * sizeof(pixel));
68  buf += buf_linesize;
69  }
70 
71  // copy existing part
72  for (; y < end_y; y++) {
73  memcpy(buf, src, w * sizeof(pixel));
74  src += src_linesize;
75  buf += buf_linesize;
76  }
77 
78  // bottom
79  src -= src_linesize;
80  for (; y < block_h; y++) {
81  memcpy(buf, src, w * sizeof(pixel));
82  buf += buf_linesize;
83  }
84 
85  buf -= block_h * buf_linesize + start_x * sizeof(pixel);
86  while (block_h--) {
87  pixel *bufp = (pixel *) buf;
88 
89  // left
90  for(x = 0; x < start_x; x++) {
91  bufp[x] = bufp[start_x];
92  }
93 
94  // right
95  for (x = end_x; x < block_w; x++) {
96  bufp[x] = bufp[end_x - 1];
97  }
98  buf += buf_linesize;
99  }
100 }