From patchwork Wed Dec 4 14:43:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 16595 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 790A9448F91 for ; Wed, 4 Dec 2019 16:52:45 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5DEA968B22A; Wed, 4 Dec 2019 16:52:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 553C468AFD9 for ; Wed, 4 Dec 2019 16:52:43 +0200 (EET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Dec 2019 06:52:41 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,277,1571727600"; d="scan'208";a="385776127" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by orsmga005.jf.intel.com with ESMTP; 04 Dec 2019 06:52:39 -0800 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Wed, 4 Dec 2019 22:43:39 +0800 Message-Id: <1575470619-7913-1-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 Subject: [FFmpeg-devel] [PATCH, v3, 2/7] swscale: Add swscale and fate support for 0YUV X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Add input and output support in swscale for 0YUV. Since AV_PIX_FMT_0RGB would be treated as AV_PIX_FMT_ARGB, the default X(0) channel for 0YUV is set to 0xFF as well. Add fate test for 0YUV. Signed-off-by: Linjie Fu --- libswscale/input.c | 25 ++++++++++++++++ libswscale/output.c | 50 ++++++++++++++++++++++++++++++++ libswscale/swscale_unscaled.c | 40 +++++++++++++++++++++++++ libswscale/utils.c | 1 + libswscale/version.h | 2 +- tests/ref/fate/filter-pixdesc-0yuv | 1 + tests/ref/fate/filter-pixfmts-copy | 1 + tests/ref/fate/filter-pixfmts-crop | 1 + tests/ref/fate/filter-pixfmts-field | 1 + tests/ref/fate/filter-pixfmts-fieldorder | 1 + tests/ref/fate/filter-pixfmts-hflip | 1 + tests/ref/fate/filter-pixfmts-il | 1 + tests/ref/fate/filter-pixfmts-null | 1 + tests/ref/fate/filter-pixfmts-pad | 1 + tests/ref/fate/filter-pixfmts-scale | 1 + tests/ref/fate/filter-pixfmts-transpose | 1 + tests/ref/fate/filter-pixfmts-vflip | 1 + 17 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 tests/ref/fate/filter-pixdesc-0yuv diff --git a/libswscale/input.c b/libswscale/input.c index 064f8da..4973b8c 100644 --- a/libswscale/input.c +++ b/libswscale/input.c @@ -552,6 +552,25 @@ static void yvy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, con av_assert1(src1 == src2); } +static void XyuvToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, + uint32_t *unused) +{ + int i; + for (i = 0; i < width; i++) + dst[i] = src[4 * i + 2]; +} + +static void XyuvToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1, + const uint8_t *src2, int width, uint32_t *unused) +{ + int i; + for (i = 0; i < width; i++) { + dstV[i] = src1[4 * i]; + dstU[i] = src1[4 * i + 1]; + } + av_assert1(src1 == src2); +} + static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused) { @@ -1154,6 +1173,9 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) case AV_PIX_FMT_P016BE: c->chrToYV12 = p016BEToUV_c; break; + case AV_PIX_FMT_0YUV: + c->chrToYV12 = XyuvToUV_c; + break; } if (c->chrSrcHSubSample) { switch (srcFormat) { @@ -1586,6 +1608,9 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) c->lumToYV12 = grayf32ToY16_bswap_c; #endif break; + case AV_PIX_FMT_0YUV: + c->lumToYV12 = XyuvToY_c; + break; } if (c->needAlpha) { if (is16BPS(srcFormat) || isNBPS(srcFormat)) { diff --git a/libswscale/output.c b/libswscale/output.c index d192ea8..e18955d 100644 --- a/libswscale/output.c +++ b/libswscale/output.c @@ -2406,6 +2406,53 @@ yuv2ya8_X_c(SwsContext *c, const int16_t *lumFilter, } static void +yuv2Xyuv_X_c(SwsContext *c, const int16_t *lumFilter, + const int16_t **lumSrc, int lumFilterSize, + const int16_t *chrFilter, const int16_t **chrUSrc, + const int16_t **chrVSrc, int chrFilterSize, + const int16_t **alpSrc, uint8_t *dest, int dstW, int y) +{ + int hasAlpha = !!alpSrc; + int i; + + for (i = 0; i < dstW; i++) { + int j; + int A = 1 << 18; + int Y = 1 << 18; + int U = 1 << 18; + int V = 1 << 18; + + for (j = 0; j < lumFilterSize; j++) { + Y += lumSrc[j][i] * lumFilter[j]; + } + for (j = 0; j < chrFilterSize; j++) { + U += chrUSrc[j][i] * chrFilter[j]; + V += chrVSrc[j][i] * chrFilter[j]; + } + if (hasAlpha) + for (j = 0; j < lumFilterSize; j++) + A += alpSrc[j][i] * lumFilter[j]; + A >>= 19; + Y >>= 19; + U >>= 19; + V >>= 19; + A = hasAlpha ? A : 255; + + if ((A | Y | U | V) & 0x100) { + A = av_clip_uint8(A); + Y = av_clip_uint8(Y); + U = av_clip_uint8(U); + V = av_clip_uint8(V); + } + + dest[4*i] = V; + dest[4*i + 1] = U; + dest[4*i + 2] = Y; + dest[4*i + 3] = A; + } +} + +static void yuv2ayuv64le_X_c(SwsContext *c, const int16_t *lumFilter, const int16_t **_lumSrc, int lumFilterSize, const int16_t *chrFilter, const int16_t **_chrUSrc, @@ -2935,6 +2982,9 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, *yuv2packed2 = yuv2ya16be_2_c; *yuv2packedX = yuv2ya16be_X_c; break; + case AV_PIX_FMT_0YUV: + *yuv2packedX = yuv2Xyuv_X_c; + break; case AV_PIX_FMT_AYUV64LE: *yuv2packedX = yuv2ayuv64le_X_c; break; diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c index d9260c1..d80db8c 100644 --- a/libswscale/swscale_unscaled.c +++ b/libswscale/swscale_unscaled.c @@ -371,6 +371,41 @@ static int yuv422pToUyvyWrapper(SwsContext *c, const uint8_t *src[], return srcSliceH; } +static void yuv444pTo0yuv(const uint8_t *src[], int srcStride[], + uint8_t *dst, int dstStride, int srcSliceH, int width) +{ + int x, h, i; + for (h = 0; h < srcSliceH; h++) { + uint8_t *dest = dst + dstStride * h; + + for (x = 0; x < width; x++) { + *dest++ = src[2][x]; + *dest++ = src[1][x]; + *dest++ = src[0][x]; + *dest++ = 0xFF; + } + + for (i = 0; i < 3; i++) + src[i] += srcStride[i]; + } +} + + +static int yuv444pTo0yuvWrapper(SwsContext *c, const uint8_t *src[], + int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *dstParam[], int dstStride[]) +{ + uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY; + + const uint8_t *source[] = { src[0], src[1], src[2] }; + int stride[] = { srcStride[0], srcStride[1], srcStride[2] }; + + yuv444pTo0yuv(source, stride, dst + srcSliceY * dstStride[0], dstStride[0], + srcSliceH, c->srcW); + + return srcSliceH; +} + static int yuyvToYuv420Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[]) @@ -2087,6 +2122,11 @@ void ff_get_unscaled_swscale(SwsContext *c) c->swscale = yuv422pToUyvyWrapper; } + if (srcFormat == AV_PIX_FMT_YUV444P) { + if (dstFormat == AV_PIX_FMT_0YUV) + c->swscale = yuv444pTo0yuvWrapper; + } + /* uint Y to float Y */ if (srcFormat == AV_PIX_FMT_GRAY8 && dstFormat == AV_PIX_FMT_GRAYF32){ c->swscale = uint_y_to_float_y_wrapper; diff --git a/libswscale/utils.c b/libswscale/utils.c index 57c4fd2..6ed9d3d 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -266,6 +266,7 @@ static const FormatEntry format_entries[AV_PIX_FMT_NB] = { [AV_PIX_FMT_YUVA444P12LE] = { 1, 1 }, [AV_PIX_FMT_NV24] = { 1, 1 }, [AV_PIX_FMT_NV42] = { 1, 1 }, + [AV_PIX_FMT_0YUV] = { 1, 1 }, }; int sws_isSupportedInput(enum AVPixelFormat pix_fmt) diff --git a/libswscale/version.h b/libswscale/version.h index cc434c0..1dbb561 100644 --- a/libswscale/version.h +++ b/libswscale/version.h @@ -28,7 +28,7 @@ #define LIBSWSCALE_VERSION_MAJOR 5 #define LIBSWSCALE_VERSION_MINOR 6 -#define LIBSWSCALE_VERSION_MICRO 100 +#define LIBSWSCALE_VERSION_MICRO 101 #define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \ LIBSWSCALE_VERSION_MINOR, \ diff --git a/tests/ref/fate/filter-pixdesc-0yuv b/tests/ref/fate/filter-pixdesc-0yuv new file mode 100644 index 0000000..fb71b0b --- /dev/null +++ b/tests/ref/fate/filter-pixdesc-0yuv @@ -0,0 +1 @@ +pixdesc-0yuv 25e04681539b84434e6687583d196771 diff --git a/tests/ref/fate/filter-pixfmts-copy b/tests/ref/fate/filter-pixfmts-copy index d19314b..1b9d324 100644 --- a/tests/ref/fate/filter-pixfmts-copy +++ b/tests/ref/fate/filter-pixfmts-copy @@ -1,5 +1,6 @@ 0bgr 4060279c35dd8810a2f55a021b836557 0rgb 527ef3d164c8fd0700493733959689c2 +0yuv 0af13a42f9d0932c5a9bb6a8a5d1c5ee abgr 023ecf6396d324edb113e4a483b79ba2 argb f003b555ef429222005d33844cca9325 ayuv64le 07b9c969dfbe4add4c0626773b151d4f diff --git a/tests/ref/fate/filter-pixfmts-crop b/tests/ref/fate/filter-pixfmts-crop index ab89d06..5f0fafc 100644 --- a/tests/ref/fate/filter-pixfmts-crop +++ b/tests/ref/fate/filter-pixfmts-crop @@ -1,5 +1,6 @@ 0bgr 8a83998de96327cb334538d7a265304e 0rgb 974833c777e6abe6d84dc59af2ca5625 +0yuv 615241c5406eb556fca0ad8606c23a02 abgr 1d21f5b8a20186ac9dd54459c986a2a7 argb 8b822972049a1e207000763f2564d6e0 ayuv64le ab2f7bc8f150af47c42c778e3ea28bce diff --git a/tests/ref/fate/filter-pixfmts-field b/tests/ref/fate/filter-pixfmts-field index 994026d..0f73dc2 100644 --- a/tests/ref/fate/filter-pixfmts-field +++ b/tests/ref/fate/filter-pixfmts-field @@ -1,5 +1,6 @@ 0bgr 8f34406a8e6f293b6468b6941d8944e6 0rgb e2c35753a2271d1f9455b1809bc0e907 +0yuv 3d02eeab336d0a8106f6fdd91be61073 abgr c0eb95959edf5d40ff8af315e62d0f8a argb 6dca4f2987b49b7d63f702d17bace630 ayuv64le d9836decca6323ba88b3b3d02257c0b6 diff --git a/tests/ref/fate/filter-pixfmts-fieldorder b/tests/ref/fate/filter-pixfmts-fieldorder index 3d3eef3..3ad8cdd 100644 --- a/tests/ref/fate/filter-pixfmts-fieldorder +++ b/tests/ref/fate/filter-pixfmts-fieldorder @@ -1,5 +1,6 @@ 0bgr 955efde1695e9f4da276622e462ea9cf 0rgb 2b0f066cfa0bef378a492875d541de8f +0yuv 9e4480c5fcb7c091ec3e517420764ef3 abgr 832924b5351361db68dbdbb96c60ae55 argb 80d08e68cb91bc8f2f817516e65f0bd0 ayuv64le 84ef6260fe02427da946d4a2207fb54c diff --git a/tests/ref/fate/filter-pixfmts-hflip b/tests/ref/fate/filter-pixfmts-hflip index 8712074..04ba795 100644 --- a/tests/ref/fate/filter-pixfmts-hflip +++ b/tests/ref/fate/filter-pixfmts-hflip @@ -1,5 +1,6 @@ 0bgr 823994965cfb2ba4566f878c75eed684 0rgb ada57572ee2b35f86edac9b911ce8523 +0yuv f1d087284fb1556d76e6def5f94bf273 abgr d2da6c3ee72e4a89a7cd011dd08566b2 argb 36cf791c52c5463bfc52a070de54337e ayuv64le 4cedbc38b3d4dcb26cdab170ce6d667b diff --git a/tests/ref/fate/filter-pixfmts-il b/tests/ref/fate/filter-pixfmts-il index 7f1c339..aec138d 100644 --- a/tests/ref/fate/filter-pixfmts-il +++ b/tests/ref/fate/filter-pixfmts-il @@ -1,5 +1,6 @@ 0bgr 501a8320becc400e2a72dc847003d82d 0rgb 53efe0182723cd1dedfdbf56357c76f5 +0yuv 4251d94ee49e6a3cc1c10c09cd331308 abgr 97603869e6248a8e5d8501563a11b114 argb 9e50e6ef02c83f28e97865a1f46ddfcd ayuv64le 6f45f683e99ddf4180c7c7f47719efcc diff --git a/tests/ref/fate/filter-pixfmts-null b/tests/ref/fate/filter-pixfmts-null index d19314b..1b9d324 100644 --- a/tests/ref/fate/filter-pixfmts-null +++ b/tests/ref/fate/filter-pixfmts-null @@ -1,5 +1,6 @@ 0bgr 4060279c35dd8810a2f55a021b836557 0rgb 527ef3d164c8fd0700493733959689c2 +0yuv 0af13a42f9d0932c5a9bb6a8a5d1c5ee abgr 023ecf6396d324edb113e4a483b79ba2 argb f003b555ef429222005d33844cca9325 ayuv64le 07b9c969dfbe4add4c0626773b151d4f diff --git a/tests/ref/fate/filter-pixfmts-pad b/tests/ref/fate/filter-pixfmts-pad index 56482cf..a7c62a7 100644 --- a/tests/ref/fate/filter-pixfmts-pad +++ b/tests/ref/fate/filter-pixfmts-pad @@ -1,5 +1,6 @@ 0bgr 7bc6f5a1c44cdd7506174dccf52c68d7 0rgb ff12e0f1e576b47a4c962729d5c0b868 +0yuv 93fca69f640574dc7d8cce6282f72e96 abgr 52738042432893de555e6a3833172806 argb 2a10108ac524b422b8a2393c064b3eab bgr0 32207a2de1b2ac7937e940a8459b97c0 diff --git a/tests/ref/fate/filter-pixfmts-scale b/tests/ref/fate/filter-pixfmts-scale index 89d3f58..0315c3b 100644 --- a/tests/ref/fate/filter-pixfmts-scale +++ b/tests/ref/fate/filter-pixfmts-scale @@ -1,5 +1,6 @@ 0bgr 0576e427ba28f19e55a856f528e7c282 0rgb 80a58af8c639743307207ab4b69ca863 +0yuv a6ff68f46c6b4b7595ec91b2a497df8e abgr 63f2eaa8712ea6108985f4a0b83587c9 argb f0e17c71a40643c33a5bcfb481f6d8f8 ayuv64le 59fb016f9874062d0be77cb3920ffed2 diff --git a/tests/ref/fate/filter-pixfmts-transpose b/tests/ref/fate/filter-pixfmts-transpose index e4a170f..3f575fd 100644 --- a/tests/ref/fate/filter-pixfmts-transpose +++ b/tests/ref/fate/filter-pixfmts-transpose @@ -1,5 +1,6 @@ 0bgr 6929c1e308d2f4f941d002627047d262 0rgb cf1bedd0784a3efd3ab00c4e44005c37 +0yuv 46b5b821d7ee6ddedb3ddafd1e5b007c abgr 6d6f896f853a6c6f93ee70dba9af3d17 argb 87bbd23debb94d486ac3a6b6c0b005f9 ayuv64le e4c07e0d5b333b3bc9eb4f3ce6af3a2c diff --git a/tests/ref/fate/filter-pixfmts-vflip b/tests/ref/fate/filter-pixfmts-vflip index 2522c84..6763700 100644 --- a/tests/ref/fate/filter-pixfmts-vflip +++ b/tests/ref/fate/filter-pixfmts-vflip @@ -1,5 +1,6 @@ 0bgr e6f5c50fa0330cd5d5e69ffc09bc085a 0rgb 76b792f8ce8a72925e04294dc2f25b36 +0yuv ed7de87da324b39090a8961dfd56ca5a abgr 8b94f489e68802d76f1e2844688a4911 argb 3fd6af7ef2364d8aa845d45db289a04a ayuv64le 558671dd31d0754cfa6344eaf441df78