From patchwork Fri Jun 19 14:35:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 20502 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 4FFE044B2C9 for ; Fri, 19 Jun 2020 17:35:56 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3C7A468B682; Fri, 19 Jun 2020 17:35:56 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f193.google.com (mail-pg1-f193.google.com [209.85.215.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C52A968B100 for ; Fri, 19 Jun 2020 17:35:49 +0300 (EEST) Received: by mail-pg1-f193.google.com with SMTP id l63so4550967pge.12 for ; Fri, 19 Jun 2020 07:35:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=lMyODh0MzB2gmBIc0eFBN/OUwY7Xiehn5qubSDf+COI=; b=mt6C2dA7MZZfXd4RFamRyKnhCqcOBh21wW0sR22+DIWnMIXJwodCfjuF9KprVbTKVd SNRcXwowE9waJHIz5ZPRZe7eKz1hjmB/5spVRLDsiUY0lohI5MrYUhVVYQdJYSgkAnP1 h+xzUCapYV0Z1/iTBqLn/hSxbqBL3LBCOJ22eEENP++GjsbDNWFZgOLDFMLM+gp1CJsn zDmVOp0Njp2+bJl6kRTx8Shka1COp5Qy8gIVv+kEzowPKsX0e6nmRZvTY+ptYjt8pmyn +hSdpCWrUZ7XYUeGTQiv0FI/DXeCjhPfKDn1Dyujlo2Rwi4JPnH47CdvcUBithqjY7gB WGfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=lMyODh0MzB2gmBIc0eFBN/OUwY7Xiehn5qubSDf+COI=; b=dAYZZO9JGC5pbkpU1pi1Ie0rFBRL+QjxtR6/gZvXoo8boBURy3qPme1y7PdCPqp8Ad 3t//4aosz5zz+2usR0WkUEC21Dt/CvbohfzvAjSv/rPfxP7gAC8Q7JXxkBnFOTcrtxhm rWKn2pckkyq5xFiP+zYh6HUSGcZSXYikZaNOkSsNFhIsJ9PMShQzSVLz62ELRXaWDX8M NZbS94wa4wcaY9w9na+2B8vY3pL7Ddz9HsfrOYqJNpwnXVIYvjriKP45x8Z3fEkujDpJ VuYziSBQwyjRh29qHL3M77YRWE7TYwKiIAqiUxzfhRuE0Bcgnahyyoby5naC4RFYp2Wb Kmag== X-Gm-Message-State: AOAM531bcwBSzRxPY8hP8Unlo2lo1rvhpIm0eJg/lp0b/JGQ98uNHbgT xwVPKQJpKBN/yY+4Tw4Iv/zeDfAO X-Google-Smtp-Source: ABdhPJwNeZLFFEFdL4I6MdPCWfqCP3WpOMW4AdW9VpF6c4tT7EbkblxkIWcl/aRjyTIET+2qOkpRkw== X-Received: by 2002:aa7:924c:: with SMTP id 12mr8184247pfp.225.1592577347694; Fri, 19 Jun 2020 07:35:47 -0700 (PDT) Received: from vpn2.localdomain ([161.117.202.209]) by smtp.gmail.com with ESMTPSA id s23sm5286912pju.35.2020.06.19.07.35.46 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Jun 2020 07:35:47 -0700 (PDT) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 19 Jun 2020 22:35:31 +0800 Message-Id: <1592577334-19049-1-git-send-email-lance.lmwang@gmail.com> X-Mailer: git-send-email 1.8.3.1 Subject: [FFmpeg-devel] [PATCH 1/4] avfilter/vf_drawtext: add option to draw timecode in S12M side data 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: Limin Wang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Limin Wang Signed-off-by: Limin Wang --- doc/filters.texi | 4 ++++ libavfilter/vf_drawtext.c | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/doc/filters.texi b/doc/filters.texi index 5f0eb28..8334f46 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -9825,6 +9825,10 @@ If both @var{text} and @var{textfile} are specified, an error is thrown. If set to 1, the @var{textfile} will be reloaded before each frame. Be sure to update it atomically, or it may be read partially, or even fail. +@item frame_tc +If set to 1, the timecode in S12M side data will be used for each frame +if have, 0 otherwise + @item x @item y The expressions which specify the offsets where text will be drawn diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c index abe1ca6..018997a 100644 --- a/libavfilter/vf_drawtext.c +++ b/libavfilter/vf_drawtext.c @@ -197,6 +197,7 @@ typedef struct DrawTextContext { AVRational tc_rate; ///< frame rate for timecode AVTimecode tc; ///< timecode context int tc24hmax; ///< 1 if timecode is wrapped to 24 hours, 0 otherwise + int frame_tc; ///< 1 use timecode in S12M side data for each frame, 0 otherwise int reload; ///< reload text file for each frame int start_number; ///< starting frame number for n/frame_num var #if CONFIG_LIBFRIBIDI @@ -268,6 +269,7 @@ static const AVOption drawtext_options[]= { { "monochrome", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FT_LOAD_MONOCHROME }, .flags = FLAGS, .unit = "ft_load_flags" }, { "linear_design", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FT_LOAD_LINEAR_DESIGN }, .flags = FLAGS, .unit = "ft_load_flags" }, { "no_autohint", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FT_LOAD_NO_AUTOHINT }, .flags = FLAGS, .unit = "ft_load_flags" }, + {"frame_tc", "use timecode in S21M side data for each frame if have", OFFSET(frame_tc), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, { NULL } }; @@ -1327,6 +1329,23 @@ static int draw_text(AVFilterContext *ctx, AVFrame *frame, break; } + if (s->frame_tc) { + AVFrameSideData *sd; + + if (sd = av_frame_get_side_data(frame, AV_FRAME_DATA_S12M_TIMECODE)) { + uint32_t *tc = (uint32_t*)sd->data; + int m = tc[0] & 3; + + av_bprint_clear(bp); + av_bprintf(bp, "%s", s->text); + for (int j = 1; j <= m; j++) { + char tcbuf[AV_TIMECODE_STR_SIZE]; + av_timecode_make_smpte_tc_string(tcbuf, tc[j], 0); + av_bprintf(bp, "%s%s", tcbuf, j != m ? ", " : ""); + } + } + } + if (s->tc_opt_string) { char tcbuf[AV_TIMECODE_STR_SIZE]; av_timecode_make_string(&s->tc, tcbuf, inlink->frame_count_out);