From patchwork Sun Jun 16 22:28:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ramiro Polla X-Patchwork-Id: 49954 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9196:0:b0:460:55fa:d5ed with SMTP id s22csp1596717vqg; Sun, 16 Jun 2024 15:29:26 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWJNFCbeTGaNLSz2HJLi+fAZZuYbfk7yuRgyMn0q/eDEGOF+44cGBv0LbYZ6EUsSnmkNU/1JLnf3O/DhC3yF/hri+nC6lNyKlqVdg== X-Google-Smtp-Source: AGHT+IHYWr70M1AbH/d1kd4+5H7ffntVTibbeOZ/0ySWTb+J5dlX9nTMRQ1zFSp2JteOQAELMph7 X-Received: by 2002:a19:5e4f:0:b0:52c:5083:a627 with SMTP id 2adb3069b0e04-52ca6e670cdmr4181568e87.25.1718576966235; Sun, 16 Jun 2024 15:29:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718576966; cv=none; d=google.com; s=arc-20160816; b=e0JAHV8TMGqn52sMGbGWGY0qMpvCi5Q/WKtkhP6uno6W5EbwxfxwOq7Pg3TbGtz60s EtgDMQJlyDPd1PmRmcL3TN++IROMgQvkAES7IReIEQCVFvMI8aiyQMeS12sx6oScER9D uvG4ERAOMAEJwGMMpuXA4htUGD1fOvY8j7/27BaxruNPdgG/tQWG1ANi06zDjrwCzwyX RJj27WMqPsK+XimDOJ4l8UMx2IRD93h31d7PLFKgaw+FVrHiSk5S6o0ts8aQk8fNkETE huAbkoufkjSvSwjhSj/CuAIw8zQU28QMEYlBAD/R66UAf1wfYELUK4aWNbY87d9vNm/a 9pZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=oVzpDIZ/n1NBC8A65I9bTXWTx9geiA4bgBQ5ptyg2bI=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=rvDvHRCQOllzC6JwFLmyVkL8nAz8tKbjeM03NF5eY1c5QZ7LfGIUjnT7S9cTS6mGu4 s4B5eDIaHNZaH6PaaSIyxnDOkMiI40shEJOlNQmOREsZLRHifWvCYbQ6Ko9CzKSaaLFw g4xIkycRQ4Ui01PhbKPVHA4qaPAA2NHZ0xvSoOr/37skZIBNxslljfpfT9x92EE2s0yK gBoN0wtDEkkw1D9fY+GYJs0iT4T6gwfGM/ku8JHPY+E6L21O+mJucWUJFA7uXpRd7s3C fh54BeEvSA5jAWTXz7nGwHk4fJUfFA5o9S91f4N6UEjje/l0DCnWfZgasNHVaBARSdzl jwUA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b="MhFehoh/"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 2adb3069b0e04-52ca287248csi2344910e87.210.2024.06.16.15.29.25; Sun, 16 Jun 2024 15:29:26 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b="MhFehoh/"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6D00E68D752; Mon, 17 Jun 2024 01:29:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A622168D708 for ; Mon, 17 Jun 2024 01:28:54 +0300 (EEST) Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-421b9068274so34135825e9.1 for ; Sun, 16 Jun 2024 15:28:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718576933; x=1719181733; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=8N45asuRe5aGO2J6rjeA6eS9+vNSmPO+QAMFMAPc2NI=; b=MhFehoh/CDjTfHdmrjykdz938NRNAHSEeKB8fYPPPoqdJgzyXhxmnY/I53WwaIkhJ1 WnKNStWBmzuDCUFpNfh9/KoBh/LaGVRfk4WQq5rDODIR9e9lnyE0fIQSOjxDb8/Xfl7/ 1QunorduwzDVApl3QXaVQwksfLF9szQFCdeAlhl5ThTMMhJDkb6ZrIawDu2Vb1dtKg1W 1z+S/OcCDn8629d9xMu6oYVwKT1Nx09fLberFPTh+yp8J47okY4FNbhZDFKMy6yRUHI5 WzIdccrYAD4IUX0KMohOm366OM6xLLL6cvhGUqnDoA9jFTeJByMX4p+c71e5rUEwzZYb w7UQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718576933; x=1719181733; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8N45asuRe5aGO2J6rjeA6eS9+vNSmPO+QAMFMAPc2NI=; b=IeKMXvWbPeqMMZQtHwvDzM3LGjdINaZEbU0LU4xED7YEi1un2oVY/oV/iXkeBfRs9G VYpsOThppdouo58zFl/GB/RPywv0hCD1crp6H9z4gf/F/q+bJ/8cNkDxRNxgY7kXwszr WRf25HfBruIKkGdWH7Dh8t3TWXc/Hl0ZEL8h8ak3y6AnYifoNUEY9SSXfXR9V9J0QfVB 7pA/KhTb5qKzBN3brx3cqM8dhEOAGkfwRF4rBcjSKVAipmZhc1KzO/RZnoSBZicjqPPF QtOGcjqjPEUt8G/AgRAzzJZfPruJmDAfvo8MEC4ZJ6hMXq8kJuUbfJMEIjKt+0cnMOFq jy3g== X-Gm-Message-State: AOJu0Yx6hZTmiwiiNULcVyKRPo0WCQty7te5hqR3LIepqC8HWFZ2WAAD fZsllD7b2RclejdXY1eWUHPg7V7bqpH5lw+s956z5dFlsLCzZkMcJSDGOA== X-Received: by 2002:a05:600c:a01:b0:422:4fcd:d4b3 with SMTP id 5b1f17b1804b1-42304858427mr58066255e9.37.1718576933124; Sun, 16 Jun 2024 15:28:53 -0700 (PDT) Received: from localhost.localdomain (247.111-201-80.adsl-dyn.isp.belgacom.be. [80.201.111.247]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-360750ad082sm10349146f8f.59.2024.06.16.15.28.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 16 Jun 2024 15:28:52 -0700 (PDT) From: Ramiro Polla To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jun 2024 00:28:46 +0200 Message-Id: <20240616222849.420361-3-ramiro.polla@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20240616222849.420361-1-ramiro.polla@gmail.com> References: <20240616222849.420361-1-ramiro.polla@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/6] swscale/yuv2rgb: fix yuv422p input in C code X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Pc2AB9FSXCDm The C code was silently ignoring the second chroma line on yuv422p input. --- libswscale/yuv2rgb.c | 228 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 196 insertions(+), 32 deletions(-) diff --git a/libswscale/yuv2rgb.c b/libswscale/yuv2rgb.c index 7386d3a2a2..1ea87ac17a 100644 --- a/libswscale/yuv2rgb.c +++ b/libswscale/yuv2rgb.c @@ -65,7 +65,7 @@ const int *sws_getCoefficients(int colorspace) return ff_yuv2rgb_coeffs[colorspace]; } -#define LOADCHROMA(i) \ +#define LOADCHROMA(pu, pv, i) \ U = pu[i]; \ V = pv[i]; \ r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \ @@ -124,17 +124,13 @@ const int *sws_getCoefficients(int colorspace) dst[12 * i + 8] = dst[12 * i + 9] = g[Y]; \ dst[12 * i + 10] = dst[12 * i + 11] = r[Y]; -#define YUV2RGBFUNC(func_name, dst_type, alpha) \ +#define YUV2RGBFUNC(func_name, dst_type, alpha, yuv422) \ static int func_name(SwsContext *c, const uint8_t *src[], \ int srcStride[], int srcSliceY, int srcSliceH, \ uint8_t *dst[], int dstStride[]) \ { \ int y; \ \ - if (!alpha && c->srcFormat == AV_PIX_FMT_YUV422P) { \ - srcStride[1] *= 2; \ - srcStride[2] *= 2; \ - } \ for (y = 0; y < srcSliceH; y += 2) { \ int yd = y + srcSliceY; \ dst_type *dst_1 = \ @@ -144,10 +140,15 @@ const int *sws_getCoefficients(int colorspace) dst_type av_unused *r, *g, *b; \ const uint8_t *py_1 = src[0] + y * srcStride[0]; \ const uint8_t *py_2 = py_1 + srcStride[0]; \ - const uint8_t av_unused *pu = src[1] + (y >> 1) * srcStride[1]; \ - const uint8_t av_unused *pv = src[2] + (y >> 1) * srcStride[2]; \ + const uint8_t av_unused *pu_1 = src[1] + (y >> !yuv422) * srcStride[1]; \ + const uint8_t av_unused *pv_1 = src[2] + (y >> !yuv422) * srcStride[2]; \ + const uint8_t av_unused *pu_2, *pv_2; \ const uint8_t av_unused *pa_1, *pa_2; \ unsigned int h_size = c->dstW >> 3; \ + if (yuv422) { \ + pu_2 = pu_1 + srcStride[1]; \ + pv_2 = pv_1 + srcStride[2]; \ + } \ if (alpha) { \ pa_1 = src[3] + y * srcStride[3]; \ pa_2 = pa_1 + srcStride[3]; \ @@ -155,9 +156,13 @@ const int *sws_getCoefficients(int colorspace) while (h_size--) { \ int av_unused U, V, Y; \ -#define ENDYUV2RGBLINE(dst_delta, ss, alpha) \ - pu += 4 >> ss; \ - pv += 4 >> ss; \ +#define ENDYUV2RGBLINE(dst_delta, ss, alpha, yuv422) \ + pu_1 += 4 >> ss; \ + pv_1 += 4 >> ss; \ + if (yuv422) { \ + pu_2 += 4 >> ss; \ + pv_2 += 4 >> ss; \ + } \ py_1 += 8 >> ss; \ py_2 += 8 >> ss; \ if (alpha) { \ @@ -177,73 +182,169 @@ const int *sws_getCoefficients(int colorspace) } #define YUV420FUNC(func_name, dst_type, alpha, abase, PUTFUNC, dst_delta) \ - YUV2RGBFUNC(func_name, dst_type, alpha) \ - LOADCHROMA(0); \ + YUV2RGBFUNC(func_name, dst_type, alpha, 0) \ + LOADCHROMA(pu_1, pv_1, 0); \ PUTFUNC(dst_1, py_1, pa_1, 0, abase); \ PUTFUNC(dst_2, py_2, pa_2, 0, abase); \ \ - LOADCHROMA(1); \ + LOADCHROMA(pu_1, pv_1, 1); \ PUTFUNC(dst_2, py_2, pa_2, 1, abase); \ PUTFUNC(dst_1, py_1, pa_1, 1, abase); \ \ - LOADCHROMA(2); \ + LOADCHROMA(pu_1, pv_1, 2); \ PUTFUNC(dst_1, py_1, pa_1, 2, abase); \ PUTFUNC(dst_2, py_2, pa_2, 2, abase); \ \ - LOADCHROMA(3); \ + LOADCHROMA(pu_1, pv_1, 3); \ PUTFUNC(dst_2, py_2, pa_2, 3, abase); \ PUTFUNC(dst_1, py_1, pa_1, 3, abase); \ - ENDYUV2RGBLINE(dst_delta, 0, alpha) \ - LOADCHROMA(0); \ + ENDYUV2RGBLINE(dst_delta, 0, alpha, 0) \ + LOADCHROMA(pu_1, pv_1, 0); \ PUTFUNC(dst_1, py_1, pa_1, 0, abase); \ PUTFUNC(dst_2, py_2, pa_2, 0, abase); \ \ - LOADCHROMA(1); \ + LOADCHROMA(pu_1, pv_1, 1); \ PUTFUNC(dst_2, py_2, pa_2, 1, abase); \ PUTFUNC(dst_1, py_1, pa_1, 1, abase); \ - ENDYUV2RGBLINE(dst_delta, 1, alpha) \ - LOADCHROMA(0); \ + ENDYUV2RGBLINE(dst_delta, 1, alpha, 0) \ + LOADCHROMA(pu_1, pv_1, 0); \ PUTFUNC(dst_1, py_1, pa_1, 0, abase); \ PUTFUNC(dst_2, py_2, pa_2, 0, abase); \ ENDYUV2RGBFUNC() +#define YUV422FUNC(func_name, dst_type, alpha, abase, PUTFUNC, dst_delta) \ + YUV2RGBFUNC(func_name, dst_type, alpha, 1) \ + LOADCHROMA(pu_1, pv_1, 0); \ + PUTFUNC(dst_1, py_1, pa_1, 0, abase); \ + \ + LOADCHROMA(pu_2, pv_2, 0); \ + PUTFUNC(dst_2, py_2, pa_2, 0, abase); \ + \ + LOADCHROMA(pu_2, pv_2, 1); \ + PUTFUNC(dst_2, py_2, pa_2, 1, abase); \ + \ + LOADCHROMA(pu_1, pv_1, 1); \ + PUTFUNC(dst_1, py_1, pa_1, 1, abase); \ + \ + LOADCHROMA(pu_1, pv_1, 2); \ + PUTFUNC(dst_1, py_1, pa_1, 2, abase); \ + \ + LOADCHROMA(pu_2, pv_2, 2); \ + PUTFUNC(dst_2, py_2, pa_2, 2, abase); \ + \ + LOADCHROMA(pu_2, pv_2, 3); \ + PUTFUNC(dst_2, py_2, pa_2, 3, abase); \ + \ + LOADCHROMA(pu_1, pv_1, 3); \ + PUTFUNC(dst_1, py_1, pa_1, 3, abase); \ + ENDYUV2RGBLINE(dst_delta, 0, alpha, 1) \ + LOADCHROMA(pu_1, pv_1, 0); \ + PUTFUNC(dst_1, py_1, pa_1, 0, abase); \ + \ + LOADCHROMA(pu_2, pv_2, 0); \ + PUTFUNC(dst_2, py_2, pa_2, 0, abase); \ + \ + LOADCHROMA(pu_2, pv_2, 1); \ + PUTFUNC(dst_2, py_2, pa_2, 1, abase); \ + \ + LOADCHROMA(pu_1, pv_1, 1); \ + PUTFUNC(dst_1, py_1, pa_1, 1, abase); \ + ENDYUV2RGBLINE(dst_delta, 1, alpha, 1) \ + LOADCHROMA(pu_1, pv_1, 0); \ + PUTFUNC(dst_1, py_1, pa_1, 0, abase); \ + \ + LOADCHROMA(pu_2, pv_2, 0); \ + PUTFUNC(dst_2, py_2, pa_2, 0, abase); \ + ENDYUV2RGBFUNC() + #define YUV420FUNC_DITHER(func_name, dst_type, LOADDITHER, PUTFUNC, dst_delta) \ - YUV2RGBFUNC(func_name, dst_type, 0) \ + YUV2RGBFUNC(func_name, dst_type, 0, 0) \ LOADDITHER \ \ - LOADCHROMA(0); \ + LOADCHROMA(pu_1, pv_1, 0); \ PUTFUNC(dst_1, py_1, 0, 0); \ PUTFUNC(dst_2, py_2, 0, 0 + 8); \ \ - LOADCHROMA(1); \ + LOADCHROMA(pu_1, pv_1, 1); \ PUTFUNC(dst_2, py_2, 1, 2 + 8); \ PUTFUNC(dst_1, py_1, 1, 2); \ \ - LOADCHROMA(2); \ + LOADCHROMA(pu_1, pv_1, 2); \ PUTFUNC(dst_1, py_1, 2, 4); \ PUTFUNC(dst_2, py_2, 2, 4 + 8); \ \ - LOADCHROMA(3); \ + LOADCHROMA(pu_1, pv_1, 3); \ PUTFUNC(dst_2, py_2, 3, 6 + 8); \ PUTFUNC(dst_1, py_1, 3, 6); \ - ENDYUV2RGBLINE(dst_delta, 0, 0) \ + ENDYUV2RGBLINE(dst_delta, 0, 0, 0) \ LOADDITHER \ \ - LOADCHROMA(0); \ + LOADCHROMA(pu_1, pv_1, 0); \ PUTFUNC(dst_1, py_1, 0, 0); \ PUTFUNC(dst_2, py_2, 0, 0 + 8); \ \ - LOADCHROMA(1); \ + LOADCHROMA(pu_1, pv_1, 1); \ PUTFUNC(dst_2, py_2, 1, 2 + 8); \ PUTFUNC(dst_1, py_1, 1, 2); \ - ENDYUV2RGBLINE(dst_delta, 1, 0) \ + ENDYUV2RGBLINE(dst_delta, 1, 0, 0) \ LOADDITHER \ \ - LOADCHROMA(0); \ + LOADCHROMA(pu_1, pv_1, 0); \ PUTFUNC(dst_1, py_1, 0, 0); \ PUTFUNC(dst_2, py_2, 0, 0 + 8); \ ENDYUV2RGBFUNC() +#define YUV422FUNC_DITHER(func_name, dst_type, LOADDITHER, PUTFUNC, dst_delta) \ + YUV2RGBFUNC(func_name, dst_type, 0, 1) \ + LOADDITHER \ + \ + LOADCHROMA(pu_1, pv_1, 0); \ + PUTFUNC(dst_1, py_1, 0, 0); \ + \ + LOADCHROMA(pu_2, pv_2, 0); \ + PUTFUNC(dst_2, py_2, 0, 0 + 8); \ + \ + LOADCHROMA(pu_2, pv_2, 1); \ + PUTFUNC(dst_2, py_2, 1, 2 + 8); \ + \ + LOADCHROMA(pu_1, pv_1, 1); \ + PUTFUNC(dst_1, py_1, 1, 2); \ + \ + LOADCHROMA(pu_1, pv_1, 2); \ + PUTFUNC(dst_1, py_1, 2, 4); \ + \ + LOADCHROMA(pu_2, pv_2, 2); \ + PUTFUNC(dst_2, py_2, 2, 4 + 8); \ + \ + LOADCHROMA(pu_2, pv_2, 3); \ + PUTFUNC(dst_2, py_2, 3, 6 + 8); \ + \ + LOADCHROMA(pu_1, pv_1, 3); \ + PUTFUNC(dst_1, py_1, 3, 6); \ + ENDYUV2RGBLINE(dst_delta, 0, 0, 1) \ + LOADDITHER \ + \ + LOADCHROMA(pu_1, pv_1, 0); \ + PUTFUNC(dst_1, py_1, 0, 0); \ + \ + LOADCHROMA(pu_2, pv_2, 0); \ + PUTFUNC(dst_2, py_2, 0, 0 + 8); \ + \ + LOADCHROMA(pu_2, pv_2, 1); \ + PUTFUNC(dst_2, py_2, 1, 2 + 8); \ + \ + LOADCHROMA(pu_1, pv_1, 1); \ + PUTFUNC(dst_1, py_1, 1, 2); \ + ENDYUV2RGBLINE(dst_delta, 1, 0, 1) \ + LOADDITHER \ + \ + LOADCHROMA(pu_1, pv_1, 0); \ + PUTFUNC(dst_1, py_1, 0, 0); \ + \ + LOADCHROMA(pu_2, pv_2, 0); \ + PUTFUNC(dst_2, py_2, 0, 0 + 8); \ + ENDYUV2RGBFUNC() + #define LOADDITHER16 \ const uint8_t *d16 = ff_dither_2x2_8[y & 1]; \ const uint8_t *e16 = ff_dither_2x2_4[y & 1]; \ @@ -330,7 +431,7 @@ const int *sws_getCoefficients(int colorspace) g[Y + d64[1 + o]] + \ b[Y + d128[1 + o]]; -YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t, 0) +YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t, 0, 0) const uint8_t *d128 = ff_dither_8x8_220[yd & 7]; char out_1 = 0, out_2 = 0; g = c->table_gU[128 + YUVRGB_TABLE_HEADROOM] + c->table_gV[128 + YUVRGB_TABLE_HEADROOM]; @@ -392,6 +493,7 @@ YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t, 0) dst_2[0] = out_2; ENDYUV2RGBFUNC() +// YUV420 YUV420FUNC(yuv2rgb_c_48, uint8_t, 0, 0, PUTRGB48, 48) YUV420FUNC(yuv2rgb_c_bgr48, uint8_t, 0, 0, PUTBGR48, 48) YUV420FUNC(yuv2rgb_c_32, uint32_t, 0, 0, PUTRGB, 8) @@ -411,6 +513,26 @@ YUV420FUNC_DITHER(yuv2rgb_c_8_ordered_dither, uint8_t, LOADDITHER8, PUTRGB8, YUV420FUNC_DITHER(yuv2rgb_c_4_ordered_dither, uint8_t, LOADDITHER4D, PUTRGB4D, 4) YUV420FUNC_DITHER(yuv2rgb_c_4b_ordered_dither, uint8_t, LOADDITHER4DB, PUTRGB4DB, 8) +// YUV422 +YUV422FUNC(yuv422p_rgb48_c, uint8_t, 0, 0, PUTRGB48, 48) +YUV422FUNC(yuv422p_bgr48_c, uint8_t, 0, 0, PUTBGR48, 48) +YUV422FUNC(yuv422p_rgb32_c, uint32_t, 0, 0, PUTRGB, 8) +#if HAVE_BIGENDIAN +YUV422FUNC(yuva422p_argb_c, uint32_t, 1, 24, PUTRGBA, 8) +YUV422FUNC(yuva422p_rgba_c, uint32_t, 1, 0, PUTRGBA, 8) +#else +YUV422FUNC(yuva422p_rgba_c, uint32_t, 1, 24, PUTRGBA, 8) +YUV422FUNC(yuva422p_argb_c, uint32_t, 1, 0, PUTRGBA, 8) +#endif +YUV422FUNC(yuv422p_rgb24_c, uint8_t, 0, 0, PUTRGB24, 24) +YUV422FUNC(yuv422p_bgr24_c, uint8_t, 0, 0, PUTBGR24, 24) +YUV422FUNC_DITHER(yuv422p_bgr16, uint16_t, LOADDITHER16, PUTRGB16, 8) +YUV422FUNC_DITHER(yuv422p_bgr15, uint16_t, LOADDITHER15, PUTRGB15, 8) +YUV422FUNC_DITHER(yuv422p_bgr12, uint16_t, LOADDITHER12, PUTRGB12, 8) +YUV422FUNC_DITHER(yuv422p_bgr8, uint8_t, LOADDITHER8, PUTRGB8, 8) +YUV422FUNC_DITHER(yuv422p_bgr4, uint8_t, LOADDITHER4D, PUTRGB4D, 4) +YUV422FUNC_DITHER(yuv422p_bgr4_byte, uint8_t, LOADDITHER4DB, PUTRGB4DB, 8) + SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c) { SwsFunc t = NULL; @@ -430,6 +552,47 @@ SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c) "No accelerated colorspace conversion found from %s to %s.\n", av_get_pix_fmt_name(c->srcFormat), av_get_pix_fmt_name(c->dstFormat)); + if (c->srcFormat == AV_PIX_FMT_YUV422P) { + switch (c->dstFormat) { + case AV_PIX_FMT_BGR48BE: + case AV_PIX_FMT_BGR48LE: + return yuv422p_bgr48_c; + case AV_PIX_FMT_RGB48BE: + case AV_PIX_FMT_RGB48LE: + return yuv422p_rgb48_c; + case AV_PIX_FMT_ARGB: + case AV_PIX_FMT_ABGR: + if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) + return yuva422p_argb_c; + case AV_PIX_FMT_RGBA: + case AV_PIX_FMT_BGRA: + return (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) ? yuva422p_rgba_c : yuv422p_rgb32_c; + case AV_PIX_FMT_RGB24: + return yuv422p_rgb24_c; + case AV_PIX_FMT_BGR24: + return yuv422p_bgr24_c; + case AV_PIX_FMT_RGB565: + case AV_PIX_FMT_BGR565: + return yuv422p_bgr16; + case AV_PIX_FMT_RGB555: + case AV_PIX_FMT_BGR555: + return yuv422p_bgr15; + case AV_PIX_FMT_RGB444: + case AV_PIX_FMT_BGR444: + return yuv422p_bgr12; + case AV_PIX_FMT_RGB8: + case AV_PIX_FMT_BGR8: + return yuv422p_bgr8; + case AV_PIX_FMT_RGB4: + case AV_PIX_FMT_BGR4: + return yuv422p_bgr4; + case AV_PIX_FMT_RGB4_BYTE: + case AV_PIX_FMT_BGR4_BYTE: + return yuv422p_bgr4_byte; + case AV_PIX_FMT_MONOBLACK: + return yuv2rgb_c_1_ordered_dither; + } + } else { switch (c->dstFormat) { case AV_PIX_FMT_BGR48BE: case AV_PIX_FMT_BGR48LE: @@ -469,6 +632,7 @@ SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c) case AV_PIX_FMT_MONOBLACK: return yuv2rgb_c_1_ordered_dither; } + } return NULL; }