X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libswscale%2Fswscale_unscaled.c;h=e8a92c22e2e9e0fec995bb68fa87cf3a15cfa4a9;hb=072a62b50ab4e54ee55585dc06a8e313d713b39f;hp=3344ab451756fff256382a32a40ccb6471aa72eb;hpb=27fbe31c921f49078764a69ccb701dbb767c7410;p=ffmpeg diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c index 3344ab45175..e8a92c22e2e 100644 --- a/libswscale/swscale_unscaled.c +++ b/libswscale/swscale_unscaled.c @@ -444,6 +444,7 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[ int height= (plane==0 || plane==3) ? srcSliceH: -((-srcSliceH)>>c->chrDstVSubSample); const uint8_t *srcPtr= src[plane]; uint8_t *dstPtr= dst[plane] + dstStride[plane]*y; + int shiftonly= plane==1 || plane==2 || (!c->srcRange && plane==0); if (!dst[plane]) continue; // ignore palette for GRAY8 @@ -469,14 +470,19 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[ } } else if (src_depth == 8) { for (i = 0; i < height; i++) { + #define COPY816(w)\ + if(shiftonly){\ + for (j = 0; j < length; j++)\ + w(&dstPtr2[j], srcPtr[j]<<(dst_depth-8));\ + }else{\ + for (j = 0; j < length; j++)\ + w(&dstPtr2[j], (srcPtr[j]<<(dst_depth-8)) |\ + (srcPtr[j]>>(2*8-dst_depth)));\ + } if(isBE(c->dstFormat)){ - for (j = 0; j < length; j++) - AV_WB16(&dstPtr2[j], (srcPtr[j]<<(dst_depth-8)) | - (srcPtr[j]>>(2*8-dst_depth))); + COPY816(AV_WB16) } else { - for (j = 0; j < length; j++) - AV_WL16(&dstPtr2[j], (srcPtr[j]<<(dst_depth-8)) | - (srcPtr[j]>>(2*8-dst_depth))); + COPY816(AV_WL16) } dstPtr2 += dstStride[plane]/2; srcPtr += srcStride[plane]; @@ -484,10 +490,17 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[ } else if (src_depth <= dst_depth) { for (i = 0; i < height; i++) { #define COPY_UP(r,w) \ - for (j = 0; j < length; j++){ \ - unsigned int v= r(&srcPtr2[j]);\ - w(&dstPtr2[j], (v<<(dst_depth-src_depth)) | \ - (v>>(2*src_depth-dst_depth)));\ + if(shiftonly){\ + for (j = 0; j < length; j++){ \ + unsigned int v= r(&srcPtr2[j]);\ + w(&dstPtr2[j], v<<(dst_depth-src_depth));\ + }\ + }else{\ + for (j = 0; j < length; j++){ \ + unsigned int v= r(&srcPtr2[j]);\ + w(&dstPtr2[j], (v<<(dst_depth-src_depth)) | \ + (v>>(2*src_depth-dst_depth)));\ + }\ } if(isBE(c->srcFormat)){ if(isBE(c->dstFormat)){ @@ -659,7 +672,7 @@ static void reset_ptr(const uint8_t* src[], int format) { if(!isALPHA(format)) src[3]=NULL; - if(!isPlanarYUV(format)) { + if(!isPlanar(format)) { src[3]=src[2]=NULL; if (!usePal(format))