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);