|
|
@@ -830,7 +830,34 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t *src[],
|
|
|
srcPtr += srcStride[plane];
|
|
|
}
|
|
|
} else if (src_depth <= dst_depth) {
|
|
|
+ int orig_length = length;
|
|
|
for (i = 0; i < height; i++) {
|
|
|
+ if(isBE(c->srcFormat) == HAVE_BIGENDIAN &&
|
|
|
+ isBE(c->dstFormat) == HAVE_BIGENDIAN &&
|
|
|
+ shiftonly) {
|
|
|
+ unsigned shift = dst_depth - src_depth;
|
|
|
+ length = orig_length;
|
|
|
+#if HAVE_FAST_64BIT
|
|
|
+#define FAST_COPY_UP(shift) \
|
|
|
+ for (j = 0; j < length - 3; j += 4) { \
|
|
|
+ uint64_t v = AV_RN64A(srcPtr2 + j); \
|
|
|
+ AV_WN64A(dstPtr2 + j, v << shift); \
|
|
|
+ } \
|
|
|
+ length &= 3;
|
|
|
+#else
|
|
|
+#define FAST_COPY_UP(shift) \
|
|
|
+ for (j = 0; j < length - 1; j += 2) { \
|
|
|
+ uint32_t v = AV_RN32A(srcPtr2 + j); \
|
|
|
+ AV_WN32A(dstPtr2 + j, v << shift); \
|
|
|
+ } \
|
|
|
+ length &= 1;
|
|
|
+#endif
|
|
|
+ switch (shift)
|
|
|
+ {
|
|
|
+ case 6: FAST_COPY_UP(6); break;
|
|
|
+ case 7: FAST_COPY_UP(7); break;
|
|
|
+ }
|
|
|
+ }
|
|
|
#define COPY_UP(r,w) \
|
|
|
if(shiftonly){\
|
|
|
for (j = 0; j < length; j++){ \
|