Mercurial > mplayer.hg
comparison libmpcodecs/vf_uspp.c @ 16946:47c5e9846cd3
ultra simple&slow pp filter, yes yet another spp like filter :)
this one does actually compress&decompress the video at various shifts with lavc while the other spp filters are doing optimized intra only filtering
limitations:
mpeg4 is hardcoded, all options too, pretty trivial to change though, even filtering with non dct codecs like snow could be tried ...
the qscale/qp is only taken fron the first MB of each image and then used for the whole image (would needs some small changes to lavc to let the user set the qscales for the mbs themselfs but iam to lazy ...)
this needs ALOT of cpu time and memory especially at uspp=8 ...
author | michael |
---|---|
date | Tue, 08 Nov 2005 13:15:19 +0000 |
parents | |
children | 6ff3379a0862 |
comparison
equal
deleted
inserted
replaced
16945:c17943eb7d55 | 16946:47c5e9846cd3 |
---|---|
1 /* | |
2 Copyright (C) 2005 Michael Niedermayer <michaelni@gmx.at> | |
3 | |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2 of the License, or | |
7 (at your option) any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software | |
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
17 */ | |
18 | |
19 #include <stdio.h> | |
20 #include <stdlib.h> | |
21 #include <string.h> | |
22 #include <inttypes.h> | |
23 #include <math.h> | |
24 | |
25 #include "../config.h" | |
26 | |
27 #ifdef USE_LIBAVCODEC | |
28 | |
29 #include "../mp_msg.h" | |
30 #include "../cpudetect.h" | |
31 | |
32 #ifdef USE_LIBAVCODEC_SO | |
33 #include <ffmpeg/avcodec.h> | |
34 #include <ffmpeg/dsputil.h> | |
35 #else | |
36 #include "../libavcodec/avcodec.h" | |
37 #include "../libavcodec/dsputil.h" | |
38 #endif | |
39 | |
40 #ifdef HAVE_MALLOC_H | |
41 #include <malloc.h> | |
42 #endif | |
43 | |
44 #include "img_format.h" | |
45 #include "mp_image.h" | |
46 #include "vf.h" | |
47 #include "../libvo/fastmemcpy.h" | |
48 | |
49 #define XMIN(a,b) ((a) < (b) ? (a) : (b)) | |
50 | |
51 #define BLOCK 16 | |
52 | |
53 //===========================================================================// | |
54 static const uint8_t __attribute__((aligned(8))) dither[8][8]={ | |
55 { 0*4, 48*4, 12*4, 60*4, 3*4, 51*4, 15*4, 63*4, }, | |
56 { 32*4, 16*4, 44*4, 28*4, 35*4, 19*4, 47*4, 31*4, }, | |
57 { 8*4, 56*4, 4*4, 52*4, 11*4, 59*4, 7*4, 55*4, }, | |
58 { 40*4, 24*4, 36*4, 20*4, 43*4, 27*4, 39*4, 23*4, }, | |
59 { 2*4, 50*4, 14*4, 62*4, 1*4, 49*4, 13*4, 61*4, }, | |
60 { 34*4, 18*4, 46*4, 30*4, 33*4, 17*4, 45*4, 29*4, }, | |
61 { 10*4, 58*4, 6*4, 54*4, 9*4, 57*4, 5*4, 53*4, }, | |
62 { 42*4, 26*4, 38*4, 22*4, 41*4, 25*4, 37*4, 21*4, }, | |
63 }; | |
64 | |
65 static const uint8_t offset[511][2]= { | |
66 { 0, 0}, | |
67 { 0, 0}, { 8, 8}, | |
68 { 0, 0}, { 4, 4}, {12, 8}, { 8,12}, | |
69 { 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14}, | |
70 | |
71 { 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14}, | |
72 { 5, 1}, {15, 3}, { 9, 5}, { 3, 7}, {13, 9}, { 7,11}, { 1,13}, {11,15}, | |
73 | |
74 { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, | |
75 { 2, 2}, {10, 2}, { 2,10}, {10,10}, { 7, 3}, {15, 3}, { 7,11}, {15,11}, | |
76 { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, | |
77 { 6, 6}, {14, 6}, { 6,14}, {14,14}, { 3, 7}, {11, 7}, { 3,15}, {11,15}, | |
78 | |
79 { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, | |
80 { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, | |
81 { 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 2}, {15, 2}, { 7,10}, {15,10}, | |
82 { 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 3}, {14, 3}, { 6,11}, {14,11}, | |
83 { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 4}, {12, 4}, { 4,12}, {12,12}, | |
84 { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 5}, {13, 5}, { 5,13}, {13,13}, | |
85 { 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 6}, {15, 6}, { 7,14}, {15,14}, | |
86 { 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 7}, {14, 7}, { 6,15}, {14,15}, | |
87 | |
88 { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 0, 2}, { 8, 2}, { 0,10}, { 8,10}, | |
89 { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 0, 6}, { 8, 6}, { 0,14}, { 8,14}, | |
90 { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 1, 3}, { 9, 3}, { 1,11}, { 9,11}, | |
91 { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 1, 7}, { 9, 7}, { 1,15}, { 9,15}, | |
92 { 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 2, 2}, {10, 2}, { 2,10}, {10,10}, | |
93 { 2, 4}, {10, 4}, { 2,12}, {10,12}, { 2, 6}, {10, 6}, { 2,14}, {10,14}, | |
94 { 3, 1}, {11, 1}, { 3, 9}, {11, 9}, { 3, 3}, {11, 3}, { 3,11}, {11,11}, | |
95 { 3, 5}, {11, 5}, { 3,13}, {11,13}, { 3, 7}, {11, 7}, { 3,15}, {11,15}, | |
96 { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, { 4, 2}, {12, 2}, { 4,10}, {12,10}, | |
97 { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 4, 6}, {12, 6}, { 4,14}, {12,14}, | |
98 { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, { 5, 3}, {13, 3}, { 5,11}, {13,11}, | |
99 { 5, 5}, {13, 5}, { 5,13}, {13,13}, { 5, 7}, {13, 7}, { 5,15}, {13,15}, | |
100 { 6, 0}, {14, 0}, { 6, 8}, {14, 8}, { 6, 2}, {14, 2}, { 6,10}, {14,10}, | |
101 { 6, 4}, {14, 4}, { 6,12}, {14,12}, { 6, 6}, {14, 6}, { 6,14}, {14,14}, | |
102 { 7, 1}, {15, 1}, { 7, 9}, {15, 9}, { 7, 3}, {15, 3}, { 7,11}, {15,11}, | |
103 { 7, 5}, {15, 5}, { 7,13}, {15,13}, { 7, 7}, {15, 7}, { 7,15}, {15,15}, | |
104 | |
105 { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, { 2, 2}, {10, 2}, { 2,10}, {10,10}, { 6, 6}, {14, 6}, { 6,14}, {14,14}, { 2, 6}, {10, 6}, { 2,14}, {10,14}, { 6, 2}, {14, 2}, { 6,10}, {14,10}, { 0, 2}, { 8, 2}, { 0,10}, { 8,10}, { 4, 6}, {12, 6}, { 4,14}, {12,14}, { 0, 6}, { 8, 6}, { 0,14}, { 8,14}, { 4, 2}, {12, 2}, { 4,10}, {12,10}, { 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 6, 4}, {14, 4}, { 6,12}, {14,12}, { 2, 4}, {10, 4}, { 2,12}, {10,12}, { 6, 0}, {14, 0}, { 6, 8}, {14, 8}, { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 5}, {13, 5}, { 5,13}, {13,13}, { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, { 3, 3}, {11, 3}, { 3,11}, {11,11}, { 7, 7}, {15, 7}, { 7,15}, {15,15}, { 3, 7}, {11, 7}, { 3,15}, {11,15}, { 7, 3}, {15, 3}, { 7,11}, {15,11}, { 1, 3}, { 9, 3}, { 1,11}, { 9,11}, { 5, 7}, {13, 7}, { 5,15}, {13,15}, { 1, 7}, { 9, 7}, { 1,15}, { 9,15}, { 5, 3}, {13, 3}, { 5,11}, {13,11}, { 3, 1}, {11, 1}, { 3, 9}, {11, 9}, { 7, 5}, {15, 5}, { 7,13}, {15,13}, { 3, 5}, {11, 5}, { 3,13}, {11,13}, { 7, 1}, {15, 1}, { 7, 9}, {15, 9}, { 0, 1}, { 8, 1}, { 0, 9}, { 8, 9}, { 4, 5}, {12, 5}, { 4,13}, {12,13}, { 0, 5}, { 8, 5}, { 0,13}, { 8,13}, { 4, 1}, {12, 1}, { 4, 9}, {12, 9}, { 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 7}, {14, 7}, { 6,15}, {14,15}, { 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 3}, {14, 3}, { 6,11}, {14,11}, { 0, 3}, { 8, 3}, { 0,11}, { 8,11}, { 4, 7}, {12, 7}, { 4,15}, {12,15}, { 0, 7}, { 8, 7}, { 0,15}, { 8,15}, { 4, 3}, {12, 3}, { 4,11}, {12,11}, { 2, 1}, {10, 1}, { 2, 9}, {10, 9}, { 6, 5}, {14, 5}, { 6,13}, {14,13}, { 2, 5}, {10, 5}, { 2,13}, {10,13}, { 6, 1}, {14, 1}, { 6, 9}, {14, 9}, { 1, 0}, { 9, 0}, { 1, 8}, { 9, 8}, { 5, 4}, {13, 4}, { 5,12}, {13,12}, { 1, 4}, { 9, 4}, { 1,12}, { 9,12}, { 5, 0}, {13, 0}, { 5, 8}, {13, 8}, { 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 6}, {15, 6}, { 7,14}, {15,14}, { 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 2}, {15, 2}, { 7,10}, {15,10}, { 1, 2}, { 9, 2}, { 1,10}, { 9,10}, { 5, 6}, {13, 6}, { 5,14}, {13,14}, { 1, 6}, { 9, 6}, { 1,14}, { 9,14}, { 5, 2}, {13, 2}, { 5,10}, {13,10}, { 3, 0}, {11, 0}, { 3, 8}, {11, 8}, { 7, 4}, {15, 4}, { 7,12}, {15,12}, { 3, 4}, {11, 4}, { 3,12}, {11,12}, { 7, 0}, {15, 0}, { 7, 8}, {15, 8}, | |
106 }; | |
107 | |
108 struct vf_priv_s { | |
109 int log2_count; | |
110 int qp; | |
111 int mode; | |
112 int mpeg2; | |
113 int temp_stride[3]; | |
114 uint8_t *src[3]; | |
115 int16_t *temp[3]; | |
116 int outbuf_size; | |
117 uint8_t *outbuf; | |
118 AVCodecContext *avctx_enc[BLOCK*BLOCK]; | |
119 AVCodecContext *avctx_dec[BLOCK*BLOCK]; | |
120 AVFrame *frame; | |
121 AVFrame *frame_dec; | |
122 }; | |
123 | |
124 static void store_slice_c(uint8_t *dst, int16_t *src, int dst_stride, int src_stride, int width, int height, int log2_scale){ | |
125 int y, x; | |
126 | |
127 #define STORE(pos) \ | |
128 temp= ((src[x + y*src_stride + pos]<<log2_scale) + d[pos])>>8;\ | |
129 if(temp & 0x100) temp= ~(temp>>31);\ | |
130 dst[x + y*dst_stride + pos]= temp; | |
131 | |
132 for(y=0; y<height; y++){ | |
133 const uint8_t *d= dither[y&7]; | |
134 for(x=0; x<width; x+=8){ | |
135 int temp; | |
136 STORE(0); | |
137 STORE(1); | |
138 STORE(2); | |
139 STORE(3); | |
140 STORE(4); | |
141 STORE(5); | |
142 STORE(6); | |
143 STORE(7); | |
144 } | |
145 } | |
146 } | |
147 | |
148 static void filter(struct vf_priv_s *p, uint8_t *dst[3], uint8_t *src[3], int dst_stride[3], int src_stride[3], int width, int height, uint8_t *qp_store, int qp_stride){ | |
149 int x, y, i, j; | |
150 const int count= 1<<p->log2_count; | |
151 | |
152 for(i=0; i<3; i++){ | |
153 int is_chroma= !!i; | |
154 int w= width >>is_chroma; | |
155 int h= height>>is_chroma; | |
156 int stride= p->temp_stride[i]; | |
157 | |
158 if (!src[i] || !dst[i]) | |
159 continue; // HACK avoid crash for Y8 colourspace | |
160 for(y=0; y<h; y++){ | |
161 int index= BLOCK + BLOCK*stride + y*stride; | |
162 memcpy(p->src[i] + index, src[i] + y*src_stride[i], w); | |
163 for(x=0; x<BLOCK; x++){ | |
164 p->src[i][index - x - 1]= p->src[i][index + x ]; | |
165 p->src[i][index + w + x ]= p->src[i][index + w - x - 1]; | |
166 } | |
167 } | |
168 for(y=0; y<BLOCK; y++){ | |
169 memcpy(p->src[i] + ( BLOCK-1-y)*stride, p->src[i] + ( y+BLOCK )*stride, stride); | |
170 memcpy(p->src[i] + (h+BLOCK +y)*stride, p->src[i] + (h-y+BLOCK-1)*stride, stride); | |
171 } | |
172 | |
173 p->frame->linesize[i]= stride; | |
174 memset(p->temp[i], 0, (h+2*BLOCK)*stride*sizeof(int16_t)); | |
175 } | |
176 | |
177 if(p->qp) | |
178 p->frame->quality= p->qp * FF_QP2LAMBDA; | |
179 else | |
180 p->frame->quality= (qp_store[0] * FF_QP2LAMBDA)>>p->mpeg2; | |
181 // init per MB qscale stuff FIXME | |
182 | |
183 for(i=0; i<count; i++){ | |
184 const int x1= offset[i+count-1][0]; | |
185 const int y1= offset[i+count-1][1]; | |
186 int offset, out_size, got_picture; | |
187 p->frame->data[0]= p->src[0] + x1 + y1 * p->frame->linesize[0]; | |
188 p->frame->data[1]= p->src[1] + x1/2 + y1/2 * p->frame->linesize[1]; | |
189 p->frame->data[2]= p->src[2] + x1/2 + y1/2 * p->frame->linesize[2]; | |
190 | |
191 out_size = avcodec_encode_video(p->avctx_enc[i], p->outbuf, p->outbuf_size, p->frame); | |
192 avcodec_decode_video(p->avctx_dec[i], p->frame_dec, &got_picture, p->outbuf, out_size); | |
193 | |
194 offset= (BLOCK-x1) + (BLOCK-y1)*p->frame_dec->linesize[0]; | |
195 //FIXME optimize | |
196 for(y=0; y<height; y++){ | |
197 for(x=0; x<width; x++){ | |
198 p->temp[0][ x + y*p->temp_stride[0] ] += p->frame_dec->data[0][ x + y*p->frame_dec->linesize[0] + offset ]; | |
199 } | |
200 } | |
201 offset= (BLOCK-x1/2) + (BLOCK-y1/2)*p->frame_dec->linesize[1]; | |
202 for(y=0; y<height/2; y++){ | |
203 for(x=0; x<width/2; x++){ | |
204 p->temp[1][ x + y*p->temp_stride[1] ] += p->frame_dec->data[1][ x + y*p->frame_dec->linesize[1] + offset ]; | |
205 p->temp[2][ x + y*p->temp_stride[2] ] += p->frame_dec->data[2][ x + y*p->frame_dec->linesize[2] + offset ]; | |
206 } | |
207 } | |
208 } | |
209 | |
210 for(j=0; j<3; j++){ | |
211 int is_chroma= !!j; | |
212 store_slice_c(dst[j], p->temp[j], dst_stride[j], p->temp_stride[j], width>>is_chroma, height>>is_chroma, 8-p->log2_count); | |
213 } | |
214 } | |
215 | |
216 static int config(struct vf_instance_s* vf, | |
217 int width, int height, int d_width, int d_height, | |
218 unsigned int flags, unsigned int outfmt){ | |
219 int i; | |
220 AVCodec *dec= avcodec_find_decoder(CODEC_ID_MPEG4); | |
221 AVCodec *enc= avcodec_find_encoder(CODEC_ID_MPEG4); | |
222 | |
223 for(i=0; i<3; i++){ | |
224 int is_chroma= !!i; | |
225 int w= ((width >>is_chroma) + 4*BLOCK-1) & (~(2*BLOCK-1)); | |
226 int h= ((height>>is_chroma) + 4*BLOCK-1) & (~(2*BLOCK-1)); | |
227 | |
228 vf->priv->temp_stride[i]= w; | |
229 vf->priv->temp[i]= malloc(vf->priv->temp_stride[i]*h*sizeof(int16_t)); | |
230 vf->priv->src [i]= malloc(vf->priv->temp_stride[i]*h*sizeof(uint8_t)); | |
231 } | |
232 for(i=0; i< (1<<vf->priv->log2_count); i++){ | |
233 AVCodecContext *avctx_enc; | |
234 | |
235 avctx_enc= | |
236 vf->priv->avctx_enc[i]= avcodec_alloc_context(); | |
237 vf->priv->avctx_dec[i]= avcodec_alloc_context(); | |
238 avctx_enc->width = width + BLOCK; | |
239 avctx_enc->height = height + BLOCK; | |
240 avctx_enc->time_base= (AVRational){1,25}; // meaningless | |
241 avctx_enc->gop_size = 300; | |
242 avctx_enc->max_b_frames= 0; | |
243 avctx_enc->pix_fmt = PIX_FMT_YUV420P; | |
244 avctx_enc->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_LOW_DELAY; | |
245 avcodec_open(avctx_enc, enc); | |
246 avcodec_open(vf->priv->avctx_dec[i], dec); | |
247 | |
248 } | |
249 vf->priv->frame= avcodec_alloc_frame(); | |
250 vf->priv->frame_dec= avcodec_alloc_frame(); | |
251 | |
252 vf->priv->outbuf_size= (width + BLOCK)*(height + BLOCK)*10; | |
253 vf->priv->outbuf= malloc(vf->priv->outbuf_size); | |
254 | |
255 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); | |
256 } | |
257 | |
258 static void get_image(struct vf_instance_s* vf, mp_image_t *mpi){ | |
259 if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change | |
260 // ok, we can do pp in-place (or pp disabled): | |
261 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, | |
262 mpi->type, mpi->flags | MP_IMGFLAG_READABLE, mpi->width, mpi->height); | |
263 mpi->planes[0]=vf->dmpi->planes[0]; | |
264 mpi->stride[0]=vf->dmpi->stride[0]; | |
265 mpi->width=vf->dmpi->width; | |
266 if(mpi->flags&MP_IMGFLAG_PLANAR){ | |
267 mpi->planes[1]=vf->dmpi->planes[1]; | |
268 mpi->planes[2]=vf->dmpi->planes[2]; | |
269 mpi->stride[1]=vf->dmpi->stride[1]; | |
270 mpi->stride[2]=vf->dmpi->stride[2]; | |
271 } | |
272 mpi->flags|=MP_IMGFLAG_DIRECT; | |
273 } | |
274 | |
275 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ | |
276 mp_image_t *dmpi; | |
277 | |
278 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ | |
279 // no DR, so get a new image! hope we'll get DR buffer: | |
280 dmpi=vf_get_image(vf->next,mpi->imgfmt, | |
281 MP_IMGTYPE_TEMP, | |
282 MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, | |
283 mpi->width,mpi->height); | |
284 vf_clone_mpi_attributes(dmpi, mpi); | |
285 }else{ | |
286 dmpi=vf->dmpi; | |
287 } | |
288 | |
289 vf->priv->mpeg2= mpi->qscale_type; | |
290 if(vf->priv->log2_count || !(mpi->flags&MP_IMGFLAG_DIRECT)){ | |
291 if(mpi->qscale || vf->priv->qp){ | |
292 filter(vf->priv, dmpi->planes, mpi->planes, dmpi->stride, mpi->stride, mpi->w, mpi->h, mpi->qscale, mpi->qstride); | |
293 }else{ | |
294 memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, dmpi->stride[0], mpi->stride[0]); | |
295 memcpy_pic(dmpi->planes[1], mpi->planes[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[1], mpi->stride[1]); | |
296 memcpy_pic(dmpi->planes[2], mpi->planes[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[2], mpi->stride[2]); | |
297 } | |
298 } | |
299 | |
300 #ifdef HAVE_MMX | |
301 if(gCpuCaps.hasMMX) asm volatile ("emms\n\t"); | |
302 #endif | |
303 #ifdef HAVE_MMX2 | |
304 if(gCpuCaps.hasMMX2) asm volatile ("sfence\n\t"); | |
305 #endif | |
306 | |
307 return vf_next_put_image(vf,dmpi); | |
308 } | |
309 | |
310 static void uninit(struct vf_instance_s* vf){ | |
311 int i; | |
312 if(!vf->priv) return; | |
313 | |
314 for(i=0; i<3; i++){ | |
315 if(vf->priv->temp[i]) free(vf->priv->temp[i]); | |
316 vf->priv->temp[i]= NULL; | |
317 if(vf->priv->src[i]) free(vf->priv->src[i]); | |
318 vf->priv->src[i]= NULL; | |
319 } | |
320 for(i=0; i<BLOCK*BLOCK; i++){ | |
321 av_freep(&vf->priv->avctx_enc[i]); | |
322 av_freep(&vf->priv->avctx_dec[i]); | |
323 } | |
324 | |
325 free(vf->priv); | |
326 vf->priv=NULL; | |
327 } | |
328 | |
329 //===========================================================================// | |
330 static int query_format(struct vf_instance_s* vf, unsigned int fmt){ | |
331 switch(fmt){ | |
332 case IMGFMT_YV12: | |
333 case IMGFMT_I420: | |
334 case IMGFMT_IYUV: | |
335 case IMGFMT_Y800: | |
336 case IMGFMT_Y8: | |
337 return vf_next_query_format(vf,fmt); | |
338 } | |
339 return 0; | |
340 } | |
341 | |
342 static unsigned int fmt_list[]={ | |
343 IMGFMT_YV12, | |
344 IMGFMT_I420, | |
345 IMGFMT_IYUV, | |
346 IMGFMT_Y800, | |
347 IMGFMT_Y8, | |
348 0 | |
349 }; | |
350 | |
351 static int control(struct vf_instance_s* vf, int request, void* data){ | |
352 switch(request){ | |
353 case VFCTRL_QUERY_MAX_PP_LEVEL: | |
354 return 8; | |
355 case VFCTRL_SET_PP_LEVEL: | |
356 vf->priv->log2_count= *((unsigned int*)data); | |
357 //FIXME we have to realloc a few things here | |
358 return CONTROL_TRUE; | |
359 } | |
360 return vf_next_control(vf,request,data); | |
361 } | |
362 | |
363 static int open(vf_instance_t *vf, char* args){ | |
364 | |
365 int log2c=-1; | |
366 | |
367 vf->config=config; | |
368 vf->put_image=put_image; | |
369 vf->get_image=get_image; | |
370 vf->query_format=query_format; | |
371 vf->uninit=uninit; | |
372 vf->control= control; | |
373 vf->priv=malloc(sizeof(struct vf_priv_s)); | |
374 memset(vf->priv, 0, sizeof(struct vf_priv_s)); | |
375 | |
376 avcodec_init(); | |
377 avcodec_register_all(); | |
378 | |
379 vf->priv->log2_count= 4; | |
380 | |
381 if (args) sscanf(args, "%d:%d:%d", &log2c, &vf->priv->qp, &vf->priv->mode); | |
382 | |
383 if( log2c >=0 && log2c <=8 ) | |
384 vf->priv->log2_count = log2c; | |
385 | |
386 if(vf->priv->qp < 0) | |
387 vf->priv->qp = 0; | |
388 | |
389 // #ifdef HAVE_MMX | |
390 // if(gCpuCaps.hasMMX){ | |
391 // store_slice= store_slice_mmx; | |
392 // } | |
393 // #endif | |
394 | |
395 return 1; | |
396 } | |
397 | |
398 vf_info_t vf_info_uspp = { | |
399 "ultra simple/slow postprocess", | |
400 "uspp", | |
401 "Michael Niedermayer", | |
402 "", | |
403 open, | |
404 NULL | |
405 }; | |
406 | |
407 #endif //USE_LIBAVCODEC |