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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 10956
diff changeset
3 #include <stdio.h>
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
4 #include <stdlib.h>
11412
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 10956
diff changeset
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
b9a05a395726 added ecx to clobber list
alex
parents: 14619
diff changeset
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
b9a05a395726 added ecx to clobber list
alex
parents: 14619
diff changeset
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
60f58eadd666 10l, debug code broke compile with mmx disabled
rfelker
parents: 10747
diff changeset
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
60f58eadd666 10l, debug code broke compile with mmx disabled
rfelker
parents: 10747
diff changeset
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
f5e2fa7ec219 adding proper parenthesing
alex
parents: 13720
diff changeset
280 if ((parity+1) & 1) b->lock[0]++;
f5e2fa7ec219 adding proper parenthesing
alex
parents: 13720
diff changeset
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
f5e2fa7ec219 adding proper parenthesing
alex
parents: 13720
diff changeset
288 if ((parity+1) & 1) b->lock[0]--;
f5e2fa7ec219 adding proper parenthesing
alex
parents: 13720
diff changeset
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
f5e2fa7ec219 adding proper parenthesing
alex
parents: 13720
diff changeset
315 if (((parity+1) & 1) && c->buffers[i].lock[0]) continue;
f5e2fa7ec219 adding proper parenthesing
alex
parents: 13720
diff changeset
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
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 10956
diff changeset
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
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 10956
diff changeset
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
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
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
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
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
bc7cb8cf36b2 strictness level -1 to 'almost' ignore breaks
rfelker
parents: 13234
diff changeset
572 int l;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
573
14973
08002417b7e4 don't buffer more future context that we need
rfelker
parents: 14969
diff changeset
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
bc7cb8cf36b2 strictness level -1 to 'almost' ignore breaks
rfelker
parents: 13234
diff changeset
579 l = find_first_break(f0, 3);
bc7cb8cf36b2 strictness level -1 to 'almost' ignore breaks
rfelker
parents: 13234
diff changeset
580 if (l == 1 && c->strict_breaks < 0) l = 0;
bc7cb8cf36b2 strictness level -1 to 'almost' ignore breaks
rfelker
parents: 13234
diff changeset
581
bc7cb8cf36b2 strictness level -1 to 'almost' ignore breaks
rfelker
parents: 13234
diff changeset
582 switch (l) {
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
583 case 1:
14969
e6ba8d3ba040 100l, meaning of strict_breaks was backwards...
rfelker
parents: 14951
diff changeset
584 if (c->strict_breaks < 1 && f0->affinity == 1 && f1->affinity == -1)
11641
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
585 return 2;
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
586 else return 1;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
587 case 2:
11641
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
588 /* FIXME: strictly speaking, f0->prev is no longer valid... :) */
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
589 if (c->strict_pairs
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
590 && (f0->prev->breaks & BREAK_RIGHT) && (f2->breaks & BREAK_LEFT)
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
591 && (f0->affinity != 1 || f1->affinity != -1) )
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
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
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
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
08002417b7e4 don't buffer more future context that we need
rfelker
parents: 14969
diff changeset
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
08002417b7e4 don't buffer more future context that we need
rfelker
parents: 14969
diff changeset
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
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
645 if (c->verbose) {
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
646 print_aff_and_breaks(c, c->first);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
647 printf("duration: %d \n", n);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
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
678f6aeb6754 silence gcc warning:
rathann
parents: 14973
diff changeset
760 c->metric_w = (c->w[mp] - ((c->junk_left + c->junk_right) << 3)) >> 3;
678f6aeb6754 silence gcc warning:
rathann
parents: 14973
diff changeset
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
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
799 struct pullup_field *f;
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
800 free(c->buffers);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
801 f = c->head;
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
802 do {
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
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
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
805 f = f->next;
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
806 free(f->prev);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
807 } while (f != c->head);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
808 free(c->frame);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
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