annotate libmpcodecs/vf_detc.c @ 22998:85343b921fef

Fix preprocessor conditionals: libdvdnav includes libdvdread and configure enables libdvdread support if libdvdnav is found. There is no need to check separately in the source with the preprocessor.
author diego
date Wed, 18 Apr 2007 09:56:24 +0000
parents 6a08d0dabca8
children a124f3abc1ec
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
1 #include <stdio.h>
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
2 #include <stdlib.h>
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
3 #include <string.h>
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
4
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 9665
diff changeset
5 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 9665
diff changeset
6 #include "mp_msg.h"
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
7
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
8 #include "img_format.h"
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
9 #include "mp_image.h"
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
10 #include "vf.h"
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
11
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 9665
diff changeset
12 #include "libvo/fastmemcpy.h"
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
13
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
14 struct metrics {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
15 int even;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
16 int odd;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
17 int noise;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
18 int temp;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
19 };
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
20
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
21 struct vf_priv_s {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
22 int frame;
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
23 int drop, lastdrop;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
24 struct metrics pm;
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
25 int thres[5];
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
26 int inframes, outframes;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
27 int mode;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
28 int (*analyze)(struct vf_priv_s *, mp_image_t *, mp_image_t *);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
29 int needread;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
30 };
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
31
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
32 #define COMPE(a,b,e) (abs((a)-(b)) < (((a)+(b))>>(e)))
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
33 #define COMPARABLE(a,b) COMPE((a),(b),2)
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
34 #define VERYCLOSE(a,b) COMPE((a),(b),3)
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
35
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
36 #define OUTER_TC_NBHD(s) ( \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
37 COMPARABLE((s)[-1].m.even,(s)[-1].m.odd) && \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
38 COMPARABLE((s)[1].m.even,(s)[0].m.odd) && \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
39 COMPARABLE((s)[2].m.even,(s)[1].m.odd) && \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
40 COMPARABLE((s)[-1].m.noise,(s)[0].m.temp) && \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
41 COMPARABLE((s)[2].m.noise,(s)[2].m.temp) )
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
42
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
43 #define INNER_TC_NBHD(s,l,h) ( \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
44 COMPARABLE((s)[0].m.even,(l)) && \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
45 COMPARABLE((s)[2].m.odd,(l)) && ( \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
46 COMPARABLE((s)[0].m.noise,(h)) || \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
47 COMPARABLE((s)[1].m.noise,(h)) ) )
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
48
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
49 enum {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
50 TC_DROP,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
51 TC_PROG,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
52 TC_IL1,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
53 TC_IL2
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
54 };
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
55
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
56 static inline void *my_memcpy_pic(void * dst, void * src, int bytesPerLine, int height, int dstStride, int srcStride)
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
57 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
58 int i;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
59 void *retval=dst;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
60
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
61 for(i=0; i<height; i++)
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
62 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
63 memcpy(dst, src, bytesPerLine);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
64 src+= srcStride;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
65 dst+= dstStride;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
66 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
67
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
68 return retval;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
69 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
70
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
71 static unsigned int hash_pic(unsigned char *img, int w, int h, int stride)
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
72 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
73 int step = w*h/1024;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
74 unsigned int hash=0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
75 int x=0, y;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
76
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
77 step -= step % 3;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
78
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
79 for (y=0; y<h; y++) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
80 for (; x<w; x+=step) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
81 hash = hash ^ (hash<<4) ^ img[x];
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
82 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
83 x -= w;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
84 img += stride;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
85 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
86
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
87 return hash;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
88 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
89
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
90 static void block_diffs(struct metrics *m, unsigned char *old, unsigned char *new, int os, int ns)
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
91 {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
92 int x, y, even=0, odd=0, noise, temp;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
93 unsigned char *oldp, *newp;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
94 m->noise = m->temp = 0;
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
95 for (x = 8; x; x--) {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
96 oldp = old++;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
97 newp = new++;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
98 noise = temp = 0;
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
99 for (y = 4; y; y--) {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
100 even += abs(newp[0]-oldp[0]);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
101 odd += abs(newp[ns]-oldp[os]);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
102 noise += newp[ns]-newp[0];
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
103 temp += oldp[os]-newp[0];
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
104 oldp += os<<1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
105 newp += ns<<1;
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
106 }
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
107 m->noise += abs(noise);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
108 m->temp += abs(temp);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
109 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
110 m->even = even;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
111 m->odd = odd;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
112 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
113
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
114 static void diff_planes(struct metrics *m, unsigned char *old, unsigned char *new, int w, int h, int os, int ns)
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
115 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
116 int x, y, me=0, mo=0, mn=0, mt=0;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
117 struct metrics l;
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
118 for (y = 0; y < h-7; y += 8) {
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
119 for (x = 0; x < w-7; x += 8) {
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
120 block_diffs(&l, old+x+y*os, new+x+y*ns, os, ns);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
121 if (l.even > me) me = l.even;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
122 if (l.odd > mo) mo = l.odd;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
123 if (l.noise > mn) mn = l.noise;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
124 if (l.temp > mt) mt = l.temp;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
125 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
126 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
127 m->even = me;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
128 m->odd = mo;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
129 m->noise = mn;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
130 m->temp = mt;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
131 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
132
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
133 static void diff_fields(struct metrics *metr, mp_image_t *old, mp_image_t *new)
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
134 {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
135 struct metrics m, mu, mv;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
136 diff_planes(&m, old->planes[0], new->planes[0],
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
137 new->w, new->h, old->stride[0], new->stride[0]);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
138 if (new->flags & MP_IMGFLAG_PLANAR) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
139 diff_planes(&mu, old->planes[1], new->planes[1],
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
140 new->chroma_width, new->chroma_height,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
141 old->stride[1], new->stride[1]);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
142 diff_planes(&mv, old->planes[2], new->planes[2],
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
143 new->chroma_width, new->chroma_height,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
144 old->stride[2], new->stride[2]);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
145 if (mu.even > m.even) m.even = mu.even;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
146 if (mu.odd > m.odd) m.odd = mu.odd;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
147 if (mu.noise > m.noise) m.noise = mu.noise;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
148 if (mu.temp > m.temp) m.temp = mu.temp;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
149 if (mv.even > m.even) m.even = mv.even;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
150 if (mv.odd > m.odd) m.odd = mv.odd;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
151 if (mv.noise > m.noise) m.noise = mv.noise;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
152 if (mv.temp > m.temp) m.temp = mv.temp;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
153 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
154 *metr = m;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
155 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
156
9636
5a087f79270a compiler warning fix by Dominik Mierzejewski <dominik@rangers.eu.org>
alex
parents: 9593
diff changeset
157 static void status(int f, struct metrics *m)
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
158 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
159 mp_msg(MSGT_VFILTER, MSGL_V, "frame %d: e=%d o=%d n=%d t=%d\n",
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
160 f, m->even, m->odd, m->noise, m->temp);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
161 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
162
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
163 static int analyze_fixed_pattern(struct vf_priv_s *p, mp_image_t *new, mp_image_t *old)
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
164 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
165 if (p->frame >= 0) p->frame = (p->frame+1)%5;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
166 mp_msg(MSGT_VFILTER, MSGL_V, "frame %d\n", p->frame);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
167 switch (p->frame) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
168 case -1: case 0: case 1: case 2:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
169 return TC_PROG;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
170 case 3:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
171 return TC_IL1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
172 case 4:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
173 return TC_IL2;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
174 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
175 return 0;
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
176 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
177
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
178 static int analyze_aggressive(struct vf_priv_s *p, mp_image_t *new, mp_image_t *old)
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
179 {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
180 struct metrics m, pm;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
181
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
182 if (p->frame >= 0) p->frame = (p->frame+1)%5;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
183
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
184 diff_fields(&m, old, new);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
185
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
186 status(p->frame, &m);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
187
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
188 pm = p->pm;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
189 p->pm = m;
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
190
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
191 if (p->frame == 4) {
9665
8f030cabf1d9 try to break pattern at scene changes to prevent merging pictures that
rfelker
parents: 9660
diff changeset
192 /* We need to break at scene changes, but is this a valid test? */
8f030cabf1d9 try to break pattern at scene changes to prevent merging pictures that
rfelker
parents: 9660
diff changeset
193 if ((m.even > p->thres[2]) && (m.odd > p->thres[2]) && (m.temp > p->thres[3])
8f030cabf1d9 try to break pattern at scene changes to prevent merging pictures that
rfelker
parents: 9660
diff changeset
194 && (m.temp > 5*pm.temp) && (m.temp*2 > m.noise)) {
8f030cabf1d9 try to break pattern at scene changes to prevent merging pictures that
rfelker
parents: 9660
diff changeset
195 mp_msg(MSGT_VFILTER, MSGL_V, "scene change breaking telecine!\n");
8f030cabf1d9 try to break pattern at scene changes to prevent merging pictures that
rfelker
parents: 9660
diff changeset
196 p->frame = -1;
8f030cabf1d9 try to break pattern at scene changes to prevent merging pictures that
rfelker
parents: 9660
diff changeset
197 return TC_DROP;
8f030cabf1d9 try to break pattern at scene changes to prevent merging pictures that
rfelker
parents: 9660
diff changeset
198 }
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
199 /* Thres. is to compensate for quantization errors when noise is low */
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
200 if (m.noise - m.temp > -p->thres[4]) {
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
201 if (COMPARABLE(m.even, pm.odd)) {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
202 //mp_msg(MSGT_VFILTER, MSGL_V, "confirmed field match!\n");
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
203 return TC_IL2;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
204 } else if ((m.even < p->thres[0]) && (m.odd < p->thres[0]) && VERYCLOSE(m.even, m.odd)
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
205 && VERYCLOSE(m.noise,m.temp) && VERYCLOSE(m.noise,pm.noise)) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
206 mp_msg(MSGT_VFILTER, MSGL_V, "interlaced frame appears in duplicate!!!\n");
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
207 p->pm = pm; /* hack :) */
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
208 p->frame = 3;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
209 return TC_IL1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
210 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
211 } else {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
212 mp_msg(MSGT_VFILTER, MSGL_V, "mismatched telecine fields!\n");
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
213 p->frame = -1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
214 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
215 }
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
216
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
217 if (2*m.even*m.temp < m.odd*m.noise) {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
218 mp_msg(MSGT_VFILTER, MSGL_V, "caught telecine sync!\n");
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
219 p->frame = 3;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
220 return TC_IL1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
221 }
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
222
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
223 if (p->frame < 3) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
224 if (m.noise > p->thres[3]) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
225 if (m.noise > 2*m.temp) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
226 mp_msg(MSGT_VFILTER, MSGL_V, "merging fields out of sequence!\n");
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
227 return TC_IL2;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
228 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
229 if ((m.noise > 2*pm.noise) && (m.even > p->thres[2]) && (m.odd > p->thres[2])) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
230 mp_msg(MSGT_VFILTER, MSGL_V, "dropping horrible interlaced frame!\n");
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
231 return TC_DROP;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
232 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
233 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
234 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
235
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
236 switch (p->frame) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
237 case -1:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
238 if (4*m.noise > 5*m.temp) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
239 mp_msg(MSGT_VFILTER, MSGL_V, "merging fields out of sequence!\n");
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
240 return TC_IL2;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
241 }
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
242 case 0:
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
243 case 1:
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
244 case 2:
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
245 return TC_PROG;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
246 case 3:
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
247 if ((m.even > p->thres[1]) && (m.even > m.odd) && (m.temp > m.noise)) {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
248 mp_msg(MSGT_VFILTER, MSGL_V, "lost telecine tracking!\n");
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
249 p->frame = -1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
250 return TC_PROG;
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
251 }
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
252 return TC_IL1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
253 case 4:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
254 return TC_IL2;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
255 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
256 return 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
257 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
258
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
259 static void copy_image(mp_image_t *dmpi, mp_image_t *mpi, int field)
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
260 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
261 switch (field) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
262 case 0:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
263 my_memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h/2,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
264 dmpi->stride[0]*2, mpi->stride[0]*2);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
265 if (mpi->flags & MP_IMGFLAG_PLANAR) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
266 my_memcpy_pic(dmpi->planes[1], mpi->planes[1],
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
267 mpi->chroma_width, mpi->chroma_height/2,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
268 dmpi->stride[1]*2, mpi->stride[1]*2);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
269 my_memcpy_pic(dmpi->planes[2], mpi->planes[2],
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
270 mpi->chroma_width, mpi->chroma_height/2,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
271 dmpi->stride[2]*2, mpi->stride[2]*2);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
272 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
273 break;
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
274 case 1:
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
275 my_memcpy_pic(dmpi->planes[0]+dmpi->stride[0],
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
276 mpi->planes[0]+mpi->stride[0], mpi->w, mpi->h/2,
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
277 dmpi->stride[0]*2, mpi->stride[0]*2);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
278 if (mpi->flags & MP_IMGFLAG_PLANAR) {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
279 my_memcpy_pic(dmpi->planes[1]+dmpi->stride[1],
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
280 mpi->planes[1]+mpi->stride[1],
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
281 mpi->chroma_width, mpi->chroma_height/2,
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
282 dmpi->stride[1]*2, mpi->stride[1]*2);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
283 my_memcpy_pic(dmpi->planes[2]+dmpi->stride[2],
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
284 mpi->planes[2]+mpi->stride[2],
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
285 mpi->chroma_width, mpi->chroma_height/2,
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
286 dmpi->stride[2]*2, mpi->stride[2]*2);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
287 }
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
288 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
289 case 2:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
290 memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
291 dmpi->stride[0], mpi->stride[0]);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
292 if (mpi->flags & MP_IMGFLAG_PLANAR) {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
293 memcpy_pic(dmpi->planes[1], mpi->planes[1],
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
294 mpi->chroma_width, mpi->chroma_height,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
295 dmpi->stride[1], mpi->stride[1]);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
296 memcpy_pic(dmpi->planes[2], mpi->planes[2],
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
297 mpi->chroma_width, mpi->chroma_height,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
298 dmpi->stride[2], mpi->stride[2]);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
299 }
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
300 break;
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
301 }
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
302 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
303
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
304 static int do_put_image(struct vf_instance_s* vf, mp_image_t *dmpi)
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
305 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
306 struct vf_priv_s *p = vf->priv;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
307 int dropflag;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
308
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
309 switch (p->drop) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
310 case 0:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
311 dropflag = 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
312 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
313 case 1:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
314 dropflag = (++p->lastdrop >= 5);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
315 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
316 case 2:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
317 dropflag = (++p->lastdrop >= 5) && (4*p->inframes <= 5*p->outframes);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
318 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
319 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
320
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
321 if (dropflag) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
322 mp_msg(MSGT_VFILTER, MSGL_V, "drop! [%d/%d=%g]\n",
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
323 p->outframes, p->inframes, (float)p->outframes/p->inframes);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
324 p->lastdrop = 0;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
325 return 0;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
326 }
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
327
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
328 p->outframes++;
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
329 return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
330 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
331
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
332 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts)
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
333 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
334 int ret=0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
335 mp_image_t *dmpi;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
336 struct vf_priv_s *p = vf->priv;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
337
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
338 p->inframes++;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
339
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
340 if (p->needread) dmpi = vf_get_image(vf->next, mpi->imgfmt,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
341 MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE |
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
342 MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
343 mpi->width, mpi->height);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
344 /* FIXME: is there a good way to get rid of static type? */
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
345 else dmpi = vf_get_image(vf->next, mpi->imgfmt,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
346 MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE |
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
347 MP_IMGFLAG_PRESERVE, mpi->width, mpi->height);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
348
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
349 switch (p->analyze(p, mpi, dmpi)) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
350 case TC_DROP:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
351 /* Don't copy anything unless we'll need to read it. */
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
352 if (p->needread) copy_image(dmpi, mpi, 2);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
353 p->lastdrop = 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
354 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
355 case TC_PROG:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
356 /* Copy and display the whole frame. */
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
357 copy_image(dmpi, mpi, 2);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
358 ret = do_put_image(vf, dmpi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
359 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
360 case TC_IL1:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
361 /* Only copy bottom field unless we need to read. */
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
362 if (p->needread) copy_image(dmpi, mpi, 2);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
363 else copy_image(dmpi, mpi, 1);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
364 p->lastdrop = 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
365 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
366 case TC_IL2:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
367 /* Copy top field and show frame, then copy bottom if needed. */
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
368 copy_image(dmpi, mpi, 0);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
369 ret = do_put_image(vf, dmpi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
370 if (p->needread) copy_image(dmpi, mpi, 1);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
371 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
372 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
373 return ret;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
374 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
375
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
376 static int query_format(struct vf_instance_s* vf, unsigned int fmt)
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
377 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
378 /* FIXME - figure out which other formats work */
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
379 switch (fmt) {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
380 case IMGFMT_YV12:
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
381 case IMGFMT_IYUV:
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
382 case IMGFMT_I420:
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
383 return vf_next_query_format(vf, fmt);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
384 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
385 return 0;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
386 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
387
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
388 static int config(struct vf_instance_s* vf,
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
389 int width, int height, int d_width, int d_height,
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
390 unsigned int flags, unsigned int outfmt)
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
391 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
392 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
393 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
394
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
395 static void uninit(struct vf_instance_s* vf)
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
396 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
397 free(vf->priv);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
398 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
399
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
400 static struct {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
401 char *name;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
402 int (*func)(struct vf_priv_s *p, mp_image_t *new, mp_image_t *old);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
403 int needread;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
404 } anal_funcs[] = {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
405 { "fixed", analyze_fixed_pattern, 0 },
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
406 { "aggressive", analyze_aggressive, 1 },
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
407 { NULL, NULL, 0 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
408 };
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
409
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
410 #define STARTVARS if (0)
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
411 #define GETVAR(str, name, out, func) \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
412 else if (!strncmp((str), name "=", sizeof(name))) \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
413 (out) = (func)((str) + sizeof(name))
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
414
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
415 static void parse_var(struct vf_priv_s *p, char *var)
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
416 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
417 STARTVARS;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
418 GETVAR(var, "dr", p->drop, atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
419 GETVAR(var, "t0", p->thres[0], atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
420 GETVAR(var, "t1", p->thres[1], atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
421 GETVAR(var, "t2", p->thres[2], atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
422 GETVAR(var, "t3", p->thres[3], atoi);
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
423 GETVAR(var, "t4", p->thres[4], atoi);
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
424 GETVAR(var, "fr", p->frame, atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
425 GETVAR(var, "am", p->mode, atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
426 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
427
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
428 static void parse_args(struct vf_priv_s *p, char *args)
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
429 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
430 char *next, *orig;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
431 for (args=orig=strdup(args); args; args=next) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
432 next = strchr(args, ':');
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
433 if (next) *next++ = 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
434 parse_var(p, args);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
435 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
436 free(orig);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
437 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
438
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
439 static int open(vf_instance_t *vf, char* args)
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
440 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
441 struct vf_priv_s *p;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
442 vf->config = config;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
443 vf->put_image = put_image;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
444 vf->query_format = query_format;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
445 vf->uninit = uninit;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
446 vf->default_reqs = VFCAP_ACCEPT_STRIDE;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
447 vf->priv = p = calloc(1, sizeof(struct vf_priv_s));
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
448 p->frame = -1;
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
449 p->thres[0] = 440;
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
450 p->thres[1] = 720;
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
451 p->thres[2] = 2500;
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
452 p->thres[3] = 2500;
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
453 p->thres[4] = 800;
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
454 p->drop = 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
455 p->mode = 1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
456 if (args) parse_args(p, args);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
457 p->analyze = anal_funcs[p->mode].func;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
458 p->needread = anal_funcs[p->mode].needread;
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
459 return 1;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
460 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
461
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
462 vf_info_t vf_info_detc = {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
463 "de-telecine filter",
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
464 "detc",
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
465 "Rich Felker",
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
466 "",
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9554
diff changeset
467 open,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9554
diff changeset
468 NULL
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
469 };
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
470
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
471