annotate libmpcodecs/pullup.c @ 19283:f3866a8ed333

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