From patchwork Wed Dec 30 03:49:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Yan X-Patchwork-Id: 24681 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 D2205449342 for ; Wed, 30 Dec 2020 05:50:08 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8E04068A370; Wed, 30 Dec 2020 05:50:08 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BEE0368A31F for ; Wed, 30 Dec 2020 05:50:01 +0200 (EET) Received: by mail-pl1-f175.google.com with SMTP id q4so8120678plr.7 for ; Tue, 29 Dec 2020 19:50:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=heYtv8Hp//TnFCeUxiaKGjrFNG3WfIU2KjBCPbSf7jE=; b=BlZKb8BK6EqLeqyiH/H5G1HNrWAT4DHBxp9axdQWdiASvbNB2Nq2x1VILrdFAiHUdU BAwYl+YvJvAR7zby+0ee3Rq6PxXXtfUmxgshwKNqqUOO+oFAyMKorFvLHPHfqol60GaW ccW75STgrqHaXJ8dqq0GiT9pweA5GUFQqrjr5R6pH4LuGW+uSBFFpJJBbYcIrrNqhRka PtSWn3PbBkmyeAENc+cEuUntKGrBk+yzgdstdIfkcZak96ctGPwWMvdrksdQ7R6nykNP 3+4mTw8KlQkjHDIStUGbjIPIiCb5C7qwaShmEfAPQmcL8031fwLAByxH6sw4atkD42OI uOcA== 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:mime-version :content-transfer-encoding; bh=heYtv8Hp//TnFCeUxiaKGjrFNG3WfIU2KjBCPbSf7jE=; b=nmNOE5deKopd92rVqTTVwBrYWMFRnd31tAAJbDr7VIFvS7e+yXliZ3F4HlRq14pg05 JJBQgCT7AhsbxJLF4zUHvMqBCjsqyugycapSe8XQOMUf4RZmcwj8GiY2MO4/jUC8p0Oi 0ckdlncvfwPHnINC3j123aVWyQ2mnWcPgJDOmDesPw8YaUNyIG6XLWx2yW5/vLD1cOdd GqzcRyZoFwl7eelCV6r/eq5h937UvWSJhouHpL07ahAtQtOudfIl5SDUQPib33O8pUD6 cFGG65UGC5sL2j/XvWCBv/PjJEymDSrHBgHzclPe3OS14gTo8WGZI4AVvC8ksi17O6lV TUkw== X-Gm-Message-State: AOAM5335anMX8exsxIkowPmeftLMSTwfAOCjivUovKvP8Sb6Ypdsi/Qm Y00YdvPdgX2SfhBd9nB/37EPGwZKSZ0= X-Google-Smtp-Source: ABdhPJxaHZBKz6oZ+uIvVB67Z/3NJKxzKhViWrjd2NxgN3XlU0nShb/1bF5BMtSF4c2jQ5SKaGi2mw== X-Received: by 2002:a17:90a:ff0d:: with SMTP id ce13mr6793899pjb.109.1609300199441; Tue, 29 Dec 2020 19:49:59 -0800 (PST) Received: from archlinux.. ([161.81.68.216]) by smtp.gmail.com with ESMTPSA id mr7sm4394342pjb.31.2020.12.29.19.49.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Dec 2020 19:49:58 -0800 (PST) From: Tom Yan To: ffmpeg-devel@ffmpeg.org, sw@jkqxz.net Date: Wed, 30 Dec 2020 11:49:52 +0800 Message-Id: <20201230034952.99466-1-tom.ty89@gmail.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] mpeg2_metadata: support inverse (soft) telecine 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: Tom Yan Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Tom Yan --- doc/bitstream_filters.texi | 5 +++++ libavcodec/mpeg2_metadata_bsf.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi index 8a2f55cc41..7831abc120 100644 --- a/doc/bitstream_filters.texi +++ b/doc/bitstream_filters.texi @@ -499,6 +499,11 @@ table 6-6). Set the colour description in the stream (see H.262 section 6.3.6 and tables 6-7, 6-8 and 6-9). +@item ivtc +Inverse (soft) telecine, i.e. mark the sequences as progressive +and clear the repeat_first_field and top_field_first bits in +the Picture Coding Extension Data. + @end table @section mpeg4_unpack_bframes diff --git a/libavcodec/mpeg2_metadata_bsf.c b/libavcodec/mpeg2_metadata_bsf.c index d0048c0e25..735680a28b 100644 --- a/libavcodec/mpeg2_metadata_bsf.c +++ b/libavcodec/mpeg2_metadata_bsf.c @@ -43,6 +43,8 @@ typedef struct MPEG2MetadataContext { int transfer_characteristics; int matrix_coefficients; + int ivtc; + int mpeg1_warned; } MPEG2MetadataContext; @@ -54,7 +56,10 @@ static int mpeg2_metadata_update_fragment(AVBSFContext *bsf, MPEG2RawSequenceHeader *sh = NULL; MPEG2RawSequenceExtension *se = NULL; MPEG2RawSequenceDisplayExtension *sde = NULL; + MPEG2RawPictureCodingExtension *pce = NULL; int i, se_pos; + int last_code = -1; + int prog_seq = 1; for (i = 0; i < frag->nb_units; i++) { if (frag->units[i].type == MPEG2_START_SEQUENCE_HEADER) { @@ -68,8 +73,26 @@ static int mpeg2_metadata_update_fragment(AVBSFContext *bsf, } else if (ext->extension_start_code_identifier == MPEG2_EXTENSION_SEQUENCE_DISPLAY) { sde = &ext->data.sequence_display; + } else if (ext->extension_start_code_identifier == + MPEG2_EXTENSION_PICTURE_CODING && last_code == + MPEG2_START_PICTURE) { + pce = &ext->data.picture_coding; + if (ctx->ivtc) { + pce->repeat_first_field = 0; + pce->top_field_first = 0; + if (!pce->frame_pred_frame_dct) { + if (pce->progressive_frame) { + pce->frame_pred_frame_dct = 1; + } else if (prog_seq) { + av_log(bsf, AV_LOG_ERROR, "applying ivtc " + "to non-progressive sequence\n"); + prog_seq = 0; + } + } + } } } + last_code = frag->units[i].type; } if (!sh || !se) { @@ -167,6 +190,9 @@ static int mpeg2_metadata_update_fragment(AVBSFContext *bsf, } } + if (ctx->ivtc) + se->progressive_sequence = 1; + return 0; } @@ -288,6 +314,10 @@ static const AVOption mpeg2_metadata_options[] = { OFFSET(matrix_coefficients), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 255, FLAGS }, + { "ivtc", "Inverse (soft) Telecine", + OFFSET(ivtc), AV_OPT_TYPE_BOOL, + { .i64 = 0 }, 0, 1, FLAGS }, + { NULL } };