From patchwork Fri Jul 17 13:26:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 21141 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 4BAD344B1C3 for ; Fri, 17 Jul 2020 16:26:52 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 218A968B660; Fri, 17 Jul 2020 16:26:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4A41668002C for ; Fri, 17 Jul 2020 16:26:45 +0300 (EEST) Received: by mail-pf1-f173.google.com with SMTP id a14so5393444pfi.2 for ; Fri, 17 Jul 2020 06:26:45 -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=fv2HRDvqGtv0fGBKu2WhE2F3LpfBJDfRLA7jGsvqYVA=; b=KZqYwlAJ4VRyjuLvmdei0ox3zaTCCJxnafV347FQYoOC9x5owBKf3o3lMLEUjHlh9c GI6UOkaxlJr4U5bm5vFNpqk42DWM0v5Q6GEDOE2C0ZEmtGBbiohcotvZeQo8jn2BIuZA JhxqkJiAdwzvZpAXOvTE0nCuMi4lHaND1cc6eyPd0C3Xjwu4Msn+Z3lwLaj1LQk7KOzx LMC8F9pSBp4D6TMSXDN1JPCvItFCLbnexX6xpYazolX5vY418buFgWfWhEdtNRJZwTEw Nq3WssNv9n9aT6UI0GhPCDG5XxKWaB++u+LJxJHi2pDwho4Pe/SM1LzBROogbrYLdUGY BTOg== 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=fv2HRDvqGtv0fGBKu2WhE2F3LpfBJDfRLA7jGsvqYVA=; b=f703hrSdYnhLTmz2fYnX4kGv4CRYGTQG3BEtarDZ/bUpQ+AmRk66ychlxctl7ze39T qfjRHr1jD96BHr3Oo7L5LFKwQeynfiS1F2LoT9Me3tQBoTLaOnuNJnj2zmLxKzzs2yoW YUsjfRna96+3ErUoDTIZ/Y/ozcflhli2ylKOFyy8sC7b7lc2e36G23Skv8SnCP74TxiU Jy1GT6EaoXLaZ5Z94i4ON6BUSOjsWg0elfy4cdeze9QwE3GK5FvXA0uCQJSmK5oSq6ai rUOhLSXfQ/f8DtcjXzVKzvgBKGjSJRvq3buBD0K29Mle7lGLGdEEDyvQmMH1ZuebQF1d OZtA== X-Gm-Message-State: AOAM531WxvimuxMjvwrEWA81uZSqt6LwG48CjEF4pDjaVpaMzsU5LZQ7 B4d1HinsExBm4A+/XYPYDoolHTUY X-Google-Smtp-Source: ABdhPJwFrWceIaEROuVM5Nls2iAMO0igAmlqeZLOfzsvwZmByrcRsoiKz5elnyyXJuMz8GfyD8nMDw== X-Received: by 2002:a63:3151:: with SMTP id x78mr8901075pgx.210.1594992403117; Fri, 17 Jul 2020 06:26:43 -0700 (PDT) Received: from vpn2.localdomain ([161.117.202.209]) by smtp.gmail.com with ESMTPSA id t184sm8368078pfd.49.2020.07.17.06.26.41 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Jul 2020 06:26:42 -0700 (PDT) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 17 Jul 2020 21:26:37 +0800 Message-Id: <1594992398-29104-1-git-send-email-lance.lmwang@gmail.com> X-Mailer: git-send-email 1.8.3.1 Subject: [FFmpeg-devel] [PATCH 1/2] avdevice/decklink_dec: mark the field flag if framerate > 30FPS 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 In SMPTE ST 12-1: 2014 Sec 12.2, we need to mark the frame flag if the frame rate > 30FPS to avoid interoperability issues. It will be used by the encoder to identify even or odd frames and correctly calculate the frame number of the SEI TC. --- libavdevice/decklink_common.h | 1 + libavdevice/decklink_dec.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/libavdevice/decklink_common.h b/libavdevice/decklink_common.h index bd68c7b..8ddc411 100644 --- a/libavdevice/decklink_common.h +++ b/libavdevice/decklink_common.h @@ -151,6 +151,7 @@ struct decklink_ctx { int channels; int audio_depth; unsigned long tc_seen; // used with option wait_for_tc + uint32_t last_tc; }; typedef enum { DIRECTION_IN, DIRECTION_OUT} decklink_direction_t; diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp index dde68ff..a60c01b 100644 --- a/libavdevice/decklink_dec.cpp +++ b/libavdevice/decklink_dec.cpp @@ -884,12 +884,26 @@ HRESULT decklink_input_callback::VideoInputFrameArrived( int metadata_len; uint8_t* packed_metadata; AVTimecode tcr; + AVRational rate = ctx->video_st->r_frame_rate; if (av_timecode_init_from_string(&tcr, ctx->video_st->r_frame_rate, tc, ctx) >= 0) { uint32_t tc_data = av_timecode_get_smpte_from_framenum(&tcr, 0); int size = sizeof(uint32_t) * 4; uint32_t *sd = (uint32_t *)av_packet_new_side_data(&pkt, AV_PKT_DATA_S12M_TIMECODE, size); + /* set the field flag if frame rate > 30FPS */ + /* Refer to SMPTE ST 12-1:2014 Sec 12.2 */ + if (av_cmp_q(rate, (AVRational) {30, 1}) == 1) { + /* Odd frame */ + if (ctx->last_tc == tc_data) { + if (av_cmp_q(rate, (AVRational) {50, 1}) == 0) + tc_data |= (1 << 7); + else + tc_data |= (1 << 23); + } + } + ctx->last_tc = tc_data; + if (sd) { *sd = 1; // one TC *(sd + 1) = tc_data; // TC From patchwork Fri Jul 17 13:26:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 21142 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 3E0B444B1C3 for ; Fri, 17 Jul 2020 16:26:57 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 246A368B664; Fri, 17 Jul 2020 16:26:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 915CD68B61B for ; Fri, 17 Jul 2020 16:26:50 +0300 (EEST) Received: by mail-pj1-f48.google.com with SMTP id md7so6365277pjb.1 for ; Fri, 17 Jul 2020 06:26:50 -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=YNSE3o+ZeUM7YWKr6EDeATdd7J0HnRdOXwhlNYKjNGw=; b=XKcZTRCaU+2xpfKLjYJ3DMl3bdzBzNNkq5CUg+vs85FDham47iLFgGMHzT7aGTIeC6 y8fGB/d0Tj545OnTPp5voA06KHLmdILim4QBuW4VAuAb0EH+e3kydnoaKaOZI6OlIR5G p80OAZJcjvDgIr2Br+U6eGj/YdRWnY71xZ4Bcc0BSe8sEcgbFLAQxjjMvg/GZgl+7L28 VuTBlcvPQ31aAdiAkI1qwtcvwzZLQsos2K4i51Y3GvWja4tvbDLAZYFbH8388f6m0Gsn IobEgQ6xLU7A9Hsw6VIzdWmDcgtex1DWNWsDxMyngsWF8Up4/fUKYm9FOjTz/4FcMCVV NCXw== 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=YNSE3o+ZeUM7YWKr6EDeATdd7J0HnRdOXwhlNYKjNGw=; b=T/Pr/i+UKA9HnxSOv/uNdi2m0SfOqpJgDDHJ6LJEbJrlZv5bUgnAvkkO7yCeymGo2W soMHtQGX/ve8p05H73f8t4J9u8SO1ThjRZJfK5IHDbYcCQ56rVU4HIKkMHuj6txSVdj4 ZmyM/RB3LGe2BRQdNlEVNymIrneJXDMaFAOOMv1MpefYgIx2d4WTyGRYid+W4LdE9GC2 7PhuQ2JFIIJo1lxhaV7+psLQmZVuExeL/Mdhri+FUT5cBGAkDMSZPQKQLkM/mv1UQCNq L8G9ugQYBDu1FuF95xHngMzeyM+x65LNdZ6yCS4PChj11oDD2tlelPRTNH+xFNxUBaHo 2Ruw== X-Gm-Message-State: AOAM531PzFxAZX4PaUkGO7yMZYnZQfbM8z8LfYYNFUmtOQ4rKSxxT3At rtoOE7U5C/ylIX87rrCVRoJUkHz7 X-Google-Smtp-Source: ABdhPJxesYG5TADgVimsYnZjFRBQVRxoU7R3bg0vX+4AeHcDjntRGUSz5UBDHcTruoeRN698ryRH2A== X-Received: by 2002:a17:902:6bc2:: with SMTP id m2mr7947200plt.158.1594992408108; Fri, 17 Jul 2020 06:26:48 -0700 (PDT) Received: from vpn2.localdomain ([161.117.202.209]) by smtp.gmail.com with ESMTPSA id t184sm8368078pfd.49.2020.07.17.06.26.46 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Jul 2020 06:26:47 -0700 (PDT) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 17 Jul 2020 21:26:38 +0800 Message-Id: <1594992398-29104-2-git-send-email-lance.lmwang@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1594992398-29104-1-git-send-email-lance.lmwang@gmail.com> References: <1594992398-29104-1-git-send-email-lance.lmwang@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/utils: calculate frame number of HEVC if the framerate > 30FPS 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 --- libavcodec/internal.h | 3 ++- libavcodec/nvenc.c | 2 +- libavcodec/utils.c | 13 ++++++++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/libavcodec/internal.h b/libavcodec/internal.h index 0a1c0a1..4c34d7d 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -382,6 +382,7 @@ int ff_alloc_a53_sei(const AVFrame *frame, size_t prefix_len, * Check AVFrame for S12M timecode side data and allocate and fill TC SEI message with timecode info * * @param frame Raw frame to get S12M timecode side data from + * @param rate The frame rate * @param prefix_len Number of bytes to allocate before SEI message * @param data Pointer to a variable to store allocated memory * Upon return the variable will hold NULL on error or if frame has no S12M timecode info. @@ -390,7 +391,7 @@ int ff_alloc_a53_sei(const AVFrame *frame, size_t prefix_len, * @param sei_size Pointer to a variable to store generated SEI message length * @return Zero on success, negative error code on failure */ -int ff_alloc_timecode_sei(const AVFrame *frame, size_t prefix_len, +int ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t prefix_len, void **data, size_t *sei_size); /** diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index c6740c1..45a7b60 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -2218,7 +2218,7 @@ static int nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame) void *tc_data = NULL; size_t tc_size = 0; - if (ff_alloc_timecode_sei(frame, 0, (void**)&tc_data, &tc_size) < 0) { + if (ff_alloc_timecode_sei(frame, avctx->framerate, 0, (void**)&tc_data, &tc_size) < 0) { av_log(ctx, AV_LOG_ERROR, "Not enough memory for timecode sei, skipping\n"); } diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 2ece34f..51c4067 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -2254,7 +2254,7 @@ static unsigned bcd2uint(uint8_t bcd) return low + 10*high; } -int ff_alloc_timecode_sei(const AVFrame *frame, size_t prefix_len, +int ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t prefix_len, void **data, size_t *sei_size) { AVFrameSideData *sd = NULL; @@ -2290,6 +2290,17 @@ int ff_alloc_timecode_sei(const AVFrame *frame, size_t prefix_len, unsigned ff = bcd2uint(tcsmpte>>24 & 0x3f); // 6-bit frames unsigned drop = tcsmpte & 1<<30 && !0; // 1-bit drop if not arbitrary bit + /* Calculate frame number of HEVC by SMPTE ST 12-1:2014 Sec 12.2 if rate > 30FPS */ + if (av_cmp_q(rate, (AVRational) {30, 1}) == 1) { + unsigned pc; + ff *= 2; + if (av_cmp_q(rate, (AVRational) {50, 1}) == 0) + pc = !!(tcsmpte & 1 << 7); + else + pc = !!(tcsmpte & 1 << 23); + ff = (ff + pc) & 0x7f; + } + put_bits(&pb, 1, 1); // clock_timestamp_flag put_bits(&pb, 1, 1); // units_field_based_flag put_bits(&pb, 5, 0); // counting_type