Mercurial > mplayer.hg
annotate libmpcodecs/vf_dsize.c @ 20624:9a47b083d2be
r20571: cvidix tricks
r20572: (doesn't apply)
r20614: another missing <application>
r20637: libmpdvdkit no longer exists.
author | kraymer |
---|---|
date | Fri, 03 Nov 2006 14:30:07 +0000 |
parents | f9b0c8fe997e |
children | 00fff9a3b735 |
rev | line source |
---|---|
10006 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
4 #include <inttypes.h> | |
5 | |
17012 | 6 #include "config.h" |
7 #include "mp_msg.h" | |
10006 | 8 |
9 #include "img_format.h" | |
10 #include "mp_image.h" | |
11 #include "vf.h" | |
12 | |
13 struct vf_priv_s { | |
14 int w, h; | |
16040 | 15 int method; // aspect method, 0 -> downscale, 1-> upscale. +2 -> original aspect. |
16 int round; | |
10006 | 17 float aspect; |
18 }; | |
19 | |
20 static int config(struct vf_instance_s* vf, | |
21 int width, int height, int d_width, int d_height, | |
22 unsigned int flags, unsigned int outfmt) | |
23 { | |
16040 | 24 if (vf->priv->aspect < 0.001) { // did the user input aspect or w,h params |
25 if (vf->priv->w == 0) vf->priv->w = d_width; | |
26 if (vf->priv->h == 0) vf->priv->h = d_height; | |
27 if (vf->priv->w == -1) vf->priv->w = width; | |
28 if (vf->priv->h == -1) vf->priv->h = height; | |
29 if (vf->priv->w == -2) vf->priv->w = vf->priv->h * (double)d_width / d_height; | |
30 if (vf->priv->w == -3) vf->priv->w = vf->priv->h * (double)width / height; | |
31 if (vf->priv->h == -2) vf->priv->h = vf->priv->w * (double)d_height / d_width; | |
32 if (vf->priv->h == -3) vf->priv->h = vf->priv->w * (double)height / width; | |
33 if (vf->priv->method > -1) { | |
17227
c2b50fc5d86a
I screwed up keep aspect param, made behavior the opposite of man page.
ods15
parents:
17012
diff
changeset
|
34 double aspect = (vf->priv->method & 2) ? ((double)height / width) : ((double)d_height / d_width); |
16040 | 35 if ((vf->priv->h > vf->priv->w * aspect) ^ (vf->priv->method & 1)) { |
36 vf->priv->h = vf->priv->w * aspect; | |
37 } else { | |
38 vf->priv->w = vf->priv->h / aspect; | |
39 } | |
40 } | |
41 if (vf->priv->round > 1) { // round up | |
42 vf->priv->w += (vf->priv->round - 1 - (vf->priv->w - 1) % vf->priv->round); | |
43 vf->priv->h += (vf->priv->round - 1 - (vf->priv->h - 1) % vf->priv->round); | |
44 } | |
10006 | 45 d_width = vf->priv->w; |
46 d_height = vf->priv->h; | |
47 } else { | |
48 if (vf->priv->aspect * height > width) { | |
18390 | 49 d_width = height * vf->priv->aspect + .5; |
10006 | 50 d_height = height; |
51 } else { | |
18390 | 52 d_height = width / vf->priv->aspect + .5; |
10006 | 53 d_width = width; |
54 } | |
55 } | |
56 return vf_next_config(vf, width, height, d_width, d_height, flags, outfmt); | |
57 } | |
58 | |
16040 | 59 static void uninit(vf_instance_t *vf) { |
60 free(vf->priv); | |
61 vf->priv = NULL; | |
62 } | |
63 | |
10006 | 64 static int open(vf_instance_t *vf, char* args) |
65 { | |
66 vf->config = config; | |
67 vf->draw_slice = vf_next_draw_slice; | |
16040 | 68 vf->uninit = uninit; |
10006 | 69 //vf->default_caps = 0; |
70 vf->priv = calloc(sizeof(struct vf_priv_s), 1); | |
16040 | 71 vf->priv->aspect = 0.; |
72 vf->priv->w = -1; | |
73 vf->priv->h = -1; | |
74 vf->priv->method = -1; | |
75 vf->priv->round = 1; | |
10006 | 76 if (args) { |
77 if (strchr(args, '/')) { | |
78 int w, h; | |
79 sscanf(args, "%d/%d", &w, &h); | |
80 vf->priv->aspect = (float)w/h; | |
81 } else if (strchr(args, '.')) { | |
82 sscanf(args, "%f", &vf->priv->aspect); | |
83 } else { | |
16040 | 84 sscanf(args, "%d:%d:%d:%d", &vf->priv->w, &vf->priv->h, &vf->priv->method, &vf->priv->round); |
10006 | 85 } |
86 } | |
16040 | 87 if ((vf->priv->aspect < 0.) || (vf->priv->w < -3) || (vf->priv->h < -3) || |
88 ((vf->priv->w < -1) && (vf->priv->h < -1)) || | |
89 (vf->priv->method < -1) || (vf->priv->method > 3) || | |
90 (vf->priv->round < 0)) { | |
91 mp_msg(MSGT_VFILTER, MSGL_ERR, "[dsize] Illegal value(s): aspect: %f w: %d h: %d aspect_method: %d round: %d\n", vf->priv->aspect, vf->priv->w, vf->priv->h, vf->priv->method, vf->priv->round); | |
92 free(vf->priv); vf->priv = NULL; | |
93 return -1; | |
94 } | |
10006 | 95 return 1; |
96 } | |
97 | |
98 vf_info_t vf_info_dsize = { | |
99 "reset displaysize/aspect", | |
100 "dsize", | |
101 "Rich Felker", | |
102 "", | |
103 open, | |
104 NULL | |
105 }; | |
106 |