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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
1 #include <stdio.h>
545c13161589 swscale filter
arpi
parents:
diff changeset
2 #include <stdlib.h>
545c13161589 swscale filter
arpi
parents:
diff changeset
3 #include <string.h>
545c13161589 swscale filter
arpi
parents:
diff changeset
4 #include <inttypes.h>
545c13161589 swscale filter
arpi
parents:
diff changeset
5
545c13161589 swscale filter
arpi
parents:
diff changeset
6 #include "../config.h"
545c13161589 swscale filter
arpi
parents:
diff changeset
7 #include "../mp_msg.h"
9975
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
8 #include "../cpudetect.h"
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
9
5607
1972c3475d93 mp_image.h and img_format.h moved to libmpcodecs
arpi
parents: 5565
diff changeset
10 #include "img_format.h"
1972c3475d93 mp_image.h and img_format.h moved to libmpcodecs
arpi
parents: 5565
diff changeset
11 #include "mp_image.h"
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
12 #include "vf.h"
545c13161589 swscale filter
arpi
parents:
diff changeset
13
545c13161589 swscale filter
arpi
parents:
diff changeset
14 #include "../libvo/fastmemcpy.h"
545c13161589 swscale filter
arpi
parents:
diff changeset
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
545c13161589 swscale filter
arpi
parents:
diff changeset
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
545c13161589 swscale filter
arpi
parents:
diff changeset
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
f47f12ba3b88 more scaling algos
michael
parents: 6542
diff changeset
24 int param;
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
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
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
27 struct SwsContext *ctx2; //for interlaced slices only
7783
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
28 unsigned char* palette;
11700
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
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
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
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
545c13161589 swscale filter
arpi
parents:
diff changeset
39 };
545c13161589 swscale filter
arpi
parents:
diff changeset
40
6060
61f39b98ba4d keep aspect ratio - based on Fredrik Kuivinen's idea
arpi
parents: 6003
diff changeset
41 extern int opt_screen_size_x;
61f39b98ba4d keep aspect ratio - based on Fredrik Kuivinen's idea
arpi
parents: 6003
diff changeset
42 extern int opt_screen_size_y;
61f39b98ba4d keep aspect ratio - based on Fredrik Kuivinen's idea
arpi
parents: 6003
diff changeset
43
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
44 //===========================================================================//
545c13161589 swscale filter
arpi
parents:
diff changeset
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
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
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
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
61 IMGFMT_BGR32,
7403
7d6d73150c6c out formats reordered, quality order
arpi
parents: 7368
diff changeset
62 IMGFMT_RGB32,
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
63 IMGFMT_BGR24,
7403
7d6d73150c6c out formats reordered, quality order
arpi
parents: 7368
diff changeset
64 IMGFMT_RGB24,
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
65 IMGFMT_BGR16,
7403
7d6d73150c6c out formats reordered, quality order
arpi
parents: 7368
diff changeset
66 IMGFMT_RGB16,
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
67 IMGFMT_BGR15,
7403
7d6d73150c6c out formats reordered, quality order
arpi
parents: 7368
diff changeset
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
f47f12ba3b88 more scaling algos
michael
parents: 6542
diff changeset
71 IMGFMT_BGR8,
7403
7d6d73150c6c out formats reordered, quality order
arpi
parents: 7368
diff changeset
72 IMGFMT_RGB8,
6637
f47f12ba3b88 more scaling algos
michael
parents: 6542
diff changeset
73 IMGFMT_BGR4,
7403
7d6d73150c6c out formats reordered, quality order
arpi
parents: 7368
diff changeset
74 IMGFMT_RGB4,
9171
898e5270a46e fixing rgb4 & bgr4 (2 pixels per byte)
michael
parents: 9071
diff changeset
75 IMGFMT_BG4B,
898e5270a46e fixing rgb4 & bgr4 (2 pixels per byte)
michael
parents: 9071
diff changeset
76 IMGFMT_RG4B,
6637
f47f12ba3b88 more scaling algos
michael
parents: 6542
diff changeset
77 IMGFMT_BGR1,
f47f12ba3b88 more scaling algos
michael
parents: 6542
diff changeset
78 IMGFMT_RGB1,
6188
39a9515c633a warning fixes, patch by Ulrich Hecht <uli@suse.de>
arpi
parents: 6138
diff changeset
79 0
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
80 };
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
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
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
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
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
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
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
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
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
116 return 0;
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
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
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
142
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
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
71d1a2815e16 some missing formats
alex
parents: 11068
diff changeset
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
71d1a2815e16 some missing formats
alex
parents: 11068
diff changeset
155 case IMGFMT_I420:
71d1a2815e16 some missing formats
alex
parents: 11068
diff changeset
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
28f800545e63 w/h=0 means d_w/h instead of original
arpi
parents: 5712
diff changeset
174 if(vf->priv->h<0) vf->priv->h=height; else
28f800545e63 w/h=0 means d_w/h instead of original
arpi
parents: 5712
diff changeset
175 if(vf->priv->h==0) vf->priv->h=d_height;
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
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
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
178 width,height,vo_format_name(outfmt),
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
179 vf->priv->w,vf->priv->h,vo_format_name(best));
5526
30679378f814 free old context, really use query_format
arpi
parents: 5525
diff changeset
180
30679378f814 free old context, really use query_format
arpi
parents: 5525
diff changeset
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
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
183 if(vf->priv->ctx2)sws_freeContext(vf->priv->ctx2);
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
184
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
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
f47f12ba3b88 more scaling algos
michael
parents: 6542
diff changeset
188 int_sws_flags|= vf->priv->param << SWS_PARAM_SHIFT;
11700
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
189 vf->priv->ctx=sws_getContext(width, height >> vf->priv->interlaced,
9697
5025150738eb 10000l (YUV vs. YVU swscale fix/cleanup)
michael
parents: 9598
diff changeset
190 outfmt,
11700
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
191 vf->priv->w, vf->priv->h >> vf->priv->interlaced,
9697
5025150738eb 10000l (YUV vs. YVU swscale fix/cleanup)
michael
parents: 9598
diff changeset
192 best,
9975
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
193 int_sws_flags | get_sws_cpuflags(), srcFilter, dstFilter);
11700
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
194 if(vf->priv->interlaced){
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
195 vf->priv->ctx2=sws_getContext(width, height >> 1,
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
196 outfmt,
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
197 vf->priv->w, vf->priv->h >> 1,
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
198 best,
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
199 int_sws_flags | get_sws_cpuflags(), srcFilter, dstFilter);
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
200 }
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
201 if(!vf->priv->ctx){
545c13161589 swscale filter
arpi
parents:
diff changeset
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
545c13161589 swscale filter
arpi
parents:
diff changeset
204 return 0;
545c13161589 swscale filter
arpi
parents:
diff changeset
205 }
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
206 vf->priv->fmt=best;
6060
61f39b98ba4d keep aspect ratio - based on Fredrik Kuivinen's idea
arpi
parents: 6003
diff changeset
207
7783
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
208 if(vf->priv->palette){
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
209 free(vf->priv->palette);
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
210 vf->priv->palette=NULL;
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
211 }
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
212 switch(best){
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
213 case IMGFMT_BGR8: {
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
214 /* set 332 palette for 8 bpp */
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
215 int i;
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
216 vf->priv->palette=malloc(4*256);
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
217 for(i=0; i<256; i++){
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
218 vf->priv->palette[4*i+0]=4*(i&3)*21;
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
219 vf->priv->palette[4*i+1]=4*((i>>2)&7)*9;
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
220 vf->priv->palette[4*i+2]=4*((i>>5)&7)*9;
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
221 }
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
222 break; }
9171
898e5270a46e fixing rgb4 & bgr4 (2 pixels per byte)
michael
parents: 9071
diff changeset
223 case IMGFMT_BGR4:
898e5270a46e fixing rgb4 & bgr4 (2 pixels per byte)
michael
parents: 9071
diff changeset
224 case IMGFMT_BG4B: {
7783
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
225 int i;
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
226 vf->priv->palette=malloc(4*16);
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
227 for(i=0; i<16; i++){
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
228 vf->priv->palette[4*i+0]=4*(i&1)*63;
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
229 vf->priv->palette[4*i+1]=4*((i>>1)&3)*21;
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
230 vf->priv->palette[4*i+2]=4*((i>>3)&1)*63;
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
231 }
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
232 break; }
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
233 }
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
234
6060
61f39b98ba4d keep aspect ratio - based on Fredrik Kuivinen's idea
arpi
parents: 6003
diff changeset
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
61f39b98ba4d keep aspect ratio - based on Fredrik Kuivinen's idea
arpi
parents: 6003
diff changeset
247 }
5525
arpi
parents: 5523
diff changeset
248 return vf_next_config(vf,vf->priv->w,vf->priv->h,d_width,d_height,flags,best);
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
249 }
545c13161589 swscale filter
arpi
parents:
diff changeset
250
9491
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
251 static void start_slice(struct vf_instance_s* vf, mp_image_t *mpi){
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
252 // printf("start_slice called! flag=%d\n",mpi->flags&MP_IMGFLAG_DRAW_CALLBACK);
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
253 if(!(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)) return; // shouldn't happen
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
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
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
256 // mpi->type, mpi->flags & (~MP_IMGFLAG_DRAW_CALLBACK),
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
257 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
258 vf->priv->w, vf->priv->h);
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
259 }
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
260
11700
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
261 static void scale(struct SwsContext *sws1, struct SwsContext *sws2, uint8_t *src[3], int src_stride[3], int y, int h,
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
262 uint8_t *dst[3], int dst_stride[3], int interlaced){
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
263 if(interlaced){
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
264 int i;
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
265 uint8_t *src2[3]={src[0], src[1], src[2]};
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
266 uint8_t *dst2[3]={dst[0], dst[1], dst[2]};
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
267 int src_stride2[3]={2*src_stride[0], 2*src_stride[1], 2*src_stride[2]};
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
268 int dst_stride2[3]={2*dst_stride[0], 2*dst_stride[1], 2*dst_stride[2]};
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
269
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
270 sws_scale_ordered(sws1, src2, src_stride2, y>>1, h>>1, dst2, dst_stride2);
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
271 for(i=0; i<3; i++){
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
272 src2[i] += src_stride[i];
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
273 dst2[i] += dst_stride[i];
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
274 }
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
275 sws_scale_ordered(sws2, src2, src_stride2, y>>1, h>>1, dst2, dst_stride2);
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
276 }else{
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
277 sws_scale_ordered(sws1, src, src_stride, y, h, dst, dst_stride);
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
278 }
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
279 }
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
280
9491
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
281 static void draw_slice(struct vf_instance_s* vf,
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
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
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
284 if(!dmpi){
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
285 mp_msg(MSGT_VFILTER,MSGL_FATAL,"vf_scale: draw_slice() called with dmpi=NULL (no get_image??)\n");
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
286 return;
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
287 }
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
288 // printf("vf_scale::draw_slice() y=%d h=%d\n",y,h);
11700
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
289 scale(vf->priv->ctx, vf->priv->ctx2, src, stride, y, h, dmpi->planes, dmpi->stride, vf->priv->interlaced);
9491
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
290 }
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
291
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7044
diff changeset
292 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){
9491
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
293 mp_image_t *dmpi=mpi->priv;
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
294
9491
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
295 // printf("vf_scale::put_image(): processing whole frame! dmpi=%p flag=%d\n",
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
296 // dmpi, (mpi->flags&MP_IMGFLAG_DRAW_CALLBACK));
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
297
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
298 if(!(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK && dmpi)){
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
299
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
300 // hope we'll get DR buffer:
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
301 dmpi=vf_get_image(vf->next,vf->priv->fmt,
6876
49485d9f0d47 imho swscale also likes aligned stride :)
arpi
parents: 6863
diff changeset
302 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
303 vf->priv->w, vf->priv->h);
11700
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
304
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
305 scale(vf->priv->ctx, vf->priv->ctx, mpi->planes,mpi->stride,0,mpi->h,dmpi->planes,dmpi->stride, vf->priv->interlaced);
9491
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
306 }
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
307
5527
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
308 if(vf->priv->w==mpi->w && vf->priv->h==mpi->h){
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
309 // just conversion, no scaling -> keep postprocessing data
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
310 // this way we can apply pp filter to non-yv12 source using scaler
9934
89da8ec89558 vf_clone_mpi_attributes()
michael
parents: 9697
diff changeset
311 vf_clone_mpi_attributes(dmpi, mpi);
5527
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
312 }
7783
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
313
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
314 if(vf->priv->palette) dmpi->planes[1]=vf->priv->palette; // export palette!
5527
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
315
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7044
diff changeset
316 return vf_next_put_image(vf,dmpi);
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
317 }
545c13161589 swscale filter
arpi
parents:
diff changeset
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
2294cbc41c34 -brightness && -vf scale fix
michael
parents: 10233
diff changeset
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
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
365 if(vf->priv->ctx2){
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
366 r= sws_setColorspaceDetails(vf->priv->ctx2, inv_table, srcRange, table, dstRange, brightness, contrast, saturation);
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
367 if(r<0) break;
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
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
545c13161589 swscale filter
arpi
parents:
diff changeset
378 //===========================================================================//
545c13161589 swscale filter
arpi
parents:
diff changeset
379
9071
25baacd1c650 UYVY input
michael
parents: 7783
diff changeset
380 // supported Input formats: YV12, I420, IYUV, YUY2, UYVY, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8, Y800
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
381
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
382 static int query_format(struct vf_instance_s* vf, unsigned int fmt){
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
383 switch(fmt){
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
384 case IMGFMT_YV12:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
385 case IMGFMT_I420:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
386 case IMGFMT_IYUV:
9071
25baacd1c650 UYVY input
michael
parents: 7783
diff changeset
387 case IMGFMT_UYVY:
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
388 case IMGFMT_YUY2:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
389 case IMGFMT_BGR32:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
390 case IMGFMT_BGR24:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
391 case IMGFMT_BGR16:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
392 case IMGFMT_BGR15:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
393 case IMGFMT_RGB32:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
394 case IMGFMT_RGB24:
6533
52f8bde27fea yvu9 & y8
michael
parents: 6188
diff changeset
395 case IMGFMT_Y800:
52f8bde27fea yvu9 & y8
michael
parents: 6188
diff changeset
396 case IMGFMT_Y8:
52f8bde27fea yvu9 & y8
michael
parents: 6188
diff changeset
397 case IMGFMT_YVU9:
6536
87942adf9c1c IF09 added
arpi
parents: 6533
diff changeset
398 case IMGFMT_IF09:
6863
713182435a76 planar yuv 444 422 411 support
michael
parents: 6750
diff changeset
399 case IMGFMT_444P:
713182435a76 planar yuv 444 422 411 support
michael
parents: 6750
diff changeset
400 case IMGFMT_422P:
713182435a76 planar yuv 444 422 411 support
michael
parents: 6750
diff changeset
401 case IMGFMT_411P:
6533
52f8bde27fea yvu9 & y8
michael
parents: 6188
diff changeset
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
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
413 }
5565
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
414 return 0; // nomatching in-fmt
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
415 }
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
416
11537
93a76eee7657 uninit support
alex
parents: 11373
diff changeset
417 static void uninit(struct vf_instance_s *vf){
93a76eee7657 uninit support
alex
parents: 11373
diff changeset
418 if(vf->priv->ctx) sws_freeContext(vf->priv->ctx);
11700
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
419 if(vf->priv->ctx2) sws_freeContext(vf->priv->ctx2);
11537
93a76eee7657 uninit support
alex
parents: 11373
diff changeset
420 if(vf->priv->palette) free(vf->priv->palette);
93a76eee7657 uninit support
alex
parents: 11373
diff changeset
421 free(vf->priv);
93a76eee7657 uninit support
alex
parents: 11373
diff changeset
422 }
93a76eee7657 uninit support
alex
parents: 11373
diff changeset
423
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
424 static int open(vf_instance_t *vf, char* args){
545c13161589 swscale filter
arpi
parents:
diff changeset
425 vf->config=config;
9491
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
426 vf->start_slice=start_slice;
21f7d83507ca draw_slice support
arpi
parents: 9476
diff changeset
427 vf->draw_slice=draw_slice;
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
428 vf->put_image=put_image;
5526
30679378f814 free old context, really use query_format
arpi
parents: 5525
diff changeset
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
93a76eee7657 uninit support
alex
parents: 11373
diff changeset
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
545c13161589 swscale filter
arpi
parents:
diff changeset
433 vf->priv=malloc(sizeof(struct vf_priv_s));
545c13161589 swscale filter
arpi
parents:
diff changeset
434 // TODO: parse args ->
545c13161589 swscale filter
arpi
parents:
diff changeset
435 vf->priv->ctx=NULL;
11700
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
436 vf->priv->ctx2=NULL;
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
437 vf->priv->w=
545c13161589 swscale filter
arpi
parents:
diff changeset
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
f47f12ba3b88 more scaling algos
michael
parents: 6542
diff changeset
440 vf->priv->param=0;
7783
29c059774519 exporting palette for 4/8bpp modes
arpi
parents: 7720
diff changeset
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
f47f12ba3b88 more scaling algos
michael
parents: 6542
diff changeset
443 if(args) sscanf(args, "%d:%d:%d:%d",
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
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
f47f12ba3b88 more scaling algos
michael
parents: 6542
diff changeset
446 &vf->priv->v_chr_drop,
f47f12ba3b88 more scaling algos
michael
parents: 6542
diff changeset
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
545c13161589 swscale filter
arpi
parents:
diff changeset
449 vf->priv->w,
545c13161589 swscale filter
arpi
parents:
diff changeset
450 vf->priv->h);
11700
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
451
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
452 return 1;
545c13161589 swscale filter
arpi
parents:
diff changeset
453 }
545c13161589 swscale filter
arpi
parents:
diff changeset
454
9975
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
455 //global sws_flags from the command line
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
456 int sws_flags=2;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
457
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
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
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
460
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
461 float sws_lum_gblur= 0.0;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
462 float sws_chr_gblur= 0.0;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
463 int sws_chr_vshift= 0;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
464 int sws_chr_hshift= 0;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
465 float sws_chr_sharpen= 0.0;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
466 float sws_lum_sharpen= 0.0;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
467
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
468 int get_sws_cpuflags(){
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
469 return
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
470 (gCpuCaps.hasMMX ? SWS_CPU_CAPS_MMX : 0)
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
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
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
474 }
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
475
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
476 void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam)
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
477 {
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
478 static int firstTime=1;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
479 *flags=0;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
480
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
481 #ifdef ARCH_X86
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
482 if(gCpuCaps.hasMMX)
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
483 asm volatile("emms\n\t"::: "memory"); //FIXME this shouldnt be required but it IS (even for non mmx versions)
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
484 #endif
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
485 if(firstTime)
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
486 {
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
487 firstTime=0;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
488 *flags= SWS_PRINT_INFO;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
489 }
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
490 else if(verbose>1) *flags= SWS_PRINT_INFO;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
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
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
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
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
499 switch(sws_flags)
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
500 {
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
501 case 0: *flags|= SWS_FAST_BILINEAR; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
502 case 1: *flags|= SWS_BILINEAR; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
503 case 2: *flags|= SWS_BICUBIC; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
504 case 3: *flags|= SWS_X; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
505 case 4: *flags|= SWS_POINT; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
506 case 5: *flags|= SWS_AREA; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
507 case 6: *flags|= SWS_BICUBLIN; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
508 case 7: *flags|= SWS_GAUSS; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
509 case 8: *flags|= SWS_SINC; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
510 case 9: *flags|= SWS_LANCZOS; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
511 case 10:*flags|= SWS_SPLINE; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
512 default:*flags|= SWS_BILINEAR; break;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
513 }
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
514
9985
3d8b145a5470 moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents: 9975
diff changeset
515 *srcFilterParam= src_filter;
9975
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
516 *dstFilterParam= NULL;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
517 }
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
518
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
519 // will use sws_flags & src_filter (from cmd line)
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
520 struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat)
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
521 {
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
522 int flags;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
523 SwsFilter *dstFilterParam, *srcFilterParam;
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
524 sws_getFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam);
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
525
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
526 return sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags | get_sws_cpuflags(), srcFilterParam, dstFilterParam);
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
527 }
3914afe5c0a7 removing sws - global verbose var dependancy
michael
parents: 9934
diff changeset
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
ec21eefff17e 10L the scale filter accpet w and h to -3
albeu
parents: 9593
diff changeset
570 {"w", ST_OFF(w), CONF_TYPE_INT, M_OPT_MIN,-3 ,0, NULL},
ec21eefff17e 10L the scale filter accpet w and h to -3
albeu
parents: 9593
diff changeset
571 {"h", ST_OFF(h), CONF_TYPE_INT, M_OPT_MIN,-3 ,0, NULL},
11700
272fc35fd8ee interlaced scaling
michael
parents: 11537
diff changeset
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
545c13161589 swscale filter
arpi
parents:
diff changeset
588 vf_info_t vf_info_scale = {
545c13161589 swscale filter
arpi
parents:
diff changeset
589 "software scaling",
545c13161589 swscale filter
arpi
parents:
diff changeset
590 "scale",
545c13161589 swscale filter
arpi
parents:
diff changeset
591 "A'rpi",
545c13161589 swscale filter
arpi
parents:
diff changeset
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
545c13161589 swscale filter
arpi
parents:
diff changeset
595 };
545c13161589 swscale filter
arpi
parents:
diff changeset
596
545c13161589 swscale filter
arpi
parents:
diff changeset
597 //===========================================================================//