annotate postprocess.c @ 66:7737e39e74f3 libpostproc

Make pp_help a constant pointer to constant characters, moves it partially in .rodata (the actual string) and partially in .data.relro (the pointer), but doesn't change ABI. Patch by Diego 'Flameeyes' Petten flameeyes at gmail com
author benoit
date Fri, 04 Jan 2008 07:47:32 +0000
parents 5bef666de27d
children fb2657d1e70d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1 /*
22
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
2 * Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at)
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
3 *
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
4 * AltiVec optimizations (C) 2004 Romain Dolbeau <romain@dolbeau.org>
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
5 *
23
b0d83867e2f6 Fix default license header.
diego
parents: 22
diff changeset
6 * This file is part of FFmpeg.
22
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
7 *
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or modify
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
9 * it under the terms of the GNU General Public License as published by
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
11 * (at your option) any later version.
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
12 *
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
16 * GNU General Public License for more details.
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
17 *
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
18 * You should have received a copy of the GNU General Public License
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
19 * along with FFmpeg; if not, write to the Free Software
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
da3bfee1fa67 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 18
diff changeset
21 */
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
22
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
23 /**
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
24 * @file postprocess.c
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
25 * postprocessing.
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
26 */
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
27
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
28 /*
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
29 C MMX MMX2 3DNow AltiVec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
30 isVertDC Ec Ec Ec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
31 isVertMinMaxOk Ec Ec Ec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
32 doVertLowPass E e e Ec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
33 doVertDefFilter Ec Ec e e Ec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
34 isHorizDC Ec Ec Ec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
35 isHorizMinMaxOk a E Ec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
36 doHorizLowPass E e e Ec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
37 doHorizDefFilter Ec Ec e e Ec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
38 do_a_deblock Ec E Ec E
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
39 deRing E e e* Ecp
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
40 Vertical RKAlgo1 E a a
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
41 Horizontal RKAlgo1 a a
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
42 Vertical X1# a E E
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
43 Horizontal X1# a E E
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
44 LinIpolDeinterlace e E E*
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
45 CubicIpolDeinterlace a e e*
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
46 LinBlendDeinterlace e E E*
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
47 MedianDeinterlace# E Ec Ec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
48 TempDeNoiser# E e e Ec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
49
48
72675332ed82 misc spelling fixes
diego
parents: 46
diff changeset
50 * i do not have a 3DNow! CPU -> it is untested, but no one said it does not work so it seems to work
72675332ed82 misc spelling fixes
diego
parents: 46
diff changeset
51 # more or less selfinvented filters so the exactness is not too meaningful
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
52 E = Exact implementation
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
53 e = allmost exact implementation (slightly different rounding,...)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
54 a = alternative / approximate impl
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
55 c = checked against the other implementations (-vo md5)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
56 p = partially optimized, still some work to do
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
57 */
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
58
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
59 /*
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
60 TODO:
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
61 reduce the time wasted on the mem transfer
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
62 unroll stuff if instructions depend too much on the prior one
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
63 move YScale thing to the end instead of fixing QP
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
64 write a faster and higher quality deblocking filter :)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
65 make the mainloop more flexible (variable number of blocks at once
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
66 (the if/else stuff per block is slowing things down)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
67 compare the quality & speed of all filters
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
68 split this huge file
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
69 optimize c versions
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
70 try to unroll inner for(x=0 ... loop to avoid these damn if(x ... checks
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
71 ...
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
72 */
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
73
4
7e8d09893454 CVS --> Subversion
diego
parents: 0
diff changeset
74 //Changelog: use the Subversion log
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
75
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
76 #include "config.h"
16
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
77 #include "avutil.h"
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
78 #include <inttypes.h>
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
79 #include <stdio.h>
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
80 #include <stdlib.h>
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
81 #include <string.h>
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
82 #ifdef HAVE_MALLOC_H
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
83 #include <malloc.h>
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
84 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
85 //#undef HAVE_MMX2
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
86 //#define HAVE_3DNOW
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
87 //#undef HAVE_MMX
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
88 //#undef ARCH_X86
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
89 //#define DEBUG_BRIGHTNESS
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
90 #include "postprocess.h"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
91 #include "postprocess_internal.h"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
92
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
93 #ifdef HAVE_ALTIVEC_H
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
94 #include <altivec.h>
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
95 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
96
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
97 #define GET_MODE_BUFFER_SIZE 500
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
98 #define OPTIONS_ARRAY_SIZE 10
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
99 #define BLOCK_SIZE 8
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
100 #define TEMP_STRIDE 8
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
101 //#define NUM_BLOCKS_AT_ONCE 16 //not used yet
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
102
36
b4fc1bd8525f Use common define for x86_32 and x86_64.
diego
parents: 34
diff changeset
103 #if defined(ARCH_X86)
45
0e28dba3f9e7 Use DECLARE_ALIGNED for alignment in libpostprocess
reimar
parents: 38
diff changeset
104 static DECLARE_ALIGNED(8, uint64_t attribute_used, w05)= 0x0005000500050005LL;
0e28dba3f9e7 Use DECLARE_ALIGNED for alignment in libpostprocess
reimar
parents: 38
diff changeset
105 static DECLARE_ALIGNED(8, uint64_t attribute_used, w04)= 0x0004000400040004LL;
0e28dba3f9e7 Use DECLARE_ALIGNED for alignment in libpostprocess
reimar
parents: 38
diff changeset
106 static DECLARE_ALIGNED(8, uint64_t attribute_used, w20)= 0x0020002000200020LL;
0e28dba3f9e7 Use DECLARE_ALIGNED for alignment in libpostprocess
reimar
parents: 38
diff changeset
107 static DECLARE_ALIGNED(8, uint64_t attribute_used, b00)= 0x0000000000000000LL;
0e28dba3f9e7 Use DECLARE_ALIGNED for alignment in libpostprocess
reimar
parents: 38
diff changeset
108 static DECLARE_ALIGNED(8, uint64_t attribute_used, b01)= 0x0101010101010101LL;
0e28dba3f9e7 Use DECLARE_ALIGNED for alignment in libpostprocess
reimar
parents: 38
diff changeset
109 static DECLARE_ALIGNED(8, uint64_t attribute_used, b02)= 0x0202020202020202LL;
0e28dba3f9e7 Use DECLARE_ALIGNED for alignment in libpostprocess
reimar
parents: 38
diff changeset
110 static DECLARE_ALIGNED(8, uint64_t attribute_used, b08)= 0x0808080808080808LL;
0e28dba3f9e7 Use DECLARE_ALIGNED for alignment in libpostprocess
reimar
parents: 38
diff changeset
111 static DECLARE_ALIGNED(8, uint64_t attribute_used, b80)= 0x8080808080808080LL;
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
112 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
113
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
114 static uint8_t clip_table[3*256];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
115 static uint8_t * const clip_tab= clip_table + 256;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
116
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
117 static const int attribute_used deringThreshold= 20;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
118
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
119
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
120 static struct PPFilter filters[]=
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
121 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
122 {"hb", "hdeblock", 1, 1, 3, H_DEBLOCK},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
123 {"vb", "vdeblock", 1, 2, 4, V_DEBLOCK},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
124 /* {"hr", "rkhdeblock", 1, 1, 3, H_RK1_FILTER},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
125 {"vr", "rkvdeblock", 1, 2, 4, V_RK1_FILTER},*/
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
126 {"h1", "x1hdeblock", 1, 1, 3, H_X1_FILTER},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
127 {"v1", "x1vdeblock", 1, 2, 4, V_X1_FILTER},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
128 {"ha", "ahdeblock", 1, 1, 3, H_A_DEBLOCK},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
129 {"va", "avdeblock", 1, 2, 4, V_A_DEBLOCK},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
130 {"dr", "dering", 1, 5, 6, DERING},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
131 {"al", "autolevels", 0, 1, 2, LEVEL_FIX},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
132 {"lb", "linblenddeint", 1, 1, 4, LINEAR_BLEND_DEINT_FILTER},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
133 {"li", "linipoldeint", 1, 1, 4, LINEAR_IPOL_DEINT_FILTER},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
134 {"ci", "cubicipoldeint", 1, 1, 4, CUBIC_IPOL_DEINT_FILTER},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
135 {"md", "mediandeint", 1, 1, 4, MEDIAN_DEINT_FILTER},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
136 {"fd", "ffmpegdeint", 1, 1, 4, FFMPEG_DEINT_FILTER},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
137 {"l5", "lowpass5", 1, 1, 4, LOWPASS5_DEINT_FILTER},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
138 {"tn", "tmpnoise", 1, 7, 8, TEMP_NOISE_FILTER},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
139 {"fq", "forcequant", 1, 0, 0, FORCE_QUANT},
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
140 {NULL, NULL,0,0,0,0} //End Marker
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
141 };
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
142
5
a4a3c84fe72f Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 4
diff changeset
143 static const char *replaceTable[]=
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
144 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
145 "default", "hdeblock:a,vdeblock:a,dering:a",
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
146 "de", "hdeblock:a,vdeblock:a,dering:a",
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
147 "fast", "x1hdeblock:a,x1vdeblock:a,dering:a",
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
148 "fa", "x1hdeblock:a,x1vdeblock:a,dering:a",
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
149 "ac", "ha:a:128:7,va:a,dering:a",
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
150 NULL //End Marker
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
151 };
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
152
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
153
36
b4fc1bd8525f Use common define for x86_32 and x86_64.
diego
parents: 34
diff changeset
154 #if defined(ARCH_X86)
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
155 static inline void prefetchnta(void *p)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
156 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
157 asm volatile( "prefetchnta (%0)\n\t"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
158 : : "r" (p)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
159 );
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
160 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
161
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
162 static inline void prefetcht0(void *p)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
163 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
164 asm volatile( "prefetcht0 (%0)\n\t"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
165 : : "r" (p)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
166 );
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
167 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
168
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
169 static inline void prefetcht1(void *p)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
170 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
171 asm volatile( "prefetcht1 (%0)\n\t"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
172 : : "r" (p)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
173 );
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
174 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
175
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
176 static inline void prefetcht2(void *p)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
177 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
178 asm volatile( "prefetcht2 (%0)\n\t"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
179 : : "r" (p)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
180 );
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
181 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
182 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
183
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
184 // The horizontal Functions exist only in C cuz the MMX code is faster with vertical filters and transposing
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
185
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
186 /**
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
187 * Check if the given 8x8 Block is mostly "flat"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
188 */
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
189 static inline int isHorizDC_C(uint8_t src[], int stride, PPContext *c)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
190 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
191 int numEq= 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
192 int y;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
193 const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
194 const int dcThreshold= dcOffset*2 + 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
195
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
196 for(y=0; y<BLOCK_SIZE; y++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
197 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
198 if(((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
199 if(((unsigned)(src[1] - src[2] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
200 if(((unsigned)(src[2] - src[3] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
201 if(((unsigned)(src[3] - src[4] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
202 if(((unsigned)(src[4] - src[5] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
203 if(((unsigned)(src[5] - src[6] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
204 if(((unsigned)(src[6] - src[7] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
205 src+= stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
206 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
207 return numEq > c->ppMode.flatnessThreshold;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
208 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
209
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
210 /**
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
211 * Check if the middle 8x8 Block in the given 8x16 block is flat
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
212 */
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
213 static inline int isVertDC_C(uint8_t src[], int stride, PPContext *c){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
214 int numEq= 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
215 int y;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
216 const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
217 const int dcThreshold= dcOffset*2 + 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
218
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
219 src+= stride*4; // src points to begin of the 8x8 Block
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
220 for(y=0; y<BLOCK_SIZE-1; y++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
221 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
222 if(((unsigned)(src[0] - src[0+stride] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
223 if(((unsigned)(src[1] - src[1+stride] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
224 if(((unsigned)(src[2] - src[2+stride] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
225 if(((unsigned)(src[3] - src[3+stride] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
226 if(((unsigned)(src[4] - src[4+stride] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
227 if(((unsigned)(src[5] - src[5+stride] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
228 if(((unsigned)(src[6] - src[6+stride] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
229 if(((unsigned)(src[7] - src[7+stride] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
230 src+= stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
231 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
232 return numEq > c->ppMode.flatnessThreshold;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
233 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
234
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
235 static inline int isHorizMinMaxOk_C(uint8_t src[], int stride, int QP)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
236 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
237 int i;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
238 #if 1
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
239 for(i=0; i<2; i++){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
240 if((unsigned)(src[0] - src[5] + 2*QP) > 4*QP) return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
241 src += stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
242 if((unsigned)(src[2] - src[7] + 2*QP) > 4*QP) return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
243 src += stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
244 if((unsigned)(src[4] - src[1] + 2*QP) > 4*QP) return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
245 src += stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
246 if((unsigned)(src[6] - src[3] + 2*QP) > 4*QP) return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
247 src += stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
248 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
249 #else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
250 for(i=0; i<8; i++){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
251 if((unsigned)(src[0] - src[7] + 2*QP) > 4*QP) return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
252 src += stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
253 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
254 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
255 return 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
256 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
257
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
258 static inline int isVertMinMaxOk_C(uint8_t src[], int stride, int QP)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
259 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
260 #if 1
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
261 #if 1
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
262 int x;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
263 src+= stride*4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
264 for(x=0; x<BLOCK_SIZE; x+=4)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
265 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
266 if((unsigned)(src[ x + 0*stride] - src[ x + 5*stride] + 2*QP) > 4*QP) return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
267 if((unsigned)(src[1+x + 2*stride] - src[1+x + 7*stride] + 2*QP) > 4*QP) return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
268 if((unsigned)(src[2+x + 4*stride] - src[2+x + 1*stride] + 2*QP) > 4*QP) return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
269 if((unsigned)(src[3+x + 6*stride] - src[3+x + 3*stride] + 2*QP) > 4*QP) return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
270 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
271 #else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
272 int x;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
273 src+= stride*3;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
274 for(x=0; x<BLOCK_SIZE; x++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
275 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
276 if((unsigned)(src[x + stride] - src[x + (stride<<3)] + 2*QP) > 4*QP) return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
277 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
278 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
279 return 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
280 #else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
281 int x;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
282 src+= stride*4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
283 for(x=0; x<BLOCK_SIZE; x++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
284 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
285 int min=255;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
286 int max=0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
287 int y;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
288 for(y=0; y<8; y++){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
289 int v= src[x + y*stride];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
290 if(v>max) max=v;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
291 if(v<min) min=v;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
292 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
293 if(max-min > 2*QP) return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
294 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
295 return 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
296 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
297 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
298
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
299 static inline int horizClassify_C(uint8_t src[], int stride, PPContext *c){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
300 if( isHorizDC_C(src, stride, c) ){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
301 if( isHorizMinMaxOk_C(src, stride, c->QP) )
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
302 return 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
303 else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
304 return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
305 }else{
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
306 return 2;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
307 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
308 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
309
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
310 static inline int vertClassify_C(uint8_t src[], int stride, PPContext *c){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
311 if( isVertDC_C(src, stride, c) ){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
312 if( isVertMinMaxOk_C(src, stride, c->QP) )
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
313 return 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
314 else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
315 return 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
316 }else{
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
317 return 2;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
318 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
319 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
320
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
321 static inline void doHorizDefFilter_C(uint8_t dst[], int stride, PPContext *c)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
322 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
323 int y;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
324 for(y=0; y<BLOCK_SIZE; y++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
325 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
326 const int middleEnergy= 5*(dst[4] - dst[3]) + 2*(dst[2] - dst[5]);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
327
32
cb746db3fd32 Rename ABS macro to FFABS.
diego
parents: 31
diff changeset
328 if(FFABS(middleEnergy) < 8*c->QP)
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
329 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
330 const int q=(dst[3] - dst[4])/2;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
331 const int leftEnergy= 5*(dst[2] - dst[1]) + 2*(dst[0] - dst[3]);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
332 const int rightEnergy= 5*(dst[6] - dst[5]) + 2*(dst[4] - dst[7]);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
333
32
cb746db3fd32 Rename ABS macro to FFABS.
diego
parents: 31
diff changeset
334 int d= FFABS(middleEnergy) - FFMIN( FFABS(leftEnergy), FFABS(rightEnergy) );
27
c83a71c1729d Change libpostproc to use the FFMIN/FFMAX macros from libavutil.
diego
parents: 26
diff changeset
335 d= FFMAX(d, 0);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
336
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
337 d= (5*d + 32) >> 6;
31
81ad3274583c Rename SIGN macro to FFSIGN to avoid clashes with system headers.
diego
parents: 29
diff changeset
338 d*= FFSIGN(-middleEnergy);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
339
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
340 if(q>0)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
341 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
342 d= d<0 ? 0 : d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
343 d= d>q ? q : d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
344 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
345 else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
346 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
347 d= d>0 ? 0 : d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
348 d= d<q ? q : d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
349 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
350
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
351 dst[3]-= d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
352 dst[4]+= d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
353 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
354 dst+= stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
355 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
356 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
357
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
358 /**
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
359 * Do a horizontal low pass filter on the 10x8 block (dst points to middle 8x8 Block)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
360 * using the 9-Tap Filter (1,1,2,2,4,2,2,1,1)/16 (C version)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
361 */
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
362 static inline void doHorizLowPass_C(uint8_t dst[], int stride, PPContext *c)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
363 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
364 int y;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
365 for(y=0; y<BLOCK_SIZE; y++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
366 {
32
cb746db3fd32 Rename ABS macro to FFABS.
diego
parents: 31
diff changeset
367 const int first= FFABS(dst[-1] - dst[0]) < c->QP ? dst[-1] : dst[0];
cb746db3fd32 Rename ABS macro to FFABS.
diego
parents: 31
diff changeset
368 const int last= FFABS(dst[8] - dst[7]) < c->QP ? dst[8] : dst[7];
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
369
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
370 int sums[10];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
371 sums[0] = 4*first + dst[0] + dst[1] + dst[2] + 4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
372 sums[1] = sums[0] - first + dst[3];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
373 sums[2] = sums[1] - first + dst[4];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
374 sums[3] = sums[2] - first + dst[5];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
375 sums[4] = sums[3] - first + dst[6];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
376 sums[5] = sums[4] - dst[0] + dst[7];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
377 sums[6] = sums[5] - dst[1] + last;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
378 sums[7] = sums[6] - dst[2] + last;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
379 sums[8] = sums[7] - dst[3] + last;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
380 sums[9] = sums[8] - dst[4] + last;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
381
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
382 dst[0]= (sums[0] + sums[2] + 2*dst[0])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
383 dst[1]= (sums[1] + sums[3] + 2*dst[1])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
384 dst[2]= (sums[2] + sums[4] + 2*dst[2])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
385 dst[3]= (sums[3] + sums[5] + 2*dst[3])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
386 dst[4]= (sums[4] + sums[6] + 2*dst[4])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
387 dst[5]= (sums[5] + sums[7] + 2*dst[5])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
388 dst[6]= (sums[6] + sums[8] + 2*dst[6])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
389 dst[7]= (sums[7] + sums[9] + 2*dst[7])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
390
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
391 dst+= stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
392 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
393 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
394
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
395 /**
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
396 * Experimental Filter 1 (Horizontal)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
397 * will not damage linear gradients
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
398 * Flat blocks should look like they where passed through the (1,1,2,2,4,2,2,1,1) 9-Tap filter
48
72675332ed82 misc spelling fixes
diego
parents: 46
diff changeset
399 * can only smooth blocks at the expected locations (it cannot smooth them if they did move)
72675332ed82 misc spelling fixes
diego
parents: 46
diff changeset
400 * MMX2 version does correct clipping C version does not
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
401 * not identical with the vertical one
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
402 */
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
403 static inline void horizX1Filter(uint8_t *src, int stride, int QP)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
404 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
405 int y;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
406 static uint64_t *lut= NULL;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
407 if(lut==NULL)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
408 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
409 int i;
16
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
410 lut = av_malloc(256*8);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
411 for(i=0; i<256; i++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
412 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
413 int v= i < 128 ? 2*i : 2*(i-256);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
414 /*
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
415 //Simulate 112242211 9-Tap filter
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
416 uint64_t a= (v/16) & 0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
417 uint64_t b= (v/8) & 0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
418 uint64_t c= (v/4) & 0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
419 uint64_t d= (3*v/8) & 0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
420 */
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
421 //Simulate piecewise linear interpolation
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
422 uint64_t a= (v/16) & 0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
423 uint64_t b= (v*3/16) & 0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
424 uint64_t c= (v*5/16) & 0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
425 uint64_t d= (7*v/16) & 0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
426 uint64_t A= (0x100 - a)&0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
427 uint64_t B= (0x100 - b)&0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
428 uint64_t C= (0x100 - c)&0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
429 uint64_t D= (0x100 - c)&0xFF;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
430
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
431 lut[i] = (a<<56) | (b<<48) | (c<<40) | (d<<32) |
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
432 (D<<24) | (C<<16) | (B<<8) | (A);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
433 //lut[i] = (v<<32) | (v<<24);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
434 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
435 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
436
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
437 for(y=0; y<BLOCK_SIZE; y++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
438 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
439 int a= src[1] - src[2];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
440 int b= src[3] - src[4];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
441 int c= src[5] - src[6];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
442
32
cb746db3fd32 Rename ABS macro to FFABS.
diego
parents: 31
diff changeset
443 int d= FFMAX(FFABS(b) - (FFABS(a) + FFABS(c))/2, 0);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
444
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
445 if(d < QP)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
446 {
31
81ad3274583c Rename SIGN macro to FFSIGN to avoid clashes with system headers.
diego
parents: 29
diff changeset
447 int v = d * FFSIGN(-b);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
448
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
449 src[1] +=v/8;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
450 src[2] +=v/4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
451 src[3] +=3*v/8;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
452 src[4] -=3*v/8;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
453 src[5] -=v/4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
454 src[6] -=v/8;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
455
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
456 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
457 src+=stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
458 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
459 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
460
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
461 /**
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
462 * accurate deblock filter
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
463 */
38
63d07317cd7a rename always_inline to av_always_inline and move to common.h
mru
parents: 36
diff changeset
464 static av_always_inline void do_a_deblock_C(uint8_t *src, int step, int stride, PPContext *c){
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
465 int y;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
466 const int QP= c->QP;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
467 const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
468 const int dcThreshold= dcOffset*2 + 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
469 //START_TIMER
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
470 src+= step*4; // src points to begin of the 8x8 Block
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
471 for(y=0; y<8; y++){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
472 int numEq= 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
473
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
474 if(((unsigned)(src[-1*step] - src[0*step] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
475 if(((unsigned)(src[ 0*step] - src[1*step] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
476 if(((unsigned)(src[ 1*step] - src[2*step] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
477 if(((unsigned)(src[ 2*step] - src[3*step] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
478 if(((unsigned)(src[ 3*step] - src[4*step] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
479 if(((unsigned)(src[ 4*step] - src[5*step] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
480 if(((unsigned)(src[ 5*step] - src[6*step] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
481 if(((unsigned)(src[ 6*step] - src[7*step] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
482 if(((unsigned)(src[ 7*step] - src[8*step] + dcOffset)) < dcThreshold) numEq++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
483 if(numEq > c->ppMode.flatnessThreshold){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
484 int min, max, x;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
485
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
486 if(src[0] > src[step]){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
487 max= src[0];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
488 min= src[step];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
489 }else{
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
490 max= src[step];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
491 min= src[0];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
492 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
493 for(x=2; x<8; x+=2){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
494 if(src[x*step] > src[(x+1)*step]){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
495 if(src[x *step] > max) max= src[ x *step];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
496 if(src[(x+1)*step] < min) min= src[(x+1)*step];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
497 }else{
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
498 if(src[(x+1)*step] > max) max= src[(x+1)*step];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
499 if(src[ x *step] < min) min= src[ x *step];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
500 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
501 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
502 if(max-min < 2*QP){
32
cb746db3fd32 Rename ABS macro to FFABS.
diego
parents: 31
diff changeset
503 const int first= FFABS(src[-1*step] - src[0]) < QP ? src[-1*step] : src[0];
cb746db3fd32 Rename ABS macro to FFABS.
diego
parents: 31
diff changeset
504 const int last= FFABS(src[8*step] - src[7*step]) < QP ? src[8*step] : src[7*step];
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
505
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
506 int sums[10];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
507 sums[0] = 4*first + src[0*step] + src[1*step] + src[2*step] + 4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
508 sums[1] = sums[0] - first + src[3*step];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
509 sums[2] = sums[1] - first + src[4*step];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
510 sums[3] = sums[2] - first + src[5*step];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
511 sums[4] = sums[3] - first + src[6*step];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
512 sums[5] = sums[4] - src[0*step] + src[7*step];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
513 sums[6] = sums[5] - src[1*step] + last;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
514 sums[7] = sums[6] - src[2*step] + last;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
515 sums[8] = sums[7] - src[3*step] + last;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
516 sums[9] = sums[8] - src[4*step] + last;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
517
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
518 src[0*step]= (sums[0] + sums[2] + 2*src[0*step])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
519 src[1*step]= (sums[1] + sums[3] + 2*src[1*step])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
520 src[2*step]= (sums[2] + sums[4] + 2*src[2*step])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
521 src[3*step]= (sums[3] + sums[5] + 2*src[3*step])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
522 src[4*step]= (sums[4] + sums[6] + 2*src[4*step])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
523 src[5*step]= (sums[5] + sums[7] + 2*src[5*step])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
524 src[6*step]= (sums[6] + sums[8] + 2*src[6*step])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
525 src[7*step]= (sums[7] + sums[9] + 2*src[7*step])>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
526 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
527 }else{
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
528 const int middleEnergy= 5*(src[4*step] - src[3*step]) + 2*(src[2*step] - src[5*step]);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
529
32
cb746db3fd32 Rename ABS macro to FFABS.
diego
parents: 31
diff changeset
530 if(FFABS(middleEnergy) < 8*QP)
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
531 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
532 const int q=(src[3*step] - src[4*step])/2;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
533 const int leftEnergy= 5*(src[2*step] - src[1*step]) + 2*(src[0*step] - src[3*step]);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
534 const int rightEnergy= 5*(src[6*step] - src[5*step]) + 2*(src[4*step] - src[7*step]);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
535
32
cb746db3fd32 Rename ABS macro to FFABS.
diego
parents: 31
diff changeset
536 int d= FFABS(middleEnergy) - FFMIN( FFABS(leftEnergy), FFABS(rightEnergy) );
27
c83a71c1729d Change libpostproc to use the FFMIN/FFMAX macros from libavutil.
diego
parents: 26
diff changeset
537 d= FFMAX(d, 0);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
538
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
539 d= (5*d + 32) >> 6;
31
81ad3274583c Rename SIGN macro to FFSIGN to avoid clashes with system headers.
diego
parents: 29
diff changeset
540 d*= FFSIGN(-middleEnergy);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
541
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
542 if(q>0)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
543 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
544 d= d<0 ? 0 : d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
545 d= d>q ? q : d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
546 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
547 else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
548 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
549 d= d>0 ? 0 : d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
550 d= d<q ? q : d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
551 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
552
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
553 src[3*step]-= d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
554 src[4*step]+= d;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
555 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
556 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
557
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
558 src += stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
559 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
560 /*if(step==16){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
561 STOP_TIMER("step16")
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
562 }else{
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
563 STOP_TIMER("stepX")
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
564 }*/
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
565 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
566
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
567 //Note: we have C, MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
568 //Plain C versions
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
569 #if !defined (HAVE_MMX) || defined (RUNTIME_CPUDETECT)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
570 #define COMPILE_C
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
571 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
572
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
573 #ifdef ARCH_POWERPC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
574 #ifdef HAVE_ALTIVEC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
575 #define COMPILE_ALTIVEC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
576 #endif //HAVE_ALTIVEC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
577 #endif //ARCH_POWERPC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
578
36
b4fc1bd8525f Use common define for x86_32 and x86_64.
diego
parents: 34
diff changeset
579 #if defined(ARCH_X86)
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
580
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
581 #if (defined (HAVE_MMX) && !defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
582 #define COMPILE_MMX
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
583 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
584
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
585 #if defined (HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
586 #define COMPILE_MMX2
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
587 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
588
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
589 #if (defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
590 #define COMPILE_3DNOW
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
591 #endif
36
b4fc1bd8525f Use common define for x86_32 and x86_64.
diego
parents: 34
diff changeset
592 #endif /* defined(ARCH_X86) */
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
593
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
594 #undef HAVE_MMX
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
595 #undef HAVE_MMX2
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
596 #undef HAVE_3DNOW
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
597 #undef HAVE_ALTIVEC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
598
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
599 #ifdef COMPILE_C
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
600 #undef HAVE_MMX
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
601 #undef HAVE_MMX2
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
602 #undef HAVE_3DNOW
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
603 #define RENAME(a) a ## _C
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
604 #include "postprocess_template.c"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
605 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
606
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
607 #ifdef ARCH_POWERPC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
608 #ifdef COMPILE_ALTIVEC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
609 #undef RENAME
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
610 #define HAVE_ALTIVEC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
611 #define RENAME(a) a ## _altivec
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
612 #include "postprocess_altivec_template.c"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
613 #include "postprocess_template.c"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
614 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
615 #endif //ARCH_POWERPC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
616
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
617 //MMX versions
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
618 #ifdef COMPILE_MMX
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
619 #undef RENAME
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
620 #define HAVE_MMX
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
621 #undef HAVE_MMX2
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
622 #undef HAVE_3DNOW
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
623 #define RENAME(a) a ## _MMX
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
624 #include "postprocess_template.c"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
625 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
626
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
627 //MMX2 versions
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
628 #ifdef COMPILE_MMX2
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
629 #undef RENAME
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
630 #define HAVE_MMX
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
631 #define HAVE_MMX2
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
632 #undef HAVE_3DNOW
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
633 #define RENAME(a) a ## _MMX2
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
634 #include "postprocess_template.c"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
635 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
636
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
637 //3DNOW versions
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
638 #ifdef COMPILE_3DNOW
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
639 #undef RENAME
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
640 #define HAVE_MMX
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
641 #undef HAVE_MMX2
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
642 #define HAVE_3DNOW
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
643 #define RENAME(a) a ## _3DNow
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
644 #include "postprocess_template.c"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
645 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
646
48
72675332ed82 misc spelling fixes
diego
parents: 46
diff changeset
647 // minor note: the HAVE_xyz is messed up after that line so do not use it.
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
648
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
649 static inline void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height,
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
650 QP_STORE_T QPs[], int QPStride, int isColor, pp_mode_t *vm, pp_context_t *vc)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
651 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
652 PPContext *c= (PPContext *)vc;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
653 PPMode *ppMode= (PPMode *)vm;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
654 c->ppMode= *ppMode; //FIXME
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
655
48
72675332ed82 misc spelling fixes
diego
parents: 46
diff changeset
656 // Using ifs here as they are faster than function pointers although the
72675332ed82 misc spelling fixes
diego
parents: 46
diff changeset
657 // difference would not be measureable here but it is much better because
72675332ed82 misc spelling fixes
diego
parents: 46
diff changeset
658 // someone might exchange the CPU whithout restarting MPlayer ;)
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
659 #ifdef RUNTIME_CPUDETECT
36
b4fc1bd8525f Use common define for x86_32 and x86_64.
diego
parents: 34
diff changeset
660 #if defined(ARCH_X86)
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
661 // ordered per speed fasterst first
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
662 if(c->cpuCaps & PP_CPU_CAPS_MMX2)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
663 postProcess_MMX2(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
664 else if(c->cpuCaps & PP_CPU_CAPS_3DNOW)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
665 postProcess_3DNow(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
666 else if(c->cpuCaps & PP_CPU_CAPS_MMX)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
667 postProcess_MMX(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
668 else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
669 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
670 #else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
671 #ifdef ARCH_POWERPC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
672 #ifdef HAVE_ALTIVEC
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
673 if(c->cpuCaps & PP_CPU_CAPS_ALTIVEC)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
674 postProcess_altivec(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
675 else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
676 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
677 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
678 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
679 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
680 #else //RUNTIME_CPUDETECT
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
681 #ifdef HAVE_MMX2
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
682 postProcess_MMX2(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
683 #elif defined (HAVE_3DNOW)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
684 postProcess_3DNow(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
685 #elif defined (HAVE_MMX)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
686 postProcess_MMX(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
687 #elif defined (HAVE_ALTIVEC)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
688 postProcess_altivec(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
689 #else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
690 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
691 #endif
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
692 #endif //!RUNTIME_CPUDETECT
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
693 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
694
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
695 //static void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height,
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
696 // QP_STORE_T QPs[], int QPStride, int isColor, struct PPMode *ppMode);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
697
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
698 /* -pp Command line Help
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
699 */
66
7737e39e74f3 Make pp_help a constant pointer to constant characters, moves it partially
benoit
parents: 65
diff changeset
700 const char *const pp_help=
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
701 "Available postprocessing filters:\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
702 "Filters Options\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
703 "short long name short long option Description\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
704 "* * a autoq CPU power dependent enabler\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
705 " c chrom chrominance filtering enabled\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
706 " y nochrom chrominance filtering disabled\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
707 " n noluma luma filtering disabled\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
708 "hb hdeblock (2 threshold) horizontal deblocking filter\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
709 " 1. difference factor: default=32, higher -> more deblocking\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
710 " 2. flatness threshold: default=39, lower -> more deblocking\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
711 " the h & v deblocking filters share these\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
712 " so you can't set different thresholds for h / v\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
713 "vb vdeblock (2 threshold) vertical deblocking filter\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
714 "ha hadeblock (2 threshold) horizontal deblocking filter\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
715 "va vadeblock (2 threshold) vertical deblocking filter\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
716 "h1 x1hdeblock experimental h deblock filter 1\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
717 "v1 x1vdeblock experimental v deblock filter 1\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
718 "dr dering deringing filter\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
719 "al autolevels automatic brightness / contrast\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
720 " f fullyrange stretch luminance to (0..255)\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
721 "lb linblenddeint linear blend deinterlacer\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
722 "li linipoldeint linear interpolating deinterlace\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
723 "ci cubicipoldeint cubic interpolating deinterlacer\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
724 "md mediandeint median deinterlacer\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
725 "fd ffmpegdeint ffmpeg deinterlacer\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
726 "l5 lowpass5 FIR lowpass deinterlacer\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
727 "de default hb:a,vb:a,dr:a\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
728 "fa fast h1:a,v1:a,dr:a\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
729 "ac ha:a:128:7,va:a,dr:a\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
730 "tn tmpnoise (3 threshold) temporal noise reducer\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
731 " 1. <= 2. <= 3. larger -> stronger filtering\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
732 "fq forceQuant <quantizer> force quantizer\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
733 "Usage:\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
734 "<filterName>[:<option>[:<option>...]][[,|/][-]<filterName>[:<option>...]]...\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
735 "long form example:\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
736 "vdeblock:autoq/hdeblock:autoq/linblenddeint default,-vdeblock\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
737 "short form example:\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
738 "vb:a/hb:a/lb de,-vb\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
739 "more examples:\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
740 "tn:64:128:256\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
741 "\n"
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
742 ;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
743
65
5bef666de27d Make pp_get_mode_by_name_and_quality accept a constant string.
benoit
parents: 64
diff changeset
744 pp_mode_t *pp_get_mode_by_name_and_quality(const char *name, int quality)
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
745 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
746 char temp[GET_MODE_BUFFER_SIZE];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
747 char *p= temp;
64
1912d7e2858d Make filterDelimiters and optionDelimiters two static constant array of
benoit
parents: 56
diff changeset
748 static const char filterDelimiters[] = ",/";
1912d7e2858d Make filterDelimiters and optionDelimiters two static constant array of
benoit
parents: 56
diff changeset
749 static const char optionDelimiters[] = ":";
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
750 struct PPMode *ppMode;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
751 char *filterToken;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
752
16
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
753 ppMode= av_malloc(sizeof(PPMode));
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
754
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
755 ppMode->lumMode= 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
756 ppMode->chromMode= 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
757 ppMode->maxTmpNoise[0]= 700;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
758 ppMode->maxTmpNoise[1]= 1500;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
759 ppMode->maxTmpNoise[2]= 3000;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
760 ppMode->maxAllowedY= 234;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
761 ppMode->minAllowedY= 16;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
762 ppMode->baseDcDiff= 256/8;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
763 ppMode->flatnessThreshold= 56-16-1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
764 ppMode->maxClippedThreshold= 0.01;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
765 ppMode->error=0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
766
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
767 strncpy(temp, name, GET_MODE_BUFFER_SIZE);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
768
29
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
769 av_log(NULL, AV_LOG_DEBUG, "pp: %s\n", name);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
770
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
771 for(;;){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
772 char *filterName;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
773 int q= 1000000; //PP_QUALITY_MAX;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
774 int chrom=-1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
775 int luma=-1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
776 char *option;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
777 char *options[OPTIONS_ARRAY_SIZE];
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
778 int i;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
779 int filterNameOk=0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
780 int numOfUnknownOptions=0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
781 int enable=1; //does the user want us to enabled or disabled the filter
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
782
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
783 filterToken= strtok(p, filterDelimiters);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
784 if(filterToken == NULL) break;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
785 p+= strlen(filterToken) + 1; // p points to next filterToken
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
786 filterName= strtok(filterToken, optionDelimiters);
29
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
787 av_log(NULL, AV_LOG_DEBUG, "pp: %s::%s\n", filterToken, filterName);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
788
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
789 if(*filterName == '-')
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
790 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
791 enable=0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
792 filterName++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
793 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
794
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
795 for(;;){ //for all options
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
796 option= strtok(NULL, optionDelimiters);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
797 if(option == NULL) break;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
798
29
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
799 av_log(NULL, AV_LOG_DEBUG, "pp: option: %s\n", option);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
800 if(!strcmp("autoq", option) || !strcmp("a", option)) q= quality;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
801 else if(!strcmp("nochrom", option) || !strcmp("y", option)) chrom=0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
802 else if(!strcmp("chrom", option) || !strcmp("c", option)) chrom=1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
803 else if(!strcmp("noluma", option) || !strcmp("n", option)) luma=0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
804 else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
805 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
806 options[numOfUnknownOptions] = option;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
807 numOfUnknownOptions++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
808 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
809 if(numOfUnknownOptions >= OPTIONS_ARRAY_SIZE-1) break;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
810 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
811 options[numOfUnknownOptions] = NULL;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
812
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
813 /* replace stuff from the replace Table */
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
814 for(i=0; replaceTable[2*i]!=NULL; i++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
815 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
816 if(!strcmp(replaceTable[2*i], filterName))
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
817 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
818 int newlen= strlen(replaceTable[2*i + 1]);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
819 int plen;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
820 int spaceLeft;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
821
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
822 if(p==NULL) p= temp, *p=0; //last filter
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
823 else p--, *p=','; //not last filter
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
824
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
825 plen= strlen(p);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
826 spaceLeft= p - temp + plen;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
827 if(spaceLeft + newlen >= GET_MODE_BUFFER_SIZE)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
828 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
829 ppMode->error++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
830 break;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
831 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
832 memmove(p + newlen, p, plen+1);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
833 memcpy(p, replaceTable[2*i + 1], newlen);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
834 filterNameOk=1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
835 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
836 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
837
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
838 for(i=0; filters[i].shortName!=NULL; i++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
839 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
840 if( !strcmp(filters[i].longName, filterName)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
841 || !strcmp(filters[i].shortName, filterName))
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
842 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
843 ppMode->lumMode &= ~filters[i].mask;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
844 ppMode->chromMode &= ~filters[i].mask;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
845
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
846 filterNameOk=1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
847 if(!enable) break; // user wants to disable it
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
848
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
849 if(q >= filters[i].minLumQuality && luma)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
850 ppMode->lumMode|= filters[i].mask;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
851 if(chrom==1 || (chrom==-1 && filters[i].chromDefault))
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
852 if(q >= filters[i].minChromQuality)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
853 ppMode->chromMode|= filters[i].mask;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
854
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
855 if(filters[i].mask == LEVEL_FIX)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
856 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
857 int o;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
858 ppMode->minAllowedY= 16;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
859 ppMode->maxAllowedY= 234;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
860 for(o=0; options[o]!=NULL; o++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
861 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
862 if( !strcmp(options[o],"fullyrange")
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
863 ||!strcmp(options[o],"f"))
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
864 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
865 ppMode->minAllowedY= 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
866 ppMode->maxAllowedY= 255;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
867 numOfUnknownOptions--;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
868 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
869 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
870 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
871 else if(filters[i].mask == TEMP_NOISE_FILTER)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
872 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
873 int o;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
874 int numOfNoises=0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
875
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
876 for(o=0; options[o]!=NULL; o++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
877 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
878 char *tail;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
879 ppMode->maxTmpNoise[numOfNoises]=
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
880 strtol(options[o], &tail, 0);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
881 if(tail!=options[o])
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
882 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
883 numOfNoises++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
884 numOfUnknownOptions--;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
885 if(numOfNoises >= 3) break;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
886 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
887 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
888 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
889 else if(filters[i].mask == V_DEBLOCK || filters[i].mask == H_DEBLOCK
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
890 || filters[i].mask == V_A_DEBLOCK || filters[i].mask == H_A_DEBLOCK)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
891 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
892 int o;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
893
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
894 for(o=0; options[o]!=NULL && o<2; o++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
895 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
896 char *tail;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
897 int val= strtol(options[o], &tail, 0);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
898 if(tail==options[o]) break;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
899
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
900 numOfUnknownOptions--;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
901 if(o==0) ppMode->baseDcDiff= val;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
902 else ppMode->flatnessThreshold= val;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
903 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
904 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
905 else if(filters[i].mask == FORCE_QUANT)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
906 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
907 int o;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
908 ppMode->forcedQuant= 15;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
909
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
910 for(o=0; options[o]!=NULL && o<1; o++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
911 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
912 char *tail;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
913 int val= strtol(options[o], &tail, 0);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
914 if(tail==options[o]) break;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
915
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
916 numOfUnknownOptions--;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
917 ppMode->forcedQuant= val;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
918 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
919 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
920 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
921 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
922 if(!filterNameOk) ppMode->error++;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
923 ppMode->error += numOfUnknownOptions;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
924 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
925
29
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
926 av_log(NULL, AV_LOG_DEBUG, "pp: lumMode=%X, chromMode=%X\n", ppMode->lumMode, ppMode->chromMode);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
927 if(ppMode->error)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
928 {
29
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
929 av_log(NULL, AV_LOG_ERROR, "%d errors in postprocess string \"%s\"\n", ppMode->error, name);
16
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
930 av_free(ppMode);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
931 return NULL;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
932 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
933 return ppMode;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
934 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
935
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
936 void pp_free_mode(pp_mode_t *mode){
16
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
937 av_free(mode);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
938 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
939
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
940 static void reallocAlign(void **p, int alignment, int size){
18
2cd017ec54f3 1000000l for lu_zero (commiting untested? code)
michael
parents: 16
diff changeset
941 av_free(*p);
16
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
942 *p= av_mallocz(size);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
943 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
944
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
945 static void reallocBuffers(PPContext *c, int width, int height, int stride, int qpStride){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
946 int mbWidth = (width+15)>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
947 int mbHeight= (height+15)>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
948 int i;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
949
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
950 c->stride= stride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
951 c->qpStride= qpStride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
952
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
953 reallocAlign((void **)&c->tempDst, 8, stride*24);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
954 reallocAlign((void **)&c->tempSrc, 8, stride*24);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
955 reallocAlign((void **)&c->tempBlocks, 8, 2*16*8);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
956 reallocAlign((void **)&c->yHistogram, 8, 256*sizeof(uint64_t));
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
957 for(i=0; i<256; i++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
958 c->yHistogram[i]= width*height/64*15/256;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
959
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
960 for(i=0; i<3; i++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
961 {
48
72675332ed82 misc spelling fixes
diego
parents: 46
diff changeset
962 //Note: The +17*1024 is just there so i do not have to worry about r/w over the end.
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
963 reallocAlign((void **)&c->tempBlured[i], 8, stride*mbHeight*16 + 17*1024);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
964 reallocAlign((void **)&c->tempBluredPast[i], 8, 256*((height+7)&(~7))/2 + 17*1024);//FIXME size
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
965 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
966
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
967 reallocAlign((void **)&c->deintTemp, 8, 2*width+32);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
968 reallocAlign((void **)&c->nonBQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
969 reallocAlign((void **)&c->stdQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
970 reallocAlign((void **)&c->forcedQPTable, 8, mbWidth*sizeof(QP_STORE_T));
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
971 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
972
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
973 static void global_init(void){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
974 int i;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
975 memset(clip_table, 0, 256);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
976 for(i=256; i<512; i++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
977 clip_table[i]= i;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
978 memset(clip_table+512, 0, 256);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
979 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
980
29
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
981 static const char * context_to_name(void * ptr) {
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
982 return "postproc";
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
983 }
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
984
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
985 static AVClass av_codec_context_class = { "Postproc", context_to_name, NULL };
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
986
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
987 pp_context_t *pp_get_context(int width, int height, int cpuCaps){
16
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
988 PPContext *c= av_malloc(sizeof(PPContext));
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
989 int stride= (width+15)&(~15); //assumed / will realloc if needed
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
990 int qpStride= (width+15)/16 + 2; //assumed / will realloc if needed
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
991
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
992 global_init();
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
993
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
994 memset(c, 0, sizeof(PPContext));
29
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
995 c->av_class = &av_codec_context_class;
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
996 c->cpuCaps= cpuCaps;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
997 if(cpuCaps&PP_FORMAT){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
998 c->hChromaSubSample= cpuCaps&0x3;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
999 c->vChromaSubSample= (cpuCaps>>4)&0x3;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1000 }else{
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1001 c->hChromaSubSample= 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1002 c->vChromaSubSample= 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1003 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1004
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1005 reallocBuffers(c, width, height, stride, qpStride);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1006
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1007 c->frameNum=-1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1008
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1009 return c;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1010 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1011
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1012 void pp_free_context(void *vc){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1013 PPContext *c = (PPContext*)vc;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1014 int i;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1015
16
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
1016 for(i=0; i<3; i++) av_free(c->tempBlured[i]);
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
1017 for(i=0; i<3; i++) av_free(c->tempBluredPast[i]);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1018
16
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
1019 av_free(c->tempBlocks);
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
1020 av_free(c->yHistogram);
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
1021 av_free(c->tempDst);
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
1022 av_free(c->tempSrc);
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
1023 av_free(c->deintTemp);
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
1024 av_free(c->stdQPTable);
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
1025 av_free(c->nonBQPTable);
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
1026 av_free(c->forcedQPTable);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1027
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1028 memset(c, 0, sizeof(PPContext));
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1029
16
ac05bfe3da66 make postproc use avutil
lu_zero
parents: 12
diff changeset
1030 av_free(c);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1031 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1032
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1033 void pp_postprocess(uint8_t * src[3], int srcStride[3],
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1034 uint8_t * dst[3], int dstStride[3],
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1035 int width, int height,
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1036 QP_STORE_T *QP_store, int QPStride,
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1037 pp_mode_t *vm, void *vc, int pict_type)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1038 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1039 int mbWidth = (width+15)>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1040 int mbHeight= (height+15)>>4;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1041 PPMode *mode = (PPMode*)vm;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1042 PPContext *c = (PPContext*)vc;
32
cb746db3fd32 Rename ABS macro to FFABS.
diego
parents: 31
diff changeset
1043 int minStride= FFMAX(FFABS(srcStride[0]), FFABS(dstStride[0]));
cb746db3fd32 Rename ABS macro to FFABS.
diego
parents: 31
diff changeset
1044 int absQPStride = FFABS(QPStride);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1045
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1046 // c->stride and c->QPStride are always positive
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1047 if(c->stride < minStride || c->qpStride < absQPStride)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1048 reallocBuffers(c, width, height,
27
c83a71c1729d Change libpostproc to use the FFMIN/FFMAX macros from libavutil.
diego
parents: 26
diff changeset
1049 FFMAX(minStride, c->stride),
c83a71c1729d Change libpostproc to use the FFMIN/FFMAX macros from libavutil.
diego
parents: 26
diff changeset
1050 FFMAX(c->qpStride, absQPStride));
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1051
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1052 if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1053 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1054 int i;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1055 QP_store= c->forcedQPTable;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1056 absQPStride = QPStride = 0;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1057 if(mode->lumMode & FORCE_QUANT)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1058 for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1059 else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1060 for(i=0; i<mbWidth; i++) QP_store[i]= 1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1061 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1062
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1063 if(pict_type & PP_PICT_TYPE_QP2){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1064 int i;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1065 const int count= mbHeight * absQPStride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1066 for(i=0; i<(count>>2); i++){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1067 ((uint32_t*)c->stdQPTable)[i] = (((uint32_t*)QP_store)[i]>>1) & 0x7F7F7F7F;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1068 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1069 for(i<<=2; i<count; i++){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1070 c->stdQPTable[i] = QP_store[i]>>1;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1071 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1072 QP_store= c->stdQPTable;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1073 QPStride= absQPStride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1074 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1075
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1076 if(0){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1077 int x,y;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1078 for(y=0; y<mbHeight; y++){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1079 for(x=0; x<mbWidth; x++){
29
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
1080 av_log(c, AV_LOG_INFO, "%2d ", QP_store[x + y*QPStride]);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1081 }
29
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
1082 av_log(c, AV_LOG_INFO, "\n");
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1083 }
29
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
1084 av_log(c, AV_LOG_INFO, "\n");
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1085 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1086
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1087 if((pict_type&7)!=3)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1088 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1089 if (QPStride >= 0) {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1090 int i;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1091 const int count= mbHeight * QPStride;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1092 for(i=0; i<(count>>2); i++){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1093 ((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x3F3F3F3F;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1094 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1095 for(i<<=2; i<count; i++){
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1096 c->nonBQPTable[i] = QP_store[i] & 0x3F;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1097 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1098 } else {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1099 int i,j;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1100 for(i=0; i<mbHeight; i++) {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1101 for(j=0; j<absQPStride; j++) {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1102 c->nonBQPTable[i*absQPStride+j] = QP_store[i*QPStride+j] & 0x3F;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1103 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1104 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1105 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1106 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1107
29
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
1108 av_log(c, AV_LOG_DEBUG, "using npp filters 0x%X/0x%X\n",
2e855f3f4e0b printf --> av_log with some help from Oded
diego
parents: 27
diff changeset
1109 mode->lumMode, mode->chromMode);
0
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1110
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1111 postProcess(src[0], srcStride[0], dst[0], dstStride[0],
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1112 width, height, QP_store, QPStride, 0, mode, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1113
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1114 width = (width )>>c->hChromaSubSample;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1115 height = (height)>>c->vChromaSubSample;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1116
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1117 if(mode->chromMode)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1118 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1119 postProcess(src[1], srcStride[1], dst[1], dstStride[1],
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1120 width, height, QP_store, QPStride, 1, mode, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1121 postProcess(src[2], srcStride[2], dst[2], dstStride[2],
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1122 width, height, QP_store, QPStride, 2, mode, c);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1123 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1124 else if(srcStride[1] == dstStride[1] && srcStride[2] == dstStride[2])
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1125 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1126 linecpy(dst[1], src[1], height, srcStride[1]);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1127 linecpy(dst[2], src[2], height, srcStride[2]);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1128 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1129 else
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1130 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1131 int y;
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1132 for(y=0; y<height; y++)
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1133 {
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1134 memcpy(&(dst[1][y*dstStride[1]]), &(src[1][y*srcStride[1]]), width);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1135 memcpy(&(dst[2][y*dstStride[2]]), &(src[2][y*srcStride[2]]), width);
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1136 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1137 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1138 }
7c419ceafa6a libavcodec/libpostproc ---> libpostproc
diego
parents:
diff changeset
1139