annotate libmpcodecs/vf_unsharp.c @ 9554:12eae4cb4e56

new version of the de-telecine filter, largely rewritten. should work much better. please report if there are any cases where the old one worked better. the docs could also use some nicer formatting...
author rfelker
date Sun, 09 Mar 2003 18:15:16 +0000
parents 3aee0db04665
children e9a2af584986
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7966
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
1 /*
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
2 Copyright (C) 2002 Rémi Guyomarch <rguyom@pobox.com>
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
3
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
6 the Free Software Foundation; either version 2 of the License, or
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
7 (at your option) any later version.
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
8
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
12 GNU General Public License for more details.
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
13
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
15 along with this program; if not, write to the Free Software
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
17
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
18 */
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
19
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
20 #include <stdio.h>
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
21 #include <stdlib.h>
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
22 #include <string.h>
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
23 #include <inttypes.h>
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
24 #include <math.h>
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
25
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
26 #include "../config.h"
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
27 #include "../mp_msg.h"
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
28 #include "../cpudetect.h"
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
29
8083
3aee0db04665 Fixed a bug which would prevent proper parsing of floating point
rguyom
parents: 8015
diff changeset
30 #ifdef USE_SETLOCALE
3aee0db04665 Fixed a bug which would prevent proper parsing of floating point
rguyom
parents: 8015
diff changeset
31 #include <locale.h>
3aee0db04665 Fixed a bug which would prevent proper parsing of floating point
rguyom
parents: 8015
diff changeset
32 #endif
3aee0db04665 Fixed a bug which would prevent proper parsing of floating point
rguyom
parents: 8015
diff changeset
33
7966
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
34 #ifdef HAVE_MALLOC_H
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
35 #include <malloc.h>
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
36 #endif
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
37
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
38 #include "img_format.h"
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
39 #include "mp_image.h"
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
40 #include "vf.h"
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
41 #include "../libvo/fastmemcpy.h"
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
42
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
43 #ifndef MIN
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
44 #define MIN(a,b) (((a)<(b))?(a):(b))
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
45 #endif
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
46 #ifndef MAX
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
47 #define MAX(a,b) (((a)>(b))?(a):(b))
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
48 #endif
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
49
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
50 //===========================================================================//
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
51
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
52 #define MIN_MATRIX_SIZE 3
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
53 #define MAX_MATRIX_SIZE 63
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
54
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
55 typedef struct FilterParam {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
56 int msizeX, msizeY;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
57 double amount;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
58 uint32_t *SC[MAX_MATRIX_SIZE-1];
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
59 } FilterParam;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
60
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
61 struct vf_priv_s {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
62 FilterParam lumaParam;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
63 FilterParam chromaParam;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
64 mp_image_t *dmpi;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
65 unsigned int outfmt;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
66 };
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
67
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
68
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
69 //===========================================================================//
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
70
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
71 /* This code is based on :
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
72
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
73 An Efficient algorithm for Gaussian blur using finite-state machines
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
74 Frederick M. Waltz and John W. V. Miller
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
75
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
76 SPIE Conf. on Machine Vision Systems for Inspection and Metrology VII
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
77 Originally published Boston, Nov 98
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
78
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
79 */
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
80
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
81 static void unsharp( uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int width, int height, FilterParam *fp ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
82
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
83 uint32_t **SC = fp->SC;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
84 uint32_t SR[MAX_MATRIX_SIZE-1], Tmp1, Tmp2;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
85 uint8_t* src2 = src; // avoid gcc warning
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
86
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
87 int32_t res;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
88 int x, y, z;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
89 int amount = fp->amount * 65536.0;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
90 int stepsX = fp->msizeX/2;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
91 int stepsY = fp->msizeY/2;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
92 int scalebits = (stepsX+stepsY)*2;
8015
403f7a58ccf2 vf_unsharp: proper rounding & print if sharpening or bluring
arpi
parents: 7966
diff changeset
93 int32_t halfscale = 1 << ((stepsX+stepsY)*2-1);
7966
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
94
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
95 if( !fp->amount ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
96 if( src == dst )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
97 return;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
98 if( dstStride == srcStride )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
99 memcpy( dst, src, srcStride*height );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
100 else
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
101 for( y=0; y<height; y++, dst+=dstStride, src+=srcStride )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
102 memcpy( dst, src, width );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
103 return;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
104 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
105
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
106 for( y=0; y<2*stepsY; y++ )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
107 memset( SC[y], 0, sizeof(SC[y][0]) * (width+2*stepsX) );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
108
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
109 for( y=-stepsY; y<height+stepsY; y++ ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
110 if( y < height ) src2 = src;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
111 memset( SR, 0, sizeof(SR[0]) * (2*stepsX-1) );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
112 for( x=-stepsX; x<width+stepsX; x++ ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
113 Tmp1 = x<=0 ? src2[0] : x>=width ? src2[width-1] : src2[x];
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
114 for( z=0; z<stepsX*2; z+=2 ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
115 Tmp2 = SR[z+0] + Tmp1; SR[z+0] = Tmp1;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
116 Tmp1 = SR[z+1] + Tmp2; SR[z+1] = Tmp2;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
117 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
118 for( z=0; z<stepsY*2; z+=2 ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
119 Tmp2 = SC[z+0][x+stepsX] + Tmp1; SC[z+0][x+stepsX] = Tmp1;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
120 Tmp1 = SC[z+1][x+stepsX] + Tmp2; SC[z+1][x+stepsX] = Tmp2;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
121 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
122 if( x>=stepsX && y>=stepsY ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
123 uint8_t* srx = src - stepsY*srcStride + x - stepsX;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
124 uint8_t* dsx = dst - stepsY*dstStride + x - stepsX;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
125
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
126 res = (int32_t)*srx + ( ( ( (int32_t)*srx - (int32_t)((Tmp1+halfscale) >> scalebits) ) * amount ) >> 16 );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
127 *dsx = res>255 ? 255 : res<0 ? 0 : (uint8_t)res;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
128 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
129 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
130 if( y >= 0 ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
131 dst += dstStride;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
132 src += srcStride;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
133 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
134 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
135 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
136
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
137 //===========================================================================//
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
138
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
139 static int config( struct vf_instance_s* vf,
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
140 int width, int height, int d_width, int d_height,
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
141 unsigned int flags, unsigned int outfmt ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
142
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
143 int z, stepsX, stepsY;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
144 FilterParam *fp;
8015
403f7a58ccf2 vf_unsharp: proper rounding & print if sharpening or bluring
arpi
parents: 7966
diff changeset
145 char *effect;
7966
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
146
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
147 // allocate buffers
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
148
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
149 fp = &vf->priv->lumaParam;
8015
403f7a58ccf2 vf_unsharp: proper rounding & print if sharpening or bluring
arpi
parents: 7966
diff changeset
150 effect = fp->amount == 0 ? "don't touch" : fp->amount < 0 ? "blur" : "sharpen";
403f7a58ccf2 vf_unsharp: proper rounding & print if sharpening or bluring
arpi
parents: 7966
diff changeset
151 mp_msg( MSGT_VFILTER, MSGL_INFO, "unsharp: %dx%d:%0.2f (%s luma) \n", fp->msizeX, fp->msizeY, fp->amount, effect );
7966
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
152 memset( fp->SC, 0, sizeof( fp->SC ) );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
153 stepsX = fp->msizeX/2;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
154 stepsY = fp->msizeY/2;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
155 for( z=0; z<2*stepsY; z++ )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
156 fp->SC[z] = memalign( 16, sizeof(*(fp->SC[z])) * (width+2*stepsX) );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
157
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
158 fp = &vf->priv->chromaParam;
8015
403f7a58ccf2 vf_unsharp: proper rounding & print if sharpening or bluring
arpi
parents: 7966
diff changeset
159 effect = fp->amount == 0 ? "don't touch" : fp->amount < 0 ? "blur" : "sharpen";
403f7a58ccf2 vf_unsharp: proper rounding & print if sharpening or bluring
arpi
parents: 7966
diff changeset
160 mp_msg( MSGT_VFILTER, MSGL_INFO, "unsharp: %dx%d:%0.2f (%s chroma)\n", fp->msizeX, fp->msizeY, fp->amount, effect );
7966
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
161 memset( fp->SC, 0, sizeof( fp->SC ) );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
162 stepsX = fp->msizeX/2;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
163 stepsY = fp->msizeY/2;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
164 for( z=0; z<2*stepsY; z++ )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
165 fp->SC[z] = memalign( 16, sizeof(*(fp->SC[z])) * (width+2*stepsX) );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
166
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
167 return vf_next_config( vf, width, height, d_width, d_height, flags, outfmt );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
168 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
169
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
170 //===========================================================================//
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
171
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
172 static void get_image( struct vf_instance_s* vf, mp_image_t *mpi ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
173 if( mpi->flags & MP_IMGFLAG_PRESERVE )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
174 return; // don't change
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
175 if( mpi->imgfmt!=vf->priv->outfmt )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
176 return; // colorspace differ
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
177
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
178 vf->priv->dmpi = vf_get_image( vf->next, mpi->imgfmt, mpi->type, mpi->flags, mpi->w, mpi->h );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
179 mpi->planes[0] = vf->priv->dmpi->planes[0];
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
180 mpi->stride[0] = vf->priv->dmpi->stride[0];
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
181 mpi->width = vf->priv->dmpi->width;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
182 if( mpi->flags & MP_IMGFLAG_PLANAR ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
183 mpi->planes[1] = vf->priv->dmpi->planes[1];
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
184 mpi->planes[2] = vf->priv->dmpi->planes[2];
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
185 mpi->stride[1] = vf->priv->dmpi->stride[1];
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
186 mpi->stride[2] = vf->priv->dmpi->stride[2];
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
187 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
188 mpi->flags |= MP_IMGFLAG_DIRECT;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
189 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
190
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
191 static int put_image( struct vf_instance_s* vf, mp_image_t *mpi ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
192 mp_image_t *dmpi;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
193
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
194 if( !(mpi->flags & MP_IMGFLAG_DIRECT) )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
195 // no DR, so get a new image! hope we'll get DR buffer:
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
196 vf->priv->dmpi = vf_get_image( vf->next,vf->priv->outfmt, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, mpi->w, mpi->h);
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
197 dmpi= vf->priv->dmpi;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
198
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
199 unsharp( dmpi->planes[0], mpi->planes[0], dmpi->stride[0], mpi->stride[0], mpi->w, mpi->h, &vf->priv->lumaParam );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
200 unsharp( dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1], mpi->w/2, mpi->h/2, &vf->priv->chromaParam );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
201 unsharp( dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2], mpi->w/2, mpi->h/2, &vf->priv->chromaParam );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
202
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
203 dmpi->qscale = mpi->qscale;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
204 dmpi->qstride = mpi->qstride;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
205
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
206 #ifdef HAVE_MMX
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
207 if(gCpuCaps.hasMMX)
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
208 asm volatile ("emms\n\t");
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
209 #endif
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
210 #ifdef HAVE_MMX2
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
211 if(gCpuCaps.hasMMX2)
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
212 asm volatile ("sfence\n\t");
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
213 #endif
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
214
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
215 return vf_next_put_image( vf, dmpi );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
216 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
217
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
218 static void uninit( struct vf_instance_s* vf ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
219 unsigned int z;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
220 FilterParam *fp;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
221
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
222 if( !vf->priv ) return;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
223
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
224 fp = &vf->priv->lumaParam;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
225 for( z=0; z<sizeof(fp->SC)/sizeof(fp->SC[0]); z++ ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
226 if( fp->SC[z] ) free( fp->SC[z] );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
227 fp->SC[z] = NULL;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
228 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
229 fp = &vf->priv->chromaParam;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
230 for( z=0; z<sizeof(fp->SC)/sizeof(fp->SC[0]); z++ ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
231 if( fp->SC[z] ) free( fp->SC[z] );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
232 fp->SC[z] = NULL;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
233 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
234
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
235 free( vf->priv );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
236 vf->priv = NULL;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
237 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
238
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
239 //===========================================================================//
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
240
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
241 static int query_format( struct vf_instance_s* vf, unsigned int fmt ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
242 switch(fmt) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
243 case IMGFMT_YV12:
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
244 case IMGFMT_I420:
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
245 case IMGFMT_IYUV:
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
246 return vf_next_query_format( vf, vf->priv->outfmt );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
247 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
248 return 0;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
249 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
250
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
251 //===========================================================================//
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
252
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
253 static void parse( FilterParam *fp, char* args ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
254
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
255 // l7x5:0.8:c3x3:-0.2
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
256
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
257 char *z;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
258 char *pos = args;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
259 char *max = args + strlen(args);
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
260
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
261 // parse matrix sizes
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
262 fp->msizeX = ( pos && pos+1<max ) ? atoi( pos+1 ) : 0;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
263 z = strchr( pos+1, 'x' );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
264 fp->msizeY = ( z && z+1<max ) ? atoi( pos=z+1 ) : fp->msizeX;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
265
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
266 // min/max & odd
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
267 fp->msizeX = 1 | MIN( MAX( fp->msizeX, MIN_MATRIX_SIZE ), MAX_MATRIX_SIZE );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
268 fp->msizeY = 1 | MIN( MAX( fp->msizeY, MIN_MATRIX_SIZE ), MAX_MATRIX_SIZE );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
269
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
270 // parse amount
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
271 pos = strchr( pos+1, ':' );
8083
3aee0db04665 Fixed a bug which would prevent proper parsing of floating point
rguyom
parents: 8015
diff changeset
272 #ifdef USE_SETLOCALE
3aee0db04665 Fixed a bug which would prevent proper parsing of floating point
rguyom
parents: 8015
diff changeset
273 setlocale( LC_NUMERIC, "C" );
3aee0db04665 Fixed a bug which would prevent proper parsing of floating point
rguyom
parents: 8015
diff changeset
274 #endif
7966
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
275 fp->amount = ( pos && pos+1<max ) ? atof( pos+1 ) : 0;
8083
3aee0db04665 Fixed a bug which would prevent proper parsing of floating point
rguyom
parents: 8015
diff changeset
276 #ifdef USE_SETLOCALE
3aee0db04665 Fixed a bug which would prevent proper parsing of floating point
rguyom
parents: 8015
diff changeset
277 setlocale( LC_NUMERIC, "" );
3aee0db04665 Fixed a bug which would prevent proper parsing of floating point
rguyom
parents: 8015
diff changeset
278 #endif
7966
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
279 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
280
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
281 //===========================================================================//
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
282
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
283 static unsigned int fmt_list[] = {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
284 IMGFMT_YV12,
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
285 IMGFMT_I420,
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
286 IMGFMT_IYUV,
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
287 0
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
288 };
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
289
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
290 static int open( vf_instance_t *vf, char* args ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
291 vf->config = config;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
292 vf->put_image = put_image;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
293 vf->get_image = get_image;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
294 vf->query_format = query_format;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
295 vf->uninit = uninit;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
296 vf->priv = malloc( sizeof(struct vf_priv_s) );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
297 memset( vf->priv, 0, sizeof(struct vf_priv_s) );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
298
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
299 if( args ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
300 char *args2 = strchr( args, 'l' );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
301 if( args2 )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
302 parse( &vf->priv->lumaParam, args2 );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
303 else {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
304 vf->priv->lumaParam.amount =
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
305 vf->priv->lumaParam.msizeX =
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
306 vf->priv->lumaParam.msizeY = 0;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
307 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
308
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
309 args2 = strchr( args, 'c' );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
310 if( args2 )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
311 parse( &vf->priv->chromaParam, args2 );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
312 else {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
313 vf->priv->chromaParam.amount =
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
314 vf->priv->chromaParam.msizeX =
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
315 vf->priv->chromaParam.msizeY = 0;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
316 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
317
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
318 if( !vf->priv->lumaParam.msizeX && !vf->priv->chromaParam.msizeX )
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
319 return 0; // nothing to do
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
320 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
321
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
322 // check csp:
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
323 vf->priv->outfmt = vf_match_csp( &vf->next, fmt_list, IMGFMT_YV12 );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
324 if( !vf->priv->outfmt ) {
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
325 uninit( vf );
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
326 return 0; // no csp match :(
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
327 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
328
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
329 return 1;
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
330 }
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
331
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
332 vf_info_t vf_info_unsharp = {
8015
403f7a58ccf2 vf_unsharp: proper rounding & print if sharpening or bluring
arpi
parents: 7966
diff changeset
333 "unsharp mask & gaussian blur",
7966
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
334 "unsharp",
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
335 "Rémi Guyomarch",
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
336 "",
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
337 open
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
338 };
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
339
a03235a5f395 new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
diff changeset
340 //===========================================================================//