Mercurial > mplayer.hg
annotate libmpcodecs/vf_scale.c @ 32439:2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
(i.e. until the first resolution or aspect change) and to use correct
aspect if only resolution changes but not the pixel aspect.
author | reimar |
---|---|
date | Fri, 22 Oct 2010 17:36:11 +0000 |
parents | 92f88bb315c5 |
children | d5dfda231e76 |
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 |
11373
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
157 mp_msg(MSGT_VFILTER,MSGL_DBG2,"scale: query(%s) -> %d\n",vo_format_name(format),ret&3); |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
158 if(ret&VFCAP_CSP_SUPPORTED_BY_HW){ |
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 } |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
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, |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
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){ |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6126
diff
changeset
|
180 mp_msg(MSGT_VFILTER,MSGL_WARN,"SwScale: no supported outfmt found :(\n"); |
5523 | 181 return 0; |
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) && |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
195 vf->priv->w<0 && vf->priv->h<0){ // -zoom |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
196 int x=(vo_flags&VFCAP_SWSCALE) ? 0 : 1; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
197 if(d_width<width || d_height<height){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
198 // downscale! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
199 if(vo_flags&VFCAP_HWSCALE_DOWN) x=0; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
200 } else { |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
201 // upscale: |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
202 if(vo_flags&VFCAP_HWSCALE_UP) x=0; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
203 } |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
204 if(x){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
205 // user wants sw scaling! (-zoom) |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
206 vf->priv->w=d_width; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
207 vf->priv->h=d_height; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
208 } |
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) { |
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
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; |
72f8a761e714
fix for negative values for width and height (aspect-preserving scaling).
reimar
parents:
13373
diff
changeset
|
269 case IMGFMT_YUY2: /* YUY2 needs w rounded to 2 */ |
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", |
5523 | 275 width,height,vo_format_name(outfmt), |
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, |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
287 sfmt, |
11700 | 288 vf->priv->w, vf->priv->h >> vf->priv->interlaced, |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
289 dfmt, |
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
|
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, | |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
293 sfmt, |
11700 | 294 vf->priv->w, vf->priv->h >> 1, |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
295 dfmt, |
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
|
296 int_sws_flags | get_sws_cpuflags(), srcFilter, dstFilter, vf->priv->param); |
11700 | 297 } |
5522 | 298 if(!vf->priv->ctx){ |
299 // error... | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6126
diff
changeset
|
300 mp_msg(MSGT_VFILTER,MSGL_WARN,"Couldn't init SwScaler for this setup\n"); |
5522 | 301 return 0; |
302 } | |
5523 | 303 vf->priv->fmt=best; |
6060 | 304 |
7783 | 305 if(vf->priv->palette){ |
306 free(vf->priv->palette); | |
307 vf->priv->palette=NULL; | |
308 } | |
309 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
|
310 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
|
311 /* set 332 palette for 8 bpp */ |
345d2866dfcf
add IMGFMT_RGB8 palette init code what moron actually added init code just for half of the formats?!
michael
parents:
22224
diff
changeset
|
312 vf->priv->palette=malloc(4*256); |
345d2866dfcf
add IMGFMT_RGB8 palette init code what moron actually added init code just for half of the formats?!
michael
parents:
22224
diff
changeset
|
313 for(i=0; i<256; i++){ |
345d2866dfcf
add IMGFMT_RGB8 palette init code what moron actually added init code just for half of the formats?!
michael
parents:
22224
diff
changeset
|
314 vf->priv->palette[4*i+0]=4*(i>>6)*21; |
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+1]=4*((i>>3)&7)*9; |
345d2866dfcf
add IMGFMT_RGB8 palette init code what moron actually added init code just for half of the formats?!
michael
parents:
22224
diff
changeset
|
316 vf->priv->palette[4*i+2]=4*((i&7)&7)*9; |
345d2866dfcf
add IMGFMT_RGB8 palette init code what moron actually added init code just for half of the formats?!
michael
parents:
22224
diff
changeset
|
317 vf->priv->palette[4*i+3]=0; |
345d2866dfcf
add IMGFMT_RGB8 palette init code what moron actually added init code just for half of the formats?!
michael
parents:
22224
diff
changeset
|
318 } |
345d2866dfcf
add IMGFMT_RGB8 palette init code what moron actually added init code just for half of the formats?!
michael
parents:
22224
diff
changeset
|
319 break; } |
7783 | 320 case IMGFMT_BGR8: { |
321 /* set 332 palette for 8 bpp */ | |
322 vf->priv->palette=malloc(4*256); | |
323 for(i=0; i<256; i++){ | |
324 vf->priv->palette[4*i+0]=4*(i&3)*21; | |
325 vf->priv->palette[4*i+1]=4*((i>>2)&7)*9; | |
326 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
|
327 vf->priv->palette[4*i+3]=0; |
7783 | 328 } |
329 break; } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
330 case IMGFMT_BGR4: |
9171 | 331 case IMGFMT_BG4B: { |
7783 | 332 vf->priv->palette=malloc(4*16); |
333 for(i=0; i<16; i++){ | |
334 vf->priv->palette[4*i+0]=4*(i&1)*63; | |
335 vf->priv->palette[4*i+1]=4*((i>>1)&3)*21; | |
336 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
|
337 vf->priv->palette[4*i+3]=0; |
7783 | 338 } |
339 break; } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
340 case IMGFMT_RGB4: |
22227
cec1eb5be9e4
palette init code for IMGFMT_RGB4 and IMGFMT_RG4B
michael
parents:
22225
diff
changeset
|
341 case IMGFMT_RG4B: { |
cec1eb5be9e4
palette init code for IMGFMT_RGB4 and IMGFMT_RG4B
michael
parents:
22225
diff
changeset
|
342 vf->priv->palette=malloc(4*16); |
cec1eb5be9e4
palette init code for IMGFMT_RGB4 and IMGFMT_RG4B
michael
parents:
22225
diff
changeset
|
343 for(i=0; i<16; i++){ |
cec1eb5be9e4
palette init code for IMGFMT_RGB4 and IMGFMT_RG4B
michael
parents:
22225
diff
changeset
|
344 vf->priv->palette[4*i+0]=4*(i>>3)*63; |
cec1eb5be9e4
palette init code for IMGFMT_RGB4 and IMGFMT_RG4B
michael
parents:
22225
diff
changeset
|
345 vf->priv->palette[4*i+1]=4*((i>>1)&3)*21; |
cec1eb5be9e4
palette init code for IMGFMT_RGB4 and IMGFMT_RG4B
michael
parents:
22225
diff
changeset
|
346 vf->priv->palette[4*i+2]=4*((i&1)&1)*63; |
cec1eb5be9e4
palette init code for IMGFMT_RGB4 and IMGFMT_RG4B
michael
parents:
22225
diff
changeset
|
347 vf->priv->palette[4*i+3]=0; |
cec1eb5be9e4
palette init code for IMGFMT_RGB4 and IMGFMT_RG4B
michael
parents:
22225
diff
changeset
|
348 } |
cec1eb5be9e4
palette init code for IMGFMT_RGB4 and IMGFMT_RG4B
michael
parents:
22225
diff
changeset
|
349 break; } |
7783 | 350 } |
351 | |
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
|
352 if(!opt_screen_size_x && !opt_screen_size_y && !(screen_size_xy >= 0.001)){ |
10002
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
353 // Compute new d_width and d_height, preserving aspect |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
354 // while ensuring that both are >= output size in pixels. |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
355 if (vf->priv->h * d_width > vf->priv->w * d_height) { |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
356 d_width = vf->priv->h * d_width / d_height; |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
357 d_height = vf->priv->h; |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
358 } else { |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
359 d_height = vf->priv->w * d_height / d_width; |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
360 d_width = vf->priv->w; |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
361 } |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
362 //d_width=d_width*vf->priv->w/width; |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
363 //d_height=d_height*vf->priv->h/height; |
6060 | 364 } |
5525 | 365 return vf_next_config(vf,vf->priv->w,vf->priv->h,d_width,d_height,flags,best); |
5522 | 366 } |
367 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
368 static void start_slice(struct vf_instance *vf, mp_image_t *mpi){ |
9491 | 369 // printf("start_slice called! flag=%d\n",mpi->flags&MP_IMGFLAG_DRAW_CALLBACK); |
370 if(!(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)) return; // shouldn't happen | |
371 // they want slices!!! allocate the buffer. | |
10140
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10022
diff
changeset
|
372 mpi->priv=vf->dmpi=vf_get_image(vf->next,vf->priv->fmt, |
9491 | 373 // mpi->type, mpi->flags & (~MP_IMGFLAG_DRAW_CALLBACK), |
374 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE, | |
375 vf->priv->w, vf->priv->h); | |
376 } | |
377 | |
29064
67c256364220
Consistently use MP_MAX_PLANES as size for plane pointer/stride arrays in libmpcodecs.
reimar
parents:
28299
diff
changeset
|
378 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
|
379 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
|
380 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
|
381 #if HAVE_BIGENDIAN |
22228 | 382 uint32_t pal2[256]; |
383 if (src[1] && !src[2]){ | |
384 int i; | |
385 for(i=0; i<256; i++) | |
386 pal2[i]= bswap_32(((uint32_t*)src[1])[i]); | |
387 src2[1]= pal2; | |
388 } | |
389 #endif | |
390 | |
11700 | 391 if(interlaced){ |
392 int i; | |
30116
f2d9ce0a6b28
Also pass alpha plane to swscale, avoids crashes when converting between
reimar
parents:
30115
diff
changeset
|
393 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
|
394 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
|
395 int dst_stride2[MP_MAX_PLANES]={2*dst_stride[0], 2*dst_stride[1], 2*dst_stride[2], 2*dst_stride[3]}; |
11700 | 396 |
30150
16c71b965952
Replace deprecated sws_scale_ordered usages by sws_scale (which does the same).
reimar
parents:
30117
diff
changeset
|
397 sws_scale(sws1, src2, src_stride2, y>>1, h>>1, dst2, dst_stride2); |
30117 | 398 for(i=0; i<MP_MAX_PLANES; i++){ |
11700 | 399 src2[i] += src_stride[i]; |
400 dst2[i] += dst_stride[i]; | |
401 } | |
30150
16c71b965952
Replace deprecated sws_scale_ordered usages by sws_scale (which does the same).
reimar
parents:
30117
diff
changeset
|
402 sws_scale(sws2, src2, src_stride2, y>>1, h>>1, dst2, dst_stride2); |
11700 | 403 }else{ |
30150
16c71b965952
Replace deprecated sws_scale_ordered usages by sws_scale (which does the same).
reimar
parents:
30117
diff
changeset
|
404 sws_scale(sws1, src2, src_stride, y, h, dst, dst_stride); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
405 } |
11700 | 406 } |
407 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
408 static void draw_slice(struct vf_instance *vf, |
9491 | 409 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
|
410 mp_image_t *dmpi=vf->dmpi; |
9491 | 411 if(!dmpi){ |
24249 | 412 mp_msg(MSGT_VFILTER,MSGL_FATAL,"vf_scale: draw_slice() called with dmpi=NULL (no get_image?)\n"); |
9491 | 413 return; |
414 } | |
415 // printf("vf_scale::draw_slice() y=%d h=%d\n",y,h); | |
11700 | 416 scale(vf->priv->ctx, vf->priv->ctx2, src, stride, y, h, dmpi->planes, dmpi->stride, vf->priv->interlaced); |
9491 | 417 } |
418 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
419 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ |
9491 | 420 mp_image_t *dmpi=mpi->priv; |
5522 | 421 |
9491 | 422 // printf("vf_scale::put_image(): processing whole frame! dmpi=%p flag=%d\n", |
423 // dmpi, (mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
424 |
9491 | 425 if(!(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK && dmpi)){ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
426 |
5522 | 427 // hope we'll get DR buffer: |
5523 | 428 dmpi=vf_get_image(vf->next,vf->priv->fmt, |
6876 | 429 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE, |
5522 | 430 vf->priv->w, vf->priv->h); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
431 |
11700 | 432 scale(vf->priv->ctx, vf->priv->ctx, mpi->planes,mpi->stride,0,mpi->h,dmpi->planes,dmpi->stride, vf->priv->interlaced); |
9491 | 433 } |
434 | |
5527 | 435 if(vf->priv->w==mpi->w && vf->priv->h==mpi->h){ |
436 // just conversion, no scaling -> keep postprocessing data | |
437 // this way we can apply pp filter to non-yv12 source using scaler | |
9934 | 438 vf_clone_mpi_attributes(dmpi, mpi); |
5527 | 439 } |
7783 | 440 |
441 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
|
442 |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17674
diff
changeset
|
443 return vf_next_put_image(vf,dmpi, pts); |
5522 | 444 } |
445 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
446 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
|
447 int *table; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
448 int *inv_table; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
449 int r; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
450 int brightness, contrast, saturation, srcRange, dstRange; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
451 vf_equalizer_t *eq; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
452 |
10632 | 453 if(vf->priv->ctx) |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
454 switch(request){ |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
455 case VFCTRL_GET_EQUALIZER: |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
456 r= sws_getColorspaceDetails(vf->priv->ctx, &inv_table, &srcRange, &table, &dstRange, &brightness, &contrast, &saturation); |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
457 if(r<0) break; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
458 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
459 eq = data; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
460 if (!strcmp(eq->item,"brightness")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
461 eq->value = ((brightness*100) + (1<<15))>>16; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
462 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
463 else if (!strcmp(eq->item,"contrast")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
464 eq->value = (((contrast *100) + (1<<15))>>16) - 100; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
465 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
466 else if (!strcmp(eq->item,"saturation")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
467 eq->value = (((saturation*100) + (1<<15))>>16) - 100; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
468 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
469 else |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
470 break; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
471 return CONTROL_TRUE; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
472 case VFCTRL_SET_EQUALIZER: |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
473 r= sws_getColorspaceDetails(vf->priv->ctx, &inv_table, &srcRange, &table, &dstRange, &brightness, &contrast, &saturation); |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
474 if(r<0) break; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
475 //printf("set %f %f %f\n", brightness/(float)(1<<16), contrast/(float)(1<<16), saturation/(float)(1<<16)); |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
476 eq = data; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
477 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
478 if (!strcmp(eq->item,"brightness")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
479 brightness = (( eq->value <<16) + 50)/100; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
480 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
481 else if (!strcmp(eq->item,"contrast")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
482 contrast = (((eq->value+100)<<16) + 50)/100; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
483 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
484 else if (!strcmp(eq->item,"saturation")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
485 saturation = (((eq->value+100)<<16) + 50)/100; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
486 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
487 else |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
488 break; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
489 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
490 r= sws_setColorspaceDetails(vf->priv->ctx, inv_table, srcRange, table, dstRange, brightness, contrast, saturation); |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
491 if(r<0) break; |
11700 | 492 if(vf->priv->ctx2){ |
493 r= sws_setColorspaceDetails(vf->priv->ctx2, inv_table, srcRange, table, dstRange, brightness, contrast, saturation); | |
494 if(r<0) break; | |
495 } | |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
496 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
497 return CONTROL_TRUE; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
498 default: |
10233
35f52ad860a0
vf_scale.h & related cleanup & some small warning fix by dominik
michael
parents:
10140
diff
changeset
|
499 break; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
500 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
501 |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
502 return vf_next_control(vf,request,data); |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
503 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
504 |
5522 | 505 //===========================================================================// |
506 | |
9071 | 507 // supported Input formats: YV12, I420, IYUV, YUY2, UYVY, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8, Y800 |
5523 | 508 |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
509 static int query_format(struct vf_instance *vf, unsigned int fmt){ |
5523 | 510 switch(fmt){ |
511 case IMGFMT_YV12: | |
512 case IMGFMT_I420: | |
513 case IMGFMT_IYUV: | |
9071 | 514 case IMGFMT_UYVY: |
5523 | 515 case IMGFMT_YUY2: |
516 case IMGFMT_BGR32: | |
517 case IMGFMT_BGR24: | |
518 case IMGFMT_BGR16: | |
519 case IMGFMT_BGR15: | |
520 case IMGFMT_RGB32: | |
521 case IMGFMT_RGB24: | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
522 case IMGFMT_Y800: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
523 case IMGFMT_Y8: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
524 case IMGFMT_YVU9: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
525 case IMGFMT_IF09: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
526 case IMGFMT_444P: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
527 case IMGFMT_422P: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
528 case IMGFMT_411P: |
30100 | 529 case IMGFMT_440P: |
30115
ad61464d02a7
Add support for YUV format with alpha and fix the codecs.conf entry for vp6a
reimar
parents:
30113
diff
changeset
|
530 case IMGFMT_420A: |
30110 | 531 case IMGFMT_444P16_LE: |
532 case IMGFMT_444P16_BE: | |
533 case IMGFMT_422P16_LE: | |
534 case IMGFMT_422P16_BE: | |
535 case IMGFMT_420P16_LE: | |
536 case IMGFMT_420P16_BE: | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
537 case IMGFMT_BGR8: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
538 case IMGFMT_RGB8: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
539 case IMGFMT_BG4B: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
540 case IMGFMT_RG4B: |
29444 | 541 case IMGFMT_RGB48LE: |
542 case IMGFMT_RGB48BE: | |
6533 | 543 { |
30367
2db4c1158df9
Make the scale filter prefer yuv conversions that do not need chroma scaling.
reimar
parents:
30366
diff
changeset
|
544 unsigned int best=find_best_out(vf, fmt); |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
545 int flags; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
546 if(!best) return 0; // no matching out-fmt |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
547 flags=vf_next_query_format(vf,best); |
15537 | 548 if(!(flags&(VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW))) return 0; // huh? |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
549 if(fmt!=best) flags&=~VFCAP_CSP_SUPPORTED_BY_HW; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
550 // do not allow scaling, if we are before the PP fliter! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
551 if(!(flags&VFCAP_POSTPROC)) flags|=VFCAP_SWSCALE; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
552 return flags; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
553 } |
5523 | 554 } |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
555 return 0; // nomatching in-fmt |
5523 | 556 } |
557 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
558 static void uninit(struct vf_instance *vf){ |
11537 | 559 if(vf->priv->ctx) sws_freeContext(vf->priv->ctx); |
11700 | 560 if(vf->priv->ctx2) sws_freeContext(vf->priv->ctx2); |
11537 | 561 if(vf->priv->palette) free(vf->priv->palette); |
562 free(vf->priv); | |
563 } | |
564 | |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
30421
diff
changeset
|
565 static int vf_open(vf_instance_t *vf, char *args){ |
5522 | 566 vf->config=config; |
9491 | 567 vf->start_slice=start_slice; |
568 vf->draw_slice=draw_slice; | |
5522 | 569 vf->put_image=put_image; |
5526 | 570 vf->query_format=query_format; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
571 vf->control= control; |
11537 | 572 vf->uninit=uninit; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6126
diff
changeset
|
573 mp_msg(MSGT_VFILTER,MSGL_V,"SwScale params: %d x %d (-1=no scaling)\n", |
5522 | 574 vf->priv->w, |
575 vf->priv->h); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
576 |
5522 | 577 return 1; |
578 } | |
579 | |
9975 | 580 //global sws_flags from the command line |
581 int sws_flags=2; | |
582 | |
583 //global srcFilter | |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
584 static SwsFilter *src_filter= NULL; |
9975 | 585 |
586 float sws_lum_gblur= 0.0; | |
587 float sws_chr_gblur= 0.0; | |
588 int sws_chr_vshift= 0; | |
589 int sws_chr_hshift= 0; | |
590 float sws_chr_sharpen= 0.0; | |
591 float sws_lum_sharpen= 0.0; | |
592 | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17215
diff
changeset
|
593 int get_sws_cpuflags(void){ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
594 return |
9975 | 595 (gCpuCaps.hasMMX ? SWS_CPU_CAPS_MMX : 0) |
596 | (gCpuCaps.hasMMX2 ? SWS_CPU_CAPS_MMX2 : 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
|
597 | (gCpuCaps.has3DNow ? SWS_CPU_CAPS_3DNOW : 0) |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11700
diff
changeset
|
598 | (gCpuCaps.hasAltiVec ? SWS_CPU_CAPS_ALTIVEC : 0); |
9975 | 599 } |
600 | |
601 void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam) | |
602 { | |
603 static int firstTime=1; | |
604 *flags=0; | |
605 | |
28290 | 606 #if ARCH_X86 |
9975 | 607 if(gCpuCaps.hasMMX) |
27754
08d18fe9da52
Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents:
26703
diff
changeset
|
608 __asm__ volatile("emms\n\t"::: "memory"); //FIXME this should not be required but it IS (even for non-MMX versions) |
9975 | 609 #endif |
610 if(firstTime) | |
611 { | |
612 firstTime=0; | |
613 *flags= SWS_PRINT_INFO; | |
614 } | |
17932 | 615 else if( mp_msg_test(MSGT_VFILTER,MSGL_DBG2) ) *flags= SWS_PRINT_INFO; |
9975 | 616 |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
617 if(src_filter) sws_freeFilter(src_filter); |
9975 | 618 |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
619 src_filter= sws_getDefaultFilter( |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
620 sws_lum_gblur, sws_chr_gblur, |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
621 sws_lum_sharpen, sws_chr_sharpen, |
11373
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
622 sws_chr_hshift, sws_chr_vshift, verbose>1); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
623 |
9975 | 624 switch(sws_flags) |
625 { | |
626 case 0: *flags|= SWS_FAST_BILINEAR; break; | |
627 case 1: *flags|= SWS_BILINEAR; break; | |
628 case 2: *flags|= SWS_BICUBIC; break; | |
629 case 3: *flags|= SWS_X; break; | |
630 case 4: *flags|= SWS_POINT; break; | |
631 case 5: *flags|= SWS_AREA; break; | |
632 case 6: *flags|= SWS_BICUBLIN; break; | |
633 case 7: *flags|= SWS_GAUSS; break; | |
634 case 8: *flags|= SWS_SINC; break; | |
635 case 9: *flags|= SWS_LANCZOS; break; | |
636 case 10:*flags|= SWS_SPLINE; break; | |
637 default:*flags|= SWS_BILINEAR; break; | |
638 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29064
diff
changeset
|
639 |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
640 *srcFilterParam= src_filter; |
9975 | 641 *dstFilterParam= NULL; |
642 } | |
643 | |
644 // will use sws_flags & src_filter (from cmd line) | |
645 struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat) | |
646 { | |
647 int flags; | |
648 SwsFilter *dstFilterParam, *srcFilterParam; | |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
649 enum PixelFormat dfmt, sfmt; |
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
650 |
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
651 dfmt = imgfmt2pixfmt(dstFormat); |
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
652 sfmt = imgfmt2pixfmt(srcFormat); |
23479
db82492b2f30
100l, fix compile error in r23498 due to bad copy in paste
reimar
parents:
23478
diff
changeset
|
653 if (srcFormat == IMGFMT_RGB8 || srcFormat == IMGFMT_BGR8) sfmt = PIX_FMT_PAL8; |
9975 | 654 sws_getFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam); |
655 | |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
19520
diff
changeset
|
656 return sws_getContext(srcW, srcH, sfmt, dstW, dstH, dfmt, flags | get_sws_cpuflags(), srcFilterParam, dstFilterParam, NULL); |
9975 | 657 } |
658 | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
659 /// An example of presets usage |
30662 | 660 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
|
661 char* name; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
662 int w, h; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
663 } vf_size_presets_defs[] = { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
664 // TODO add more 'standard' resolutions |
10814
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
665 { "qntsc", 352, 240 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
666 { "qpal", 352, 288 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
667 { "ntsc", 720, 480 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
668 { "pal", 720, 576 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
669 { "sntsc", 640, 480 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
670 { "spal", 768, 576 }, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
671 { NULL, 0, 0} |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
672 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
673 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
674 #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
|
675 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
|
676 {"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
|
677 {"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
|
678 { 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
|
679 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
680 |
30662 | 681 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
|
682 "scale_size_preset", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
683 sizeof(struct size_preset), |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
684 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
685 vf_size_preset_fields |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
686 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
687 |
30662 | 688 static const m_struct_t vf_opts; |
689 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
|
690 &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
|
691 &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
|
692 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
|
693 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
|
694 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
695 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
696 /// Now the options |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
697 #undef ST_OFF |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
698 #define ST_OFF(f) M_ST_OFF(struct vf_priv_s,f) |
30662 | 699 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
|
700 {"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
|
701 {"h", ST_OFF(h), CONF_TYPE_INT, M_OPT_MIN,-11,0, NULL}, |
11700 | 702 {"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
|
703 {"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
|
704 {"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
|
705 {"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
|
706 // 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
|
707 // 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
|
708 {"presize", 0, CONF_TYPE_OBJ_PRESETS, 0, 0, 0, &size_preset}, |
19520 | 709 {"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
|
710 {"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
|
711 { 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
|
712 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
713 |
30662 | 714 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
|
715 "scale", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
716 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
|
717 &vf_priv_dflt, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
718 vf_opts_fields |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
719 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
720 |
25221 | 721 const vf_info_t vf_info_scale = { |
5522 | 722 "software scaling", |
723 "scale", | |
724 "A'rpi", | |
725 "", | |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
30421
diff
changeset
|
726 vf_open, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
727 &vf_opts |
5522 | 728 }; |
729 | |
730 //===========================================================================// |