94 #include "libavutil/ffversion.h" 105 return FFMPEG_CONFIGURATION;
110 #define LICENSE_PREFIX "libpostproc license: " 114 #define GET_MODE_BUFFER_SIZE 500 115 #define OPTIONS_ARRAY_SIZE 10 117 #define TEMP_STRIDE 8 120 #if ARCH_X86 && HAVE_INLINE_ASM 144 {
"dr",
"dering", 1, 5, 6,
DERING},
145 {
"al",
"autolevels", 0, 1, 2,
LEVEL_FIX},
154 {
"be",
"bitexact", 1, 0, 0,
BITEXACT},
161 "default",
"hb:a,vb:a,dr:a",
162 "de",
"hb:a,vb:a,dr:a",
163 "fast",
"h1:a,v1:a,dr:a",
164 "fa",
"h1:a,v1:a,dr:a",
165 "ac",
"ha:a:128:7,va:a,dr:a",
180 const int dcThreshold= dcOffset*2 + 1;
183 numEq += ((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold;
184 numEq += ((unsigned)(src[1] - src[2] + dcOffset)) < dcThreshold;
185 numEq += ((unsigned)(src[2] - src[3] + dcOffset)) < dcThreshold;
186 numEq += ((unsigned)(src[3] - src[4] + dcOffset)) < dcThreshold;
187 numEq += ((unsigned)(src[4] - src[5] + dcOffset)) < dcThreshold;
188 numEq += ((unsigned)(src[5] - src[6] + dcOffset)) < dcThreshold;
189 numEq += ((unsigned)(src[6] - src[7] + dcOffset)) < dcThreshold;
203 const int dcThreshold= dcOffset*2 + 1;
207 numEq += ((unsigned)(src[0] - src[0+stride] + dcOffset)) < dcThreshold;
208 numEq += ((unsigned)(src[1] - src[1+stride] + dcOffset)) < dcThreshold;
209 numEq += ((unsigned)(src[2] - src[2+stride] + dcOffset)) < dcThreshold;
210 numEq += ((unsigned)(src[3] - src[3+stride] + dcOffset)) < dcThreshold;
211 numEq += ((unsigned)(src[4] - src[4+stride] + dcOffset)) < dcThreshold;
212 numEq += ((unsigned)(src[5] - src[5+stride] + dcOffset)) < dcThreshold;
213 numEq += ((unsigned)(src[6] - src[6+stride] + dcOffset)) < dcThreshold;
214 numEq += ((unsigned)(src[7] - src[7+stride] + dcOffset)) < dcThreshold;
224 if((
unsigned)(src[0] - src[5] + 2*QP) > 4*QP)
return 0;
226 if((
unsigned)(src[2] - src[7] + 2*QP) > 4*QP)
return 0;
228 if((
unsigned)(src[4] - src[1] + 2*QP) > 4*QP)
return 0;
230 if((
unsigned)(src[6] - src[3] + 2*QP) > 4*QP)
return 0;
241 if((
unsigned)(src[ x + 0*stride] - src[ x + 5*stride] + 2*QP) > 4*QP)
return 0;
242 if((
unsigned)(src[1+x + 2*stride] - src[1+x + 7*stride] + 2*QP) > 4*QP)
return 0;
243 if((
unsigned)(src[2+x + 4*stride] - src[2+x + 1*stride] + 2*QP) > 4*QP)
return 0;
244 if((
unsigned)(src[3+x + 6*stride] - src[3+x + 3*stride] + 2*QP) > 4*QP)
return 0;
271 const int middleEnergy= 5*(dst[4] - dst[3]) + 2*(dst[2] - dst[5]);
273 if(
FFABS(middleEnergy) < 8*c->
QP){
274 const int q=(dst[3] - dst[4])/2;
275 const int leftEnergy= 5*(dst[2] - dst[1]) + 2*(dst[0] - dst[3]);
276 const int rightEnergy= 5*(dst[6] - dst[5]) + 2*(dst[4] - dst[7]);
282 d*=
FFSIGN(-middleEnergy);
310 const int first=
FFABS(dst[-1] - dst[0]) < c->
QP ? dst[-1] : dst[0];
311 const int last=
FFABS(dst[8] - dst[7]) < c->
QP ? dst[8] : dst[7];
314 sums[0] = 4*first + dst[0] + dst[1] + dst[2] + 4;
315 sums[1] = sums[0] - first + dst[3];
316 sums[2] = sums[1] - first + dst[4];
317 sums[3] = sums[2] - first + dst[5];
318 sums[4] = sums[3] - first + dst[6];
319 sums[5] = sums[4] - dst[0] + dst[7];
320 sums[6] = sums[5] - dst[1] + last;
321 sums[7] = sums[6] - dst[2] + last;
322 sums[8] = sums[7] - dst[3] + last;
323 sums[9] = sums[8] - dst[4] + last;
325 dst[0]= (sums[0] + sums[2] + 2*dst[0])>>4;
326 dst[1]= (sums[1] + sums[3] + 2*dst[1])>>4;
327 dst[2]= (sums[2] + sums[4] + 2*dst[2])>>4;
328 dst[3]= (sums[3] + sums[5] + 2*dst[3])>>4;
329 dst[4]= (sums[4] + sums[6] + 2*dst[4])>>4;
330 dst[5]= (sums[5] + sums[7] + 2*dst[5])>>4;
331 dst[6]= (sums[6] + sums[8] + 2*dst[6])>>4;
332 dst[7]= (sums[7] + sums[9] + 2*dst[7])>>4;
349 static uint64_t lut[256];
355 int v= i < 128 ? 2*i : 2*(i-256);
364 uint64_t
a= (v/16) & 0xFF;
365 uint64_t
b= (v*3/16) & 0xFF;
366 uint64_t
c= (v*5/16) & 0xFF;
367 uint64_t d= (7*v/16) & 0xFF;
368 uint64_t
A= (0x100 -
a)&0xFF;
369 uint64_t
B= (0x100 -
b)&0xFF;
370 uint64_t
C= (0x100 -
c)&0xFF;
371 uint64_t
D= (0x100 -
c)&0xFF;
373 lut[
i] = (a<<56) | (b<<48) | (c<<40) | (d<<32) |
374 (D<<24) | (C<<16) | (B<<8) | (A);
380 int a= src[1] - src[2];
381 int b= src[3] - src[4];
382 int c= src[5] - src[6];
409 const int dcThreshold= dcOffset*2 + 1;
415 numEq += ((unsigned)(src[-1*step] - src[0*step] + dcOffset)) < dcThreshold;
416 numEq += ((unsigned)(src[ 0*step] - src[1*step] + dcOffset)) < dcThreshold;
417 numEq += ((unsigned)(src[ 1*step] - src[2*step] + dcOffset)) < dcThreshold;
418 numEq += ((unsigned)(src[ 2*step] - src[3*step] + dcOffset)) < dcThreshold;
419 numEq += ((unsigned)(src[ 3*step] - src[4*step] + dcOffset)) < dcThreshold;
420 numEq += ((unsigned)(src[ 4*step] - src[5*step] + dcOffset)) < dcThreshold;
421 numEq += ((unsigned)(src[ 5*step] - src[6*step] + dcOffset)) < dcThreshold;
422 numEq += ((unsigned)(src[ 6*step] - src[7*step] + dcOffset)) < dcThreshold;
423 numEq += ((unsigned)(src[ 7*step] - src[8*step] + dcOffset)) < dcThreshold;
427 if(src[0] > src[step]){
435 if(src[x*step] > src[(x+1)*
step]){
436 if(src[x *step] > max) max= src[ x *
step];
440 if(src[ x *step] < min) min= src[ x *
step];
444 const int first=
FFABS(src[-1*step] - src[0]) < QP ? src[-1*
step] : src[0];
445 const int last=
FFABS(src[8*step] - src[7*step]) < QP ? src[8*
step] : src[7*
step];
448 sums[0] = 4*first + src[0*
step] + src[1*
step] + src[2*
step] + 4;
449 sums[1] = sums[0] - first + src[3*
step];
450 sums[2] = sums[1] - first + src[4*
step];
451 sums[3] = sums[2] - first + src[5*
step];
452 sums[4] = sums[3] - first + src[6*
step];
453 sums[5] = sums[4] - src[0*
step] + src[7*
step];
454 sums[6] = sums[5] - src[1*
step] + last;
455 sums[7] = sums[6] - src[2*
step] + last;
456 sums[8] = sums[7] - src[3*
step] + last;
457 sums[9] = sums[8] - src[4*
step] + last;
469 src[0*
step]= (sums[0] + sums[2] + 2*src[0*
step])>>4;
470 src[1*
step]= (sums[1] + sums[3] + 2*src[1*
step])>>4;
471 src[2*
step]= (sums[2] + sums[4] + 2*src[2*
step])>>4;
472 src[3*
step]= (sums[3] + sums[5] + 2*src[3*
step])>>4;
473 src[4*
step]= (sums[4] + sums[6] + 2*src[4*
step])>>4;
474 src[5*
step]= (sums[5] + sums[7] + 2*src[5*
step])>>4;
475 src[6*
step]= (sums[6] + sums[8] + 2*src[6*
step])>>4;
476 src[7*
step]= (sums[7] + sums[9] + 2*src[7*
step])>>4;
479 const int middleEnergy= 5*(src[4*
step] - src[3*
step]) + 2*(src[2*step] - src[5*step]);
481 if(
FFABS(middleEnergy) < 8*
QP){
482 const int q=(src[3*
step] - src[4*
step])/2;
483 const int leftEnergy= 5*(src[2*
step] - src[1*
step]) + 2*(src[0*step] - src[3*step]);
484 const int rightEnergy= 5*(src[6*
step] - src[5*
step]) + 2*(src[4*step] - src[7*step]);
490 d*=
FFSIGN(-middleEnergy);
501 d= (d < 0) ? 32 : -32;
502 src[3*
step]= av_clip_uint8(src[3*step] - d);
503 src[4*
step]= av_clip_uint8(src[4*step] + d);
519 #define TEMPLATE_PP_C 1 523 # define TEMPLATE_PP_ALTIVEC 1 528 #if ARCH_X86 && HAVE_INLINE_ASM 529 # if CONFIG_RUNTIME_CPUDETECT 530 # define TEMPLATE_PP_MMX 1 532 # define TEMPLATE_PP_MMXEXT 1 534 # define TEMPLATE_PP_3DNOW 1 536 # define TEMPLATE_PP_SSE2 1 539 # if HAVE_SSE2_INLINE 540 # define TEMPLATE_PP_SSE2 1 542 # elif HAVE_MMXEXT_INLINE 543 # define TEMPLATE_PP_MMXEXT 1 545 # elif HAVE_AMD3DNOW_INLINE 546 # define TEMPLATE_PP_3DNOW 1 548 # elif HAVE_MMX_INLINE 549 # define TEMPLATE_PP_MMX 1 556 const int8_t QPs[],
int QPStride,
int isColor,
PPContext *
c2);
561 pp_fn pp = postProcess_C;
567 #if CONFIG_RUNTIME_CPUDETECT 568 #if ARCH_X86 && HAVE_INLINE_ASM 579 pp = postProcess_SSE2;
580 #elif HAVE_MMXEXT_INLINE 581 pp = postProcess_MMX2;
582 #elif HAVE_AMD3DNOW_INLINE 583 pp = postProcess_3DNow;
584 #elif HAVE_MMX_INLINE 585 pp = postProcess_MMX;
587 pp = postProcess_altivec;
592 pp(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
598 "Available postprocessing filters:\n" 600 "short long name short long option Description\n" 601 "* * a autoq CPU power dependent enabler\n" 602 " c chrom chrominance filtering enabled\n" 603 " y nochrom chrominance filtering disabled\n" 604 " n noluma luma filtering disabled\n" 605 "hb hdeblock (2 threshold) horizontal deblocking filter\n" 606 " 1. difference factor: default=32, higher -> more deblocking\n" 607 " 2. flatness threshold: default=39, lower -> more deblocking\n" 608 " the h & v deblocking filters share these\n" 609 " so you can't set different thresholds for h / v\n" 610 "vb vdeblock (2 threshold) vertical deblocking filter\n" 611 "ha hadeblock (2 threshold) horizontal deblocking filter\n" 612 "va vadeblock (2 threshold) vertical deblocking filter\n" 613 "h1 x1hdeblock experimental h deblock filter 1\n" 614 "v1 x1vdeblock experimental v deblock filter 1\n" 615 "dr dering deringing filter\n" 616 "al autolevels automatic brightness / contrast\n" 617 " f fullyrange stretch luminance to (0..255)\n" 618 "lb linblenddeint linear blend deinterlacer\n" 619 "li linipoldeint linear interpolating deinterlace\n" 620 "ci cubicipoldeint cubic interpolating deinterlacer\n" 621 "md mediandeint median deinterlacer\n" 622 "fd ffmpegdeint ffmpeg deinterlacer\n" 623 "l5 lowpass5 FIR lowpass deinterlacer\n" 624 "de default hb:a,vb:a,dr:a\n" 625 "fa fast h1:a,v1:a,dr:a\n" 626 "ac ha:a:128:7,va:a,dr:a\n" 627 "tn tmpnoise (3 threshold) temporal noise reducer\n" 628 " 1. <= 2. <= 3. larger -> stronger filtering\n" 629 "fq forceQuant <quantizer> force quantizer\n" 631 "<filterName>[:<option>[:<option>...]][[,|/][-]<filterName>[:<option>...]]...\n" 632 "long form example:\n" 633 "vdeblock:autoq/hdeblock:autoq/linblenddeint default,-vdeblock\n" 634 "short form example:\n" 635 "vb:a/hb:a/lb de,-vb\n" 645 static const char filterDelimiters[] =
",/";
646 static const char optionDelimiters[] =
":|";
655 if (!strcmp(name,
"help")) {
657 for (p =
pp_help; strchr(p,
'\n'); p = strchr(p,
'\n') + 1) {
686 const char *filterName;
694 int numOfUnknownOptions=0;
698 filterToken=
av_strtok(p, filterDelimiters, &tokstate);
699 if(!filterToken)
break;
700 p+= strlen(filterToken) + 1;
701 filterName=
av_strtok(filterToken, optionDelimiters, &tokstate);
708 if(*filterName ==
'-'){
718 if(!strcmp(
"autoq", option) || !strcmp(
"a", option)) q=
quality;
719 else if(!strcmp(
"nochrom", option) || !strcmp(
"y", option)) chrom=0;
720 else if(!strcmp(
"chrom", option) || !strcmp(
"c", option)) chrom=1;
721 else if(!strcmp(
"noluma", option) || !strcmp(
"n", option)) luma=0;
723 options[numOfUnknownOptions] =
option;
724 numOfUnknownOptions++;
728 options[numOfUnknownOptions] =
NULL;
740 spaceLeft= p - temp + plen;
745 memmove(p + newlen, p, plen+1);
752 if( !strcmp(filters[i].longName, filterName)
753 || !strcmp(filters[i].shortName, filterName)){
760 if(q >= filters[i].minLumQuality && luma)
762 if(chrom==1 || (chrom==-1 && filters[i].chromDefault))
763 if(q >= filters[i].minChromQuality)
770 for(o=0; options[o]; o++){
771 if( !strcmp(options[o],
"fullyrange")
772 ||!strcmp(options[o],
"f")){
775 numOfUnknownOptions--;
784 for(o=0; options[o]; o++){
787 strtol(options[o], &tail, 0);
788 if(tail!=options[o]){
790 numOfUnknownOptions--;
791 if(numOfNoises >= 3)
break;
799 for(o=0; options[o] && o<2; o++){
801 int val= strtol(options[o], &tail, 0);
802 if(tail==options[o])
break;
804 numOfUnknownOptions--;
813 for(o=0; options[o] && o<1; o++){
815 int val= strtol(options[o], &tail, 0);
816 if(tail==options[o])
break;
818 numOfUnknownOptions--;
824 if(!filterNameOk) ppMode->
error++;
825 ppMode->
error += numOfUnknownOptions;
847 int mbWidth = (width+15)>>4;
848 int mbHeight= (height+15)>>4;
882 int qpStride= (width+15)/16 + 2;
936 uint8_t * dst[3],
const int dstStride[3],
938 const int8_t *QP_store,
int QPStride,
939 pp_mode *vm,
void *vc,
int pict_type)
941 int mbWidth = (width+15)>>4;
942 int mbHeight= (height+15)>>4;
946 int absQPStride =
FFABS(QPStride);
957 absQPStride = QPStride = 0;
966 const int count=
FFMAX(mbHeight * absQPStride, mbWidth);
967 for(i=0; i<(count>>2); i++){
970 for(i<<=2; i<
count; i++){
974 QPStride= absQPStride;
979 for(y=0; y<mbHeight; y++){
980 for(x=0; x<mbWidth; x++){
988 if((pict_type&7)!=3){
991 const int count=
FFMAX(mbHeight * QPStride, mbWidth);
992 for(i=0; i<(count>>2); i++){
995 for(i<<=2; i<
count; i++){
1000 for(i=0; i<mbHeight; i++) {
1001 for(j=0; j<absQPStride; j++) {
1002 c->
nonBQPTable[i*absQPStride+j] = QP_store[i*QPStride+j] & 0x3F;
1011 postProcess(src[0], srcStride[0], dst[0], dstStride[0],
1012 width, height, QP_store, QPStride, 0, mode, c);
1014 if (!(src[1] && src[2] && dst[1] && dst[2]))
1021 postProcess(src[1], srcStride[1], dst[1], dstStride[1],
1022 width, height, QP_store, QPStride, 1, mode, c);
1023 postProcess(src[2], srcStride[2], dst[2], dstStride[2],
1024 width, height, QP_store, QPStride, 2, mode, c);
1026 else if(srcStride[1] == dstStride[1] && srcStride[2] == dstStride[2]){
1027 linecpy(dst[1], src[1], height, srcStride[1]);
1028 linecpy(dst[2], src[2], height, srcStride[2]);
1032 memcpy(&(dst[1][y*dstStride[1]]), &(src[1][y*srcStride[1]]), width);
1033 memcpy(&(dst[2][y*dstStride[2]]), &(src[2][y*srcStride[2]]), width);
static av_always_inline void do_a_deblock_C(uint8_t *src, int step, int stride, const PPContext *c, int mode)
accurate deblock filter
#define AV_CPU_FLAG_ALTIVEC
standard
static const char *const replaceTable[]
int maxTmpNoise[3]
for Temporal Noise Reducing filter (Maximal sum of abs differences)
const AVClass * av_class
info on struct for av_log
int chromMode
activates filters for chrominance
uint8_t * tempDst
Temporary buffers for handling the last row(s)
av_cold void pp_free_context(void *vc)
static void doHorizDefFilter_C(uint8_t dst[], int stride, const PPContext *c)
pp_mode * pp_get_mode_by_name_and_quality(const char *name, int quality)
Return a pp_mode or NULL if an error occurred.
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Convenience header that includes libavutil's core.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
av_cold pp_context * pp_get_context(int width, int height, int cpuCaps)
#define LINEAR_BLEND_DEINT_FILTER
mmx/mmx2/3dnow postprocess code.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
void pp_postprocess(const uint8_t *src[3], const int srcStride[3], uint8_t *dst[3], const int dstStride[3], int width, int height, const int8_t *QP_store, int QPStride, pp_mode *vm, void *vc, int pict_type)
unsigned postproc_version(void)
Return the LIBPOSTPROC_VERSION_INT constant.
static int isVertMinMaxOk_C(const uint8_t src[], int stride, int QP)
int minAllowedY
for brightness correction
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
int qpStride
size of qp buffers (needed to realloc them if needed)
uint64_t * yHistogram
luma histogram.
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But first
#define AV_CPU_FLAG_MMXEXT
SSE integer functions or AMD MMX ext.
static int horizClassify_C(const uint8_t src[], int stride, const PPContext *c)
static int isHorizDC_C(const uint8_t src[], int stride, const PPContext *c)
Check if the given 8x8 Block is mostly "flat".
static int vertClassify_C(const uint8_t src[], int stride, const PPContext *c)
#define LOWPASS5_DEINT_FILTER
static void horizX1Filter(uint8_t *src, int stride, int QP)
Experimental Filter 1 (Horizontal) will not damage linear gradients Flat blocks should look like they...
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static const uint16_t mask[17]
const char * postproc_license(void)
Return the libpostproc license.
const char pp_help[]
a simple help text
int error
non zero on error
static void linecpy(void *dest, const void *src, int lines, int stride)
#define MEDIAN_DEINT_FILTER
#define CUBIC_IPOL_DEINT_FILTER
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
simple assert() macros that are a bit more flexible than ISO C assert().
uint8_t * tempBlurred[3]
Temporal noise reducing buffers.
int forcedQuant
quantizer if FORCE_QUANT is used
#define PP_CPU_CAPS_ALTIVEC
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
static int isVertDC_C(const uint8_t src[], int stride, const PPContext *c)
Check if the middle 8x8 Block in the given 8x16 block is flat.
#define PP_PICT_TYPE_QP2
MPEG2 style QScale.
#define LINEAR_IPOL_DEINT_FILTER
int maxAllowedY
for brightness correction
static void reallocAlign(void **p, int size)
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
const char postproc_ffversion[]
void pp_free_mode(pp_mode *mode)
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about quality
#define FFMPEG_DEINT_FILTER
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static const AVClass av_codec_context_class
#define FF_ARRAY_ELEMS(a)
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s your new playground is ready Some little details about what s going which in turn will define variables for the build system and the C
int lumMode
activates filters for luminance
static void reallocBuffers(PPContext *c, int width, int height, int stride, int qpStride)
#define AV_CPU_FLAG_3DNOW
AMD 3DNOW.
#define AV_LOG_INFO
Standard information.
#define AV_CPU_FLAG_MMX
standard MMX
int8_t * stdQPTable
used to fix MPEG2 style qscale
uint8_t * tempBlocks
used for the horizontal code
Describe the class of an AVClass context structure.
Rational number (pair of numerator and denominator).
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
AVRational maxClippedThreshold
amount of "black" you are willing to lose to get a brightness-corrected picture
Contains misc utility macros and inline functions.
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok()...
int32_t * tempBlurredPast[3]
GLint GLenum GLboolean GLsizei stride
const OptionDef options[]
static void postProcess(const uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, const int8_t QPs[], int QPStride, int isColor, pp_mode *vm, pp_context *vc)
const char * postproc_configuration(void)
Return the libpostproc build-time configuration.
static int isHorizMinMaxOk_C(const uint8_t src[], int stride, int QP)
#define LIBPOSTPROC_VERSION_INT
#define TEMP_NOISE_FILTER
DECLARE_ASM_CONST(8, int, deringThreshold)
int mask
Bitmask to turn this filter on.
static const struct PPFilter filters[]
static const char * context_to_name(void *ptr)
#define AV_CPU_FLAG_SSE2
PIV SSE2 functions.
static void doHorizLowPass_C(uint8_t dst[], int stride, const PPContext *c)
Do a horizontal low pass filter on the 10x8 block (dst points to middle 8x8 Block) using the 9-Tap Fi...
#define OPTIONS_ARRAY_SIZE
#define LEVEL_FIX
Brightness & Contrast.
static double val(void *priv, double ch)
mode
Use these values in ebur128_init (or'ed).
void(* pp_fn)(const uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, const int8_t QPs[], int QPStride, int isColor, PPContext *c2)
#define LIBPOSTPROC_VERSION_MICRO
int stride
size of some buffers (needed to realloc them if needed)
#define PP_CPU_CAPS_3DNOW
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
#define GET_MODE_BUFFER_SIZE