@ -637,23 +637,26 @@ static int check_image_pointers(const uint8_t * const data[4], enum AVPixelForma
return 1 ;
}
static void xyz12Torgb48 ( struct SwsContext * c , uint16 _t * dst ,
const uint16 _t * src , int stride , int w , int h )
static void xyz12Torgb48 ( struct SwsContext * c , uint8 _t * dst , int dst_stride ,
const uint8 _t * src , int src_ stride, int w , int h )
{
const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get ( c - > srcFormat ) ;
for ( int yp = 0 ; yp < h ; yp + + ) {
const uint16_t * src16 = ( const uint16_t * ) src ;
uint16_t * dst16 = ( uint16_t * ) dst ;
for ( int xp = 0 ; xp < 3 * w ; xp + = 3 ) {
int x , y , z , r , g , b ;
if ( desc - > flags & AV_PIX_FMT_FLAG_BE ) {
x = AV_RB16 ( src + xp + 0 ) ;
y = AV_RB16 ( src + xp + 1 ) ;
z = AV_RB16 ( src + xp + 2 ) ;
x = AV_RB16 ( src16 + xp + 0 ) ;
y = AV_RB16 ( src16 + xp + 1 ) ;
z = AV_RB16 ( src16 + xp + 2 ) ;
} else {
x = AV_RL16 ( src + xp + 0 ) ;
y = AV_RL16 ( src + xp + 1 ) ;
z = AV_RL16 ( src + xp + 2 ) ;
x = AV_RL16 ( src16 + xp + 0 ) ;
y = AV_RL16 ( src16 + xp + 1 ) ;
z = AV_RL16 ( src16 + xp + 2 ) ;
}
x = c - > xyzgamma [ x > > 4 ] ;
@ -678,37 +681,41 @@ static void xyz12Torgb48(struct SwsContext *c, uint16_t *dst,
// convert from sRGBlinear to RGB and scale from 12bit to 16bit
if ( desc - > flags & AV_PIX_FMT_FLAG_BE ) {
AV_WB16 ( dst + xp + 0 , c - > rgbgamma [ r ] < < 4 ) ;
AV_WB16 ( dst + xp + 1 , c - > rgbgamma [ g ] < < 4 ) ;
AV_WB16 ( dst + xp + 2 , c - > rgbgamma [ b ] < < 4 ) ;
AV_WB16 ( dst16 + xp + 0 , c - > rgbgamma [ r ] < < 4 ) ;
AV_WB16 ( dst16 + xp + 1 , c - > rgbgamma [ g ] < < 4 ) ;
AV_WB16 ( dst16 + xp + 2 , c - > rgbgamma [ b ] < < 4 ) ;
} else {
AV_WL16 ( dst + xp + 0 , c - > rgbgamma [ r ] < < 4 ) ;
AV_WL16 ( dst + xp + 1 , c - > rgbgamma [ g ] < < 4 ) ;
AV_WL16 ( dst + xp + 2 , c - > rgbgamma [ b ] < < 4 ) ;
AV_WL16 ( dst16 + xp + 0 , c - > rgbgamma [ r ] < < 4 ) ;
AV_WL16 ( dst16 + xp + 1 , c - > rgbgamma [ g ] < < 4 ) ;
AV_WL16 ( dst16 + xp + 2 , c - > rgbgamma [ b ] < < 4 ) ;
}
}
src + = stride ;
dst + = stride ;
src + = src_stride ;
dst + = dst_stride ;
}
}
static void rgb48Toxyz12 ( struct SwsContext * c , uint16 _t * dst ,
const uint16 _t * src , int stride , int w , int h )
static void rgb48Toxyz12 ( struct SwsContext * c , uint8 _t * dst , int dst_stride ,
const uint8 _t * src , int src_ stride, int w , int h )
{
const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get ( c - > dstFormat ) ;
for ( int yp = 0 ; yp < h ; yp + + ) {
uint16_t * src16 = ( uint16_t * ) src ;
uint16_t * dst16 = ( uint16_t * ) dst ;
for ( int xp = 0 ; xp < 3 * w ; xp + = 3 ) {
int x , y , z , r , g , b ;
if ( desc - > flags & AV_PIX_FMT_FLAG_BE ) {
r = AV_RB16 ( src + xp + 0 ) ;
g = AV_RB16 ( src + xp + 1 ) ;
b = AV_RB16 ( src + xp + 2 ) ;
r = AV_RB16 ( src16 + xp + 0 ) ;
g = AV_RB16 ( src16 + xp + 1 ) ;
b = AV_RB16 ( src16 + xp + 2 ) ;
} else {
r = AV_RL16 ( src + xp + 0 ) ;
g = AV_RL16 ( src + xp + 1 ) ;
b = AV_RL16 ( src + xp + 2 ) ;
r = AV_RL16 ( src16 + xp + 0 ) ;
g = AV_RL16 ( src16 + xp + 1 ) ;
b = AV_RL16 ( src16 + xp + 2 ) ;
}
r = c - > rgbgammainv [ r > > 4 ] ;
@ -733,17 +740,18 @@ static void rgb48Toxyz12(struct SwsContext *c, uint16_t *dst,
// convert from XYZlinear to X'Y'Z' and scale from 12bit to 16bit
if ( desc - > flags & AV_PIX_FMT_FLAG_BE ) {
AV_WB16 ( dst + xp + 0 , c - > xyzgammainv [ x ] < < 4 ) ;
AV_WB16 ( dst + xp + 1 , c - > xyzgammainv [ y ] < < 4 ) ;
AV_WB16 ( dst + xp + 2 , c - > xyzgammainv [ z ] < < 4 ) ;
AV_WB16 ( dst16 + xp + 0 , c - > xyzgammainv [ x ] < < 4 ) ;
AV_WB16 ( dst16 + xp + 1 , c - > xyzgammainv [ y ] < < 4 ) ;
AV_WB16 ( dst16 + xp + 2 , c - > xyzgammainv [ z ] < < 4 ) ;
} else {
AV_WL16 ( dst + xp + 0 , c - > xyzgammainv [ x ] < < 4 ) ;
AV_WL16 ( dst + xp + 1 , c - > xyzgammainv [ y ] < < 4 ) ;
AV_WL16 ( dst + xp + 2 , c - > xyzgammainv [ z ] < < 4 ) ;
AV_WL16 ( dst16 + xp + 0 , c - > xyzgammainv [ x ] < < 4 ) ;
AV_WL16 ( dst16 + xp + 1 , c - > xyzgammainv [ y ] < < 4 ) ;
AV_WL16 ( dst16 + xp + 2 , c - > xyzgammainv [ z ] < < 4 ) ;
}
}
src + = stride ;
dst + = stride ;
src + = src_stride ;
dst + = dst_stride ;
}
}
@ -993,8 +1001,7 @@ static int scale_internal(SwsContext *c,
base = srcStride [ 0 ] < 0 ? c - > xyz_scratch - srcStride [ 0 ] * ( srcSliceH - 1 ) :
c - > xyz_scratch ;
xyz12Torgb48 ( c , ( uint16_t * ) base , ( const uint16_t * ) src2 [ 0 ] , srcStride [ 0 ] / 2 ,
c - > srcW , srcSliceH ) ;
xyz12Torgb48 ( c , base , srcStride [ 0 ] , src2 [ 0 ] , srcStride [ 0 ] , c - > srcW , srcSliceH ) ;
src2 [ 0 ] = base ;
}
@ -1052,21 +1059,21 @@ static int scale_internal(SwsContext *c,
}
if ( c - > dstXYZ & & ! ( c - > srcXYZ & & c - > srcW = = c - > dstW & & c - > srcH = = c - > dstH ) ) {
uint16 _t * dst16 ;
uint8 _t * dst ;
if ( scale_dst ) {
dst16 = ( uint16_t * ) dst2 [ 0 ] ;
dst = dst2 [ 0 ] ;
} else {
int dstY = c - > dstY ? c - > dstY : srcSliceY + srcSliceH ;
av_assert0 ( dstY > = ret ) ;
av_assert0 ( ret > = 0 ) ;
av_assert0 ( c - > dstH > = dstY ) ;
dst16 = ( uint16_t * ) ( dst2 [ 0 ] + ( dstY - ret ) * dstStride2 [ 0 ] ) ;
dst = dst2 [ 0 ] + ( dstY - ret ) * dstStride2 [ 0 ] ;
}
/* replace on the same data */
rgb48Toxyz12 ( c , dst16 , dst16 , dstStride2 [ 0 ] / 2 , c - > dstW , ret ) ;
rgb48Toxyz12 ( c , dst , dstStride2 [ 0 ] , dst , dstStride2 [ 0 ] , c - > dstW , ret ) ;
}
/* reset slice direction at end of frame */