93 #define GET_MODE_BUFFER_SIZE 500
94 #define OPTIONS_ARRAY_SIZE 10
99 #if ARCH_X86 && HAVE_INLINE_ASM
123 {
"dr",
"dering", 1, 5, 6,
DERING},
124 {
"al",
"autolevels", 0, 1, 2,
LEVEL_FIX},
133 {
"be",
"bitexact", 1, 0, 0,
BITEXACT},
140 "default",
"hb:a,vb:a,dr:a",
141 "de",
"hb:a,vb:a,dr:a",
142 "fast",
"h1:a,v1:a,dr:a",
143 "fa",
"h1:a,v1:a,dr:a",
144 "ac",
"ha:a:128:7,va:a,dr:a",
158 const int dcOffset= ((
c->nonBQP*
c->ppMode.baseDcDiff)>>8) + 1;
159 const int dcThreshold= dcOffset*2 + 1;
162 numEq += ((unsigned)(
src[0] -
src[1] + dcOffset)) < dcThreshold;
163 numEq += ((unsigned)(
src[1] -
src[2] + dcOffset)) < dcThreshold;
164 numEq += ((unsigned)(
src[2] -
src[3] + dcOffset)) < dcThreshold;
165 numEq += ((unsigned)(
src[3] -
src[4] + dcOffset)) < dcThreshold;
166 numEq += ((unsigned)(
src[4] -
src[5] + dcOffset)) < dcThreshold;
167 numEq += ((unsigned)(
src[5] -
src[6] + dcOffset)) < dcThreshold;
168 numEq += ((unsigned)(
src[6] -
src[7] + dcOffset)) < dcThreshold;
171 return numEq >
c->ppMode.flatnessThreshold;
181 const int dcOffset= ((
c->nonBQP*
c->ppMode.baseDcDiff)>>8) + 1;
182 const int dcThreshold= dcOffset*2 + 1;
186 numEq += ((unsigned)(
src[0] -
src[0+
stride] + dcOffset)) < dcThreshold;
187 numEq += ((unsigned)(
src[1] -
src[1+
stride] + dcOffset)) < dcThreshold;
188 numEq += ((unsigned)(
src[2] -
src[2+
stride] + dcOffset)) < dcThreshold;
189 numEq += ((unsigned)(
src[3] -
src[3+
stride] + dcOffset)) < dcThreshold;
190 numEq += ((unsigned)(
src[4] -
src[4+
stride] + dcOffset)) < dcThreshold;
191 numEq += ((unsigned)(
src[5] -
src[5+
stride] + dcOffset)) < dcThreshold;
192 numEq += ((unsigned)(
src[6] -
src[6+
stride] + dcOffset)) < dcThreshold;
193 numEq += ((unsigned)(
src[7] -
src[7+
stride] + dcOffset)) < dcThreshold;
196 return numEq >
c->ppMode.flatnessThreshold;
203 if((
unsigned)(
src[0] -
src[5] + 2*
QP) > 4*
QP)
return 0;
205 if((
unsigned)(
src[2] -
src[7] + 2*
QP) > 4*
QP)
return 0;
207 if((
unsigned)(
src[4] -
src[1] + 2*
QP) > 4*
QP)
return 0;
209 if((
unsigned)(
src[6] -
src[3] + 2*
QP) > 4*
QP)
return 0;
250 const int middleEnergy= 5*(dst[4] - dst[3]) + 2*(dst[2] - dst[5]);
252 if(
FFABS(middleEnergy) < 8*
c->QP){
253 const int q=(dst[3] - dst[4])/2;
254 const int leftEnergy= 5*(dst[2] - dst[1]) + 2*(dst[0] - dst[3]);
255 const int rightEnergy= 5*(dst[6] - dst[5]) + 2*(dst[4] - dst[7]);
289 const int first=
FFABS(dst[-1] - dst[0]) <
c->QP ? dst[-1] : dst[0];
290 const int last=
FFABS(dst[8] - dst[7]) <
c->QP ? dst[8] : dst[7];
293 sums[0] = 4*
first + dst[0] + dst[1] + dst[2] + 4;
294 sums[1] = sums[0] -
first + dst[3];
295 sums[2] = sums[1] -
first + dst[4];
296 sums[3] = sums[2] -
first + dst[5];
297 sums[4] = sums[3] -
first + dst[6];
298 sums[5] = sums[4] - dst[0] + dst[7];
299 sums[6] = sums[5] - dst[1] + last;
300 sums[7] = sums[6] - dst[2] + last;
301 sums[8] = sums[7] - dst[3] + last;
302 sums[9] = sums[8] - dst[4] + last;
304 dst[0]= (sums[0] + sums[2] + 2*dst[0])>>4;
305 dst[1]= (sums[1] + sums[3] + 2*dst[1])>>4;
306 dst[2]= (sums[2] + sums[4] + 2*dst[2])>>4;
307 dst[3]= (sums[3] + sums[5] + 2*dst[3])>>4;
308 dst[4]= (sums[4] + sums[6] + 2*dst[4])>>4;
309 dst[5]= (sums[5] + sums[7] + 2*dst[5])>>4;
310 dst[6]= (sums[6] + sums[8] + 2*dst[6])>>4;
311 dst[7]= (sums[7] + sums[9] + 2*dst[7])>>4;
328 static uint64_t lut[256];
334 int v=
i < 128 ? 2*
i : 2*(
i-256);
343 uint64_t
a= (v/16) & 0xFF;
344 uint64_t
b= (v*3/16) & 0xFF;
345 uint64_t
c= (v*5/16) & 0xFF;
346 uint64_t
d= (7*v/16) & 0xFF;
347 uint64_t
A= (0x100 -
a)&0xFF;
348 uint64_t
B= (0x100 -
b)&0xFF;
349 uint64_t
C= (0x100 -
c)&0xFF;
350 uint64_t
D= (0x100 -
c)&0xFF;
352 lut[
i] = (
a<<56) | (
b<<48) | (
c<<40) | (
d<<32) |
353 (
D<<24) | (
C<<16) | (
B<<8) | (
A);
387 const int dcOffset= ((
c->nonBQP*
c->ppMode.baseDcDiff)>>8) + 1;
388 const int dcThreshold= dcOffset*2 + 1;
394 numEq += ((unsigned)(
src[-1*
step] -
src[0*
step] + dcOffset)) < dcThreshold;
395 numEq += ((unsigned)(
src[ 0*
step] -
src[1*
step] + dcOffset)) < dcThreshold;
396 numEq += ((unsigned)(
src[ 1*
step] -
src[2*
step] + dcOffset)) < dcThreshold;
397 numEq += ((unsigned)(
src[ 2*
step] -
src[3*
step] + dcOffset)) < dcThreshold;
398 numEq += ((unsigned)(
src[ 3*
step] -
src[4*
step] + dcOffset)) < dcThreshold;
399 numEq += ((unsigned)(
src[ 4*
step] -
src[5*
step] + dcOffset)) < dcThreshold;
400 numEq += ((unsigned)(
src[ 5*
step] -
src[6*
step] + dcOffset)) < dcThreshold;
401 numEq += ((unsigned)(
src[ 6*
step] -
src[7*
step] + dcOffset)) < dcThreshold;
402 numEq += ((unsigned)(
src[ 7*
step] -
src[8*
step] + dcOffset)) < dcThreshold;
403 if(numEq >
c->ppMode.flatnessThreshold){
433 sums[6] = sums[5] -
src[1*
step] + last;
434 sums[7] = sums[6] -
src[2*
step] + last;
435 sums[8] = sums[7] -
src[3*
step] + last;
436 sums[9] = sums[8] -
src[4*
step] + last;
460 if(
FFABS(middleEnergy) < 8*
QP){
480 d= (
d < 0) ? 32 : -32;
498 #define TEMPLATE_PP_C 1
502 # define TEMPLATE_PP_ALTIVEC 1
507 #if ARCH_X86 && HAVE_INLINE_ASM
508 # if CONFIG_RUNTIME_CPUDETECT
509 # define TEMPLATE_PP_SSE2 1
512 # if HAVE_SSE2_INLINE
513 # define TEMPLATE_PP_SSE2 1
519 typedef void (*
pp_fn)(
const uint8_t
src[],
int srcStride, uint8_t dst[],
int dstStride,
int width,
int height,
520 const int8_t QPs[],
int QPStride,
int isColor,
PPContext *
c2);
525 pp_fn pp = postProcess_C;
531 #if CONFIG_RUNTIME_CPUDETECT
532 #if ARCH_X86 && HAVE_INLINE_ASM
540 pp = postProcess_SSE2;
542 pp = postProcess_altivec;
547 pp(
src, srcStride, dst, dstStride,
width,
height, QPs, QPStride, isColor,
c);
553 "Available postprocessing filters:\n"
555 "short long name short long option Description\n"
556 "* * a autoq CPU power dependent enabler\n"
557 " c chrom chrominance filtering enabled\n"
558 " y nochrom chrominance filtering disabled\n"
559 " n noluma luma filtering disabled\n"
560 "hb hdeblock (2 threshold) horizontal deblocking filter\n"
561 " 1. difference factor: default=32, higher -> more deblocking\n"
562 " 2. flatness threshold: default=39, lower -> more deblocking\n"
563 " the h & v deblocking filters share these\n"
564 " so you can't set different thresholds for h / v\n"
565 "vb vdeblock (2 threshold) vertical deblocking filter\n"
566 "ha hadeblock (2 threshold) horizontal deblocking filter\n"
567 "va vadeblock (2 threshold) vertical deblocking filter\n"
568 "h1 x1hdeblock experimental h deblock filter 1\n"
569 "v1 x1vdeblock experimental v deblock filter 1\n"
570 "dr dering deringing filter\n"
571 "al autolevels automatic brightness / contrast\n"
572 " f fullyrange stretch luminance to (0..255)\n"
573 "lb linblenddeint linear blend deinterlacer\n"
574 "li linipoldeint linear interpolating deinterlace\n"
575 "ci cubicipoldeint cubic interpolating deinterlacer\n"
576 "md mediandeint median deinterlacer\n"
577 "fd ffmpegdeint ffmpeg deinterlacer\n"
578 "l5 lowpass5 FIR lowpass deinterlacer\n"
579 "de default hb:a,vb:a,dr:a\n"
580 "fa fast h1:a,v1:a,dr:a\n"
581 "ac ha:a:128:7,va:a,dr:a\n"
582 "tn tmpnoise (3 threshold) temporal noise reducer\n"
583 " 1. <= 2. <= 3. larger -> stronger filtering\n"
584 "fq forceQuant <quantizer> force quantizer\n"
586 "<filterName>[:<option>[:<option>...]][[,|/][-]<filterName>[:<option>...]]...\n"
587 "long form example:\n"
588 "vdeblock:autoq/hdeblock:autoq/linblenddeint default,-vdeblock\n"
589 "short form example:\n"
590 "vb:a/hb:a/lb de,-vb\n"
600 static const char filterDelimiters[] =
",/";
601 static const char optionDelimiters[] =
":|";
610 if (!strcmp(
name,
"help")) {
612 for (p =
pp_help; strchr(p,
'\n'); p = strchr(p,
'\n') + 1) {
641 const char *filterName;
649 int numOfUnknownOptions=0;
653 filterToken=
av_strtok(p, filterDelimiters, &tokstate);
654 if(!filterToken)
break;
655 p+= strlen(filterToken) + 1;
656 filterName=
av_strtok(filterToken, optionDelimiters, &tokstate);
663 if(*filterName ==
'-'){
674 else if(!strcmp(
"nochrom",
option) || !strcmp(
"y",
option)) chrom=0;
675 else if(!strcmp(
"chrom",
option) || !strcmp(
"c",
option)) chrom=1;
676 else if(!strcmp(
"noluma",
option) || !strcmp(
"n",
option)) luma=0;
679 numOfUnknownOptions++;
695 spaceLeft= p -
temp + plen;
700 memmove(p + newlen, p, plen+1);
707 if( !strcmp(
filters[
i].longName, filterName)
708 || !strcmp(
filters[
i].shortName, filterName)){
715 if(q >=
filters[
i].minLumQuality && luma)
717 if(chrom==1 || (chrom==-1 &&
filters[
i].chromDefault))
726 if( !strcmp(
options[o],
"fullyrange")
730 numOfUnknownOptions--;
745 numOfUnknownOptions--;
746 if(numOfNoises >= 3)
break;
754 for(o=0;
options[o] && o<2; o++){
759 numOfUnknownOptions--;
768 for(o=0;
options[o] && o<1; o++){
773 numOfUnknownOptions--;
779 if(!filterNameOk) ppMode->
error++;
780 ppMode->
error += numOfUnknownOptions;
802 int mbWidth = (
width+15)>>4;
803 int mbHeight= (
height+15)>>4;
807 c->qpStride= qpStride;
823 reallocAlign((
void **)&
c->nonBQPTable, qpStride*mbHeight*
sizeof(int8_t));
824 reallocAlign((
void **)&
c->stdQPTable, qpStride*mbHeight*
sizeof(int8_t));
825 reallocAlign((
void **)&
c->forcedQPTable, mbWidth*
sizeof(int8_t));
837 int qpStride= (
width+15)/16 + 2;
844 c->hChromaSubSample= cpuCaps&0x3;
845 c->vChromaSubSample= (cpuCaps>>4)&0x3;
847 c->hChromaSubSample= 1;
848 c->vChromaSubSample= 1;
888 uint8_t * dst[3],
const int dstStride[3],
890 const int8_t *QP_store,
int QPStride,
891 pp_mode *vm,
void *vc,
int pict_type)
893 int mbWidth = (
width+15)>>4;
894 int mbHeight= (
height+15)>>4;
898 int absQPStride =
FFABS(QPStride);
901 if(
c->stride < minStride ||
c->qpStride < absQPStride)
903 FFMAX(minStride,
c->stride),
904 FFMAX(
c->qpStride, absQPStride));
908 QP_store=
c->forcedQPTable;
909 absQPStride = QPStride = 0;
911 for(
i=0;
i<mbWidth;
i++)
c->forcedQPTable[
i]=
mode->forcedQuant;
913 for(
i=0;
i<mbWidth;
i++)
c->forcedQPTable[
i]= 1;
918 const int count=
FFMAX(mbHeight * absQPStride, mbWidth);
919 for(
i=0;
i<(count>>2);
i++){
922 for(
i<<=2;
i<count;
i++){
923 c->stdQPTable[
i] = QP_store[
i]>>1;
925 QP_store=
c->stdQPTable;
926 QPStride= absQPStride;
931 for(y=0; y<mbHeight; y++){
932 for(x=0; x<mbWidth; x++){
940 if((pict_type&7)!=3){
943 const int count=
FFMAX(mbHeight * QPStride, mbWidth);
944 for(
i=0;
i<(count>>2);
i++){
947 for(
i<<=2;
i<count;
i++){
948 c->nonBQPTable[
i] = QP_store[
i] & 0x3F;
952 for(
i=0;
i<mbHeight;
i++) {
953 for(j=0; j<absQPStride; j++) {
954 c->nonBQPTable[
i*absQPStride+j] = QP_store[
i*QPStride+j] & 0x3F;
966 if (!(
src[1] &&
src[2] && dst[1] && dst[2]))
978 else if(srcStride[1] == dstStride[1] && srcStride[2] == dstStride[2]){
984 memcpy(&(dst[1][y*dstStride[1]]), &(
src[1][y*srcStride[1]]),
width);
985 memcpy(&(dst[2][y*dstStride[2]]), &(
src[2][y*srcStride[2]]),
width);