Mercurial > mplayer.hg
annotate libmpcodecs/vf_halfpack.c @ 31523:7ab5787e625c
configure: Fix detection of SDL backend for vo_gl on OS X
SDL overrides main, and provides a prototype for SDL_main
which uses argc and argv. Since the prototype didn't match
the main() in the test program, it failed to compile, making
the test fail when it should have worked.
author | astrange |
---|---|
date | Wed, 30 Jun 2010 09:27:03 +0000 |
parents | a972c1a4a012 |
children | 53073a44a899 |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30368
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30368
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30368
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30368
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:
30368
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:
30368
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:
30368
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30368
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30368
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:
30368
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:
30368
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:
30368
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30368
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30368
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:
30368
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:
30368
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:
30368
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30368
diff
changeset
|
18 |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
19 #include <stdio.h> |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
20 #include <stdlib.h> |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
21 #include <string.h> |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
22 #include <inttypes.h> |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
23 |
17012 | 24 #include "config.h" |
25 #include "mp_msg.h" | |
26 #include "cpudetect.h" | |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
27 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
28 #include "img_format.h" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
29 #include "mp_image.h" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
30 #include "vf.h" |
30368
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
31 #include "vf_scale.h" |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
32 |
30368
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
33 #include "libswscale/swscale.h" |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
34 #include "fmt-conversion.h" |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
35 |
8870
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
36 struct vf_priv_s { |
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
37 int field; |
30368
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
38 struct SwsContext *ctx; |
8870
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
39 }; |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
40 |
28290 | 41 #if HAVE_MMX |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
42 static void halfpack_MMX(unsigned char *dst, unsigned char *src[3], |
14794 | 43 int dststride, int srcstride[3], |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
44 int w, int h) |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
45 { |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
46 int j; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
47 unsigned char *y1, *y2, *u, *v; |
14794 | 48 int dstinc, yinc, uinc, vinc; |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
49 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
50 y1 = src[0]; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
51 y2 = src[0] + srcstride[0]; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
52 u = src[1]; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
53 v = src[2]; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
54 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
55 dstinc = dststride - 2*w; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
56 yinc = 2*srcstride[0] - w; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
57 uinc = srcstride[1] - w/2; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
58 vinc = srcstride[2] - w/2; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
59 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
60 for (h/=2; h; h--) { |
27754
08d18fe9da52
Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents:
25221
diff
changeset
|
61 __asm__ ( |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
62 "pxor %%mm0, %%mm0 \n\t" |
19372
6334c14b38eb
Replace asmalign.h hack by ASMALIGN cpp macros from config.h.
diego
parents:
18861
diff
changeset
|
63 ASMALIGN(4) |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
64 "1: \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
65 "movq (%0), %%mm1 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
66 "movq (%0), %%mm2 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
67 "movq (%1), %%mm3 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
68 "movq (%1), %%mm4 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
69 "punpcklbw %%mm0, %%mm1 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
70 "punpckhbw %%mm0, %%mm2 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
71 "punpcklbw %%mm0, %%mm3 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
72 "punpckhbw %%mm0, %%mm4 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
73 "paddw %%mm3, %%mm1 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
74 "paddw %%mm4, %%mm2 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
75 "psrlw $1, %%mm1 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
76 "psrlw $1, %%mm2 \n\t" |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28290
diff
changeset
|
77 |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
78 "movq (%2), %%mm3 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
79 "movq (%3), %%mm5 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
80 "punpcklbw %%mm0, %%mm3 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
81 "punpcklbw %%mm0, %%mm5 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
82 "movq %%mm3, %%mm4 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
83 "movq %%mm5, %%mm6 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
84 "punpcklwd %%mm0, %%mm3 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
85 "punpckhwd %%mm0, %%mm4 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
86 "punpcklwd %%mm0, %%mm5 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
87 "punpckhwd %%mm0, %%mm6 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
88 "pslld $8, %%mm3 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
89 "pslld $8, %%mm4 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
90 "pslld $24, %%mm5 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
91 "pslld $24, %%mm6 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
92 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
93 "por %%mm3, %%mm1 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
94 "por %%mm4, %%mm2 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
95 "por %%mm5, %%mm1 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
96 "por %%mm6, %%mm2 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
97 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
9593
diff
changeset
|
98 "add $8, %0 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
9593
diff
changeset
|
99 "add $8, %1 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
9593
diff
changeset
|
100 "add $4, %2 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
9593
diff
changeset
|
101 "add $4, %3 \n\t" |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
102 "movq %%mm1, (%8) \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
103 "movq %%mm2, 8(%8) \n\t" |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
9593
diff
changeset
|
104 "add $16, %8 \n\t" |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
105 "decl %9 \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
106 "jnz 1b \n\t" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
107 : "=r" (y1), "=r" (y2), "=r" (u), "=r" (v) |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
108 : "0" (y1), "1" (y2), "2" (u), "3" (v), "r" (dst), "r" (w/8) |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
109 : "memory" |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
110 ); |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
111 for (j = (w&7)/2; j; j--) { |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
112 *dst++ = (*y1++ + *y2++)/2; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
113 *dst++ = *u++; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
114 *dst++ = (*y1++ + *y2++)/2; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
115 *dst++ = *v++; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
116 } |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
117 y1 += yinc; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
118 y2 += yinc; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
119 u += uinc; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
120 v += vinc; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
121 dst += dstinc; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
122 } |
27754
08d18fe9da52
Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents:
25221
diff
changeset
|
123 __asm__ volatile ( "emms \n\t" ::: "memory" ); |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
124 } |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
125 #endif |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
126 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
127 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
128 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
129 static void halfpack_C(unsigned char *dst, unsigned char *src[3], |
14794 | 130 int dststride, int srcstride[3], |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
131 int w, int h) |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
132 { |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
133 int i, j; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
134 unsigned char *y1, *y2, *u, *v; |
14794 | 135 int dstinc, yinc, uinc, vinc; |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
136 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
137 y1 = src[0]; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
138 y2 = src[0] + srcstride[0]; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
139 u = src[1]; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
140 v = src[2]; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
141 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
142 dstinc = dststride - 2*w; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
143 yinc = 2*srcstride[0] - w; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
144 uinc = srcstride[1] - w/2; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
145 vinc = srcstride[2] - w/2; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
146 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
147 for (i = h/2; i; i--) { |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
148 for (j = w/2; j; j--) { |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
149 *dst++ = (*y1++ + *y2++)>>1; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
150 *dst++ = *u++; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
151 *dst++ = (*y1++ + *y2++)>>1; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
152 *dst++ = *v++; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
153 } |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
154 y1 += yinc; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
155 y2 += yinc; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
156 u += uinc; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
157 v += vinc; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
158 dst += dstinc; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
159 } |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
160 } |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
161 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
162 static void (*halfpack)(unsigned char *dst, unsigned char *src[3], |
14794 | 163 int dststride, int srcstride[3], int w, int h); |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
164 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
165 |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
166 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
167 { |
30368
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
168 const uint8_t *src[MP_MAX_PLANES] = { |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
169 mpi->planes[0] + mpi->stride[0]*vf->priv->field, |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
170 mpi->planes[1], mpi->planes[2], NULL}; |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
171 int src_stride[MP_MAX_PLANES] = {mpi->stride[0]*2, mpi->stride[1], mpi->stride[2], 0}; |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
172 mp_image_t *dmpi; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
173 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
174 // hope we'll get DR buffer: |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
175 dmpi=vf_get_image(vf->next, IMGFMT_YUY2, |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
176 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
177 mpi->w, mpi->h/2); |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
178 |
8870
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
179 switch(vf->priv->field) { |
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
180 case 0: |
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
181 case 1: |
30368
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
182 sws_scale(vf->priv->ctx, src, src_stride, |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
183 0, mpi->h/2, dmpi->planes, dmpi->stride); |
8870
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
184 break; |
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
185 default: |
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
186 halfpack(dmpi->planes[0], mpi->planes, dmpi->stride[0], |
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
187 mpi->stride, mpi->w, mpi->h); |
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
188 } |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
189 |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17012
diff
changeset
|
190 return vf_next_put_image(vf,dmpi, pts); |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
191 } |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
192 |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
193 static int config(struct vf_instance *vf, |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
194 int width, int height, int d_width, int d_height, |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
195 unsigned int flags, unsigned int outfmt) |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
196 { |
30368
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
197 if (vf->priv->field < 2) { |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
198 sws_freeContext(vf->priv->ctx); |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
199 // get unscaled 422p -> yuy2 conversion |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
200 vf->priv->ctx = |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
201 sws_getContext(width, height / 2, PIX_FMT_YUV422P, |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
202 width, height / 2, PIX_FMT_YUYV422, |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
203 SWS_POINT | SWS_PRINT_INFO | get_sws_cpuflags(), |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
204 NULL, NULL, NULL); |
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
205 } |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
206 /* FIXME - also support UYVY output? */ |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
207 return vf_next_config(vf, width, height/2, d_width, d_height, flags, IMGFMT_YUY2); |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
208 } |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
209 |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
210 |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
211 static int query_format(struct vf_instance *vf, unsigned int fmt) |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
212 { |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
213 /* FIXME - really any YUV 4:2:0 input format should work */ |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
214 switch (fmt) { |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
215 case IMGFMT_YV12: |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
216 case IMGFMT_IYUV: |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
217 case IMGFMT_I420: |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
218 return vf_next_query_format(vf,IMGFMT_YUY2); |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
219 } |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
220 return 0; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
221 } |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
222 |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
223 static void uninit(struct vf_instance *vf) |
8870
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
224 { |
30368
9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
reimar
parents:
29263
diff
changeset
|
225 sws_freeContext(vf->priv->ctx); |
8870
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
226 free(vf->priv); |
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
227 } |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
228 |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
30633
diff
changeset
|
229 static int vf_open(vf_instance_t *vf, char *args) |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
230 { |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
231 vf->config=config; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
232 vf->query_format=query_format; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
233 vf->put_image=put_image; |
8870
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
234 vf->uninit=uninit; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28290
diff
changeset
|
235 |
8870
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
236 vf->priv = calloc(1, sizeof (struct vf_priv_s)); |
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
237 vf->priv->field = 2; |
7538bf7e728d
halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents:
7368
diff
changeset
|
238 if (args) sscanf(args, "%d", &vf->priv->field); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28290
diff
changeset
|
239 |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
240 halfpack = halfpack_C; |
28290 | 241 #if HAVE_MMX |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
242 if(gCpuCaps.hasMMX) halfpack = halfpack_MMX; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
243 #endif |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
244 return 1; |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
245 } |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
246 |
25221 | 247 const vf_info_t vf_info_halfpack = { |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
248 "yuv planar 4:2:0 -> packed 4:2:2, half height", |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
249 "halfpack", |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
250 "Richard Felker", |
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
251 "", |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
30633
diff
changeset
|
252 vf_open, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
8870
diff
changeset
|
253 NULL |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff
changeset
|
254 }; |