Mercurial > mplayer.hg
annotate libmpcodecs/pullup.c @ 15721:eec6ace22741
small change to field-matching metrics which hopefully makes a big
improvement to results. inter-field comparison is now counterbalanced
with intra-field total (vertical) variation. this means that areas of
extreme high frequency content, which become aliased within individual
fields, will not interfere with field matching. examples: white noise
effects, small kanji, very small latin text, ...
may still need tweaking. please report regressions. this change will
likely be made optional in the future (right now it's enclosed in
"if (1)"...
author | rfelker |
---|---|
date | Tue, 14 Jun 2005 05:33:34 +0000 |
parents | 678f6aeb6754 |
children | f580a7755ac5 |
rev | line source |
---|---|
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
1 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
2 |
11412 | 3 #include <stdio.h> |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
4 #include <stdlib.h> |
11412 | 5 #include <string.h> |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
6 #include "pullup.h" |
10741
fec729835823
1000l, mmx code was not being used because of missing config.h, and
rfelker
parents:
10738
diff
changeset
|
7 #include "config.h" |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
8 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
9 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
10 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13235
diff
changeset
|
11 #ifdef ARCH_X86 |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
12 #ifdef HAVE_MMX |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
13 static int diff_y_mmx(unsigned char *a, unsigned char *b, int s) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
14 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
15 int ret; |
10741
fec729835823
1000l, mmx code was not being used because of missing config.h, and
rfelker
parents:
10738
diff
changeset
|
16 asm volatile ( |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
17 "movl $4, %%ecx \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
18 "pxor %%mm4, %%mm4 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
19 "pxor %%mm7, %%mm7 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
20 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
21 ".balign 16 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
22 "1: \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
23 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
24 "movq (%%esi), %%mm0 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
25 "movq (%%esi), %%mm2 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
26 "addl %%eax, %%esi \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
27 "movq (%%edi), %%mm1 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
28 "addl %%eax, %%edi \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
29 "psubusb %%mm1, %%mm2 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
30 "psubusb %%mm0, %%mm1 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
31 "movq %%mm2, %%mm0 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
32 "movq %%mm1, %%mm3 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
33 "punpcklbw %%mm7, %%mm0 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
34 "punpcklbw %%mm7, %%mm1 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
35 "punpckhbw %%mm7, %%mm2 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
36 "punpckhbw %%mm7, %%mm3 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
37 "paddw %%mm0, %%mm4 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
38 "paddw %%mm1, %%mm4 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
39 "paddw %%mm2, %%mm4 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
40 "paddw %%mm3, %%mm4 \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
41 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
42 "decl %%ecx \n\t" |
10741
fec729835823
1000l, mmx code was not being used because of missing config.h, and
rfelker
parents:
10738
diff
changeset
|
43 "jnz 1b \n\t" |
fec729835823
1000l, mmx code was not being used because of missing config.h, and
rfelker
parents:
10738
diff
changeset
|
44 |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
45 "movq %%mm4, %%mm3 \n\t" |
10741
fec729835823
1000l, mmx code was not being used because of missing config.h, and
rfelker
parents:
10738
diff
changeset
|
46 "punpcklwd %%mm7, %%mm4 \n\t" |
fec729835823
1000l, mmx code was not being used because of missing config.h, and
rfelker
parents:
10738
diff
changeset
|
47 "punpckhwd %%mm7, %%mm3 \n\t" |
fec729835823
1000l, mmx code was not being used because of missing config.h, and
rfelker
parents:
10738
diff
changeset
|
48 "paddd %%mm4, %%mm3 \n\t" |
fec729835823
1000l, mmx code was not being used because of missing config.h, and
rfelker
parents:
10738
diff
changeset
|
49 "movd %%mm3, %%eax \n\t" |
fec729835823
1000l, mmx code was not being used because of missing config.h, and
rfelker
parents:
10738
diff
changeset
|
50 "psrlq $32, %%mm3 \n\t" |
10747
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
51 "movd %%mm3, %%edx \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
52 "addl %%edx, %%eax \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
53 "emms \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
54 : "=a" (ret) |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
55 : "S" (a), "D" (b), "a" (s) |
14620 | 56 : "%ecx", "%edx" |
10747
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
57 ); |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
58 return ret; |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
59 } |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
60 |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
61 static int licomb_y_mmx(unsigned char *a, unsigned char *b, int s) |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
62 { |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
63 int ret; |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
64 asm volatile ( |
11624
03e8cbee7333
100l bug found by Zoli, wasted time and unfairly delocalized the metrics
rfelker
parents:
11412
diff
changeset
|
65 "movl $4, %%ecx \n\t" |
10747
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
66 "pxor %%mm6, %%mm6 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
67 "pxor %%mm7, %%mm7 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
68 "subl %%eax, %%edi \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
69 |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
70 ".balign 16 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
71 "2: \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
72 |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
73 "movq (%%esi), %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
74 "movq (%%edi), %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
75 "punpcklbw %%mm7, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
76 "movq (%%edi,%%eax), %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
77 "punpcklbw %%mm7, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
78 "punpcklbw %%mm7, %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
79 "paddw %%mm0, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
80 "paddw %%mm2, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
81 "movq %%mm0, %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
82 "psubusw %%mm1, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
83 "psubusw %%mm2, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
84 "paddw %%mm0, %%mm6 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
85 "paddw %%mm1, %%mm6 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
86 |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
87 "movq (%%esi), %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
88 "movq (%%edi), %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
89 "punpckhbw %%mm7, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
90 "movq (%%edi,%%eax), %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
91 "punpckhbw %%mm7, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
92 "punpckhbw %%mm7, %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
93 "paddw %%mm0, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
94 "paddw %%mm2, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
95 "movq %%mm0, %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
96 "psubusw %%mm1, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
97 "psubusw %%mm2, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
98 "paddw %%mm0, %%mm6 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
99 "paddw %%mm1, %%mm6 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
100 |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
101 "movq (%%edi,%%eax), %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
102 "movq (%%esi), %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
103 "punpcklbw %%mm7, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
104 "movq (%%esi,%%eax), %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
105 "punpcklbw %%mm7, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
106 "punpcklbw %%mm7, %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
107 "paddw %%mm0, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
108 "paddw %%mm2, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
109 "movq %%mm0, %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
110 "psubusw %%mm1, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
111 "psubusw %%mm2, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
112 "paddw %%mm0, %%mm6 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
113 "paddw %%mm1, %%mm6 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
114 |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
115 "movq (%%edi,%%eax), %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
116 "movq (%%esi), %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
117 "punpckhbw %%mm7, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
118 "movq (%%esi,%%eax), %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
119 "punpckhbw %%mm7, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
120 "punpckhbw %%mm7, %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
121 "paddw %%mm0, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
122 "paddw %%mm2, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
123 "movq %%mm0, %%mm2 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
124 "psubusw %%mm1, %%mm0 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
125 "psubusw %%mm2, %%mm1 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
126 "paddw %%mm0, %%mm6 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
127 "paddw %%mm1, %%mm6 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
128 |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
129 "addl %%eax, %%esi \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
130 "addl %%eax, %%edi \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
131 "decl %%ecx \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
132 "jnz 2b \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
133 |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
134 "movq %%mm6, %%mm5 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
135 "punpcklwd %%mm7, %%mm6 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
136 "punpckhwd %%mm7, %%mm5 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
137 "paddd %%mm6, %%mm5 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
138 "movd %%mm5, %%eax \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
139 "psrlq $32, %%mm5 \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
140 "movd %%mm5, %%edx \n\t" |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
141 "addl %%edx, %%eax \n\t" |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
142 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
143 "emms \n\t" |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
144 : "=a" (ret) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
145 : "S" (a), "D" (b), "a" (s) |
14620 | 146 : "%ecx", "%edx" |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
147 ); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
148 return ret; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
149 } |
15721
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
150 |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
151 static int var_y_mmx(unsigned char *a, unsigned char *b, int s) |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
152 { |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
153 int ret; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
154 asm volatile ( |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
155 "movl $3, %%ecx \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
156 "pxor %%mm4, %%mm4 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
157 "pxor %%mm7, %%mm7 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
158 |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
159 ".balign 16 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
160 "1: \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
161 |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
162 "movq (%%esi), %%mm0 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
163 "movq (%%esi), %%mm2 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
164 "movq (%%esi,%%eax), %%mm1 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
165 "addl %%eax, %%esi \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
166 "psubusb %%mm1, %%mm2 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
167 "psubusb %%mm0, %%mm1 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
168 "movq %%mm2, %%mm0 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
169 "movq %%mm1, %%mm3 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
170 "punpcklbw %%mm7, %%mm0 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
171 "punpcklbw %%mm7, %%mm1 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
172 "punpckhbw %%mm7, %%mm2 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
173 "punpckhbw %%mm7, %%mm3 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
174 "paddw %%mm0, %%mm4 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
175 "paddw %%mm1, %%mm4 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
176 "paddw %%mm2, %%mm4 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
177 "paddw %%mm3, %%mm4 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
178 |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
179 "decl %%ecx \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
180 "jnz 1b \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
181 |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
182 "movq %%mm4, %%mm3 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
183 "punpcklwd %%mm7, %%mm4 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
184 "punpckhwd %%mm7, %%mm3 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
185 "paddd %%mm4, %%mm3 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
186 "movd %%mm3, %%eax \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
187 "psrlq $32, %%mm3 \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
188 "movd %%mm3, %%edx \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
189 "addl %%edx, %%eax \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
190 "emms \n\t" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
191 : "=a" (ret) |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
192 : "S" (a), "a" (s) |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
193 : "%ecx", "%edx" |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
194 ); |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
195 return 4*ret; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
196 } |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
197 #endif |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13235
diff
changeset
|
198 #endif |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
199 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
200 #define ABS(a) (((a)^((a)>>31))-((a)>>31)) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
201 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
202 static int diff_y(unsigned char *a, unsigned char *b, int s) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
203 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
204 int i, j, diff=0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
205 for (i=4; i; i--) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
206 for (j=0; j<8; j++) diff += ABS(a[j]-b[j]); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
207 a+=s; b+=s; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
208 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
209 return diff; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
210 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
211 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
212 static int licomb_y(unsigned char *a, unsigned char *b, int s) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
213 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
214 int i, j, diff=0; |
11624
03e8cbee7333
100l bug found by Zoli, wasted time and unfairly delocalized the metrics
rfelker
parents:
11412
diff
changeset
|
215 for (i=4; i; i--) { |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
216 for (j=0; j<8; j++) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
217 diff += ABS((a[j]<<1) - b[j-s] - b[j]) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
218 + ABS((b[j]<<1) - a[j] - a[j+s]); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
219 a+=s; b+=s; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
220 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
221 return diff; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
222 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
223 |
11626
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
224 static int qpcomb_y(unsigned char *a, unsigned char *b, int s) |
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
225 { |
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
226 int i, j, diff=0; |
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
227 for (i=4; i; i--) { |
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
228 for (j=0; j<8; j++) |
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
229 diff += ABS(a[j] - 3*b[j-s] + 3*a[j+s] - b[j]); |
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
230 a+=s; b+=s; |
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
231 } |
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
232 return diff; |
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
233 } |
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
234 |
10843 | 235 #if 0 |
10747
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
236 static int licomb_y_test(unsigned char *a, unsigned char *b, int s) |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
237 { |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
238 int c = licomb_y(a,b,s); |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
239 int m = licomb_y_mmx(a,b,s); |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
240 if (c != m) printf("%d != %d\n", c, m); |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
241 return m; |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
242 } |
10843 | 243 #endif |
10747
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
244 |
15721
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
245 static int var_y(unsigned char *a, unsigned char *b, int s) |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
246 { |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
247 int i, j, var=0; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
248 for (i=3; i; i--) { |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
249 for (j=0; j<8; j++) { |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
250 var += ABS(a[j]-a[j+s]); |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
251 } |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
252 a+=s; b+=s; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
253 } |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
254 return 4*var; /* match comb scaling */ |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
255 } |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
256 |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
257 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
258 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
259 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
260 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
261 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
262 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
263 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
264 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
265 static void alloc_buffer(struct pullup_context *c, struct pullup_buffer *b) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
266 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
267 int i; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
268 if (b->planes) return; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
269 b->planes = calloc(c->nplanes, sizeof(unsigned char *)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
270 for (i = 0; i < c->nplanes; i++) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
271 b->planes[i] = malloc(c->h[i]*c->stride[i]); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
272 /* Deal with idiotic 128=0 for chroma: */ |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
273 memset(b->planes[i], c->background[i], c->h[i]*c->stride[i]); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
274 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
275 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
276 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
277 struct pullup_buffer *pullup_lock_buffer(struct pullup_buffer *b, int parity) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
278 { |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
279 if (!b) return 0; |
14619 | 280 if ((parity+1) & 1) b->lock[0]++; |
281 if ((parity+1) & 2) b->lock[1]++; | |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
282 return b; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
283 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
284 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
285 void pullup_release_buffer(struct pullup_buffer *b, int parity) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
286 { |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
287 if (!b) return; |
14619 | 288 if ((parity+1) & 1) b->lock[0]--; |
289 if ((parity+1) & 2) b->lock[1]--; | |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
290 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
291 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
292 struct pullup_buffer *pullup_get_buffer(struct pullup_context *c, int parity) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
293 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
294 int i; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
295 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
296 /* Try first to get the sister buffer for the previous field */ |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
297 if (parity < 2 && c->last && parity != c->last->parity |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
298 && !c->last->buffer->lock[parity]) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
299 alloc_buffer(c, c->last->buffer); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
300 return pullup_lock_buffer(c->last->buffer, parity); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
301 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
302 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
303 /* Prefer a buffer with both fields open */ |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
304 for (i = 0; i < c->nbuffers; i++) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
305 if (c->buffers[i].lock[0]) continue; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
306 if (c->buffers[i].lock[1]) continue; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
307 alloc_buffer(c, &c->buffers[i]); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
308 return pullup_lock_buffer(&c->buffers[i], parity); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
309 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
310 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
311 if (parity == 2) return 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
312 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
313 /* Search for any half-free buffer */ |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
314 for (i = 0; i < c->nbuffers; i++) { |
14619 | 315 if (((parity+1) & 1) && c->buffers[i].lock[0]) continue; |
316 if (((parity+1) & 2) && c->buffers[i].lock[1]) continue; | |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
317 alloc_buffer(c, &c->buffers[i]); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
318 return pullup_lock_buffer(&c->buffers[i], parity); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
319 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
320 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
321 return 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
322 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
323 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
324 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
325 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
326 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
327 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
328 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
329 static void compute_metric(struct pullup_context *c, |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
330 struct pullup_field *fa, int pa, |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
331 struct pullup_field *fb, int pb, |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
332 int (*func)(unsigned char *, unsigned char *, int), int *dest) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
333 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
334 unsigned char *a, *b; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
335 int x, y; |
10956
fdcd0d571912
support for selecting which plane to use for metrics in the pullup
rfelker
parents:
10843
diff
changeset
|
336 int mp = c->metric_plane; |
fdcd0d571912
support for selecting which plane to use for metrics in the pullup
rfelker
parents:
10843
diff
changeset
|
337 int xstep = c->bpp[mp]; |
fdcd0d571912
support for selecting which plane to use for metrics in the pullup
rfelker
parents:
10843
diff
changeset
|
338 int ystep = c->stride[mp]<<3; |
fdcd0d571912
support for selecting which plane to use for metrics in the pullup
rfelker
parents:
10843
diff
changeset
|
339 int s = c->stride[mp]<<1; /* field stride */ |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
340 int w = c->metric_w*xstep; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
341 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
342 if (!fa->buffer || !fb->buffer) return; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
343 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
344 /* Shortcut for duplicate fields (e.g. from RFF flag) */ |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
345 if (fa->buffer == fb->buffer && pa == pb) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
346 memset(dest, 0, c->metric_len * sizeof(int)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
347 return; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
348 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
349 |
10956
fdcd0d571912
support for selecting which plane to use for metrics in the pullup
rfelker
parents:
10843
diff
changeset
|
350 a = fa->buffer->planes[mp] + pa * c->stride[mp] + c->metric_offset; |
fdcd0d571912
support for selecting which plane to use for metrics in the pullup
rfelker
parents:
10843
diff
changeset
|
351 b = fb->buffer->planes[mp] + pb * c->stride[mp] + c->metric_offset; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
352 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
353 for (y = c->metric_h; y; y--) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
354 for (x = 0; x < w; x += xstep) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
355 *dest++ = func(a + x, b + x, s); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
356 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
357 a += ystep; b += ystep; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
358 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
359 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
360 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
361 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
362 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
363 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
364 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
365 static void alloc_metrics(struct pullup_context *c, struct pullup_field *f) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
366 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
367 f->diffs = calloc(c->metric_len, sizeof(int)); |
11626
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
368 f->comb = calloc(c->metric_len, sizeof(int)); |
15721
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
369 f->var = calloc(c->metric_len, sizeof(int)); |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
370 /* add more metrics here as needed */ |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
371 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
372 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
373 static struct pullup_field *make_field_queue(struct pullup_context *c, int len) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
374 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
375 struct pullup_field *head, *f; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
376 f = head = calloc(1, sizeof(struct pullup_field)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
377 alloc_metrics(c, f); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
378 for (; len > 0; len--) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
379 f->next = calloc(1, sizeof(struct pullup_field)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
380 f->next->prev = f; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
381 f = f->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
382 alloc_metrics(c, f); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
383 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
384 f->next = head; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
385 head->prev = f; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
386 return head; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
387 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
388 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
389 static void check_field_queue(struct pullup_context *c) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
390 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
391 if (c->head->next == c->first) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
392 struct pullup_field *f = calloc(1, sizeof(struct pullup_field)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
393 alloc_metrics(c, f); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
394 f->prev = c->head; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
395 f->next = c->first; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
396 c->head->next = f; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
397 c->first->prev = f; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
398 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
399 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
400 |
11412 | 401 void pullup_submit_field(struct pullup_context *c, struct pullup_buffer *b, int parity) |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
402 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
403 struct pullup_field *f; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
404 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
405 /* Grow the circular list if needed */ |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
406 check_field_queue(c); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
407 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
408 /* Cannot have two fields of same parity in a row; drop the new one */ |
11412 | 409 if (c->last && c->last->parity == parity) return; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
410 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
411 f = c->head; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
412 f->parity = parity; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
413 f->buffer = pullup_lock_buffer(b, parity); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
414 f->flags = 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
415 f->breaks = 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
416 f->affinity = 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
417 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
418 compute_metric(c, f, parity, f->prev->prev, parity, c->diff, f->diffs); |
11626
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
419 compute_metric(c, parity?f->prev:f, 0, parity?f:f->prev, 1, c->comb, f->comb); |
15721
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
420 compute_metric(c, f, parity, f, -1, c->var, f->var); |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
421 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
422 /* Advance the circular list */ |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
423 if (!c->first) c->first = c->head; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
424 c->last = c->head; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
425 c->head = c->head->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
426 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
427 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
428 void pullup_flush_fields(struct pullup_context *c) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
429 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
430 struct pullup_field *f; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
431 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
432 for (f = c->first; f && f != c->head; f = f->next) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
433 pullup_release_buffer(f->buffer, f->parity); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
434 f->buffer = 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
435 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
436 c->first = c->last = 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
437 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
438 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
439 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
440 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
441 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
442 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
443 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
444 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
445 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
446 #define F_HAVE_BREAKS 1 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
447 #define F_HAVE_AFFINITY 2 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
448 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
449 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
450 #define BREAK_LEFT 1 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
451 #define BREAK_RIGHT 2 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
452 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
453 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
454 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
455 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
456 static int queue_length(struct pullup_field *begin, struct pullup_field *end) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
457 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
458 int count = 1; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
459 struct pullup_field *f; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
460 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
461 if (!begin || !end) return 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
462 for (f = begin; f != end; f = f->next) count++; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
463 return count; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
464 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
465 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
466 static int find_first_break(struct pullup_field *f, int max) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
467 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
468 int i; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
469 for (i = 0; i < max; i++) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
470 if (f->breaks & BREAK_RIGHT || f->next->breaks & BREAK_LEFT) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
471 return i+1; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
472 f = f->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
473 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
474 return 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
475 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
476 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
477 static void compute_breaks(struct pullup_context *c, struct pullup_field *f0) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
478 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
479 int i; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
480 struct pullup_field *f1 = f0->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
481 struct pullup_field *f2 = f1->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
482 struct pullup_field *f3 = f2->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
483 int l, max_l=0, max_r=0; |
13234
7056d7cfcd02
just some debugging junk i'd like to have in there for now :)
rfelker
parents:
12548
diff
changeset
|
484 //struct pullup_field *ff; |
7056d7cfcd02
just some debugging junk i'd like to have in there for now :)
rfelker
parents:
12548
diff
changeset
|
485 //for (i=0, ff=c->first; ff != f0; i++, ff=ff->next); |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
486 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
487 if (f0->flags & F_HAVE_BREAKS) return; |
13234
7056d7cfcd02
just some debugging junk i'd like to have in there for now :)
rfelker
parents:
12548
diff
changeset
|
488 //printf("\n%d: ", i); |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
489 f0->flags |= F_HAVE_BREAKS; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
490 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
491 /* Special case when fields are 100% identical */ |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
492 if (f0->buffer == f2->buffer && f1->buffer != f3->buffer) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
493 f2->breaks |= BREAK_RIGHT; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
494 return; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
495 } |
12548
8584fdad0188
old changes in my local tree i forgot to commit - minor fixes
rfelker
parents:
11641
diff
changeset
|
496 if (f0->buffer != f2->buffer && f1->buffer == f3->buffer) { |
8584fdad0188
old changes in my local tree i forgot to commit - minor fixes
rfelker
parents:
11641
diff
changeset
|
497 f1->breaks |= BREAK_LEFT; |
8584fdad0188
old changes in my local tree i forgot to commit - minor fixes
rfelker
parents:
11641
diff
changeset
|
498 return; |
8584fdad0188
old changes in my local tree i forgot to commit - minor fixes
rfelker
parents:
11641
diff
changeset
|
499 } |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
500 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
501 for (i = 0; i < c->metric_len; i++) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
502 l = f2->diffs[i] - f3->diffs[i]; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
503 if (l > max_l) max_l = l; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
504 if (-l > max_r) max_r = -l; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
505 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
506 /* Don't get tripped up when differences are mostly quant error */ |
13234
7056d7cfcd02
just some debugging junk i'd like to have in there for now :)
rfelker
parents:
12548
diff
changeset
|
507 //printf("%d %d\n", max_l, max_r); |
10738 | 508 if (max_l + max_r < 128) return; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
509 if (max_l > 4*max_r) f1->breaks |= BREAK_LEFT; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
510 if (max_r > 4*max_l) f2->breaks |= BREAK_RIGHT; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
511 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
512 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
513 static void compute_affinity(struct pullup_context *c, struct pullup_field *f) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
514 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
515 int i; |
11641 | 516 int max_l=0, max_r=0, l; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
517 if (f->flags & F_HAVE_AFFINITY) return; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
518 f->flags |= F_HAVE_AFFINITY; |
14951
12c44e82440a
improve handling of soft-telecined input (faster, fewer mistakes)
rfelker
parents:
14620
diff
changeset
|
519 if (f->buffer == f->next->next->buffer) { |
12c44e82440a
improve handling of soft-telecined input (faster, fewer mistakes)
rfelker
parents:
14620
diff
changeset
|
520 f->affinity = 1; |
12c44e82440a
improve handling of soft-telecined input (faster, fewer mistakes)
rfelker
parents:
14620
diff
changeset
|
521 f->next->affinity = 0; |
12c44e82440a
improve handling of soft-telecined input (faster, fewer mistakes)
rfelker
parents:
14620
diff
changeset
|
522 f->next->next->affinity = -1; |
12c44e82440a
improve handling of soft-telecined input (faster, fewer mistakes)
rfelker
parents:
14620
diff
changeset
|
523 f->next->flags |= F_HAVE_AFFINITY; |
12c44e82440a
improve handling of soft-telecined input (faster, fewer mistakes)
rfelker
parents:
14620
diff
changeset
|
524 f->next->next->flags |= F_HAVE_AFFINITY; |
12c44e82440a
improve handling of soft-telecined input (faster, fewer mistakes)
rfelker
parents:
14620
diff
changeset
|
525 return; |
12c44e82440a
improve handling of soft-telecined input (faster, fewer mistakes)
rfelker
parents:
14620
diff
changeset
|
526 } |
15721
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
527 if (1) { |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
528 for (i = 0; i < c->metric_len; i++) { |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
529 int lv = f->prev->var[i]; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
530 int rv = f->next->var[i]; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
531 int v = f->var[i]; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
532 int lc = f->comb[i] - (v+lv) + ABS(v-lv); |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
533 int rc = f->next->comb[i] - (v+rv) + ABS(v-rv); |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
534 lc = lc>0 ? lc : 0; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
535 rc = rc>0 ? rc : 0; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
536 l = lc - rc; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
537 if (l > max_l) max_l = l; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
538 if (-l > max_r) max_r = -l; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
539 } |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
540 if (max_l + max_r < 64) return; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
541 if (max_r > 6*max_l) f->affinity = -1; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
542 else if (max_l > 6*max_r) f->affinity = 1; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
543 } else { |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
544 for (i = 0; i < c->metric_len; i++) { |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
545 l = f->comb[i] - f->next->comb[i]; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
546 if (l > max_l) max_l = l; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
547 if (-l > max_r) max_r = -l; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
548 } |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
549 if (max_l + max_r < 64) return; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
550 if (max_r > 2*max_l) f->affinity = -1; |
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
551 else if (max_l > 2*max_r) f->affinity = 1; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
552 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
553 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
554 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
555 static void foo(struct pullup_context *c) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
556 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
557 struct pullup_field *f = c->first; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
558 int i, n = queue_length(f, c->last); |
10730
67449e5936f3
fix 10l (computation based on uninitialized data which led to
rfelker
parents:
10664
diff
changeset
|
559 for (i = 0; i < n-1; i++) { |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
560 if (i < n-3) compute_breaks(c, f); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
561 compute_affinity(c, f); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
562 f = f->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
563 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
564 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
565 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
566 static int decide_frame_length(struct pullup_context *c) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
567 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
568 struct pullup_field *f0 = c->first; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
569 struct pullup_field *f1 = f0->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
570 struct pullup_field *f2 = f1->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
571 struct pullup_field *f3 = f2->next; |
13235 | 572 int l; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
573 |
14973 | 574 if (queue_length(c->first, c->last) < 4) return 0; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
575 foo(c); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
576 |
10730
67449e5936f3
fix 10l (computation based on uninitialized data which led to
rfelker
parents:
10664
diff
changeset
|
577 if (f0->affinity == -1) return 1; |
67449e5936f3
fix 10l (computation based on uninitialized data which led to
rfelker
parents:
10664
diff
changeset
|
578 |
13235 | 579 l = find_first_break(f0, 3); |
580 if (l == 1 && c->strict_breaks < 0) l = 0; | |
581 | |
582 switch (l) { | |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
583 case 1: |
14969 | 584 if (c->strict_breaks < 1 && f0->affinity == 1 && f1->affinity == -1) |
11641 | 585 return 2; |
586 else return 1; | |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
587 case 2: |
11641 | 588 /* FIXME: strictly speaking, f0->prev is no longer valid... :) */ |
589 if (c->strict_pairs | |
590 && (f0->prev->breaks & BREAK_RIGHT) && (f2->breaks & BREAK_LEFT) | |
591 && (f0->affinity != 1 || f1->affinity != -1) ) | |
592 return 1; | |
10730
67449e5936f3
fix 10l (computation based on uninitialized data which led to
rfelker
parents:
10664
diff
changeset
|
593 if (f1->affinity == 1) return 1; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
594 else return 2; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
595 case 3: |
11641 | 596 if (f2->affinity == 1) return 2; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
597 else return 3; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
598 default: |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
599 /* 9 possibilities covered before switch */ |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
600 if (f1->affinity == 1) return 1; /* covers 6 */ |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
601 else if (f1->affinity == -1) return 2; /* covers 6 */ |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
602 else if (f2->affinity == -1) { /* covers 2 */ |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
603 if (f0->affinity == 1) return 3; |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
604 else return 1; |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
605 } |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
606 else return 2; /* the remaining 6 */ |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
607 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
608 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
609 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
610 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
611 static void print_aff_and_breaks(struct pullup_context *c, struct pullup_field *f) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
612 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
613 int i; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
614 int max_l, max_r, l; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
615 struct pullup_field *f0 = f; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
616 const char aff_l[] = "+..", aff_r[] = "..+"; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
617 printf("\naffinity: "); |
14973 | 618 for (i = 0; i < 4; i++) { |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
619 printf("%c%d%c", aff_l[1+f->affinity], i, aff_r[1+f->affinity]); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
620 f = f->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
621 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
622 f = f0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
623 printf("\nbreaks: "); |
14973 | 624 for (i=0; i<4; i++) { |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
625 printf("%c%d%c", f->breaks & BREAK_LEFT ? '|' : '.', i, f->breaks & BREAK_RIGHT ? '|' : '.'); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
626 f = f->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
627 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
628 printf("\n"); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
629 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
630 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
631 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
632 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
633 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
634 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
635 struct pullup_frame *pullup_get_frame(struct pullup_context *c) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
636 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
637 int i; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
638 struct pullup_frame *fr = c->frame; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
639 int n = decide_frame_length(c); |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
640 int aff = c->first->next->affinity; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
641 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
642 if (!n) return 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
643 if (fr->lock) return 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
644 |
10738 | 645 if (c->verbose) { |
646 print_aff_and_breaks(c, c->first); | |
647 printf("duration: %d \n", n); | |
648 } | |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
649 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
650 fr->lock++; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
651 fr->length = n; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
652 fr->parity = c->first->parity; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
653 fr->buffer = 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
654 for (i = 0; i < n; i++) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
655 /* We cheat and steal the buffer without release+relock */ |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
656 fr->ifields[i] = c->first->buffer; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
657 c->first->buffer = 0; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
658 c->first = c->first->next; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
659 } |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
660 |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
661 if (n == 1) { |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
662 fr->ofields[fr->parity] = fr->ifields[0]; |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
663 fr->ofields[fr->parity^1] = 0; |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
664 } else if (n == 2) { |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
665 fr->ofields[fr->parity] = fr->ifields[0]; |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
666 fr->ofields[fr->parity^1] = fr->ifields[1]; |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
667 } else if (n == 3) { |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
668 if (aff == 0) |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
669 aff = (fr->ifields[0] == fr->ifields[1]) ? -1 : 1; |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
670 /* else if (c->verbose) printf("forced aff: %d \n", aff); */ |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
671 fr->ofields[fr->parity] = fr->ifields[1+aff]; |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
672 fr->ofields[fr->parity^1] = fr->ifields[1]; |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
673 } |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
674 pullup_lock_buffer(fr->ofields[0], 0); |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
675 pullup_lock_buffer(fr->ofields[1], 1); |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
676 |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
677 if (fr->ofields[0] == fr->ofields[1]) { |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
678 fr->buffer = fr->ofields[0]; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
679 pullup_lock_buffer(fr->buffer, 2); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
680 return fr; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
681 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
682 return fr; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
683 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
684 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
685 static void copy_field(struct pullup_context *c, struct pullup_buffer *dest, |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
686 struct pullup_buffer *src, int parity) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
687 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
688 int i, j; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
689 unsigned char *d, *s; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
690 for (i = 0; i < c->nplanes; i++) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
691 s = src->planes[i] + parity*c->stride[i]; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
692 d = dest->planes[i] + parity*c->stride[i]; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
693 for (j = c->h[i]>>1; j; j--) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
694 memcpy(d, s, c->stride[i]); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
695 s += c->stride[i]<<1; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
696 d += c->stride[i]<<1; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
697 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
698 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
699 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
700 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
701 void pullup_pack_frame(struct pullup_context *c, struct pullup_frame *fr) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
702 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
703 int i; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
704 int par = fr->parity; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
705 if (fr->buffer) return; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
706 if (fr->length < 2) return; /* FIXME: deal with this */ |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
707 for (i = 0; i < 2; i++) |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
708 { |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
709 if (fr->ofields[i]->lock[i^1]) continue; |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
710 fr->buffer = fr->ofields[i]; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
711 pullup_lock_buffer(fr->buffer, 2); |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
712 copy_field(c, fr->buffer, fr->ofields[i^1], i^1); |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
713 return; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
714 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
715 fr->buffer = pullup_get_buffer(c, 2); |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
716 copy_field(c, fr->buffer, fr->ofields[0], 0); |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
717 copy_field(c, fr->buffer, fr->ofields[1], 1); |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
718 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
719 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
720 void pullup_release_frame(struct pullup_frame *fr) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
721 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
722 int i; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
723 for (i = 0; i < fr->length; i++) |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
724 pullup_release_buffer(fr->ifields[i], fr->parity ^ (i&1)); |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
725 pullup_release_buffer(fr->ofields[0], 0); |
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
726 pullup_release_buffer(fr->ofields[1], 1); |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
727 if (fr->buffer) pullup_release_buffer(fr->buffer, 2); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
728 fr->lock--; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
729 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
730 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
731 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
732 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
733 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
734 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
735 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
736 struct pullup_context *pullup_alloc_context() |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
737 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
738 struct pullup_context *c; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
739 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
740 c = calloc(1, sizeof(struct pullup_context)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
741 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
742 return c; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
743 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
744 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
745 void pullup_preinit_context(struct pullup_context *c) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
746 { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
747 c->bpp = calloc(c->nplanes, sizeof(int)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
748 c->w = calloc(c->nplanes, sizeof(int)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
749 c->h = calloc(c->nplanes, sizeof(int)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
750 c->stride = calloc(c->nplanes, sizeof(int)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
751 c->background = calloc(c->nplanes, sizeof(int)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
752 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
753 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
754 void pullup_init_context(struct pullup_context *c) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
755 { |
10956
fdcd0d571912
support for selecting which plane to use for metrics in the pullup
rfelker
parents:
10843
diff
changeset
|
756 int mp = c->metric_plane; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
757 if (c->nbuffers < 10) c->nbuffers = 10; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
758 c->buffers = calloc(c->nbuffers, sizeof (struct pullup_buffer)); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
759 |
15111 | 760 c->metric_w = (c->w[mp] - ((c->junk_left + c->junk_right) << 3)) >> 3; |
761 c->metric_h = (c->h[mp] - ((c->junk_top + c->junk_bottom) << 1)) >> 3; | |
10956
fdcd0d571912
support for selecting which plane to use for metrics in the pullup
rfelker
parents:
10843
diff
changeset
|
762 c->metric_offset = c->junk_left*c->bpp[mp] + (c->junk_top<<1)*c->stride[mp]; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
763 c->metric_len = c->metric_w * c->metric_h; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
764 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
765 c->head = make_field_queue(c, 8); |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
766 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
767 c->frame = calloc(1, sizeof (struct pullup_frame)); |
11628
6fc547235443
simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents:
11627
diff
changeset
|
768 c->frame->ifields = calloc(3, sizeof (struct pullup_buffer *)); |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
769 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
770 switch(c->format) { |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
771 case PULLUP_FMT_Y: |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
772 c->diff = diff_y; |
11626
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
773 c->comb = licomb_y; |
15721
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
774 c->var = var_y; |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13235
diff
changeset
|
775 #ifdef ARCH_X86 |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
776 #ifdef HAVE_MMX |
10747
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
777 if (c->cpu & PULLUP_CPU_MMX) { |
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
778 c->diff = diff_y_mmx; |
11626
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
779 c->comb = licomb_y_mmx; |
15721
eec6ace22741
small change to field-matching metrics which hopefully makes a big
rfelker
parents:
15111
diff
changeset
|
780 c->var = var_y_mmx; |
10747
cd4c523eaac4
more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents:
10741
diff
changeset
|
781 } |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
782 #endif |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13235
diff
changeset
|
783 #endif |
12548
8584fdad0188
old changes in my local tree i forgot to commit - minor fixes
rfelker
parents:
11641
diff
changeset
|
784 /* c->comb = qpcomb_y; */ |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
785 break; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
786 #if 0 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
787 case PULLUP_FMT_YUY2: |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
788 c->diff = diff_yuy2; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
789 break; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
790 case PULLUP_FMT_RGB32: |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
791 c->diff = diff_rgb32; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
792 break; |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
793 #endif |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
794 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
795 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
796 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
797 void pullup_free_context(struct pullup_context *c) |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
798 { |
10738 | 799 struct pullup_field *f; |
800 free(c->buffers); | |
801 f = c->head; | |
802 do { | |
803 free(f->diffs); | |
11626
168e540bad66
allow for different combing metrics to be selected (not useful yet)
rfelker
parents:
11625
diff
changeset
|
804 free(f->comb); |
10738 | 805 f = f->next; |
806 free(f->prev); | |
807 } while (f != c->head); | |
808 free(c->frame); | |
809 free(c); | |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
810 } |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
811 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
812 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
813 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
814 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
815 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
816 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
817 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
818 |
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff
changeset
|
819 |