|
@@ -180,6 +180,47 @@ static int nv12ToPlanarWrapper(SwsContext *c, const uint8_t *src[],
|
|
|
return srcSliceH;
|
|
|
}
|
|
|
|
|
|
+static int planarToNv24Wrapper(SwsContext *c, const uint8_t *src[],
|
|
|
+ int srcStride[], int srcSliceY,
|
|
|
+ int srcSliceH, uint8_t *dstParam[],
|
|
|
+ int dstStride[])
|
|
|
+{
|
|
|
+ uint8_t *dst = dstParam[1] + dstStride[1] * srcSliceY;
|
|
|
+
|
|
|
+ copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->srcW,
|
|
|
+ dstParam[0], dstStride[0]);
|
|
|
+
|
|
|
+ if (c->dstFormat == AV_PIX_FMT_NV24)
|
|
|
+ interleaveBytes(src[1], src[2], dst, c->chrSrcW, srcSliceH,
|
|
|
+ srcStride[1], srcStride[2], dstStride[1]);
|
|
|
+ else
|
|
|
+ interleaveBytes(src[2], src[1], dst, c->chrSrcW, srcSliceH,
|
|
|
+ srcStride[2], srcStride[1], dstStride[1]);
|
|
|
+
|
|
|
+ return srcSliceH;
|
|
|
+}
|
|
|
+
|
|
|
+static int nv24ToPlanarWrapper(SwsContext *c, const uint8_t *src[],
|
|
|
+ int srcStride[], int srcSliceY,
|
|
|
+ int srcSliceH, uint8_t *dstParam[],
|
|
|
+ int dstStride[])
|
|
|
+{
|
|
|
+ uint8_t *dst1 = dstParam[1] + dstStride[1] * srcSliceY;
|
|
|
+ uint8_t *dst2 = dstParam[2] + dstStride[2] * srcSliceY;
|
|
|
+
|
|
|
+ copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->srcW,
|
|
|
+ dstParam[0], dstStride[0]);
|
|
|
+
|
|
|
+ if (c->srcFormat == AV_PIX_FMT_NV24)
|
|
|
+ deinterleaveBytes(src[1], dst1, dst2, c->chrSrcW, srcSliceH,
|
|
|
+ srcStride[1], dstStride[1], dstStride[2]);
|
|
|
+ else
|
|
|
+ deinterleaveBytes(src[1], dst2, dst1, c->chrSrcW, srcSliceH,
|
|
|
+ srcStride[1], dstStride[2], dstStride[1]);
|
|
|
+
|
|
|
+ return srcSliceH;
|
|
|
+}
|
|
|
+
|
|
|
static int planarToP01xWrapper(SwsContext *c, const uint8_t *src8[],
|
|
|
int srcStride[], int srcSliceY,
|
|
|
int srcSliceH, uint8_t *dstParam8[],
|
|
@@ -1872,11 +1913,21 @@ void ff_get_unscaled_swscale(SwsContext *c)
|
|
|
(dstFormat == AV_PIX_FMT_NV12 || dstFormat == AV_PIX_FMT_NV21)) {
|
|
|
c->swscale = planarToNv12Wrapper;
|
|
|
}
|
|
|
+ /* yv24_to_nv24 */
|
|
|
+ if ((srcFormat == AV_PIX_FMT_YUV444P || srcFormat == AV_PIX_FMT_YUVA444P) &&
|
|
|
+ (dstFormat == AV_PIX_FMT_NV24 || dstFormat == AV_PIX_FMT_NV42)) {
|
|
|
+ c->swscale = planarToNv24Wrapper;
|
|
|
+ }
|
|
|
/* nv12_to_yv12 */
|
|
|
if (dstFormat == AV_PIX_FMT_YUV420P &&
|
|
|
(srcFormat == AV_PIX_FMT_NV12 || srcFormat == AV_PIX_FMT_NV21)) {
|
|
|
c->swscale = nv12ToPlanarWrapper;
|
|
|
}
|
|
|
+ /* nv24_to_yv24 */
|
|
|
+ if (dstFormat == AV_PIX_FMT_YUV444P &&
|
|
|
+ (srcFormat == AV_PIX_FMT_NV24 || srcFormat == AV_PIX_FMT_NV42)) {
|
|
|
+ c->swscale = nv24ToPlanarWrapper;
|
|
|
+ }
|
|
|
/* yuv2bgr */
|
|
|
if ((srcFormat == AV_PIX_FMT_YUV420P || srcFormat == AV_PIX_FMT_YUV422P ||
|
|
|
srcFormat == AV_PIX_FMT_YUVA420P) && isAnyRGB(dstFormat) &&
|