annotate libmpcodecs/vf_geq.c @ 25194:e816d546c4fe

ao_null: Make duration of "buffered" audio constant Choose the "buffer size" for the amount of audio the driver accepts so that it corresponds to about 0.2 seconds of playback based on the number of channels, sample size and samplerate.
author uau
date Sat, 01 Dec 2007 01:39:39 +0000
parents 72466750cdcd
children 00fff9a3b735
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
1 /*
5f216140e72b generic equation filter
michael
parents:
diff changeset
2 Copyright (C) 2006 Michael Niedermayer <michaelni@gmx.at>
5f216140e72b generic equation filter
michael
parents:
diff changeset
3
5f216140e72b generic equation filter
michael
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
5f216140e72b generic equation filter
michael
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
5f216140e72b generic equation filter
michael
parents:
diff changeset
6 the Free Software Foundation; either version 2 of the License, or
5f216140e72b generic equation filter
michael
parents:
diff changeset
7 (at your option) any later version.
5f216140e72b generic equation filter
michael
parents:
diff changeset
8
5f216140e72b generic equation filter
michael
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
5f216140e72b generic equation filter
michael
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
5f216140e72b generic equation filter
michael
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5f216140e72b generic equation filter
michael
parents:
diff changeset
12 GNU General Public License for more details.
5f216140e72b generic equation filter
michael
parents:
diff changeset
13
5f216140e72b generic equation filter
michael
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
5f216140e72b generic equation filter
michael
parents:
diff changeset
15 along with this program; if not, write to the Free Software
5f216140e72b generic equation filter
michael
parents:
diff changeset
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
5f216140e72b generic equation filter
michael
parents:
diff changeset
17 */
5f216140e72b generic equation filter
michael
parents:
diff changeset
18
5f216140e72b generic equation filter
michael
parents:
diff changeset
19 #include <stdio.h>
5f216140e72b generic equation filter
michael
parents:
diff changeset
20 #include <stdlib.h>
5f216140e72b generic equation filter
michael
parents:
diff changeset
21 #include <string.h>
5f216140e72b generic equation filter
michael
parents:
diff changeset
22 #include <math.h>
5f216140e72b generic equation filter
michael
parents:
diff changeset
23 #include <inttypes.h>
5f216140e72b generic equation filter
michael
parents:
diff changeset
24
5f216140e72b generic equation filter
michael
parents:
diff changeset
25 #include "config.h"
5f216140e72b generic equation filter
michael
parents:
diff changeset
26
5f216140e72b generic equation filter
michael
parents:
diff changeset
27 #include "mp_msg.h"
5f216140e72b generic equation filter
michael
parents:
diff changeset
28 #include "cpudetect.h"
5f216140e72b generic equation filter
michael
parents:
diff changeset
29
24738
45189040161d Reorder #includes to get rid of the FIXME
zuxy
parents: 24737
diff changeset
30 #include "img_format.h"
45189040161d Reorder #includes to get rid of the FIXME
zuxy
parents: 24737
diff changeset
31 #include "mp_image.h"
45189040161d Reorder #includes to get rid of the FIXME
zuxy
parents: 24737
diff changeset
32 #include "vf.h"
45189040161d Reorder #includes to get rid of the FIXME
zuxy
parents: 24737
diff changeset
33
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
34 #define HAVE_AV_CONFIG_H
5f216140e72b generic equation filter
michael
parents:
diff changeset
35 #include "libavcodec/avcodec.h"
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
36 #include "libavcodec/eval.h"
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
37
5f216140e72b generic equation filter
michael
parents:
diff changeset
38 struct vf_priv_s {
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
39 AVEvalExpr * e[3];
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
40 int framenum;
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
41 mp_image_t *mpi;
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
42 };
5f216140e72b generic equation filter
michael
parents:
diff changeset
43
5f216140e72b generic equation filter
michael
parents:
diff changeset
44 static int config(struct vf_instance_s* vf,
5f216140e72b generic equation filter
michael
parents:
diff changeset
45 int width, int height, int d_width, int d_height,
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
46 unsigned int flags, unsigned int outfmt){
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
47 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
48 }
5f216140e72b generic equation filter
michael
parents:
diff changeset
49
23219
cdf6ab5cf76d Fix "inline keyword not at beginning of declaration" warning.
diego
parents: 20466
diff changeset
50 static inline double getpix(struct vf_instance_s* vf, double x, double y, int plane){
20270
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
51 int xi, yi;
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
52 mp_image_t *mpi= vf->priv->mpi;
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
53 int stride= mpi->stride[plane];
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
54 uint8_t *src= mpi->planes[plane];
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
55 xi=x= FFMIN(FFMAX(x, 0), (mpi->w >> (plane ? mpi->chroma_x_shift : 0))-1);
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
56 yi=y= FFMIN(FFMAX(y, 0), (mpi->h >> (plane ? mpi->chroma_y_shift : 0))-1);
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
57
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
58 x-=xi;
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
59 y-=yi;
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
60
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
61 return
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
62 (1-y)*((1-x)*src[xi + yi * stride] + x*src[xi + 1 + yi * stride])
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
63 + y *((1-x)*src[xi + (yi+1) * stride] + x*src[xi + 1 + (yi+1) * stride]);
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
64 }
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
65
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
66 //FIXME cubic interpolate
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
67 //FIXME keep the last few frames
5f216140e72b generic equation filter
michael
parents:
diff changeset
68 static double lum(struct vf_instance_s* vf, double x, double y){
20270
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
69 return getpix(vf, x, y, 0);
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
70 }
5f216140e72b generic equation filter
michael
parents:
diff changeset
71
5f216140e72b generic equation filter
michael
parents:
diff changeset
72 static double cb(struct vf_instance_s* vf, double x, double y){
20270
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
73 return getpix(vf, x, y, 1);
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
74 }
5f216140e72b generic equation filter
michael
parents:
diff changeset
75
5f216140e72b generic equation filter
michael
parents:
diff changeset
76 static double cr(struct vf_instance_s* vf, double x, double y){
20270
eaddc65c500a bilinear interpolation
michael
parents: 20268
diff changeset
77 return getpix(vf, x, y, 2);
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
78 }
5f216140e72b generic equation filter
michael
parents:
diff changeset
79
5f216140e72b generic equation filter
michael
parents:
diff changeset
80 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
81 mp_image_t *dmpi;
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
82 int x,y, plane;
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
83
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
84 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
85 // no DR, so get a new image! hope we'll get DR buffer:
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
86 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, MP_IMGTYPE_TEMP,
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
87 MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
88 mpi->w,mpi->h);
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
89 }
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
90
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
91 dmpi= vf->dmpi;
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
92 vf->priv->mpi= mpi;
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
93
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
94 vf_clone_mpi_attributes(dmpi, mpi);
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
95
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
96 for(plane=0; plane<3; plane++){
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
97 int w= mpi->w >> (plane ? mpi->chroma_x_shift : 0);
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
98 int h= mpi->h >> (plane ? mpi->chroma_y_shift : 0);
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
99 uint8_t *dst = dmpi->planes[plane];
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
100 int dst_stride= dmpi->stride[plane];
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
101 double const_values[]={
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
102 M_PI,
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
103 M_E,
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
104 0,
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
105 0,
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
106 w,
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
107 h,
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
108 vf->priv->framenum,
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
109 w/(double)mpi->w,
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
110 h/(double)mpi->h,
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
111 0
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
112 };
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
113 if (!vf->priv->e[plane]) continue;
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
114 for(y=0; y<h; y++){
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
115 const_values[3]=y;
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
116 for(x=0; x<w; x++){
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
117 const_values[2]=x;
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
118 dst[x+y* dst_stride]= ff_parse_eval(vf->priv->e[plane], const_values, vf);
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
119 }
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
120 }
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
121 }
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
122
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
123 vf->priv->framenum++;
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
124
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
125 return vf_next_put_image(vf,dmpi, pts);
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
126 }
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
127
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
128 static void uninit(struct vf_instance_s* vf){
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
129 if(!vf->priv) return;
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
130
20456
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
131 av_free(vf->priv);
52b0d09d347a cosmetic, reindentation, tab removal
ods15
parents: 20455
diff changeset
132 vf->priv=NULL;
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
133 }
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
134
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
135 //===========================================================================//
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
136 static int open(vf_instance_t *vf, char* args){
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
137 char eq[3][2000] = { { 0 }, { 0 }, { 0 } };
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
138 int plane;
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
139
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
140 vf->config=config;
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
141 vf->put_image=put_image;
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
142 // vf->get_image=get_image;
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
143 vf->uninit=uninit;
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
144 vf->priv=av_malloc(sizeof(struct vf_priv_s));
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
145 memset(vf->priv, 0, sizeof(struct vf_priv_s));
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
146
20466
a5d299e877b2 make vf_geq read whitespace in equation param
ods15
parents: 20457
diff changeset
147 if (args) sscanf(args, "%1999[^:]:%1999[^:]:%1999[^:]", eq[0], eq[1], eq[2]);
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
148
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
149 if (!eq[1][0]) strncpy(eq[1], eq[0], sizeof(eq[0])-1);
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
150 if (!eq[2][0]) strncpy(eq[2], eq[1], sizeof(eq[0])-1);
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
151
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
152 for(plane=0; plane<3; plane++){
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
153 static const char *const_names[]={
5f216140e72b generic equation filter
michael
parents:
diff changeset
154 "PI",
5f216140e72b generic equation filter
michael
parents:
diff changeset
155 "E",
5f216140e72b generic equation filter
michael
parents:
diff changeset
156 "X",
5f216140e72b generic equation filter
michael
parents:
diff changeset
157 "Y",
5f216140e72b generic equation filter
michael
parents:
diff changeset
158 "W",
5f216140e72b generic equation filter
michael
parents:
diff changeset
159 "H",
5f216140e72b generic equation filter
michael
parents:
diff changeset
160 "N",
5f216140e72b generic equation filter
michael
parents:
diff changeset
161 "SW",
5f216140e72b generic equation filter
michael
parents:
diff changeset
162 "SH",
5f216140e72b generic equation filter
michael
parents:
diff changeset
163 NULL
5f216140e72b generic equation filter
michael
parents:
diff changeset
164 };
5f216140e72b generic equation filter
michael
parents:
diff changeset
165 static const char *func2_names[]={
5f216140e72b generic equation filter
michael
parents:
diff changeset
166 "lum",
5f216140e72b generic equation filter
michael
parents:
diff changeset
167 "cb",
5f216140e72b generic equation filter
michael
parents:
diff changeset
168 "cr",
5f216140e72b generic equation filter
michael
parents:
diff changeset
169 "p",
5f216140e72b generic equation filter
michael
parents:
diff changeset
170 NULL
5f216140e72b generic equation filter
michael
parents:
diff changeset
171 };
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
172 double (*func2[])(void *, double, double)={
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
173 lum,
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
174 cb,
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
175 cr,
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
176 plane==0 ? lum : (plane==1 ? cb : cr),
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
177 NULL
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
178 };
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
179 char * a;
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
180 vf->priv->e[plane] = ff_parse(eq[plane], const_names, NULL, NULL, func2, func2_names, &a);
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
181
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
182 if (!vf->priv->e[plane]) {
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
183 mp_msg(MSGT_VFILTER, MSGL_ERR, "geq: error loading equation `%s': %s\n", eq[plane], a);
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
184 }
20455
e36737b5ec2f update vf_geq to new ff_eval API
ods15
parents: 20270
diff changeset
185 }
20266
5f216140e72b generic equation filter
michael
parents:
diff changeset
186
5f216140e72b generic equation filter
michael
parents:
diff changeset
187 return 1;
5f216140e72b generic equation filter
michael
parents:
diff changeset
188 }
5f216140e72b generic equation filter
michael
parents:
diff changeset
189
5f216140e72b generic equation filter
michael
parents:
diff changeset
190 vf_info_t vf_info_geq = {
5f216140e72b generic equation filter
michael
parents:
diff changeset
191 "generic equation filter",
5f216140e72b generic equation filter
michael
parents:
diff changeset
192 "geq",
5f216140e72b generic equation filter
michael
parents:
diff changeset
193 "Michael Niedermayer",
5f216140e72b generic equation filter
michael
parents:
diff changeset
194 "",
5f216140e72b generic equation filter
michael
parents:
diff changeset
195 open,
5f216140e72b generic equation filter
michael
parents:
diff changeset
196 NULL
5f216140e72b generic equation filter
michael
parents:
diff changeset
197 };