Move internal scale context fields initialization from
sws_setColorspaceDetails() to ff_yuv2rgb_c_init_tables(). Allow to factorize duplicated code. Originally committed as revision 31300 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale
This commit is contained in:
parent
79513857ba
commit
0093ac5b9f
@ -671,23 +671,8 @@ static void getSubSampleFactors(int *h, int *v, enum PixelFormat format)
|
|||||||
*v = av_pix_fmt_descriptors[format].log2_chroma_h;
|
*v = av_pix_fmt_descriptors[format].log2_chroma_h;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t roundToInt16(int64_t f)
|
|
||||||
{
|
|
||||||
int r= (f + (1<<15))>>16;
|
|
||||||
if (r<-0x7FFF) return 0x8000;
|
|
||||||
else if (r> 0x7FFF) return 0x7FFF;
|
|
||||||
else return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation)
|
int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation)
|
||||||
{
|
{
|
||||||
int64_t crv = inv_table[0];
|
|
||||||
int64_t cbu = inv_table[1];
|
|
||||||
int64_t cgu = -inv_table[2];
|
|
||||||
int64_t cgv = -inv_table[3];
|
|
||||||
int64_t cy = 1<<16;
|
|
||||||
int64_t oy = 0;
|
|
||||||
|
|
||||||
memcpy(c->srcColorspaceTable, inv_table, sizeof(int)*4);
|
memcpy(c->srcColorspaceTable, inv_table, sizeof(int)*4);
|
||||||
memcpy(c->dstColorspaceTable, table, sizeof(int)*4);
|
memcpy(c->dstColorspaceTable, table, sizeof(int)*4);
|
||||||
|
|
||||||
@ -698,41 +683,6 @@ int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange
|
|||||||
c->dstRange = dstRange;
|
c->dstRange = dstRange;
|
||||||
if (isYUV(c->dstFormat) || isGray(c->dstFormat)) return -1;
|
if (isYUV(c->dstFormat) || isGray(c->dstFormat)) return -1;
|
||||||
|
|
||||||
c->uOffset= 0x0400040004000400LL;
|
|
||||||
c->vOffset= 0x0400040004000400LL;
|
|
||||||
|
|
||||||
if (!srcRange) {
|
|
||||||
cy= (cy*255) / 219;
|
|
||||||
oy= 16<<16;
|
|
||||||
} else {
|
|
||||||
crv= (crv*224) / 255;
|
|
||||||
cbu= (cbu*224) / 255;
|
|
||||||
cgu= (cgu*224) / 255;
|
|
||||||
cgv= (cgv*224) / 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
cy = (cy *contrast )>>16;
|
|
||||||
crv= (crv*contrast * saturation)>>32;
|
|
||||||
cbu= (cbu*contrast * saturation)>>32;
|
|
||||||
cgu= (cgu*contrast * saturation)>>32;
|
|
||||||
cgv= (cgv*contrast * saturation)>>32;
|
|
||||||
|
|
||||||
oy -= 256*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;
|
|
||||||
|
|
||||||
c->yuv2rgb_y_coeff = (int16_t)roundToInt16(cy <<13);
|
|
||||||
c->yuv2rgb_y_offset = (int16_t)roundToInt16(oy << 9);
|
|
||||||
c->yuv2rgb_v2r_coeff= (int16_t)roundToInt16(crv<<13);
|
|
||||||
c->yuv2rgb_v2g_coeff= (int16_t)roundToInt16(cgv<<13);
|
|
||||||
c->yuv2rgb_u2g_coeff= (int16_t)roundToInt16(cgu<<13);
|
|
||||||
c->yuv2rgb_u2b_coeff= (int16_t)roundToInt16(cbu<<13);
|
|
||||||
|
|
||||||
ff_yuv2rgb_c_init_tables(c, inv_table, srcRange, brightness, contrast, saturation);
|
ff_yuv2rgb_c_init_tables(c, inv_table, srcRange, brightness, contrast, saturation);
|
||||||
//FIXME factorize
|
//FIXME factorize
|
||||||
|
|
||||||
|
@ -620,6 +620,14 @@ static void fill_gv_table(int table[256], const int elemsize, const int inc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint16_t roundToInt16(int64_t f)
|
||||||
|
{
|
||||||
|
int r= (f + (1<<15))>>16;
|
||||||
|
if (r<-0x7FFF) return 0x8000;
|
||||||
|
else if (r> 0x7FFF) return 0x7FFF;
|
||||||
|
else return r;
|
||||||
|
}
|
||||||
|
|
||||||
av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int fullRange,
|
av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int fullRange,
|
||||||
int brightness, int contrast, int saturation)
|
int brightness, int contrast, int saturation)
|
||||||
{
|
{
|
||||||
@ -675,6 +683,22 @@ av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int
|
|||||||
cgv = (cgv*contrast * saturation) >> 32;
|
cgv = (cgv*contrast * saturation) >> 32;
|
||||||
oy -= 256*brightness;
|
oy -= 256*brightness;
|
||||||
|
|
||||||
|
c->uOffset= 0x0400040004000400LL;
|
||||||
|
c->vOffset= 0x0400040004000400LL;
|
||||||
|
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;
|
||||||
|
|
||||||
|
c->yuv2rgb_y_coeff = (int16_t)roundToInt16(cy <<13);
|
||||||
|
c->yuv2rgb_y_offset = (int16_t)roundToInt16(oy << 9);
|
||||||
|
c->yuv2rgb_v2r_coeff= (int16_t)roundToInt16(crv<<13);
|
||||||
|
c->yuv2rgb_v2g_coeff= (int16_t)roundToInt16(cgv<<13);
|
||||||
|
c->yuv2rgb_u2g_coeff= (int16_t)roundToInt16(cgu<<13);
|
||||||
|
c->yuv2rgb_u2b_coeff= (int16_t)roundToInt16(cbu<<13);
|
||||||
|
|
||||||
//scale coefficients by cy
|
//scale coefficients by cy
|
||||||
crv = ((crv << 16) + 0x8000) / cy;
|
crv = ((crv << 16) + 0x8000) / cy;
|
||||||
cbu = ((cbu << 16) + 0x8000) / cy;
|
cbu = ((cbu << 16) + 0x8000) / cy;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user