Mercurial > mplayer.hg
annotate libmpcodecs/vf_geq.c @ 32282:606e4157cd4c
Split alloc and init of context so that parameters can be set in the context
instead of requireing being passed through function parameters. This also
makes sws work with AVOptions.
author | michael |
---|---|
date | Sun, 26 Sep 2010 19:33:57 +0000 |
parents | 59a6592b57b7 |
children | 8fa2f43cb760 |
rev | line source |
---|---|
20266 | 1 /* |
26727 | 2 * Copyright (C) 2006 Michael Niedermayer <michaelni@gmx.at> |
3 * | |
4 * This file is part of MPlayer. | |
5 * | |
6 * MPlayer is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * MPlayer is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License along | |
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
19 */ | |
20266 | 20 |
21 #include <stdio.h> | |
22 #include <stdlib.h> | |
23 #include <string.h> | |
24 #include <math.h> | |
25 #include <inttypes.h> | |
26 | |
27 #include "config.h" | |
28 | |
29 #include "mp_msg.h" | |
30 #include "cpudetect.h" | |
31 | |
24738 | 32 #include "img_format.h" |
33 #include "mp_image.h" | |
34 #include "vf.h" | |
35 | |
20266 | 36 #include "libavcodec/avcodec.h" |
31256 | 37 #include "libavutil/eval.h" |
20266 | 38 |
39 struct vf_priv_s { | |
30987
e1483ae3d93c
Fix build due to FFmpeg r22833 change (typedef rename).
iive
parents:
30642
diff
changeset
|
40 AVExpr * e[3]; |
20456 | 41 int framenum; |
42 mp_image_t *mpi; | |
20266 | 43 }; |
44 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
45 static int config(struct vf_instance *vf, |
20266 | 46 int width, int height, int d_width, int d_height, |
20456 | 47 unsigned int flags, unsigned int outfmt){ |
48 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); | |
20266 | 49 } |
50 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
51 static inline double getpix(struct vf_instance *vf, double x, double y, int plane){ |
20270 | 52 int xi, yi; |
53 mp_image_t *mpi= vf->priv->mpi; | |
54 int stride= mpi->stride[plane]; | |
55 uint8_t *src= mpi->planes[plane]; | |
56 xi=x= FFMIN(FFMAX(x, 0), (mpi->w >> (plane ? mpi->chroma_x_shift : 0))-1); | |
57 yi=y= FFMIN(FFMAX(y, 0), (mpi->h >> (plane ? mpi->chroma_y_shift : 0))-1); | |
58 | |
59 x-=xi; | |
60 y-=yi; | |
61 | |
62 return | |
63 (1-y)*((1-x)*src[xi + yi * stride] + x*src[xi + 1 + yi * stride]) | |
64 + y *((1-x)*src[xi + (yi+1) * stride] + x*src[xi + 1 + (yi+1) * stride]); | |
65 } | |
66 | |
67 //FIXME cubic interpolate | |
20266 | 68 //FIXME keep the last few frames |
31543
59a6592b57b7
Fix function prototypes to match the required type.
reimar
parents:
31256
diff
changeset
|
69 static double lum(void *vf, double x, double y){ |
20270 | 70 return getpix(vf, x, y, 0); |
20266 | 71 } |
72 | |
31543
59a6592b57b7
Fix function prototypes to match the required type.
reimar
parents:
31256
diff
changeset
|
73 static double cb(void *vf, double x, double y){ |
20270 | 74 return getpix(vf, x, y, 1); |
20266 | 75 } |
76 | |
31543
59a6592b57b7
Fix function prototypes to match the required type.
reimar
parents:
31256
diff
changeset
|
77 static double cr(void *vf, double x, double y){ |
20270 | 78 return getpix(vf, x, y, 2); |
20266 | 79 } |
80 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
81 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ |
20456 | 82 mp_image_t *dmpi; |
83 int x,y, plane; | |
20455 | 84 |
20456 | 85 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ |
86 // no DR, so get a new image! hope we'll get DR buffer: | |
87 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, MP_IMGTYPE_TEMP, | |
88 MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, | |
89 mpi->w,mpi->h); | |
90 } | |
20455 | 91 |
20456 | 92 dmpi= vf->dmpi; |
93 vf->priv->mpi= mpi; | |
20455 | 94 |
20456 | 95 vf_clone_mpi_attributes(dmpi, mpi); |
20455 | 96 |
20456 | 97 for(plane=0; plane<3; plane++){ |
98 int w= mpi->w >> (plane ? mpi->chroma_x_shift : 0); | |
99 int h= mpi->h >> (plane ? mpi->chroma_y_shift : 0); | |
100 uint8_t *dst = dmpi->planes[plane]; | |
101 int dst_stride= dmpi->stride[plane]; | |
102 double const_values[]={ | |
103 M_PI, | |
104 M_E, | |
105 0, | |
106 0, | |
107 w, | |
108 h, | |
109 vf->priv->framenum, | |
110 w/(double)mpi->w, | |
111 h/(double)mpi->h, | |
112 0 | |
113 }; | |
114 if (!vf->priv->e[plane]) continue; | |
115 for(y=0; y<h; y++){ | |
116 const_values[3]=y; | |
117 for(x=0; x<w; x++){ | |
118 const_values[2]=x; | |
31256 | 119 dst[x + y * dst_stride] = av_eval_expr(vf->priv->e[plane], |
30989 | 120 const_values, vf); |
20455 | 121 } |
122 } | |
20456 | 123 } |
20455 | 124 |
20456 | 125 vf->priv->framenum++; |
20455 | 126 |
20456 | 127 return vf_next_put_image(vf,dmpi, pts); |
20455 | 128 } |
129 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
130 static void uninit(struct vf_instance *vf){ |
20456 | 131 if(!vf->priv) return; |
20455 | 132 |
20456 | 133 av_free(vf->priv); |
134 vf->priv=NULL; | |
20455 | 135 } |
136 | |
137 //===========================================================================// | |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
27694
diff
changeset
|
138 static int vf_open(vf_instance_t *vf, char *args){ |
20455 | 139 char eq[3][2000] = { { 0 }, { 0 }, { 0 } }; |
31233 | 140 int plane, res; |
20455 | 141 |
142 vf->config=config; | |
143 vf->put_image=put_image; | |
144 // vf->get_image=get_image; | |
145 vf->uninit=uninit; | |
146 vf->priv=av_malloc(sizeof(struct vf_priv_s)); | |
147 memset(vf->priv, 0, sizeof(struct vf_priv_s)); | |
148 | |
20466 | 149 if (args) sscanf(args, "%1999[^:]:%1999[^:]:%1999[^:]", eq[0], eq[1], eq[2]); |
20455 | 150 |
151 if (!eq[1][0]) strncpy(eq[1], eq[0], sizeof(eq[0])-1); | |
152 if (!eq[2][0]) strncpy(eq[2], eq[1], sizeof(eq[0])-1); | |
153 | |
154 for(plane=0; plane<3; plane++){ | |
20266 | 155 static const char *const_names[]={ |
156 "PI", | |
157 "E", | |
158 "X", | |
159 "Y", | |
160 "W", | |
161 "H", | |
162 "N", | |
163 "SW", | |
164 "SH", | |
165 NULL | |
166 }; | |
167 static const char *func2_names[]={ | |
168 "lum", | |
169 "cb", | |
170 "cr", | |
171 "p", | |
172 NULL | |
173 }; | |
20455 | 174 double (*func2[])(void *, double, double)={ |
175 lum, | |
176 cb, | |
177 cr, | |
178 plane==0 ? lum : (plane==1 ? cb : cr), | |
179 NULL | |
180 }; | |
31256 | 181 res = av_parse_expr(&vf->priv->e[plane], eq[plane], const_names, NULL, NULL, func2_names, func2, 0, NULL); |
20266 | 182 |
31233 | 183 if (res < 0) { |
31130
d1f5069bef25
Fix compilation broken by FFmpeg-r23201 that changed the api of error logging.
iive
parents:
30991
diff
changeset
|
184 mp_msg(MSGT_VFILTER, MSGL_ERR, "geq: error loading equation `%s'\n", eq[plane]); |
d1f5069bef25
Fix compilation broken by FFmpeg-r23201 that changed the api of error logging.
iive
parents:
30991
diff
changeset
|
185 return 0; |
20266 | 186 } |
20455 | 187 } |
20266 | 188 |
189 return 1; | |
190 } | |
191 | |
25221 | 192 const vf_info_t vf_info_geq = { |
20266 | 193 "generic equation filter", |
194 "geq", | |
195 "Michael Niedermayer", | |
196 "", | |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
27694
diff
changeset
|
197 vf_open, |
20266 | 198 NULL |
199 }; |