brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
Originally committed as revision 9417 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
This commit is contained in:
parent
6542b44e2a
commit
0481412aba
@ -132,6 +132,8 @@ untested special converters
|
|||||||
#define RU ((int)(-0.148*(1<<RGB2YUV_SHIFT)+0.5))
|
#define RU ((int)(-0.148*(1<<RGB2YUV_SHIFT)+0.5))
|
||||||
|
|
||||||
extern int verbose; // defined in mplayer.c
|
extern int verbose; // defined in mplayer.c
|
||||||
|
extern const int32_t Inverse_Table_6_9[8][4];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
NOTES
|
NOTES
|
||||||
Special versions: fast Y 1:1 scaling (no interpolation in y direction)
|
Special versions: fast Y 1:1 scaling (no interpolation in y direction)
|
||||||
@ -1960,6 +1962,50 @@ static void getSubSampleFactors(int *h, int *v, int format){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint16_t roundToInt16(float f){
|
||||||
|
if(f<-0x7FFF) f= -0x7FFF;
|
||||||
|
else if(f> 0x7FFF) f= 0x7FFF;
|
||||||
|
|
||||||
|
return (int)floor(f + 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param colorspace colorspace
|
||||||
|
* @param fullRange if 1 then the luma range is 0..255 if 0 its 16..235
|
||||||
|
*/
|
||||||
|
void setInputColorspaceDetails(SwsContext *c, int colorspace, int fullRange, float brightness, float contrast, float saturation){
|
||||||
|
|
||||||
|
float crv = Inverse_Table_6_9[colorspace][0]/65536.0;
|
||||||
|
float cbu = Inverse_Table_6_9[colorspace][1]/65536.0;
|
||||||
|
float cgu = -Inverse_Table_6_9[colorspace][2]/65536.0;
|
||||||
|
float cgv = -Inverse_Table_6_9[colorspace][3]/65536.0;
|
||||||
|
float cy = 1.0;
|
||||||
|
float oy = 0;
|
||||||
|
|
||||||
|
c->uOffset= 0x0400040004000400LL;
|
||||||
|
c->vOffset= 0x0400040004000400LL;
|
||||||
|
|
||||||
|
if(!fullRange){
|
||||||
|
cy= (cy*255.0) / 219.0;
|
||||||
|
oy= 16.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cy *= contrast;
|
||||||
|
crv*= contrast * saturation;
|
||||||
|
cbu*= contrast * saturation;
|
||||||
|
cgu*= contrast * saturation;
|
||||||
|
cgv*= contrast * saturation;
|
||||||
|
|
||||||
|
oy -= 256.0*brightness;
|
||||||
|
|
||||||
|
c->yCoeff= roundToInt16(cy *8192) * 0x0001000100010001ULL;
|
||||||
|
c->vrCoeff= roundToInt16(crv*8192) * 0x0001000100010001ULL;
|
||||||
|
c->ubCoeff= roundToInt16(cbu*8192) * 0x0001000100010001ULL;
|
||||||
|
c->vgCoeff= roundToInt16(cgv*8192) * 0x0001000100010001ULL;
|
||||||
|
c->ugCoeff= roundToInt16(cgu*8192) * 0x0001000100010001ULL;
|
||||||
|
c->yOffset= roundToInt16(oy * 8) * 0x0001000100010001ULL;
|
||||||
|
}
|
||||||
|
|
||||||
SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags,
|
SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags,
|
||||||
SwsFilter *srcFilter, SwsFilter *dstFilter){
|
SwsFilter *srcFilter, SwsFilter *dstFilter){
|
||||||
|
|
||||||
@ -2019,15 +2065,8 @@ SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH,
|
|||||||
c->dstFormat= dstFormat;
|
c->dstFormat= dstFormat;
|
||||||
c->srcFormat= srcFormat;
|
c->srcFormat= srcFormat;
|
||||||
|
|
||||||
c->yCoeff= 0x2568256825682568LL;
|
setInputColorspaceDetails(c, SWS_CS_DEFAULT, 0, 0.0, 1.0, 1.0);
|
||||||
c->vrCoeff= 0x3343334333433343LL;
|
|
||||||
c->ubCoeff= 0x40cf40cf40cf40cfLL;
|
|
||||||
c->vgCoeff= 0xE5E2E5E2E5E2E5E2LL;
|
|
||||||
c->ugCoeff= 0xF36EF36EF36EF36ELL;
|
|
||||||
c->yOffset= 0x0080008000800080LL;
|
|
||||||
c->uOffset= 0x0400040004000400LL;
|
|
||||||
c->vOffset= 0x0400040004000400LL;
|
|
||||||
|
|
||||||
usesFilter=0;
|
usesFilter=0;
|
||||||
if(dstFilter->lumV!=NULL && dstFilter->lumV->length>1) usesFilter=1;
|
if(dstFilter->lumV!=NULL && dstFilter->lumV->length>1) usesFilter=1;
|
||||||
if(dstFilter->lumH!=NULL && dstFilter->lumH->length>1) usesFilter=1;
|
if(dstFilter->lumH!=NULL && dstFilter->lumH->length>1) usesFilter=1;
|
||||||
@ -2678,4 +2717,3 @@ void freeSwsContext(SwsContext *c){
|
|||||||
free(c);
|
free(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,6 +48,14 @@
|
|||||||
|
|
||||||
#define SWS_MAX_REDUCE_CUTOFF 0.002
|
#define SWS_MAX_REDUCE_CUTOFF 0.002
|
||||||
|
|
||||||
|
#define SWS_CS_ITU709 1
|
||||||
|
#define SWS_CS_FCC 4
|
||||||
|
#define SWS_CS_ITU601 5
|
||||||
|
#define SWS_CS_ITU624 5
|
||||||
|
#define SWS_CS_SMPTE170M 5
|
||||||
|
#define SWS_CS_SMPTE240M 7
|
||||||
|
#define SWS_CS_DEFAULT 5
|
||||||
|
|
||||||
/* this struct should be aligned on at least 32-byte boundary */
|
/* this struct should be aligned on at least 32-byte boundary */
|
||||||
typedef struct SwsContext{
|
typedef struct SwsContext{
|
||||||
int srcW, srcH, dstH;
|
int srcW, srcH, dstH;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user