From patchwork Wed Jun 24 13:43:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 20570 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 5E1A144AEEF for ; Wed, 24 Jun 2020 16:44:13 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3778168B56C; Wed, 24 Jun 2020 16:44:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f194.google.com (mail-pg1-f194.google.com [209.85.215.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 824BB68B1CA for ; Wed, 24 Jun 2020 16:44:06 +0300 (EEST) Received: by mail-pg1-f194.google.com with SMTP id e9so1436214pgo.9 for ; Wed, 24 Jun 2020 06:44:06 -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:in-reply-to:references; bh=kFRVctbPGxuslcqso34xQlMPvKNhvWIzq6Y+lcQm03M=; b=V97841jOFBPH8c1wY1jyJeZSiYdgrXbVF3V1+CL/QLauf3922z18p6R+EnmUbKn0Rt QvRD6dURr5ArHKX00M4w0+ZtWUGn0MFutHRhO5nIMEDlJ0eQoBUodDGa9wbfKW/FUb9M uBEirz5yBVEgqNLJAip7yuvGZNvMmMVU3jCCWlMMqIzypCJB5gOcpQKUeFIpkukjOF4x 4w+A23g6jFtZ7lfvODN11pr8Bz+zMv/FE+4klUNvSaLD9qOP7PcNDHcOSierV328o8Yi +xnMUKlik5wdQHu4Ptq54l4ecDJDlW9bXs+DQlDlY33ZoWOUh+ZMvTZwcoU4D5dm2keV S2jg== 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:in-reply-to :references; bh=kFRVctbPGxuslcqso34xQlMPvKNhvWIzq6Y+lcQm03M=; b=bP+m9O7xrY2v8v3GfsvPs362FVHq3S6CRnxe0uXjCGowr4H35apOxDZE76lMRUbDpX ZS3yQBbDHd4dPYzRGRj1BOxXwuR4ErjWAWRGI/4edSChotFdH6K9Fv7jeUH1LOR7dYAx I7nClnWemodnOAe/g6BzR6R+do6MwY/h6wu36j8AMEsPT655FtmsfAtju0R077Nftuma MYBlsBq/7Qju+uhM7Gs59V/QbHb3Yqk+F9LBDh9kn5qzhEgn7l8EjJPwKfxfwn6ZXB5O uYbEw1mhKMJ4LTiJrCIUIqe1Le+4hAII/OOkOg5oYg1T7lkC1x48ocuSRvgPWAYCrL9y +c4Q== X-Gm-Message-State: AOAM5303RECH+wXKeMIJxe87bD7jib2752Vovn2ktSVBD0LmvndTrOxc JENFvP/2AlBM0BK84dzZK/N5lrcW X-Google-Smtp-Source: ABdhPJxzfqsP1AtHta2uB3GYLXDuSTwoYfcMKdQsKLjGHDeM96cDFmFYbzjW+AgBauE0BqncRB4XXg== X-Received: by 2002:a62:140f:: with SMTP id 15mr2470488pfu.50.1593006244167; Wed, 24 Jun 2020 06:44:04 -0700 (PDT) Received: from vpn2.localdomain ([161.117.202.209]) by smtp.gmail.com with ESMTPSA id z144sm21622329pfc.195.2020.06.24.06.44.02 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Jun 2020 06:44:03 -0700 (PDT) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Wed, 24 Jun 2020 21:43:15 +0800 Message-Id: <1593006200-23911-2-git-send-email-lance.lmwang@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1593006200-23911-1-git-send-email-lance.lmwang@gmail.com> References: <1592410030-6553-1-git-send-email-lance.lmwang@gmail.com> <1593006200-23911-1-git-send-email-lance.lmwang@gmail.com> Subject: [FFmpeg-devel] [PATCH v4 2/7] avutil/timecode: add function av_timecode_get_smpte() 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 --- libavutil/timecode.c | 32 ++++++++++++++++++++++++++++++++ libavutil/timecode.h | 13 +++++++++++++ 2 files changed, 45 insertions(+) diff --git a/libavutil/timecode.c b/libavutil/timecode.c index 60077ba..cca53d7 100644 --- a/libavutil/timecode.c +++ b/libavutil/timecode.c @@ -81,6 +81,38 @@ uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum) (hh % 10); // units of hours } +uint32_t av_timecode_get_smpte(AVRational rate, int drop, int hh, int mm, int ss, int ff) +{ + uint32_t tc = 0; + uint32_t frames; + + /* For SMPTE 12-M timecodes, frame count is a special case if > 30 FPS. + See SMPTE ST 12-1:2014 Sec 12.1 for more info. */ + if (av_cmp_q(rate, (AVRational) {30, 1}) == 1) { + frames = ff / 2; + if (ff % 2 == 1) { + if (av_cmp_q(rate, (AVRational) {50, 1}) == 0) + tc |= (1 << 7); + else + tc |= (1 << 23); + } + } else { + frames = ff; + } + + tc |= drop << 30; + tc |= (frames / 10) << 28; + tc |= (frames % 10) << 24; + tc |= (ss / 10) << 20; + tc |= (ss % 10) << 16; + tc |= (mm / 10) << 12; + tc |= (mm % 10) << 8; + tc |= (hh / 10) << 4; + tc |= (hh % 10); + + return tc; +} + char *av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum) { int fps = tc->fps; diff --git a/libavutil/timecode.h b/libavutil/timecode.h index 37c1361..ab38e66 100644 --- a/libavutil/timecode.h +++ b/libavutil/timecode.h @@ -71,6 +71,19 @@ int av_timecode_adjust_ntsc_framenum2(int framenum, int fps); uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum); /** + * Convert sei info to SMPTE 12M binary representation. + * + * @param rate frame rate in rational form + * @param drop drop flag + * @param hh hour + * @param mm minute + * @param ss second + * @param ff frame number + * @return the SMPTE binary representation + */ +uint32_t av_timecode_get_smpte(AVRational rate, int drop, int hh, int mm, int ss, int ff); + +/** * Load timecode string in buf. * * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long