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