Logo Search packages:      
Sourcecode: ffmpeg version File versions  Download package

int sws_setColorspaceDetails ( SwsContext *  c,
const int  inv_table[4],
int  srcRange,
const int  table[4],
int  dstRange,
int  brightness,
int  contrast,
int  saturation 
)

Parameters:
inv_table the yuv2rgb coefficients, normally ff_yuv2rgb_coeffs[x]
fullRange if 1 then the luma range is 0..255 if 0 it is 16..235
Returns:
-1 if not supported

Definition at line 2082 of file swscale.c.

                                                                                                                                                                 {
    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->dstColorspaceTable,     table, sizeof(int)*4);

    c->brightness= brightness;
    c->contrast  = contrast;
    c->saturation= saturation;
    c->srcRange  = srcRange;
    c->dstRange  = dstRange;
    if (isYUV(c->dstFormat) || isGray(c->dstFormat)) return 0;

    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);

    sws_yuv2rgb_c_init_tables(c, inv_table, srcRange, brightness, contrast, saturation);
    //FIXME factorize

#ifdef COMPILE_ALTIVEC
    if (c->flags & SWS_CPU_CAPS_ALTIVEC)
        sws_yuv2rgb_altivec_init_tables (c, inv_table, brightness, contrast, saturation);
#endif
    return 0;
}


Generated by  Doxygen 1.6.0   Back to index