Mercurial > mplayer.hg
annotate libmpcodecs/vf_scale.c @ 33243:c33f32258d33
Improve cache size spin button.
Set the value shown (start value) to the current cache size, set page
increment to 32 (kBytes) and set page size (which is irrelevant) to zero.
author | ib |
---|---|
date | Mon, 25 Apr 2011 12:38:55 +0000 |
parents | 84a45d5c1102 |
children | e1ee4895e500 |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30367
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30367
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30367
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30367
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:
30367
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:
30367
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:
30367
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30367
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30367
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:
30367
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:
30367
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:
30367
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30367
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30367
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:
30367
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:
30367
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:
30367
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30367
diff
changeset
|
18 |
5522 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <string.h> | |
22 #include <inttypes.h> | |
23 | |
17012 | 24 #include "config.h" |
25 #include "mp_msg.h" | |
26 #include "cpudetect.h" | |
5522 | 27 |
5607 | 28 #include "img_format.h" |
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" |
5522 | 31 #include "vf.h" |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
32 #include "fmt-conversion.h" |
26542
3a2e8ae7c548
Consistently #include mpbswap.h instead of bswap.h everywhere.
diego
parents:
25221
diff
changeset
|
33 #include "mpbswap.h" |
5522 | 34 |
18861 | 35 #include "libswscale/swscale.h" |
10233
35f52ad860a0
vf_scale.h & related cleanup & some small warning fix by dominik
michael
parents:
10140
diff
changeset
|
36 #include "vf_scale.h" |
5522 | 37 |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
38 #include "m_option.h" |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
39 #include "m_struct.h" |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
40 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
41 static struct vf_priv_s { |
5522 | 42 int w,h; |
6542
7af3fcd76d2d
support dropping some chroma src lines for a bit extra speed
michael
parents:
6536
diff
changeset
|
43 int v_chr_drop; |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
13268
diff
changeset
|
44 double param[2]; |
5523 | 45 unsigned int fmt; |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9491
diff
changeset
|
46 struct SwsContext *ctx; |
11700 | 47 struct SwsContext *ctx2; //for interlaced slices only |
7783 | 48 unsigned char* palette; |
11700 | 49 int interlaced; |
17646
168d8eb397f1
no upscale flag so automatic downscaling is possible in mencoder
michael
parents:
17566
diff
changeset
|
50 int noup; |
19172
bae6c99a99cc
vertical scaler with accurate rounding, some people on doom9 can see +-1 errors
michael
parents:
18861
diff
changeset
|
51 int accurate_rnd; |
22027 | 52 } const vf_priv_dflt = { |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
53 -1,-1, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
54 0, |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
13268
diff
changeset
|
55 {SWS_PARAM_DEFAULT, SWS_PARAM_DEFAULT}, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
56 0, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
57 NULL, |
11700 | 58 NULL, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
59 NULL |
5522 | 60 }; |
61 | |
62 //===========================================================================// | |
63 | |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
64 void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
65 |
30662 | 66 static const unsigned int outfmt_list[]={ |
12260
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
67 // YUV: |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
68 IMGFMT_444P, |
30113
bb92638cdb86
Try to put the list of output formats for vf_scale in a more sensible
reimar
parents:
30110
diff
changeset
|
69 IMGFMT_444P16_LE, |
bb92638cdb86
Try to put the list of output formats for vf_scale in a more sensible
reimar
parents:
30110
diff
changeset
|
70 IMGFMT_444P16_BE, |
12260
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
71 IMGFMT_422P, |
30113
bb92638cdb86
Try to put the list of output formats for vf_scale in a more sensible
reimar
parents:
30110
diff
changeset
|
72 IMGFMT_422P16_LE, |
bb92638cdb86
Try to put the list of output formats for vf_scale in a more sensible
reimar
parents:
30110
diff
changeset
|
73 IMGFMT_422P16_BE, |
12260
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
74 IMGFMT_YV12, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
75 IMGFMT_I420, |
30113
bb92638cdb86
Try to put the list of output formats for vf_scale in a more sensible
reimar
parents:
30110
diff
changeset
|
76 IMGFMT_420P16_LE, |
bb92638cdb86
Try to put the list of output formats for vf_scale in a more sensible
reimar
parents:
30110
diff
changeset
|
77 IMGFMT_420P16_BE, |
30115
ad61464d02a7
Add support for YUV format with alpha and fix the codecs.conf entry for vp6a
reimar
parents:
30113
diff
changeset
|
78 IMGFMT_420A, |
12260
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
79 IMGFMT_IYUV, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
80 IMGFMT_YVU9, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
81 IMGFMT_IF09, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
82 IMGFMT_411P, |
14715 | 83 IMGFMT_NV12, |
84 IMGFMT_NV21, | |
12260
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
85 IMGFMT_YUY2, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
86 IMGFMT_UYVY, |
30100 | 87 IMGFMT_440P, |
12475
16e673350486
give Y8 and Y800 lower conversion priority to avoid grayscaled video
reimar
parents:
12260
diff
changeset
|
88 // RGB and grayscale (Y8 and Y800): |
5523 | 89 IMGFMT_BGR32, |
7403 | 90 IMGFMT_RGB32, |
5523 | 91 IMGFMT_BGR24, |
7403 | 92 IMGFMT_RGB24, |
29901
801650929968
Allow vf_scale to output to RGB48, though still prefer the 24 and 32 bit formats.
reimar
parents:
29444
diff
changeset
|
93 IMGFMT_RGB48LE, |
801650929968
Allow vf_scale to output to RGB48, though still prefer the 24 and 32 bit formats.
reimar
parents:
29444
diff
changeset
|
94 IMGFMT_RGB48BE, |
5523 | 95 IMGFMT_BGR16, |
7403 | 96 IMGFMT_RGB16, |
5523 | 97 IMGFMT_BGR15, |
7403 | 98 IMGFMT_RGB15, |
31082
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30959
diff
changeset
|
99 IMGFMT_BGR12, |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30959
diff
changeset
|
100 IMGFMT_RGB12, |
12475
16e673350486
give Y8 and Y800 lower conversion priority to avoid grayscaled video
reimar
parents:
12260
diff
changeset
|
101 IMGFMT_Y800, |
16e673350486
give Y8 and Y800 lower conversion priority to avoid grayscaled video
reimar
parents:
12260
diff
changeset
|
102 IMGFMT_Y8, |
6637 | 103 IMGFMT_BGR8, |
7403 | 104 IMGFMT_RGB8, |
6637 | 105 IMGFMT_BGR4, |
7403 | 106 IMGFMT_RGB4, |
9171 | 107 IMGFMT_BG4B, |
108 IMGFMT_RG4B, | |
6637 | 109 IMGFMT_BGR1, |
110 IMGFMT_RGB1, | |
6188 | 111 0 |
5523 | 112 }; |
113 | |
30367
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
114 /** |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
115 * A list of preferred conversions, in order of preference. |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
116 * This should be used for conversions that e.g. involve no scaling |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
117 * or to stop vf_scale from choosing a conversion that has no |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
118 * fast assembler implementation. |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
119 */ |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
120 static int preferred_conversions[][2] = { |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
121 {IMGFMT_YUY2, IMGFMT_UYVY}, |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
122 {IMGFMT_YUY2, IMGFMT_422P}, |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
123 {IMGFMT_UYVY, IMGFMT_YUY2}, |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
124 {IMGFMT_UYVY, IMGFMT_422P}, |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
125 {IMGFMT_422P, IMGFMT_YUY2}, |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
126 {IMGFMT_422P, IMGFMT_UYVY}, |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
127 {0, 0} |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
128 }; |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
129 |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
130 static unsigned int find_best_out(vf_instance_t *vf, int in_format){ |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
131 unsigned int best=0; |
30367
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
132 int i = -1; |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
133 int j = -1; |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
134 int format = 0; |
11373
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
135 |
5523 | 136 // find the best outfmt: |
30367
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
137 while (1) { |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
138 int ret; |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
139 if (j < 0) { |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
140 format = in_format; |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
141 j = 0; |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
142 } else if (i < 0) { |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
143 while (preferred_conversions[j][0] && |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
144 preferred_conversions[j][0] != in_format) |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
145 j++; |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
146 format = preferred_conversions[j++][1]; |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
147 // switch to standard list |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
148 if (!format) |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
149 i = 0; |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
150 } |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
151 if (i >= 0) |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
152 format = outfmt_list[i++]; |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
153 if (!format) |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
154 break; |
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
155 ret = vf_next_query_format(vf, format); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
156 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
157 mp_msg(MSGT_VFILTER,MSGL_DBG2,"scale: query(%s) -> %d\n",vo_format_name(format),ret&3); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
158 if(ret&VFCAP_CSP_SUPPORTED_BY_HW){ |
11373
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
159 best=format; // no conversion -> bingo! |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
160 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
161 } |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
162 if(ret&VFCAP_CSP_SUPPORTED && !best) |
11373
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
163 best=format; // best with conversion |
5523 | 164 } |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
165 return best; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
166 } |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
167 |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
168 static int config(struct vf_instance *vf, |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
169 int width, int height, int d_width, int d_height, |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
170 unsigned int flags, unsigned int outfmt){ |
30367
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
171 unsigned int best=find_best_out(vf, outfmt); |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
172 int vo_flags; |
6542
7af3fcd76d2d
support dropping some chroma src lines for a bit extra speed
michael
parents:
6536
diff
changeset
|
173 int int_sws_flags=0; |
14924
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
174 int round_w=0, round_h=0; |
26703 | 175 int i; |
6542
7af3fcd76d2d
support dropping some chroma src lines for a bit extra speed
michael
parents:
6536
diff
changeset
|
176 SwsFilter *srcFilter, *dstFilter; |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
177 enum PixelFormat dfmt, sfmt; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
178 |
5523 | 179 if(!best){ |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
180 mp_msg(MSGT_VFILTER,MSGL_WARN,"SwScale: no supported outfmt found :(\n"); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
181 return 0; |
5523 | 182 } |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
183 sfmt = imgfmt2pixfmt(outfmt); |
23478
8fae00da2059
RGB8/BGR8 IMGFMTs are paletted in case of swscale input.
reimar
parents:
23373
diff
changeset
|
184 if (outfmt == IMGFMT_RGB8 || outfmt == IMGFMT_BGR8) sfmt = PIX_FMT_PAL8; |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
185 dfmt = imgfmt2pixfmt(best); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
186 |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
187 vo_flags=vf->next->query_format(vf->next,best); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
188 |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
189 // scaling to dwidth*d_height, if all these TRUE: |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
190 // - option -zoom |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
191 // - no other sw/hw up/down scaling avail. |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
192 // - we're after postproc |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
193 // - user didn't set w:h |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
194 if(!(vo_flags&VFCAP_POSTPROC) && (flags&4) && |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
195 vf->priv->w<0 && vf->priv->h<0){ // -zoom |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
196 int x=(vo_flags&VFCAP_SWSCALE) ? 0 : 1; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
197 if(d_width<width || d_height<height){ |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
198 // downscale! |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
199 if(vo_flags&VFCAP_HWSCALE_DOWN) x=0; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
200 } else { |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
201 // upscale: |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
202 if(vo_flags&VFCAP_HWSCALE_UP) x=0; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
203 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
204 if(x){ |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
205 // user wants sw scaling! (-zoom) |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
206 vf->priv->w=d_width; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
207 vf->priv->h=d_height; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
208 } |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
209 } |
5523 | 210 |
17646
168d8eb397f1
no upscale flag so automatic downscaling is possible in mencoder
michael
parents:
17566
diff
changeset
|
211 if(vf->priv->noup){ |
17674
0f314c38ce57
10l (dont limit dimension components independantly if noup)
michael
parents:
17646
diff
changeset
|
212 if((vf->priv->w > width) + (vf->priv->h > height) >= vf->priv->noup){ |
17646
168d8eb397f1
no upscale flag so automatic downscaling is possible in mencoder
michael
parents:
17566
diff
changeset
|
213 vf->priv->w= width; |
168d8eb397f1
no upscale flag so automatic downscaling is possible in mencoder
michael
parents:
17566
diff
changeset
|
214 vf->priv->h= height; |
17674
0f314c38ce57
10l (dont limit dimension components independantly if noup)
michael
parents:
17646
diff
changeset
|
215 } |
17646
168d8eb397f1
no upscale flag so automatic downscaling is possible in mencoder
michael
parents:
17566
diff
changeset
|
216 } |
168d8eb397f1
no upscale flag so automatic downscaling is possible in mencoder
michael
parents:
17566
diff
changeset
|
217 |
17215 | 218 if (vf->priv->w <= -8) { |
219 vf->priv->w += 8; | |
14924
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
220 round_w = 1; |
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
221 } |
17215 | 222 if (vf->priv->h <= -8) { |
223 vf->priv->h += 8; | |
14924
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
224 round_h = 1; |
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
225 } |
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
226 |
13925
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
227 if (vf->priv->w < -3 || vf->priv->h < -3 || |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
228 (vf->priv->w < -1 && vf->priv->h < -1)) { |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
229 // TODO: establish a direct connection to the user's brain |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
230 // and find out what the heck he thinks MPlayer should do |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
231 // with this nonsense. |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
232 mp_msg(MSGT_VFILTER, MSGL_ERR, "SwScale: EUSERBROKEN Check your parameters, they make no sense!\n"); |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
233 return 0; |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
234 } |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
235 |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
236 if (vf->priv->w == -1) |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
237 vf->priv->w = width; |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
238 if (vf->priv->w == 0) |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
239 vf->priv->w = d_width; |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
240 |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
241 if (vf->priv->h == -1) |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
242 vf->priv->h = height; |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
243 if (vf->priv->h == 0) |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
244 vf->priv->h = d_height; |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
245 |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
246 if (vf->priv->w == -3) |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
247 vf->priv->w = vf->priv->h * width / height; |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
248 if (vf->priv->w == -2) |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
249 vf->priv->w = vf->priv->h * d_width / d_height; |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
250 |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
251 if (vf->priv->h == -3) |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
252 vf->priv->h = vf->priv->w * height / width; |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
253 if (vf->priv->h == -2) |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
254 vf->priv->h = vf->priv->w * d_height / d_width; |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
255 |
14924
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
256 if (round_w) |
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
257 vf->priv->w = ((vf->priv->w + 8) / 16) * 16; |
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
258 if (round_h) |
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
259 vf->priv->h = ((vf->priv->h + 8) / 16) * 16; |
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
260 |
5522 | 261 // calculate the missing parameters: |
6746
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
262 switch(best) { |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
263 case IMGFMT_YV12: /* YV12 needs w & h rounded to 2 */ |
11069 | 264 case IMGFMT_I420: |
265 case IMGFMT_IYUV: | |
14715 | 266 case IMGFMT_NV12: |
267 case IMGFMT_NV21: | |
13925
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
268 vf->priv->h = (vf->priv->h + 1) & ~1; |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
269 case IMGFMT_YUY2: /* YUY2 needs w rounded to 2 */ |
13925
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
270 case IMGFMT_UYVY: |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
271 vf->priv->w = (vf->priv->w + 1) & ~1; |
6746
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
272 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
273 |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6126
diff
changeset
|
274 mp_msg(MSGT_VFILTER,MSGL_DBG2,"SwScale: scaling %dx%d %s to %dx%d %s \n", |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
275 width,height,vo_format_name(outfmt), |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
276 vf->priv->w,vf->priv->h,vo_format_name(best)); |
5526 | 277 |
278 // free old ctx: | |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9491
diff
changeset
|
279 if(vf->priv->ctx) sws_freeContext(vf->priv->ctx); |
11700 | 280 if(vf->priv->ctx2)sws_freeContext(vf->priv->ctx2); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
281 |
5522 | 282 // new swscaler: |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9491
diff
changeset
|
283 sws_getFlagsAndFilterFromCmdLine(&int_sws_flags, &srcFilter, &dstFilter); |
6542
7af3fcd76d2d
support dropping some chroma src lines for a bit extra speed
michael
parents:
6536
diff
changeset
|
284 int_sws_flags|= vf->priv->v_chr_drop << SWS_SRC_V_CHR_DROP_SHIFT; |
19172
bae6c99a99cc
vertical scaler with accurate rounding, some people on doom9 can see +-1 errors
michael
parents:
18861
diff
changeset
|
285 int_sws_flags|= vf->priv->accurate_rnd * SWS_ACCURATE_RND; |
11700 | 286 vf->priv->ctx=sws_getContext(width, height >> vf->priv->interlaced, |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
287 sfmt, |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
288 vf->priv->w, vf->priv->h >> vf->priv->interlaced, |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
289 dfmt, |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
290 int_sws_flags | get_sws_cpuflags(), srcFilter, dstFilter, vf->priv->param); |
11700 | 291 if(vf->priv->interlaced){ |
292 vf->priv->ctx2=sws_getContext(width, height >> 1, | |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
293 sfmt, |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
294 vf->priv->w, vf->priv->h >> 1, |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
295 dfmt, |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
296 int_sws_flags | get_sws_cpuflags(), srcFilter, dstFilter, vf->priv->param); |
11700 | 297 } |
5522 | 298 if(!vf->priv->ctx){ |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
299 // error... |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
300 mp_msg(MSGT_VFILTER,MSGL_WARN,"Couldn't init SwScaler for this setup\n"); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
301 return 0; |
5522 | 302 } |
5523 | 303 vf->priv->fmt=best; |
6060 | 304 |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32489
diff
changeset
|
305 free(vf->priv->palette); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32489
diff
changeset
|
306 vf->priv->palette=NULL; |
7783 | 307 switch(best){ |
22225
345d2866dfcf
add IMGFMT_RGB8 palette init code what moron actually added init code just for half of the formats?!
michael
parents:
22224
diff
changeset
|
308 case IMGFMT_RGB8: { |
345d2866dfcf
add IMGFMT_RGB8 palette init code what moron actually added init code just for half of the formats?!
michael
parents:
22224
diff
changeset
|
309 /* set 332 palette for 8 bpp */ |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
310 vf->priv->palette=malloc(4*256); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
311 for(i=0; i<256; i++){ |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
312 vf->priv->palette[4*i+0]=4*(i>>6)*21; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
313 vf->priv->palette[4*i+1]=4*((i>>3)&7)*9; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
314 vf->priv->palette[4*i+2]=4*((i&7)&7)*9; |
22225
345d2866dfcf
add IMGFMT_RGB8 palette init code what moron actually added init code just for half of the formats?!
michael
parents:
22224
diff
changeset
|
315 vf->priv->palette[4*i+3]=0; |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
316 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
317 break; } |
7783 | 318 case IMGFMT_BGR8: { |
319 /* set 332 palette for 8 bpp */ | |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
320 vf->priv->palette=malloc(4*256); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
321 for(i=0; i<256; i++){ |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
322 vf->priv->palette[4*i+0]=4*(i&3)*21; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
323 vf->priv->palette[4*i+1]=4*((i>>2)&7)*9; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
324 vf->priv->palette[4*i+2]=4*((i>>5)&7)*9; |
22224
79967c519e43
another ridiculous palette bug which has nothing to do with the new palete support in sws
michael
parents:
22219
diff
changeset
|
325 vf->priv->palette[4*i+3]=0; |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
326 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
327 break; } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
328 case IMGFMT_BGR4: |
9171 | 329 case IMGFMT_BG4B: { |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
330 vf->priv->palette=malloc(4*16); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
331 for(i=0; i<16; i++){ |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
332 vf->priv->palette[4*i+0]=4*(i&1)*63; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
333 vf->priv->palette[4*i+1]=4*((i>>1)&3)*21; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
334 vf->priv->palette[4*i+2]=4*((i>>3)&1)*63; |
22224
79967c519e43
another ridiculous palette bug which has nothing to do with the new palete support in sws
michael
parents:
22219
diff
changeset
|
335 vf->priv->palette[4*i+3]=0; |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
336 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
337 break; } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
338 case IMGFMT_RGB4: |
22227
cec1eb5be9e4
palette init code for IMGFMT_RGB4 and IMGFMT_RG4B
michael
parents:
22225
diff
changeset
|
339 case IMGFMT_RG4B: { |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
340 vf->priv->palette=malloc(4*16); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
341 for(i=0; i<16; i++){ |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
342 vf->priv->palette[4*i+0]=4*(i>>3)*63; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
343 vf->priv->palette[4*i+1]=4*((i>>1)&3)*21; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
344 vf->priv->palette[4*i+2]=4*((i&1)&1)*63; |
22227
cec1eb5be9e4
palette init code for IMGFMT_RGB4 and IMGFMT_RG4B
michael
parents:
22225
diff
changeset
|
345 vf->priv->palette[4*i+3]=0; |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
346 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
347 break; } |
7783 | 348 } |
349 | |
13268
125f1b58a325
do not modify d_width and d_height when -xy option was given, otherwise -xy has no effect with e.g. vo_gl
reimar
parents:
12475
diff
changeset
|
350 if(!opt_screen_size_x && !opt_screen_size_y && !(screen_size_xy >= 0.001)){ |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
351 // Compute new d_width and d_height, preserving aspect |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
352 // while ensuring that both are >= output size in pixels. |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
353 if (vf->priv->h * d_width > vf->priv->w * d_height) { |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
354 d_width = vf->priv->h * d_width / d_height; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
355 d_height = vf->priv->h; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
356 } else { |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
357 d_height = vf->priv->w * d_height / d_width; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
358 d_width = vf->priv->w; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
359 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
360 //d_width=d_width*vf->priv->w/width; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
361 //d_height=d_height*vf->priv->h/height; |
6060 | 362 } |
5525 | 363 return vf_next_config(vf,vf->priv->w,vf->priv->h,d_width,d_height,flags,best); |
5522 | 364 } |
365 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
366 static void start_slice(struct vf_instance *vf, mp_image_t *mpi){ |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
367 // printf("start_slice called! flag=%d\n",mpi->flags&MP_IMGFLAG_DRAW_CALLBACK); |
9491 | 368 if(!(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)) return; // shouldn't happen |
369 // they want slices!!! allocate the buffer. | |
10140
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10022
diff
changeset
|
370 mpi->priv=vf->dmpi=vf_get_image(vf->next,vf->priv->fmt, |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
371 // mpi->type, mpi->flags & (~MP_IMGFLAG_DRAW_CALLBACK), |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
372 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE, |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
373 vf->priv->w, vf->priv->h); |
9491 | 374 } |
375 | |
29064
67c256364220
Consistently use MP_MAX_PLANES as size for plane pointer/stride arrays in libmpcodecs.
reimar
parents:
28299
diff
changeset
|
376 static void scale(struct SwsContext *sws1, struct SwsContext *sws2, uint8_t *src[MP_MAX_PLANES], int src_stride[MP_MAX_PLANES], |
67c256364220
Consistently use MP_MAX_PLANES as size for plane pointer/stride arrays in libmpcodecs.
reimar
parents:
28299
diff
changeset
|
377 int y, int h, uint8_t *dst[MP_MAX_PLANES], int dst_stride[MP_MAX_PLANES], int interlaced){ |
30116
f2d9ce0a6b28
Also pass alpha plane to swscale, avoids crashes when converting between
reimar
parents:
30115
diff
changeset
|
378 uint8_t *src2[MP_MAX_PLANES]={src[0], src[1], src[2], src[3]}; |
29401
f01023c524c3
Replace WORDS_BIGENDIAN by HAVE_BIGENDIAN in all internal code.
diego
parents:
29263
diff
changeset
|
379 #if HAVE_BIGENDIAN |
22228 | 380 uint32_t pal2[256]; |
381 if (src[1] && !src[2]){ | |
382 int i; | |
383 for(i=0; i<256; i++) | |
384 pal2[i]= bswap_32(((uint32_t*)src[1])[i]); | |
385 src2[1]= pal2; | |
386 } | |
387 #endif | |
388 | |
11700 | 389 if(interlaced){ |
390 int i; | |
30116
f2d9ce0a6b28
Also pass alpha plane to swscale, avoids crashes when converting between
reimar
parents:
30115
diff
changeset
|
391 uint8_t *dst2[MP_MAX_PLANES]={dst[0], dst[1], dst[2], dst[3]}; |
f2d9ce0a6b28
Also pass alpha plane to swscale, avoids crashes when converting between
reimar
parents:
30115
diff
changeset
|
392 int src_stride2[MP_MAX_PLANES]={2*src_stride[0], 2*src_stride[1], 2*src_stride[2], 2*src_stride[3]}; |
f2d9ce0a6b28
Also pass alpha plane to swscale, avoids crashes when converting between
reimar
parents:
30115
diff
changeset
|
393 int dst_stride2[MP_MAX_PLANES]={2*dst_stride[0], 2*dst_stride[1], 2*dst_stride[2], 2*dst_stride[3]}; |
11700 | 394 |
30150
16c71b965952
Replace deprecated sws_scale_ordered usages by sws_scale (which does the same).
reimar
parents:
30117
diff
changeset
|
395 sws_scale(sws1, src2, src_stride2, y>>1, h>>1, dst2, dst_stride2); |
30117 | 396 for(i=0; i<MP_MAX_PLANES; i++){ |
11700 | 397 src2[i] += src_stride[i]; |
398 dst2[i] += dst_stride[i]; | |
399 } | |
30150
16c71b965952
Replace deprecated sws_scale_ordered usages by sws_scale (which does the same).
reimar
parents:
30117
diff
changeset
|
400 sws_scale(sws2, src2, src_stride2, y>>1, h>>1, dst2, dst_stride2); |
11700 | 401 }else{ |
30150
16c71b965952
Replace deprecated sws_scale_ordered usages by sws_scale (which does the same).
reimar
parents:
30117
diff
changeset
|
402 sws_scale(sws1, src2, src_stride, y, h, dst, dst_stride); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
403 } |
11700 | 404 } |
405 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
406 static void draw_slice(struct vf_instance *vf, |
9491 | 407 unsigned char** src, int* stride, int w,int h, int x, int y){ |
10140
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10022
diff
changeset
|
408 mp_image_t *dmpi=vf->dmpi; |
9491 | 409 if(!dmpi){ |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
410 mp_msg(MSGT_VFILTER,MSGL_FATAL,"vf_scale: draw_slice() called with dmpi=NULL (no get_image?)\n"); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
411 return; |
9491 | 412 } |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
413 // printf("vf_scale::draw_slice() y=%d h=%d\n",y,h); |
11700 | 414 scale(vf->priv->ctx, vf->priv->ctx2, src, stride, y, h, dmpi->planes, dmpi->stride, vf->priv->interlaced); |
9491 | 415 } |
416 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
417 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ |
9491 | 418 mp_image_t *dmpi=mpi->priv; |
5522 | 419 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
420 // printf("vf_scale::put_image(): processing whole frame! dmpi=%p flag=%d\n", |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
421 // dmpi, (mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
422 |
9491 | 423 if(!(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK && dmpi)){ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
424 |
5522 | 425 // hope we'll get DR buffer: |
5523 | 426 dmpi=vf_get_image(vf->next,vf->priv->fmt, |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
427 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE, |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
428 vf->priv->w, vf->priv->h); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
429 |
11700 | 430 scale(vf->priv->ctx, vf->priv->ctx, mpi->planes,mpi->stride,0,mpi->h,dmpi->planes,dmpi->stride, vf->priv->interlaced); |
9491 | 431 } |
432 | |
5527 | 433 if(vf->priv->w==mpi->w && vf->priv->h==mpi->h){ |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
434 // just conversion, no scaling -> keep postprocessing data |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
435 // this way we can apply pp filter to non-yv12 source using scaler |
9934 | 436 vf_clone_mpi_attributes(dmpi, mpi); |
5527 | 437 } |
7783 | 438 |
439 if(vf->priv->palette) dmpi->planes[1]=vf->priv->palette; // export palette! | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
440 |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17674
diff
changeset
|
441 return vf_next_put_image(vf,dmpi, pts); |
5522 | 442 } |
443 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
444 static int control(struct vf_instance *vf, int request, void* data){ |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
445 int *table; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
446 int *inv_table; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
447 int r; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
448 int brightness, contrast, saturation, srcRange, dstRange; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
449 vf_equalizer_t *eq; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
450 |
10632 | 451 if(vf->priv->ctx) |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
452 switch(request){ |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
453 case VFCTRL_GET_EQUALIZER: |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
454 r= sws_getColorspaceDetails(vf->priv->ctx, &inv_table, &srcRange, &table, &dstRange, &brightness, &contrast, &saturation); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
455 if(r<0) break; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
456 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
457 eq = data; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
458 if (!strcmp(eq->item,"brightness")) { |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
459 eq->value = ((brightness*100) + (1<<15))>>16; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
460 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
461 else if (!strcmp(eq->item,"contrast")) { |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
462 eq->value = (((contrast *100) + (1<<15))>>16) - 100; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
463 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
464 else if (!strcmp(eq->item,"saturation")) { |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
465 eq->value = (((saturation*100) + (1<<15))>>16) - 100; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
466 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
467 else |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
468 break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
469 return CONTROL_TRUE; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
470 case VFCTRL_SET_EQUALIZER: |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
471 r= sws_getColorspaceDetails(vf->priv->ctx, &inv_table, &srcRange, &table, &dstRange, &brightness, &contrast, &saturation); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
472 if(r<0) break; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
473 //printf("set %f %f %f\n", brightness/(float)(1<<16), contrast/(float)(1<<16), saturation/(float)(1<<16)); |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
474 eq = data; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
475 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
476 if (!strcmp(eq->item,"brightness")) { |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
477 brightness = (( eq->value <<16) + 50)/100; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
478 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
479 else if (!strcmp(eq->item,"contrast")) { |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
480 contrast = (((eq->value+100)<<16) + 50)/100; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
481 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
482 else if (!strcmp(eq->item,"saturation")) { |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
483 saturation = (((eq->value+100)<<16) + 50)/100; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
484 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
485 else |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
486 break; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
487 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
488 r= sws_setColorspaceDetails(vf->priv->ctx, inv_table, srcRange, table, dstRange, brightness, contrast, saturation); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
489 if(r<0) break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
490 if(vf->priv->ctx2){ |
11700 | 491 r= sws_setColorspaceDetails(vf->priv->ctx2, inv_table, srcRange, table, dstRange, brightness, contrast, saturation); |
492 if(r<0) break; | |
493 } | |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
494 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
495 return CONTROL_TRUE; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
496 default: |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
497 break; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
498 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
499 |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
500 return vf_next_control(vf,request,data); |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
501 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
502 |
5522 | 503 //===========================================================================// |
504 | |
9071 | 505 // supported Input formats: YV12, I420, IYUV, YUY2, UYVY, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8, Y800 |
5523 | 506 |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
507 static int query_format(struct vf_instance *vf, unsigned int fmt){ |
32489
d5dfda231e76
Make scale filter accept all non-hardware-acceleration input formats we know a
reimar
parents:
31082
diff
changeset
|
508 if (!IMGFMT_IS_HWACCEL(fmt) && imgfmt2pixfmt(fmt) != PIX_FMT_NONE) { |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
509 unsigned int best=find_best_out(vf, fmt); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
510 int flags; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
511 if(!best) return 0; // no matching out-fmt |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
512 flags=vf_next_query_format(vf,best); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
513 if(!(flags&(VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW))) return 0; // huh? |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
514 if(fmt!=best) flags&=~VFCAP_CSP_SUPPORTED_BY_HW; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
515 // do not allow scaling, if we are before the PP fliter! |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
516 if(!(flags&VFCAP_POSTPROC)) flags|=VFCAP_SWSCALE; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
517 return flags; |
5523 | 518 } |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
519 return 0; // nomatching in-fmt |
5523 | 520 } |
521 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
522 static void uninit(struct vf_instance *vf){ |
11537 | 523 if(vf->priv->ctx) sws_freeContext(vf->priv->ctx); |
11700 | 524 if(vf->priv->ctx2) sws_freeContext(vf->priv->ctx2); |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32489
diff
changeset
|
525 free(vf->priv->palette); |
11537 | 526 free(vf->priv); |
527 } | |
528 | |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
30421
diff
changeset
|
529 static int vf_open(vf_instance_t *vf, char *args){ |
5522 | 530 vf->config=config; |
9491 | 531 vf->start_slice=start_slice; |
532 vf->draw_slice=draw_slice; | |
5522 | 533 vf->put_image=put_image; |
5526 | 534 vf->query_format=query_format; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
535 vf->control= control; |
11537 | 536 vf->uninit=uninit; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6126
diff
changeset
|
537 mp_msg(MSGT_VFILTER,MSGL_V,"SwScale params: %d x %d (-1=no scaling)\n", |
5522 | 538 vf->priv->w, |
539 vf->priv->h); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
540 |
5522 | 541 return 1; |
542 } | |
543 | |
9975 | 544 //global sws_flags from the command line |
545 int sws_flags=2; | |
546 | |
547 //global srcFilter | |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
548 static SwsFilter *src_filter= NULL; |
9975 | 549 |
550 float sws_lum_gblur= 0.0; | |
551 float sws_chr_gblur= 0.0; | |
552 int sws_chr_vshift= 0; | |
553 int sws_chr_hshift= 0; | |
554 float sws_chr_sharpen= 0.0; | |
555 float sws_lum_sharpen= 0.0; | |
556 | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17215
diff
changeset
|
557 int get_sws_cpuflags(void){ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
558 return |
9975 | 559 (gCpuCaps.hasMMX ? SWS_CPU_CAPS_MMX : 0) |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
560 | (gCpuCaps.hasMMX2 ? SWS_CPU_CAPS_MMX2 : 0) |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
561 | (gCpuCaps.has3DNow ? SWS_CPU_CAPS_3DNOW : 0) |
12017
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11700
diff
changeset
|
562 | (gCpuCaps.hasAltiVec ? SWS_CPU_CAPS_ALTIVEC : 0); |
9975 | 563 } |
564 | |
565 void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam) | |
566 { | |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
567 static int firstTime=1; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
568 *flags=0; |
9975 | 569 |
28290 | 570 #if ARCH_X86 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
571 if(gCpuCaps.hasMMX) |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
572 __asm__ volatile("emms\n\t"::: "memory"); //FIXME this should not be required but it IS (even for non-MMX versions) |
9975 | 573 #endif |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
574 if(firstTime) |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
575 { |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
576 firstTime=0; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
577 *flags= SWS_PRINT_INFO; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
578 } |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
579 else if( mp_msg_test(MSGT_VFILTER,MSGL_DBG2) ) *flags= SWS_PRINT_INFO; |
9975 | 580 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
581 if(src_filter) sws_freeFilter(src_filter); |
9975 | 582 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
583 src_filter= sws_getDefaultFilter( |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
584 sws_lum_gblur, sws_chr_gblur, |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
585 sws_lum_sharpen, sws_chr_sharpen, |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
586 sws_chr_hshift, sws_chr_vshift, verbose>1); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
587 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
588 switch(sws_flags) |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
589 { |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
590 case 0: *flags|= SWS_FAST_BILINEAR; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
591 case 1: *flags|= SWS_BILINEAR; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
592 case 2: *flags|= SWS_BICUBIC; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
593 case 3: *flags|= SWS_X; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
594 case 4: *flags|= SWS_POINT; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
595 case 5: *flags|= SWS_AREA; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
596 case 6: *flags|= SWS_BICUBLIN; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
597 case 7: *flags|= SWS_GAUSS; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
598 case 8: *flags|= SWS_SINC; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
599 case 9: *flags|= SWS_LANCZOS; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
600 case 10:*flags|= SWS_SPLINE; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
601 default:*flags|= SWS_BILINEAR; break; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
602 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
603 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
604 *srcFilterParam= src_filter; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
605 *dstFilterParam= NULL; |
9975 | 606 } |
607 | |
608 // will use sws_flags & src_filter (from cmd line) | |
609 struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat) | |
610 { | |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
611 int flags; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
612 SwsFilter *dstFilterParam, *srcFilterParam; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
613 enum PixelFormat dfmt, sfmt; |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
614 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
615 dfmt = imgfmt2pixfmt(dstFormat); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
616 sfmt = imgfmt2pixfmt(srcFormat); |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
617 if (srcFormat == IMGFMT_RGB8 || srcFormat == IMGFMT_BGR8) sfmt = PIX_FMT_PAL8; |
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
618 sws_getFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam); |
9975 | 619 |
32703
84a45d5c1102
Remove tabs from two additional files that will be used in
cehoyos
parents:
32537
diff
changeset
|
620 return sws_getContext(srcW, srcH, sfmt, dstW, dstH, dfmt, flags | get_sws_cpuflags(), srcFilterParam, dstFilterParam, NULL); |
9975 | 621 } |
622 | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
623 /// An example of presets usage |
30662 | 624 static const struct size_preset { |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
625 char* name; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
626 int w, h; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
627 } vf_size_presets_defs[] = { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
628 // TODO add more 'standard' resolutions |
10814
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
629 { "qntsc", 352, 240 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
630 { "qpal", 352, 288 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
631 { "ntsc", 720, 480 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
632 { "pal", 720, 576 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
633 { "sntsc", 640, 480 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
634 { "spal", 768, 576 }, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
635 { NULL, 0, 0} |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
636 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
637 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
638 #define ST_OFF(f) M_ST_OFF(struct size_preset,f) |
30959
115ad4cff82f
Mark vf_size_preset_fields m_option_t array as const.
diego
parents:
30662
diff
changeset
|
639 static const m_option_t vf_size_preset_fields[] = { |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
640 {"w", ST_OFF(w), CONF_TYPE_INT, M_OPT_MIN,1 ,0, NULL}, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
641 {"h", ST_OFF(h), CONF_TYPE_INT, M_OPT_MIN,1 ,0, NULL}, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
642 { NULL, NULL, 0, 0, 0, 0, NULL } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
643 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
644 |
30662 | 645 static const m_struct_t vf_size_preset = { |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
646 "scale_size_preset", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
647 sizeof(struct size_preset), |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
648 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
649 vf_size_preset_fields |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
650 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
651 |
30662 | 652 static const m_struct_t vf_opts; |
653 static const m_obj_presets_t size_preset = { | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
654 &vf_size_preset, // Input struct desc |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
655 &vf_opts, // Output struct desc |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
656 vf_size_presets_defs, // The list of presets |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
657 ST_OFF(name) // At wich offset is the name field in the preset struct |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
658 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
659 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
660 /// Now the options |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
661 #undef ST_OFF |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
662 #define ST_OFF(f) M_ST_OFF(struct vf_priv_s,f) |
30662 | 663 static const m_option_t vf_opts_fields[] = { |
14924
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
664 {"w", ST_OFF(w), CONF_TYPE_INT, M_OPT_MIN,-11,0, NULL}, |
7f386d84805f
subtracting 8 from negative w and h rounds the dimension to the closest multiple of 16
nicodvb
parents:
14715
diff
changeset
|
665 {"h", ST_OFF(h), CONF_TYPE_INT, M_OPT_MIN,-11,0, NULL}, |
11700 | 666 {"interlaced", ST_OFF(interlaced), CONF_TYPE_INT, M_OPT_RANGE, 0, 1, NULL}, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
667 {"chr-drop", ST_OFF(v_chr_drop), CONF_TYPE_INT, M_OPT_RANGE, 0, 3, NULL}, |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
13268
diff
changeset
|
668 {"param" , ST_OFF(param[0]), CONF_TYPE_DOUBLE, M_OPT_RANGE, 0.0, 100.0, NULL}, |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
13268
diff
changeset
|
669 {"param2", ST_OFF(param[1]), CONF_TYPE_DOUBLE, M_OPT_RANGE, 0.0, 100.0, NULL}, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
670 // Note that here the 2 field is NULL (ie 0) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
671 // As we want this option to act on the option struct itself |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
672 {"presize", 0, CONF_TYPE_OBJ_PRESETS, 0, 0, 0, &size_preset}, |
19520 | 673 {"noup", ST_OFF(noup), CONF_TYPE_INT, M_OPT_RANGE, 0, 2, NULL}, |
19172
bae6c99a99cc
vertical scaler with accurate rounding, some people on doom9 can see +-1 errors
michael
parents:
18861
diff
changeset
|
674 {"arnd", ST_OFF(accurate_rnd), CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
675 { NULL, NULL, 0, 0, 0, 0, NULL } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
676 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
677 |
30662 | 678 static const m_struct_t vf_opts = { |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
679 "scale", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
680 sizeof(struct vf_priv_s), |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
681 &vf_priv_dflt, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
682 vf_opts_fields |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
683 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
684 |
25221 | 685 const vf_info_t vf_info_scale = { |
5522 | 686 "software scaling", |
687 "scale", | |
688 "A'rpi", | |
689 "", | |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
30421
diff
changeset
|
690 vf_open, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
691 &vf_opts |
5522 | 692 }; |
693 | |
694 //===========================================================================// |