From patchwork Thu Dec 31 00:34:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Yan X-Patchwork-Id: 24723 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 21DD644B729 for ; Thu, 31 Dec 2020 02:41:18 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F22BE6880B2; Thu, 31 Dec 2020 02:41:17 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f180.google.com (mail-oi1-f180.google.com [209.85.167.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CB13C688057 for ; Thu, 31 Dec 2020 02:41:10 +0200 (EET) Received: by mail-oi1-f180.google.com with SMTP id s2so20476682oij.2 for ; Wed, 30 Dec 2020 16:41:10 -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=osTwj7OuV+RXA+zf/LmugSdcDf/rDVZcNt4c/vMvzvs=; b=M/ovUcmEJgv+Sgy4Cvnf40xHaEwyEaivD8qdzJgKBc2X0HUjePQ6scP51RHjFAO0Ax ZoqtZJ4vD7Hgef/L3Rvw3gGqp71ApQwJnjSSICElWf8thHzYalq9/NqoPMqschLfpJ+n 7c6DAbIvR5tNK4g2r74u5yV41eFI8STuswdJ3kwh8RIRPQrSXsGXawlqdTAwI2zKUtyh vKIyXlr0JIuW+x4UHDU/RiSbD538b7AEvyXiGLegUo/7DsYfJUoxkOceyUR4xU2KasU6 mnrwGeGGHSqKcT1eJON3LswEa8feDh//r4javMlS3zyJdOirSb48BdaO0QPPvSTwZfaC hINw== 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=osTwj7OuV+RXA+zf/LmugSdcDf/rDVZcNt4c/vMvzvs=; b=dbYd6q/QX8hPBj08EdRMqZhwWeQoOtLc16JqHBG/Gv9zcpOwNSCKcRkaFxobhgsD5n mHCasNafs6yPHYna3GL4Ltlae3q1cfXu0IoTTsEmLoedpnslEQ51qagSCSOPnYFoMNAY W09xfU8BIqD1J/XXFoLGAg1ES+Vl9tItDdzy1X6CqCnzuZSbxkGr0MrgRG/+Wxu2oj47 ndfGlsvt9fDwlbxPTI1dSnRNHC1PN4Iefmh5grS/Yg4VRFCwWWidXRhFwUAsiGqdXmTk yUZwYy6GtVqrd+f/Qy9WNvw5O4TR1qMIj2mTYkSZYrOAh11JSPVmLAMXo8fsumL1hsUq 8U9g== X-Gm-Message-State: AOAM533DXAzNurhsaOj114wlRgZiIlzDOWkYczR+z3MkQn0kPqnxHWkx lcqPIetJhzpkRoZ8wg1tg/nmUPOvKhs= X-Google-Smtp-Source: ABdhPJzLuP2o3VzpCznYVIrhliJXD8BAtUEopB0sIVy5Uqly9vpxKTEEg36B3HwYnVdAvnRuG1bbZw== X-Received: by 2002:a17:90b:3844:: with SMTP id nl4mr10954322pjb.93.1609374860308; Wed, 30 Dec 2020 16:34:20 -0800 (PST) Received: from archlinux.. ([161.81.68.216]) by smtp.gmail.com with ESMTPSA id 17sm16528616pgy.53.2020.12.30.16.34.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Dec 2020 16:34:19 -0800 (PST) From: Tom Yan To: ffmpeg-devel@ffmpeg.org, andreas.rheinhardt@gmail.com Date: Thu, 31 Dec 2020 08:34:12 +0800 Message-Id: <20201231003412.2417-1-tom.ty89@gmail.com> X-Mailer: git-send-email 2.30.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] 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: sw@jkqxz.net, Tom Yan Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Tom Yan --- doc/bitstream_filters.texi | 6 ++++++ libavcodec/mpeg2_metadata_bsf.c | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi index 8a2f55cc41..7e178a6912 100644 --- a/doc/bitstream_filters.texi +++ b/doc/bitstream_filters.texi @@ -499,6 +499,12 @@ 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. Works only with sequences +that are entirely progressive in nature. + @end table @section mpeg4_unpack_bframes diff --git a/libavcodec/mpeg2_metadata_bsf.c b/libavcodec/mpeg2_metadata_bsf.c index d0048c0e25..8f89ef4f88 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; @@ -55,6 +57,7 @@ static int mpeg2_metadata_update_fragment(AVBSFContext *bsf, MPEG2RawSequenceExtension *se = NULL; MPEG2RawSequenceDisplayExtension *sde = NULL; int i, se_pos; + int last_code = -1; for (i = 0; i < frag->nb_units; i++) { if (frag->units[i].type == MPEG2_START_SEQUENCE_HEADER) { @@ -68,8 +71,25 @@ 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) { + if (ctx->ivtc) { + MPEG2RawPictureCodingExtension *pce = &ext->data.picture_coding; + pce->repeat_first_field = 0; + pce->top_field_first = 0; + if (!pce->frame_pred_frame_dct) { + av_log(bsf, AV_LOG_ERROR, "invalid frame_pred_frame_dct\n"); + return -1; + } + if (!pce->progressive_frame) { + av_log(bsf, AV_LOG_ERROR, "interlaced frame found\n"); + return -1; + } + } } } + last_code = frag->units[i].type; } if (!sh || !se) { @@ -167,6 +187,9 @@ static int mpeg2_metadata_update_fragment(AVBSFContext *bsf, } } + if (ctx->ivtc) + se->progressive_sequence = 1; + return 0; } @@ -288,6 +311,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 } };