Mercurial > mplayer.hg
annotate libmpcodecs/vf_hue.c @ 31816:ab9824b6acc7
dvd: Improve seeking by chapters.
The current code seeks to the start of the chapter. From this position, it then
tries to figure out the starting cell. This is completely suboptimal and error
prone since the starting cell can be directly deduced from the chapter.
patch by Olivier Rolland, billl users.sourceforge net
author | diego |
---|---|
date | Sun, 01 Aug 2010 22:51:15 +0000 |
parents | 4d15378da04a |
children | 8fa2f43cb760 |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29903
diff
changeset
|
18 |
11249 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <string.h> | |
22 #include <inttypes.h> | |
23 #include <math.h> | |
24 | |
17012 | 25 #include "config.h" |
26 #include "mp_msg.h" | |
27 #include "cpudetect.h" | |
11249 | 28 |
29 #include "img_format.h" | |
30 #include "mp_image.h" | |
31 #include "vf.h" | |
32 | |
17012 | 33 #include "libvo/video_out.h" |
11249 | 34 |
35 #include "m_option.h" | |
36 #include "m_struct.h" | |
37 | |
38 static struct vf_priv_s { | |
39 uint8_t *buf[2]; | |
40 float hue; | |
41 float saturation; | |
22027 | 42 } const vf_priv_dflt = { |
11249 | 43 {NULL, NULL}, |
44 0.0, | |
45 1.0, | |
46 }; | |
47 | |
48 static void process_C(uint8_t *udst, uint8_t *vdst, uint8_t *usrc, uint8_t *vsrc, int dststride, int srcstride, | |
49 int w, int h, float hue, float sat) | |
50 { | |
51 int i; | |
52 const int s= rint(sin(hue) * (1<<16) * sat); | |
53 const int c= rint(cos(hue) * (1<<16) * sat); | |
54 | |
55 while (h--) { | |
56 for (i = 0; i<w; i++) | |
57 { | |
58 const int u= usrc[i] - 128; | |
59 const int v= vsrc[i] - 128; | |
60 int new_u= (c*u - s*v + (1<<15) + (128<<16))>>16; | |
61 int new_v= (s*u + c*v + (1<<15) + (128<<16))>>16; | |
62 if(new_u & 768) new_u= (-new_u)>>31; | |
63 if(new_v & 768) new_v= (-new_v)>>31; | |
64 udst[i]= new_u; | |
65 vdst[i]= new_v; | |
66 } | |
67 usrc += srcstride; | |
68 vsrc += srcstride; | |
69 udst += dststride; | |
70 vdst += dststride; | |
71 } | |
72 } | |
73 | |
74 static void (*process)(uint8_t *udst, uint8_t *vdst, uint8_t *usrc, uint8_t *vsrc, int dststride, int srcstride, | |
75 int w, int h, float hue, float sat); | |
76 | |
77 /* FIXME: add packed yuv version of process */ | |
78 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
79 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) |
11249 | 80 { |
81 mp_image_t *dmpi; | |
82 | |
83 dmpi=vf_get_image(vf->next, mpi->imgfmt, | |
84 MP_IMGTYPE_EXPORT, 0, | |
85 mpi->w, mpi->h); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28628
diff
changeset
|
86 |
11249 | 87 dmpi->planes[0] = mpi->planes[0]; |
88 dmpi->stride[0] = mpi->stride[0]; | |
89 dmpi->stride[1] = mpi->stride[1]; | |
90 dmpi->stride[2] = mpi->stride[2]; | |
91 | |
92 if (!vf->priv->buf[0]){ | |
93 vf->priv->buf[0] = malloc(mpi->stride[1]*mpi->h >> mpi->chroma_y_shift); | |
94 vf->priv->buf[1] = malloc(mpi->stride[2]*mpi->h >> mpi->chroma_y_shift); | |
95 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28628
diff
changeset
|
96 |
13232
4b7b0cb1d6f3
hue filter bugfix by ("James Crowson" <jbcrowso at ncsu dot edu>)
michael
parents:
11306
diff
changeset
|
97 if (vf->priv->hue == 0 && vf->priv->saturation == 1){ |
11249 | 98 dmpi->planes[1] = mpi->planes[1]; |
99 dmpi->planes[2] = mpi->planes[2]; | |
100 }else { | |
101 dmpi->planes[1] = vf->priv->buf[0]; | |
102 dmpi->planes[2] = vf->priv->buf[1]; | |
103 process(dmpi->planes[1], dmpi->planes[2], | |
104 mpi->planes[1], mpi->planes[2], | |
105 dmpi->stride[1],mpi->stride[1], | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28628
diff
changeset
|
106 mpi->w>> mpi->chroma_x_shift, mpi->h>> mpi->chroma_y_shift, |
11249 | 107 vf->priv->hue, vf->priv->saturation); |
108 } | |
109 | |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17012
diff
changeset
|
110 return vf_next_put_image(vf,dmpi, pts); |
11249 | 111 } |
112 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
113 static int control(struct vf_instance *vf, int request, void* data) |
11249 | 114 { |
115 vf_equalizer_t *eq; | |
116 | |
117 switch (request) { | |
118 case VFCTRL_SET_EQUALIZER: | |
119 eq = data; | |
120 if (!strcmp(eq->item,"hue")) { | |
121 vf->priv->hue = eq->value * M_PI / 100; | |
122 return CONTROL_TRUE; | |
123 } else if (!strcmp(eq->item,"saturation")) { | |
16305
514353affc6e
Wrong scale conversion from VFCTRL_SET_EQUALIZER, priv->saturation should
reimar
parents:
14715
diff
changeset
|
124 vf->priv->saturation = (eq->value + 100)/100.0; |
11249 | 125 return CONTROL_TRUE; |
126 } | |
127 break; | |
128 case VFCTRL_GET_EQUALIZER: | |
129 eq = data; | |
130 if (!strcmp(eq->item,"hue")) { | |
131 eq->value = rint(vf->priv->hue *100 / M_PI); | |
132 return CONTROL_TRUE; | |
133 }else if (!strcmp(eq->item,"saturation")) { | |
134 eq->value = rint(vf->priv->saturation*100 - 100); | |
135 return CONTROL_TRUE; | |
136 } | |
137 break; | |
138 } | |
139 return vf_next_control(vf, request, data); | |
140 } | |
141 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
142 static int query_format(struct vf_instance *vf, unsigned int fmt) |
11249 | 143 { |
144 switch (fmt) { | |
145 case IMGFMT_YVU9: | |
146 case IMGFMT_IF09: | |
147 case IMGFMT_YV12: | |
148 case IMGFMT_I420: | |
149 case IMGFMT_IYUV: | |
150 case IMGFMT_CLPL: | |
151 case IMGFMT_444P: | |
152 case IMGFMT_422P: | |
153 case IMGFMT_411P: | |
154 return vf_next_query_format(vf, fmt); | |
155 } | |
156 return 0; | |
157 } | |
158 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
159 static void uninit(struct vf_instance *vf) |
11249 | 160 { |
161 if (vf->priv->buf[0]) free(vf->priv->buf[0]); | |
162 if (vf->priv->buf[1]) free(vf->priv->buf[1]); | |
163 free(vf->priv); | |
164 } | |
165 | |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
30633
diff
changeset
|
166 static int vf_open(vf_instance_t *vf, char *args) |
11249 | 167 { |
168 vf->control=control; | |
169 vf->query_format=query_format; | |
170 vf->put_image=put_image; | |
171 vf->uninit=uninit; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28628
diff
changeset
|
172 |
11249 | 173 vf->priv->hue *= M_PI / 180.0; |
174 | |
175 process = process_C; | |
176 return 1; | |
177 } | |
178 | |
179 #define ST_OFF(f) M_ST_OFF(struct vf_priv_s,f) | |
30707 | 180 static const m_option_t vf_opts_fields[] = { |
11249 | 181 {"hue", ST_OFF(hue), CONF_TYPE_FLOAT, M_OPT_RANGE,-180.0 ,180.0, NULL}, |
182 {"saturation", ST_OFF(saturation), CONF_TYPE_FLOAT, M_OPT_RANGE,-10.0 ,10.0, NULL}, | |
183 { NULL, NULL, 0, 0, 0, 0, NULL } | |
184 }; | |
185 | |
30707 | 186 static const m_struct_t vf_opts = { |
11249 | 187 "hue", |
188 sizeof(struct vf_priv_s), | |
189 &vf_priv_dflt, | |
190 vf_opts_fields | |
191 }; | |
192 | |
25221 | 193 const vf_info_t vf_info_hue = { |
11249 | 194 "hue changer", |
195 "hue", | |
196 "Michael Niedermayer", | |
197 "", | |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
30633
diff
changeset
|
198 vf_open, |
11249 | 199 &vf_opts |
200 }; |