From patchwork Sat Apr 28 22:14:55 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: 8688 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp2064562jad; Sat, 28 Apr 2018 15:15:49 -0700 (PDT) X-Google-Smtp-Source: AB8JxZq2OocI3v5J6NBG5F9rYG1j+Osr+WuQxSIl2X5Dq8SKXlFYC352OiY6zLt1WscCKz6/lmIA X-Received: by 2002:adf:e749:: with SMTP id c9-v6mr5487083wrn.203.1524953749854; Sat, 28 Apr 2018 15:15:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524953749; cv=none; d=google.com; s=arc-20160816; b=OLsfdsVgBN/HlN8TIwl3TR0WbjMF2Ewh84CjVRwU8Gq4L/A2gLHXvAbcn8UTYdAD0i Jl3vfVSUZaU7IHCEkDm7Kzrt3m/+IJs+pb++SveXz1igNaej5j0PlK3wh7Zs85NF5kQL HYju8QJmiJp95GsFg9ViNdwb/A7gTYmXx4lepAqjTB48Eq4klHlsDdVnbo68IK8igeF3 TXmDML0RBPhAY+ikz4fsCy2LtURIw2C1+qcJBRRT/PlmHXq1U/DAYkrroCQ2CMX83J3l rXNPolNtJYtBr4h4/xinyln6sVTFS5BDS5cqbFAz9SL/3cqbdoeiZpa89IX//mo5OJGX i/xA== 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=NHGZ/hgjxDjCGwzy52gRxqmbh78/X+84/MMS4cqroto=; b=iESfE9OSWa+cUHvmyqkHJBjbcnHqROWPMjMjE9KaXaVn9yFD46F6lYjQQ9BrKJXcVL 0zCQAdcArvVvmx0gAHBZB9MKCdXqQBrSQIlCs+KpYs443O0FXvhc4AwT1+76eJeFeOUo P2FznaME/Z/Lml1kTDdaS4I4EIZxgLdoNouyZ/5UNYEPzSwQHhi8Wn8J2sCeom1nE9gy XFoVa9mEURBN2D65QMXfPIGXwYWnNvmTMUh027J5sm8B+7YxVEaIobhanLNMawTWmzTK x5ncz4jdVTUo+WhDEbF8gmNH11xWugWoieEqp86BhyzGOHkqotgsCmm8GrqbnFoqP1pW CV9w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=CYab9DKi; 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 w10-v6si3456392wrg.377.2018.04.28.15.15.48; Sat, 28 Apr 2018 15:15:49 -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=CYab9DKi; 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 99BEC68A4FE; Sun, 29 Apr 2018 01:15:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 49E8E68A49F for ; Sun, 29 Apr 2018 01:15:09 +0300 (EEST) Received: by mail-wm0-f66.google.com with SMTP id n10so8532475wmc.1 for ; Sat, 28 Apr 2018 15:15:40 -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=LjiFNfrTu+JN4UiyABBmxcDYb3OPMoqD3c5F4R26mrA=; b=CYab9DKiGCjfNB/vFKHom3wgNKFeYiQS1ZJr9327EMBYr/wgKVolh+5qlmdeHqh/zQ A0RUBmUz80rump5uiGgefXlnt55zthRcp/xPtLewaAOc5kMy0S1NeFXZidx0zN+CjrIE DqL0VUk/0/R1riLUJDLrc7KfmshC+pAKneOGR5sNRS3nUhlhidTznqFa2hfZOQP2YtCG UoWWxHntMKqVW3NTRR+TmQXLfKmZwyMaxk668DuZKheFQrNYZBOCnX+h/0QGE9Kl61Xs 1gHG00GErzbVuIXeIGw+0QQaKqDFvwLJq6dA01GP5N2u9plSgm4qn7+bS/zXyiS6fM7o 90AA== 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=LjiFNfrTu+JN4UiyABBmxcDYb3OPMoqD3c5F4R26mrA=; b=JPndad333oKVjBieAa4yUtvb/ozhlfwNeOGCuRZyL5LZmZTf0HjuHJ6mu0w70v3nE4 /LSjGbaBFUFA30OdMz2uy/CM8mdcqdVjdyWjgSFZmoPavSou8WJu5dUnelA1oc3mu2CU WsPHbb+a+xlcJk7aqnUcgNvrkQaF7MrVfYMg9oR4BnKW0bLxcr9GFYyZk78RK9Y2BQv4 YGb7H/9OZpc51LdCzVZPY6al6TNDNlR/G5oPiKHNPwWsFuyw+uWfdP/EfocscteD8gAZ vKemeebSjtZzzTol1bglhlNcPGHxxhr4zgqiZG3JnB0gHIWq1St3fQ9H6IF3X6ONJECS HFmQ== X-Gm-Message-State: ALQs6tAyUKRXaBPKW/R2n/I7hYprc6Z+/G2pPBBApnzxVlcq6gMt9D0+ vxt1E47KFb0KTOzGQKQ6cMrNEA== X-Received: by 10.28.118.25 with SMTP id r25mr4413767wmc.5.1524953739948; Sat, 28 Apr 2018 15:15:39 -0700 (PDT) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id n79sm6858333wmi.20.2018.04.28.15.15.39 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 28 Apr 2018 15:15:39 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 29 Apr 2018 00:14:55 +0200 Message-Id: <20180428221455.31714-1-onemda@gmail.com> X-Mailer: git-send-email 2.11.0 Subject: [FFmpeg-devel] [PATCH] avfilter/vf_fieldmatch: add support for >8 bit depth in ppsrc 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" Also fix leaks while here. Signed-off-by: Paul B Mahol --- libavfilter/vf_fieldmatch.c | 48 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/libavfilter/vf_fieldmatch.c b/libavfilter/vf_fieldmatch.c index 4f10ed7ccd..68335ba678 100644 --- a/libavfilter/vf_fieldmatch.c +++ b/libavfilter/vf_fieldmatch.c @@ -79,6 +79,7 @@ typedef struct FieldMatchContext { AVFrame *prv2, *src2, *nxt2; ///< sliding window of the optional second stream int got_frame[2]; ///< frame request flag for each input stream int hsub, vsub; ///< chroma subsampling values + int bpc; ///< bytes per component uint32_t eof; ///< bitmask for end of stream int64_t lastscdiff; int64_t lastn; @@ -613,7 +614,7 @@ static void copy_fields(const FieldMatchContext *fm, AVFrame *dst, const int nb_copy_fields = (plane_h >> 1) + (field ? 0 : (plane_h & 1)); av_image_copy_plane(dst->data[plane] + field*dst->linesize[plane], dst->linesize[plane] << 1, src->data[plane] + field*src->linesize[plane], src->linesize[plane] << 1, - get_width(fm, src, plane), nb_copy_fields); + get_width(fm, src, plane) * fm->bpc, nb_copy_fields); } } @@ -852,16 +853,48 @@ static int request_frame(AVFilterLink *outlink) static int query_formats(AVFilterContext *ctx) { - // TODO: second input source can support >8bit depth + FieldMatchContext *fm = ctx->priv; + static const enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P, AV_PIX_FMT_NONE }; + static const enum AVPixelFormat unproc_pix_fmts[] = { + AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P, + AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, + AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P, + AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, + AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ444P, + AV_PIX_FMT_YUVJ411P, + AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9, + AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10, + AV_PIX_FMT_YUV440P10, + AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12, + AV_PIX_FMT_YUV440P12, + AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14, + AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, + AV_PIX_FMT_NONE + }; + int ret; + AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts); if (!fmts_list) return AVERROR(ENOMEM); - return ff_set_common_formats(ctx, fmts_list); + if (!fm->ppsrc) { + return ff_set_common_formats(ctx, fmts_list); + } + + if ((ret = ff_formats_ref(fmts_list, &ctx->inputs[INPUT_MAIN]->out_formats)) < 0) + return ret; + fmts_list = ff_make_format_list(unproc_pix_fmts); + if (!fmts_list) + return AVERROR(ENOMEM); + if ((ret = ff_formats_ref(fmts_list, &ctx->outputs[0]->in_formats)) < 0) + return ret; + if ((ret = ff_formats_ref(fmts_list, &ctx->inputs[INPUT_CLEANSRC]->out_formats)) < 0) + return ret; + return 0; } static int config_input(AVFilterLink *inlink) @@ -947,7 +980,12 @@ static av_cold void fieldmatch_uninit(AVFilterContext *ctx) av_frame_free(&fm->prv); if (fm->nxt != fm->src) av_frame_free(&fm->nxt); + if (fm->prv2 != fm->src2) + av_frame_free(&fm->prv2); + if (fm->nxt2 != fm->src2) + av_frame_free(&fm->nxt2); av_frame_free(&fm->src); + av_frame_free(&fm->src2); av_freep(&fm->map_data[0]); av_freep(&fm->cmask_data[0]); av_freep(&fm->tbuffer); @@ -959,10 +997,12 @@ static av_cold void fieldmatch_uninit(AVFilterContext *ctx) static int config_output(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; - const FieldMatchContext *fm = ctx->priv; + FieldMatchContext *fm = ctx->priv; const AVFilterLink *inlink = ctx->inputs[fm->ppsrc ? INPUT_CLEANSRC : INPUT_MAIN]; + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); + fm->bpc = (desc->comp[0].depth + 7) / 8; outlink->time_base = inlink->time_base; outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; outlink->frame_rate = inlink->frame_rate;