annotate libmpcodecs/vf_halfpack.c @ 18049:77a3b0d11ca5

Limit the number of entires to the amount that does fit into the chunk. the function need rewrite as it assumes quite many things that are not guaranteed by the specifications.
author iive
date Thu, 06 Apr 2006 20:04:02 +0000
parents 20aca9baf5d8
children 7b408d60de9e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7155
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
1 #include <stdio.h>
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
2 #include <stdlib.h>
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
3 #include <string.h>
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
4 #include <inttypes.h>
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
5
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 14794
diff changeset
6 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 14794
diff changeset
7 #include "mp_msg.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 14794
diff changeset
8 #include "cpudetect.h"
7155
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
9
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
10 #include "img_format.h"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
11 #include "mp_image.h"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
12 #include "vf.h"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
13
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 14794
diff changeset
14 #include "libvo/fastmemcpy.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 14794
diff changeset
15 #include "postproc/rgb2rgb.h"
7155
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
16
8870
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
17 struct vf_priv_s {
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
18 int field;
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
19 };
7155
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
20
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
21 #ifdef HAVE_MMX
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
22 static void halfpack_MMX(unsigned char *dst, unsigned char *src[3],
14794
a9f383892015 100l to me: bugfix for negative stride
rfelker
parents: 13720
diff changeset
23 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
24 int w, int h)
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
25 {
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
26 int j;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
27 unsigned char *y1, *y2, *u, *v;
14794
a9f383892015 100l to me: bugfix for negative stride
rfelker
parents: 13720
diff changeset
28 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
29
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
30 y1 = src[0];
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
31 y2 = src[0] + srcstride[0];
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
32 u = src[1];
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
33 v = src[2];
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
34
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
35 dstinc = dststride - 2*w;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
36 yinc = 2*srcstride[0] - w;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
37 uinc = srcstride[1] - w/2;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
38 vinc = srcstride[2] - w/2;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
39
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
40 for (h/=2; h; h--) {
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
41 asm (
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
42 "pxor %%mm0, %%mm0 \n\t"
7167
6cd20773b17e align fix - Bj«Órn Sandell <biorn@dce.chalmers.se>
arpi
parents: 7155
diff changeset
43 ".balign 16 \n\t"
7155
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
44 "1: \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
45 "movq (%0), %%mm1 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
46 "movq (%0), %%mm2 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
47 "movq (%1), %%mm3 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
48 "movq (%1), %%mm4 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
49 "punpcklbw %%mm0, %%mm1 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
50 "punpckhbw %%mm0, %%mm2 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
51 "punpcklbw %%mm0, %%mm3 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
52 "punpckhbw %%mm0, %%mm4 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
53 "paddw %%mm3, %%mm1 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
54 "paddw %%mm4, %%mm2 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
55 "psrlw $1, %%mm1 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
56 "psrlw $1, %%mm2 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
57
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
58 "movq (%2), %%mm3 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
59 "movq (%3), %%mm5 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
60 "punpcklbw %%mm0, %%mm3 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
61 "punpcklbw %%mm0, %%mm5 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
62 "movq %%mm3, %%mm4 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
63 "movq %%mm5, %%mm6 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
64 "punpcklwd %%mm0, %%mm3 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
65 "punpckhwd %%mm0, %%mm4 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
66 "punpcklwd %%mm0, %%mm5 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
67 "punpckhwd %%mm0, %%mm6 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
68 "pslld $8, %%mm3 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
69 "pslld $8, %%mm4 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
70 "pslld $24, %%mm5 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
71 "pslld $24, %%mm6 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
72
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
73 "por %%mm3, %%mm1 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
74 "por %%mm4, %%mm2 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
75 "por %%mm5, %%mm1 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
76 "por %%mm6, %%mm2 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
77
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9593
diff changeset
78 "add $8, %0 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9593
diff changeset
79 "add $8, %1 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9593
diff changeset
80 "add $4, %2 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 9593
diff changeset
81 "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
82 "movq %%mm1, (%8) \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
83 "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
84 "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
85 "decl %9 \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
86 "jnz 1b \n\t"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
87 : "=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
88 : "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
89 : "memory"
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
90 );
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
91 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
92 *dst++ = (*y1++ + *y2++)/2;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
93 *dst++ = *u++;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
94 *dst++ = (*y1++ + *y2++)/2;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
95 *dst++ = *v++;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
96 }
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
97 y1 += yinc;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
98 y2 += yinc;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
99 u += uinc;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
100 v += vinc;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
101 dst += dstinc;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
102 }
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
103 asm volatile ( "emms \n\t" ::: "memory" );
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
104 }
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
105 #endif
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
106
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
107
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
108
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
109 static void halfpack_C(unsigned char *dst, unsigned char *src[3],
14794
a9f383892015 100l to me: bugfix for negative stride
rfelker
parents: 13720
diff changeset
110 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
111 int w, int h)
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
112 {
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
113 int i, j;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
114 unsigned char *y1, *y2, *u, *v;
14794
a9f383892015 100l to me: bugfix for negative stride
rfelker
parents: 13720
diff changeset
115 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
116
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
117 y1 = src[0];
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
118 y2 = src[0] + srcstride[0];
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
119 u = src[1];
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
120 v = src[2];
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
121
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
122 dstinc = dststride - 2*w;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
123 yinc = 2*srcstride[0] - w;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
124 uinc = srcstride[1] - w/2;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
125 vinc = srcstride[2] - w/2;
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 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
128 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
129 *dst++ = (*y1++ + *y2++)>>1;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
130 *dst++ = *u++;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
131 *dst++ = (*y1++ + *y2++)>>1;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
132 *dst++ = *v++;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
133 }
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
134 y1 += yinc;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
135 y2 += yinc;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
136 u += uinc;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
137 v += vinc;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
138 dst += dstinc;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
139 }
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
140 }
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 static void (*halfpack)(unsigned char *dst, unsigned char *src[3],
14794
a9f383892015 100l to me: bugfix for negative stride
rfelker
parents: 13720
diff changeset
143 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
144
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
145
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
146 static int put_image(struct vf_instance_s* 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
147 {
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
148 mp_image_t *dmpi;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
149
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
150 // 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
151 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
152 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
153 mpi->w, mpi->h/2);
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
154
8870
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
155 switch(vf->priv->field) {
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
156 case 0:
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
157 case 1:
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
158 yuv422ptoyuy2(mpi->planes[0] + mpi->stride[0]*vf->priv->field,
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
159 mpi->planes[1], mpi->planes[2], dmpi->planes[0],
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
160 mpi->w, mpi->h/2, mpi->stride[0]*2, mpi->stride[1], dmpi->stride[0]);
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
161 break;
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
162 default:
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
163 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
164 mpi->stride, mpi->w, mpi->h);
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
165 }
7155
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
166
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
167 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
168 }
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
169
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
170 static int config(struct vf_instance_s* vf,
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
171 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
172 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
173 {
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
174 /* FIXME - also support UYVY output? */
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
175 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
176 }
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
177
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
178
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
179 static int query_format(struct vf_instance_s* vf, unsigned int fmt)
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
180 {
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
181 /* 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
182 switch (fmt) {
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
183 case IMGFMT_YV12:
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
184 case IMGFMT_IYUV:
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
185 case IMGFMT_I420:
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
186 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
187 }
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
188 return 0;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
189 }
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
190
8870
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
191 static void uninit(struct vf_instance_s* vf)
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
192 {
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
193 free(vf->priv);
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
194 }
7155
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
195
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
196 static int open(vf_instance_t *vf, char* args)
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
197 {
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
198 vf->config=config;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
199 vf->query_format=query_format;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
200 vf->put_image=put_image;
8870
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
201 vf->uninit=uninit;
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
202
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
203 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
204 vf->priv->field = 2;
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
205 if (args) sscanf(args, "%d", &vf->priv->field);
7538bf7e728d halfpack now takes an optional argument, field, which tells it to keep
rfelker
parents: 7368
diff changeset
206
7155
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
207 halfpack = halfpack_C;
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
208 #ifdef HAVE_MMX
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
209 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
210 #endif
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
211 return 1;
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
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
214 vf_info_t vf_info_halfpack = {
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
215 "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
216 "halfpack",
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
217 "Richard Felker",
66019eb62edc "halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
diff changeset
218 "",
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 8870
diff changeset
219 open,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 8870
diff changeset
220 NULL
7155
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