@ -18,22 +18,23 @@
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# include <assert.h>
# include <inttypes.h>
# include <string.h>
# include <math.h>
# include <stdio.h>
# include "config.h"
# include <assert.h>
# include "swscale.h"
# include "swscale_internal.h"
# include "rgb2rgb.h"
# include <string.h>
# include "libavutil/avassert.h"
# include "libavutil/intreadwrite.h"
# include "libavutil/cpu.h"
# include "libavutil/avutil.h"
# include "libavutil/mathematics.h"
# include "libavutil/bswap.h"
# include "libavutil/cpu.h"
# include "libavutil/intreadwrite.h"
# include "libavutil/mathematics.h"
# include "libavutil/pixdesc.h"
# include "config.h"
# include "rgb2rgb.h"
# include "swscale_internal.h"
# include "swscale.h"
DECLARE_ALIGNED ( 8 , const uint8_t , dither_8x8_128 ) [ 8 ] [ 8 ] = {
{ 36 , 68 , 60 , 92 , 34 , 66 , 58 , 90 , } ,
@ -45,13 +46,13 @@ DECLARE_ALIGNED(8, const uint8_t, dither_8x8_128)[8][8] = {
{ 48 , 80 , 40 , 72 , 54 , 86 , 46 , 78 , } ,
{ 112 , 16 , 104 , 8 , 118 , 22 , 110 , 14 , } ,
} ;
DECLARE_ALIGNED ( 8 , const uint8_t , ff_sws_pb_64 ) [ 8 ] =
{ 64 , 64 , 64 , 64 , 64 , 64 , 64 , 64 } ;
DECLARE_ALIGNED ( 8 , const uint8_t , ff_sws_pb_64 ) [ 8 ] = {
64 , 64 , 64 , 64 , 64 , 64 , 64 , 64
} ;
static av_always_inline void fillPlane ( uint8_t * plane , int stride ,
int width , int height ,
int y , uint8_t val )
static av_always_inline void fillPlane ( uint8_t * plane , int stride , int width ,
int height , int y , uint8_t val )
{
int i ;
uint8_t * ptr = plane + stride * y ;
@ -61,8 +62,8 @@ static av_always_inline void fillPlane(uint8_t* plane, int stride,
}
}
static void hScale16To19_c ( SwsContext * c , int16_t * _dst , int dstW , const uint8_t * _src ,
const int16_t * filter ,
static void hScale16To19_c ( SwsContext * c , int16_t * _dst , int dstW ,
const uint8_t * _src , const int16_t * filter ,
const int32_t * filterPos , int filterSize )
{
int i ;
@ -87,8 +88,8 @@ static void hScale16To19_c(SwsContext *c, int16_t *_dst, int dstW, const uint8_t
}
}
static void hScale16To15_c ( SwsContext * c , int16_t * dst , int dstW , const uint8_t * _src ,
const int16_t * filter ,
static void hScale16To15_c ( SwsContext * c , int16_t * dst , int dstW ,
const uint8_t * _src , const int16_t * filter ,
const int32_t * filterPos , int filterSize )
{
int i ;
@ -112,9 +113,9 @@ static void hScale16To15_c(SwsContext *c, int16_t *dst, int dstW, const uint8_t
}
// bilinear / bicubic scaling
static void hScale8To15_c ( SwsContext * c , int16_t * dst , int dstW , const uint8_t * src ,
const int16_t * filter , const int32 _t * filterPos ,
int filterSize )
static void hScale8To15_c ( SwsContext * c , int16_t * dst , int dstW ,
const uint8_t * src , const int16 _t * filter ,
const int32_t * filterPos , int filterSize )
{
int i ;
for ( i = 0 ; i < dstW ; i + + ) {
@ -124,15 +125,13 @@ static void hScale8To15_c(SwsContext *c, int16_t *dst, int dstW, const uint8_t *
for ( j = 0 ; j < filterSize ; j + + ) {
val + = ( ( int ) src [ srcPos + j ] ) * filter [ filterSize * i + j ] ;
}
//filter += hFilterSize;
dst [ i ] = FFMIN ( val > > 7 , ( 1 < < 15 ) - 1 ) ; // the cubic equation does overflow ...
//dst[i] = val>>7;
}
}
static void hScale8To19_c ( SwsContext * c , int16_t * _dst , int dstW , const uint8_t * src ,
const int16_t * filter , const int32 _t * filterPos ,
int filterSize )
static void hScale8To19_c ( SwsContext * c , int16_t * _dst , int dstW ,
const uint8_t * src , const int16 _t * filter ,
const int32_t * filterPos , int filterSize )
{
int i ;
int32_t * dst = ( int32_t * ) _dst ;
@ -143,9 +142,7 @@ static void hScale8To19_c(SwsContext *c, int16_t *_dst, int dstW, const uint8_t
for ( j = 0 ; j < filterSize ; j + + ) {
val + = ( ( int ) src [ srcPos + j ] ) * filter [ filterSize * i + j ] ;
}
//filter += hFilterSize;
dst [ i ] = FFMIN ( val > > 3 , ( 1 < < 19 ) - 1 ) ; // the cubic equation does overflow ...
//dst[i] = val>>7;
}
}
@ -159,6 +156,7 @@ static void chrRangeToJpeg_c(int16_t *dstU, int16_t *dstV, int width)
dstV [ i ] = ( FFMIN ( dstV [ i ] , 30775 ) * 4663 - 9289992 ) > > 12 ; // -264
}
}
static void chrRangeFromJpeg_c ( int16_t * dstU , int16_t * dstV , int width )
{
int i ;
@ -167,12 +165,14 @@ static void chrRangeFromJpeg_c(int16_t *dstU, int16_t *dstV, int width)
dstV [ i ] = ( dstV [ i ] * 1799 + 4081085 ) > > 11 ; // 1469
}
}
static void lumRangeToJpeg_c ( int16_t * dst , int width )
{
int i ;
for ( i = 0 ; i < width ; i + + )
dst [ i ] = ( FFMIN ( dst [ i ] , 30189 ) * 19077 - 39057361 ) > > 14 ;
}
static void lumRangeFromJpeg_c ( int16_t * dst , int width )
{
int i ;
@ -190,6 +190,7 @@ static void chrRangeToJpeg16_c(int16_t *_dstU, int16_t *_dstV, int width)
dstV [ i ] = ( FFMIN ( dstV [ i ] , 30775 < < 4 ) * 4663 - ( 9289992 < < 4 ) ) > > 12 ; // -264
}
}
static void chrRangeFromJpeg16_c ( int16_t * _dstU , int16_t * _dstV , int width )
{
int i ;
@ -200,6 +201,7 @@ static void chrRangeFromJpeg16_c(int16_t *_dstU, int16_t *_dstV, int width)
dstV [ i ] = ( dstV [ i ] * 1799 + ( 4081085 < < 4 ) ) > > 11 ; // 1469
}
}
static void lumRangeToJpeg16_c ( int16_t * _dst , int width )
{
int i ;
@ -207,6 +209,7 @@ static void lumRangeToJpeg16_c(int16_t *_dst, int width)
for ( i = 0 ; i < width ; i + + )
dst [ i ] = ( FFMIN ( dst [ i ] , 30189 < < 4 ) * 4769 - ( 39057361 < < 2 ) ) > > 12 ;
}
static void lumRangeFromJpeg16_c ( int16_t * _dst , int width )
{
int i ;
@ -232,13 +235,16 @@ static void hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth,
// *** horizontal scale Y line to temp buffer
static av_always_inline void hyscale ( SwsContext * c , int16_t * dst , int dstWidth ,
const uint8_t * src_in [ 4 ] , int srcW , int xInc ,
const uint8_t * src_in [ 4 ] ,
int srcW , int xInc ,
const int16_t * hLumFilter ,
const int32_t * hLumFilterPos , int hLumFilterSize ,
const int32_t * hLumFilterPos ,
int hLumFilterSize ,
uint8_t * formatConvBuffer ,
uint32_t * pal , int isAlpha )
{
void ( * toYV12 ) ( uint8_t * , const uint8_t * , const uint8_t * , const uint8_t * , int , uint32_t * ) = isAlpha ? c - > alpToYV12 : c - > lumToYV12 ;
void ( * toYV12 ) ( uint8_t * , const uint8_t * , const uint8_t * , const uint8_t * , int , uint32_t * ) =
isAlpha ? c - > alpToYV12 : c - > lumToYV12 ;
void ( * convertRange ) ( int16_t * , int ) = isAlpha ? NULL : c - > lumConvertRange ;
const uint8_t * src = src_in [ isAlpha ? 3 : 0 ] ;
@ -251,7 +257,8 @@ static av_always_inline void hyscale(SwsContext *c, int16_t *dst, int dstWidth,
}
if ( ! c - > hyscale_fast ) {
c - > hyScale ( c , dst , dstWidth , src , hLumFilter , hLumFilterPos , hLumFilterSize ) ;
c - > hyScale ( c , dst , dstWidth , src , hLumFilter ,
hLumFilterPos , hLumFilterSize ) ;
} else { // fast bilinear upscale / crap downscale
c - > hyscale_fast ( c , dst , dstWidth , src , srcW , xInc ) ;
}
@ -279,20 +286,25 @@ static void hcscale_fast_c(SwsContext *c, int16_t *dst1, int16_t *dst2,
}
}
static av_always_inline void hcscale ( SwsContext * c , int16_t * dst1 , int16_t * dst2 , int dstWidth ,
static av_always_inline void hcscale ( SwsContext * c , int16_t * dst1 ,
int16_t * dst2 , int dstWidth ,
const uint8_t * src_in [ 4 ] ,
int srcW , int xInc , const int16_t * hChrFilter ,
const int32_t * hChrFilterPos , int hChrFilterSize ,
int srcW , int xInc ,
const int16_t * hChrFilter ,
const int32_t * hChrFilterPos ,
int hChrFilterSize ,
uint8_t * formatConvBuffer , uint32_t * pal )
{
const uint8_t * src1 = src_in [ 1 ] , * src2 = src_in [ 2 ] ;
if ( c - > chrToYV12 ) {
uint8_t * buf2 = formatConvBuffer + FFALIGN ( srcW * 2 + 78 , 16 ) ;
uint8_t * buf2 = formatConvBuffer +
FFALIGN ( srcW * 2 + 78 , 16 ) ;
c - > chrToYV12 ( formatConvBuffer , buf2 , src_in [ 0 ] , src1 , src2 , srcW , pal ) ;
src1 = formatConvBuffer ;
src2 = buf2 ;
} else if ( c - > readChrPlanar ) {
uint8_t * buf2 = formatConvBuffer + FFALIGN ( srcW * 2 + 78 , 16 ) ;
uint8_t * buf2 = formatConvBuffer +
FFALIGN ( srcW * 2 + 78 , 16 ) ;
c - > readChrPlanar ( formatConvBuffer , buf2 , src_in , srcW ) ;
src1 = formatConvBuffer ;
src2 = buf2 ;
@ -310,13 +322,16 @@ static av_always_inline void hcscale(SwsContext *c, int16_t *dst1, int16_t *dst2
}
# define DEBUG_SWSCALE_BUFFERS 0
# define DEBUG_BUFFERS(...) if (DEBUG_SWSCALE_BUFFERS) av_log(c, AV_LOG_DEBUG, __VA_ARGS__)
# define DEBUG_BUFFERS(...) \
if ( DEBUG_SWSCALE_BUFFERS ) \
av_log ( c , AV_LOG_DEBUG , __VA_ARGS__ )
static int swScale ( SwsContext * c , const uint8_t * src [ ] ,
int srcStride [ ] , int srcSliceY ,
int srcSliceH , uint8_t * dst [ ] , int dstStride [ ] )
{
/* load a few things into local vars to make the code more readable? and faster */
/* load a few things into local vars to make the code more readable?
* and faster */
const int srcW = c - > srcW ;
const int dstW = c - > dstW ;
const int dstH = c - > dstH ;
@ -330,6 +345,8 @@ static int swScale(SwsContext *c, const uint8_t* src[],
int32_t * vChrFilterPos = c - > vChrFilterPos ;
int32_t * hLumFilterPos = c - > hLumFilterPos ;
int32_t * hChrFilterPos = c - > hChrFilterPos ;
int16_t * vLumFilter = c - > vLumFilter ;
int16_t * vChrFilter = c - > vChrFilter ;
int16_t * hLumFilter = c - > hLumFilter ;
int16_t * hChrFilter = c - > hChrFilter ;
int32_t * lumMmxFilter = c - > lumMmxFilter ;
@ -345,18 +362,18 @@ static int swScale(SwsContext *c, const uint8_t* src[],
const int vLumBufSize = c - > vLumBufSize ;
const int vChrBufSize = c - > vChrBufSize ;
uint8_t * formatConvBuffer = c - > formatConvBuffer ;
const int chrSrcSliceY = srcSliceY > > c - > chrSrcVSubSample ;
const int chrSrcSliceH = - ( ( - srcSliceH ) > > c - > chrSrcVSubSample ) ;
int lastDstY ;
uint32_t * pal = c - > pal_yuv ;
int should_dither = isNBPS ( c - > srcFormat ) | | is16BPS ( c - > srcFormat ) ;
yuv2planar1_fn yuv2plane1 = c - > yuv2plane1 ;
yuv2planarX_fn yuv2planeX = c - > yuv2planeX ;
yuv2interleavedX_fn yuv2nv12cX = c - > yuv2nv12cX ;
yuv2packed1_fn yuv2packed1 = c - > yuv2packed1 ;
yuv2packed2_fn yuv2packed2 = c - > yuv2packed2 ;
yuv2packedX_fn yuv2packedX = c - > yuv2packedX ;
const int chrSrcSliceY = srcSliceY > > c - > chrSrcVSubSample ;
const int chrSrcSliceH = - ( ( - srcSliceH ) > > c - > chrSrcVSubSample ) ;
int should_dither = is9_OR_10BPS ( c - > srcFormat ) | |
is16BPS ( c - > srcFormat ) ;
int lastDstY ;
/* vars which will change and which we need to store back in the context */
int dstY = c - > dstY ;
@ -379,17 +396,21 @@ static int swScale(SwsContext *c, const uint8_t* src[],
srcStride [ 2 ] < < = c - > vChrDrop ;
DEBUG_BUFFERS ( " swScale() %p[%d] %p[%d] %p[%d] %p[%d] -> %p[%d] %p[%d] %p[%d] %p[%d] \n " ,
src [ 0 ] , srcStride [ 0 ] , src [ 1 ] , srcStride [ 1 ] , src [ 2 ] , srcStride [ 2 ] , src [ 3 ] , srcStride [ 3 ] ,
dst [ 0 ] , dstStride [ 0 ] , dst [ 1 ] , dstStride [ 1 ] , dst [ 2 ] , dstStride [ 2 ] , dst [ 3 ] , dstStride [ 3 ] ) ;
src [ 0 ] , srcStride [ 0 ] , src [ 1 ] , srcStride [ 1 ] ,
src [ 2 ] , srcStride [ 2 ] , src [ 3 ] , srcStride [ 3 ] ,
dst [ 0 ] , dstStride [ 0 ] , dst [ 1 ] , dstStride [ 1 ] ,
dst [ 2 ] , dstStride [ 2 ] , dst [ 3 ] , dstStride [ 3 ] ) ;
DEBUG_BUFFERS ( " srcSliceY: %d srcSliceH: %d dstY: %d dstH: %d \n " ,
srcSliceY , srcSliceH , dstY , dstH ) ;
DEBUG_BUFFERS ( " vLumFilterSize: %d vLumBufSize: %d vChrFilterSize: %d vChrBufSize: %d \n " ,
vLumFilterSize , vLumBufSize , vChrFilterSize , vChrBufSize ) ;
if ( dstStride [ 0 ] % 16 ! = 0 | | dstStride [ 1 ] % 16 ! = 0 | | dstStride [ 2 ] % 16 ! = 0 | | dstStride [ 3 ] % 16 ! = 0 ) {
static int warnedAlready = 0 ; //FIXME move this into the context perhaps
if ( dstStride [ 0 ] % 16 ! = 0 | | dstStride [ 1 ] % 16 ! = 0 | |
dstStride [ 2 ] % 16 ! = 0 | | dstStride [ 3 ] % 16 ! = 0 ) {
static int warnedAlready = 0 ; // FIXME maybe move this into the context
if ( flags & SWS_PRINT_INFO & & ! warnedAlready ) {
av_log ( c , AV_LOG_WARNING , " Warning: dstStride is not aligned! \n "
av_log ( c , AV_LOG_WARNING ,
" Warning: dstStride is not aligned! \n "
" ->cannot do aligned memory accesses anymore \n " ) ;
warnedAlready = 1 ;
}
@ -408,8 +429,8 @@ static int swScale(SwsContext *c, const uint8_t* src[],
}
/* Note the user might start scaling the picture in the middle so this
will not get executed . This is not really intended but works
currently , so people might do it . */
* will not get executed . This is not really intended but works
* currently , so people might do it . */
if ( srcSliceY = = 0 ) {
lumBufIndex = - 1 ;
chrBufIndex = - 1 ;
@ -433,9 +454,11 @@ static int swScale(SwsContext *c, const uint8_t* src[],
} ;
int use_mmx_vfilter = c - > use_mmx_vfilter ;
const int firstLumSrcY = FFMAX ( 1 - vLumFilterSize , vLumFilterPos [ dstY ] ) ; //First line needed as input
// First line needed as input
const int firstLumSrcY = FFMAX ( 1 - vLumFilterSize , vLumFilterPos [ dstY ] ) ;
const int firstLumSrcY2 = FFMAX ( 1 - vLumFilterSize , vLumFilterPos [ FFMIN ( dstY | ( ( 1 < < c - > chrDstVSubSample ) - 1 ) , dstH - 1 ) ] ) ;
const int firstChrSrcY = FFMAX ( 1 - vChrFilterSize , vChrFilterPos [ chrDstY ] ) ; //First line needed as input
// First line needed as input
const int firstChrSrcY = FFMAX ( 1 - vChrFilterSize , vChrFilterPos [ chrDstY ] ) ;
// Last line needed as input
int lastLumSrcY = FFMIN ( c - > srcH , firstLumSrcY + vLumFilterSize ) - 1 ;
@ -444,8 +467,10 @@ static int swScale(SwsContext *c, const uint8_t* src[],
int enough_lines ;
// handle holes (FAST_BILINEAR & weird filters)
if ( firstLumSrcY > lastInLumBuf ) lastInLumBuf = firstLumSrcY - 1 ;
if ( firstChrSrcY > lastInChrBuf ) lastInChrBuf = firstChrSrcY - 1 ;
if ( firstLumSrcY > lastInLumBuf )
lastInLumBuf = firstLumSrcY - 1 ;
if ( firstChrSrcY > lastInChrBuf )
lastInChrBuf = firstChrSrcY - 1 ;
assert ( firstLumSrcY > = lastInLumBuf - vLumBufSize + 1 ) ;
assert ( firstChrSrcY > = lastInChrBuf - vChrBufSize + 1 ) ;
@ -456,7 +481,8 @@ static int swScale(SwsContext *c, const uint8_t* src[],
firstChrSrcY , lastChrSrcY , lastInChrBuf ) ;
// Do we have enough lines in this slice to output the dstY line
enough_lines = lastLumSrcY2 < srcSliceY + srcSliceH & & lastChrSrcY < - ( ( - srcSliceY - srcSliceH ) > > c - > chrSrcVSubSample ) ;
enough_lines = lastLumSrcY2 < srcSliceY + srcSliceH & &
lastChrSrcY < - ( ( - srcSliceY - srcSliceH ) > > c - > chrSrcVSubSample ) ;
if ( ! enough_lines ) {
lastLumSrcY = srcSliceY + srcSliceH - 1 ;
@ -479,13 +505,11 @@ static int swScale(SwsContext *c, const uint8_t* src[],
assert ( lastInLumBuf + 1 - srcSliceY > = 0 ) ;
hyscale ( c , lumPixBuf [ lumBufIndex ] , dstW , src1 , srcW , lumXInc ,
hLumFilter , hLumFilterPos , hLumFilterSize ,
formatConvBuffer ,
pal , 0 ) ;
formatConvBuffer , pal , 0 ) ;
if ( CONFIG_SWSCALE_ALPHA & & alpPixBuf )
hyscale ( c , alpPixBuf [ lumBufIndex ] , dstW , src1 , srcW ,
lumXInc , hLumFilter , hLumFilterPos , hLumFilterSize ,
formatConvBuffer ,
pal , 1 ) ;
formatConvBuffer , pal , 1 ) ;
lastInLumBuf + + ;
DEBUG_BUFFERS ( " \t \t lumBufIndex %d: lastInLumBuf: %d \n " ,
lumBufIndex , lastInLumBuf ) ;
@ -513,20 +537,24 @@ static int swScale(SwsContext *c, const uint8_t* src[],
chrBufIndex , lastInChrBuf ) ;
}
// wrap buf index around to stay inside the ring buffer
if ( lumBufIndex > = vLumBufSize ) lumBufIndex - = vLumBufSize ;
if ( chrBufIndex > = vChrBufSize ) chrBufIndex - = vChrBufSize ;
if ( lumBufIndex > = vLumBufSize )
lumBufIndex - = vLumBufSize ;
if ( chrBufIndex > = vChrBufSize )
chrBufIndex - = vChrBufSize ;
if ( ! enough_lines )
break ; // we can't output a dstY line so let's try with the next slice
# if HAVE_MMX
updateMMXDitherTables ( c , dstY , lumBufIndex , chrBufIndex , lastInLumBuf , lastInChrBuf ) ;
updateMMXDitherTables ( c , dstY , lumBufIndex , chrBufIndex ,
lastInLumBuf , lastInChrBuf ) ;
# endif
if ( should_dither ) {
c - > chrDither8 = dither_8x8_128 [ chrDstY & 7 ] ;
c - > lumDither8 = dither_8x8_128 [ dstY & 7 ] ;
}
if ( dstY > = dstH - 2 ) {
// hmm looks like we can't use MMX here without overwriting this array's tail
/* hmm looks like we can't use MMX here without overwriting
* this array ' s tail */
ff_sws_init_output_funcs ( c , & yuv2plane1 , & yuv2planeX , & yuv2nv12cX ,
& yuv2packed1 , & yuv2packed2 , & yuv2packedX ) ;
use_mmx_vfilter = 0 ;
@ -536,11 +564,13 @@ static int swScale(SwsContext *c, const uint8_t* src[],
const int16_t * * lumSrcPtr = ( const int16_t * * ) ( void * ) lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize ;
const int16_t * * chrUSrcPtr = ( const int16_t * * ) ( void * ) chrUPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize ;
const int16_t * * chrVSrcPtr = ( const int16_t * * ) ( void * ) chrVPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize ;
const int16_t * * alpSrcPtr = ( CONFIG_SWSCALE_ALPHA & & alpPixBuf ) ? ( const int16_t * * ) ( void * ) alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL ;
const int16_t * * alpSrcPtr = ( CONFIG_SWSCALE_ALPHA & & alpPixBuf ) ?
( const int16_t * * ) ( void * ) alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL ;
int16_t * vLumFilter = c - > vLumFilter ;
int16_t * vChrFilter = c - > vChrFilter ;
if ( isPlanarYUV ( dstFormat ) | | ( isGray ( dstFormat ) & & ! isALPHA ( dstFormat ) ) ) { //YV12 like
if ( isPlanarYUV ( dstFormat ) | |
( isGray ( dstFormat ) & & ! isALPHA ( dstFormat ) ) ) { // YV12 like
const int chrSkipMask = ( 1 < < c - > chrDstVSubSample ) - 1 ;
vLumFilter + = dstY * vLumFilterSize ;
@ -564,20 +594,25 @@ static int swScale(SwsContext *c, const uint8_t* src[],
yuv2plane1 ( lumSrcPtr [ 0 ] , dest [ 0 ] , dstW , c - > lumDither8 , 0 ) ;
} else {
yuv2planeX ( vLumFilter , vLumFilterSize ,
lumSrcPtr , dest [ 0 ] , dstW , c - > lumDither8 , 0 ) ;
lumSrcPtr , dest [ 0 ] ,
dstW , c - > lumDither8 , 0 ) ;
}
if ( ! ( ( dstY & chrSkipMask ) | | isGray ( dstFormat ) ) ) {
if ( yuv2nv12cX ) {
yuv2nv12cX ( c , vChrFilter , vChrFilterSize , chrUSrcPtr , chrVSrcPtr , dest [ 1 ] , chrDstW ) ;
yuv2nv12cX ( c , vChrFilter ,
vChrFilterSize , chrUSrcPtr , chrVSrcPtr ,
dest [ 1 ] , chrDstW ) ;
} else if ( vChrFilterSize = = 1 ) {
yuv2plane1 ( chrUSrcPtr [ 0 ] , dest [ 1 ] , chrDstW , c - > chrDither8 , 0 ) ;
yuv2plane1 ( chrVSrcPtr [ 0 ] , dest [ 2 ] , chrDstW , c - > chrDither8 , 3 ) ;
} else {
yuv2planeX ( vChrFilter , vChrFilterSize ,
chrUSrcPtr , dest [ 1 ] , chrDstW , c - > chrDither8 , 0 ) ;
yuv2planeX ( vChrFilter , vChrFilterSize ,
chrVSrcPtr , dest [ 2 ] , chrDstW , c - > chrDither8 , use_mmx_vfilter ? ( c - > uv_offx2 > > 1 ) : 3 ) ;
yuv2planeX ( vChrFilter ,
vChrFilterSize , chrUSrcPtr , dest [ 1 ] ,
chrDstW , c - > chrDither8 , 0 ) ;
yuv2planeX ( vChrFilter ,
vChrFilterSize , chrVSrcPtr , dest [ 2 ] ,
chrDstW , c - > chrDither8 , use_mmx_vfilter ? ( c - > uv_offx2 > > 1 ) : 3 ) ;
}
}
@ -586,21 +621,25 @@ static int swScale(SwsContext *c, const uint8_t* src[],
vLumFilter = c - > alpMmxFilter ;
}
if ( vLumFilterSize = = 1 ) {
yuv2plane1 ( alpSrcPtr [ 0 ] , dest [ 3 ] , dstW , c - > lumDither8 , 0 ) ;
yuv2plane1 ( alpSrcPtr [ 0 ] , dest [ 3 ] , dstW ,
c - > lumDither8 , 0 ) ;
} else {
yuv2planeX ( vLumFilter , vLumFilterSize ,
alpSrcPtr , dest [ 3 ] , dstW , c - > lumDither8 , 0 ) ;
yuv2planeX ( vLumFilter ,
vLumFilterSize , alpSrcPtr , dest [ 3 ] ,
dstW , c - > lumDither8 , 0 ) ;
}
}
} else {
assert ( lumSrcPtr + vLumFilterSize - 1 < lumPixBuf + vLumBufSize * 2 ) ;
assert ( chrUSrcPtr + vChrFilterSize - 1 < chrUPixBuf + vChrBufSize * 2 ) ;
if ( c - > yuv2packed1 & & vLumFilterSize = = 1 & & vChrFilterSize < = 2 ) { //unscaled RGB
if ( c - > yuv2packed1 & & vLumFilterSize = = 1 & &
vChrFilterSize < = 2 ) { // unscaled RGB
int chrAlpha = vChrFilterSize = = 1 ? 0 : vChrFilter [ 2 * dstY + 1 ] ;
yuv2packed1 ( c , * lumSrcPtr , chrUSrcPtr , chrVSrcPtr ,
alpPixBuf ? * alpSrcPtr : NULL ,
dest [ 0 ] , dstW , chrAlpha , dstY ) ;
} else if ( c - > yuv2packed2 & & vLumFilterSize = = 2 & & vChrFilterSize = = 2 ) { //bilinear upscale RGB
} else if ( c - > yuv2packed2 & & vLumFilterSize = = 2 & &
vChrFilterSize = = 2 ) { // bilinear upscale RGB
int lumAlpha = vLumFilter [ 2 * dstY + 1 ] ;
int chrAlpha = vChrFilter [ 2 * dstY + 1 ] ;
lumMmxFilter [ 2 ] =
@ -662,7 +701,8 @@ static av_cold void sws_init_swScale_c(SwsContext *c)
c - > hyScale = c - > hcScale = hScale8To19_c ;
}
} else {
c - > hyScale = c - > hcScale = c - > dstBpc > 10 ? hScale16To19_c : hScale16To15_c ;
c - > hyScale = c - > hcScale = c - > dstBpc > 10 ? hScale16To19_c
: hScale16To15_c ;
}
if ( c - > srcRange ! = c - > dstRange & & ! isAnyRGB ( c - > dstFormat ) ) {