annotate libmpcodecs/vf_filmdint.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 3d23e24c5c60
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: 29263
diff changeset
1 /*
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
diff changeset
2 * This file is part of MPlayer.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
diff changeset
3 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
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: 29263
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: 29263
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: 29263
diff changeset
7 * (at your option) any later version.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
diff changeset
8 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
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: 29263
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: 29263
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: 29263
diff changeset
12 * GNU General Public License for more details.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
diff changeset
13 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
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: 29263
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: 29263
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: 29263
diff changeset
17 */
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
diff changeset
18
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
19 #include <stdio.h>
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
20 #include <stdlib.h>
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
21 #include <string.h>
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
22 #include <sys/time.h>
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
23
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
24 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
25 #include "mp_msg.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
26 #include "cpudetect.h"
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
27
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
28 #include "img_format.h"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
29 #include "mp_image.h"
30653
3d23e24c5c60 Declare externally used variables from vd.c as extern in vd.h.
diego
parents: 30642
diff changeset
30 #include "vd.h"
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
31 #include "vf.h"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
32 #include "cmmx.h"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
33
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
34 #include "libvo/fastmemcpy.h"
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
35
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
36 #define NUM_STORED 4
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
37
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
38 enum pu_field_type_t {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
39 PU_1ST_OF_3,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
40 PU_2ND_OF_3,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
41 PU_3RD_OF_3,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
42 PU_1ST_OF_2,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
43 PU_2ND_OF_2,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
44 PU_INTERLACED
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
45 };
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
46
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
47 struct metrics {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
48 /* This struct maps to a packed word 64-bit MMX register */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
49 unsigned short int even;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
50 unsigned short int odd;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
51 unsigned short int noise;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
52 unsigned short int temp;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
53 } __attribute__ ((aligned (8)));
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
54
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
55 struct frame_stats {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
56 struct metrics tiny, low, high, bigger, twox, max;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
57 struct { unsigned int even, odd, noise, temp; } sad;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
58 unsigned short interlaced_high;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
59 unsigned short interlaced_low;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
60 unsigned short num_blocks;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
61 };
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
62
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
63 struct vf_priv_s {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
64 unsigned long inframes;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
65 unsigned long outframes;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
66 enum pu_field_type_t prev_type;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
67 unsigned swapped, chroma_swapped;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
68 unsigned luma_only;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
69 unsigned verbose;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
70 unsigned fast;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
71 unsigned long w, h, cw, ch, stride, chroma_stride, nplanes;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
72 unsigned long sad_thres;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
73 unsigned long dint_thres;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
74 unsigned char *memory_allocated;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
75 unsigned char *planes[2*NUM_STORED][4];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
76 unsigned char **old_planes;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
77 unsigned long static_idx;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
78 unsigned long temp_idx;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
79 unsigned long crop_x, crop_y, crop_cx, crop_cy;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
80 unsigned long export_count, merge_count;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
81 unsigned long num_breaks;
12255
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
82 unsigned long num_copies;
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
83 long in_inc, out_dec, iosync;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
84 long num_fields;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
85 long prev_fields;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
86 long notout;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
87 long mmx2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
88 unsigned small_bytes[2];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
89 unsigned mmx_temp[2];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
90 struct frame_stats stats[2];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
91 struct metrics thres;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
92 char chflag;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
93 double diff_time, merge_time, decode_time, vo_time, filter_time;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
94 };
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
95
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
96 #define PPZ { 2000, 2000, 0, 2000 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
97 #define PPR { 2000, 2000, 0, 2000 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
98 static const struct frame_stats ppzs = {PPZ,PPZ,PPZ,PPZ,PPZ,PPZ,PPZ,0,0,9999};
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
99 static const struct frame_stats pprs = {PPR,PPR,PPR,PPR,PPR,PPR,PPR,0,0,9999};
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
100
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
101 #ifndef MIN
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
102 #define MIN(a,b) (((a)<(b))?(a):(b))
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
103 #endif
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
104 #ifndef MAX
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
105 #define MAX(a,b) (((a)>(b))?(a):(b))
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
106 #endif
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
107
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
108 #define PDIFFUB(X,Y,T) "movq " #X "," #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
109 "psubusb " #Y "," #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
110 "psubusb " #X "," #Y "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
111 "paddusb " #Y "," #T "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
112
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
113 #define PDIFFUBT(X,Y,T) "movq " #X "," #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
114 "psubusb " #Y "," #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
115 "psubusb " #X "," #Y "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
116 "paddusb " #T "," #Y "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
117
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
118 #define PSUMBW(X,T,Z) "movq " #X "," #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
119 "punpcklbw " #Z "," #X "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
120 "punpckhbw " #Z "," #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
121 "paddw " #T "," #X "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
122 "movq " #X "," #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
123 "psllq $32, " #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
124 "paddw " #T "," #X "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
125 "movq " #X "," #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
126 "psllq $16, " #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
127 "paddw " #T "," #X "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
128 "psrlq $48, " #X "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
129
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
130 #define PSADBW(X,Y,T,Z) PDIFFUBT(X,Y,T) PSUMBW(Y,T,Z)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
131
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
132 #define PMAXUB(X,Y) "psubusb " #X "," #Y "\n\tpaddusb " #X "," #Y "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
133 #define PMAXUW(X,Y) "psubusw " #X "," #Y "\n\tpaddusw " #X "," #Y "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
134 #define PMINUBT(X,Y,T) "movq " #Y "," #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
135 "psubusb " #X "," #T "\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
136 "psubusb " #T "," #Y "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
137 #define PAVGB(X,Y) "pavgusb " #X "," #Y "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
138
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
139 static inline void
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
140 get_metrics_c(unsigned char *a, unsigned char *b, int as, int bs, int lines,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
141 struct metrics *m)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
142 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
143 a -= as;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
144 b -= bs;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
145 do {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
146 cmmx_t old_po = *(cmmx_t*)(a );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
147 cmmx_t po = *(cmmx_t*)(b );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
148 cmmx_t e = *(cmmx_t*)(b + bs);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
149 cmmx_t old_o = *(cmmx_t*)(a + 2*as);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
150 cmmx_t o = *(cmmx_t*)(b + 2*bs);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
151 cmmx_t ne = *(cmmx_t*)(b + 3*bs);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
152 cmmx_t old_no = *(cmmx_t*)(a + 4*as);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
153 cmmx_t no = *(cmmx_t*)(b + 4*bs);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
154
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
155 cmmx_t qup_old_odd = p31avgb(old_o, old_po);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
156 cmmx_t qup_odd = p31avgb( o, po);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
157 cmmx_t qdown_old_odd = p31avgb(old_o, old_no);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
158 cmmx_t qdown_odd = p31avgb( o, no);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
159
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
160 cmmx_t qup_even = p31avgb(ne, e);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
161 cmmx_t qdown_even = p31avgb(e, ne);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
162
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
163 cmmx_t temp_up_diff = pdiffub(qdown_even, qup_old_odd);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
164 cmmx_t noise_up_diff = pdiffub(qdown_even, qup_odd);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
165 cmmx_t temp_down_diff = pdiffub(qup_even, qdown_old_odd);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
166 cmmx_t noise_down_diff = pdiffub(qup_even, qdown_odd);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
167
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
168 cmmx_t odd_diff = pdiffub(o, old_o);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
169 m->odd += psumbw(odd_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
170 m->even += psadbw(e, *(cmmx_t*)(a+as));
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
171
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
172 temp_up_diff = pminub(temp_up_diff, temp_down_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
173 temp_up_diff = pminub(temp_up_diff, odd_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
174 m->temp += psumbw(temp_up_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
175 noise_up_diff = pminub(noise_up_diff, odd_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
176 noise_up_diff = pminub(noise_up_diff, noise_down_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
177
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
178 m->noise += psumbw(noise_up_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
179 a += 2*as;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
180 b += 2*bs;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
181 } while (--lines);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
182 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
183
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
184 static inline void
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
185 get_metrics_fast_c(unsigned char *a, unsigned char *b, int as, int bs,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
186 int lines, struct metrics *m)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
187 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
188 a -= as;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
189 b -= bs;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
190 do {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
191 cmmx_t old_po = (*(cmmx_t*)(a ) >> 1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
192 cmmx_t po = (*(cmmx_t*)(b ) >> 1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
193 cmmx_t old_e = (*(cmmx_t*)(a + as) >> 1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
194 cmmx_t e = (*(cmmx_t*)(b + bs) >> 1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
195 cmmx_t old_o = (*(cmmx_t*)(a + 2*as) >> 1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
196 cmmx_t o = (*(cmmx_t*)(b + 2*bs) >> 1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
197 cmmx_t ne = (*(cmmx_t*)(b + 3*bs) >> 1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
198 cmmx_t old_no = (*(cmmx_t*)(a + 4*as) >> 1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
199 cmmx_t no = (*(cmmx_t*)(b + 4*bs) >> 1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
200
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
201 cmmx_t qup_old_odd = p31avgb_s(old_o, old_po);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
202 cmmx_t qup_odd = p31avgb_s( o, po);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
203 cmmx_t qdown_old_odd = p31avgb_s(old_o, old_no);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
204 cmmx_t qdown_odd = p31avgb_s( o, no);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
205
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
206 cmmx_t qup_even = p31avgb_s(ne, e);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
207 cmmx_t qdown_even = p31avgb_s(e, ne);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
208
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
209 cmmx_t temp_up_diff = pdiffub_s(qdown_even, qup_old_odd);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
210 cmmx_t noise_up_diff = pdiffub_s(qdown_even, qup_odd);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
211 cmmx_t temp_down_diff = pdiffub_s(qup_even, qdown_old_odd);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
212 cmmx_t noise_down_diff = pdiffub_s(qup_even, qdown_odd);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
213
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
214 cmmx_t odd_diff = pdiffub_s(o, old_o);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
215 m->odd += psumbw_s(odd_diff) << 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
216 m->even += psadbw_s(e, old_e) << 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
217
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
218 temp_up_diff = pminub_s(temp_up_diff, temp_down_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
219 temp_up_diff = pminub_s(temp_up_diff, odd_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
220 m->temp += psumbw_s(temp_up_diff) << 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
221 noise_up_diff = pminub_s(noise_up_diff, odd_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
222 noise_up_diff = pminub_s(noise_up_diff, noise_down_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
223
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
224 m->noise += psumbw_s(noise_up_diff) << 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
225 a += 2*as;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
226 b += 2*bs;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
227 } while (--lines);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
228 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
229
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
230 static inline void
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
231 get_metrics_faster_c(unsigned char *a, unsigned char *b, int as, int bs,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
232 int lines, struct metrics *m)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
233 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
234 a -= as;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
235 b -= bs;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
236 do {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
237 cmmx_t old_po = (*(cmmx_t*)(a )>>1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
238 cmmx_t po = (*(cmmx_t*)(b )>>1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
239 cmmx_t old_e = (*(cmmx_t*)(a + as)>>1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
240 cmmx_t e = (*(cmmx_t*)(b + bs)>>1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
241 cmmx_t old_o = (*(cmmx_t*)(a + 2*as)>>1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
242 cmmx_t o = (*(cmmx_t*)(b + 2*bs)>>1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
243 cmmx_t ne = (*(cmmx_t*)(b + 3*bs)>>1) & ~SIGN_BITS;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
244
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
245 cmmx_t down_even = p31avgb_s(e, ne);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
246 cmmx_t up_odd = p31avgb_s(o, po);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
247 cmmx_t up_old_odd = p31avgb_s(old_o, old_po);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
248
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
249 cmmx_t odd_diff = pdiffub_s(o, old_o);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
250 cmmx_t temp_diff = pdiffub_s(down_even, up_old_odd);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
251 cmmx_t noise_diff = pdiffub_s(down_even, up_odd);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
252
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
253 m->even += psadbw_s(e, old_e) << 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
254 m->odd += psumbw_s(odd_diff) << 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
255
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
256 temp_diff = pminub_s(temp_diff, odd_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
257 noise_diff = pminub_s(noise_diff, odd_diff);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
258
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
259 m->noise += psumbw_s(noise_diff) << 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
260 m->temp += psumbw_s(temp_diff) << 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
261 a += 2*as;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
262 b += 2*bs;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
263 } while (--lines);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29040
diff changeset
264
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
265 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
266
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
267 static inline void
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
268 get_block_stats(struct metrics *m, struct vf_priv_s *p, struct frame_stats *s)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
269 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
270 unsigned two_e = m->even + MAX(m->even , p->thres.even );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
271 unsigned two_o = m->odd + MAX(m->odd , p->thres.odd );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
272 unsigned two_n = m->noise + MAX(m->noise, p->thres.noise);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
273 unsigned two_t = m->temp + MAX(m->temp , p->thres.temp );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
274
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
275 unsigned e_big = m->even >= (m->odd + two_o + 1)/2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
276 unsigned o_big = m->odd >= (m->even + two_e + 1)/2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
277 unsigned n_big = m->noise >= (m->temp + two_t + 1)/2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
278 unsigned t_big = m->temp >= (m->noise + two_n + 1)/2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
279
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
280 unsigned e2x = m->even >= two_o;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
281 unsigned o2x = m->odd >= two_e;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
282 unsigned n2x = m->noise >= two_t;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
283 unsigned t2x = m->temp >= two_n;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
284
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
285 unsigned ntiny_e = m->even > p->thres.even ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
286 unsigned ntiny_o = m->odd > p->thres.odd ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
287 unsigned ntiny_n = m->noise > p->thres.noise;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
288 unsigned ntiny_t = m->temp > p->thres.temp ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
289
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
290 unsigned nlow_e = m->even > 2*p->thres.even ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
291 unsigned nlow_o = m->odd > 2*p->thres.odd ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
292 unsigned nlow_n = m->noise > 2*p->thres.noise;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
293 unsigned nlow_t = m->temp > 2*p->thres.temp ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
294
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
295 unsigned high_e = m->even > 4*p->thres.even ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
296 unsigned high_o = m->odd > 4*p->thres.odd ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
297 unsigned high_n = m->noise > 4*p->thres.noise;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
298 unsigned high_t = m->temp > 4*p->thres.temp ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
299
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
300 unsigned low_il = !n_big && !t_big && ntiny_n && ntiny_t;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
301 unsigned high_il = !n_big && !t_big && nlow_n && nlow_t;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
302
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
303 if (low_il | high_il) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
304 s->interlaced_low += low_il;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
305 s->interlaced_high += high_il;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
306 } else {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
307 s->tiny.even += ntiny_e;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
308 s->tiny.odd += ntiny_o;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
309 s->tiny.noise += ntiny_n;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
310 s->tiny.temp += ntiny_t;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
311
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
312 s->low .even += nlow_e ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
313 s->low .odd += nlow_o ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
314 s->low .noise += nlow_n ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
315 s->low .temp += nlow_t ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
316
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
317 s->high.even += high_e ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
318 s->high.odd += high_o ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
319 s->high.noise += high_n ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
320 s->high.temp += high_t ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
321
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
322 if (m->even >= p->sad_thres) s->sad.even += m->even ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
323 if (m->odd >= p->sad_thres) s->sad.odd += m->odd ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
324 if (m->noise >= p->sad_thres) s->sad.noise += m->noise;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
325 if (m->temp >= p->sad_thres) s->sad.temp += m->temp ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
326 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
327 s->num_blocks++;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
328 s->max.even = MAX(s->max.even , m->even );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
329 s->max.odd = MAX(s->max.odd , m->odd );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
330 s->max.noise = MAX(s->max.noise, m->noise);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
331 s->max.temp = MAX(s->max.temp , m->temp );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
332
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
333 s->bigger.even += e_big ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
334 s->bigger.odd += o_big ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
335 s->bigger.noise += n_big ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
336 s->bigger.temp += t_big ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
337
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
338 s->twox.even += e2x ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
339 s->twox.odd += o2x ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
340 s->twox.noise += n2x ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
341 s->twox.temp += t2x ;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
342
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
343 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
344
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
345 static inline struct metrics
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
346 block_metrics_c(unsigned char *a, unsigned char *b, int as, int bs,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
347 int lines, struct vf_priv_s *p, struct frame_stats *s)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
348 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
349 struct metrics tm;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
350 tm.even = tm.odd = tm.noise = tm.temp = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
351 get_metrics_c(a, b, as, bs, lines, &tm);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
352 if (sizeof(cmmx_t) < 8)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
353 get_metrics_c(a+4, b+4, as, bs, lines, &tm);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
354 get_block_stats(&tm, p, s);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
355 return tm;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
356 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
357
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
358 static inline struct metrics
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
359 block_metrics_fast_c(unsigned char *a, unsigned char *b, int as, int bs,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
360 int lines, struct vf_priv_s *p, struct frame_stats *s)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
361 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
362 struct metrics tm;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
363 tm.even = tm.odd = tm.noise = tm.temp = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
364 get_metrics_fast_c(a, b, as, bs, lines, &tm);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
365 if (sizeof(cmmx_t) < 8)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
366 get_metrics_fast_c(a+4, b+4, as, bs, lines, &tm);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
367 get_block_stats(&tm, p, s);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
368 return tm;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
369 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
370
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
371 static inline struct metrics
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
372 block_metrics_faster_c(unsigned char *a, unsigned char *b, int as, int bs,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
373 int lines, struct vf_priv_s *p, struct frame_stats *s)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
374 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
375 struct metrics tm;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
376 tm.even = tm.odd = tm.noise = tm.temp = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
377 get_metrics_faster_c(a, b, as, bs, lines, &tm);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
378 if (sizeof(cmmx_t) < 8)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
379 get_metrics_faster_c(a+4, b+4, as, bs, lines, &tm);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
380 get_block_stats(&tm, p, s);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
381 return tm;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
382 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
383
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
384 #define MEQ(X,Y) ((X).even == (Y).even && (X).odd == (Y).odd && (X).temp == (Y).temp && (X).noise == (Y).noise)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
385
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
386 #define BLOCK_METRICS_TEMPLATE() \
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25626
diff changeset
387 __asm__ volatile("pxor %mm7, %mm7\n\t" /* The result is colleted in mm7 */ \
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
388 "pxor %mm6, %mm6\n\t" /* Temp to stay at 0 */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
389 ); \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
390 a -= as; \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
391 b -= bs; \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
392 do { \
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25626
diff changeset
393 __asm__ volatile( \
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
394 "movq (%0,%2), %%mm0\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
395 "movq (%1,%3), %%mm1\n\t" /* mm1 = even */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
396 PSADBW(%%mm1, %%mm0, %%mm4, %%mm6) \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
397 "paddusw %%mm0, %%mm7\n\t" /* even diff */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
398 "movq (%0,%2,2), %%mm0\n\t" /* mm0 = old odd */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
399 "movq (%1,%3,2), %%mm2\n\t" /* mm2 = odd */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
400 "movq (%0), %%mm3\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
401 "psubusb %4, %%mm3\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
402 PAVGB(%%mm0, %%mm3) \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
403 PAVGB(%%mm0, %%mm3) /* mm3 = qup old odd */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
404 "movq %%mm0, %%mm5\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
405 PSADBW(%%mm2, %%mm0, %%mm4, %%mm6) \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
406 "psllq $16, %%mm0\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
407 "paddusw %%mm0, %%mm7\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
408 "movq (%1), %%mm4\n\t" \
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 12255
diff changeset
409 "lea (%0,%2,2), %0\n\t" \
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 12255
diff changeset
410 "lea (%1,%3,2), %1\n\t" \
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
411 "psubusb %4, %%mm4\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
412 PAVGB(%%mm2, %%mm4) \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
413 PAVGB(%%mm2, %%mm4) /* mm4 = qup odd */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
414 PDIFFUBT(%%mm5, %%mm2, %%mm0) /* mm2 =abs(oldodd-odd) */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
415 "movq (%1,%3), %%mm5\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
416 "psubusb %4, %%mm5\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
417 PAVGB(%%mm1, %%mm5) \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
418 PAVGB(%%mm5, %%mm1) /* mm1 = qdown even */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
419 PAVGB((%1,%3), %%mm5) /* mm5 = qup next even */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
420 PDIFFUBT(%%mm1, %%mm3, %%mm0) /* mm3 = abs(qupoldo-qde) */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
421 PDIFFUBT(%%mm1, %%mm4, %%mm0) /* mm4 = abs(qupodd-qde) */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
422 PMINUBT(%%mm2, %%mm3, %%mm0) /* limit temp to odd diff */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
423 PMINUBT(%%mm2, %%mm4, %%mm0) /* limit noise to odd diff */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
424 "movq (%1,%3,2), %%mm2\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
425 "psubusb %4, %%mm2\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
426 PAVGB((%1), %%mm2) \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
427 PAVGB((%1), %%mm2) /* mm2 = qdown odd */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
428 "movq (%0,%2,2), %%mm1\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
429 "psubusb %4, %%mm1\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
430 PAVGB((%0), %%mm1) \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
431 PAVGB((%0), %%mm1) /* mm1 = qdown old odd */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
432 PDIFFUBT(%%mm5, %%mm2, %%mm0) /* mm2 = abs(qdo-qune) */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
433 PDIFFUBT(%%mm5, %%mm1, %%mm0) /* mm1 = abs(qdoo-qune) */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
434 PMINUBT(%%mm4, %%mm2, %%mm0) /* current */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
435 PMINUBT(%%mm3, %%mm1, %%mm0) /* old */ \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
436 PSUMBW(%%mm2, %%mm0, %%mm6) \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
437 PSUMBW(%%mm1, %%mm0, %%mm6) \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
438 "psllq $32, %%mm2\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
439 "psllq $48, %%mm1\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
440 "paddusw %%mm2, %%mm7\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
441 "paddusw %%mm1, %%mm7\n\t" \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
442 : "=r" (a), "=r" (b) \
29040
963f578121c6 Use x86_reg instead of long in several video filters to fix compilation on MinGW64.
reimar
parents: 28335
diff changeset
443 : "r"((x86_reg)as), "r"((x86_reg)bs), "m" (ones), "0"(a), "1"(b), "X"(*a), "X"(*b) \
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
444 ); \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
445 } while (--lines);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
446
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
447 static inline struct metrics
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
448 block_metrics_3dnow(unsigned char *a, unsigned char *b, int as, int bs,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
449 int lines, struct vf_priv_s *p, struct frame_stats *s)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
450 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
451 struct metrics tm;
28335
31287e75b5d8 HAVE_3DNOW --> HAVE_AMD3DNOW
diego
parents: 28292
diff changeset
452 #if !HAVE_AMD3DNOW
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
453 mp_msg(MSGT_VFILTER, MSGL_FATAL, "block_metrics_3dnow: internal error\n");
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
454 #else
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
455 static const unsigned long long ones = 0x0101010101010101ull;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
456
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
457 BLOCK_METRICS_TEMPLATE();
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25626
diff changeset
458 __asm__ volatile("movq %%mm7, %0\n\temms" : "=m" (tm));
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
459 get_block_stats(&tm, p, s);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
460 #endif
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
461 return tm;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
462 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
463
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
464 #undef PSUMBW
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
465 #undef PSADBW
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
466 #undef PMAXUB
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
467 #undef PMINUBT
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
468 #undef PAVGB
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
469
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
470 #define PSUMBW(X,T,Z) "psadbw " #Z "," #X "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
471 #define PSADBW(X,Y,T,Z) "psadbw " #X "," #Y "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
472 #define PMAXUB(X,Y) "pmaxub " #X "," #Y "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
473 #define PMINUBT(X,Y,T) "pminub " #X "," #Y "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
474 #define PAVGB(X,Y) "pavgb " #X "," #Y "\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
475
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
476 static inline struct metrics
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
477 block_metrics_mmx2(unsigned char *a, unsigned char *b, int as, int bs,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
478 int lines, struct vf_priv_s *p, struct frame_stats *s)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
479 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
480 struct metrics tm;
28292
d6001126678f More #ifdef HAVE_MMX etc. missed by earlier search.
reimar
parents: 27754
diff changeset
481 #if !HAVE_MMX
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
482 mp_msg(MSGT_VFILTER, MSGL_FATAL, "block_metrics_mmx2: internal error\n");
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
483 #else
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
484 static const unsigned long long ones = 0x0101010101010101ull;
29040
963f578121c6 Use x86_reg instead of long in several video filters to fix compilation on MinGW64.
reimar
parents: 28335
diff changeset
485 x86_reg interlaced;
963f578121c6 Use x86_reg instead of long in several video filters to fix compilation on MinGW64.
reimar
parents: 28335
diff changeset
486 x86_reg prefetch_line = (((long)a>>3) & 7) + 10;
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
487 #ifdef DEBUG
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
488 struct frame_stats ts = *s;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
489 #endif
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25626
diff changeset
490 __asm__ volatile("prefetcht0 (%0,%2)\n\t"
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
491 "prefetcht0 (%1,%3)\n\t" :
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
492 : "r" (a), "r" (b),
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
493 "r" (prefetch_line * as), "r" (prefetch_line * bs));
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
494
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
495 BLOCK_METRICS_TEMPLATE();
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
496
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
497 s->num_blocks++;
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25626
diff changeset
498 __asm__ volatile(
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
499 "movq %3, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
500 "movq %%mm7, %%mm1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
501 "psubusw %%mm0, %%mm1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
502 "movq %%mm1, %%mm2\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
503 "paddusw %%mm0, %%mm2\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
504 "paddusw %%mm7, %%mm2\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
505 "pshufw $0xb1, %%mm2, %%mm3\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
506 "pavgw %%mm7, %%mm2\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
507 "pshufw $0xb1, %%mm2, %%mm2\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
508 "psubusw %%mm7, %%mm2\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
509 "pcmpeqw %%mm6, %%mm2\n\t" /* 1 if >= 1.5x */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
510 "psubusw %%mm7, %%mm3\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
511 "pcmpeqw %%mm6, %%mm3\n\t" /* 1 if >= 2x */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
512 "movq %1, %%mm4\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
513 "movq %2, %%mm5\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
514 "psubw %%mm2, %%mm4\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
515 "psubw %%mm3, %%mm5\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
516 "movq %%mm4, %1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
517 "movq %%mm5, %2\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
518 "pxor %%mm4, %%mm4\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
519 "pcmpeqw %%mm1, %%mm4\n\t" /* 1 if <= t */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
520 "psubusw %%mm0, %%mm1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
521 "pxor %%mm5, %%mm5\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
522 "pcmpeqw %%mm1, %%mm5\n\t" /* 1 if <= 2t */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
523 "psubusw %%mm0, %%mm1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
524 "psubusw %%mm0, %%mm1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
525 "pcmpeqw %%mm6, %%mm1\n\t" /* 1 if <= 4t */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
526 "pshufw $0xb1, %%mm2, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
527 "por %%mm2, %%mm0\n\t" /* 1 if not close */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
528 "punpckhdq %%mm0, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
529 "movq %%mm4, %%mm2\n\t" /* tttt */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
530 "punpckhdq %%mm5, %%mm2\n\t" /* ttll */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
531 "por %%mm2, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
532 "pcmpeqd %%mm6, %%mm0\n\t" /* close && big */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
533 "psrlq $16, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
534 "psrlw $15, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
535 "movd %%mm0, %0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
536 : "=r" (interlaced), "=m" (s->bigger), "=m" (s->twox)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
537 : "m" (p->thres)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
538 );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
539
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
540 if (interlaced) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
541 s->interlaced_high += interlaced >> 16;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
542 s->interlaced_low += interlaced;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
543 } else {
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25626
diff changeset
544 __asm__ volatile(
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
545 "pcmpeqw %%mm0, %%mm0\n\t" /* -1 */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
546 "psubw %%mm0, %%mm4\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
547 "psubw %%mm0, %%mm5\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
548 "psubw %%mm0, %%mm1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
549 "paddw %0, %%mm4\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
550 "paddw %1, %%mm5\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
551 "paddw %2, %%mm1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
552 "movq %%mm4, %0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
553 "movq %%mm5, %1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
554 "movq %%mm1, %2\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
555 : "=m" (s->tiny), "=m" (s->low), "=m" (s->high)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
556 );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
557
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25626
diff changeset
558 __asm__ volatile(
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
559 "pshufw $0, %2, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
560 "psubusw %%mm7, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
561 "pcmpeqw %%mm6, %%mm0\n\t" /* 0 if below sad_thres */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
562 "pand %%mm7, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
563 "movq %%mm0, %%mm1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
564 "punpcklwd %%mm6, %%mm0\n\t" /* sad even, odd */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
565 "punpckhwd %%mm6, %%mm1\n\t" /* sad noise, temp */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
566 "paddd %0, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
567 "paddd %1, %%mm1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
568 "movq %%mm0, %0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
569 "movq %%mm1, %1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
570 : "=m" (s->sad.even), "=m" (s->sad.noise)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
571 : "m" (p->sad_thres)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
572 );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
573 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
574
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25626
diff changeset
575 __asm__ volatile(
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
576 "movq %%mm7, (%1)\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
577 PMAXUW((%0), %%mm7)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
578 "movq %%mm7, (%0)\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
579 "emms"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
580 : : "r" (&s->max), "r" (&tm), "X" (s->max)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
581 : "memory"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
582 );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
583 #ifdef DEBUG
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
584 if (1) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
585 struct metrics cm;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
586 a -= 7*as;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
587 b -= 7*bs;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
588 cm = block_metrics_c(a, b, as, bs, 4, p, &ts);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
589 if (!MEQ(tm, cm))
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
590 mp_msg(MSGT_VFILTER, MSGL_WARN, "Bad metrics\n");
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
591 if (s) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
592 # define CHECK(X) if (!MEQ(s->X, ts.X)) \
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
593 mp_msg(MSGT_VFILTER, MSGL_WARN, "Bad " #X "\n");
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
594 CHECK(tiny);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
595 CHECK(low);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
596 CHECK(high);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
597 CHECK(sad);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
598 CHECK(max);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
599 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
600 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
601 #endif
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
602 #endif
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
603 return tm;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
604 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
605
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
606 static inline int
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
607 dint_copy_line_mmx2(unsigned char *dst, unsigned char *a, long bos,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
608 long cos, int ds, int ss, int w, int t)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
609 {
28292
d6001126678f More #ifdef HAVE_MMX etc. missed by earlier search.
reimar
parents: 27754
diff changeset
610 #if !HAVE_MMX
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
611 mp_msg(MSGT_VFILTER, MSGL_FATAL, "dint_copy_line_mmx2: internal error\n");
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
612 return 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
613 #else
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
614 unsigned long len = (w+7) >> 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
615 int ret;
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25626
diff changeset
616 __asm__ volatile (
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
617 "pxor %%mm6, %%mm6 \n\t" /* deinterlaced pixel counter */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
618 "movd %0, %%mm7 \n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
619 "punpcklbw %%mm7, %%mm7 \n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
620 "punpcklwd %%mm7, %%mm7 \n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
621 "punpckldq %%mm7, %%mm7 \n\t" /* mm7 = threshold */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
622 : /* no output */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
623 : "rm" (t)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
624 );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
625 do {
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25626
diff changeset
626 __asm__ volatile (
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
627 "movq (%0), %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
628 "movq (%0,%3,2), %%mm1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
629 "movq %%mm0, (%2)\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
630 "pmaxub %%mm1, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
631 "pavgb (%0), %%mm1\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
632 "psubusb %%mm1, %%mm0\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
633 "paddusb %%mm7, %%mm0\n\t" /* mm0 = max-avg+thr */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
634 "movq (%0,%1), %%mm2\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
635 "movq (%0,%5), %%mm3\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
636 "movq %%mm2, %%mm4\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
637 PDIFFUBT(%%mm1, %%mm2, %%mm5)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
638 PDIFFUBT(%%mm1, %%mm3, %%mm5)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
639 "pminub %%mm2, %%mm3\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
640 "pcmpeqb %%mm3, %%mm2\n\t" /* b = min */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
641 "pand %%mm2, %%mm4\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
642 "pandn (%0,%5), %%mm2\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
643 "por %%mm4, %%mm2\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
644 "pminub %%mm0, %%mm3\n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
645 "pcmpeqb %%mm0, %%mm3\n\t" /* set to 1s if >= threshold */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
646 "psubb %%mm3, %%mm6\n\t" /* count pixels above thr. */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
647 "pand %%mm3, %%mm1 \n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
648 "pandn %%mm2, %%mm3 \n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
649 "por %%mm3, %%mm1 \n\t" /* avg if >= threshold */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
650 "movq %%mm1, (%2,%4) \n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
651 : /* no output */
29040
963f578121c6 Use x86_reg instead of long in several video filters to fix compilation on MinGW64.
reimar
parents: 28335
diff changeset
652 : "r" (a), "r" ((x86_reg)bos), "r" ((x86_reg)dst), "r" ((x86_reg)ss), "r" ((x86_reg)ds), "r" ((x86_reg)cos)
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
653 );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
654 a += 8;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
655 dst += 8;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
656 } while (--len);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
657
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 25626
diff changeset
658 __asm__ volatile ("pxor %%mm7, %%mm7 \n\t"
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
659 "psadbw %%mm6, %%mm7 \n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
660 "movd %%mm7, %0 \n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
661 "emms \n\t"
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
662 : "=r" (ret)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
663 );
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
664 return ret;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
665 #endif
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
666 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
667
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
668 static inline int
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
669 dint_copy_line(unsigned char *dst, unsigned char *a, long bos,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
670 long cos, int ds, int ss, int w, int t)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
671 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
672 unsigned long len = ((unsigned long)w+sizeof(cmmx_t)-1) / sizeof(cmmx_t);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
673 cmmx_t dint_count = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
674 cmmx_t thr;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
675 t |= t << 8;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
676 thr = t | (t << 16);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
677 if (sizeof(cmmx_t) > 4)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
678 thr |= thr << (sizeof(cmmx_t)*4);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
679 do {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
680 cmmx_t e = *(cmmx_t*)a;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
681 cmmx_t ne = *(cmmx_t*)(a+2*ss);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
682 cmmx_t o = *(cmmx_t*)(a+bos);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
683 cmmx_t oo = *(cmmx_t*)(a+cos);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
684 cmmx_t maxe = pmaxub(e, ne);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
685 cmmx_t avge = pavgb(e, ne);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
686 cmmx_t max_diff = maxe - avge + thr; /* 0<=max-avg<128, thr<128 */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
687 cmmx_t diffo = pdiffub(avge, o);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
688 cmmx_t diffoo = pdiffub(avge, oo);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
689 cmmx_t diffcmp = pcmpgtub(diffo, diffoo);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
690 cmmx_t bo = ((oo ^ o) & diffcmp) ^ o;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
691 cmmx_t diffbo = ((diffoo ^ diffo) & diffcmp) ^ diffo;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
692 cmmx_t above_thr = ~pcmpgtub(max_diff, diffbo);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
693 cmmx_t bo_or_avg = ((avge ^ bo) & above_thr) ^ bo;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
694 dint_count += above_thr & ONE_BYTES;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
695 *(cmmx_t*)(dst) = e;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
696 *(cmmx_t*)(dst+ds) = bo_or_avg;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
697 a += sizeof(cmmx_t);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
698 dst += sizeof(cmmx_t);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
699 } while (--len);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
700 return psumbw(dint_count);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
701 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
702
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
703 static int
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
704 dint_copy_plane(unsigned char *d, unsigned char *a, unsigned char *b,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
705 unsigned char *c, unsigned long w, unsigned long h,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
706 unsigned long ds, unsigned long ss, unsigned long threshold,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
707 long field, long mmx2)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
708 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
709 unsigned long ret = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
710 long bos = b - a;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
711 long cos = c - a;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
712 if (field) {
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 17906
diff changeset
713 fast_memcpy(d, b, w);
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
714 h--;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
715 d += ds;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
716 a += ss;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
717 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
718 bos += ss;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
719 cos += ss;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
720 while (h > 2) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
721 if (threshold >= 128) {
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 17906
diff changeset
722 fast_memcpy(d, a, w);
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 17906
diff changeset
723 fast_memcpy(d+ds, a+bos, w);
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
724 } else if (mmx2 == 1) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
725 ret += dint_copy_line_mmx2(d, a, bos, cos, ds, ss, w, threshold);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
726 } else
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
727 ret += dint_copy_line(d, a, bos, cos, ds, ss, w, threshold);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
728 h -= 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
729 d += 2*ds;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
730 a += 2*ss;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
731 }
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 17906
diff changeset
732 fast_memcpy(d, a, w);
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
733 if (h == 2)
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 17906
diff changeset
734 fast_memcpy(d+ds, a+bos, w);
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
735 return ret;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
736 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
737
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
738 static void
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
739 copy_merge_fields(struct vf_priv_s *p, mp_image_t *dmpi,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
740 unsigned char **old, unsigned char **new, unsigned long show)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
741 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
742 unsigned long threshold = 256;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
743 unsigned long field = p->swapped;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
744 unsigned long dint_pixels = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
745 unsigned char **other = old;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
746 if (show >= 12 || !(show & 3))
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
747 show >>= 2, other = new, new = old;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
748 if (show <= 2) { /* Single field: de-interlace */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
749 threshold = p->dint_thres;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
750 field ^= show & 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
751 old = new;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
752 } else if (show == 3)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
753 old = new;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
754 else
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
755 field ^= 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
756 dint_pixels +=dint_copy_plane(dmpi->planes[0], old[0], new[0],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
757 other[0], p->w, p->h, dmpi->stride[0],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
758 p->stride, threshold, field, p->mmx2);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
759 if (dmpi->flags & MP_IMGFLAG_PLANAR) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
760 if (p->luma_only)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
761 old = new, other = new;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
762 else
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
763 threshold = threshold/2 + 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
764 field ^= p->chroma_swapped;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
765 dint_copy_plane(dmpi->planes[1], old[1], new[1],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
766 other[1], p->cw, p->ch, dmpi->stride[1],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
767 p->chroma_stride, threshold, field, p->mmx2);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
768 dint_copy_plane(dmpi->planes[2], old[2], new[2],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
769 other[2], p->cw, p->ch, dmpi->stride[2],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
770 p->chroma_stride, threshold, field, p->mmx2);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
771 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
772 if (dint_pixels > 0 && p->verbose)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
773 mp_msg(MSGT_VFILTER,MSGL_INFO,"Deinterlaced %lu pixels\n",dint_pixels);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
774 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
775
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
776 static void diff_planes(struct vf_priv_s *p, struct frame_stats *s,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
777 unsigned char *of, unsigned char *nf,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
778 int w, int h, int os, int ns, int swapped)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
779 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
780 int i, y;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
781 int align = -(long)nf & 7;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
782 of += align;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
783 nf += align;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
784 w -= align;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
785 if (swapped)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
786 of -= os, nf -= ns;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
787 i = (h*3 >> 7) & ~1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
788 of += i*os + 8;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
789 nf += i*ns + 8;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
790 h -= i;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
791 w -= 16;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
792
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
793 memset(s, 0, sizeof(*s));
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
794
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
795 for (y = (h-8) >> 3; y; y--) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
796 if (p->mmx2 == 1) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
797 for (i = 0; i < w; i += 8)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
798 block_metrics_mmx2(of+i, nf+i, os, ns, 4, p, s);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
799 } else if (p->mmx2 == 2) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
800 for (i = 0; i < w; i += 8)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
801 block_metrics_3dnow(of+i, nf+i, os, ns, 4, p, s);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
802 } else if (p->fast > 3) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
803 for (i = 0; i < w; i += 8)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
804 block_metrics_faster_c(of+i, nf+i, os, ns, 4, p, s);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
805 } else if (p->fast > 1) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
806 for (i = 0; i < w; i += 8)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
807 block_metrics_fast_c(of+i, nf+i, os, ns, 4, p, s);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
808 } else {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
809 for (i = 0; i < w; i += 8)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
810 block_metrics_c(of+i, nf+i, os, ns, 4, p, s);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
811 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
812 of += 8*os;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
813 nf += 8*ns;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
814 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
815 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
816
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
817 #define METRICS(X) (X).even, (X).odd, (X).noise, (X).temp
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
818
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
819 static void diff_fields(struct vf_priv_s *p, struct frame_stats *s,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
820 unsigned char **old, unsigned char **new)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
821 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
822 diff_planes(p, s, old[0], new[0], p->w, p->h,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
823 p->stride, p->stride, p->swapped);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
824 s->sad.even = (s->sad.even * 16ul) / s->num_blocks;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
825 s->sad.odd = (s->sad.odd * 16ul) / s->num_blocks;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
826 s->sad.noise = (s->sad.noise * 16ul) / s->num_blocks;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
827 s->sad.temp = (s->sad.temp * 16ul) / s->num_blocks;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
828 if (p->verbose)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
829 mp_msg(MSGT_VFILTER, MSGL_INFO, "%lu%c M:%d/%d/%d/%d - %d, "
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
830 "t:%d/%d/%d/%d, l:%d/%d/%d/%d, h:%d/%d/%d/%d, bg:%d/%d/%d/%d, "
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
831 "2x:%d/%d/%d/%d, sad:%d/%d/%d/%d, lil:%d, hil:%d, ios:%.1f\n",
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
832 p->inframes, p->chflag, METRICS(s->max), s->num_blocks,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
833 METRICS(s->tiny), METRICS(s->low), METRICS(s->high),
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
834 METRICS(s->bigger), METRICS(s->twox), METRICS(s->sad),
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
835 s->interlaced_low, s->interlaced_high,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
836 p->iosync / (double) p->in_inc);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
837 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
838
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
839 static const char *parse_args(struct vf_priv_s *p, const char *args)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
840 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
841 args--;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
842 while (args && *++args &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
843 (sscanf(args, "io=%lu:%lu", &p->out_dec, &p->in_inc) == 2 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
844 sscanf(args, "diff_thres=%hu", &p->thres.even ) == 1 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
845 sscanf(args, "comb_thres=%hu", &p->thres.noise) == 1 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
846 sscanf(args, "sad_thres=%lu", &p->sad_thres ) == 1 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
847 sscanf(args, "dint_thres=%lu", &p->dint_thres ) == 1 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
848 sscanf(args, "fast=%u", &p->fast ) == 1 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
849 sscanf(args, "mmx2=%lu", &p->mmx2 ) == 1 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
850 sscanf(args, "luma_only=%u", &p->luma_only ) == 1 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
851 sscanf(args, "verbose=%u", &p->verbose ) == 1 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
852 sscanf(args, "crop=%lu:%lu:%lu:%lu", &p->w,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
853 &p->h, &p->crop_x, &p->crop_y) == 4))
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
854 args = strchr(args, '/');
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
855 return args;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
856 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
857
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
858 static unsigned long gcd(unsigned long x, unsigned long y)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
859 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
860 unsigned long t;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
861 if (x > y)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
862 t = x, x = y, y = t;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
863
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
864 while (x) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
865 t = y % x;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
866 y = x;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
867 x = t;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
868 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
869 return y;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
870 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
871
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
872 static void init(struct vf_priv_s *p, mp_image_t *mpi)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
873 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
874 unsigned long i;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
875 unsigned long plane_size, chroma_plane_size;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
876 unsigned char *plane;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
877 unsigned long cos, los;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
878 p->crop_cx = p->crop_x >> mpi->chroma_x_shift;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
879 p->crop_cy = p->crop_y >> mpi->chroma_y_shift;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
880 if (mpi->flags & MP_IMGFLAG_ACCEPT_STRIDE) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
881 p->stride = (mpi->w + 15) & ~15;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
882 p->chroma_stride = p->stride >> mpi->chroma_x_shift;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
883 } else {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
884 p->stride = mpi->width;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
885 p->chroma_stride = mpi->chroma_width;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
886 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
887 p->cw = p->w >> mpi->chroma_x_shift;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
888 p->ch = p->h >> mpi->chroma_y_shift;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
889 p->nplanes = 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
890 p->static_idx = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
891 p->temp_idx = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
892 p->old_planes = p->planes[0];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
893 plane_size = mpi->h * p->stride;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
894 chroma_plane_size = mpi->flags & MP_IMGFLAG_PLANAR ?
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
895 mpi->chroma_height * p->chroma_stride : 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
896 p->memory_allocated =
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
897 malloc(NUM_STORED * (plane_size+2*chroma_plane_size) +
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
898 8*p->chroma_stride + 4096);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
899 /* align to page boundary */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
900 plane = p->memory_allocated + (-(long)p->memory_allocated & 4095);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
901 memset(plane, 0, NUM_STORED * plane_size);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
902 los = p->crop_x + p->crop_y * p->stride;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
903 cos = p->crop_cx + p->crop_cy * p->chroma_stride;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
904 for (i = 0; i != NUM_STORED; i++, plane += plane_size) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
905 p->planes[i][0] = plane;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
906 p->planes[NUM_STORED + i][0] = plane + los;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
907 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
908 if (mpi->flags & MP_IMGFLAG_PLANAR) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
909 p->nplanes = 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
910 memset(plane, 0x80, NUM_STORED * 2 * chroma_plane_size);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
911 for (i = 0; i != NUM_STORED; i++) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
912 p->planes[i][1] = plane;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
913 p->planes[NUM_STORED + i][1] = plane + cos;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
914 plane += chroma_plane_size;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
915 p->planes[i][2] = plane;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
916 p->planes[NUM_STORED + i][2] = plane + cos;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
917 plane += chroma_plane_size;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
918 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
919 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
920 p->out_dec <<= 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
921 i = gcd(p->in_inc, p->out_dec);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
922 p->in_inc /= i;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
923 p->out_dec /= i;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
924 p->iosync = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
925 p->num_fields = 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
926 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
927
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
928 static inline double get_time(void)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
929 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
930 struct timeval tv;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
931 gettimeofday(&tv, 0);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
932 return tv.tv_sec + tv.tv_usec * 1e-6;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
933 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
934
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
935 static void get_image(struct vf_instance *vf, mp_image_t *mpi)
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
936 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
937 struct vf_priv_s *p = vf->priv;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
938 static unsigned char **planes, planes_idx;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
939
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
940 if (mpi->type == MP_IMGTYPE_STATIC) return;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
941
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
942 if (!p->planes[0][0]) init(p, mpi);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
943
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
944 if (mpi->type == MP_IMGTYPE_TEMP ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
945 (mpi->type == MP_IMGTYPE_IPB && !(mpi->flags & MP_IMGFLAG_READABLE)))
12255
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
946 planes_idx = NUM_STORED/2 + (++p->temp_idx % (NUM_STORED/2));
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
947 else
12255
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
948 planes_idx = ++p->static_idx % (NUM_STORED/2);
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
949 planes = p->planes[planes_idx];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
950 mpi->priv = p->planes[NUM_STORED + planes_idx];
12255
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
951 if (mpi->priv == p->old_planes) {
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
952 unsigned char **old_planes =
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
953 p->planes[NUM_STORED + 2 + (++p->temp_idx & 1)];
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
954 my_memcpy_pic(old_planes[0], p->old_planes[0],
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
955 p->w, p->h, p->stride, p->stride);
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
956 if (mpi->flags & MP_IMGFLAG_PLANAR) {
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
957 my_memcpy_pic(old_planes[1], p->old_planes[1],
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
958 p->cw, p->ch, p->chroma_stride, p->chroma_stride);
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
959 my_memcpy_pic(old_planes[2], p->old_planes[2],
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
960 p->cw, p->ch, p->chroma_stride, p->chroma_stride);
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
961 }
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
962 p->old_planes = old_planes;
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
963 p->num_copies++;
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
964 }
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
965 mpi->planes[0] = planes[0];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
966 mpi->stride[0] = p->stride;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
967 if (mpi->flags & MP_IMGFLAG_PLANAR) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
968 mpi->planes[1] = planes[1];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
969 mpi->planes[2] = planes[2];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
970 mpi->stride[1] = mpi->stride[2] = p->chroma_stride;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
971 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
972 mpi->width = p->stride;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
973
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
974 mpi->flags |= MP_IMGFLAG_DIRECT;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
975 mpi->flags &= ~MP_IMGFLAG_DRAW_CALLBACK;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
976 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
977
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
978 static inline long
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
979 cmpe(unsigned long x, unsigned long y, unsigned long err, unsigned long e)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
980 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
981 long diff = x-y;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
982 long unit = ((x+y+err) >> e);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
983 long ret = (diff > unit) - (diff < -unit);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
984 unit >>= 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
985 return ret + (diff > unit) - (diff < -unit);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
986 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
987
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
988 static unsigned long
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
989 find_breaks(struct vf_priv_s *p, struct frame_stats *s)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
990 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
991 struct frame_stats *ps = &p->stats[(p->inframes-1) & 1];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
992 long notfilm = 5*p->in_inc - p->out_dec;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
993 unsigned long n = s->num_blocks >> 8;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
994 unsigned long sad_comb_cmp = cmpe(s->sad.temp, s->sad.noise, 512, 1);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
995 unsigned long ret = 8;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
996
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
997 if (cmpe(s->sad.temp, s->sad.even, 512, 1) > 0)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
998 mp_msg(MSGT_VFILTER, MSGL_WARN,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
999 "@@@@@@@@ Bottom-first field??? @@@@@@@@\n");
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1000 if (s->sad.temp > 1000 && s->sad.noise > 1000)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1001 return 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1002 if (s->interlaced_high >= 2*n && s->sad.temp > 256 && s->sad.noise > 256)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1003 return 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1004 if (s->high.noise > s->num_blocks/4 && s->sad.noise > 10000 &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1005 s->sad.noise > 2*s->sad.even && s->sad.noise > 2*ps->sad.odd) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1006 // Mid-frame scene change
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1007 if (s->tiny.temp + s->interlaced_low < n ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1008 s->low.temp + s->interlaced_high < n/4 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1009 s->high.temp + s->interlaced_high < n/8 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1010 s->sad.temp < 160)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1011 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1012 return 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1013 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1014 if (s->high.temp > s->num_blocks/4 && s->sad.temp > 10000 &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1015 s->sad.temp > 2*ps->sad.odd && s->sad.temp > 2*ps->sad.even) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1016 // Start frame scene change
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1017 if (s->tiny.noise + s->interlaced_low < n ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1018 s->low.noise + s->interlaced_high < n/4 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1019 s->high.noise + s->interlaced_high < n/8 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1020 s->sad.noise < 160)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1021 return 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1022 return 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1023 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1024 if (sad_comb_cmp == 2)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1025 return 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1026 if (sad_comb_cmp == -2)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1027 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1028
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1029 if (s->tiny.odd > 3*MAX(n,s->tiny.even) + s->interlaced_low)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1030 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1031 if (s->tiny.even > 3*MAX(n,s->tiny.odd)+s->interlaced_low &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1032 (!sad_comb_cmp || (s->low.noise <= n/4 && s->low.temp <= n/4)))
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1033 return 4;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1034
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1035 if (s->sad.noise < 64 && s->sad.temp < 64 &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1036 s->low.noise <= n/2 && s->high.noise <= n/4 &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1037 s->low.temp <= n/2 && s->high.temp <= n/4)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1038 goto still;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1039
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1040 if (s->tiny.temp > 3*MAX(n,s->tiny.noise) + s->interlaced_low)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1041 return 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1042 if (s->tiny.noise > 3*MAX(n,s->tiny.temp) + s->interlaced_low)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1043 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1044
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1045 if (s->low.odd > 3*MAX(n/4,s->low.even) + s->interlaced_high)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1046 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1047 if (s->low.even > 3*MAX(n/4,s->low.odd)+s->interlaced_high &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1048 s->sad.even > 2*s->sad.odd &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1049 (!sad_comb_cmp || (s->low.noise <= n/4 && s->low.temp <= n/4)))
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1050 return 4;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1051
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1052 if (s->low.temp > 3*MAX(n/4,s->low.noise) + s->interlaced_high)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1053 return 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1054 if (s->low.noise > 3*MAX(n/4,s->low.temp) + s->interlaced_high)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1055 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1056
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1057 if (sad_comb_cmp == 1 && s->sad.noise < 64)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1058 return 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1059 if (sad_comb_cmp == -1 && s->sad.temp < 64)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1060 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1061
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1062 if (s->tiny.odd <= n || (s->tiny.noise <= n/2 && s->tiny.temp <= n/2)) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1063 if (s->interlaced_low <= n) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1064 if (p->num_fields == 1)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1065 goto still;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1066 if (s->tiny.even <= n || ps->tiny.noise <= n/2)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1067 /* Still frame */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1068 goto still;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1069 if (s->bigger.even >= 2*MAX(n,s->bigger.odd) + s->interlaced_low)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1070 return 4;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1071 if (s->low.even >= 2*n + s->interlaced_low)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1072 return 4;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1073 goto still;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1074 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1075 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1076 if (s->low.odd <= n/4) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1077 if (s->interlaced_high <= n/4) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1078 if (p->num_fields == 1)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1079 goto still;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1080 if (s->low.even <= n/4)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1081 /* Still frame */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1082 goto still;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1083 if (s->bigger.even >= 2*MAX(n/4,s->bigger.odd)+s->interlaced_high)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1084 return 4;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1085 if (s->low.even >= n/2 + s->interlaced_high)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1086 return 4;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1087 goto still;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1088 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1089 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1090 if (s->bigger.temp > 2*MAX(n,s->bigger.noise) + s->interlaced_low)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1091 return 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1092 if (s->bigger.noise > 2*MAX(n,s->bigger.temp) + s->interlaced_low)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1093 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1094 if (s->bigger.temp > 2*MAX(n,s->bigger.noise) + s->interlaced_high)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1095 return 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1096 if (s->bigger.noise > 2*MAX(n,s->bigger.temp) + s->interlaced_high)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1097 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1098 if (s->twox.temp > 2*MAX(n,s->twox.noise) + s->interlaced_high)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1099 return 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1100 if (s->twox.noise > 2*MAX(n,s->twox.temp) + s->interlaced_high)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1101 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1102 if (s->bigger.even > 2*MAX(n,s->bigger.odd) + s->interlaced_low &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1103 s->bigger.temp < n && s->bigger.noise < n)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1104 return 4;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1105 if (s->interlaced_low > MIN(2*n, s->tiny.odd))
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1106 return 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1107 ret = 8 + (1 << (s->sad.temp > s->sad.noise));
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1108 still:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1109 if (p->num_fields == 1 && p->prev_fields == 3 && notfilm >= 0 &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1110 (s->tiny.temp <= s->tiny.noise || s->sad.temp < s->sad.noise+16))
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1111 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1112 if (p->notout < p->num_fields && p->iosync > 2*p->in_inc && notfilm < 0)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1113 notfilm = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1114 if (p->num_fields < 2 ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1115 (p->num_fields == 2 && p->prev_fields == 2 && notfilm < 0))
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1116 return ret;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1117 if (!notfilm && (p->prev_fields&~1) == 2) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1118 if (p->prev_fields + p->num_fields == 5) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1119 if (s->tiny.noise <= s->tiny.temp ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1120 s->low.noise == 0 || s->low.noise < s->low.temp ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1121 s->sad.noise < s->sad.temp+16)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1122 return 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1123 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1124 if (p->prev_fields + p->num_fields == 4) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1125 if (s->tiny.temp <= s->tiny.noise ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1126 s->low.temp == 0 || s->low.temp < s->low.noise ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1127 s->sad.temp < s->sad.noise+16)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1128 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1129 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1130 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1131 if (p->num_fields > 2 &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1132 ps->sad.noise > s->sad.noise && ps->sad.noise > s->sad.temp)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1133 return 4;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1134 return 2 >> (s->sad.noise > s->sad.temp);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1135 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1136
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1137 #define ITOC(X) (!(X) ? ' ' : (X) + ((X)>9 ? 'a'-10 : '0'))
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1138
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
1139 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1140 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1141 mp_image_t *dmpi;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1142 struct vf_priv_s *p = vf->priv;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1143 unsigned char **planes, **old_planes;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1144 struct frame_stats *s = &p->stats[p->inframes & 1];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1145 struct frame_stats *ps = &p->stats[(p->inframes-1) & 1];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1146 int swapped = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1147 const int flags = mpi->fields;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1148 int breaks, prev;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1149 int show_fields = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1150 int dropped_fields = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1151 double start_time, diff_time;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1152 char prev_chflag = p->chflag;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1153 int keep_rate;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1154
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1155 if (!p->planes[0][0]) init(p, mpi);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1156
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1157 old_planes = p->old_planes;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1158
12255
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
1159 if ((mpi->flags & MP_IMGFLAG_DIRECT) && mpi->priv) {
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1160 planes = mpi->priv;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1161 mpi->priv = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1162 } else {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1163 planes = p->planes[2 + (++p->temp_idx & 1)];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1164 my_memcpy_pic(planes[0],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1165 mpi->planes[0] + p->crop_x + p->crop_y * mpi->stride[0],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1166 p->w, p->h, p->stride, mpi->stride[0]);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1167 if (mpi->flags & MP_IMGFLAG_PLANAR) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1168 my_memcpy_pic(planes[1],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1169 mpi->planes[1] + p->crop_cx + p->crop_cy * mpi->stride[1],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1170 p->cw, p->ch, p->chroma_stride, mpi->stride[1]);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1171 my_memcpy_pic(planes[2],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1172 mpi->planes[2] + p->crop_cx + p->crop_cy * mpi->stride[2],
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1173 p->cw, p->ch, p->chroma_stride, mpi->stride[2]);
12255
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
1174 p->num_copies++;
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1175 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1176 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1177
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1178 p->old_planes = planes;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1179 p->chflag = ';';
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1180 if (flags & MP_IMGFIELD_ORDERED) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1181 swapped = !(flags & MP_IMGFIELD_TOP_FIRST);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1182 p->chflag = (flags & MP_IMGFIELD_REPEAT_FIRST ? '|' :
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1183 flags & MP_IMGFIELD_TOP_FIRST ? ':' : '.');
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1184 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1185 p->swapped = swapped;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1186
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1187 start_time = get_time();
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1188 if (p->chflag == '|') {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1189 *s = ppzs;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1190 p->iosync += p->in_inc;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1191 } else if ((p->fast & 1) && prev_chflag == '|')
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1192 *s = pprs;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1193 else
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1194 diff_fields(p, s, old_planes, planes);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1195 diff_time = get_time();
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1196 p->diff_time += diff_time - start_time;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1197 breaks = p->inframes ? find_breaks(p, s) : 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1198 p->inframes++;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1199 keep_rate = 4*p->in_inc == p->out_dec;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1200
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1201 switch (breaks) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1202 case 0:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1203 case 8:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1204 case 9:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1205 case 10:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1206 if (!keep_rate && p->notout < p->num_fields && p->iosync < 2*p->in_inc)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1207 break;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1208 if (p->notout < p->num_fields)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1209 dropped_fields = -2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1210 case 4:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1211 if (keep_rate || p->iosync >= -2*p->in_inc)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1212 show_fields = (4<<p->num_fields)-1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1213 break;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1214 case 3:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1215 if (keep_rate)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1216 show_fields = 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1217 else if (p->iosync > 0) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1218 if (p->notout >= p->num_fields && p->iosync > 2*p->in_inc) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1219 show_fields = 4; /* prev odd only */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1220 if (p->num_fields > 1)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1221 show_fields |= 8; /* + prev even */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1222 } else {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1223 show_fields = 2; /* even only */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1224 if (p->notout >= p->num_fields)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1225 dropped_fields += p->num_fields;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1226 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1227 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1228 break;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1229 case 2:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1230 if (p->iosync <= -3*p->in_inc) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1231 if (p->notout >= p->num_fields)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1232 dropped_fields = p->num_fields;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1233 break;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1234 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1235 if (p->num_fields == 1) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1236 int prevbreak = ps->sad.noise >= 128;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1237 if (p->iosync < 4*p->in_inc) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1238 show_fields = 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1239 dropped_fields = prevbreak;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1240 } else {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1241 show_fields = 4 | (!prevbreak << 3);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1242 if (p->notout < 1 + p->prev_fields)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1243 dropped_fields = -!prevbreak;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1244 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1245 break;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1246 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1247 default:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1248 if (keep_rate)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1249 show_fields = 3 << (breaks & 1);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1250 else if (p->notout >= p->num_fields &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1251 p->iosync >= (breaks == 1 ? -p->in_inc :
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1252 p->in_inc << (p->num_fields == 1))) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1253 show_fields = (1 << (2 + p->num_fields)) - (1<<breaks);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1254 } else {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1255 if (p->notout >= p->num_fields)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1256 dropped_fields += p->num_fields + 2 - breaks;
11623
ecaf7047b6e8 Patch from the author, Zoltan Hidvegi:
rfelker
parents: 11600
diff changeset
1257 if (breaks == 1) {
ecaf7047b6e8 Patch from the author, Zoltan Hidvegi:
rfelker
parents: 11600
diff changeset
1258 if (p->iosync >= 4*p->in_inc)
ecaf7047b6e8 Patch from the author, Zoltan Hidvegi:
rfelker
parents: 11600
diff changeset
1259 show_fields = 6;
ecaf7047b6e8 Patch from the author, Zoltan Hidvegi:
rfelker
parents: 11600
diff changeset
1260 } else if (p->iosync > -3*p->in_inc)
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1261 show_fields = 3; /* odd+even */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1262 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1263 break;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1264 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1265
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1266 show_fields &= 15;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1267 prev = p->prev_fields;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1268 if (breaks < 8) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1269 if (p->num_fields == 1)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1270 breaks &= ~4;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1271 if (breaks)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1272 p->num_breaks++;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1273 if (breaks == 3)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1274 p->prev_fields = p->num_fields = 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1275 else if (breaks) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1276 p->prev_fields = p->num_fields + (breaks==1) - (breaks==4);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1277 p->num_fields = breaks - (breaks == 4) + (p->chflag == '|');
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1278 } else
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1279 p->num_fields += 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1280 } else
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1281 p->num_fields += 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1282
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1283 p->iosync += 4 * p->in_inc;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1284 if (p->chflag == '|')
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1285 p->iosync += p->in_inc;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1286
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1287 if (show_fields) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1288 p->iosync -= p->out_dec;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1289 p->notout = !(show_fields & 1) + !(show_fields & 3);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1290 if (((show_fields & 3) == 3 &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1291 (s->low.noise + s->interlaced_low < (s->num_blocks>>8) ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1292 s->sad.noise < 160)) ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1293 ((show_fields & 12) == 12 &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1294 (ps->low.noise + ps->interlaced_low < (s->num_blocks>>8) ||
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1295 ps->sad.noise < 160))) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1296 p->export_count++;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1297 dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_EXPORT,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1298 MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1299 p->w, p->h);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1300 if ((show_fields & 3) != 3) planes = old_planes;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1301 dmpi->planes[0] = planes[0];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1302 dmpi->stride[0] = p->stride;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1303 dmpi->width = mpi->width;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1304 if (mpi->flags & MP_IMGFLAG_PLANAR) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1305 dmpi->planes[1] = planes[1];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1306 dmpi->planes[2] = planes[2];
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1307 dmpi->stride[1] = p->chroma_stride;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1308 dmpi->stride[2] = p->chroma_stride;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1309 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1310 } else {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1311 p->merge_count++;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1312 dmpi = vf_get_image(vf->next, mpi->imgfmt,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1313 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1314 p->w, p->h);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1315 copy_merge_fields(p, dmpi, old_planes, planes, show_fields);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1316 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1317 p->outframes++;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1318 } else
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1319 p->notout += 2;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1320
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1321 if (p->verbose)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1322 mp_msg(MSGT_VFILTER, MSGL_INFO, "%lu %lu: %x %c %c %lu%s%s%c%s\n",
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1323 p->inframes, p->outframes,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1324 breaks, breaks<8 && breaks>0 ? (int) p->prev_fields+'0' : ' ',
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1325 ITOC(show_fields),
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1326 p->num_breaks, 5*p->in_inc == p->out_dec && breaks<8 &&
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1327 breaks>0 && ((prev&~1)!=2 || prev+p->prev_fields!=5) ?
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1328 " ######## bad telecine ########" : "",
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1329 dropped_fields ? " ======== dropped ":"", ITOC(dropped_fields),
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1330 !show_fields || (show_fields & (show_fields-1)) ?
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1331 "" : " @@@@@@@@@@@@@@@@@");
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1332
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1333 p->merge_time += get_time() - diff_time;
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
1334 return show_fields ? vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE) : 0;
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1335 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1336
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
1337 static int query_format(struct vf_instance *vf, unsigned int fmt)
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1338 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1339 /* FIXME - support more formats */
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1340 switch (fmt) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1341 case IMGFMT_YV12:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1342 case IMGFMT_IYUV:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1343 case IMGFMT_I420:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1344 case IMGFMT_411P:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1345 case IMGFMT_422P:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1346 case IMGFMT_444P:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1347 return vf_next_query_format(vf, fmt);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1348 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1349 return 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1350 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1351
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
1352 static int config(struct vf_instance *vf,
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1353 int width, int height, int d_width, int d_height,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1354 unsigned int flags, unsigned int outfmt)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1355 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1356 unsigned long cxm = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1357 unsigned long cym = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1358 struct vf_priv_s *p = vf->priv;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1359 // rounding:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1360 if(!IMGFMT_IS_RGB(outfmt) && !IMGFMT_IS_BGR(outfmt)){
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1361 switch(outfmt){
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1362 case IMGFMT_444P:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1363 case IMGFMT_Y800:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1364 case IMGFMT_Y8:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1365 break;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1366 case IMGFMT_YVU9:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1367 case IMGFMT_IF09:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1368 cym = 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1369 case IMGFMT_411P:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1370 cxm = 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1371 break;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1372 case IMGFMT_YV12:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1373 case IMGFMT_I420:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1374 case IMGFMT_IYUV:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1375 cym = 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1376 default:
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1377 cxm = 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1378 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1379 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1380 p->chroma_swapped = !!(p->crop_y & (cym+1));
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1381 if (p->w) p->w += p->crop_x & cxm;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1382 if (p->h) p->h += p->crop_y & cym;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1383 p->crop_x &= ~cxm;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1384 p->crop_y &= ~cym;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1385 if (!p->w || p->w > width ) p->w = width;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1386 if (!p->h || p->h > height) p->h = height;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1387 if (p->crop_x + p->w > width ) p->crop_x = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1388 if (p->crop_y + p->h > height) p->crop_y = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1389
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1390 if(!opt_screen_size_x && !opt_screen_size_y){
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1391 d_width = d_width * p->w/width;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1392 d_height = d_height * p->h/height;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1393 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1394 return vf_next_config(vf, p->w, p->h, d_width, d_height, flags, outfmt);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1395 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1396
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
1397 static void uninit(struct vf_instance *vf)
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1398 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1399 struct vf_priv_s *p = vf->priv;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1400 mp_msg(MSGT_VFILTER, MSGL_INFO, "diff_time: %.3f, merge_time: %.3f, "
12255
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
1401 "export: %lu, merge: %lu, copy: %lu\n", p->diff_time, p->merge_time,
2eb20525825f dr bugfix by zoli (author of the filter)
rfelker
parents: 11623
diff changeset
1402 p->export_count, p->merge_count, p->num_copies);
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1403 free(p->memory_allocated);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1404 free(p);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1405 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1406
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 30421
diff changeset
1407 static int vf_open(vf_instance_t *vf, char *args)
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1408 {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1409 struct vf_priv_s *p;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1410 vf->get_image = get_image;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1411 vf->put_image = put_image;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1412 vf->config = config;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1413 vf->query_format = query_format;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1414 vf->uninit = uninit;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1415 vf->default_reqs = VFCAP_ACCEPT_STRIDE;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1416 vf->priv = p = calloc(1, sizeof(struct vf_priv_s));
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1417 p->out_dec = 5;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1418 p->in_inc = 4;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1419 p->thres.noise = 128;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1420 p->thres.even = 128;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1421 p->sad_thres = 64;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1422 p->dint_thres = 4;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1423 p->luma_only = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1424 p->fast = 3;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1425 p->mmx2 = gCpuCaps.hasMMX2 ? 1 : gCpuCaps.has3DNow ? 2 : 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1426 if (args) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1427 const char *args_remain = parse_args(p, args);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1428 if (args_remain) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1429 mp_msg(MSGT_VFILTER, MSGL_FATAL,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1430 "filmdint: unknown suboption: %s\n", args_remain);
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1431 return 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1432 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1433 if (p->out_dec < p->in_inc) {
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1434 mp_msg(MSGT_VFILTER, MSGL_FATAL,
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1435 "filmdint: increasing the frame rate is not supported\n");
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1436 return 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1437 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1438 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1439 if (p->mmx2 > 2)
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1440 p->mmx2 = 0;
28292
d6001126678f More #ifdef HAVE_MMX etc. missed by earlier search.
reimar
parents: 27754
diff changeset
1441 #if !HAVE_MMX
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1442 p->mmx2 = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1443 #endif
28335
31287e75b5d8 HAVE_3DNOW --> HAVE_AMD3DNOW
diego
parents: 28292
diff changeset
1444 #if !HAVE_AMD3DNOW
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1445 p->mmx2 &= 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1446 #endif
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1447 p->thres.odd = p->thres.even;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1448 p->thres.temp = p->thres.noise;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1449 p->diff_time = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1450 p->merge_time = 0;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1451 return 1;
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1452 }
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1453
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 24119
diff changeset
1454 const vf_info_t vf_info_filmdint = {
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1455 "Advanced inverse telecine filer",
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1456 "filmdint",
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1457 "Zoltan Hidvegi",
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1458 "",
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 30421
diff changeset
1459 vf_open,
11600
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1460 NULL
5eb66d37d539 Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff changeset
1461 };