annotate libmpcodecs/vf_perspective.c @ 28505:f3fa6fe243e6

Ignore errors from all rm commands in clean targets. This way make will not stop on failure and remove as much as possible.
author diego
date Thu, 12 Feb 2009 12:32:16 +0000
parents 82601a38e2a7
children df67d03dde3b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8112
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
1 /*
26727
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
2 * Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at>
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
3 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
4 * This file is part of MPlayer.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
5 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
6 * MPlayer is free software; you can redistribute it and/or modify
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
7 * it under the terms of the GNU General Public License as published by
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
9 * (at your option) any later version.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
10 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
11 * MPlayer is distributed in the hope that it will be useful,
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
14 * GNU General Public License for more details.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
15 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
16 * You should have received a copy of the GNU General Public License along
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
19 */
8112
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
20
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
21 #include <stdio.h>
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
22 #include <stdlib.h>
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
23 #include <string.h>
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
24 #include <inttypes.h>
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
25 #include <assert.h>
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
26 #include <math.h>
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
27
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 9593
diff changeset
28 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 9593
diff changeset
29 #include "mp_msg.h"
8112
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
30
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
31 #ifdef HAVE_MALLOC_H
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
32 #include <malloc.h>
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
33 #endif
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
34
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
35 #include "img_format.h"
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
36 #include "mp_image.h"
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
37 #include "vf.h"
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
38
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
39 #define SUB_PIXEL_BITS 8
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
40 #define SUB_PIXELS (1<<SUB_PIXEL_BITS)
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
41 #define COEFF_BITS 11
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
42
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
43 //===========================================================================//
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
44
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
45 struct vf_priv_s {
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
46 double ref[4][2];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
47 int32_t coeff[1<<SUB_PIXEL_BITS][4];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
48 int32_t (*pv)[2];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
49 int pvStride;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
50 int cubic;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
51 };
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
52
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
53
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
54 /***************************************************************************/
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
55
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
56 static void initPv(struct vf_priv_s *priv, int W, int H){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
57 double a,b,c,d,e,f,g,h,D;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
58 double (*ref)[2]= priv->ref;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
59 int x,y;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
60
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
61 g= ( (ref[0][0] - ref[1][0] - ref[2][0] + ref[3][0])*(ref[2][1] - ref[3][1])
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
62 - (ref[0][1] - ref[1][1] - ref[2][1] + ref[3][1])*(ref[2][0] - ref[3][0]))*H;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
63 h= ( (ref[0][1] - ref[1][1] - ref[2][1] + ref[3][1])*(ref[1][0] - ref[3][0])
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
64 - (ref[0][0] - ref[1][0] - ref[2][0] + ref[3][0])*(ref[1][1] - ref[3][1]))*W;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
65 D= (ref[1][0] - ref[3][0])*(ref[2][1] - ref[3][1])
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
66 - (ref[2][0] - ref[3][0])*(ref[1][1] - ref[3][1]);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
67
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
68 a= D*(ref[1][0] - ref[0][0])*H + g*ref[1][0];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
69 b= D*(ref[2][0] - ref[0][0])*W + h*ref[2][0];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
70 c= D*ref[0][0]*W*H;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
71 d= D*(ref[1][1] - ref[0][1])*H + g*ref[1][1];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
72 e= D*(ref[2][1] - ref[0][1])*W + h*ref[2][1];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
73 f= D*ref[0][1]*W*H;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
74
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
75 for(y=0; y<H; y++){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
76 for(x=0; x<W; x++){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
77 int u, v;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
78
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
79 u= (int)floor( SUB_PIXELS*(a*x + b*y + c)/(g*x + h*y + D*W*H) + 0.5);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
80 v= (int)floor( SUB_PIXELS*(d*x + e*y + f)/(g*x + h*y + D*W*H) + 0.5);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
81
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
82 priv->pv[x + y*W][0]= u;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
83 priv->pv[x + y*W][1]= v;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
84 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
85 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
86 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
87
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
88 static double getCoeff(double d){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
89 double A= -0.60;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
90 double coeff;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
91
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
92 d= fabs(d);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
93
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
94 // Equation is from VirtualDub
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
95 if(d<1.0)
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
96 coeff = (1.0 - (A+3.0)*d*d + (A+2.0)*d*d*d);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
97 else if(d<2.0)
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
98 coeff = (-4.0*A + 8.0*A*d - 5.0*A*d*d + A*d*d*d);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
99 else
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
100 coeff=0.0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
101
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
102 return coeff;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
103 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
104
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
105 static int config(struct vf_instance_s* vf,
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
106 int width, int height, int d_width, int d_height,
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
107 unsigned int flags, unsigned int outfmt){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
108 int i, j;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
109
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
110 vf->priv->pvStride= width;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
111 vf->priv->pv= (void*)memalign(8, width*height*2*sizeof(int32_t));
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
112 initPv(vf->priv, width, height);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
113
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
114 for(i=0; i<SUB_PIXELS; i++){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
115 double d= i/(double)SUB_PIXELS;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
116 double temp[4];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
117 double sum=0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
118
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
119 for(j=0; j<4; j++)
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
120 temp[j]= getCoeff(j - d - 1);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
121
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
122 for(j=0; j<4; j++)
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
123 sum+= temp[j];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
124
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
125 for(j=0; j<4; j++)
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
126 vf->priv->coeff[i][j]= (int)floor((1<<COEFF_BITS)*temp[j]/sum + 0.5);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
127 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
128
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
129 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
130 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
131
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
132 static void uninit(struct vf_instance_s* vf){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
133 if(!vf->priv) return;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
134
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
135 if(vf->priv->pv) free(vf->priv->pv);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
136 vf->priv->pv= NULL;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
137
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
138 free(vf->priv);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
139 vf->priv=NULL;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
140 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
141
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
142 static inline void resampleCubic(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int srcStride, struct vf_priv_s *privParam, int xShift, int yShift){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
143 int x, y;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
144 struct vf_priv_s priv= *privParam;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
145
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
146 for(y=0; y<h; y++){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
147 for(x=0; x<w; x++){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
148 int u, v, subU, subV, sum, sx, sy;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
149
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
150 sx= x << xShift;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
151 sy= y << yShift;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
152 u= priv.pv[sx + sy*priv.pvStride][0]>>xShift;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
153 v= priv.pv[sx + sy*priv.pvStride][1]>>yShift;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
154 subU= u & (SUB_PIXELS-1);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
155 subV= v & (SUB_PIXELS-1);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
156 u >>= SUB_PIXEL_BITS;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
157 v >>= SUB_PIXEL_BITS;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
158
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
159 if(u>0 && v>0 && u<w-2 && v<h-2){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
160 const int index= u + v*srcStride;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
161 const int a= priv.coeff[subU][0];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
162 const int b= priv.coeff[subU][1];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
163 const int c= priv.coeff[subU][2];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
164 const int d= priv.coeff[subU][3];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
165
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
166 sum=
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
167 priv.coeff[subV][0]*( a*src[index - 1 - srcStride] + b*src[index - 0 - srcStride]
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
168 + c*src[index + 1 - srcStride] + d*src[index + 2 - srcStride])
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
169 +priv.coeff[subV][1]*( a*src[index - 1 ] + b*src[index - 0 ]
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
170 + c*src[index + 1 ] + d*src[index + 2 ])
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
171 +priv.coeff[subV][2]*( a*src[index - 1 + srcStride] + b*src[index - 0 + srcStride]
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
172 + c*src[index + 1 + srcStride] + d*src[index + 2 + srcStride])
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
173 +priv.coeff[subV][3]*( a*src[index - 1+2*srcStride] + b*src[index - 0+2*srcStride]
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
174 + c*src[index + 1+2*srcStride] + d*src[index + 2+2*srcStride]);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
175 }else{
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
176 int dx, dy;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
177 sum=0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
178
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
179 for(dy=0; dy<4; dy++){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
180 int iy= v + dy - 1;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
181 if (iy< 0) iy=0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
182 else if(iy>=h) iy=h-1;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
183 for(dx=0; dx<4; dx++){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
184 int ix= u + dx - 1;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
185 if (ix< 0) ix=0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
186 else if(ix>=w) ix=w-1;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
187
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
188 sum+= priv.coeff[subU][dx]*priv.coeff[subV][dy]
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
189 *src[ ix + iy*srcStride];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
190 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
191 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
192 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
193 sum= (sum + (1<<(COEFF_BITS*2-1)) ) >> (COEFF_BITS*2);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
194 if(sum&~255){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
195 if(sum<0) sum=0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
196 else sum=255;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
197 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
198 dst[ x + y*dstStride]= sum;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
199 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
200 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
201 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
202
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
203 static inline void resampleLinear(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int srcStride,
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
204 struct vf_priv_s *privParam, int xShift, int yShift){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
205 int x, y;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
206 struct vf_priv_s priv= *privParam;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
207
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
208 for(y=0; y<h; y++){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
209 for(x=0; x<w; x++){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
210 int u, v, subU, subV, sum, sx, sy, index, subUI, subVI;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
211
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
212 sx= x << xShift;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
213 sy= y << yShift;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
214 u= priv.pv[sx + sy*priv.pvStride][0]>>xShift;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
215 v= priv.pv[sx + sy*priv.pvStride][1]>>yShift;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
216 subU= u & (SUB_PIXELS-1);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
217 subV= v & (SUB_PIXELS-1);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
218 u >>= SUB_PIXEL_BITS;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
219 v >>= SUB_PIXEL_BITS;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
220 index= u + v*srcStride;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
221 subUI= SUB_PIXELS - subU;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
222 subVI= SUB_PIXELS - subV;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
223
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
224 if((unsigned)u < (unsigned)(w - 1)){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
225 if((unsigned)v < (unsigned)(h - 1)){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
226 sum= subVI*(subUI*src[index ] + subU*src[index +1])
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
227 +subV *(subUI*src[index+srcStride] + subU*src[index+srcStride+1]);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
228 sum= (sum + (1<<(SUB_PIXEL_BITS*2-1)) ) >> (SUB_PIXEL_BITS*2);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
229 }else{
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
230 if(v<0) v= 0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
231 else v= h-1;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
232 index= u + v*srcStride;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
233 sum= subUI*src[index] + subU*src[index+1];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
234 sum= (sum + (1<<(SUB_PIXEL_BITS-1)) ) >> SUB_PIXEL_BITS;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
235 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
236 }else{
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
237 if((unsigned)v < (unsigned)(h - 1)){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
238 if(u<0) u= 0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
239 else u= w-1;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
240 index= u + v*srcStride;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
241 sum= subVI*src[index] + subV*src[index+srcStride];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
242 sum= (sum + (1<<(SUB_PIXEL_BITS-1)) ) >> SUB_PIXEL_BITS;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
243 }else{
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
244 if(u<0) u= 0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
245 else u= w-1;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
246 if(v<0) v= 0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
247 else v= h-1;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
248 index= u + v*srcStride;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
249 sum= src[index];
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
250 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
251 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
252 if(sum&~255){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
253 if(sum<0) sum=0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
254 else sum=255;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
255 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
256 dst[ x + y*dstStride]= sum;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
257 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
258 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
259 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
260
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17367
diff changeset
261 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
8112
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
262 int cw= mpi->w >> mpi->chroma_x_shift;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
263 int ch= mpi->h >> mpi->chroma_y_shift;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
264
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
265 mp_image_t *dmpi=vf_get_image(vf->next,mpi->imgfmt,
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
266 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
267 mpi->w,mpi->h);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
268
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
269 assert(mpi->flags&MP_IMGFLAG_PLANAR);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
270
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
271 if(vf->priv->cubic){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
272 resampleCubic(dmpi->planes[0], mpi->planes[0], mpi->w,mpi->h, dmpi->stride[0], mpi->stride[0],
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
273 vf->priv, 0, 0);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
274 resampleCubic(dmpi->planes[1], mpi->planes[1], cw , ch , dmpi->stride[1], mpi->stride[1],
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
275 vf->priv, mpi->chroma_x_shift, mpi->chroma_y_shift);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
276 resampleCubic(dmpi->planes[2], mpi->planes[2], cw , ch , dmpi->stride[2], mpi->stride[2],
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
277 vf->priv, mpi->chroma_x_shift, mpi->chroma_y_shift);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
278 }else{
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
279 resampleLinear(dmpi->planes[0], mpi->planes[0], mpi->w,mpi->h, dmpi->stride[0], mpi->stride[0],
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
280 vf->priv, 0, 0);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
281 resampleLinear(dmpi->planes[1], mpi->planes[1], cw , ch , dmpi->stride[1], mpi->stride[1],
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
282 vf->priv, mpi->chroma_x_shift, mpi->chroma_y_shift);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
283 resampleLinear(dmpi->planes[2], mpi->planes[2], cw , ch , dmpi->stride[2], mpi->stride[2],
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
284 vf->priv, mpi->chroma_x_shift, mpi->chroma_y_shift);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
285 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
286
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17367
diff changeset
287 return vf_next_put_image(vf,dmpi, pts);
8112
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
288 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
289
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
290 //===========================================================================//
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
291
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
292 static int query_format(struct vf_instance_s* vf, unsigned int fmt){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
293 switch(fmt)
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
294 {
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
295 case IMGFMT_YV12:
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
296 case IMGFMT_I420:
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
297 case IMGFMT_IYUV:
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
298 case IMGFMT_YVU9:
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
299 case IMGFMT_444P:
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
300 case IMGFMT_422P:
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
301 case IMGFMT_411P:
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
302 return vf_next_query_format(vf, fmt);
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
303 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
304 return 0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
305 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
306
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
307 static int open(vf_instance_t *vf, char* args){
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
308 int e;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
309
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
310 vf->config=config;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
311 vf->put_image=put_image;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
312 // vf->get_image=get_image;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
313 vf->query_format=query_format;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
314 vf->uninit=uninit;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
315 vf->priv=malloc(sizeof(struct vf_priv_s));
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
316 memset(vf->priv, 0, sizeof(struct vf_priv_s));
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
317
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
318 if(args==NULL) return 0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
319
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
320 e=sscanf(args, "%lf:%lf:%lf:%lf:%lf:%lf:%lf:%lf:%d",
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
321 &vf->priv->ref[0][0], &vf->priv->ref[0][1],
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
322 &vf->priv->ref[1][0], &vf->priv->ref[1][1],
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
323 &vf->priv->ref[2][0], &vf->priv->ref[2][1],
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
324 &vf->priv->ref[3][0], &vf->priv->ref[3][1],
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
325 &vf->priv->cubic
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
326 );
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
327
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
328 if(e!=9)
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
329 return 0;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
330
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
331 return 1;
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
332 }
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
333
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 23373
diff changeset
334 const vf_info_t vf_info_perspective = {
8112
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
335 "perspective correcture",
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
336 "perspective",
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
337 "Michael Niedermayer",
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
338 "",
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 8112
diff changeset
339 open,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 8112
diff changeset
340 NULL
8112
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
341 };
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
342
6d97e935a071 perspective correcture filter
michael
parents:
diff changeset
343 //===========================================================================//