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