Mercurial > libavcodec.hg
comparison libpostproc/postprocess.c @ 793:8e9faf69110f libavcodec
cleanup
| author | michael |
|---|---|
| date | Tue, 29 Oct 2002 20:12:24 +0000 |
| parents | 2d1283d511b7 |
| children | 50ae708fc721 |
comparison
equal
deleted
inserted
replaced
| 792:2d1283d511b7 | 793:8e9faf69110f |
|---|---|
| 45 c = checked against the other implementations (-vo md5) | 45 c = checked against the other implementations (-vo md5) |
| 46 */ | 46 */ |
| 47 | 47 |
| 48 /* | 48 /* |
| 49 TODO: | 49 TODO: |
| 50 remove global/static vars | |
| 51 reduce the time wasted on the mem transfer | 50 reduce the time wasted on the mem transfer |
| 52 unroll stuff if instructions depend too much on the prior one | 51 unroll stuff if instructions depend too much on the prior one |
| 53 we use 8x8 blocks for the horizontal filters, opendivx seems to use 8x4? | |
| 54 move YScale thing to the end instead of fixing QP | 52 move YScale thing to the end instead of fixing QP |
| 55 write a faster and higher quality deblocking filter :) | 53 write a faster and higher quality deblocking filter :) |
| 56 make the mainloop more flexible (variable number of blocks at once | 54 make the mainloop more flexible (variable number of blocks at once |
| 57 (the if/else stuff per block is slowing things down) | 55 (the if/else stuff per block is slowing things down) |
| 58 compare the quality & speed of all filters | 56 compare the quality & speed of all filters |
| 67 #include "../config.h" | 65 #include "../config.h" |
| 68 #include <inttypes.h> | 66 #include <inttypes.h> |
| 69 #include <stdio.h> | 67 #include <stdio.h> |
| 70 #include <stdlib.h> | 68 #include <stdlib.h> |
| 71 #include <string.h> | 69 #include <string.h> |
| 72 #include <errno.h> | |
| 73 #ifdef HAVE_MALLOC_H | 70 #ifdef HAVE_MALLOC_H |
| 74 #include <malloc.h> | 71 #include <malloc.h> |
| 75 #endif | 72 #endif |
| 76 //#undef HAVE_MMX2 | 73 //#undef HAVE_MMX2 |
| 77 //#define HAVE_3DNOW | 74 //#define HAVE_3DNOW |
| 102 static uint64_t __attribute__((aligned(8))) b02= 0x0202020202020202LL; | 99 static uint64_t __attribute__((aligned(8))) b02= 0x0202020202020202LL; |
| 103 static uint64_t __attribute__((aligned(8))) b08= 0x0808080808080808LL; | 100 static uint64_t __attribute__((aligned(8))) b08= 0x0808080808080808LL; |
| 104 static uint64_t __attribute__((aligned(8))) b80= 0x8080808080808080LL; | 101 static uint64_t __attribute__((aligned(8))) b80= 0x8080808080808080LL; |
| 105 #endif | 102 #endif |
| 106 | 103 |
| 107 extern int divx_quality; | 104 static int verbose= 0; |
| 108 static int firstTime2 = 0; | 105 |
| 109 | 106 static const int deringThreshold= 20; |
| 110 extern int verbose; | |
| 111 | |
| 112 int deringThreshold= 20; | |
| 113 | |
| 114 //amount of "black" u r willing to loose to get a brightness corrected picture | |
| 115 double maxClippedThreshold= 0.01; | |
| 116 | 107 |
| 117 struct PPFilter{ | 108 struct PPFilter{ |
| 118 char *shortName; | 109 char *shortName; |
| 119 char *longName; | 110 char *longName; |
| 120 int chromDefault; // is chrominance filtering on by default if this filter is manually activated | 111 int chromDefault; // is chrominance filtering on by default if this filter is manually activated |
| 591 { | 582 { |
| 592 char temp[GET_MODE_BUFFER_SIZE]; | 583 char temp[GET_MODE_BUFFER_SIZE]; |
| 593 char *p= temp; | 584 char *p= temp; |
| 594 char *filterDelimiters= ",/"; | 585 char *filterDelimiters= ",/"; |
| 595 char *optionDelimiters= ":"; | 586 char *optionDelimiters= ":"; |
| 596 struct PPMode ppMode= {0,0,0,0,0,{150,200,400}}; | 587 struct PPMode ppMode; |
| 597 char *filterToken; | 588 char *filterToken; |
| 598 | 589 |
| 590 ppMode.lumMode= 0; | |
| 591 ppMode.chromMode= 0; | |
| 592 ppMode.maxTmpNoise[0]= 700; | |
| 593 ppMode.maxTmpNoise[1]= 1500; | |
| 594 ppMode.maxTmpNoise[2]= 3000; | |
| 595 ppMode.maxAllowedY= 234; | |
| 596 ppMode.minAllowedY= 16; | |
| 597 ppMode.baseDcDiff= 256/4; | |
| 598 ppMode.flatnessThreshold=40; | |
| 599 ppMode.flatnessThreshold= 56-16; | 599 ppMode.flatnessThreshold= 56-16; |
| 600 | 600 ppMode.maxClippedThreshold= 0.01; |
| 601 | |
| 601 strncpy(temp, name, GET_MODE_BUFFER_SIZE); | 602 strncpy(temp, name, GET_MODE_BUFFER_SIZE); |
| 602 | 603 |
| 603 if(verbose>1) printf("pp: %s\n", name); | 604 if(verbose>1) printf("pp: %s\n", name); |
| 604 | 605 |
| 605 for(;;){ | 606 for(;;){ |
| 703 } | 704 } |
| 704 else if(filters[i].mask == TEMP_NOISE_FILTER) | 705 else if(filters[i].mask == TEMP_NOISE_FILTER) |
| 705 { | 706 { |
| 706 int o; | 707 int o; |
| 707 int numOfNoises=0; | 708 int numOfNoises=0; |
| 708 ppMode.maxTmpNoise[0]= 150; | |
| 709 ppMode.maxTmpNoise[1]= 200; | |
| 710 ppMode.maxTmpNoise[2]= 400; | |
| 711 | 709 |
| 712 for(o=0; options[o]!=NULL; o++) | 710 for(o=0; options[o]!=NULL; o++) |
| 713 { | 711 { |
| 714 char *tail; | 712 char *tail; |
| 715 ppMode.maxTmpNoise[numOfNoises]= | 713 ppMode.maxTmpNoise[numOfNoises]= |
| 723 } | 721 } |
| 724 } | 722 } |
| 725 else if(filters[i].mask == V_DEBLOCK || filters[i].mask == H_DEBLOCK) | 723 else if(filters[i].mask == V_DEBLOCK || filters[i].mask == H_DEBLOCK) |
| 726 { | 724 { |
| 727 int o; | 725 int o; |
| 728 ppMode.baseDcDiff=256/4; | |
| 729 // hFlatnessThreshold= 40; | |
| 730 // vFlatnessThreshold= 40; | |
| 731 | 726 |
| 732 for(o=0; options[o]!=NULL && o<2; o++) | 727 for(o=0; options[o]!=NULL && o<2; o++) |
| 733 { | 728 { |
| 734 char *tail; | 729 char *tail; |
| 735 int val= strtol(options[o], &tail, 0); | 730 int val= strtol(options[o], &tail, 0); |
| 816 free(c->nonBQPTable); | 811 free(c->nonBQPTable); |
| 817 | 812 |
| 818 free(c); | 813 free(c); |
| 819 } | 814 } |
| 820 | 815 |
| 821 //FIXME move this shit away from here | |
| 822 int readPPOpt(void *conf, char *arg) | |
| 823 { | |
| 824 int val; | |
| 825 | |
| 826 if(arg == NULL) | |
| 827 return -2; // ERR_MISSING_PARAM | |
| 828 errno = 0; | |
| 829 val = (int)strtol(arg,NULL,0); | |
| 830 if(errno != 0) | |
| 831 return -4; // What about include cfgparser.h and use ERR_* defines */ | |
| 832 if(val < 0) | |
| 833 return -3; // ERR_OUT_OF_RANGE | |
| 834 | |
| 835 divx_quality = val; | |
| 836 firstTime2 = 1; | |
| 837 | |
| 838 return 1; | |
| 839 } | |
| 840 | |
| 841 void revertPPOpt(void *conf, char* opt) | |
| 842 { | |
| 843 divx_quality=0; | |
| 844 } | |
| 845 | |
| 846 | |
| 847 void pp_postprocess(uint8_t * src[3], int srcStride[3], | 816 void pp_postprocess(uint8_t * src[3], int srcStride[3], |
| 848 uint8_t * dst[3], int dstStride[3], | 817 uint8_t * dst[3], int dstStride[3], |
| 849 int width, int height, | 818 int width, int height, |
| 850 QP_STORE_T *QP_store, int QPStride, | 819 QP_STORE_T *QP_store, int QPStride, |
| 851 PPMode *mode, void *vc, int pict_type) | 820 PPMode *mode, void *vc, int pict_type) |
| 887 c->nonBQPTable[y*mbWidth + x]= qscale; | 856 c->nonBQPTable[y*mbWidth + x]= qscale; |
| 888 } | 857 } |
| 889 } | 858 } |
| 890 } | 859 } |
| 891 | 860 |
| 892 if(firstTime2 && verbose) | 861 if(verbose>2) |
| 893 { | 862 { |
| 894 printf("using npp filters 0x%X/0x%X\n", mode->lumMode, mode->chromMode); | 863 printf("using npp filters 0x%X/0x%X\n", mode->lumMode, mode->chromMode); |
| 895 firstTime2=0; | |
| 896 } | 864 } |
| 897 | 865 |
| 898 postProcess(src[0], srcStride[0], dst[0], dstStride[0], | 866 postProcess(src[0], srcStride[0], dst[0], dstStride[0], |
| 899 width, height, QP_store, QPStride, 0, mode, c); | 867 width, height, QP_store, QPStride, 0, mode, c); |
| 900 | 868 |
