- getModeForQuality -> getPpModeForQuality renamed - #define POSTPROCESS_H -> NEWPOSTPROCESS_H (to avoid conflicts) - added #ifdef'ed code for calling old postprocess (for testing/comparison) - #ifdef'ed some asm code to allow compilation on non-x86 platforms (untested) Originally committed as revision 2186 to svn://svn.mplayerhq.hu/mplayer/trunk/postproctags/v0.5
| @@ -137,7 +137,7 @@ int maxAllowedY=255; | |||||
| //FIXME can never make a movie´s black brighter (anyone needs that?) | //FIXME can never make a movie´s black brighter (anyone needs that?) | ||||
| int minAllowedY=0; | int minAllowedY=0; | ||||
| #ifdef TIMEING | |||||
| static inline long long rdtsc() | static inline long long rdtsc() | ||||
| { | { | ||||
| long long l; | long long l; | ||||
| @@ -147,7 +147,9 @@ static inline long long rdtsc() | |||||
| // printf("%d\n", int(l/1000)); | // printf("%d\n", int(l/1000)); | ||||
| return l; | return l; | ||||
| } | } | ||||
| #endif | |||||
| #ifdef HAVE_MMX2 | |||||
| static inline void prefetchnta(void *p) | static inline void prefetchnta(void *p) | ||||
| { | { | ||||
| asm volatile( "prefetchnta (%0)\n\t" | asm volatile( "prefetchnta (%0)\n\t" | ||||
| @@ -175,6 +177,7 @@ static inline void prefetcht2(void *p) | |||||
| : : "r" (p) | : : "r" (p) | ||||
| ); | ); | ||||
| } | } | ||||
| #endif | |||||
| //FIXME? |255-0| = 1 (shouldnt be a problem ...) | //FIXME? |255-0| = 1 (shouldnt be a problem ...) | ||||
| /** | /** | ||||
| @@ -1814,8 +1817,13 @@ FIND_MIN_MAX(%%ebx, %1, 2) | |||||
| #endif | #endif | ||||
| } | } | ||||
| #ifdef HAVE_ODIVX_POSTPROCESS | |||||
| #include "../opendivx/postprocess.h" | |||||
| int use_old_pp=0; | |||||
| #endif | |||||
| static void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, | |||||
| QP_STORE_T QPs[], int QPStride, int isColor, int mode); | |||||
| /** | /** | ||||
| * ... | * ... | ||||
| @@ -1830,7 +1838,17 @@ void postprocess(unsigned char * src[], int src_stride, | |||||
| int mode) | int mode) | ||||
| { | { | ||||
| if(mode<0) mode= getModeForQuality(-mode); | |||||
| #ifdef HAVE_ODIVX_POSTPROCESS | |||||
| // Note: I could make this shit outside of this file, but it would mean one | |||||
| // more function call... | |||||
| if(use_old_pp){ | |||||
| odivx_postprocess(src,src_stride,dst,dst_stride,horizontal_size,vertical_size,QP_store,QP_stride,mode); | |||||
| return; | |||||
| } | |||||
| #endif | |||||
| // I'm calling this from dec_video.c:video_set_postprocess() | |||||
| // if(mode<0) mode= getModeForQuality(-mode); | |||||
| /* | /* | ||||
| long long T= rdtsc(); | long long T= rdtsc(); | ||||
| @@ -1869,21 +1887,46 @@ void postprocess(unsigned char * src[], int src_stride, | |||||
| memcpy(dst[2], src[2], src_stride*horizontal_size); | memcpy(dst[2], src[2], src_stride*horizontal_size); | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * gets the mode flags for a given quality (larger values mean slower but better postprocessing) | * gets the mode flags for a given quality (larger values mean slower but better postprocessing) | ||||
| * 0 <= quality < 64 | |||||
| * 0 <= quality <= 6 | |||||
| */ | */ | ||||
| int getModeForQuality(int quality){ | |||||
| int modes[6]= { | |||||
| int getPpModeForQuality(int quality){ | |||||
| int modes[1+GET_PP_QUALITY_MAX]= { | |||||
| 0, | |||||
| #if 1 | |||||
| // horizontal filters first | |||||
| LUM_H_DEBLOCK, | |||||
| LUM_H_DEBLOCK | LUM_V_DEBLOCK, | |||||
| LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK, | |||||
| LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK | CHROM_V_DEBLOCK, | |||||
| LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK | CHROM_V_DEBLOCK | LUM_DERING, | |||||
| LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK | CHROM_V_DEBLOCK | LUM_DERING | CHROM_DERING | |||||
| #else | |||||
| // vertical filters first | |||||
| LUM_V_DEBLOCK, | LUM_V_DEBLOCK, | ||||
| LUM_V_DEBLOCK | LUM_H_DEBLOCK, | LUM_V_DEBLOCK | LUM_H_DEBLOCK, | ||||
| LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK, | LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK, | ||||
| LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK, | LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK, | ||||
| LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK | LUM_DERING, | LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK | LUM_DERING, | ||||
| LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK | LUM_DERING | CHROM_DERING | LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK | LUM_DERING | CHROM_DERING | ||||
| }; | |||||
| return modes[ (quality*6) >>6 ]; | |||||
| #endif | |||||
| }; | |||||
| #ifdef HAVE_ODIVX_POSTPROCESS | |||||
| int odivx_modes[1+GET_PP_QUALITY_MAX]= { | |||||
| 0, | |||||
| PP_DEBLOCK_Y_H, | |||||
| PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V, | |||||
| PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H, | |||||
| PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H|PP_DEBLOCK_C_V, | |||||
| PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H|PP_DEBLOCK_C_V|PP_DERING_Y, | |||||
| PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H|PP_DEBLOCK_C_V|PP_DERING_Y|PP_DERING_C | |||||
| }; | |||||
| if(use_old_pp) return odivx_modes[quality]; | |||||
| #endif | |||||
| return modes[quality]; | |||||
| } | } | ||||
| //} // extern "C" | //} // extern "C" | ||||
| @@ -2010,7 +2053,7 @@ SIMPLE_CPY | |||||
| /** | /** | ||||
| * Filters array of bytes (Y or U or V values) | * Filters array of bytes (Y or U or V values) | ||||
| */ | */ | ||||
| void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, | |||||
| static void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, | |||||
| QP_STORE_T QPs[], int QPStride, int isColor, int mode) | QP_STORE_T QPs[], int QPStride, int isColor, int mode) | ||||
| { | { | ||||
| int x,y; | int x,y; | ||||
| @@ -137,7 +137,7 @@ int maxAllowedY=255; | |||||
| //FIXME can never make a movie´s black brighter (anyone needs that?) | //FIXME can never make a movie´s black brighter (anyone needs that?) | ||||
| int minAllowedY=0; | int minAllowedY=0; | ||||
| #ifdef TIMEING | |||||
| static inline long long rdtsc() | static inline long long rdtsc() | ||||
| { | { | ||||
| long long l; | long long l; | ||||
| @@ -147,7 +147,9 @@ static inline long long rdtsc() | |||||
| // printf("%d\n", int(l/1000)); | // printf("%d\n", int(l/1000)); | ||||
| return l; | return l; | ||||
| } | } | ||||
| #endif | |||||
| #ifdef HAVE_MMX2 | |||||
| static inline void prefetchnta(void *p) | static inline void prefetchnta(void *p) | ||||
| { | { | ||||
| asm volatile( "prefetchnta (%0)\n\t" | asm volatile( "prefetchnta (%0)\n\t" | ||||
| @@ -175,6 +177,7 @@ static inline void prefetcht2(void *p) | |||||
| : : "r" (p) | : : "r" (p) | ||||
| ); | ); | ||||
| } | } | ||||
| #endif | |||||
| //FIXME? |255-0| = 1 (shouldnt be a problem ...) | //FIXME? |255-0| = 1 (shouldnt be a problem ...) | ||||
| /** | /** | ||||
| @@ -1814,8 +1817,13 @@ FIND_MIN_MAX(%%ebx, %1, 2) | |||||
| #endif | #endif | ||||
| } | } | ||||
| #ifdef HAVE_ODIVX_POSTPROCESS | |||||
| #include "../opendivx/postprocess.h" | |||||
| int use_old_pp=0; | |||||
| #endif | |||||
| static void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, | |||||
| QP_STORE_T QPs[], int QPStride, int isColor, int mode); | |||||
| /** | /** | ||||
| * ... | * ... | ||||
| @@ -1830,7 +1838,17 @@ void postprocess(unsigned char * src[], int src_stride, | |||||
| int mode) | int mode) | ||||
| { | { | ||||
| if(mode<0) mode= getModeForQuality(-mode); | |||||
| #ifdef HAVE_ODIVX_POSTPROCESS | |||||
| // Note: I could make this shit outside of this file, but it would mean one | |||||
| // more function call... | |||||
| if(use_old_pp){ | |||||
| odivx_postprocess(src,src_stride,dst,dst_stride,horizontal_size,vertical_size,QP_store,QP_stride,mode); | |||||
| return; | |||||
| } | |||||
| #endif | |||||
| // I'm calling this from dec_video.c:video_set_postprocess() | |||||
| // if(mode<0) mode= getModeForQuality(-mode); | |||||
| /* | /* | ||||
| long long T= rdtsc(); | long long T= rdtsc(); | ||||
| @@ -1869,21 +1887,46 @@ void postprocess(unsigned char * src[], int src_stride, | |||||
| memcpy(dst[2], src[2], src_stride*horizontal_size); | memcpy(dst[2], src[2], src_stride*horizontal_size); | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * gets the mode flags for a given quality (larger values mean slower but better postprocessing) | * gets the mode flags for a given quality (larger values mean slower but better postprocessing) | ||||
| * 0 <= quality < 64 | |||||
| * 0 <= quality <= 6 | |||||
| */ | */ | ||||
| int getModeForQuality(int quality){ | |||||
| int modes[6]= { | |||||
| int getPpModeForQuality(int quality){ | |||||
| int modes[1+GET_PP_QUALITY_MAX]= { | |||||
| 0, | |||||
| #if 1 | |||||
| // horizontal filters first | |||||
| LUM_H_DEBLOCK, | |||||
| LUM_H_DEBLOCK | LUM_V_DEBLOCK, | |||||
| LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK, | |||||
| LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK | CHROM_V_DEBLOCK, | |||||
| LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK | CHROM_V_DEBLOCK | LUM_DERING, | |||||
| LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK | CHROM_V_DEBLOCK | LUM_DERING | CHROM_DERING | |||||
| #else | |||||
| // vertical filters first | |||||
| LUM_V_DEBLOCK, | LUM_V_DEBLOCK, | ||||
| LUM_V_DEBLOCK | LUM_H_DEBLOCK, | LUM_V_DEBLOCK | LUM_H_DEBLOCK, | ||||
| LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK, | LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK, | ||||
| LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK, | LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK, | ||||
| LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK | LUM_DERING, | LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK | LUM_DERING, | ||||
| LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK | LUM_DERING | CHROM_DERING | LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK | LUM_DERING | CHROM_DERING | ||||
| }; | |||||
| return modes[ (quality*6) >>6 ]; | |||||
| #endif | |||||
| }; | |||||
| #ifdef HAVE_ODIVX_POSTPROCESS | |||||
| int odivx_modes[1+GET_PP_QUALITY_MAX]= { | |||||
| 0, | |||||
| PP_DEBLOCK_Y_H, | |||||
| PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V, | |||||
| PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H, | |||||
| PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H|PP_DEBLOCK_C_V, | |||||
| PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H|PP_DEBLOCK_C_V|PP_DERING_Y, | |||||
| PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H|PP_DEBLOCK_C_V|PP_DERING_Y|PP_DERING_C | |||||
| }; | |||||
| if(use_old_pp) return odivx_modes[quality]; | |||||
| #endif | |||||
| return modes[quality]; | |||||
| } | } | ||||
| //} // extern "C" | //} // extern "C" | ||||
| @@ -2010,7 +2053,7 @@ SIMPLE_CPY | |||||
| /** | /** | ||||
| * Filters array of bytes (Y or U or V values) | * Filters array of bytes (Y or U or V values) | ||||
| */ | */ | ||||
| void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, | |||||
| static void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, | |||||
| QP_STORE_T QPs[], int QPStride, int isColor, int mode) | QP_STORE_T QPs[], int QPStride, int isColor, int mode) | ||||
| { | { | ||||
| int x,y; | int x,y; | ||||