Mercurial > mplayer.hg
annotate libmpcodecs/vf_scale.c @ 12925:2abd8e24eb69
10l to the author of this longstanding and obscure bug. Each language
should be removed only once from the list.
Thanks to Chris White for pointing out that there was a problem.
author | diego |
---|---|
date | Sat, 31 Jul 2004 22:17:23 +0000 |
parents | 16e673350486 |
children | 125f1b58a325 |
rev | line source |
---|---|
5522 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
4 #include <inttypes.h> | |
5 | |
6 #include "../config.h" | |
7 #include "../mp_msg.h" | |
9975 | 8 #include "../cpudetect.h" |
5522 | 9 |
5607 | 10 #include "img_format.h" |
11 #include "mp_image.h" | |
5522 | 12 #include "vf.h" |
13 | |
14 #include "../libvo/fastmemcpy.h" | |
15 #include "../postproc/swscale.h" | |
10233
35f52ad860a0
vf_scale.h & related cleanup & some small warning fix by dominik
michael
parents:
10140
diff
changeset
|
16 #include "vf_scale.h" |
5522 | 17 |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
18 #include "m_option.h" |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
19 #include "m_struct.h" |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
20 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
21 static struct vf_priv_s { |
5522 | 22 int w,h; |
6542
7af3fcd76d2d
support dropping some chroma src lines for a bit extra speed
michael
parents:
6536
diff
changeset
|
23 int v_chr_drop; |
6637 | 24 int param; |
5523 | 25 unsigned int fmt; |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9491
diff
changeset
|
26 struct SwsContext *ctx; |
11700 | 27 struct SwsContext *ctx2; //for interlaced slices only |
7783 | 28 unsigned char* palette; |
11700 | 29 int interlaced; |
11373
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
30 int query_format_cache[64]; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
31 } vf_priv_dflt = { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
32 -1,-1, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
33 0, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
34 0, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
35 0, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
36 NULL, |
11700 | 37 NULL, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
38 NULL |
5522 | 39 }; |
40 | |
6060 | 41 extern int opt_screen_size_x; |
42 extern int opt_screen_size_y; | |
43 | |
5522 | 44 //===========================================================================// |
45 | |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
46 void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
47 |
5523 | 48 static unsigned int outfmt_list[]={ |
12260
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
49 // YUV: |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
50 IMGFMT_444P, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
51 IMGFMT_422P, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
52 IMGFMT_YV12, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
53 IMGFMT_I420, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
54 IMGFMT_IYUV, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
55 IMGFMT_YVU9, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
56 IMGFMT_IF09, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
57 IMGFMT_411P, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
58 IMGFMT_YUY2, |
9d7e95b0a7e5
prefer yuv formats over rgb in case both are supported by hw
faust3
parents:
12017
diff
changeset
|
59 IMGFMT_UYVY, |
12475
16e673350486
give Y8 and Y800 lower conversion priority to avoid grayscaled video
reimar
parents:
12260
diff
changeset
|
60 // RGB and grayscale (Y8 and Y800): |
5523 | 61 IMGFMT_BGR32, |
7403 | 62 IMGFMT_RGB32, |
5523 | 63 IMGFMT_BGR24, |
7403 | 64 IMGFMT_RGB24, |
5523 | 65 IMGFMT_BGR16, |
7403 | 66 IMGFMT_RGB16, |
5523 | 67 IMGFMT_BGR15, |
7403 | 68 IMGFMT_RGB15, |
12475
16e673350486
give Y8 and Y800 lower conversion priority to avoid grayscaled video
reimar
parents:
12260
diff
changeset
|
69 IMGFMT_Y800, |
16e673350486
give Y8 and Y800 lower conversion priority to avoid grayscaled video
reimar
parents:
12260
diff
changeset
|
70 IMGFMT_Y8, |
6637 | 71 IMGFMT_BGR8, |
7403 | 72 IMGFMT_RGB8, |
6637 | 73 IMGFMT_BGR4, |
7403 | 74 IMGFMT_RGB4, |
9171 | 75 IMGFMT_BG4B, |
76 IMGFMT_RG4B, | |
6637 | 77 IMGFMT_BGR1, |
78 IMGFMT_RGB1, | |
6188 | 79 0 |
5523 | 80 }; |
81 | |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
82 static unsigned int find_best_out(vf_instance_t *vf){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
83 unsigned int best=0; |
11373
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
84 int i; |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
85 |
5523 | 86 // find the best outfmt: |
11373
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
87 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
|
88 const int format= outfmt_list[i]; |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
89 int ret= vf->priv->query_format_cache[i]-1; |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
90 if(ret == -1){ |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
91 ret= vf_next_query_format(vf, outfmt_list[i]); |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
92 vf->priv->query_format_cache[i]= ret+1; |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
93 } |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
94 |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
95 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
|
96 if(ret&VFCAP_CSP_SUPPORTED_BY_HW){ |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
97 best=format; // no conversion -> bingo! |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
98 break; |
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 if(ret&VFCAP_CSP_SUPPORTED && !best) |
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
101 best=format; // best with conversion |
5523 | 102 } |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
103 return best; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
104 } |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
105 |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
106 static int config(struct vf_instance_s* vf, |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
107 int width, int height, int d_width, int d_height, |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
108 unsigned int flags, unsigned int outfmt){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
109 unsigned int best=find_best_out(vf); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
110 int vo_flags; |
6542
7af3fcd76d2d
support dropping some chroma src lines for a bit extra speed
michael
parents:
6536
diff
changeset
|
111 int int_sws_flags=0; |
7af3fcd76d2d
support dropping some chroma src lines for a bit extra speed
michael
parents:
6536
diff
changeset
|
112 SwsFilter *srcFilter, *dstFilter; |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
113 |
5523 | 114 if(!best){ |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6126
diff
changeset
|
115 mp_msg(MSGT_VFILTER,MSGL_WARN,"SwScale: no supported outfmt found :(\n"); |
5523 | 116 return 0; |
117 } | |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
118 |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
119 vo_flags=vf->next->query_format(vf->next,best); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
120 |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
121 // scaling to dwidth*d_height, if all these TRUE: |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
122 // - option -zoom |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
123 // - no other sw/hw up/down scaling avail. |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
124 // - we're after postproc |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
125 // - user didn't set w:h |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
126 if(!(vo_flags&VFCAP_POSTPROC) && (flags&4) && |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
127 vf->priv->w<0 && vf->priv->h<0){ // -zoom |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
128 int x=(vo_flags&VFCAP_SWSCALE) ? 0 : 1; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
129 if(d_width<width || d_height<height){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
130 // downscale! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
131 if(vo_flags&VFCAP_HWSCALE_DOWN) x=0; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
132 } else { |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
133 // upscale: |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
134 if(vo_flags&VFCAP_HWSCALE_UP) x=0; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
135 } |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
136 if(x){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
137 // user wants sw scaling! (-zoom) |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
138 vf->priv->w=d_width; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
139 vf->priv->h=d_height; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
140 } |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
141 } |
5523 | 142 |
5522 | 143 // calculate the missing parameters: |
6746
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
144 switch(best) { |
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
145 case IMGFMT_YUY2: /* YUY2 needs w rounded to 2 */ |
11069 | 146 case IMGFMT_UYVY: |
6746
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
147 if(vf->priv->w==-3) vf->priv->w=(vf->priv->h*width/height+1)&~1; else |
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
148 if(vf->priv->w==-2) vf->priv->w=(vf->priv->h*d_width/d_height+1)&~1; |
6750
6484f8f9f111
Put back the ordering of the if as requested by Arpi.
kmkaplan
parents:
6746
diff
changeset
|
149 if(vf->priv->w<0) vf->priv->w=width; else |
6484f8f9f111
Put back the ordering of the if as requested by Arpi.
kmkaplan
parents:
6746
diff
changeset
|
150 if(vf->priv->w==0) vf->priv->w=d_width; |
6746
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
151 if(vf->priv->h==-3) vf->priv->h=vf->priv->w*height/width; else |
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
152 if(vf->priv->h==-2) vf->priv->h=vf->priv->w*d_height/d_width; |
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
153 break; |
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
154 case IMGFMT_YV12: /* YV12 needs w & h rounded to 2 */ |
11069 | 155 case IMGFMT_I420: |
156 case IMGFMT_IYUV: | |
6746
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
157 if(vf->priv->w==-3) vf->priv->w=(vf->priv->h*width/height+1)&~1; else |
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
158 if(vf->priv->w==-2) vf->priv->w=(vf->priv->h*d_width/d_height+1)&~1; |
6750
6484f8f9f111
Put back the ordering of the if as requested by Arpi.
kmkaplan
parents:
6746
diff
changeset
|
159 if(vf->priv->w<0) vf->priv->w=width; else |
6484f8f9f111
Put back the ordering of the if as requested by Arpi.
kmkaplan
parents:
6746
diff
changeset
|
160 if(vf->priv->w==0) vf->priv->w=d_width; |
6746
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
161 if(vf->priv->h==-3) vf->priv->h=(vf->priv->w*height/width+1)&~1; else |
7044
c9ee9c799f4a
typo fix, patch by (Eric Lammerts <eric at lammerts dot org>)
michael
parents:
6876
diff
changeset
|
162 if(vf->priv->h==-2) vf->priv->h=(vf->priv->w*d_height/d_width+1)&~1; |
6746
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
163 break; |
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
164 default: |
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
|
165 if(vf->priv->w==-3) vf->priv->w=vf->priv->h*width/height; else |
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
|
166 if(vf->priv->w==-2) vf->priv->w=vf->priv->h*d_width/d_height; |
6750
6484f8f9f111
Put back the ordering of the if as requested by Arpi.
kmkaplan
parents:
6746
diff
changeset
|
167 if(vf->priv->w<0) vf->priv->w=width; else |
6484f8f9f111
Put back the ordering of the if as requested by Arpi.
kmkaplan
parents:
6746
diff
changeset
|
168 if(vf->priv->w==0) vf->priv->w=d_width; |
6746
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
169 if(vf->priv->h==-3) vf->priv->h=vf->priv->w*height/width; else |
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
170 if(vf->priv->h==-2) vf->priv->h=vf->priv->w*d_height/d_width; |
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
171 break; |
0e2b14e606ac
Round height or width to valid values when doing automatic calculation.
kmkaplan
parents:
6708
diff
changeset
|
172 } |
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
|
173 |
6003 | 174 if(vf->priv->h<0) vf->priv->h=height; else |
175 if(vf->priv->h==0) vf->priv->h=d_height; | |
5523 | 176 |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6126
diff
changeset
|
177 mp_msg(MSGT_VFILTER,MSGL_DBG2,"SwScale: scaling %dx%d %s to %dx%d %s \n", |
5523 | 178 width,height,vo_format_name(outfmt), |
179 vf->priv->w,vf->priv->h,vo_format_name(best)); | |
5526 | 180 |
181 // free old ctx: | |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9491
diff
changeset
|
182 if(vf->priv->ctx) sws_freeContext(vf->priv->ctx); |
11700 | 183 if(vf->priv->ctx2)sws_freeContext(vf->priv->ctx2); |
5523 | 184 |
5522 | 185 // new swscaler: |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9491
diff
changeset
|
186 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
|
187 int_sws_flags|= vf->priv->v_chr_drop << SWS_SRC_V_CHR_DROP_SHIFT; |
6637 | 188 int_sws_flags|= vf->priv->param << SWS_PARAM_SHIFT; |
11700 | 189 vf->priv->ctx=sws_getContext(width, height >> vf->priv->interlaced, |
9697 | 190 outfmt, |
11700 | 191 vf->priv->w, vf->priv->h >> vf->priv->interlaced, |
9697 | 192 best, |
9975 | 193 int_sws_flags | get_sws_cpuflags(), srcFilter, dstFilter); |
11700 | 194 if(vf->priv->interlaced){ |
195 vf->priv->ctx2=sws_getContext(width, height >> 1, | |
196 outfmt, | |
197 vf->priv->w, vf->priv->h >> 1, | |
198 best, | |
199 int_sws_flags | get_sws_cpuflags(), srcFilter, dstFilter); | |
200 } | |
5522 | 201 if(!vf->priv->ctx){ |
202 // error... | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6126
diff
changeset
|
203 mp_msg(MSGT_VFILTER,MSGL_WARN,"Couldn't init SwScaler for this setup\n"); |
5522 | 204 return 0; |
205 } | |
5523 | 206 vf->priv->fmt=best; |
6060 | 207 |
7783 | 208 if(vf->priv->palette){ |
209 free(vf->priv->palette); | |
210 vf->priv->palette=NULL; | |
211 } | |
212 switch(best){ | |
213 case IMGFMT_BGR8: { | |
214 /* set 332 palette for 8 bpp */ | |
215 int i; | |
216 vf->priv->palette=malloc(4*256); | |
217 for(i=0; i<256; i++){ | |
218 vf->priv->palette[4*i+0]=4*(i&3)*21; | |
219 vf->priv->palette[4*i+1]=4*((i>>2)&7)*9; | |
220 vf->priv->palette[4*i+2]=4*((i>>5)&7)*9; | |
221 } | |
222 break; } | |
9171 | 223 case IMGFMT_BGR4: |
224 case IMGFMT_BG4B: { | |
7783 | 225 int i; |
226 vf->priv->palette=malloc(4*16); | |
227 for(i=0; i<16; i++){ | |
228 vf->priv->palette[4*i+0]=4*(i&1)*63; | |
229 vf->priv->palette[4*i+1]=4*((i>>1)&3)*21; | |
230 vf->priv->palette[4*i+2]=4*((i>>3)&1)*63; | |
231 } | |
232 break; } | |
233 } | |
234 | |
6060 | 235 if(!opt_screen_size_x && !opt_screen_size_y){ |
10002
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
236 // 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
|
237 // 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
|
238 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
|
239 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
|
240 d_height = vf->priv->h; |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
241 } else { |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
242 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
|
243 d_width = vf->priv->w; |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
244 } |
b2b070bf934e
generate meaningful d_width & d_height when scaling, rather than useless nonsense.
rfelker
parents:
9985
diff
changeset
|
245 //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
|
246 //d_height=d_height*vf->priv->h/height; |
6060 | 247 } |
5525 | 248 return vf_next_config(vf,vf->priv->w,vf->priv->h,d_width,d_height,flags,best); |
5522 | 249 } |
250 | |
9491 | 251 static void start_slice(struct vf_instance_s* vf, mp_image_t *mpi){ |
252 // printf("start_slice called! flag=%d\n",mpi->flags&MP_IMGFLAG_DRAW_CALLBACK); | |
253 if(!(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)) return; // shouldn't happen | |
254 // they want slices!!! allocate the buffer. | |
10140
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10022
diff
changeset
|
255 mpi->priv=vf->dmpi=vf_get_image(vf->next,vf->priv->fmt, |
9491 | 256 // mpi->type, mpi->flags & (~MP_IMGFLAG_DRAW_CALLBACK), |
257 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE, | |
258 vf->priv->w, vf->priv->h); | |
259 } | |
260 | |
11700 | 261 static void scale(struct SwsContext *sws1, struct SwsContext *sws2, uint8_t *src[3], int src_stride[3], int y, int h, |
262 uint8_t *dst[3], int dst_stride[3], int interlaced){ | |
263 if(interlaced){ | |
264 int i; | |
265 uint8_t *src2[3]={src[0], src[1], src[2]}; | |
266 uint8_t *dst2[3]={dst[0], dst[1], dst[2]}; | |
267 int src_stride2[3]={2*src_stride[0], 2*src_stride[1], 2*src_stride[2]}; | |
268 int dst_stride2[3]={2*dst_stride[0], 2*dst_stride[1], 2*dst_stride[2]}; | |
269 | |
270 sws_scale_ordered(sws1, src2, src_stride2, y>>1, h>>1, dst2, dst_stride2); | |
271 for(i=0; i<3; i++){ | |
272 src2[i] += src_stride[i]; | |
273 dst2[i] += dst_stride[i]; | |
274 } | |
275 sws_scale_ordered(sws2, src2, src_stride2, y>>1, h>>1, dst2, dst_stride2); | |
276 }else{ | |
277 sws_scale_ordered(sws1, src, src_stride, y, h, dst, dst_stride); | |
278 } | |
279 } | |
280 | |
9491 | 281 static void draw_slice(struct vf_instance_s* vf, |
282 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
|
283 mp_image_t *dmpi=vf->dmpi; |
9491 | 284 if(!dmpi){ |
285 mp_msg(MSGT_VFILTER,MSGL_FATAL,"vf_scale: draw_slice() called with dmpi=NULL (no get_image??)\n"); | |
286 return; | |
287 } | |
288 // printf("vf_scale::draw_slice() y=%d h=%d\n",y,h); | |
11700 | 289 scale(vf->priv->ctx, vf->priv->ctx2, src, stride, y, h, dmpi->planes, dmpi->stride, vf->priv->interlaced); |
9491 | 290 } |
291 | |
7368 | 292 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ |
9491 | 293 mp_image_t *dmpi=mpi->priv; |
5522 | 294 |
9491 | 295 // printf("vf_scale::put_image(): processing whole frame! dmpi=%p flag=%d\n", |
296 // dmpi, (mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)); | |
297 | |
298 if(!(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK && dmpi)){ | |
299 | |
5522 | 300 // hope we'll get DR buffer: |
5523 | 301 dmpi=vf_get_image(vf->next,vf->priv->fmt, |
6876 | 302 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE, |
5522 | 303 vf->priv->w, vf->priv->h); |
11700 | 304 |
305 scale(vf->priv->ctx, vf->priv->ctx, mpi->planes,mpi->stride,0,mpi->h,dmpi->planes,dmpi->stride, vf->priv->interlaced); | |
9491 | 306 } |
307 | |
5527 | 308 if(vf->priv->w==mpi->w && vf->priv->h==mpi->h){ |
309 // just conversion, no scaling -> keep postprocessing data | |
310 // this way we can apply pp filter to non-yv12 source using scaler | |
9934 | 311 vf_clone_mpi_attributes(dmpi, mpi); |
5527 | 312 } |
7783 | 313 |
314 if(vf->priv->palette) dmpi->planes[1]=vf->priv->palette; // export palette! | |
5527 | 315 |
7368 | 316 return vf_next_put_image(vf,dmpi); |
5522 | 317 } |
318 | |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
319 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
|
320 int *table; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
321 int *inv_table; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
322 int r; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
323 int brightness, contrast, saturation, srcRange, dstRange; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
324 vf_equalizer_t *eq; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
325 |
10632 | 326 if(vf->priv->ctx) |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
327 switch(request){ |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
328 case VFCTRL_GET_EQUALIZER: |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
329 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
|
330 if(r<0) break; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
331 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
332 eq = data; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
333 if (!strcmp(eq->item,"brightness")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
334 eq->value = ((brightness*100) + (1<<15))>>16; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
335 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
336 else if (!strcmp(eq->item,"contrast")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
337 eq->value = (((contrast *100) + (1<<15))>>16) - 100; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
338 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
339 else if (!strcmp(eq->item,"saturation")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
340 eq->value = (((saturation*100) + (1<<15))>>16) - 100; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
341 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
342 else |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
343 break; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
344 return CONTROL_TRUE; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
345 case VFCTRL_SET_EQUALIZER: |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
346 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
|
347 if(r<0) break; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
348 //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
|
349 eq = data; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
350 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
351 if (!strcmp(eq->item,"brightness")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
352 brightness = (( eq->value <<16) + 50)/100; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
353 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
354 else if (!strcmp(eq->item,"contrast")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
355 contrast = (((eq->value+100)<<16) + 50)/100; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
356 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
357 else if (!strcmp(eq->item,"saturation")) { |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
358 saturation = (((eq->value+100)<<16) + 50)/100; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
359 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
360 else |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
361 break; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
362 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
363 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
|
364 if(r<0) break; |
11700 | 365 if(vf->priv->ctx2){ |
366 r= sws_setColorspaceDetails(vf->priv->ctx2, inv_table, srcRange, table, dstRange, brightness, contrast, saturation); | |
367 if(r<0) break; | |
368 } | |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
369 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
370 return CONTROL_TRUE; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
371 default: |
10233
35f52ad860a0
vf_scale.h & related cleanup & some small warning fix by dominik
michael
parents:
10140
diff
changeset
|
372 break; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
373 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
374 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
375 return vf_next_control(vf,request,data); |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
376 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
377 |
5522 | 378 //===========================================================================// |
379 | |
9071 | 380 // supported Input formats: YV12, I420, IYUV, YUY2, UYVY, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8, Y800 |
5523 | 381 |
382 static int query_format(struct vf_instance_s* vf, unsigned int fmt){ | |
383 switch(fmt){ | |
384 case IMGFMT_YV12: | |
385 case IMGFMT_I420: | |
386 case IMGFMT_IYUV: | |
9071 | 387 case IMGFMT_UYVY: |
5523 | 388 case IMGFMT_YUY2: |
389 case IMGFMT_BGR32: | |
390 case IMGFMT_BGR24: | |
391 case IMGFMT_BGR16: | |
392 case IMGFMT_BGR15: | |
393 case IMGFMT_RGB32: | |
394 case IMGFMT_RGB24: | |
6533 | 395 case IMGFMT_Y800: |
396 case IMGFMT_Y8: | |
397 case IMGFMT_YVU9: | |
6536 | 398 case IMGFMT_IF09: |
6863 | 399 case IMGFMT_444P: |
400 case IMGFMT_422P: | |
401 case IMGFMT_411P: | |
6533 | 402 { |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
403 unsigned int best=find_best_out(vf); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
404 int flags; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
405 if(!best) return 0; // no matching out-fmt |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
406 flags=vf_next_query_format(vf,best); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
407 if(!(flags&3)) return 0; // huh? |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
408 if(fmt!=best) flags&=~VFCAP_CSP_SUPPORTED_BY_HW; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
409 // 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
|
410 if(!(flags&VFCAP_POSTPROC)) flags|=VFCAP_SWSCALE; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
411 return flags; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
412 } |
5523 | 413 } |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5527
diff
changeset
|
414 return 0; // nomatching in-fmt |
5523 | 415 } |
416 | |
11537 | 417 static void uninit(struct vf_instance_s *vf){ |
418 if(vf->priv->ctx) sws_freeContext(vf->priv->ctx); | |
11700 | 419 if(vf->priv->ctx2) sws_freeContext(vf->priv->ctx2); |
11537 | 420 if(vf->priv->palette) free(vf->priv->palette); |
421 free(vf->priv); | |
422 } | |
423 | |
5522 | 424 static int open(vf_instance_t *vf, char* args){ |
425 vf->config=config; | |
9491 | 426 vf->start_slice=start_slice; |
427 vf->draw_slice=draw_slice; | |
5522 | 428 vf->put_image=put_image; |
5526 | 429 vf->query_format=query_format; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9276
diff
changeset
|
430 vf->control= control; |
11537 | 431 vf->uninit=uninit; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
432 if(!vf->priv) { |
5522 | 433 vf->priv=malloc(sizeof(struct vf_priv_s)); |
434 // TODO: parse args -> | |
435 vf->priv->ctx=NULL; | |
11700 | 436 vf->priv->ctx2=NULL; |
5522 | 437 vf->priv->w= |
438 vf->priv->h=-1; | |
6542
7af3fcd76d2d
support dropping some chroma src lines for a bit extra speed
michael
parents:
6536
diff
changeset
|
439 vf->priv->v_chr_drop=0; |
6637 | 440 vf->priv->param=0; |
7783 | 441 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
|
442 } // if(!vf->priv) |
6637 | 443 if(args) sscanf(args, "%d:%d:%d:%d", |
5522 | 444 &vf->priv->w, |
6542
7af3fcd76d2d
support dropping some chroma src lines for a bit extra speed
michael
parents:
6536
diff
changeset
|
445 &vf->priv->h, |
6637 | 446 &vf->priv->v_chr_drop, |
447 &vf->priv->param); | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6126
diff
changeset
|
448 mp_msg(MSGT_VFILTER,MSGL_V,"SwScale params: %d x %d (-1=no scaling)\n", |
5522 | 449 vf->priv->w, |
450 vf->priv->h); | |
11700 | 451 |
5522 | 452 return 1; |
453 } | |
454 | |
9975 | 455 //global sws_flags from the command line |
456 int sws_flags=2; | |
457 | |
458 //global srcFilter | |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
459 static SwsFilter *src_filter= NULL; |
9975 | 460 |
461 float sws_lum_gblur= 0.0; | |
462 float sws_chr_gblur= 0.0; | |
463 int sws_chr_vshift= 0; | |
464 int sws_chr_hshift= 0; | |
465 float sws_chr_sharpen= 0.0; | |
466 float sws_lum_sharpen= 0.0; | |
467 | |
468 int get_sws_cpuflags(){ | |
469 return | |
470 (gCpuCaps.hasMMX ? SWS_CPU_CAPS_MMX : 0) | |
471 | (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
|
472 | (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
|
473 | (gCpuCaps.hasAltiVec ? SWS_CPU_CAPS_ALTIVEC : 0); |
9975 | 474 } |
475 | |
476 void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam) | |
477 { | |
478 static int firstTime=1; | |
479 *flags=0; | |
480 | |
481 #ifdef ARCH_X86 | |
482 if(gCpuCaps.hasMMX) | |
483 asm volatile("emms\n\t"::: "memory"); //FIXME this shouldnt be required but it IS (even for non mmx versions) | |
484 #endif | |
485 if(firstTime) | |
486 { | |
487 firstTime=0; | |
488 *flags= SWS_PRINT_INFO; | |
489 } | |
490 else if(verbose>1) *flags= SWS_PRINT_INFO; | |
491 | |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
492 if(src_filter) sws_freeFilter(src_filter); |
9975 | 493 |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
494 src_filter= sws_getDefaultFilter( |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
495 sws_lum_gblur, sws_chr_gblur, |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
496 sws_lum_sharpen, sws_chr_sharpen, |
11373
3b9f8ee18ff9
another lame workaround for the g1 filter layer ...
michael
parents:
11069
diff
changeset
|
497 sws_chr_hshift, sws_chr_vshift, verbose>1); |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
498 |
9975 | 499 switch(sws_flags) |
500 { | |
501 case 0: *flags|= SWS_FAST_BILINEAR; break; | |
502 case 1: *flags|= SWS_BILINEAR; break; | |
503 case 2: *flags|= SWS_BICUBIC; break; | |
504 case 3: *flags|= SWS_X; break; | |
505 case 4: *flags|= SWS_POINT; break; | |
506 case 5: *flags|= SWS_AREA; break; | |
507 case 6: *flags|= SWS_BICUBLIN; break; | |
508 case 7: *flags|= SWS_GAUSS; break; | |
509 case 8: *flags|= SWS_SINC; break; | |
510 case 9: *flags|= SWS_LANCZOS; break; | |
511 case 10:*flags|= SWS_SPLINE; break; | |
512 default:*flags|= SWS_BILINEAR; break; | |
513 } | |
514 | |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
515 *srcFilterParam= src_filter; |
9975 | 516 *dstFilterParam= NULL; |
517 } | |
518 | |
519 // will use sws_flags & src_filter (from cmd line) | |
520 struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat) | |
521 { | |
522 int flags; | |
523 SwsFilter *dstFilterParam, *srcFilterParam; | |
524 sws_getFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam); | |
525 | |
526 return sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags | get_sws_cpuflags(), srcFilterParam, dstFilterParam); | |
527 } | |
528 | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
529 /// 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
|
530 static struct size_preset { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
531 char* name; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
532 int w, h; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
533 } vf_size_presets_defs[] = { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
534 // TODO add more 'standard' resolutions |
10814
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
535 { "qntsc", 352, 240 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
536 { "qpal", 352, 288 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
537 { "ntsc", 720, 480 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
538 { "pal", 720, 576 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
539 { "sntsc", 640, 480 }, |
7f34ec540e0f
size presets: added the standard resolutions as proposed by Fabrice (ffmpeg)
alex
parents:
10632
diff
changeset
|
540 { "spal", 768, 576 }, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
541 { NULL, 0, 0} |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
542 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
543 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
544 #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
|
545 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
|
546 {"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
|
547 {"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
|
548 { 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
|
549 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
550 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
551 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
|
552 "scale_size_preset", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
553 sizeof(struct size_preset), |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
554 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
555 vf_size_preset_fields |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
556 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
557 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
558 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
|
559 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
|
560 &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
|
561 &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
|
562 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
|
563 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
|
564 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
565 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
566 /// Now the options |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
567 #undef ST_OFF |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
568 #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
|
569 static m_option_t vf_opts_fields[] = { |
9598 | 570 {"w", ST_OFF(w), CONF_TYPE_INT, M_OPT_MIN,-3 ,0, NULL}, |
571 {"h", ST_OFF(h), CONF_TYPE_INT, M_OPT_MIN,-3 ,0, NULL}, | |
11700 | 572 {"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
|
573 {"chr-drop", ST_OFF(v_chr_drop), CONF_TYPE_INT, M_OPT_RANGE, 0, 3, NULL}, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
574 {"param", ST_OFF(param), CONF_TYPE_INT, M_OPT_RANGE, 0, 100, NULL}, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
575 // 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
|
576 // 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
|
577 {"presize", 0, CONF_TYPE_OBJ_PRESETS, 0, 0, 0, &size_preset}, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
578 { 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
|
579 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
580 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
581 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
|
582 "scale", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
583 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
|
584 &vf_priv_dflt, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
585 vf_opts_fields |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
586 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
587 |
5522 | 588 vf_info_t vf_info_scale = { |
589 "software scaling", | |
590 "scale", | |
591 "A'rpi", | |
592 "", | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
593 open, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9494
diff
changeset
|
594 &vf_opts |
5522 | 595 }; |
596 | |
597 //===========================================================================// |