Mercurial > mplayer.hg
annotate libmpcodecs/vf_remove_logo.c @ 25509:1cfa39a320cc
Fix update_subtitles() checking subtitle type for the wrong track.
update_subtitles() uses 'type' field from d_dvdsub even when some other track
is active. For this reason, external vobsub is not displayed when there is at
least one text track from demuxer (type is always 't' or 'a' in this case).
The solution is to check vobsub_id and dvdsub_id instead.
author | eugeni |
---|---|
date | Fri, 28 Dec 2007 20:57:38 +0000 |
parents | 00fff9a3b735 |
children | 089d5341f9bc |
rev | line source |
---|---|
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
1 /* |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
2 Copyright 2005 Robert Edele. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
3 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
4 e-mail: yartrebo@earthlink.net |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
5 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
6 This program is free software; you can redistribute it and/or modify it |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
7 under the terms of the GNU General Public License as published by the Free |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
8 Software Foundation; either version 2 of the License, or (at your option) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
9 any later version. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
10 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
11 This program is distributed in the hope that it will be useful, but |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
12 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Public License for more |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
14 details. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
15 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
16 You should have reveived a copy of the GNU General Public License |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
17 along with this program; if not, write to the |
19614 | 18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
19 02110-1301 USA | |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
20 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
21 __________________________________________________________________________ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
22 | Robert Edele Fri. 4-Feb-2005 | |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
23 | This program loads a .pgm mask file showing where a logo is and uses | |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
24 | a blur transform to remove the logo. | |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
25 |________________________________________________________________________| |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
26 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
27 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
28 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
29 * \file vf_remove_logo.c |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
30 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
31 * \brief Advanced blur-based logo removing filter. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
32 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
33 * Hello and welcome. This code implements a filter to remove annoying TV |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
34 * logos and other annoying images placed onto a video stream. It works by filling |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
35 * in the pixels that comprise the logo with neighboring pixels. The transform is |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
36 * very loosely based on a gaussian blur, but it is different enough to merit its |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
37 * own paragraph later on. It is a major improvement on the old delogo filter as |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
38 * it both uses a better blurring algorithm and uses a bitmap to use an arbitrary |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
39 * and generally much tighter fitting shape than a rectangle. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
40 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
41 * The filter requires 1 argument and has no optional arguments. It requires |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
42 * a filter bitmap, which must be in PGM or PPM format. A sample invocation would |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
43 * be -vf remove_logo=/home/username/logo_bitmaps/xyz.pgm. Pixels with a value of |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
44 * zero are not part of the logo, and non-zero pixels are part of the logo. If you |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
45 * use white (255) for the logo and black (0) for the rest, you will be safe. For |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
46 * making the filter bitmap, I recommend taking a screen capture of a black frame |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
47 * with the logo visible, and then using The GIMP's threshold filter followed by |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
48 * the erode filter once or twice. If needed, little splotches can be fixed |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
49 * manually. Remember that if logo pixels are not covered, the filter quality will |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
50 * be much reduced. Marking too many pixels as part of the logo doesn't hurt as |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
51 * much, but it will increase the amount of blurring needed to cover over the |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
52 * image and will destroy more information than necessary. Additionally, this blur |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
53 * algorithm is O(n) = n^4, where n is the width and height of a hypothetical |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
54 * square logo, so extra pixels will slow things down on a large lo |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
55 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
56 * The logo removal algorithm has two key points. The first is that it |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
57 * distinguishes between pixels in the logo and those not in the logo by using the |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
58 * passed-in bitmap. Pixels not in the logo are copied over directly without being |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
59 * modified and they also serve as source pixels for the logo fill-in. Pixels |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
60 * inside the logo have the mask applied. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
61 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
62 * At init-time the bitmap is reprocessed internally, and the distance to the |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
63 * nearest edge of the logo (Manhattan distance), along with a little extra to |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
64 * remove rough edges, is stored in each pixel. This is done using an in-place |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
65 * erosion algorithm, and incrementing each pixel that survives any given erosion. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
66 * Once every pixel is eroded, the maximum value is recorded, and a set of masks |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
67 * from size 0 to this size are generaged. The masks are circular binary masks, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
68 * where each pixel within a radius N (where N is the size of the mask) is a 1, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
69 * and all other pixels are a 0. Although a gaussian mask would be more |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
70 * mathematically accurate, a binary mask works better in practice because we |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
71 * generally do not use the central pixels in the mask (because they are in the |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
72 * logo region), and thus a gaussian mask will cause too little blur and thus a |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
73 * very unstable image. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
74 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
75 * The mask is applied in a special way. Namely, only pixels in the mask that |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
76 * line up to pixels outside the logo are used. The dynamic mask size means that |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
77 * the mask is just big enough so that the edges touch pixels outside the logo, so |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
78 * the blurring is kept to a minimum and at least the first boundary condition is |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
79 * met (that the image function itself is continuous), even if the second boundary |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
80 * condition (that the derivative of the image function is continuous) is not met. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
81 * A masking algorithm that does preserve the second boundary coundition |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
82 * (perhaps something based on a highly-modified bi-cubic algorithm) should offer |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
83 * even better results on paper, but the noise in a typical TV signal should make |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
84 * anything based on derivatives hopelessly noisy. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
85 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
86 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
87 #include <stdio.h> |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
88 #include <stdlib.h> |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
89 #include <string.h> |
16182 | 90 #include <ctype.h> |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
91 #include <inttypes.h> |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
92 |
17012 | 93 #include "config.h" |
94 #include "mp_msg.h" | |
95 #include "libvo/fastmemcpy.h" | |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
96 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
97 #include "img_format.h" |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
98 #include "mp_image.h" |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
99 #include "vf.h" |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
100 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
101 //===========================================================================// |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
102 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
103 /** \brief Returns the larger of the two arguments. **/ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
104 #define max(x,y) ((x)>(y)?(x):(y)) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
105 /** \brief Returns the smaller of the two arguments. **/ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
106 #define min(x,y) ((x)>(y)?(y):(x)) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
107 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
108 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
109 * \brief Test if a pixel is part of the logo. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
110 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
111 #define test_filter(image, x, y) ((unsigned char) (image->pixel[((y) * image->width) + (x)])) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
112 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
113 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
114 * \brief Chooses a slightly larger mask size to improve performance. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
115 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
116 * This function maps the absolute minimum mask size needed to the mask size we'll |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
117 * actually use. f(x) = x (the smallest that will work) will produce the sharpest |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
118 * results, but will be quite jittery. f(x) = 1.25x (what I'm using) is a good |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
119 * tradeoff in my opinion. This will calculate only at init-time, so you can put a |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
120 * long expression here without effecting performance. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
121 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
122 #define apply_mask_fudge_factor(x) (((x) >> 2) + x) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
123 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
124 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
125 * \brief Simple implementation of the PGM image format. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
126 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
127 * This struct holds a bare-bones image loaded from a PGM or PPM file. Once |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
128 * loaded and pre-processed, each pixel in this struct will contain how far from |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
129 * the edge of the logo each pixel is, using the manhattan distance (|dx| + |dy|). |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
130 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
131 * pixels in char * pixel can be addressed using (y * width) + height. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
132 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
133 typedef struct |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
134 { |
17366 | 135 unsigned int width; |
136 unsigned int height; | |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
137 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
138 unsigned char * pixel; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
139 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
140 } pgm_structure; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
141 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
142 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
143 * \brief Stores persistant variables. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
144 * |
22283
bc9e95184521
cosmetics: Fix some common typos, sepErate --> sepArate, deciSSion --> deciSion.
diego
parents:
19614
diff
changeset
|
145 * Variables stored here are kept from frame to frame, and separate instances of |
bc9e95184521
cosmetics: Fix some common typos, sepErate --> sepArate, deciSSion --> deciSion.
diego
parents:
19614
diff
changeset
|
146 * the filter will get their own separate copies. |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
147 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
148 typedef struct |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
149 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
150 unsigned int fmt; /* Not exactly sure of the use for this. It came with the example filter I used as a basis for this, and it looks like a lot of stuff will break if I remove it. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
151 int max_mask_size; /* The largest possible mask size that will be needed with the given filter and corresponding half_size_filter. The half_size_filter can have a larger requirment in some rare (but not degenerate) cases. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
152 int * * * mask; /* Stores our collection of masks. The first * is for an array of masks, the second for the y axis, and the third for the x axis. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
153 pgm_structure * filter; /* Stores the full-size filter image. This is used to tell what pixels are in the logo or not in the luma plane. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
154 pgm_structure * half_size_filter; /* Stores a 50% width and 50% height filter image. This is used to tell what pixels are in the logo or not in the chroma planes. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
155 /* These 8 variables store the bounding rectangles that the logo resides in. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
156 int bounding_rectangle_posx1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
157 int bounding_rectangle_posy1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
158 int bounding_rectangle_posx2; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
159 int bounding_rectangle_posy2; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
160 int bounding_rectangle_half_size_posx1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
161 int bounding_rectangle_half_size_posy1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
162 int bounding_rectangle_half_size_posx2; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
163 int bounding_rectangle_half_size_posy2; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
164 } vf_priv_s; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
165 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
166 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
167 * \brief Mallocs memory and checks to make sure it succeeded. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
168 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
169 * \param size How many bytes to allocate. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
170 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
171 * \return A pointer to the freshly allocated memory block, or NULL on failutre. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
172 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
173 * Mallocs memory, and checks to make sure it was successfully allocated. Because |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
174 * of how MPlayer works, it cannot safely halt execution, but at least the user |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
175 * will get an error message before the segfault happens. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
176 */ |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18976
diff
changeset
|
177 static void * safe_malloc(int size) |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
178 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
179 void * answer = malloc(size); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
180 if (answer == NULL) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
181 mp_msg(MSGT_VFILTER, MSGL_ERR, "Unable to allocate memory in vf_remove_logo.c\n"); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
182 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
183 return answer; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
184 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
185 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
186 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
187 * \brief Calculates the smallest rectangle that will encompass the logo region. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
188 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
189 * \param filter This image contains the logo around which the rectangle will |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
190 * will be fitted. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
191 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
192 * The bounding rectangle is calculated by testing successive lines (from the four |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
193 * sides of the rectangle) until no more can be removed without removing logo |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
194 * pixels. The results are returned by reference to posx1, posy1, posx2, and |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
195 * posy2. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
196 */ |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18976
diff
changeset
|
197 static void calculate_bounding_rectangle(int * posx1, int * posy1, int * posx2, int * posy2, pgm_structure * filter) |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
198 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
199 int x; /* Temporary variables to run */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
200 int y; /* through each row or column. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
201 int start_x; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
202 int start_y; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
203 int end_x = filter->width - 1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
204 int end_y = filter->height - 1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
205 int did_we_find_a_logo_pixel = 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
206 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
207 /* Let's find the top bound first. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
208 for (start_x = 0; start_x < filter->width && !did_we_find_a_logo_pixel; start_x++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
209 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
210 for (y = 0; y < filter->height; y++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
211 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
212 did_we_find_a_logo_pixel |= test_filter(filter, start_x, y); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
213 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
214 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
215 start_x--; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
216 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
217 /* Now the bottom bound. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
218 did_we_find_a_logo_pixel = 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
219 for (end_x = filter->width - 1; end_x > start_x && !did_we_find_a_logo_pixel; end_x--) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
220 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
221 for (y = 0; y < filter->height; y++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
222 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
223 did_we_find_a_logo_pixel |= test_filter(filter, end_x, y); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
224 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
225 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
226 end_x++; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
227 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
228 /* Left bound. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
229 did_we_find_a_logo_pixel = 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
230 for (start_y = 0; start_y < filter->height && !did_we_find_a_logo_pixel; start_y++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
231 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
232 for (x = 0; x < filter->width; x++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
233 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
234 did_we_find_a_logo_pixel |= test_filter(filter, x, start_y); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
235 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
236 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
237 start_y--; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
238 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
239 /* Right bound. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
240 did_we_find_a_logo_pixel = 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
241 for (end_y = filter->height - 1; end_y > start_y && !did_we_find_a_logo_pixel; end_y--) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
242 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
243 for (x = 0; x < filter->width; x++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
244 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
245 did_we_find_a_logo_pixel |= test_filter(filter, x, end_y); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
246 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
247 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
248 end_y++; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
249 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
250 *posx1 = start_x; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
251 *posy1 = start_y; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
252 *posx2 = end_x; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
253 *posy2 = end_y; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
254 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
255 return; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
256 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
257 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
258 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
259 * \brief Free mask memory. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
260 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
261 * \param vf Data structure which stores our persistant data, and is to be freed. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
262 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
263 * We call this function when our filter is done. It will free the memory |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
264 * allocated to the masks and leave the variables in a safe state. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
265 */ |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18976
diff
changeset
|
266 static void destroy_masks(vf_instance_t * vf) |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
267 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
268 int a, b; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
269 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
270 /* Load values from the vf->priv struct for faster dereferencing. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
271 int * * * mask = ((vf_priv_s *)vf->priv)->mask; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
272 int max_mask_size = ((vf_priv_s *)vf->priv)->max_mask_size; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
273 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
274 if (mask == NULL) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
275 return; /* Nothing allocated, so return before we segfault. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
276 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
277 /* Free all allocated memory. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
278 for (a = 0; a <= max_mask_size; a++) /* Loop through each mask. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
279 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
280 for (b = -a; b <= a; b++) /* Loop through each scanline in a mask. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
281 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
282 free(mask[a][b + a]); /* Free a scanline. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
283 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
284 free(mask[a]); /* Free a mask. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
285 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
286 free(mask); /* Free the array of pointers pointing to the masks. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
287 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
288 /* Set the pointer to NULL, so that any duplicate calls to this function will not cause a crash. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
289 ((vf_priv_s *)vf->priv)->mask = NULL; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
290 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
291 return; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
292 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
293 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
294 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
295 * \brief Set up our array of masks. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
296 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
297 * \param vf Where our filter stores persistance data, like these masks. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
298 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
299 * This creates an array of progressively larger masks and calculates their |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
300 * values. The values will not change during program execution once this function |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
301 * is done. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
302 */ |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18976
diff
changeset
|
303 static void initialize_masks(vf_instance_t * vf) |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
304 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
305 int a, b, c; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
306 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
307 /* Load values from the vf->priv struct for faster dereferencing. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
308 int * * * mask = ((vf_priv_s *)vf->priv)->mask; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
309 int max_mask_size = ((vf_priv_s *)vf->priv)->max_mask_size; /* This tells us how many masks we'll need to generate. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
310 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
311 /* Create a circular mask for each size up to max_mask_size. When the filter is applied, the mask size is |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
312 determined on a pixel by pixel basis, with pixels nearer the edge of the logo getting smaller mask sizes. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
313 mask = (int * * *) safe_malloc(sizeof(int * *) * (max_mask_size + 1)); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
314 for (a = 0; a <= max_mask_size; a++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
315 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
316 mask[a] = (int * *) safe_malloc(sizeof(int *) * ((a * 2) + 1)); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
317 for (b = -a; b <= a; b++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
318 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
319 mask[a][b + a] = (int *) safe_malloc(sizeof(int) * ((a * 2) + 1)); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
320 for (c = -a; c <= a; c++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
321 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
322 if ((b * b) + (c * c) <= (a * a)) /* Circular 0/1 mask. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
323 mask[a][b + a][c + a] = 1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
324 else |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
325 mask[a][b + a][c + a] = 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
326 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
327 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
328 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
329 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
330 /* Store values back to vf->priv so they aren't lost after the function returns. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
331 ((vf_priv_s *)vf->priv)->mask = mask; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
332 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
333 return; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
334 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
335 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
336 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
337 * \brief Pre-processes an image to give distance information. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
338 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
339 * \param vf Data structure that holds persistant information. All it is used for |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
340 in this function is to store the calculated max_mask_size variable. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
341 * \param mask This image will be converted from a greyscale image into a |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
342 * distance image. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
343 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
344 * This function takes a greyscale image (pgm_structure * mask) and converts it |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
345 * in place into a distance image. A distance image is zero for pixels ourside of |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
346 * the logo and is the manhattan distance (|dx| + |dy|) for pixels inside of the |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
347 * logo. This will overestimate the distance, but that is safe, and is far easier |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
348 * to implement than a proper pythagorean distance since I'm using a modified |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
349 * erosion algorithm to compute the distances. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
350 */ |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18976
diff
changeset
|
351 static void convert_mask_to_strength_mask(vf_instance_t * vf, pgm_structure * mask) |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
352 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
353 int x, y; /* Used by our for loops to go through every single pixel in the picture one at a time. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
354 int has_anything_changed = 1; /* Used by the main while() loop to know if anything changed on the last erosion. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
355 int current_pass = 0; /* How many times we've gone through the loop. Used in the in-place erosion algorithm |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
356 and to get us max_mask_size later on. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
357 int max_mask_size; /* This will record how large a mask the pixel that is the furthest from the edge of the logo |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
358 (and thus the neediest) is. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
359 char * current_pixel = mask->pixel; /* This stores the actual pixel data. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
360 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
361 /* First pass, set all non-zero values to 1. After this loop finishes, the data should be considered numeric |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
362 data for the filter, not color data. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
363 for (x = 0; x < mask->height * mask->width; x++, current_pixel++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
364 if(*current_pixel) *current_pixel = 1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
365 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
366 /* Second pass and future passes. For each pass, if a pixel is itself the same value as the current pass, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
367 and its four neighbors are too, then it is incremented. If no pixels are incremented by the end of the pass, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
368 then we go again. Edge pixels are counted as always excluded (this should be true anyway for any sane mask, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
369 but if it isn't this will ensure that we eventually exit). */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
370 while (has_anything_changed) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
371 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
372 current_pass++; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
373 current_pixel = mask->pixel; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
374 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
375 has_anything_changed = 0; /* If this doesn't get set by the end of this pass, then we're done. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
376 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
377 for (y = 1; y < mask->height - 1; y++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
378 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
379 for (x = 1; x < mask->width - 1; x++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
380 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
381 /* Apply the in-place erosion transform. It is based on the following two premises: 1 - Any pixel that fails 1 erosion |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
382 will fail all future erosions. 2 - Only pixels having survived all erosions up to the present will be >= to |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
383 current_pass. It doesn't matter if it survived the current pass, failed it, or hasn't been tested yet. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
384 if (*current_pixel >= current_pass && /* By using >= instead of ==, we allow the algorithm to work in place. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
385 *(current_pixel + 1) >= current_pass && |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
386 *(current_pixel - 1) >= current_pass && |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
387 *(current_pixel + mask->width) >= current_pass && |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
388 *(current_pixel - mask->width) >= current_pass) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
389 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
390 (*current_pixel)++; /* Increment the value since it still has not been eroded, as evidenced by the if statement |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
391 that just evaluated to true. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
392 has_anything_changed = 1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
393 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
394 current_pixel++; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
395 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
396 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
397 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
398 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
399 /* Apply the fudge factor, which will increase the size of the mask a little to reduce jitter at the cost of more blur. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
400 for (y = 1; y < mask->height - 1; y++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
401 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
402 for (x = 1; x < mask->width - 1; x++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
403 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
404 mask->pixel[(y * mask->width) + x] = apply_mask_fudge_factor(mask->pixel[(y * mask->width) + x]); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
405 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
406 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
407 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
408 max_mask_size = current_pass + 1; /* As a side-effect, we now know the maximum mask size, which we'll use to generate our masks. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
409 max_mask_size = apply_mask_fudge_factor(max_mask_size); /* Apply the fudge factor to this number too, since we must |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
410 ensure that enough masks are generated. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
411 ((vf_priv_s *)vf->priv)->max_mask_size = max_mask_size; /* Commit the newly calculated max_mask_size to the vf->priv struct. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
412 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
413 return; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
414 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
415 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
416 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
417 * \brief Our blurring function. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
418 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
419 * \param vf Stores persistant data. In this function we are interested in the |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
420 * array of masks. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
421 * \param value_out The properly blurred and delogoed pixel is outputted here. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
422 * \param logo_mask Tells us which pixels are in the logo and which aren't. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
423 * \param image The image that is having its logo removed. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
424 * \param x x-coordinate of the pixel to blur. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
425 * \param y y-coordinate of the pixel to blur. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
426 * \param plane 0 = luma, 1 = blue chroma, 2 = red chroma (YUV). |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
427 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
428 * This function is the core of the filter. It takes a pixel that is inside the |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
429 * logo and blurs it. It does so by finding the average of all the pixels within |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
430 * the mask and outside of the logo. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
431 */ |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18976
diff
changeset
|
432 static void get_blur(const vf_instance_t * const vf, unsigned int * const value_out, const pgm_structure * const logo_mask, |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
433 const mp_image_t * const image, const int x, const int y, const int plane) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
434 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
435 int mask_size; /* Mask size tells how large a circle to use. The radius is about (slightly larger than) mask size. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
436 /* Get values from vf->priv for faster dereferencing. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
437 int * * * mask = ((vf_priv_s *)vf->priv)->mask; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
438 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
439 int start_posx, start_posy, end_posx, end_posy; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
440 int i, j; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
441 unsigned int accumulator = 0, divisor = 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
442 const unsigned char * mask_read_position; /* What pixel we are reading out of the circular blur mask. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
443 const unsigned char * logo_mask_read_position; /* What pixel we are reading out of the filter image. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
444 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
445 /* Prepare our bounding rectangle and clip it if need be. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
446 mask_size = test_filter(logo_mask, x, y); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
447 start_posx = max(0, x - mask_size); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
448 start_posy = max(0, y - mask_size); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
449 end_posx = min(image->width - 1, x + mask_size); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
450 end_posy = min(image->height - 1, y + mask_size); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
451 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
452 mask_read_position = image->planes[plane] + (image->stride[plane] * start_posy) + start_posx; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
453 logo_mask_read_position = logo_mask->pixel + (start_posy * logo_mask->width) + start_posx; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
454 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
455 for (j = start_posy; j <= end_posy; j++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
456 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
457 for (i = start_posx; i <= end_posx; i++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
458 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
459 if (!(*logo_mask_read_position) && mask[mask_size][i - start_posx][j - start_posy]) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
460 { /* Check to see if this pixel is in the logo or not. Only use the pixel if it is not. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
461 accumulator += *mask_read_position; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
462 divisor++; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
463 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
464 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
465 mask_read_position++; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
466 logo_mask_read_position++; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
467 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
468 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
469 mask_read_position += (image->stride[plane] - ((end_posx + 1) - start_posx)); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
470 logo_mask_read_position += (logo_mask->width - ((end_posx + 1) - start_posx)); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
471 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
472 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
473 if (divisor == 0) /* This means that not a single pixel is outside of the logo, so we have no data. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
474 { /* We should put some eye catching value here, to indicate the flaw to the user. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
475 *value_out = 255; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
476 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
477 else /* Else we need to normalise the data using the divisor. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
478 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
479 *value_out = (accumulator + (divisor / 2)) / divisor; /* Divide, taking into account average rounding error. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
480 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
481 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
482 return; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
483 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
484 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
485 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
486 * \brief Free a pgm_structure. Undoes load_pgm(...). |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
487 */ |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18976
diff
changeset
|
488 static void destroy_pgm(pgm_structure * to_be_destroyed) |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
489 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
490 if (to_be_destroyed == NULL) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
491 return; /* Don't do anything if a NULL pointer was passed it. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
492 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
493 /* Internally allocated memory. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
494 if (to_be_destroyed->pixel != NULL) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
495 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
496 free(to_be_destroyed->pixel); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
497 to_be_destroyed->pixel = NULL; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
498 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
499 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
500 /* Free the actual struct instance. This is done here and not by the calling function. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
501 free(to_be_destroyed); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
502 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
503 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
504 /** \brief Helper function for load_pgm(...) to skip whitespace. */ |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18976
diff
changeset
|
505 static void load_pgm_skip(FILE *f) { |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
506 int c, comment = 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
507 do { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
508 c = fgetc(f); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
509 if (c == '#') |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
510 comment = 1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
511 if (c == '\n') |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
512 comment = 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
513 } while (c != EOF && (isspace(c) || comment)); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
514 ungetc(c, f); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
515 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
516 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
517 #define REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE(message) {mp_msg(MSGT_VFILTER, MSGL_ERR, message); return NULL;} |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
518 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
519 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
520 * \brief Loads a raw pgm or ppm file into a newly created pgm_structure object. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
521 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
522 * \param file_name The name of the file to be loaded. So long as the file is a |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
523 * valid pgm or ppm file, it will load correctly, even if the |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
524 * extension is missing or invalid. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
525 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
526 * \return A pointer to the newly created pgm_structure object. Don't forget to |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
527 * call destroy_pgm(...) when you're done with this. If an error occurs, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
528 * NULL is returned. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
529 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
530 * Can load either raw pgm (P5) or raw ppm (P6) image files as a binary image. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
531 * While a pgm file will be loaded normally (greyscale), the only thing that is |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
532 * guaranteed with ppm is that all zero (R = 0, G = 0, B = 0) pixels will remain |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
533 * zero, and non-zero pixels will remain non-zero. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
534 */ |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18976
diff
changeset
|
535 static pgm_structure * load_pgm(const char * file_name) |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
536 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
537 int maximum_greyscale_value; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
538 FILE * input; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
539 int pnm_number; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
540 pgm_structure * new_pgm = (pgm_structure *) safe_malloc (sizeof(pgm_structure)); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
541 char * write_position; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
542 char * end_position; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
543 int image_size; /* width * height */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
544 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
545 if((input = fopen(file_name, "rb")) == NULL) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: Unable to open file. File not found or insufficient permissions.\n"); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
546 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
547 /* Parse the PGM header. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
548 if (fgetc(input) != 'P') REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: File is not a valid PGM or PPM file.\n"); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
549 pnm_number = fgetc(input) - '0'; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
550 if (pnm_number != 5 && pnm_number != 6) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: Invalid PNM file. Only raw PGM (Portable Gray Map) and raw PPM (Portable Pixel Map) subtypes are allowed.\n"); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
551 load_pgm_skip(input); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
552 if (fscanf(input, "%i", &(new_pgm->width)) != 1) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: Invalid PGM/PPM header.\n"); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
553 load_pgm_skip(input); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
554 if (fscanf(input, "%i", &(new_pgm->height)) != 1) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: Invalid PGM/PPM header.\n"); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
555 load_pgm_skip(input); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
556 if (fscanf(input, "%i", &maximum_greyscale_value) != 1) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: Invalid PGM/PPM header.\n"); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
557 if (maximum_greyscale_value >= 256) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove_logo: Only 1 byte per pixel (pgm) or 1 byte per color value (ppm) are supported.\n"); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
558 load_pgm_skip(input); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
559 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
560 new_pgm->pixel = (unsigned char *) safe_malloc (sizeof(unsigned char) * new_pgm->width * new_pgm->height); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
561 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
562 /* Load the pixels. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
563 /* Note: I am aware that fgetc(input) isn't the fastest way of doing things, but it is quite compact and the code only runs once when the filter is initialized.*/ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
564 image_size = new_pgm->width * new_pgm->height; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
565 end_position = new_pgm->pixel + image_size; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
566 for (write_position = new_pgm->pixel; write_position < end_position; write_position++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
567 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
568 *write_position = fgetc(input); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
569 if (pnm_number == 6) /* This tests to see if the file is a PPM file. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
570 { /* If it is, then consider the pixel set if any of the three color channels are set. Since we just care about == 0 or != 0, a bitwise or will do the trick. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
571 *write_position |= fgetc(input); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
572 *write_position |= fgetc(input); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
573 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
574 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
575 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
576 return new_pgm; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
577 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
578 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
579 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
580 * \brief Generates a scaled down image with half width, height, and intensity. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
581 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
582 * \param vf Our struct for persistant data. In this case, it is used to update |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
583 * mask_max_size with the larger of the old or new value. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
584 * \param input_image The image from which the new half-sized one will be based. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
585 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
586 * \return The newly allocated and shrunken image. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
587 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
588 * This function not only scales down an image, but halves the value in each pixel |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
589 * too. The purpose of this is to produce a chroma filter image out of a luma |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
590 * filter image. The pixel values store the distance to the edge of the logo and |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
591 * halving the dimensions halves the distance. This function rounds up, because |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
592 * a downwards rounding error could cause the filter to fail, but an upwards |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
593 * rounding error will only cause a minor amount of excess blur in the chroma |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
594 * planes. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
595 */ |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18976
diff
changeset
|
596 static pgm_structure * generate_half_size_image(vf_instance_t * vf, pgm_structure * input_image) |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
597 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
598 int x, y; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
599 pgm_structure * new_pgm = (pgm_structure *) safe_malloc (sizeof(pgm_structure)); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
600 int has_anything_changed = 1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
601 int current_pass; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
602 int max_mask_size; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
603 char * current_pixel; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
604 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
605 new_pgm->width = input_image->width / 2; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
606 new_pgm->height = input_image->height / 2; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
607 new_pgm->pixel = (unsigned char *) safe_malloc (sizeof(unsigned char) * new_pgm->width * new_pgm->height); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
608 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
609 /* Copy over the image data, using the average of 4 pixels for to calculate each downsampled pixel. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
610 for (y = 0; y < new_pgm->height; y++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
611 for (x = 0; x < new_pgm->width; x++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
612 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
613 /* Set the pixel if there exists a non-zero value in the source pixels, else clear it. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
614 new_pgm->pixel[(y * new_pgm->width) + x] = input_image->pixel[((y << 1) * input_image->width) + (x << 1)] || |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
615 input_image->pixel[((y << 1) * input_image->width) + (x << 1) + 1] || |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
616 input_image->pixel[(((y << 1) + 1) * input_image->width) + (x << 1)] || |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
617 input_image->pixel[(((y << 1) + 1) * input_image->width) + (x << 1) + 1]; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
618 new_pgm->pixel[(y * new_pgm->width) + x] = min(1, new_pgm->pixel[(y * new_pgm->width) + x]); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
619 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
620 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
621 /* Now we need to recalculate the numbers for the smaller size. Just using the old_value / 2 can cause subtle |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
622 and fairly rare, but very nasty, bugs. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
623 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
624 current_pixel = new_pgm->pixel; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
625 /* First pass, set all non-zero values to 1. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
626 for (x = 0; x < new_pgm->height * new_pgm->width; x++, current_pixel++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
627 if(*current_pixel) *current_pixel = 1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
628 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
629 /* Second pass and future passes. For each pass, if a pixel is itself the same value as the current pass, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
630 and its four neighbors are too, then it is incremented. If no pixels are incremented by the end of the pass, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
631 then we go again. Edge pixels are counted as always excluded (this should be true anyway for any sane mask, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
632 but if it isn't this will ensure that we eventually exit). */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
633 current_pass = 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
634 while (has_anything_changed) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
635 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
636 current_pass++; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
637 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
638 has_anything_changed = 0; /* If this doesn't get set by the end of this pass, then we're done. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
639 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
640 for (y = 1; y < new_pgm->height - 1; y++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
641 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
642 for (x = 1; x < new_pgm->width - 1; x++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
643 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
644 if (new_pgm->pixel[(y * new_pgm->width) + x] >= current_pass && /* By using >= instead of ==, we allow the algorithm to work in place. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
645 new_pgm->pixel[(y * new_pgm->width) + (x + 1)] >= current_pass && |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
646 new_pgm->pixel[(y * new_pgm->width) + (x - 1)] >= current_pass && |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
647 new_pgm->pixel[((y + 1) * new_pgm->width) + x] >= current_pass && |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
648 new_pgm->pixel[((y - 1) * new_pgm->width) + x] >= current_pass) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
649 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
650 new_pgm->pixel[(y * new_pgm->width) + x]++; /* Increment the value since it still has not been eroded, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
651 as evidenced by the if statement that just evaluated to true. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
652 has_anything_changed = 1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
653 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
654 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
655 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
656 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
657 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
658 for (y = 1; y < new_pgm->height - 1; y++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
659 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
660 for (x = 1; x < new_pgm->width - 1; x++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
661 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
662 new_pgm->pixel[(y * new_pgm->width) + x] = apply_mask_fudge_factor(new_pgm->pixel[(y * new_pgm->width) + x]); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
663 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
664 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
665 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
666 max_mask_size = current_pass + 1; /* As a side-effect, we now know the maximum mask size, which we'll use to generate our masks. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
667 max_mask_size = apply_mask_fudge_factor(max_mask_size); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
668 /* Commit the newly calculated max_mask_size to the vf->priv struct. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
669 ((vf_priv_s *)vf->priv)->max_mask_size = max(max_mask_size, ((vf_priv_s *)vf->priv)->max_mask_size); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
670 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
671 return new_pgm; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
672 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
673 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
674 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
675 * \brief Checks if YV12 is supported by the next filter. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
676 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
677 static unsigned int find_best(struct vf_instance_s* vf){ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
678 int is_format_okay = vf->next->query_format(vf->next, IMGFMT_YV12); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
679 if ((is_format_okay & VFCAP_CSP_SUPPORTED_BY_HW) || (is_format_okay & VFCAP_CSP_SUPPORTED)) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
680 return IMGFMT_YV12; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
681 else |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
682 return 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
683 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
684 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
685 //===========================================================================// |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
686 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
687 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
688 * \brief Configure the filter and call the next filter's config function. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
689 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
690 static int config(struct vf_instance_s* vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
691 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
692 if(!(((vf_priv_s *)vf->priv)->fmt=find_best(vf))) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
693 return 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
694 else |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
695 return vf_next_config(vf,width,height,d_width,d_height,flags,((vf_priv_s *)vf->priv)->fmt); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
696 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
697 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
698 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
699 * \brief Removes the logo from a plane (either luma or chroma). |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
700 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
701 * \param vf Not needed by this function, but needed by the blur function. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
702 * \param source The image to have it's logo removed. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
703 * \param destination Where the output image will be stored. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
704 * \param source_stride How far apart (in memory) two consecutive lines are. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
705 * \param destination Same as source_stride, but for the destination image. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
706 * \param width Width of the image. This is the same for source and destination. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
707 * \param height Height of the image. This is the same for source and destination. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
708 * \param is_image_direct If the image is direct, then source and destination are |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
709 * the same and we can save a lot of time by not copying pixels that |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
710 * haven't changed. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
711 * \param filter The image that stores the distance to the edge of the logo for |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
712 * each pixel. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
713 * \param logo_start_x Smallest x-coordinate that contains at least 1 logo pixel. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
714 * \param logo_start_y Smallest y-coordinate that contains at least 1 logo pixel. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
715 * \param logo_end_x Largest x-coordinate that contains at least 1 logo pixel. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
716 * \param logo_end_y Largest y-coordinate that contains at least 1 logo pixel. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
717 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
718 * This function processes an entire plane. Pixels outside of the logo are copied |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
719 * to the output without change, and pixels inside the logo have the de-blurring |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
720 * function applied. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
721 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
722 static void convert_yv12(const vf_instance_t * const vf, const char * const source, const int source_stride, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
723 const mp_image_t * const source_image, const int width, const int height, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
724 char * const destination, const int destination_stride, int is_image_direct, pgm_structure * filter, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
725 const int plane, const int logo_start_x, const int logo_start_y, const int logo_end_x, const int logo_end_y) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
726 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
727 int y; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
728 int x; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
729 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
730 /* These pointers point to where we are getting our pixel data (inside mpi) and where we are storing it (inside dmpi). */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
731 const unsigned char * source_line; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
732 unsigned char * destination_line; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
733 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
734 if (!is_image_direct) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
735 memcpy_pic(destination, source, width, height, destination_stride, source_stride); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
736 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
737 for (y = logo_start_y; y <= logo_end_y; y++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
738 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
739 source_line = (const unsigned char *) source + (source_stride * y); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
740 destination_line = (unsigned char *) destination + (destination_stride * y); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
741 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
742 for (x = logo_start_x; x <= logo_end_x; x++) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
743 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
744 unsigned int output; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
745 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
746 if (filter->pixel[(y * filter->width) + x]) /* Only process if we are in the logo. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
747 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
748 get_blur(vf, &output, filter, source_image, x, y, plane); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
749 destination_line[x] = output; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
750 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
751 else /* Else just copy the data. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
752 if (!is_image_direct) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
753 destination_line[x] = source_line[x]; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
754 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
755 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
756 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
757 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
758 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
759 * \brief Process a frame. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
760 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
761 * \param mpi The image sent to use by the previous filter. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
762 * \param dmpi Where we will store the processed output image. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
763 * \param vf This is how the filter gets access to it's persistant data. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
764 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
765 * \return The return code of the next filter, or 0 on failure/error. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
766 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
767 * This function processes an entire frame. The frame is sent by the previous |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
768 * filter, has the logo removed by the filter, and is then sent to the next |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
769 * filter. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
770 */ |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17366
diff
changeset
|
771 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
772 mp_image_t *dmpi; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
773 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
774 dmpi=vf_get_image(vf->next,((vf_priv_s *)vf->priv)->fmt, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
775 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
776 mpi->w, mpi->h); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
777 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
778 /* Check to make sure that the filter image and the video stream are the same size. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
779 if ((((vf_priv_s *)vf->priv)->filter->width != mpi->w) || (((vf_priv_s *)vf->priv)->filter->height != mpi->h)) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
780 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
781 mp_msg(MSGT_VFILTER,MSGL_ERR, "Filter image and video stream are not of the same size. (Filter: %d x %d, Stream: %d x %d)\n", |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
782 ((vf_priv_s *)vf->priv)->filter->width, ((vf_priv_s *)vf->priv)->filter->height, mpi->w, mpi->h); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
783 return 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
784 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
785 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
786 switch(dmpi->imgfmt){ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
787 case IMGFMT_YV12: |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
788 convert_yv12(vf, mpi->planes[0], mpi->stride[0], mpi, mpi->w, mpi->h, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
789 dmpi->planes[0], dmpi->stride[0], |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
790 mpi->flags & MP_IMGFLAG_DIRECT, ((vf_priv_s *)vf->priv)->filter, 0, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
791 ((vf_priv_s *)vf->priv)->bounding_rectangle_posx1, ((vf_priv_s *)vf->priv)->bounding_rectangle_posy1, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
792 ((vf_priv_s *)vf->priv)->bounding_rectangle_posx2, ((vf_priv_s *)vf->priv)->bounding_rectangle_posy2); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
793 convert_yv12(vf, mpi->planes[1], mpi->stride[1], mpi, mpi->w / 2, mpi->h / 2, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
794 dmpi->planes[1], dmpi->stride[1], |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
795 mpi->flags & MP_IMGFLAG_DIRECT, ((vf_priv_s *)vf->priv)->half_size_filter, 1, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
796 ((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posx1, ((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posy1, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
797 ((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posx2, ((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posy2); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
798 convert_yv12(vf, mpi->planes[2], mpi->stride[2], mpi, mpi->w / 2, mpi->h / 2, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
799 dmpi->planes[2], dmpi->stride[2], |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
800 mpi->flags & MP_IMGFLAG_DIRECT, ((vf_priv_s *)vf->priv)->half_size_filter, 2, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
801 ((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posx1, ((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posy1, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
802 ((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posx2, ((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posy2); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
803 break; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
804 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
805 default: |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
806 mp_msg(MSGT_VFILTER,MSGL_ERR,"Unhandled format: 0x%X\n",dmpi->imgfmt); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
807 return 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
808 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
809 |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17366
diff
changeset
|
810 return vf_next_put_image(vf,dmpi, pts); |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
811 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
812 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
813 //===========================================================================// |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
814 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
815 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
816 * \brief Checks to see if the next filter accepts YV12 images. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
817 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
818 static int query_format(struct vf_instance_s * vf, unsigned int fmt) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
819 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
820 if (fmt == IMGFMT_YV12) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
821 return vf->next->query_format(vf->next, IMGFMT_YV12); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
822 else |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
823 return 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
824 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
825 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
826 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
827 * \brief Initializes our filter. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
828 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
829 * \param args The arguments passed in from the command line go here. This |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
830 * filter expects only a single argument telling it where the PGM |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
831 * or PPM file that describes the logo region is. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
832 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
833 * This sets up our instance variables and parses the arguments to the filter. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
834 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
835 static int open(vf_instance_t * vf, char * args) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
836 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
837 vf->priv = safe_malloc(sizeof(vf_priv_s)); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
838 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
839 /* Load our filter image. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
840 if (args) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
841 ((vf_priv_s *)vf->priv)->filter = load_pgm(args); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
842 else |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
843 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
844 mp_msg(MSGT_VFILTER, MSGL_ERR, "[vf]remove_logo usage: remove_logo=/path/to/filter_image_file.pgm\n"); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
845 free(vf->priv); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
846 return 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
847 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
848 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
849 if (((vf_priv_s *)vf->priv)->filter == NULL) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
850 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
851 /* Error message was displayed by load_pgm(). */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
852 free(vf->priv); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
853 return 0; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
854 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
855 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
856 /* Create the scaled down filter image for the chroma planes. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
857 convert_mask_to_strength_mask(vf, ((vf_priv_s *)vf->priv)->filter); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
858 ((vf_priv_s *)vf->priv)->half_size_filter = generate_half_size_image(vf, ((vf_priv_s *)vf->priv)->filter); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
859 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
860 /* Now that we know how many masks we need (the info is in vf), we can generate the masks. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
861 initialize_masks(vf); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
862 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
863 /* Calculate our bounding rectangles, which determine in what region the logo resides for faster processing. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
864 calculate_bounding_rectangle(&((vf_priv_s *)vf->priv)->bounding_rectangle_posx1, &((vf_priv_s *)vf->priv)->bounding_rectangle_posy1, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
865 &((vf_priv_s *)vf->priv)->bounding_rectangle_posx2, &((vf_priv_s *)vf->priv)->bounding_rectangle_posy2, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
866 ((vf_priv_s *)vf->priv)->filter); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
867 calculate_bounding_rectangle(&((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posx1, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
868 &((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posy1, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
869 &((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posx2, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
870 &((vf_priv_s *)vf->priv)->bounding_rectangle_half_size_posy2, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
871 ((vf_priv_s *)vf->priv)->half_size_filter); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
872 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
873 vf->config=config; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
874 vf->put_image=put_image; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
875 vf->query_format=query_format; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
876 return 1; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
877 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
878 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
879 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
880 * \brief Frees memory that our filter allocated. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
881 * |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
882 * This is called at exit-time. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
883 */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
884 void uninit(vf_instance_t * vf) |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
885 { |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
886 /* Destroy our masks and images. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
887 destroy_pgm(((vf_priv_s *)vf->priv)->filter); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
888 destroy_pgm(((vf_priv_s *)vf->priv)->half_size_filter); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
889 destroy_masks(vf); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
890 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
891 /* Destroy our private structure that had been used to store those masks and images. */ |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
892 free(vf->priv); |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
893 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
894 return; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
895 } |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
896 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
897 /** |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
898 * \brief Meta data about our filter. |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
899 */ |
25221 | 900 const vf_info_t vf_info_remove_logo = { |
15693
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
901 "Removes a tv logo based on a mask image.", |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
902 "remove-logo", |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
903 "Robert Edele", |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
904 "", |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
905 open, |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
906 NULL |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
907 }; |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
908 |
98cc17f305de
remove_logo filter by yartrebo, committed with fixes for c++ variable declarations
rfelker
parents:
diff
changeset
|
909 //===========================================================================// |