From patchwork Wed May 2 12:02:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 8743 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp551019jad; Wed, 2 May 2018 05:03:22 -0700 (PDT) X-Google-Smtp-Source: AB8JxZq0QB7VFdzDg5uhFkCcIsjFiTKPtP0Ey7CoG9RWXdaYw6zPpMWqlEp9eYhAYvd0SQSAEqIV X-Received: by 2002:adf:91a2:: with SMTP id 31-v6mr14610312wri.124.1525262602413; Wed, 02 May 2018 05:03:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525262602; cv=none; d=google.com; s=arc-20160816; b=q9unQd/7ZIyeQlbMuikOXWP1SAD0dcCeFlWtc5WM7lUb7ugIIZjZVyWH+K/KBZeYHW NkxZ0v2J9tWf5u3IMw2Z8XajZ25Y6JnDxJ27ccqkb1u5e28pXGt9e3U0KCsxgqYlPaDt JPQkKPtbXw+uN/4xCdjhwhFdecbwwIn1kA1eE8AvbpDncS+GCAd1+C9mpz0lmHau4K30 ut6UugdJKzK5PUUztOOt5rcIr0FFMC2Qv6yQ0NQ1i+m+CbBezFG07fEEJKZI259DRbD5 CCCDXLtIvRZ4FxP9xcJ5zUC63yLwkU7BF5z8bCQHp+IzACX+Yi41igtfVfU3w51mBKP4 wDDw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=XTl3x+A57/4/JXCJoVs1qwsvDlkQONU5hU9PVF7aEKQ=; b=SnsUxWwNDcw1gdXgY7nu4X2BI4Xpv1DqxemPiGyF5YcH5aipRhFJX1wCZk+lDugz34 zbjXSVIYdBbxPS9v0/ozvA1+NzFImaoRFb7vEUlUzyV2PXRRf1AjbXgjJRVaSBJs8Vsg XLzULtyp6/x/myvjrKpjhbZUPTUsinKkSarS6+cQo66yNQOKHXRwECWIydm1t5c7tBaU VJkbJgY4/TeoMLXqS0mxuZFAGhHC+m5l0avcRFbVphYhinWX5C7wszcHJAx6CrI6OYkp setF665nyLXWOVFDodALibBrcPjQwFpulYf086MAM3oTLUCEfYXJFINaBxWV9iQ3Tthy DkZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Ext6k+xi; 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 i14-v6si9657470wrb.223.2018.05.02.05.03.21; Wed, 02 May 2018 05:03:22 -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=20161025 header.b=Ext6k+xi; 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 557B668A327; Wed, 2 May 2018 15:02:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0579168A2C8 for ; Wed, 2 May 2018 15:02:41 +0300 (EEST) Received: by mail-wm0-f65.google.com with SMTP id f8so13386885wmc.4 for ; Wed, 02 May 2018 05:03:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=0YYTouROP+WmwS5FQ3ZR9T+GDXqAgecBFbj0AOtmDUA=; b=Ext6k+xiC26fJCW9cEKLCPMjCbneSZm2IQV5NrNkF4jdMYVm3aYN+b3NtMZne7iT2Z anVldUDR4GHcLOmHOfxSn6OrBNY6C7iiYGxMuqFPEFv049retsrBYD1ebkaa7/miVGfD gb9/AzchtdPM3tlbywm1LNyfldoUDQzHK8DKq4kFDV8zGNvdJztdvKRLbKjabx2/SbL3 qiTzWrWS6w223AlW2s+rtefIVhsB/uLBU3pxe0buikxoPwec8Y3sTK7JuUWsqocso5xA ZaPkDo9NA5Pu2XiASqoOTSfYByhvsbRUcUL+p+xCQ6xnXrJXnIX2puXKMKfT2JVSW1J2 F2ZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=0YYTouROP+WmwS5FQ3ZR9T+GDXqAgecBFbj0AOtmDUA=; b=T3Q85tfAJtj3DeVl7R5zRw0Da7ZFyDjwzspZUjzQd5I3hrUk9Tq4IVRmFcpeZLtitc R/aROR02jVK+wH1zmLPRP1z3Tm7GyblwOZdftDBqDkD0/a9l57ojH+6vrRZrVo3iJr3P BVkSNmK07L8HNlAgAyxehwvC30mg1SZGzfZNjtTyU8eh66cxuP1R2BtPVCrUOX2CdySe ehKgum/u3gjj+MWZiMpYirEVb88SRAmHlorHYtf73f9jTN4DbV5ZcrURZE36g+jNSEJH Er9Q4ZkbhbD69EmLkx2LXnWqyo/IvV4F8rzaKIK8Vh3KRutpefNUD6HPgK1yCfqV3iAm wNcg== X-Gm-Message-State: ALQs6tBK2Z08x2ueaMzUuyGQbq7KWv/SQri3Wj+jwYqVPi795kPW39A9 0tTBk4T6t//7HTrxl+oZN6QZjw== X-Received: by 10.28.210.193 with SMTP id j184mr11792135wmg.14.1525262593220; Wed, 02 May 2018 05:03:13 -0700 (PDT) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id z18-v6sm15623164wrc.36.2018.05.02.05.03.11 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 May 2018 05:03:12 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Wed, 2 May 2018 14:02:24 +0200 Message-Id: <20180502120224.4781-1-onemda@gmail.com> X-Mailer: git-send-email 2.11.0 Subject: [FFmpeg-devel] [PATCH] avfilter/drawutils: add support for full range 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavfilter/drawutils.c | 11 ++++++++--- libavfilter/drawutils.h | 1 + libavutil/colorspace.h | 12 ++++++++++++ tests/ref/fate/filter-pixfmts-pad | 10 +++++----- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/libavfilter/drawutils.c b/libavfilter/drawutils.c index db8c7a6226..650ef25aba 100644 --- a/libavfilter/drawutils.c +++ b/libavfilter/drawutils.c @@ -181,6 +181,7 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags) const AVComponentDescriptor *c; unsigned i, nb_planes = 0; int pixelstep[MAX_PLANES] = { 0 }; + int full_range = 0; if (!desc || !desc->name) return AVERROR(EINVAL); @@ -188,6 +189,9 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags) return AVERROR(ENOSYS); if (format == AV_PIX_FMT_P010LE || format == AV_PIX_FMT_P010BE || format == AV_PIX_FMT_P016LE || format == AV_PIX_FMT_P016BE) return AVERROR(ENOSYS); + if (format == AV_PIX_FMT_YUVJ420P || format == AV_PIX_FMT_YUVJ422P || format == AV_PIX_FMT_YUVJ444P || + format == AV_PIX_FMT_YUVJ411P || format == AV_PIX_FMT_YUVJ440P) + full_range = 1; for (i = 0; i < desc->nb_components; i++) { c = &desc->comp[i]; /* for now, only 8-16 bits formats */ @@ -214,6 +218,7 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags) draw->format = format; draw->nb_planes = nb_planes; draw->flags = flags; + draw->full_range = full_range; memcpy(draw->pixelstep, pixelstep, sizeof(draw->pixelstep)); draw->hsub[1] = draw->hsub[2] = draw->hsub_max = desc->log2_chroma_w; draw->vsub[1] = draw->vsub[2] = draw->vsub_max = desc->log2_chroma_h; @@ -249,9 +254,9 @@ void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4 } else if (draw->nb_planes >= 2) { /* assume YUV */ const AVPixFmtDescriptor *desc = draw->desc; - color->comp[desc->comp[0].plane].u8[desc->comp[0].offset] = RGB_TO_Y_CCIR(rgba[0], rgba[1], rgba[2]); - color->comp[desc->comp[1].plane].u8[desc->comp[1].offset] = RGB_TO_U_CCIR(rgba[0], rgba[1], rgba[2], 0); - color->comp[desc->comp[2].plane].u8[desc->comp[2].offset] = RGB_TO_V_CCIR(rgba[0], rgba[1], rgba[2], 0); + color->comp[desc->comp[0].plane].u8[desc->comp[0].offset] = draw->full_range ? RGB_TO_Y_JPEG(rgba[0], rgba[1], rgba[2]) : RGB_TO_Y_CCIR(rgba[0], rgba[1], rgba[2]); + color->comp[desc->comp[1].plane].u8[desc->comp[1].offset] = draw->full_range ? RGB_TO_U_JPEG(rgba[0], rgba[1], rgba[2]) : RGB_TO_U_CCIR(rgba[0], rgba[1], rgba[2], 0); + color->comp[desc->comp[2].plane].u8[desc->comp[2].offset] = draw->full_range ? RGB_TO_V_JPEG(rgba[0], rgba[1], rgba[2]) : RGB_TO_V_CCIR(rgba[0], rgba[1], rgba[2], 0); color->comp[3].u8[0] = rgba[3]; #define EXPAND(compn) \ if (desc->comp[compn].depth > 8) \ diff --git a/libavfilter/drawutils.h b/libavfilter/drawutils.h index cf53635456..b999d70e55 100644 --- a/libavfilter/drawutils.h +++ b/libavfilter/drawutils.h @@ -55,6 +55,7 @@ typedef struct FFDrawContext { uint8_t vsub[MAX_PLANES]; /*< vertical subsampling */ uint8_t hsub_max; uint8_t vsub_max; + int full_range; unsigned flags; } FFDrawContext; diff --git a/libavutil/colorspace.h b/libavutil/colorspace.h index b6dba2c95f..d0be8cb99a 100644 --- a/libavutil/colorspace.h +++ b/libavutil/colorspace.h @@ -107,4 +107,16 @@ static inline int C_JPEG_TO_CCIR(int y) { (((FIX(0.50000*224.0/255.0) * r1 - FIX(0.41869*224.0/255.0) * g1 - \ FIX(0.08131*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128) +#define RGB_TO_Y_JPEG(r, g, b) \ +(FFMIN((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \ + FIX(0.11400) * (b) + (ONE_HALF)) >> SCALEBITS, 255)) + +#define RGB_TO_U_JPEG(r1, g1, b1)\ +(((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \ + FIX(0.50000) * b1 + (ONE_HALF) - 1) >> (SCALEBITS)) + 128) + +#define RGB_TO_V_JPEG(r1, g1, b1)\ +(((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \ + FIX(0.08131) * b1 + (ONE_HALF) - 1) >> (SCALEBITS)) + 128) + #endif /* AVUTIL_COLORSPACE_H */ diff --git a/tests/ref/fate/filter-pixfmts-pad b/tests/ref/fate/filter-pixfmts-pad index e777211cd9..68b83e7a61 100644 --- a/tests/ref/fate/filter-pixfmts-pad +++ b/tests/ref/fate/filter-pixfmts-pad @@ -62,8 +62,8 @@ yuva444p fb60941a57596b277417a3c7c00aa194 yuva444p10le 251ea4ead8300d752eb355a08cbb0352 yuva444p16le 5b65287e1862d2d9f1ad2cfdcde94661 yuva444p9le e6946c10b94c271e7ea24b3bcff314e1 -yuvj411p ca967e68759a4956729dd366adc7e7fa -yuvj420p c00611cd5f1558047d579d8a7d30e381 -yuvj422p b3acdf07147a7598836065836ad8420b -yuvj440p 3446ba4b1d7fdf536c926cee643c2b35 -yuvj444p 3b0f1a185af048b9e0b202d003fc7e62 +yuvj411p 87dbac57b211ab4823c1abbd702f1516 +yuvj420p 1abef62bce65131ca4913eb2006fd860 +yuvj422p 198c57b519e2be14b150889bd7f94898 +yuvj440p e6533260d197ad15e39319117c57473e +yuvj444p 26a44748960513783ea676eff409d89a