annotate libmpcodecs/vf_detc.c @ 24576:6704a924d4aa

According to MSDN a thread must call CoUninitialize once for each successful call it has made to CoInitialize or CoInitializeEx, including any call that returns S_FALSE. Only the CoUninitialize call corresponding to the CoInitialize or CoInitializeEx call that initialized the library can close it. patch by Gianluigi Tiesi, mplayer netfarm it
author diego
date Sun, 23 Sep 2007 20:37:33 +0000
parents 5c3c7efd9b75
children a767a981c983
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
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
56 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
57 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
58 int step = w*h/1024;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
59 unsigned int hash=0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
60 int x=0, y;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
61
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
62 step -= step % 3;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
63
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
64 for (y=0; y<h; y++) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
65 for (; x<w; x+=step) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
66 hash = hash ^ (hash<<4) ^ img[x];
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
67 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
68 x -= w;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
69 img += stride;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
70 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
71
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
72 return hash;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
73 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
74
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
75 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
76 {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
77 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
78 unsigned char *oldp, *newp;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
79 m->noise = m->temp = 0;
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
80 for (x = 8; x; x--) {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
81 oldp = old++;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
82 newp = new++;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
83 noise = temp = 0;
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
84 for (y = 4; y; y--) {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
85 even += abs(newp[0]-oldp[0]);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
86 odd += abs(newp[ns]-oldp[os]);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
87 noise += newp[ns]-newp[0];
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
88 temp += oldp[os]-newp[0];
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
89 oldp += os<<1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
90 newp += ns<<1;
9467
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 m->noise += abs(noise);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
93 m->temp += abs(temp);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
94 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
95 m->even = even;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
96 m->odd = odd;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
97 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
98
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
99 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
100 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
101 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
102 struct metrics l;
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
103 for (y = 0; y < h-7; y += 8) {
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
104 for (x = 0; x < w-7; x += 8) {
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
105 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
106 if (l.even > me) me = l.even;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
107 if (l.odd > mo) mo = l.odd;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
108 if (l.noise > mn) mn = l.noise;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
109 if (l.temp > mt) mt = l.temp;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
110 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
111 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
112 m->even = me;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
113 m->odd = mo;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
114 m->noise = mn;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
115 m->temp = mt;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
116 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
117
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
118 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
119 {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
120 struct metrics m, mu, mv;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
121 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
122 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
123 if (new->flags & MP_IMGFLAG_PLANAR) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
124 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
125 new->chroma_width, new->chroma_height,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
126 old->stride[1], new->stride[1]);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
127 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
128 new->chroma_width, new->chroma_height,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
129 old->stride[2], new->stride[2]);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
130 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
131 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
132 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
133 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
134 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
135 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
136 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
137 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
138 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
139 *metr = m;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
140 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
141
9636
5a087f79270a compiler warning fix by Dominik Mierzejewski <dominik@rangers.eu.org>
alex
parents: 9593
diff changeset
142 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
143 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
144 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
145 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
146 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
147
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
148 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
149 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
150 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
151 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
152 switch (p->frame) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
153 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
154 return TC_PROG;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
155 case 3:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
156 return TC_IL1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
157 case 4:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
158 return TC_IL2;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
159 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
160 return 0;
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
161 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
162
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
163 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
164 {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
165 struct metrics m, pm;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
166
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
167 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
168
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
169 diff_fields(&m, old, new);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
170
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
171 status(p->frame, &m);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
172
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
173 pm = p->pm;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
174 p->pm = m;
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
175
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
176 if (p->frame == 4) {
9665
8f030cabf1d9 try to break pattern at scene changes to prevent merging pictures that
rfelker
parents: 9660
diff changeset
177 /* 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
178 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
179 && (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
180 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
181 p->frame = -1;
8f030cabf1d9 try to break pattern at scene changes to prevent merging pictures that
rfelker
parents: 9660
diff changeset
182 return TC_DROP;
8f030cabf1d9 try to break pattern at scene changes to prevent merging pictures that
rfelker
parents: 9660
diff changeset
183 }
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
184 /* Thres. is to compensate for quantization errors when noise is low */
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
185 if (m.noise - m.temp > -p->thres[4]) {
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
186 if (COMPARABLE(m.even, pm.odd)) {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
187 //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
188 return TC_IL2;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
189 } 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
190 && 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
191 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
192 p->pm = pm; /* hack :) */
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
193 p->frame = 3;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
194 return TC_IL1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
195 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
196 } else {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
197 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
198 p->frame = -1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
199 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
200 }
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
201
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
202 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
203 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
204 p->frame = 3;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
205 return TC_IL1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
206 }
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
207
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
208 if (p->frame < 3) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
209 if (m.noise > p->thres[3]) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
210 if (m.noise > 2*m.temp) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
211 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
212 return TC_IL2;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
213 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
214 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
215 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
216 return TC_DROP;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
217 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
218 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
219 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
220
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
221 switch (p->frame) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
222 case -1:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
223 if (4*m.noise > 5*m.temp) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
224 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
225 return TC_IL2;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
226 }
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
227 case 0:
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
228 case 1:
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
229 case 2:
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
230 return TC_PROG;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
231 case 3:
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
232 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
233 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
234 p->frame = -1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
235 return TC_PROG;
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
236 }
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
237 return TC_IL1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
238 case 4:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
239 return TC_IL2;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
240 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
241 return 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
242 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
243
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
244 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
245 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
246 switch (field) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
247 case 0:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
248 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
249 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
250 if (mpi->flags & MP_IMGFLAG_PLANAR) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
251 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
252 mpi->chroma_width, mpi->chroma_height/2,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
253 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
254 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
255 mpi->chroma_width, mpi->chroma_height/2,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
256 dmpi->stride[2]*2, mpi->stride[2]*2);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
257 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
258 break;
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
259 case 1:
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
260 my_memcpy_pic(dmpi->planes[0]+dmpi->stride[0],
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
261 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
262 dmpi->stride[0]*2, mpi->stride[0]*2);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
263 if (mpi->flags & MP_IMGFLAG_PLANAR) {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
264 my_memcpy_pic(dmpi->planes[1]+dmpi->stride[1],
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
265 mpi->planes[1]+mpi->stride[1],
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
266 mpi->chroma_width, mpi->chroma_height/2,
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
267 dmpi->stride[1]*2, mpi->stride[1]*2);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
268 my_memcpy_pic(dmpi->planes[2]+dmpi->stride[2],
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
269 mpi->planes[2]+mpi->stride[2],
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
270 mpi->chroma_width, mpi->chroma_height/2,
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
271 dmpi->stride[2]*2, mpi->stride[2]*2);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
272 }
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
273 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
274 case 2:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
275 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
276 dmpi->stride[0], mpi->stride[0]);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
277 if (mpi->flags & MP_IMGFLAG_PLANAR) {
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
278 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
279 mpi->chroma_width, mpi->chroma_height,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
280 dmpi->stride[1], mpi->stride[1]);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
281 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
282 mpi->chroma_width, mpi->chroma_height,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
283 dmpi->stride[2], mpi->stride[2]);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
284 }
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
285 break;
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
286 }
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
287 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
288
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
289 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
290 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
291 struct vf_priv_s *p = vf->priv;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
292 int dropflag;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
293
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
294 switch (p->drop) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
295 case 0:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
296 dropflag = 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
297 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
298 case 1:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
299 dropflag = (++p->lastdrop >= 5);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
300 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
301 case 2:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
302 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
303 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
304 }
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 if (dropflag) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
307 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
308 p->outframes, p->inframes, (float)p->outframes/p->inframes);
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
309 p->lastdrop = 0;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
310 return 0;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
311 }
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
312
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
313 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
314 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
315 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
316
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
317 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
318 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
319 int ret=0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
320 mp_image_t *dmpi;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
321 struct vf_priv_s *p = vf->priv;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
322
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
323 p->inframes++;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
324
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
325 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
326 MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE |
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
327 MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE,
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
328 mpi->width, mpi->height);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
329 /* 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
330 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
331 MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE |
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
332 MP_IMGFLAG_PRESERVE, mpi->width, mpi->height);
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 switch (p->analyze(p, mpi, dmpi)) {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
335 case TC_DROP:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
336 /* 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
337 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
338 p->lastdrop = 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
339 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
340 case TC_PROG:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
341 /* Copy and display the whole frame. */
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
342 copy_image(dmpi, mpi, 2);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
343 ret = do_put_image(vf, dmpi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
344 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
345 case TC_IL1:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
346 /* 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
347 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
348 else copy_image(dmpi, mpi, 1);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
349 p->lastdrop = 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
350 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
351 case TC_IL2:
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
352 /* 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
353 copy_image(dmpi, mpi, 0);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
354 ret = do_put_image(vf, dmpi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
355 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
356 break;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
357 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
358 return ret;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
359 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
360
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
361 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
362 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
363 /* FIXME - figure out which other formats work */
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
364 switch (fmt) {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
365 case IMGFMT_YV12:
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
366 case IMGFMT_IYUV:
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
367 case IMGFMT_I420:
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
368 return vf_next_query_format(vf, fmt);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
369 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
370 return 0;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
371 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
372
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
373 static int config(struct vf_instance_s* vf,
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
374 int width, int height, int d_width, int d_height,
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
375 unsigned int flags, unsigned int outfmt)
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
376 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
377 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
378 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
379
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
380 static void uninit(struct vf_instance_s* vf)
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
381 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
382 free(vf->priv);
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
383 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
384
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
385 static struct {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
386 char *name;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
387 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
388 int needread;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
389 } anal_funcs[] = {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
390 { "fixed", analyze_fixed_pattern, 0 },
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
391 { "aggressive", analyze_aggressive, 1 },
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
392 { NULL, NULL, 0 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
393 };
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
394
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
395 #define STARTVARS if (0)
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
396 #define GETVAR(str, name, out, func) \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
397 else if (!strncmp((str), name "=", sizeof(name))) \
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
398 (out) = (func)((str) + sizeof(name))
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
399
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
400 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
401 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
402 STARTVARS;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
403 GETVAR(var, "dr", p->drop, atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
404 GETVAR(var, "t0", p->thres[0], atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
405 GETVAR(var, "t1", p->thres[1], atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
406 GETVAR(var, "t2", p->thres[2], atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
407 GETVAR(var, "t3", p->thres[3], atoi);
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
408 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
409 GETVAR(var, "fr", p->frame, atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
410 GETVAR(var, "am", p->mode, atoi);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
411 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
412
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
413 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
414 {
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
415 char *next, *orig;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
416 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
417 next = strchr(args, ':');
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
418 if (next) *next++ = 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
419 parse_var(p, args);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
420 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
421 free(orig);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
422 }
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
423
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
424 static int open(vf_instance_t *vf, char* args)
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
425 {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
426 struct vf_priv_s *p;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
427 vf->config = config;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
428 vf->put_image = put_image;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
429 vf->query_format = query_format;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
430 vf->uninit = uninit;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
431 vf->default_reqs = VFCAP_ACCEPT_STRIDE;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
432 vf->priv = p = calloc(1, sizeof(struct vf_priv_s));
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
433 p->frame = -1;
9660
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
434 p->thres[0] = 440;
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
435 p->thres[1] = 720;
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
436 p->thres[2] = 2500;
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
437 p->thres[3] = 2500;
c2d23e02522b improvements to detc filter:
rfelker
parents: 9636
diff changeset
438 p->thres[4] = 800;
9554
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
439 p->drop = 0;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
440 p->mode = 1;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
441 if (args) parse_args(p, args);
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
442 p->analyze = anal_funcs[p->mode].func;
12eae4cb4e56 new version of the de-telecine filter, largely rewritten. should work
rfelker
parents: 9467
diff changeset
443 p->needread = anal_funcs[p->mode].needread;
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
444 return 1;
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
445 }
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
446
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
447 vf_info_t vf_info_detc = {
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
448 "de-telecine filter",
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
449 "detc",
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
450 "Rich Felker",
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
451 "",
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9554
diff changeset
452 open,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9554
diff changeset
453 NULL
9467
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
454 };
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
455
9fae4150ec43 experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
diff changeset
456