[Mplayer-cvslog] CVS: main/postproc postprocess.c,1.17,1.18 postprocess.h,1.13,1.14
Michael Niedermayer
michael at mplayer.dev.hu
Tue Oct 23 01:36:49 CEST 2001
Update of /cvsroot/mplayer/main/postproc
In directory mplayer:/var/tmp.root/cvs-serv10809
Modified Files:
postprocess.c postprocess.h
Log Message:
auto brightness/ contrast bugfix
getPPModeByNameAndQuality
Index: postprocess.c
===================================================================
RCS file: /cvsroot/mplayer/main/postproc/postprocess.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- postprocess.c 19 Oct 2001 17:03:51 -0000 1.17
+++ postprocess.c 22 Oct 2001 23:36:35 -0000 1.18
@@ -71,6 +71,7 @@
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include "../config.h"
//#undef HAVE_MMX2
//#define HAVE_3DNOW
@@ -88,6 +89,10 @@
#define PAVGB(a,b) "pavgusb " #a ", " #b " \n\t"
#endif
+#define GET_MODE_BUFFER_SIZE 500
+#define OPTIONS_ARRAY_SIZE 10
+
+
static uint64_t packedYOffset= 0x0000000000000000LL;
static uint64_t packedYScale= 0x0100010001000100LL;
static uint64_t w05= 0x0005000500050005LL;
@@ -130,10 +135,35 @@
//amount of "black" u r willing to loose to get a brightness corrected picture
double maxClippedThreshold= 0.01;
-int maxAllowedY=255;
+int maxAllowedY=234;
//FIXME can never make a movie´s black brighter (anyone needs that?)
int minAllowedY=16;
+static struct PPFilter filters[]=
+{
+ {"hb", "hdeblock", 1, 1, 3, H_DEBLOCK},
+ {"vb", "vdeblock", 1, 2, 4, V_DEBLOCK},
+ {"vr", "rkvdeblock", 1, 2, 4, H_RK1_FILTER},
+ {"h1", "x1hdeblock", 1, 1, 3, H_X1_FILTER},
+ {"v1", "x1vdeblock", 1, 2, 4, V_X1_FILTER},
+ {"dr", "dering", 1, 5, 6, DERING},
+ {"al", "autolevels", 0, 1, 2, LEVEL_FIX},
+ {"lb", "linblenddeint", 0, 1, 6, LINEAR_BLEND_DEINT_FILTER},
+ {"li", "linipoldeint", 0, 1, 6, LINEAR_IPOL_DEINT_FILTER},
+ {"ci", "cubicipoldeint", 0, 1, 6, CUBIC_IPOL_DEINT_FILTER},
+ {"md", "mediandeint", 0, 1, 6, MEDIAN_DEINT_FILTER},
+ {NULL, NULL,0,0,0,0} //End Marker
+};
+
+static char *replaceTable[]=
+{
+ "default", "hdeblock:a,vdeblock:a,dering:a,autolevels",
+ "de", "hdeblock:a,vdeblock:a,dering:a,autolevels",
+ "fast", "x1hdeblock:a,x1vdeblock:a,dering:a,autolevels",
+ "fa", "x1hdeblock:a,x1vdeblock:a,dering:a,autolevels",
+ NULL //End Marker
+};
+
#ifdef TIMING
static inline long long rdtsc()
{
@@ -2163,6 +2193,165 @@
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);
+/* -pp Command line Help
+NOTE/FIXME: put this at an appropriate place (--help, html docs, man mplayer)?
+
+-pp <filterName>[:<option>[:<option>...]][,[-]<filterName>[:<option>...]]...
+
+long form example:
+-pp vdeblock:autoq,hdeblock:autoq,linblenddeint -pp default,-vdeblock
+short form example:
+-pp vb:a,hb:a,lb -pp de,-vb
+
+Filters Options
+short long name short long option Description
+* * a autoq cpu power dependant enabler
+ c chrom chrominance filtring enabled
+ y nochrom chrominance filtring disabled
+hb hdeblock horizontal deblocking filter
+vb vdeblock vertical deblocking filter
+vr rkvdeblock
+h1 x1hdeblock Experimental horizontal deblock filter 1
+v1 x1vdeblock Experimental vertical deblock filter 1
+dr dering not implemented yet
+al autolevels automatic brightness / contrast fixer
+ f fullyrange stretch luminance range to (0..255)
+lb linblenddeint linear blend deinterlacer
+li linipoldeint linear interpolating deinterlacer
+ci cubicipoldeint cubic interpolating deinterlacer
+md mediandeint median deinterlacer
+de default hdeblock:a,vdeblock:a,dering:a,autolevels
+fa fast x1hdeblock:a,x1vdeblock:a,dering:a,autolevels
+*/
+
+/**
+ * returns a PPMode struct which will have a non 0 error variable if an error occured
+ * name is the string after "-pp" on the command line
+ * quality is a number from 0 to GET_PP_QUALITY_MAX
+ */
+struct PPMode getPPModeByNameAndQuality(char *name, int quality)
+{
+ char temp[GET_MODE_BUFFER_SIZE];
+ char *p= temp;
+ char *filterDelimiters= ",";
+ char *optionDelimiters= ":";
+ struct PPMode ppMode= {0,0,0,0,0,0};
+ char *filterToken;
+
+ strncpy(temp, name, GET_MODE_BUFFER_SIZE);
+
+ for(;;){
+ char *p2;
+ char *filterName;
+ int q= GET_PP_QUALITY_MAX;
+ int chrom=-1;
+ char *option;
+ char *options[OPTIONS_ARRAY_SIZE];
+ int i;
+ int filterNameOk=0;
+ int numOfUnknownOptions=0;
+ int enable=1; //does the user want us to enabled or disabled the filter
+
+ filterToken= strtok(p, filterDelimiters);
+ if(filterToken == NULL) break;
+ p+= strlen(filterToken) + 1;
+ filterName= strtok(filterToken, optionDelimiters);
+ printf("%s::%s\n", filterToken, filterName);
+
+ if(*filterName == '-')
+ {
+ enable=0;
+ filterName++;
+ }
+ for(;;){ //for all options
+ option= strtok(NULL, optionDelimiters);
+ if(option == NULL) break;
+
+ printf("%s\n", option);
+ if(!strcmp("autoq", option) || !strcmp("a", option)) q= quality;
+ else if(!strcmp("nochrom", option) || !strcmp("y", option)) chrom=0;
+ else if(!strcmp("chrom", option) || !strcmp("c", option)) chrom=1;
+ else
+ {
+ options[numOfUnknownOptions] = option;
+ numOfUnknownOptions++;
+ options[numOfUnknownOptions] = NULL;
+ }
+ if(numOfUnknownOptions >= OPTIONS_ARRAY_SIZE-1) break;
+ }
+
+ /* replace stuff from the replace Table */
+ for(i=0; replaceTable[2*i]!=NULL; i++)
+ {
+ if(!strcmp(replaceTable[2*i], filterName))
+ {
+ int newlen= strlen(replaceTable[2*i + 1]);
+ int plen;
+ int spaceLeft;
+
+ if(p==NULL) p= temp, *p=0; //last filter
+ else p--, *p=','; //not last filter
+
+ plen= strlen(p);
+ spaceLeft= (int)p - (int)temp + plen;
+ if(spaceLeft + newlen >= GET_MODE_BUFFER_SIZE)
+ {
+ ppMode.error++;
+ break;
+ }
+ memmove(p + newlen, p, plen+1);
+ memcpy(p, replaceTable[2*i + 1], newlen);
+ filterNameOk=1;
+ }
+ }
+
+ for(i=0; filters[i].shortName!=NULL; i++)
+ {
+ if( !strcmp(filters[i].longName, filterName)
+ || !strcmp(filters[i].shortName, filterName))
+ {
+ ppMode.lumMode &= ~filters[i].mask;
+ ppMode.chromMode &= ~filters[i].mask;
+
+ filterNameOk=1;
+ if(!enable) break; // user wants to disable it
+
+ if(q >= filters[i].minLumQuality)
+ ppMode.lumMode|= filters[i].mask;
+ if(chrom==1 || (chrom==-1 && filters[i].chromDefault))
+ if(q >= filters[i].minChromQuality)
+ ppMode.chromMode|= filters[i].mask;
+
+ if(filters[i].mask == LEVEL_FIX)
+ {
+ int o;
+ ppMode.minAllowedY= 16;
+ ppMode.maxAllowedY= 234;
+ for(o=0; options[o]!=NULL; o++)
+ if( !strcmp(options[o],"fullyrange")
+ ||!strcmp(options[o],"f"))
+ {
+ ppMode.minAllowedY= 0;
+ ppMode.maxAllowedY= 255;
+ numOfUnknownOptions--;
+ }
+ }
+ }
+ }
+ if(!filterNameOk) ppMode.error++;
+ ppMode.error += numOfUnknownOptions;
+ }
+
+ if(ppMode.lumMode & H_DEBLOCK) ppMode.oldMode |= PP_DEBLOCK_Y_H;
+ if(ppMode.lumMode & V_DEBLOCK) ppMode.oldMode |= PP_DEBLOCK_Y_V;
+ if(ppMode.chromMode & H_DEBLOCK) ppMode.oldMode |= PP_DEBLOCK_C_H;
+ if(ppMode.chromMode & V_DEBLOCK) ppMode.oldMode |= PP_DEBLOCK_C_V;
+ if(ppMode.lumMode & DERING) ppMode.oldMode |= PP_DERING_Y;
+ if(ppMode.chromMode & DERING) ppMode.oldMode |= PP_DERING_C;
+
+ return ppMode;
+}
+
/**
* ...
*/
@@ -2172,6 +2361,18 @@
QP_STORE_T *QP_store, int QP_stride,
int mode)
{
+/*
+ static int qual=0;
+
+ struct PPMode ppMode= getPPModeByNameAndQuality("fast,default,-hdeblock,-vdeblock", qual);
+ qual++;
+ qual%=7;
+ printf("\n%d %d %d %d\n", ppMode.lumMode, ppMode.chromMode, ppMode.oldMode, ppMode.error);
+ postprocess2(src, src_stride, dst, dst_stride,
+ horizontal_size, vertical_size, QP_store, QP_stride, &ppMode);
+
+ return;
+*/
#ifdef HAVE_ODIVX_POSTPROCESS
// Note: I could make this shit outside of this file, but it would mean one
@@ -2182,21 +2383,6 @@
}
#endif
-/*
- long long T= rdtsc();
- for(int y=vertical_size-1; y>=0 ; y--)
- memcpy(dst[0] + y*src_stride, src[0] + y*src_stride,src_stride);
-// memcpy(dst[0], src[0],src_stride*vertical_size);
- printf("%4dk\r", (rdtsc()-T)/1000);
-
- return;
-*/
-/*
- long long T= rdtsc();
- while( (rdtsc() - T)/1000 < 4000);
-
- return;
-*/
postProcess(src[0], src_stride, dst[0], dst_stride,
horizontal_size, vertical_size, QP_store, QP_stride, 0, mode);
@@ -2211,7 +2397,7 @@
postProcess(src[1], src_stride, dst[1], dst_stride,
horizontal_size, vertical_size, QP_store, QP_stride, 1, mode);
postProcess(src[2], src_stride, dst[2], dst_stride,
- horizontal_size, vertical_size, QP_store, QP_stride, 1, mode);
+ horizontal_size, vertical_size, QP_store, QP_stride, 2, mode);
}
else
{
@@ -2219,6 +2405,38 @@
memcpy(dst[2], src[2], src_stride*horizontal_size);
}
}
+
+void postprocess2(unsigned char * src[], int src_stride,
+ unsigned char * dst[], int dst_stride,
+ int horizontal_size, int vertical_size,
+ QP_STORE_T *QP_store, int QP_stride,
+ struct PPMode *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->oldMode);
+ return;
+ }
+#endif
+
+ postProcess(src[0], src_stride, dst[0], dst_stride,
+ horizontal_size, vertical_size, QP_store, QP_stride, 0, mode->lumMode);
+
+ horizontal_size >>= 1;
+ vertical_size >>= 1;
+ src_stride >>= 1;
+ dst_stride >>= 1;
+
+ postProcess(src[1], src_stride, dst[1], dst_stride,
+ horizontal_size, vertical_size, QP_store, QP_stride, 1, mode->chromMode);
+ postProcess(src[2], src_stride, dst[2], dst_stride,
+ horizontal_size, vertical_size, QP_store, QP_stride, 2, mode->chromMode);
+}
+
/**
* gets the mode flags for a given quality (larger values mean slower but better postprocessing)
Index: postprocess.h
===================================================================
RCS file: /cvsroot/mplayer/main/postproc/postprocess.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- postprocess.h 19 Oct 2001 14:54:26 -0000 1.13
+++ postprocess.h 22 Oct 2001 23:36:35 -0000 1.14
@@ -46,7 +46,7 @@
#define H_RK1_FILTER 0x1000 // 4096 (not implemented yet)
#define H_X1_FILTER 0x2000 // 8192
-// select between full y range (255-0) or standart one (
+// select between full y range (255-0) or standart one (234-16)
#define FULL_Y_RANGE 0x8000 // 32768
//Deinterlacing Filters
@@ -67,11 +67,38 @@
#define QP_STORE_T int
+struct PPMode{
+ int lumMode; //acivates filters for luminance
+ int chromMode; //acivates filters for chrominance
+ int oldMode; // will be passed to odivx
+ int error; // non zero on error
+
+ int minAllowedY;
+ int maxAllowedY;
+};
+
+struct PPFilter{
+ char *shortName;
+ char *longName;
+ int chromDefault;
+ int minLumQuality;
+ int minChromQuality;
+ int mask;
+};
+
void postprocess(unsigned char * src[], int src_stride,
unsigned char * dst[], int dst_stride,
int horizontal_size, int vertical_size,
QP_STORE_T *QP_store, int QP_stride, int mode);
+void postprocess2(unsigned char * src[], int src_stride,
+ unsigned char * dst[], int dst_stride,
+ int horizontal_size, int vertical_size,
+ QP_STORE_T *QP_store, int QP_stride, struct PPMode *mode);
+
+
int getPpModeForQuality(int quality);
+
+struct PPMode getPpModeByNameAndQuality(char *name, int quality);
#endif
More information about the MPlayer-cvslog
mailing list