annotate libmpcodecs/vf_ivtc.c @ 32282:606e4157cd4c

Split alloc and init of context so that parameters can be set in the context instead of requireing being passed through function parameters. This also makes sws work with AVOptions.
author michael
date Sun, 26 Sep 2010 19:33:57 +0000
parents a972c1a4a012
children 7af3e6f901fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30421
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
1 /*
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
2 * This file is part of MPlayer.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
3 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
5 * it under the terms of the GNU General Public License as published by
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
7 * (at your option) any later version.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
8 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
12 * GNU General Public License for more details.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
13 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
14 * You should have received a copy of the GNU General Public License along
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
17 */
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29639
diff changeset
18
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
19 #include <stdio.h>
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
20 #include <stdlib.h>
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
21 #include <string.h>
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
22
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
23 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
24 #include "mp_msg.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
25 #include "cpudetect.h"
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
26
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
27 #include "img_format.h"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
28 #include "mp_image.h"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
29 #include "vf.h"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
30
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
31 #include "libvo/fastmemcpy.h"
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
32
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
33
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
34 struct metrics {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
35 /* difference: total, even lines, odd lines */
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
36 int d, e, o;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
37 /* noise: temporal, spacial (current), spacial (past) */
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
38 int t, s, p;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
39 };
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
40
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
41 struct frameinfo {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
42 /* peak, relative, mean */
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
43 struct metrics p, r, m;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
44 };
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
45
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
46 struct vf_priv_s {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
47 struct frameinfo fi[2];
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
48 mp_image_t *dmpi;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
49 int first;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
50 int drop, lastdrop, dropnext;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
51 int inframes, outframes;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
52 };
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
53
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
54 enum {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
55 F_DROP,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
56 F_MERGE,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
57 F_NEXT,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
58 F_SHOW
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
59 };
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
60
29639
26a355ffe458 Add several HAVE_EBX_AVAILABLE conditions where necessary
reimar
parents: 29263
diff changeset
61 #if HAVE_MMX && HAVE_EBX_AVAILABLE
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
62 static void block_diffs_MMX(struct metrics *m, unsigned char *old, unsigned char *new, int os, int ns)
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
63 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
64 int i;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
65 short out[24]; // output buffer for the partial metrics from the mmx code
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
66
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25221
diff changeset
67 __asm__ (
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
68 "movl $4, %%ecx \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
69 "pxor %%mm4, %%mm4 \n\t" // 4 even difference sums
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
70 "pxor %%mm5, %%mm5 \n\t" // 4 odd difference sums
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
71 "pxor %%mm7, %%mm7 \n\t" // all zeros
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
72
19372
6334c14b38eb Replace asmalign.h hack by ASMALIGN cpp macros from config.h.
diego
parents: 18104
diff changeset
73 ASMALIGN(4)
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
74 "1: \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
75
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
76 // Even difference
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
77 "movq (%%"REG_S"), %%mm0 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
78 "movq (%%"REG_S"), %%mm2 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
79 "add %%"REG_a", %%"REG_S" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
80 "movq (%%"REG_D"), %%mm1 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
81 "add %%"REG_b", %%"REG_D" \n\t"
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
82 "psubusb %%mm1, %%mm2 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
83 "psubusb %%mm0, %%mm1 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
84 "movq %%mm2, %%mm0 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
85 "movq %%mm1, %%mm3 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
86 "punpcklbw %%mm7, %%mm0 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
87 "punpcklbw %%mm7, %%mm1 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
88 "punpckhbw %%mm7, %%mm2 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
89 "punpckhbw %%mm7, %%mm3 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
90 "paddw %%mm0, %%mm4 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
91 "paddw %%mm1, %%mm4 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
92 "paddw %%mm2, %%mm4 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
93 "paddw %%mm3, %%mm4 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
94
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
95 // Odd difference
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
96 "movq (%%"REG_S"), %%mm0 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
97 "movq (%%"REG_S"), %%mm2 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
98 "add %%"REG_a", %%"REG_S" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
99 "movq (%%"REG_D"), %%mm1 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
100 "add %%"REG_b", %%"REG_D" \n\t"
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
101 "psubusb %%mm1, %%mm2 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
102 "psubusb %%mm0, %%mm1 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
103 "movq %%mm2, %%mm0 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
104 "movq %%mm1, %%mm3 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
105 "punpcklbw %%mm7, %%mm0 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
106 "punpcklbw %%mm7, %%mm1 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
107 "punpckhbw %%mm7, %%mm2 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
108 "punpckhbw %%mm7, %%mm3 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
109 "paddw %%mm0, %%mm5 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
110 "paddw %%mm1, %%mm5 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
111 "paddw %%mm2, %%mm5 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
112 "paddw %%mm3, %%mm5 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
113
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
114 "decl %%ecx \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
115 "jnz 1b \n\t"
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
116 "movq %%mm4, (%%"REG_d") \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
117 "movq %%mm5, 8(%%"REG_d") \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
118 :
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
119 : "S" (old), "D" (new), "a" (os), "b" (ns), "d" (out)
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
120 : "memory"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
121 );
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
122 m->e = out[0]+out[1]+out[2]+out[3];
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
123 m->o = out[4]+out[5]+out[6]+out[7];
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
124 m->d = m->e + m->o;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
125
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25221
diff changeset
126 __asm__ (
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
127 // First loop to measure first four columns
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
128 "movl $4, %%ecx \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
129 "pxor %%mm4, %%mm4 \n\t" // Past spacial noise
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
130 "pxor %%mm5, %%mm5 \n\t" // Temporal noise
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
131 "pxor %%mm6, %%mm6 \n\t" // Current spacial noise
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
132
19372
6334c14b38eb Replace asmalign.h hack by ASMALIGN cpp macros from config.h.
diego
parents: 18104
diff changeset
133 ASMALIGN(4)
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
134 "2: \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
135
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
136 "movq (%%"REG_S"), %%mm0 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
137 "movq (%%"REG_S",%%"REG_a"), %%mm1 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
138 "add %%"REG_a", %%"REG_S" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
139 "add %%"REG_a", %%"REG_S" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
140 "movq (%%"REG_D"), %%mm2 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
141 "movq (%%"REG_D",%%"REG_b"), %%mm3 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
142 "add %%"REG_b", %%"REG_D" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
143 "add %%"REG_b", %%"REG_D" \n\t"
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
144 "punpcklbw %%mm7, %%mm0 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
145 "punpcklbw %%mm7, %%mm1 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
146 "punpcklbw %%mm7, %%mm2 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
147 "punpcklbw %%mm7, %%mm3 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
148 "paddw %%mm1, %%mm4 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
149 "paddw %%mm1, %%mm5 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
150 "paddw %%mm3, %%mm6 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
151 "psubw %%mm0, %%mm4 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
152 "psubw %%mm2, %%mm5 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
153 "psubw %%mm2, %%mm6 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
154
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
155 "decl %%ecx \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
156 "jnz 2b \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
157
9990
048847439f96 optimization
rfelker
parents: 9933
diff changeset
158 "movq %%mm0, %%mm1 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
159 "movq %%mm0, %%mm2 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
160 "movq %%mm0, %%mm3 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
161 "pcmpgtw %%mm4, %%mm1 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
162 "pcmpgtw %%mm5, %%mm2 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
163 "pcmpgtw %%mm6, %%mm3 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
164 "pxor %%mm1, %%mm4 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
165 "pxor %%mm2, %%mm5 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
166 "pxor %%mm3, %%mm6 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
167 "psubw %%mm1, %%mm4 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
168 "psubw %%mm2, %%mm5 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
169 "psubw %%mm3, %%mm6 \n\t"
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
170 "movq %%mm4, (%%"REG_d") \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
171 "movq %%mm5, 16(%%"REG_d") \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
172 "movq %%mm6, 32(%%"REG_d") \n\t"
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
173
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
174 "mov %%"REG_a", %%"REG_c" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
175 "shl $3, %%"REG_c" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
176 "sub %%"REG_c", %%"REG_S" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
177 "mov %%"REG_b", %%"REG_c" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
178 "shl $3, %%"REG_c" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
179 "sub %%"REG_c", %%"REG_D" \n\t"
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
180
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
181 // Second loop for the last four columns
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
182 "movl $4, %%ecx \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
183 "pxor %%mm4, %%mm4 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
184 "pxor %%mm5, %%mm5 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
185 "pxor %%mm6, %%mm6 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
186
19372
6334c14b38eb Replace asmalign.h hack by ASMALIGN cpp macros from config.h.
diego
parents: 18104
diff changeset
187 ASMALIGN(4)
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
188 "3: \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
189
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
190 "movq (%%"REG_S"), %%mm0 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
191 "movq (%%"REG_S",%%"REG_a"), %%mm1 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
192 "add %%"REG_a", %%"REG_S" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
193 "add %%"REG_a", %%"REG_S" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
194 "movq (%%"REG_D"), %%mm2 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
195 "movq (%%"REG_D",%%"REG_b"), %%mm3 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
196 "add %%"REG_b", %%"REG_D" \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
197 "add %%"REG_b", %%"REG_D" \n\t"
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
198 "punpckhbw %%mm7, %%mm0 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
199 "punpckhbw %%mm7, %%mm1 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
200 "punpckhbw %%mm7, %%mm2 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
201 "punpckhbw %%mm7, %%mm3 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
202 "paddw %%mm1, %%mm4 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
203 "paddw %%mm1, %%mm5 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
204 "paddw %%mm3, %%mm6 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
205 "psubw %%mm0, %%mm4 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
206 "psubw %%mm2, %%mm5 \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
207 "psubw %%mm2, %%mm6 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
208
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
209 "decl %%ecx \n\t"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
210 "jnz 3b \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
211
9990
048847439f96 optimization
rfelker
parents: 9933
diff changeset
212 "movq %%mm0, %%mm1 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
213 "movq %%mm0, %%mm2 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
214 "movq %%mm0, %%mm3 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
215 "pcmpgtw %%mm4, %%mm1 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
216 "pcmpgtw %%mm5, %%mm2 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
217 "pcmpgtw %%mm6, %%mm3 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
218 "pxor %%mm1, %%mm4 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
219 "pxor %%mm2, %%mm5 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
220 "pxor %%mm3, %%mm6 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
221 "psubw %%mm1, %%mm4 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
222 "psubw %%mm2, %%mm5 \n\t"
048847439f96 optimization
rfelker
parents: 9933
diff changeset
223 "psubw %%mm3, %%mm6 \n\t"
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
224 "movq %%mm4, 8(%%"REG_d") \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
225 "movq %%mm5, 24(%%"REG_d") \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
226 "movq %%mm6, 40(%%"REG_d") \n\t"
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
227
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
228 "emms \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
229 :
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9995
diff changeset
230 : "S" (old), "D" (new), "a" ((long)os), "b" ((long)ns), "d" (out)
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
231 : "memory"
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
232 );
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
233 m->p = m->t = m->s = 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
234 for (i=0; i<8; i++) {
9990
048847439f96 optimization
rfelker
parents: 9933
diff changeset
235 m->p += out[i];
048847439f96 optimization
rfelker
parents: 9933
diff changeset
236 m->t += out[8+i];
048847439f96 optimization
rfelker
parents: 9933
diff changeset
237 m->s += out[16+i];
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
238 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
239 //printf("e=%d o=%d d=%d p=%d t=%d s=%d\n", m->e, m->o, m->d, m->p, m->t, m->s);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
240 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
241 #endif
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
242
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
243 //#define MAG(a) ((a)*(a))
9995
62d643bc53e2 optimization -- lots of conditional jumps in inner loops are bad
rfelker
parents: 9990
diff changeset
244 //#define MAG(a) (abs(a))
62d643bc53e2 optimization -- lots of conditional jumps in inner loops are bad
rfelker
parents: 9990
diff changeset
245 #define MAG(a) (((a)^((a)>>31))-((a)>>31))
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
246
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
247 //#define LOWPASS(s) (((s)[-2] + 4*(s)[-1] + 6*(s)[0] + 4*(s)[1] + (s)[2])>>4)
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
248 //#define LOWPASS(s) (((s)[-1] + 2*(s)[0] + (s)[1])>>2)
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
249 #define LOWPASS(s) ((s)[0])
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
250
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
251
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
252 static void block_diffs_C(struct metrics *m, unsigned char *old, unsigned char *new, int os, int ns)
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
253 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
254 int x, y, e=0, o=0, s=0, p=0, t=0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
255 unsigned char *oldp, *newp;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
256 m->s = m->p = m->t = 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
257 for (x = 8; x; x--) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
258 oldp = old++;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
259 newp = new++;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
260 s = p = t = 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
261 for (y = 4; y; y--) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
262 e += MAG(newp[0]-oldp[0]);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
263 o += MAG(newp[ns]-oldp[os]);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
264 s += newp[ns]-newp[0];
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
265 p += oldp[os]-oldp[0];
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
266 t += oldp[os]-newp[0];
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
267 oldp += os<<1;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
268 newp += ns<<1;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
269 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
270 m->s += MAG(s);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
271 m->p += MAG(p);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
272 m->t += MAG(t);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
273 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
274 m->e = e;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
275 m->o = o;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
276 m->d = e+o;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
277 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
278
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
279 static void (*block_diffs)(struct metrics *, unsigned char *, unsigned char *, int, int);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
280
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
281 #define MAXUP(a,b) ((a) = ((a)>(b)) ? (a) : (b))
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
282
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
283 static void diff_planes(struct frameinfo *fi,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
284 unsigned char *old, unsigned char *new, int w, int h, int os, int ns)
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
285 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
286 int x, y;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
287 struct metrics l;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
288 struct metrics *peak=&fi->p, *rel=&fi->r, *mean=&fi->m;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
289 memset(peak, 0, sizeof(struct metrics));
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
290 memset(rel, 0, sizeof(struct metrics));
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
291 memset(mean, 0, sizeof(struct metrics));
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
292 for (y = 0; y < h-7; y += 8) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
293 for (x = 8; x < w-8-7; x += 8) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
294 block_diffs(&l, old+x+y*os, new+x+y*ns, os, ns);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
295 mean->d += l.d;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
296 mean->e += l.e;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
297 mean->o += l.o;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
298 mean->s += l.s;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
299 mean->p += l.p;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
300 mean->t += l.t;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
301 MAXUP(peak->d, l.d);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
302 MAXUP(peak->e, l.e);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
303 MAXUP(peak->o, l.o);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
304 MAXUP(peak->s, l.s);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
305 MAXUP(peak->p, l.p);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
306 MAXUP(peak->t, l.t);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
307 MAXUP(rel->e, l.e-l.o);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
308 MAXUP(rel->o, l.o-l.e);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
309 MAXUP(rel->s, l.s-l.t);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
310 MAXUP(rel->p, l.p-l.t);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
311 MAXUP(rel->t, l.t-l.p);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
312 MAXUP(rel->d, l.t-l.s); /* hack */
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
313 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
314 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
315 x = (w/8-2)*(h/8);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
316 mean->d /= x;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
317 mean->e /= x;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
318 mean->o /= x;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
319 mean->s /= x;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
320 mean->p /= x;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
321 mean->t /= x;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
322 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
323
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
324 static void diff_fields(struct frameinfo *fi, mp_image_t *old, mp_image_t *new)
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
325 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
326 diff_planes(fi, old->planes[0], new->planes[0],
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
327 new->w, new->h, old->stride[0], new->stride[0]);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
328 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
329
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
330 static void stats(struct frameinfo *f)
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
331 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
332 mp_msg(MSGT_VFILTER, MSGL_V, " pd=%d re=%d ro=%d rp=%d rt=%d rs=%d rd=%d pp=%d pt=%d ps=%d\r",
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
333 f->p.d, f->r.e, f->r.o, f->r.p, f->r.t, f->r.s, f->r.d, f->p.p, f->p.t, f->p.s);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
334 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
335
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
336 static int foo(struct vf_priv_s *p, mp_image_t *new, mp_image_t *cur)
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
337 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
338 struct frameinfo *f = p->fi;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
339
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
340 f[0] = f[1];
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
341 diff_fields(&f[1], cur, new);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
342 stats(&f[1]);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
343
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
344 // Immediately drop this frame if it's already been used.
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
345 if (p->dropnext) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
346 p->dropnext = 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
347 return F_DROP;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
348 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
349
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
350 // Sometimes a pulldown frame comes all by itself, so both
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
351 // its top and bottom field are duplicates from the adjacent
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
352 // two frames. We can just drop such a frame, but we
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
353 // immediately show the next frame instead to keep the frame
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
354 // drops evenly spaced during normal 3:2 pulldown sequences.
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
355 if ((3*f[1].r.o < f[1].r.e) && (f[1].r.s < f[1].r.d)) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
356 p->dropnext = 1;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
357 return F_NEXT;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
358 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
359
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
360 // If none of these conditions hold, we will consider the frame
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
361 // progressive and just show it as-is.
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
362 if (!( (3*f[0].r.e < f[0].r.o) ||
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
363 ((2*f[0].r.d < f[0].r.s) && (f[0].r.s > 1200)) ||
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
364 ((2*f[1].r.t < f[1].r.p) && (f[1].r.p > 1200)) ))
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
365 return F_SHOW;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
366
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
367 // Otherwise, we have to decide whether to merge or drop.
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
368 // If the noise metric only increases minimally, we're off
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
369 // to a good start...
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
370 if (((2*f[1].r.t < 3*f[1].r.p) && (f[1].r.t < 3600)) ||
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
371 (f[1].r.t < 900) || (f[1].r.d < 900)) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
372 // ...and if noise decreases or the duplicate even field
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
373 // is detected, we go ahead with the merge.
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
374 if ((3*f[0].r.e < f[0].r.o) || (2*f[1].r.t < f[1].r.p)) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
375 p->dropnext = 1;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
376 return F_MERGE;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
377 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
378 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
379 return F_DROP;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
380 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
381
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
382
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
383
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
384 static void copy_image(mp_image_t *dmpi, mp_image_t *mpi, int field)
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
385 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
386 switch (field) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
387 case 0:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
388 my_memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h/2,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
389 dmpi->stride[0]*2, mpi->stride[0]*2);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
390 if (mpi->flags & MP_IMGFLAG_PLANAR) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
391 my_memcpy_pic(dmpi->planes[1], mpi->planes[1],
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
392 mpi->chroma_width, mpi->chroma_height/2,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
393 dmpi->stride[1]*2, mpi->stride[1]*2);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
394 my_memcpy_pic(dmpi->planes[2], mpi->planes[2],
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
395 mpi->chroma_width, mpi->chroma_height/2,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
396 dmpi->stride[2]*2, mpi->stride[2]*2);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
397 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
398 break;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
399 case 1:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
400 my_memcpy_pic(dmpi->planes[0]+dmpi->stride[0],
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
401 mpi->planes[0]+mpi->stride[0], mpi->w, mpi->h/2,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
402 dmpi->stride[0]*2, mpi->stride[0]*2);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
403 if (mpi->flags & MP_IMGFLAG_PLANAR) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
404 my_memcpy_pic(dmpi->planes[1]+dmpi->stride[1],
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
405 mpi->planes[1]+mpi->stride[1],
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
406 mpi->chroma_width, mpi->chroma_height/2,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
407 dmpi->stride[1]*2, mpi->stride[1]*2);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
408 my_memcpy_pic(dmpi->planes[2]+dmpi->stride[2],
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
409 mpi->planes[2]+mpi->stride[2],
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
410 mpi->chroma_width, mpi->chroma_height/2,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
411 dmpi->stride[2]*2, mpi->stride[2]*2);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
412 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
413 break;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
414 case 2:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
415 memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
416 dmpi->stride[0], mpi->stride[0]);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
417 if (mpi->flags & MP_IMGFLAG_PLANAR) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
418 memcpy_pic(dmpi->planes[1], mpi->planes[1],
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
419 mpi->chroma_width, mpi->chroma_height,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
420 dmpi->stride[1], mpi->stride[1]);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
421 memcpy_pic(dmpi->planes[2], mpi->planes[2],
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
422 mpi->chroma_width, mpi->chroma_height,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
423 dmpi->stride[2], mpi->stride[2]);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
424 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
425 break;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
426 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
427 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
428
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
429 static int do_put_image(struct vf_instance *vf, mp_image_t *dmpi)
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
430 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
431 struct vf_priv_s *p = vf->priv;
17832
7fa8bfd0dea3 10l found by Oded: case 2 on a boolean value...
rfelker
parents: 17012
diff changeset
432 int dropflag=0;
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
433
17832
7fa8bfd0dea3 10l found by Oded: case 2 on a boolean value...
rfelker
parents: 17012
diff changeset
434 if (!p->dropnext) switch (p->drop) {
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
435 case 0:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
436 dropflag = 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
437 break;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
438 case 1:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
439 dropflag = (++p->lastdrop >= 5);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
440 break;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
441 case 2:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
442 dropflag = (++p->lastdrop >= 5) && (4*p->inframes <= 5*p->outframes);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
443 break;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
444 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
445
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
446 if (dropflag) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
447 //mp_msg(MSGT_VFILTER, MSGL_V, "drop! [%d/%d=%g]\n",
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
448 // p->outframes, p->inframes, (float)p->outframes/p->inframes);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
449 mp_msg(MSGT_VFILTER, MSGL_V, "!");
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
450 p->lastdrop = 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
451 return 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
452 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
453
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
454 p->outframes++;
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17832
diff changeset
455 return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
456 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
457
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
458 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
459 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
460 int ret=0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
461 struct vf_priv_s *p = vf->priv;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
462
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
463 p->inframes++;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
464
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
465 if (p->first) { /* hack */
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
466 p->first = 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
467 return 1;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
468 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
469
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
470 if (!p->dmpi) p->dmpi = vf_get_image(vf->next, mpi->imgfmt,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
471 MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE |
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
472 MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE,
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
473 mpi->width, mpi->height);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
474 /* FIXME -- not correct, off by one frame! */
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
475 p->dmpi->qscale = mpi->qscale;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
476 p->dmpi->qstride = mpi->qstride;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
477 p->dmpi->qscale_type = mpi->qscale_type;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28290
diff changeset
478
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
479 switch (foo(p, mpi, p->dmpi)) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
480 case F_DROP:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
481 copy_image(p->dmpi, mpi, 2);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
482 ret = 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
483 p->lastdrop = 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
484 mp_msg(MSGT_VFILTER, MSGL_V, "DROP\n");
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
485 break;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
486 case F_MERGE:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
487 copy_image(p->dmpi, mpi, 0);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
488 ret = do_put_image(vf, p->dmpi);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
489 copy_image(p->dmpi, mpi, 1);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
490 mp_msg(MSGT_VFILTER, MSGL_V, "MERGE\n");
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
491 p->dmpi = NULL;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
492 break;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
493 case F_NEXT:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
494 copy_image(p->dmpi, mpi, 2);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
495 ret = do_put_image(vf, p->dmpi);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
496 mp_msg(MSGT_VFILTER, MSGL_V, "NEXT\n");
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
497 p->dmpi = NULL;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
498 break;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
499 case F_SHOW:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
500 ret = do_put_image(vf, p->dmpi);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
501 copy_image(p->dmpi, mpi, 2);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
502 mp_msg(MSGT_VFILTER, MSGL_V, "OK\n");
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
503 p->dmpi = NULL;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
504 break;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
505 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
506 return ret;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
507 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
508
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
509 static int query_format(struct vf_instance *vf, unsigned int fmt)
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
510 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
511 switch (fmt) {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
512 case IMGFMT_YV12:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
513 case IMGFMT_IYUV:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
514 case IMGFMT_I420:
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
515 return vf_next_query_format(vf, fmt);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
516 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
517 return 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
518 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
519
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
520 static void uninit(struct vf_instance *vf)
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
521 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
522 free(vf->priv);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
523 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
524
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 30633
diff changeset
525 static int vf_open(vf_instance_t *vf, char *args)
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
526 {
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
527 struct vf_priv_s *p;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
528 vf->put_image = put_image;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
529 vf->query_format = query_format;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
530 vf->uninit = uninit;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
531 vf->default_reqs = VFCAP_ACCEPT_STRIDE;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
532 vf->priv = p = calloc(1, sizeof(struct vf_priv_s));
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
533 p->drop = 0;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
534 p->first = 1;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
535 if (args) sscanf(args, "%d", &p->drop);
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
536 block_diffs = block_diffs_C;
29639
26a355ffe458 Add several HAVE_EBX_AVAILABLE conditions where necessary
reimar
parents: 29263
diff changeset
537 #if HAVE_MMX && HAVE_EBX_AVAILABLE
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
538 if(gCpuCaps.hasMMX) block_diffs = block_diffs_MMX;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
539 #endif
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
540 return 1;
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
541 }
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
542
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 23666
diff changeset
543 const vf_info_t vf_info_ivtc = {
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
544 "inverse telecine, take 2",
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
545 "ivtc",
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
546 "Rich Felker",
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
547 "",
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 30633
diff changeset
548 vf_open,
9933
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
549 NULL
3548701a13fe 1. new alternate approach to inverse telecine! much better!
rfelker
parents:
diff changeset
550 };