annotate libmpcodecs/vf_divtc.c @ 32617:1baaacf00bbb

Improve speex codec pts handling, make audio timestamps work reasonably even with the native demuxer as long as seeking is not done.
author reimar
date Sun, 12 Dec 2010 12:36:56 +0000
parents a972c1a4a012
children 7af3e6f901fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30421
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
1 /*
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
2 * This file is part of MPlayer.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
3 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
5 * it under the terms of the GNU General Public License as published by
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
7 * (at your option) any later version.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
8 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
12 * GNU General Public License for more details.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
13 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
14 * You should have received a copy of the GNU General Public License along
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
17 */
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29195
diff changeset
18
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
19 #include <stdio.h>
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
20 #include <stdlib.h>
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
21 #include <string.h>
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
22 #include <limits.h>
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
23 #include <math.h>
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
24
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16136
diff changeset
25 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16136
diff changeset
26 #include "mp_msg.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16136
diff changeset
27 #include "cpudetect.h"
21372
1767c271d710 Remove bswap.h, use libavutil/bswap.h instead.
diego
parents: 19372
diff changeset
28 #include "libavutil/common.h"
21507
fa99b3d31d13 Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents: 21372
diff changeset
29 #include "mpbswap.h"
12225
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 #include "img_format.h"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
32 #include "mp_image.h"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
33 #include "vf.h"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
34
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16136
diff changeset
35 #include "libvo/fastmemcpy.h"
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
36
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 24360
diff changeset
37 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
38
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
39 struct vf_priv_s
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
40 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
41 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
42 ocount, sum[5];
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
43 double threshold;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
44 FILE *file;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
45 char *bdata;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
46 unsigned int *csdata;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
47 int *history;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
48 };
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
49
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
50 /*
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
51 * 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
52 */
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
53
28907
ccbde3575f0a Check for HAVE_EBX_AVAILABLE before enabling MMX code that needs the EBX
reimar
parents: 28906
diff changeset
54 #if HAVE_MMX && HAVE_EBX_AVAILABLE
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
55 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
56 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
57 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
58 __asm__ (
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
59 "movl $8, %%ecx \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
60 "pxor %%mm4, %%mm4 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
61 "pxor %%mm7, %%mm7 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
62
19372
6334c14b38eb Replace asmalign.h hack by ASMALIGN cpp macros from config.h.
diego
parents: 18104
diff changeset
63 ASMALIGN(4)
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
64 "1: \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
65
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 12225
diff changeset
66 "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
67 "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
68 "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
69 "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
70 "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
71 "psubusb %%mm1, %%mm2 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
72 "psubusb %%mm0, %%mm1 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
73 "movq %%mm2, %%mm0 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
74 "movq %%mm1, %%mm3 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
75 "punpcklbw %%mm7, %%mm0 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
76 "punpcklbw %%mm7, %%mm1 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
77 "punpckhbw %%mm7, %%mm2 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
78 "punpckhbw %%mm7, %%mm3 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
79 "paddw %%mm0, %%mm4 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
80 "paddw %%mm1, %%mm4 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
81 "paddw %%mm2, %%mm4 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
82 "paddw %%mm3, %%mm4 \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
83
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
84 "decl %%ecx \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
85 "jnz 1b \n\t"
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 12225
diff changeset
86 "movq %%mm4, (%%"REG_d") \n\t"
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
87 "emms \n\t"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
88 :
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 12225
diff changeset
89 : "S" (old), "D" (new), "a" ((long)os), "b" ((long)ns), "d" (out)
28905
b538600d545c Add missing ecx clobber in diff_MMX code (yes, that function is duplicated).
reimar
parents: 28290
diff changeset
90 : "%ecx", "memory"
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
91 );
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
92 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
93 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
94 #endif
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 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
97 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
98 int x, y, d=0;
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 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
101 for(x=8; x; x--)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
102 d+=abs(new[x]-old[x]);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
103
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
104 return d;
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 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
108
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
109 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
110 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
111 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
112 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
113
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
114 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
115 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
116 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
117 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
118 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
119 if(d>max) max=d;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
120 sum+=d;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
121 n++;
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 return (sum+n*max)/2;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
126 }
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 /*
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
129 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
130 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
131 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
132 unsigned int shift, sum;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
133 unsigned char *e;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
134
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
135 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
136 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
137 sum^=(*p++)<<(shift=(shift-8)&31);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
138
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
139 return sum;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
140 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
141 */
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 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
144 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
145 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
146 unsigned int shift;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
147 uint32_t sum, t;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
148 unsigned char *e, *e2;
29195
a49f45515e08 Replace glibc-specific __WORDSIZE preprocessor check with HAVE_FAST_64BIT.
diego
parents: 28907
diff changeset
149 #if HAVE_FAST_64BIT
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
150 typedef uint64_t wsum_t;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
151 #else
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
152 typedef uint32_t wsum_t;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
153 #endif
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
154 wsum_t wsum;
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 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
157 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
158 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
159 sum^=*p++<<(shift=(shift-8)&31);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
160
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
161 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
162 wsum^=*(wsum_t *)p;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
163
29195
a49f45515e08 Replace glibc-specific __WORDSIZE preprocessor check with HAVE_FAST_64BIT.
diego
parents: 28907
diff changeset
164 #if HAVE_FAST_64BIT
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
165 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
166 #else
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
167 t=be2me_32(wsum);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
168 #endif
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 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
171 sum^=*p++<<(shift=(shift-8)&31);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
172 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
173
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
174 return sum;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
175 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
176
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
177 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
178 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
179 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
180 int t;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
181 unsigned char *e;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
182
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
183 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
184 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
185 if(abs(*d-*s)>=threshold)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
186 *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
187
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
188 return 0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
189 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
190
23666
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 21507
diff changeset
191 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
192 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
193 return 0;
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 21507
diff changeset
194 }
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 21507
diff changeset
195
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
196 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
197 int, int, int, int, int),
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
198 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
199 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
200 if(dst->flags&MP_IMGFLAG_PLANAR)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
201 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
202 dst->w, dst->h,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
203 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
204 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
205 dst->chroma_width, dst->chroma_height,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
206 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
207 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
208 dst->chroma_width, dst->chroma_height,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
209 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
210
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
211 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
212 dst->w*(dst->bpp/8), dst->h,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
213 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
214 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
215
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 * 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
218 * 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
219 *
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
220 * 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
221 * phases are tested.
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
222 */
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
223
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
224 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
225 int phase1, int phase2, double *strength)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
226 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
227 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
228 pattern2[]={ -2, -3, 4, 4, -3 }, *pattern;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
229 int f, m, n, t[5];
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
230
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
231 pattern=p->deghost>0?pattern2:pattern1;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
232
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
233 for(f=0; f<5; f++)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
234 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
235 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
236 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
237 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
238 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
239 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
240 else
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
241 t[f]=INT_MIN;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
242 }
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 /* find the best match */
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
245 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
246 if(t[n]>t[m]) m=n;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
247
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
248 if(strength)
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 /* the second best match */
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
251 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
252 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
253
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
254 *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
255 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
256
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
257 return m;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
258 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
259
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
260 static int put_image(struct vf_instance *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
261 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
262 mp_image_t *dmpi, *tmpi=0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
263 int n, m, f, newphase;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
264 struct vf_priv_s *p=vf->priv;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
265 unsigned int checksum;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
266 double d;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
267
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
268 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
269 MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE |
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
270 MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
271 mpi->width, mpi->height);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
272 vf_clone_mpi_attributes(dmpi, mpi);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
273
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
274 newphase=p->phase;
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 switch(p->pass)
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 case 1:
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
279 fprintf(p->file, "%08x %d\n",
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
280 (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
281 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
282 break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
283
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
284 case 2:
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
285 if(p->frameno/5>p->bcount)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
286 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
287 mp_msg(MSGT_VFILTER, MSGL_ERR,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
288 "\n%s: Log file ends prematurely! "
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
289 "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
290 p->pass=0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
291 break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
292 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
293
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
294 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
295
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
296 if(checksum!=p->csdata[p->frameno])
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 for(f=0; f<100; f++)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
299 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
300 break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
301 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
302 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
303 f=-f;
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 if(f<100)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
308 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
309 mp_msg(MSGT_VFILTER, MSGL_INFO,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
310 "\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
311 vf->info->name, f);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
312
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
313 p->frameno+=f;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
314 p->misscount=0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
315 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
316 else if(p->misscount++>=30)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
317 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
318 mp_msg(MSGT_VFILTER, MSGL_ERR,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
319 "\n%s: Sync with pass-1 lost! "
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
320 "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
321 p->pass=0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
322 break;
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 }
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 n=(p->frameno)/5;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
327 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
328
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
329 newphase=p->bdata[n];
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
330 break;
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 default:
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
333 if(p->frameno)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
334 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
335 int *sump=p->sum+p->frameno%5,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
336 *histp=p->history+p->frameno%p->window;
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 *sump-=*histp;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
339 *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
340 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
341
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
342 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
343
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
344 if(d>=p->threshold)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
345 newphase=m;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
346 }
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 n=p->ocount++%5;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
349
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
350 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
351 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
352 p->phase=newphase;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
353 mp_msg(MSGT_VFILTER, MSGL_STATUS,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
354 "\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
355 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
356
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
357 switch((p->frameno++-p->phase+10)%5)
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 case 0:
23666
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 21507
diff changeset
360 imgop(copyop, dmpi, mpi, 0);
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
361 return 0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
362
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
363 case 4:
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
364 if(p->deghost>0)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
365 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
366 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
367 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE |
acd19cdc1b46 deghost_plane also reads from destination, so request readable buffer
reimar
parents: 13720
diff changeset
368 MP_IMGFLAG_READABLE,
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
369 mpi->width, mpi->height);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
370 vf_clone_mpi_attributes(tmpi, mpi);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
371
23666
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 21507
diff changeset
372 imgop(copyop, tmpi, mpi, 0);
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
373 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
374 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
375 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
376 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
377 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
378
23666
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 21507
diff changeset
379 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
380 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
381 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
382
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
383 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
384 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
385 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
386 unsigned int *cbuf=0, *cp;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
387 char *pbuf;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
388 char lbuf[256];
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
389 int sum[5];
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
390 double d;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
391
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
392 /* read the file */
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 n=15;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
395 while(fgets(lbuf, 256, p->file))
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 if(n>=bufsize-19)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
398 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
399 bufsize=bufsize?bufsize*2:30000;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
400 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
401 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
402
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
403 if(!bp || !cp)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
404 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
405 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
406 vf_info_divtc.name);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
407 free(buf);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
408 free(cbuf);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
409 return 0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
410 }
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 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
413 n++;
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
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
416 if(!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 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
419 vf_info_divtc.name);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
420 free(buf);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
421 free(cbuf);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
422 return 0;
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
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
425 /* 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
426
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
427 buf+=15, cbuf+=15;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
428 n-=15;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
429
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
430 memcpy(buf-15, buf, 15*sizeof *buf);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
431 memset(cbuf-15, 0, 15*sizeof *cbuf);
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 while(n%5)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
434 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
435
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
436 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
437 memset(cbuf+n, 0, 15*sizeof *cbuf);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
438
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
439 p->csdata=cbuf;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
440 p->fcount=n;
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 /* 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
443
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
444 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
445 memset(pbuf, 255, b);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
446
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
447 /* resolve the automatic mode */
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
448
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
449 if(p->deghost<0)
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 int deghost=-p->deghost;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
452 double s0=0.0, s1=0.0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
453
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
454 for(f=0; f<n; f+=5)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
455 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
456 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
457 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
458 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
459
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
460 p->deghost=s1>s0?deghost:0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
461
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
462 mp_msg(MSGT_VFILTER, MSGL_INFO,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
463 "%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
464 vf_info_divtc.name,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
465 p->deghost?"ON":"OFF",
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
466 10.0*log10(s1/s0));
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 /* analyze the data */
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 for(f=0; f<5; f++)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
472 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
473 sum[f]+=buf[n+f];
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
474
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
475 for(f=0; f<b; f++)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
476 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
477 m=match(p, sum, -1, -1, &d);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
478
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
479 if(d>=p->threshold)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
480 pbuf[f]=m;
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 if(f<b-1)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
483 for(n=0; n<5; n++)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
484 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
485 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
486
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
487 /* fill in the gaps */
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
488
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
489 /* the beginning */
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
490 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
491
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
492 if(f==b)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
493 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
494 free(buf-15);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
495 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
496 vf_info_divtc.name);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
497 return 0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
498 }
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 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
501
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
502 /* the end */
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
503 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
504 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
505
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
506 /* the rest */
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
507 for(f=0;;)
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 while(f<b && pbuf[f]!=-1) f++;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
510 if(f==b) break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
511 for(n=f; pbuf[n]==-1; n++);
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 if(pbuf[f-1]==pbuf[n])
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
514 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
515 /* just a gap */
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
516 while(f<n) pbuf[f++]=pbuf[n];
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
517 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
518 else
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 /* 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
521 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
522
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
523 for(i=0; i<5; i++)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
524 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
525 sum[i]+=buf[i+j];
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
526
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
527 for(i=f; i<n; i++)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
528 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
529 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
530
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
531 for(j=0; j<5; j++)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
532 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
533 }
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 /* 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
536 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
537
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
538 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
539 if(pbuf[i]==pbuf[f-1]) m++;
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 /* 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
542 estimated point */
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 if(m>f && m<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 for(j=m; j>f; j--)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
547 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
548 for(s=m; s<n; s++)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
549 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
550
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
551 m=(s-m<m-j)?s:j;
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
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
554 /* 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
555
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
556 for(i=f; i<m; i++)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
557 pbuf[i]=pbuf[f-1];
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
558
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
559 for(; i<n; i++)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
560 pbuf[i]=pbuf[n];
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
561
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
562 f=n;
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
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
566 free(buf-15);
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 return 1;
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
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
571 static int query_format(struct vf_instance *vf, unsigned int fmt)
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
572 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
573 switch(fmt)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
574 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
575 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
576 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
577 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
578 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
579 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
580 return vf_next_query_format(vf,fmt);
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
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
583 return 0;
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
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
586 static void uninit(struct vf_instance *vf)
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
587 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
588 if(vf->priv)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
589 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
590 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
591 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
592 free(vf->priv->bdata);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
593 free(vf->priv->history);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
594 free(vf->priv);
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 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
597
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 30421
diff changeset
598 static int vf_open(vf_instance_t *vf, char *args)
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
599 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
600 struct vf_priv_s *p;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
601 char *filename="framediff.log", *ap, *q, *a;
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 if(args && !(args=strdup(args)))
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
604 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
605 nomem:
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
606 mp_msg(MSGT_VFILTER, MSGL_FATAL,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
607 "%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
608 fail:
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
609 uninit(vf);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
610 free(args);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
611 return 0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
612 }
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 vf->put_image=put_image;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
615 vf->uninit=uninit;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
616 vf->query_format=query_format;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
617 vf->default_reqs=VFCAP_ACCEPT_STRIDE;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
618 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
619 goto nomem;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
620
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
621 p->phase=5;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
622 p->threshold=0.5;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
623 p->window=30;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
624
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
625 if((ap=args))
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
626 while(*ap)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
627 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
628 q=ap;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
629 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
630 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
631
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
632 switch(*q)
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
633 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
634 case 0: break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
635 case 'f': filename=a; break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
636 case 't': p->threshold=atof(a); break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
637 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
638 case 'd': p->deghost=atoi(a); break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
639 case 'p':
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
640 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
641 else p->pass=atoi(a);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
642 break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
643
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
644 case 'h':
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
645 mp_msg(MSGT_VFILTER, MSGL_INFO,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
646 "\n%s options:\n\n"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
647 "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
648 "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
649 "(default %s).\n"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
650 "threshold=value - Set the pattern recognition "
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
651 "sensitivity (default %g).\n"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
652 "deghost=value - Select deghosting threshold "
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
653 "(default %d).\n"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
654 "window=numframes - Set the statistics window "
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
655 "for 1-pass mode (default %d).\n"
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
656 "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
657 "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
658 "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
659 "unique prefix.\n\n",
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
660 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
661 p->window, p->phase%5);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
662 break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
663
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
664 default:
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
665 mp_msg(MSGT_VFILTER, MSGL_FATAL,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
666 "%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
667 goto fail;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
668 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
669 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
670
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
671 switch(p->pass)
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 case 1:
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
674 if(!(p->file=fopen(filename, "w")))
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 mp_msg(MSGT_VFILTER, MSGL_FATAL,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
677 "%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
678 goto fail;
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 break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
682
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
683 case 2:
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
684 if(!(p->file=fopen(filename, "r")))
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
685 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
686 mp_msg(MSGT_VFILTER, MSGL_FATAL,
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
687 "%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
688 goto fail;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
689 }
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 if(!analyze(p))
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
692 goto fail;
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 fclose(p->file);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
695 p->file=0;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
696 break;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
697 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
698
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
699 if(p->window<5) p->window=5;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
700 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
701 goto nomem;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
702
28906
6cc8cc259dc1 Use the same code as in vf_decimate to select diff_MMX
reimar
parents: 28905
diff changeset
703 diff = diff_C;
28907
ccbde3575f0a Check for HAVE_EBX_AVAILABLE before enabling MMX code that needs the EBX
reimar
parents: 28906
diff changeset
704 #if HAVE_MMX && HAVE_EBX_AVAILABLE
28906
6cc8cc259dc1 Use the same code as in vf_decimate to select diff_MMX
reimar
parents: 28905
diff changeset
705 if(gCpuCaps.hasMMX) diff = diff_MMX;
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
706 #endif
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
707
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
708 free(args);
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
709 return 1;
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
710 }
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
711
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 24360
diff changeset
712 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
713 {
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
714 "inverse telecine for deinterlaced video",
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
715 "divtc",
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
716 "Ville Saari",
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
717 "",
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 30421
diff changeset
718 vf_open,
12225
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
719 NULL
eb79a6192b2b New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
diff changeset
720 };