annotate libmpcodecs/pullup.c @ 13730:a45e901cc870

user selectable cutoff frequency simplify resampling factor if possible, so more then one resampler can be used, libaf will still die if there are too many like it does with the default resampler (2 with sampling rates which are relative prime are too many ...)
author michael
date Thu, 21 Oct 2004 21:15:21 +0000
parents 821f464b4d90
children f5e2fa7ec219
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
1
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
2
11412
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 10956
diff changeset
3 #include <stdio.h>
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
4 #include <stdlib.h>
11412
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 10956
diff changeset
5 #include <string.h>
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
6 #include "pullup.h"
10741
fec729835823 1000l, mmx code was not being used because of missing config.h, and
rfelker
parents: 10738
diff changeset
7 #include "config.h"
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
8
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
9
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
10
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 13235
diff changeset
11 #ifdef ARCH_X86
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
12 #ifdef HAVE_MMX
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
13 static int diff_y_mmx(unsigned char *a, unsigned char *b, int s)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
14 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
15 int ret;
10741
fec729835823 1000l, mmx code was not being used because of missing config.h, and
rfelker
parents: 10738
diff changeset
16 asm volatile (
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
17 "movl $4, %%ecx \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
18 "pxor %%mm4, %%mm4 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
19 "pxor %%mm7, %%mm7 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
20
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
21 ".balign 16 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
22 "1: \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
23
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
24 "movq (%%esi), %%mm0 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
25 "movq (%%esi), %%mm2 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
26 "addl %%eax, %%esi \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
27 "movq (%%edi), %%mm1 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
28 "addl %%eax, %%edi \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
29 "psubusb %%mm1, %%mm2 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
30 "psubusb %%mm0, %%mm1 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
31 "movq %%mm2, %%mm0 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
32 "movq %%mm1, %%mm3 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
33 "punpcklbw %%mm7, %%mm0 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
34 "punpcklbw %%mm7, %%mm1 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
35 "punpckhbw %%mm7, %%mm2 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
36 "punpckhbw %%mm7, %%mm3 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
37 "paddw %%mm0, %%mm4 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
38 "paddw %%mm1, %%mm4 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
39 "paddw %%mm2, %%mm4 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
40 "paddw %%mm3, %%mm4 \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
41
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
42 "decl %%ecx \n\t"
10741
fec729835823 1000l, mmx code was not being used because of missing config.h, and
rfelker
parents: 10738
diff changeset
43 "jnz 1b \n\t"
fec729835823 1000l, mmx code was not being used because of missing config.h, and
rfelker
parents: 10738
diff changeset
44
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
45 "movq %%mm4, %%mm3 \n\t"
10741
fec729835823 1000l, mmx code was not being used because of missing config.h, and
rfelker
parents: 10738
diff changeset
46 "punpcklwd %%mm7, %%mm4 \n\t"
fec729835823 1000l, mmx code was not being used because of missing config.h, and
rfelker
parents: 10738
diff changeset
47 "punpckhwd %%mm7, %%mm3 \n\t"
fec729835823 1000l, mmx code was not being used because of missing config.h, and
rfelker
parents: 10738
diff changeset
48 "paddd %%mm4, %%mm3 \n\t"
fec729835823 1000l, mmx code was not being used because of missing config.h, and
rfelker
parents: 10738
diff changeset
49 "movd %%mm3, %%eax \n\t"
fec729835823 1000l, mmx code was not being used because of missing config.h, and
rfelker
parents: 10738
diff changeset
50 "psrlq $32, %%mm3 \n\t"
10747
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
51 "movd %%mm3, %%edx \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
52 "addl %%edx, %%eax \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
53 "emms \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
54 : "=a" (ret)
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
55 : "S" (a), "D" (b), "a" (s)
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
56 : "%edx"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
57 );
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
58 return ret;
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
59 }
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
60
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
61 static int licomb_y_mmx(unsigned char *a, unsigned char *b, int s)
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
62 {
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
63 int ret;
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
64 asm volatile (
11624
03e8cbee7333 100l bug found by Zoli, wasted time and unfairly delocalized the metrics
rfelker
parents: 11412
diff changeset
65 "movl $4, %%ecx \n\t"
10747
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
66 "pxor %%mm6, %%mm6 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
67 "pxor %%mm7, %%mm7 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
68 "subl %%eax, %%edi \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
69
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
70 ".balign 16 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
71 "2: \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
72
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
73 "movq (%%esi), %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
74 "movq (%%edi), %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
75 "punpcklbw %%mm7, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
76 "movq (%%edi,%%eax), %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
77 "punpcklbw %%mm7, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
78 "punpcklbw %%mm7, %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
79 "paddw %%mm0, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
80 "paddw %%mm2, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
81 "movq %%mm0, %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
82 "psubusw %%mm1, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
83 "psubusw %%mm2, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
84 "paddw %%mm0, %%mm6 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
85 "paddw %%mm1, %%mm6 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
86
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
87 "movq (%%esi), %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
88 "movq (%%edi), %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
89 "punpckhbw %%mm7, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
90 "movq (%%edi,%%eax), %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
91 "punpckhbw %%mm7, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
92 "punpckhbw %%mm7, %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
93 "paddw %%mm0, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
94 "paddw %%mm2, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
95 "movq %%mm0, %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
96 "psubusw %%mm1, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
97 "psubusw %%mm2, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
98 "paddw %%mm0, %%mm6 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
99 "paddw %%mm1, %%mm6 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
100
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
101 "movq (%%edi,%%eax), %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
102 "movq (%%esi), %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
103 "punpcklbw %%mm7, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
104 "movq (%%esi,%%eax), %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
105 "punpcklbw %%mm7, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
106 "punpcklbw %%mm7, %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
107 "paddw %%mm0, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
108 "paddw %%mm2, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
109 "movq %%mm0, %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
110 "psubusw %%mm1, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
111 "psubusw %%mm2, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
112 "paddw %%mm0, %%mm6 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
113 "paddw %%mm1, %%mm6 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
114
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
115 "movq (%%edi,%%eax), %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
116 "movq (%%esi), %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
117 "punpckhbw %%mm7, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
118 "movq (%%esi,%%eax), %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
119 "punpckhbw %%mm7, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
120 "punpckhbw %%mm7, %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
121 "paddw %%mm0, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
122 "paddw %%mm2, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
123 "movq %%mm0, %%mm2 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
124 "psubusw %%mm1, %%mm0 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
125 "psubusw %%mm2, %%mm1 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
126 "paddw %%mm0, %%mm6 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
127 "paddw %%mm1, %%mm6 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
128
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
129 "addl %%eax, %%esi \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
130 "addl %%eax, %%edi \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
131 "decl %%ecx \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
132 "jnz 2b \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
133
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
134 "movq %%mm6, %%mm5 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
135 "punpcklwd %%mm7, %%mm6 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
136 "punpckhwd %%mm7, %%mm5 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
137 "paddd %%mm6, %%mm5 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
138 "movd %%mm5, %%eax \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
139 "psrlq $32, %%mm5 \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
140 "movd %%mm5, %%edx \n\t"
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
141 "addl %%edx, %%eax \n\t"
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
142
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
143 "emms \n\t"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
144 : "=a" (ret)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
145 : "S" (a), "D" (b), "a" (s)
10747
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
146 : "%edx"
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
147 );
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
148 return ret;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
149 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
150 #endif
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 13235
diff changeset
151 #endif
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
152
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
153 #define ABS(a) (((a)^((a)>>31))-((a)>>31))
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
154
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
155 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
156 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
157 int i, j, diff=0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
158 for (i=4; i; i--) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
159 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
160 a+=s; b+=s;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
161 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
162 return diff;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
163 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
164
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
165 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
166 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
167 int i, j, diff=0;
11624
03e8cbee7333 100l bug found by Zoli, wasted time and unfairly delocalized the metrics
rfelker
parents: 11412
diff changeset
168 for (i=4; i; i--) {
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
169 for (j=0; j<8; j++)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
170 diff += ABS((a[j]<<1) - b[j-s] - b[j])
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
171 + ABS((b[j]<<1) - a[j] - a[j+s]);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
172 a+=s; b+=s;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
173 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
174 return diff;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
175 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
176
11626
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
177 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
178 {
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
179 int i, j, diff=0;
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
180 for (i=4; i; i--) {
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
181 for (j=0; j<8; j++)
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
182 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
183 a+=s; b+=s;
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
184 }
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
185 return diff;
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
186 }
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
187
10843
60f58eadd666 10l, debug code broke compile with mmx disabled
rfelker
parents: 10747
diff changeset
188 #if 0
10747
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
189 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
190 {
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
191 int c = licomb_y(a,b,s);
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
192 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
193 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
194 return m;
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
195 }
10843
60f58eadd666 10l, debug code broke compile with mmx disabled
rfelker
parents: 10747
diff changeset
196 #endif
10747
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
197
10664
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
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
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
202
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
203
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
204
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 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
207 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
208 int i;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
209 if (b->planes) return;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
210 b->planes = calloc(c->nplanes, sizeof(unsigned char *));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
211 for (i = 0; i < c->nplanes; i++) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
212 b->planes[i] = malloc(c->h[i]*c->stride[i]);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
213 /* Deal with idiotic 128=0 for chroma: */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
214 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
215 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
216 }
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 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
219 {
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
220 if (!b) return 0;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
221 if (parity+1 & 1) b->lock[0]++;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
222 if (parity+1 & 2) b->lock[1]++;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
223 return b;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
224 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
225
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
226 void pullup_release_buffer(struct pullup_buffer *b, int parity)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
227 {
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
228 if (!b) return;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
229 if (parity+1 & 1) b->lock[0]--;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
230 if (parity+1 & 2) b->lock[1]--;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
231 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
232
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
233 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
234 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
235 int i;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
236
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
237 /* Try first to get the sister buffer for the previous field */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
238 if (parity < 2 && c->last && parity != c->last->parity
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
239 && !c->last->buffer->lock[parity]) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
240 alloc_buffer(c, c->last->buffer);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
241 return pullup_lock_buffer(c->last->buffer, parity);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
242 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
243
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
244 /* Prefer a buffer with both fields open */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
245 for (i = 0; i < c->nbuffers; i++) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
246 if (c->buffers[i].lock[0]) continue;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
247 if (c->buffers[i].lock[1]) continue;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
248 alloc_buffer(c, &c->buffers[i]);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
249 return pullup_lock_buffer(&c->buffers[i], parity);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
250 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
251
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
252 if (parity == 2) return 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
253
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
254 /* Search for any half-free buffer */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
255 for (i = 0; i < c->nbuffers; i++) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
256 if (parity+1 & 1 && c->buffers[i].lock[0]) continue;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
257 if (parity+1 & 2 && c->buffers[i].lock[1]) continue;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
258 alloc_buffer(c, &c->buffers[i]);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
259 return pullup_lock_buffer(&c->buffers[i], parity);
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 return 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
263 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
264
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
265
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
266
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
267
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
268
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
269
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
270 static void compute_metric(struct pullup_context *c,
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
271 struct pullup_field *fa, int pa,
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
272 struct pullup_field *fb, int pb,
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
273 int (*func)(unsigned char *, unsigned char *, int), int *dest)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
274 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
275 unsigned char *a, *b;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
276 int x, y;
10956
fdcd0d571912 support for selecting which plane to use for metrics in the pullup
rfelker
parents: 10843
diff changeset
277 int mp = c->metric_plane;
fdcd0d571912 support for selecting which plane to use for metrics in the pullup
rfelker
parents: 10843
diff changeset
278 int xstep = c->bpp[mp];
fdcd0d571912 support for selecting which plane to use for metrics in the pullup
rfelker
parents: 10843
diff changeset
279 int ystep = c->stride[mp]<<3;
fdcd0d571912 support for selecting which plane to use for metrics in the pullup
rfelker
parents: 10843
diff changeset
280 int s = c->stride[mp]<<1; /* field stride */
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
281 int w = c->metric_w*xstep;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
282
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
283 if (!fa->buffer || !fb->buffer) return;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
284
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
285 /* Shortcut for duplicate fields (e.g. from RFF flag) */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
286 if (fa->buffer == fb->buffer && pa == pb) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
287 memset(dest, 0, c->metric_len * sizeof(int));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
288 return;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
289 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
290
10956
fdcd0d571912 support for selecting which plane to use for metrics in the pullup
rfelker
parents: 10843
diff changeset
291 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
292 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
293
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
294 for (y = c->metric_h; y; y--) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
295 for (x = 0; x < w; x += xstep) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
296 *dest++ = func(a + x, b + x, s);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
297 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
298 a += ystep; b += ystep;
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 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
301
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
302
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
303
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
304
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
305
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
306 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
307 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
308 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
309 f->comb = calloc(c->metric_len, sizeof(int));
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
310 /* add more metrics here as needed */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
311 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
312
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
313 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
314 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
315 struct pullup_field *head, *f;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
316 f = head = calloc(1, sizeof(struct pullup_field));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
317 alloc_metrics(c, f);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
318 for (; len > 0; len--) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
319 f->next = calloc(1, sizeof(struct pullup_field));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
320 f->next->prev = f;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
321 f = f->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
322 alloc_metrics(c, f);
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 f->next = head;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
325 head->prev = f;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
326 return head;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
327 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
328
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
329 static void check_field_queue(struct pullup_context *c)
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 if (c->head->next == c->first) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
332 struct pullup_field *f = calloc(1, sizeof(struct pullup_field));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
333 alloc_metrics(c, f);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
334 f->prev = c->head;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
335 f->next = c->first;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
336 c->head->next = f;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
337 c->first->prev = f;
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 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
340
11412
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 10956
diff changeset
341 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
342 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
343 struct pullup_field *f;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
344
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
345 /* Grow the circular list if needed */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
346 check_field_queue(c);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
347
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
348 /* 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
349 if (c->last && c->last->parity == parity) return;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
350
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
351 f = c->head;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
352 f->parity = parity;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
353 f->buffer = pullup_lock_buffer(b, parity);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
354 f->flags = 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
355 f->breaks = 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
356 f->affinity = 0;
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 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
359 compute_metric(c, parity?f->prev:f, 0, parity?f:f->prev, 1, c->comb, f->comb);
10664
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 /* Advance the circular list */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
362 if (!c->first) c->first = c->head;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
363 c->last = c->head;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
364 c->head = c->head->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
365 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
366
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
367 void pullup_flush_fields(struct pullup_context *c)
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 struct pullup_field *f;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
370
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
371 for (f = c->first; f && f != c->head; f = f->next) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
372 pullup_release_buffer(f->buffer, f->parity);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
373 f->buffer = 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
374 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
375 c->first = c->last = 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
376 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
377
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
378
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
379
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
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
382
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
383
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
384
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
385 #define F_HAVE_BREAKS 1
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
386 #define F_HAVE_AFFINITY 2
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
387
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
388
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
389 #define BREAK_LEFT 1
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
390 #define BREAK_RIGHT 2
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
391
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
392
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
393
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
394
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
395 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
396 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
397 int count = 1;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
398 struct pullup_field *f;
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 if (!begin || !end) return 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
401 for (f = begin; f != end; f = f->next) count++;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
402 return count;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
403 }
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 static int find_first_break(struct pullup_field *f, int max)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
406 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
407 int i;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
408 for (i = 0; i < max; i++) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
409 if (f->breaks & BREAK_RIGHT || f->next->breaks & BREAK_LEFT)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
410 return i+1;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
411 f = f->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
412 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
413 return 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
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
416 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
417 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
418 int i;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
419 struct pullup_field *f1 = f0->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
420 struct pullup_field *f2 = f1->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
421 struct pullup_field *f3 = f2->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
422 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
423 //struct pullup_field *ff;
7056d7cfcd02 just some debugging junk i'd like to have in there for now :)
rfelker
parents: 12548
diff changeset
424 //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
425
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
426 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
427 //printf("\n%d: ", i);
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
428 f0->flags |= F_HAVE_BREAKS;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
429
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
430 /* Special case when fields are 100% identical */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
431 if (f0->buffer == f2->buffer && f1->buffer != f3->buffer) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
432 f2->breaks |= BREAK_RIGHT;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
433 return;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
434 }
12548
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11641
diff changeset
435 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
436 f1->breaks |= BREAK_LEFT;
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11641
diff changeset
437 return;
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11641
diff changeset
438 }
10664
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 for (i = 0; i < c->metric_len; i++) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
441 l = f2->diffs[i] - f3->diffs[i];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
442 if (l > max_l) max_l = l;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
443 if (-l > max_r) max_r = -l;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
444 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
445 /* 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
446 //printf("%d %d\n", max_l, max_r);
10738
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
447 if (max_l + max_r < 128) return;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
448 if (max_l > 4*max_r) f1->breaks |= BREAK_LEFT;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
449 if (max_r > 4*max_l) f2->breaks |= BREAK_RIGHT;
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 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
453 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
454 int i;
11641
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
455 int max_l=0, max_r=0, l;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
456 if (f->flags & F_HAVE_AFFINITY) return;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
457 f->flags |= F_HAVE_AFFINITY;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
458 for (i = 0; i < c->metric_len; i++) {
11626
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
459 l = f->comb[i] - f->next->comb[i];
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
460 if (l > max_l) max_l = l;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
461 if (-l > max_r) max_r = -l;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
462 }
11631
c7d65edff534 fixing more stupid mistakes
rfelker
parents: 11628
diff changeset
463 if (max_l + max_r < 64) return;
10738
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
464 if (max_r > 2*max_l) f->affinity = -1;
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
465 else if (max_l > 2*max_r) f->affinity = 1;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
466 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
467
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
468 static void foo(struct pullup_context *c)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
469 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
470 struct pullup_field *f = c->first;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
471 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
472 for (i = 0; i < n-1; i++) {
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
473 if (i < n-3) compute_breaks(c, f);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
474 compute_affinity(c, f);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
475 f = f->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
476 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
477 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
478
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
479 static int decide_frame_length(struct pullup_context *c)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
480 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
481 struct pullup_field *f0 = c->first;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
482 struct pullup_field *f1 = f0->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
483 struct pullup_field *f2 = f1->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
484 struct pullup_field *f3 = f2->next;
13235
bc7cb8cf36b2 strictness level -1 to 'almost' ignore breaks
rfelker
parents: 13234
diff changeset
485 int l;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
486
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
487 if (queue_length(c->first, c->last) < 6) return 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
488 foo(c);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
489
10730
67449e5936f3 fix 10l (computation based on uninitialized data which led to
rfelker
parents: 10664
diff changeset
490 if (f0->affinity == -1) return 1;
67449e5936f3 fix 10l (computation based on uninitialized data which led to
rfelker
parents: 10664
diff changeset
491
13235
bc7cb8cf36b2 strictness level -1 to 'almost' ignore breaks
rfelker
parents: 13234
diff changeset
492 l = find_first_break(f0, 3);
bc7cb8cf36b2 strictness level -1 to 'almost' ignore breaks
rfelker
parents: 13234
diff changeset
493 if (l == 1 && c->strict_breaks < 0) l = 0;
bc7cb8cf36b2 strictness level -1 to 'almost' ignore breaks
rfelker
parents: 13234
diff changeset
494
bc7cb8cf36b2 strictness level -1 to 'almost' ignore breaks
rfelker
parents: 13234
diff changeset
495 switch (l) {
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
496 case 1:
13235
bc7cb8cf36b2 strictness level -1 to 'almost' ignore breaks
rfelker
parents: 13234
diff changeset
497 if (c->strict_breaks > 0 && f0->affinity == 1 && f1->affinity == -1)
11641
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
498 return 2;
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
499 else return 1;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
500 case 2:
11641
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
501 /* FIXME: strictly speaking, f0->prev is no longer valid... :) */
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
502 if (c->strict_pairs
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
503 && (f0->prev->breaks & BREAK_RIGHT) && (f2->breaks & BREAK_LEFT)
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
504 && (f0->affinity != 1 || f1->affinity != -1) )
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
505 return 1;
10730
67449e5936f3 fix 10l (computation based on uninitialized data which led to
rfelker
parents: 10664
diff changeset
506 if (f1->affinity == 1) return 1;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
507 else return 2;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
508 case 3:
11641
b7c269232edd various updates:
rfelker
parents: 11631
diff changeset
509 if (f2->affinity == 1) return 2;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
510 else return 3;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
511 default:
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
512 /* 9 possibilities covered before switch */
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
513 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
514 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
515 else if (f2->affinity == -1) { /* covers 2 */
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
516 if (f0->affinity == 1) return 3;
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
517 else return 1;
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
518 }
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
519 else return 2; /* the remaining 6 */
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
520 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
521 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
522
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
523
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
524 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
525 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
526 int i;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
527 int max_l, max_r, l;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
528 struct pullup_field *f0 = f;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
529 const char aff_l[] = "+..", aff_r[] = "..+";
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
530 printf("\naffinity: ");
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
531 for (i = 0; i < 6; i++) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
532 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
533 f = f->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
534 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
535 f = f0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
536 printf("\nbreaks: ");
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
537 for (i=0; i<6; i++) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
538 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
539 f = f->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
540 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
541 printf("\n");
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
542 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
543
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
544
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
545
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
546
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
547
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
548 struct pullup_frame *pullup_get_frame(struct pullup_context *c)
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 int i;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
551 struct pullup_frame *fr = c->frame;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
552 int n = decide_frame_length(c);
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
553 int aff = c->first->next->affinity;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
554
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
555 if (!n) return 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
556 if (fr->lock) return 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
557
10738
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
558 if (c->verbose) {
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
559 print_aff_and_breaks(c, c->first);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
560 printf("duration: %d \n", n);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
561 }
10664
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 fr->lock++;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
564 fr->length = n;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
565 fr->parity = c->first->parity;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
566 fr->buffer = 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
567 for (i = 0; i < n; i++) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
568 /* 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
569 fr->ifields[i] = c->first->buffer;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
570 c->first->buffer = 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
571 c->first = c->first->next;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
572 }
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
573
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
574 if (n == 1) {
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
575 fr->ofields[fr->parity] = fr->ifields[0];
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
576 fr->ofields[fr->parity^1] = 0;
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
577 } else if (n == 2) {
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
578 fr->ofields[fr->parity] = fr->ifields[0];
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
579 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
580 } else if (n == 3) {
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
581 if (aff == 0)
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
582 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
583 /* 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
584 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
585 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
586 }
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
587 pullup_lock_buffer(fr->ofields[0], 0);
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
588 pullup_lock_buffer(fr->ofields[1], 1);
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
589
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
590 if (fr->ofields[0] == fr->ofields[1]) {
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
591 fr->buffer = fr->ofields[0];
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
592 pullup_lock_buffer(fr->buffer, 2);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
593 return fr;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
594 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
595 return fr;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
596 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
597
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
598 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
599 struct pullup_buffer *src, int parity)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
600 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
601 int i, j;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
602 unsigned char *d, *s;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
603 for (i = 0; i < c->nplanes; i++) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
604 s = src->planes[i] + parity*c->stride[i];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
605 d = dest->planes[i] + parity*c->stride[i];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
606 for (j = c->h[i]>>1; j; j--) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
607 memcpy(d, s, c->stride[i]);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
608 s += c->stride[i]<<1;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
609 d += c->stride[i]<<1;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
610 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
611 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
612 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
613
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
614 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
615 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
616 int i;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
617 int par = fr->parity;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
618 if (fr->buffer) return;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
619 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
620 for (i = 0; i < 2; i++)
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
621 {
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
622 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
623 fr->buffer = fr->ofields[i];
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
624 pullup_lock_buffer(fr->buffer, 2);
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
625 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
626 return;
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 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
629 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
630 copy_field(c, fr->buffer, fr->ofields[1], 1);
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
631 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
632
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
633 void pullup_release_frame(struct pullup_frame *fr)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
634 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
635 int i;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
636 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
637 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
638 pullup_release_buffer(fr->ofields[0], 0);
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 11627
diff changeset
639 pullup_release_buffer(fr->ofields[1], 1);
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
640 if (fr->buffer) pullup_release_buffer(fr->buffer, 2);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
641 fr->lock--;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
642 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
643
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
644
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
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
647
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
648
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
649 struct pullup_context *pullup_alloc_context()
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
650 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
651 struct pullup_context *c;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
652
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
653 c = calloc(1, sizeof(struct pullup_context));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
654
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
655 return c;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
656 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
657
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
658 void pullup_preinit_context(struct pullup_context *c)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
659 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
660 c->bpp = calloc(c->nplanes, sizeof(int));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
661 c->w = calloc(c->nplanes, sizeof(int));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
662 c->h = calloc(c->nplanes, sizeof(int));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
663 c->stride = calloc(c->nplanes, sizeof(int));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
664 c->background = calloc(c->nplanes, sizeof(int));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
665 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
666
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
667 void pullup_init_context(struct pullup_context *c)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
668 {
10956
fdcd0d571912 support for selecting which plane to use for metrics in the pullup
rfelker
parents: 10843
diff changeset
669 int mp = c->metric_plane;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
670 if (c->nbuffers < 10) c->nbuffers = 10;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
671 c->buffers = calloc(c->nbuffers, sizeof (struct pullup_buffer));
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
672
10956
fdcd0d571912 support for selecting which plane to use for metrics in the pullup
rfelker
parents: 10843
diff changeset
673 c->metric_w = (c->w[mp] - (c->junk_left + c->junk_right << 3)) >> 3;
fdcd0d571912 support for selecting which plane to use for metrics in the pullup
rfelker
parents: 10843
diff changeset
674 c->metric_h = (c->h[mp] - (c->junk_top + c->junk_bottom << 1)) >> 3;
fdcd0d571912 support for selecting which plane to use for metrics in the pullup
rfelker
parents: 10843
diff changeset
675 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
676 c->metric_len = c->metric_w * c->metric_h;
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 c->head = make_field_queue(c, 8);
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 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
681 c->frame->ifields = calloc(3, sizeof (struct pullup_buffer *));
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
682
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
683 switch(c->format) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
684 case PULLUP_FMT_Y:
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
685 c->diff = diff_y;
11626
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
686 c->comb = licomb_y;
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 13235
diff changeset
687 #ifdef ARCH_X86
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
688 #ifdef HAVE_MMX
10747
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
689 if (c->cpu & PULLUP_CPU_MMX) {
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
690 c->diff = diff_y_mmx;
11626
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
691 c->comb = licomb_y_mmx;
10747
cd4c523eaac4 more mmx and fix 100l sig11 in the previous mmx commit
rfelker
parents: 10741
diff changeset
692 }
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
693 #endif
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 13235
diff changeset
694 #endif
12548
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11641
diff changeset
695 /* c->comb = qpcomb_y; */
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
696 break;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
697 #if 0
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
698 case PULLUP_FMT_YUY2:
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
699 c->diff = diff_yuy2;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
700 break;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
701 case PULLUP_FMT_RGB32:
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
702 c->diff = diff_rgb32;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
703 break;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
704 #endif
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
705 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
706 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
707
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
708 void pullup_free_context(struct pullup_context *c)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
709 {
10738
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
710 struct pullup_field *f;
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
711 free(c->buffers);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
712 f = c->head;
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
713 do {
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
714 free(f->diffs);
11626
168e540bad66 allow for different combing metrics to be selected (not useful yet)
rfelker
parents: 11625
diff changeset
715 free(f->comb);
10738
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
716 f = f->next;
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
717 free(f->prev);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
718 } while (f != c->head);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
719 free(c->frame);
b6b68224033d tweaks and cleanup
rfelker
parents: 10737
diff changeset
720 free(c);
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
721 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
722
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
723
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