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