|
@@ -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)){
|