Mercurial > mplayer.hg
annotate libmpcodecs/vf_divtc.c @ 28041:211c23dac000
Treat audio output objects the same as everything else in the build system,
i.e. have lines that conditionally enable each in the Makefile and
corresponding variables set from configure.
author | diego |
---|---|
date | Wed, 03 Dec 2008 12:05:47 +0000 |
parents | 08d18fe9da52 |
children | 25337a2147e7 |
rev | line source |
---|---|
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
1 #include <stdio.h> |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
2 #include <stdlib.h> |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
3 #include <string.h> |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
4 #include <limits.h> |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
5 #include <math.h> |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
6 |
17012 | 7 #include "config.h" |
8 #include "mp_msg.h" | |
9 #include "cpudetect.h" | |
21372 | 10 #include "libavutil/common.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21372
diff
changeset
|
11 #include "mpbswap.h" |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
12 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
13 #include "img_format.h" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
14 #include "mp_image.h" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
15 #include "vf.h" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
16 |
17012 | 17 #include "libvo/fastmemcpy.h" |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
18 |
25221 | 19 const vf_info_t vf_info_divtc; |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
20 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
21 struct vf_priv_s |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
22 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
23 int deghost, pass, phase, window, fcount, bcount, frameno, misscount, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
24 ocount, sum[5]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
25 double threshold; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
26 FILE *file; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
27 char *bdata; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
28 unsigned int *csdata; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
29 int *history; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
30 }; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
31 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
32 /* |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
33 * diff_MMX and diff_C stolen from vf_decimate.c |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
34 */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
35 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
36 #ifdef HAVE_MMX |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
37 static int diff_MMX(unsigned char *old, unsigned char *new, int os, int ns) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
38 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
39 volatile short out[4]; |
27754
08d18fe9da52
Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents:
27667
diff
changeset
|
40 __asm__ ( |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
41 "movl $8, %%ecx \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
42 "pxor %%mm4, %%mm4 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
43 "pxor %%mm7, %%mm7 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
44 |
19372
6334c14b38eb
Replace asmalign.h hack by ASMALIGN cpp macros from config.h.
diego
parents:
18104
diff
changeset
|
45 ASMALIGN(4) |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
46 "1: \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
47 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
12225
diff
changeset
|
48 "movq (%%"REG_S"), %%mm0 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
12225
diff
changeset
|
49 "movq (%%"REG_S"), %%mm2 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
12225
diff
changeset
|
50 "add %%"REG_a", %%"REG_S" \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
12225
diff
changeset
|
51 "movq (%%"REG_D"), %%mm1 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
12225
diff
changeset
|
52 "add %%"REG_b", %%"REG_D" \n\t" |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
53 "psubusb %%mm1, %%mm2 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
54 "psubusb %%mm0, %%mm1 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
55 "movq %%mm2, %%mm0 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
56 "movq %%mm1, %%mm3 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
57 "punpcklbw %%mm7, %%mm0 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
58 "punpcklbw %%mm7, %%mm1 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
59 "punpckhbw %%mm7, %%mm2 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
60 "punpckhbw %%mm7, %%mm3 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
61 "paddw %%mm0, %%mm4 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
62 "paddw %%mm1, %%mm4 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
63 "paddw %%mm2, %%mm4 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
64 "paddw %%mm3, %%mm4 \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
65 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
66 "decl %%ecx \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
67 "jnz 1b \n\t" |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
12225
diff
changeset
|
68 "movq %%mm4, (%%"REG_d") \n\t" |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
69 "emms \n\t" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
70 : |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
12225
diff
changeset
|
71 : "S" (old), "D" (new), "a" ((long)os), "b" ((long)ns), "d" (out) |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
72 : "memory" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
73 ); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
74 return out[0]+out[1]+out[2]+out[3]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
75 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
76 #endif |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
77 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
78 static int diff_C(unsigned char *old, unsigned char *new, int os, int ns) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
79 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
80 int x, y, d=0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
81 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
82 for(y=8; y; y--, new+=ns, old+=os) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
83 for(x=8; x; x--) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
84 d+=abs(new[x]-old[x]); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
85 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
86 return d; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
87 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
88 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
89 static int (*diff)(unsigned char *, unsigned char *, int, int); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
90 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
91 static int diff_plane(unsigned char *old, unsigned char *new, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
92 int w, int h, int os, int ns, int arg) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
93 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
94 int x, y, d, max=0, sum=0, n=0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
95 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
96 for(y=0; y<h-7; y+=8) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
97 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
98 for(x=0; x<w-7; x+=8) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
99 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
100 d=diff(old+x+y*os, new+x+y*ns, os, ns); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
101 if(d>max) max=d; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
102 sum+=d; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
103 n++; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
104 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
105 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
106 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
107 return (sum+n*max)/2; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
108 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
109 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
110 /* |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
111 static unsigned int checksum_plane(unsigned char *p, unsigned char *z, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
112 int w, int h, int s, int zs, int arg) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
113 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
114 unsigned int shift, sum; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
115 unsigned char *e; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
116 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
117 for(sum=0; h; h--, p+=s-w) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
118 for(e=p+w, shift=32; p<e;) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
119 sum^=(*p++)<<(shift=(shift-8)&31); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
120 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
121 return sum; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
122 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
123 */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
124 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
125 static unsigned int checksum_plane(unsigned char *p, unsigned char *z, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
126 int w, int h, int s, int zs, int arg) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
127 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
128 unsigned int shift; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
129 uint32_t sum, t; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
130 unsigned char *e, *e2; |
27667
88dfab272467
Remove word size check and macro and use __WORDSIZE directly instead.
diego
parents:
25221
diff
changeset
|
131 #if __WORDSIZE==64 |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
132 typedef uint64_t wsum_t; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
133 #else |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
134 typedef uint32_t wsum_t; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
135 #endif |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
136 wsum_t wsum; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
137 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
138 for(sum=0; h; h--, p+=s-w) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
139 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
140 for(shift=0, e=p+w; (int)p&(sizeof(wsum_t)-1) && p<e;) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
141 sum^=*p++<<(shift=(shift-8)&31); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
142 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
143 for(wsum=0, e2=e-sizeof(wsum_t)+1; p<e2; p+=sizeof(wsum_t)) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
144 wsum^=*(wsum_t *)p; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
145 |
27667
88dfab272467
Remove word size check and macro and use __WORDSIZE directly instead.
diego
parents:
25221
diff
changeset
|
146 #if __WORDSIZE==64 |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
147 t=be2me_32((uint32_t)(wsum>>32^wsum)); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
148 #else |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
149 t=be2me_32(wsum); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
150 #endif |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
151 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
152 for(sum^=(t<<shift|t>>(32-shift)); p<e;) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
153 sum^=*p++<<(shift=(shift-8)&31); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
154 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
155 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
156 return sum; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
157 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
158 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
159 static int deghost_plane(unsigned char *d, unsigned char *s, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
160 int w, int h, int ds, int ss, int threshold) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
161 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
162 int t; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
163 unsigned char *e; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
164 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
165 for(; h; h--, s+=ss-w, d+=ds-w) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
166 for(e=d+w; d<e; d++, s++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
167 if(abs(*d-*s)>=threshold) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
168 *d=(t=(*d<<1)-*s)<0?0:t>255?255:t; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
169 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
170 return 0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
171 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
172 |
23666
5c3c7efd9b75
Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents:
21507
diff
changeset
|
173 static int copyop(unsigned char *d, unsigned char *s, int bpl, int h, int dstride, int sstride, int dummy) { |
5c3c7efd9b75
Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents:
21507
diff
changeset
|
174 memcpy_pic(d, s, bpl, h, dstride, sstride); |
5c3c7efd9b75
Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents:
21507
diff
changeset
|
175 return 0; |
5c3c7efd9b75
Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents:
21507
diff
changeset
|
176 } |
5c3c7efd9b75
Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents:
21507
diff
changeset
|
177 |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
178 static int imgop(int(*planeop)(unsigned char *, unsigned char *, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
179 int, int, int, int, int), |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
180 mp_image_t *dst, mp_image_t *src, int arg) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
181 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
182 if(dst->flags&MP_IMGFLAG_PLANAR) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
183 return planeop(dst->planes[0], src?src->planes[0]:0, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
184 dst->w, dst->h, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
185 dst->stride[0], src?src->stride[0]:0, arg)+ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
186 planeop(dst->planes[1], src?src->planes[1]:0, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
187 dst->chroma_width, dst->chroma_height, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
188 dst->stride[1], src?src->stride[1]:0, arg)+ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
189 planeop(dst->planes[2], src?src->planes[2]:0, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
190 dst->chroma_width, dst->chroma_height, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
191 dst->stride[2], src?src->stride[2]:0, arg); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
192 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
193 return planeop(dst->planes[0], src?src->planes[0]:0, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
194 dst->w*(dst->bpp/8), dst->h, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
195 dst->stride[0], src?src->stride[0]:0, arg); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
196 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
197 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
198 /* |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
199 * Find the phase in which the telecine pattern fits best to the |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
200 * given 5 frame slice of frame difference measurements. |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
201 * |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
202 * If phase1 and phase2 are not negative, only the two specified |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
203 * phases are tested. |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
204 */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
205 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
206 static int match(struct vf_priv_s *p, int *diffs, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
207 int phase1, int phase2, double *strength) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
208 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
209 static const int pattern1[]={ -4, 1, 1, 1, 1 }, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
210 pattern2[]={ -2, -3, 4, 4, -3 }, *pattern; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
211 int f, m, n, t[5]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
212 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
213 pattern=p->deghost>0?pattern2:pattern1; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
214 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
215 for(f=0; f<5; f++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
216 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
217 if(phase1<0 || phase2<0 || f==phase1 || f==phase2) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
218 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
219 for(n=t[f]=0; n<5; n++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
220 t[f]+=diffs[n]*pattern[(n-f+5)%5]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
221 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
222 else |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
223 t[f]=INT_MIN; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
224 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
225 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
226 /* find the best match */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
227 for(m=0, n=1; n<5; n++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
228 if(t[n]>t[m]) m=n; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
229 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
230 if(strength) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
231 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
232 /* the second best match */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
233 for(f=m?0:1, n=f+1; n<5; n++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
234 if(n!=m && t[n]>t[f]) f=n; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
235 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
236 *strength=(t[m]>0?(double)(t[m]-t[f])/t[m]:0.0); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
237 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
238 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
239 return m; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
240 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
241 |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17012
diff
changeset
|
242 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts) |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
243 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
244 mp_image_t *dmpi, *tmpi=0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
245 int n, m, f, newphase; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
246 struct vf_priv_s *p=vf->priv; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
247 unsigned int checksum; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
248 double d; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
249 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
250 dmpi=vf_get_image(vf->next, mpi->imgfmt, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
251 MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
252 MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
253 mpi->width, mpi->height); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
254 vf_clone_mpi_attributes(dmpi, mpi); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
255 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
256 newphase=p->phase; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
257 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
258 switch(p->pass) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
259 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
260 case 1: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
261 fprintf(p->file, "%08x %d\n", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
262 (unsigned int)imgop((void *)checksum_plane, mpi, 0, 0), |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
263 p->frameno?imgop(diff_plane, dmpi, mpi, 0):0); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
264 break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
265 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
266 case 2: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
267 if(p->frameno/5>p->bcount) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
268 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
269 mp_msg(MSGT_VFILTER, MSGL_ERR, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
270 "\n%s: Log file ends prematurely! " |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
271 "Switching to one pass mode.\n", vf->info->name); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
272 p->pass=0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
273 break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
274 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
275 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
276 checksum=(unsigned int)imgop((void *)checksum_plane, mpi, 0, 0); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
277 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
278 if(checksum!=p->csdata[p->frameno]) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
279 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
280 for(f=0; f<100; f++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
281 if(p->frameno+f<p->fcount && p->csdata[p->frameno+f]==checksum) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
282 break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
283 else if(p->frameno-f>=0 && p->csdata[p->frameno-f]==checksum) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
284 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
285 f=-f; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
286 break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
287 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
288 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
289 if(f<100) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
290 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
291 mp_msg(MSGT_VFILTER, MSGL_INFO, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
292 "\n%s: Mismatch with pass-1: %+d frame(s).\n", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
293 vf->info->name, f); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
294 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
295 p->frameno+=f; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
296 p->misscount=0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
297 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
298 else if(p->misscount++>=30) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
299 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
300 mp_msg(MSGT_VFILTER, MSGL_ERR, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
301 "\n%s: Sync with pass-1 lost! " |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
302 "Switching to one pass mode.\n", vf->info->name); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
303 p->pass=0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
304 break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
305 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
306 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
307 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
308 n=(p->frameno)/5; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
309 if(n>=p->bcount) n=p->bcount-1; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
310 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
311 newphase=p->bdata[n]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
312 break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
313 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
314 default: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
315 if(p->frameno) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
316 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
317 int *sump=p->sum+p->frameno%5, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
318 *histp=p->history+p->frameno%p->window; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
319 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
320 *sump-=*histp; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
321 *sump+=(*histp=imgop(diff_plane, dmpi, mpi, 0)); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
322 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
323 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
324 m=match(p, p->sum, -1, -1, &d); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
325 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
326 if(d>=p->threshold) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
327 newphase=m; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
328 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
329 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
330 n=p->ocount++%5; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
331 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
332 if(newphase!=p->phase && ((p->phase+4)%5<n)==((newphase+4)%5<n)) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
333 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
334 p->phase=newphase; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
335 mp_msg(MSGT_VFILTER, MSGL_STATUS, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
336 "\n%s: Telecine phase %d.\n", vf->info->name, p->phase); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
337 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
338 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
339 switch((p->frameno++-p->phase+10)%5) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
340 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
341 case 0: |
23666
5c3c7efd9b75
Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents:
21507
diff
changeset
|
342 imgop(copyop, dmpi, mpi, 0); |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
343 return 0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
344 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
345 case 4: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
346 if(p->deghost>0) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
347 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
348 tmpi=vf_get_image(vf->next, mpi->imgfmt, |
16136
acd19cdc1b46
deghost_plane also reads from destination, so request readable buffer
reimar
parents:
13720
diff
changeset
|
349 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | |
acd19cdc1b46
deghost_plane also reads from destination, so request readable buffer
reimar
parents:
13720
diff
changeset
|
350 MP_IMGFLAG_READABLE, |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
351 mpi->width, mpi->height); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
352 vf_clone_mpi_attributes(tmpi, mpi); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
353 |
23666
5c3c7efd9b75
Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents:
21507
diff
changeset
|
354 imgop(copyop, tmpi, mpi, 0); |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
355 imgop(deghost_plane, tmpi, dmpi, p->deghost); |
23666
5c3c7efd9b75
Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents:
21507
diff
changeset
|
356 imgop(copyop, dmpi, mpi, 0); |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17012
diff
changeset
|
357 return vf_next_put_image(vf, tmpi, MP_NOPTS_VALUE); |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
358 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
359 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
360 |
23666
5c3c7efd9b75
Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents:
21507
diff
changeset
|
361 imgop(copyop, dmpi, mpi, 0); |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17012
diff
changeset
|
362 return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE); |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
363 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
364 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
365 static int analyze(struct vf_priv_s *p) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
366 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
367 int *buf=0, *bp, bufsize=0, n, b, f, i, j, m, s; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
368 unsigned int *cbuf=0, *cp; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
369 char *pbuf; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
370 char lbuf[256]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
371 int sum[5]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
372 double d; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
373 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
374 /* read the file */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
375 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
376 n=15; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
377 while(fgets(lbuf, 256, p->file)) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
378 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
379 if(n>=bufsize-19) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
380 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
381 bufsize=bufsize?bufsize*2:30000; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
382 if((bp=realloc(buf, bufsize*sizeof *buf))) buf=bp; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
383 if((cp=realloc(cbuf, bufsize*sizeof *cbuf))) cbuf=cp; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
384 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
385 if(!bp || !cp) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
386 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
387 mp_msg(MSGT_VFILTER, MSGL_FATAL, "%s: Not enough memory.\n", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
388 vf_info_divtc.name); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
389 free(buf); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
390 free(cbuf); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
391 return 0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
392 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
393 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
394 sscanf(lbuf, "%x %d", cbuf+n, buf+n); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
395 n++; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
396 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
397 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
398 if(!n) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
399 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
400 mp_msg(MSGT_VFILTER, MSGL_FATAL, "%s: Empty 2-pass log file.\n", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
401 vf_info_divtc.name); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
402 free(buf); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
403 free(cbuf); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
404 return 0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
405 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
406 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
407 /* generate some dummy data past the beginning and end of the array */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
408 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
409 buf+=15, cbuf+=15; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
410 n-=15; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
411 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
412 memcpy(buf-15, buf, 15*sizeof *buf); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
413 memset(cbuf-15, 0, 15*sizeof *cbuf); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
414 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
415 while(n%5) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
416 buf[n]=buf[n-5], cbuf[n]=0, n++; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
417 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
418 memcpy(buf+n, buf+n-15, 15*sizeof *buf); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
419 memset(cbuf+n, 0, 15*sizeof *cbuf); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
420 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
421 p->csdata=cbuf; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
422 p->fcount=n; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
423 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
424 /* array with one slot for each slice of 5 frames */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
425 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
426 p->bdata=pbuf=malloc(p->bcount=b=(n/5)); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
427 memset(pbuf, 255, b); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
428 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
429 /* resolve the automatic mode */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
430 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
431 if(p->deghost<0) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
432 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
433 int deghost=-p->deghost; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
434 double s0=0.0, s1=0.0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
435 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
436 for(f=0; f<n; f+=5) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
437 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
438 p->deghost=0; match(p, buf+f, -1, -1, &d); s0+=d; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
439 p->deghost=1; match(p, buf+f, -1, -1, &d); s1+=d; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
440 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
441 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
442 p->deghost=s1>s0?deghost:0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
443 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
444 mp_msg(MSGT_VFILTER, MSGL_INFO, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
445 "%s: Deghosting %-3s (relative pattern strength %+.2fdB).\n", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
446 vf_info_divtc.name, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
447 p->deghost?"ON":"OFF", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
448 10.0*log10(s1/s0)); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
449 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
450 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
451 /* analyze the data */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
452 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
453 for(f=0; f<5; f++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
454 for(sum[f]=0, n=-15; n<20; n+=5) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
455 sum[f]+=buf[n+f]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
456 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
457 for(f=0; f<b; f++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
458 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
459 m=match(p, sum, -1, -1, &d); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
460 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
461 if(d>=p->threshold) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
462 pbuf[f]=m; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
463 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
464 if(f<b-1) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
465 for(n=0; n<5; n++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
466 sum[n]=sum[n]-buf[5*(f-3)+n]+buf[5*(f+4)+n]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
467 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
468 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
469 /* fill in the gaps */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
470 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
471 /* the beginning */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
472 for(f=0; f<b && pbuf[f]==-1; f++); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
473 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
474 if(f==b) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
475 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
476 free(buf-15); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
477 mp_msg(MSGT_VFILTER, MSGL_FATAL, "%s: No telecine pattern found!\n", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
478 vf_info_divtc.name); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
479 return 0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
480 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
481 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
482 for(n=0; n<f; pbuf[n++]=pbuf[f]); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
483 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
484 /* the end */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
485 for(f=b-1; pbuf[f]==-1; f--); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
486 for(n=f+1; n<b; pbuf[n++]=pbuf[f]); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
487 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
488 /* the rest */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
489 for(f=0;;) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
490 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
491 while(f<b && pbuf[f]!=-1) f++; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
492 if(f==b) break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
493 for(n=f; pbuf[n]==-1; n++); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
494 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
495 if(pbuf[f-1]==pbuf[n]) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
496 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
497 /* just a gap */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
498 while(f<n) pbuf[f++]=pbuf[n]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
499 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
500 else |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
501 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
502 /* phase change, reanalyze the original data in the gap with zero |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
503 threshold for only the two phases that appear at the ends */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
504 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
505 for(i=0; i<5; i++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
506 for(sum[i]=0, j=5*f-15; j<5*f; j+=5) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
507 sum[i]+=buf[i+j]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
508 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
509 for(i=f; i<n; i++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
510 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
511 pbuf[i]=match(p, sum, pbuf[f-1], pbuf[n], 0); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
512 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
513 for(j=0; j<5; j++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
514 sum[j]=sum[j]-buf[5*(i-3)+j]+buf[5*(i+4)+j]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
515 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
516 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
517 /* estimate the transition point by dividing the gap |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
518 in the same proportion as the number of matches of each kind */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
519 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
520 for(i=f, m=f; i<n; i++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
521 if(pbuf[i]==pbuf[f-1]) m++; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
522 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
523 /* find the transition of the right direction nearest to the |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
524 estimated point */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
525 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
526 if(m>f && m<n) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
527 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
528 for(j=m; j>f; j--) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
529 if(pbuf[j-1]==pbuf[f-1] && pbuf[j]==pbuf[n]) break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
530 for(s=m; s<n; s++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
531 if(pbuf[s-1]==pbuf[f-1] && pbuf[s]==pbuf[n]) break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
532 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
533 m=(s-m<m-j)?s:j; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
534 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
535 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
536 /* and rewrite the data to allow only this one transition */ |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
537 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
538 for(i=f; i<m; i++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
539 pbuf[i]=pbuf[f-1]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
540 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
541 for(; i<n; i++) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
542 pbuf[i]=pbuf[n]; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
543 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
544 f=n; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
545 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
546 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
547 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
548 free(buf-15); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
549 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
550 return 1; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
551 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
552 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
553 static int query_format(struct vf_instance_s* vf, unsigned int fmt) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
554 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
555 switch(fmt) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
556 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
557 case IMGFMT_444P: case IMGFMT_IYUV: case IMGFMT_RGB24: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
558 case IMGFMT_422P: case IMGFMT_UYVY: case IMGFMT_BGR24: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
559 case IMGFMT_411P: case IMGFMT_YUY2: case IMGFMT_IF09: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
560 case IMGFMT_YV12: case IMGFMT_I420: case IMGFMT_YVU9: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
561 case IMGFMT_IUYV: case IMGFMT_Y800: case IMGFMT_Y8: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
562 return vf_next_query_format(vf,fmt); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
563 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
564 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
565 return 0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
566 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
567 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
568 static void uninit(struct vf_instance_s* vf) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
569 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
570 if(vf->priv) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
571 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
572 if(vf->priv->file) fclose(vf->priv->file); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
573 if(vf->priv->csdata) free(vf->priv->csdata-15); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
574 free(vf->priv->bdata); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
575 free(vf->priv->history); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
576 free(vf->priv); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
577 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
578 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
579 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
580 static int open(vf_instance_t *vf, char* args) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
581 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
582 struct vf_priv_s *p; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
583 char *filename="framediff.log", *ap, *q, *a; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
584 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
585 if(args && !(args=strdup(args))) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
586 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
587 nomem: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
588 mp_msg(MSGT_VFILTER, MSGL_FATAL, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
589 "%s: Not enough memory.\n", vf->info->name); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
590 fail: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
591 uninit(vf); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
592 free(args); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
593 return 0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
594 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
595 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
596 vf->put_image=put_image; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
597 vf->uninit=uninit; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
598 vf->query_format=query_format; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
599 vf->default_reqs=VFCAP_ACCEPT_STRIDE; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
600 if(!(vf->priv=p=calloc(1, sizeof(struct vf_priv_s)))) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
601 goto nomem; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
602 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
603 p->phase=5; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
604 p->threshold=0.5; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
605 p->window=30; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
606 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
607 if((ap=args)) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
608 while(*ap) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
609 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
610 q=ap; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
611 if((ap=strchr(q, ':'))) *ap++=0; else ap=q+strlen(q); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
612 if((a=strchr(q, '='))) *a++=0; else a=q+strlen(q); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
613 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
614 switch(*q) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
615 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
616 case 0: break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
617 case 'f': filename=a; break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
618 case 't': p->threshold=atof(a); break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
619 case 'w': p->window=5*(atoi(a)+4)/5; break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
620 case 'd': p->deghost=atoi(a); break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
621 case 'p': |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
622 if(q[1]=='h') p->phase=atoi(a); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
623 else p->pass=atoi(a); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
624 break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
625 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
626 case 'h': |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
627 mp_msg(MSGT_VFILTER, MSGL_INFO, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
628 "\n%s options:\n\n" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
629 "pass=1|2 - Use 2-pass mode.\n" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
630 "file=filename - Set the 2-pass log file name " |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
631 "(default %s).\n" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
632 "threshold=value - Set the pattern recognition " |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
633 "sensitivity (default %g).\n" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
634 "deghost=value - Select deghosting threshold " |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
635 "(default %d).\n" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
636 "window=numframes - Set the statistics window " |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
637 "for 1-pass mode (default %d).\n" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
638 "phase=0|1|2|3|4 - Set the initial phase " |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
639 "for 1-pass mode (default %d).\n\n" |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
640 "The option names can be abbreviated to the shortest " |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
641 "unique prefix.\n\n", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
642 vf->info->name, filename, p->threshold, p->deghost, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
643 p->window, p->phase%5); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
644 break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
645 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
646 default: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
647 mp_msg(MSGT_VFILTER, MSGL_FATAL, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
648 "%s: Unknown argument %s.\n", vf->info->name, q); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
649 goto fail; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
650 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
651 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
652 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
653 switch(p->pass) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
654 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
655 case 1: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
656 if(!(p->file=fopen(filename, "w"))) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
657 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
658 mp_msg(MSGT_VFILTER, MSGL_FATAL, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
659 "%s: Can't create file %s.\n", vf->info->name, filename); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
660 goto fail; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
661 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
662 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
663 break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
664 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
665 case 2: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
666 if(!(p->file=fopen(filename, "r"))) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
667 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
668 mp_msg(MSGT_VFILTER, MSGL_FATAL, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
669 "%s: Can't open file %s.\n", vf->info->name, filename); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
670 goto fail; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
671 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
672 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
673 if(!analyze(p)) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
674 goto fail; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
675 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
676 fclose(p->file); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
677 p->file=0; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
678 break; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
679 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
680 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
681 if(p->window<5) p->window=5; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
682 if(!(p->history=calloc(sizeof *p->history, p->window))) |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
683 goto nomem; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
684 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
685 diff= |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
686 #ifdef HAVE_MMX |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
687 gCpuCaps.hasMMX?diff_MMX: |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
688 #endif |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
689 diff_C; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
690 |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
691 free(args); |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
692 return 1; |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
693 } |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
694 |
25221 | 695 const vf_info_t vf_info_divtc = |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
696 { |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
697 "inverse telecine for deinterlaced video", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
698 "divtc", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
699 "Ville Saari", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
700 "", |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
701 open, |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
702 NULL |
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff
changeset
|
703 }; |