annotate libmpcodecs/vf_ivtc.c @ 24576:6704a924d4aa

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