From patchwork Thu Jun 17 06:01:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lingjiang Fang X-Patchwork-Id: 28559 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5e:c91a:0:0:0:0:0 with SMTP id z26csp323098iol; Wed, 16 Jun 2021 23:02:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxgno2mAZDkQEhIBtuxqv+UpPGqVEZQDvN25Qmb3mYl8KIr607u4iSlu4pWS5ndnS20WhGw X-Received: by 2002:a17:907:2bd1:: with SMTP id gv17mr3351035ejc.15.1623909755071; Wed, 16 Jun 2021 23:02:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623909755; cv=none; d=google.com; s=arc-20160816; b=li5LqVF6eK8oYi6G6f2do+ZgqvW0DzT1X+Bv9lbsSHC3i6m4iCwao2hHOtFRSqZASu 1vUNYSuRybagUv+MGFzystLDaPx5U8b/k1NZV8NrC0IJbNqsD99RlUbdjv1phA/eh7go 6GY19NCUxBZLCKvUIEXHE4hirJHHEOkeOUs46ByqxYwmwJyROxZv/4HhJJ8Xkfr/87B1 a1cgFPGycix0f16LKYx2pbGTUbC96FrcYaDgglnsbmB8qfWqoSDus7iFnnqFQVz4f6WD F8QtJ5SWVAJ7XfGu0wVf3uiNjeEz1h6J0RY7+ZnSHxzG0eXhXNbuQLya3TS3tniOAcKr ivTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:date:to:from:message-id :dkim-signature:delivered-to; bh=TGBhido/e1Si5d5CFh41dWdY8n7sSWVGctNE4uaHASw=; b=TC0XCX9INFyEMln5qufcQUs3P6SAS7RFBOO7SBmCkB5LvFa3bFVMoRfyLu8axJ6UVJ LhO5wkE9rTHqZsADXMSMc/fGH1Vx750wR7K6RkDhMOoy0va2TGmtqDb88TpMVMtvpVhk Zf1KThzXHzEw1OpKp5r+SOKwYfDqE3P3rrubhb8d8MUuHbrVkLjF3cSFgTmb6BEUX3UK 9nTQXa2fEcesAcjAvC2HfyvymHE7BSJUXfsgqhD/JRN9/CZShvLGBUM9RLHeTeHR0BST h9sd9DKTH4Kw9D1Eh3uZibsn7AQ9mU2wMfK4o7dCMGa/ZKDg5D9Nc30+ZzrNJpsBsQ8q bAiA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=Z273sHJG; 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=NONE dis=NONE) header.from=foxmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 3si4624011ejm.82.2021.06.16.23.02.11; Wed, 16 Jun 2021 23:02:35 -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=@foxmail.com header.s=s201512 header.b=Z273sHJG; 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=NONE dis=NONE) header.from=foxmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 226CD6880C3; Thu, 17 Jun 2021 09:02:07 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-57-210.mail.qq.com (out162-62-57-210.mail.qq.com [162.62.57.210]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CEC7768052A for ; Thu, 17 Jun 2021 09:01:59 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1623909706; bh=BsLEAIC7EzQqk+5YjMuKkHjHY1nTF7irFqAZY97px4c=; h=From:To:Cc:Subject:Date; b=Z273sHJGKRvuvun0tJM6oEQXM62WUbGYz/DbS90tZFG6C1hsOYnYh69b2qVTlS8dJ UFYzzrB3/0t35BFmhj320T+sT/ZUrRwr0D0f7fV0CFNvVRiOrBfaAk+b/2FF4b/PGU weKZIr0v0315PHFlZ2SAuMlt1dXdLowOPQWZoE0o= Received: from localhost.localdomain ([14.17.22.36]) by newxmesmtplogicsvrsza9.qq.com (NewEsmtp) with SMTP id 6D14212; Thu, 17 Jun 2021 14:01:45 +0800 X-QQ-mid: xmsmtpt1623909705taz581oph Message-ID: X-QQ-XMAILINFO: NN9UNVzD7YXOmHCyhlTt0JVK0E2LDWOdpg3+VHyJaTd+bJjdTRGslKS1VrPv8J 41523f8v67IXlA2n2QS+MBhFmkU3qrw1xCo/aJCgmmVQt9V48IlJ0RruA8CJp9g/U8zauNxg+RRz A5dthtWR7Df9nCXd6/mcuv2YTD8/9KZOrTCO6ZgOZHMFJApSKWkavk2vBUlGhnm/Gb7HTI42SJIh wB24JMpI5f/jNkhqBwwu3T56KQfhLCEPuV5x25gRuFzQEBpquTv5vXdVJOO54o1TfCqnvrlXfhJ1 7vJ4/1RdGX4h2dE7R5PeQ1Ka9W7S6YYWZx51Io+cqJxZ/TP5tnobXmH0osry0MldRYyr/zXUbtg2 XQCgvNGwL6+HMtdFWZl67DeGcpY95TWJcxbX5Dg3Lu76OSVYN4W9XI2tgOKwUPY+Z+3K9xYndvFv b6O+/QNo8vIPklwyy1bcNmc9ZseOaNVWn58asegy86pjHeYs0ComxCU9y1ZMZ2NBfr8xXpATg0FJ XZp/rsTwRCyC6LIlPy5WdoATzq2f5utlLcOBXmXb803r3musulwl6c4VKa1vDCO9QJ7XjUmaw1Gx GQHOPVBDkXdM3OJqhmdC0XHelaJ91lTOZbhjWTgHerTf7BHbIcaQZLmQX4Ni1D+NpFdwMtjiLx61 Z+XmLUiFmPRpglebzIkae0wzbzgKtbFTn5YjIBNTEAumvI6vaqWQSwzvzwHQzAAK9tFLRrubyjDs MbGMVsp2DG+qs6qrm+h8vkvKE6G8+mt3gPPFUuoclEftHFL1/OWbazm0hwAWNteb1EQoklvRc0Jx Fwvq411928YPCEibt2U7PJzrXw/6CWnvHDiS99iEbdhAyk4cZ7HLsF From: Lingjiang Fang To: ffmpeg-devel@ffmpeg.org Date: Thu, 17 Jun 2021 14:01:42 +0800 X-OQ-MSGID: <20210617060142.31610-1-vacingfang@foxmail.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavf/vf_ocr: add subregion support 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 Cc: Lingjiang Fang Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 6WcZlX322L4V --- doc/filters.texi | 7 +++++++ libavfilter/vf_ocr.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/doc/filters.texi b/doc/filters.texi index da8f7d7726..9c650a2a5a 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -15451,6 +15451,13 @@ Set character whitelist. @item blacklist Set character blacklist. + +@item x, y +Set top point position of subregion, not support expression now + +@item w, h +Set Width and height of subregion + @end table The filter exports recognized text as the frame metadata @code{lavfi.ocr.text}. diff --git a/libavfilter/vf_ocr.c b/libavfilter/vf_ocr.c index 6de474025a..7beb101679 100644 --- a/libavfilter/vf_ocr.c +++ b/libavfilter/vf_ocr.c @@ -33,6 +33,8 @@ typedef struct OCRContext { char *language; char *whitelist; char *blacklist; + int x, y; + int w, h; TessBaseAPI *tess; } OCRContext; @@ -45,6 +47,10 @@ static const AVOption ocr_options[] = { { "language", "set language", OFFSET(language), AV_OPT_TYPE_STRING, {.str="eng"}, 0, 0, FLAGS }, { "whitelist", "set character whitelist", OFFSET(whitelist), AV_OPT_TYPE_STRING, {.str="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.:;,-+_!?\"'[]{}()<>|/\\=*&%$#@!~ "}, 0, 0, FLAGS }, { "blacklist", "set character blacklist", OFFSET(blacklist), AV_OPT_TYPE_STRING, {.str=""}, 0, 0, FLAGS }, + { "x", "top x of sub region", OFFSET(x), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS }, + { "y", "top y of sub region", OFFSET(y), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS }, + { "w", "width of sub region", OFFSET(w), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS }, + { "h", "height of sub region", OFFSET(h), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS }, { NULL } }; @@ -73,6 +79,19 @@ static av_cold int init(AVFilterContext *ctx) return 0; } +static int config_input(AVFilterLink *inlink) +{ + OCRContext *s = inlink->dst->priv; + + // may call many times, we don't check w/h here + if (s->x < 0 || s->y < 0) { + s->x = 0; + s->y = 0; + } + + return 0; +} + static int query_formats(AVFilterContext *ctx) { static const enum AVPixelFormat pix_fmts[] = { @@ -101,9 +120,17 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) OCRContext *s = ctx->priv; char *result; int *confs; + int w = s->w; + int h = s->h; + + if (w <= 0 || h <= 0) { + w = in->width; + h = in->height; + } + av_log(s, AV_LOG_ERROR, "x=%d, y=%d, w=%d, h=%d\n", s->x, s->y, w, h); result = TessBaseAPIRect(s->tess, in->data[0], 1, - in->linesize[0], 0, 0, in->width, in->height); + in->linesize[0], s->x, s->y, w, h); confs = TessBaseAPIAllWordConfidences(s->tess); av_dict_set(metadata, "lavfi.ocr.text", result, 0); for (int i = 0; confs[i] != -1; i++) { @@ -134,6 +161,7 @@ static const AVFilterPad ocr_inputs[] = { .name = "default", .type = AVMEDIA_TYPE_VIDEO, .filter_frame = filter_frame, + .config_props = config_input, }, { NULL } };