sws: handle non native rgb<->rgb convertions

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2012-07-17 04:24:24 +02:00
parent 22a279539e
commit 21d8255423
2 changed files with 16 additions and 8 deletions

View File

@ -542,10 +542,6 @@ static rgbConvFn findRgbConvFn(SwsContext *c)
(((bpp + 7) >> 3) == 2 && \ (((bpp + 7) >> 3) == 2 && \
(!(av_pix_fmt_descriptors[fmt].flags & PIX_FMT_BE) != !HAVE_BIGENDIAN)) (!(av_pix_fmt_descriptors[fmt].flags & PIX_FMT_BE) != !HAVE_BIGENDIAN))
/* if this is non-native rgb444/555/565, don't handle it here. */
if (IS_NOT_NE(srcId, srcFormat) || IS_NOT_NE(dstId, dstFormat))
return NULL;
#define CONV_IS(src, dst) (srcFormat == PIX_FMT_##src && dstFormat == PIX_FMT_##dst) #define CONV_IS(src, dst) (srcFormat == PIX_FMT_##src && dstFormat == PIX_FMT_##dst)
if (isRGBA32(srcFormat) && isRGBA32(dstFormat)) { if (isRGBA32(srcFormat) && isRGBA32(dstFormat)) {
@ -632,6 +628,9 @@ static int rgbToRgbWrapper(SwsContext *c, const uint8_t *src[], int srcStride[],
} else { } else {
const uint8_t *srcPtr = src[0]; const uint8_t *srcPtr = src[0];
uint8_t *dstPtr = dst[0]; uint8_t *dstPtr = dst[0];
int src_bswap = IS_NOT_NE(c->srcFormatBpp, srcFormat);
int dst_bswap = IS_NOT_NE(c->dstFormatBpp, dstFormat);
if ((srcFormat == PIX_FMT_RGB32_1 || srcFormat == PIX_FMT_BGR32_1) && if ((srcFormat == PIX_FMT_RGB32_1 || srcFormat == PIX_FMT_BGR32_1) &&
!isRGBA32(dstFormat)) !isRGBA32(dstFormat))
srcPtr += ALT32_CORR; srcPtr += ALT32_CORR;
@ -641,15 +640,23 @@ static int rgbToRgbWrapper(SwsContext *c, const uint8_t *src[], int srcStride[],
dstPtr += ALT32_CORR; dstPtr += ALT32_CORR;
if (dstStride[0] * srcBpp == srcStride[0] * dstBpp && srcStride[0] > 0 && if (dstStride[0] * srcBpp == srcStride[0] * dstBpp && srcStride[0] > 0 &&
!(srcStride[0] % srcBpp)) !(srcStride[0] % srcBpp) && !dst_bswap && !src_bswap)
conv(srcPtr, dstPtr + dstStride[0] * srcSliceY, conv(srcPtr, dstPtr + dstStride[0] * srcSliceY,
srcSliceH * srcStride[0]); srcSliceH * srcStride[0]);
else { else {
int i; int i, j;
dstPtr += dstStride[0] * srcSliceY; dstPtr += dstStride[0] * srcSliceY;
for (i = 0; i < srcSliceH; i++) { for (i = 0; i < srcSliceH; i++) {
if(src_bswap) {
for(j=0; j<c->srcW; j++)
((uint16_t*)c->formatConvBuffer)[j] = av_bswap16(((uint16_t*)srcPtr)[j]);
conv(c->formatConvBuffer, dstPtr, c->srcW * srcBpp);
}else
conv(srcPtr, dstPtr, c->srcW * srcBpp); conv(srcPtr, dstPtr, c->srcW * srcBpp);
if(dst_bswap)
for(j=0; j<c->srcW; j++)
((uint16_t*)dstPtr)[j] = av_bswap16(((uint16_t*)dstPtr)[j]);
srcPtr += srcStride[0]; srcPtr += srcStride[0];
dstPtr += dstStride[0]; dstPtr += dstStride[0];
} }

View File

@ -996,6 +996,8 @@ int sws_init_context(SwsContext *c, SwsFilter *srcFilter, SwsFilter *dstFilter)
c->chrDstW = -((-dstW) >> c->chrDstHSubSample); c->chrDstW = -((-dstW) >> c->chrDstHSubSample);
c->chrDstH = -((-dstH) >> c->chrDstVSubSample); c->chrDstH = -((-dstH) >> c->chrDstVSubSample);
FF_ALLOC_OR_GOTO(c, c->formatConvBuffer, FFALIGN(srcW*2+78, 16) * 2, fail);
/* unscaled special cases */ /* unscaled special cases */
if (unscaled && !usesHFilter && !usesVFilter && if (unscaled && !usesHFilter && !usesVFilter &&
(c->srcRange == c->dstRange || isAnyRGB(dstFormat))) { (c->srcRange == c->dstRange || isAnyRGB(dstFormat))) {
@ -1020,7 +1022,6 @@ int sws_init_context(SwsContext *c, SwsFilter *srcFilter, SwsFilter *dstFilter)
c->srcBpc = 16; c->srcBpc = 16;
if (c->dstBpc == 16) if (c->dstBpc == 16)
dst_stride <<= 1; dst_stride <<= 1;
FF_ALLOC_OR_GOTO(c, c->formatConvBuffer, FFALIGN(srcW*2+78, 16) * 2, fail);
if (HAVE_MMX2 && cpu_flags & AV_CPU_FLAG_MMX2 && if (HAVE_MMX2 && cpu_flags & AV_CPU_FLAG_MMX2 &&
c->srcBpc == 8 && c->dstBpc <= 14) { c->srcBpc == 8 && c->dstBpc <= 14) {
c->canMMX2BeUsed = (dstW >= srcW && (dstW & 31) == 0 && c->canMMX2BeUsed = (dstW >= srcW && (dstW & 31) == 0 &&