From patchwork Fri Jun 16 22:12:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Devin Heitmueller X-Patchwork-Id: 42157 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c526:b0:117:ac03:c9de with SMTP id gm38csp1831493pzb; Fri, 16 Jun 2023 14:15:23 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4nzIDToTzRAdH7WtdepUChyBP1NrPb52QaBtvMn5Y8jc7bAN32+F9W2Bs/mPvz2bh6VnaI X-Received: by 2002:a17:907:c25:b0:974:5403:ebb with SMTP id ga37-20020a1709070c2500b0097454030ebbmr3544697ejc.54.1686950122903; Fri, 16 Jun 2023 14:15:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686950122; cv=none; d=google.com; s=arc-20160816; b=QJeMtnUUEZBZiav6yI7EmJMEBS9xKfssUkP1F1VnMYbulX6z6+MbRFIuMkpZ7SbsxQ vLbc6AKONEeKBeLvUe1Zb+Fd7PcScsIcG+eV4RQCGH6rbmzHa+Grt+6cKs/cCOJ0oAID 14xKBdztp3KYggpk7chffkzFh6ERBF5wT47833/aMpU0EgRrr7R+s1Du/mjDka+558Rs l4PUIEhm21JhYYm9h5cXVnJuMxAvmnniOgPLpNf1zdM2DtMBQKqIhMnV51hPsg0e8lv6 Ra9azmDQ6vOhAYS4yZGymFKt1Xp63KVXNA8JJjEL4J12/XHbMM2sFDhynJRpQbjlVdAC HGVA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=6Gy8tRXQ4yf3LpwPo6s/xwgDvn6KJeB9O+ePB9woVUI=; b=NuUJ6r88bjcWDmd0Og31CWvO+/1RLv2xNH5xGsHtj82Ye2jF8wA+PnuZZScFub2MrG BYEtJLfcJgqbPn+Py1iFs4/y0eKom8ftWt6kJjmsSzNIGTF9pBZVZ2EXGvF3pzBRhXw8 rSVrPzQH8vge+/AN/jNVxUG07K+mOMwhnYsfcighmA5tKuuj9ackriMAP9pzrKOSdr4N DtAVQlkcBFc++SWmwUg8whEfLxXoQfa6FMCc3bOH/NEzpEkRzYEdJiDb9c+hfnhSRKCH 8ak9wSRtrB8C8foscMI3uV4CQy+hWw5QkTmZi1EcKe46790UQjFM98QC3odgf6+o9JCM JvBA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@ltnglobal-com.20221208.gappssmtp.com header.s=20221208 header.b="xI4A4/gB"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l12-20020a17090615cc00b009827e07cca6si3743232ejd.17.2023.06.16.14.15.22; Fri, 16 Jun 2023 14:15:22 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@ltnglobal-com.20221208.gappssmtp.com header.s=20221208 header.b="xI4A4/gB"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 336E468BF7D; Sat, 17 Jun 2023 00:15:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f45.google.com (mail-qv1-f45.google.com [209.85.219.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 07C0268BB5A for ; Sat, 17 Jun 2023 00:15:01 +0300 (EEST) Received: by mail-qv1-f45.google.com with SMTP id 6a1803df08f44-6300465243eso3617466d6.2 for ; Fri, 16 Jun 2023 14:15:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ltnglobal-com.20221208.gappssmtp.com; s=20221208; t=1686950099; x=1689542099; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to; bh=V3c9HE5dH+8dweqVaMsJw10IWY/9bvoobh4v5jGmpl0=; b=xI4A4/gBI2KC5QMZibUl3vv5Y8sQW6lryKC+DVPZdVoP7yRT/23FK/1mqDxTCEksBA lGdWqlT7Hl6o7+YRl7ZA5FXlBDHctXYrI6DSngnZmJRWA8CBBi73O+2eEznpywtS9yKt zUud4CndXdASNDe4UKHXJ73+zOt6fewg2gq1HP8ubyfn7shCHH1rgLDJ88Exi1Tgv2sM ikYyy7RcTSNlOCldQDyzlVBnZlAoab9hr4rYBtx/0wbPmOKw4EFnd6aNaqMSOKeEvj87 hToTxpV/h1i29F5FiPxz8HD20uYwSR7a+fTW/kLxHZ5lLcsg60o/xDdQh/W5IQvoTBfX 2COA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686950099; x=1689542099; h=references:in-reply-to:message-id:date:subject:cc:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=V3c9HE5dH+8dweqVaMsJw10IWY/9bvoobh4v5jGmpl0=; b=J6/HaV3uSncaByVye6Lvn0tiQrCHOpC0ed8JVsZcdOZsw7Swj4dqxO8yKNpqJ+f4x+ b/htX+OMOFxgKe3wRSkU9H0j3Wt6vtXUVVT6VlP8/Rf/h/jCRYGai/CRu1u4cYnx85Za QtPx8ZyEmX6K/9nbB9lnUPO+1YJotiILqNPOgcjsW0oVQWoI3tUXksmRrId1tm03qosM mOOeblN2MIR7rb817zdLZtn/HwQT6/l5UylfuLGh8cK5lQc8yYMLzESty3d5z91H3qzd X6iv2sdf3T/N7n7zXw4LEe1P9h+tzyiJPlBPKJdNeGg+0N4PXZBtJgDq44168904xfLr xgnQ== X-Gm-Message-State: AC+VfDzsWD6bkue1T0u8bqKQDtljJbVeNRjcHPyziZINa01q88HhJMJn XnOYvB0wp1s7wPXMIxNTRs9h5huZohaG4FZPA8Y= X-Received: by 2002:a05:6214:21c5:b0:62d:e656:1aa0 with SMTP id d5-20020a05621421c500b0062de6561aa0mr4281518qvh.54.1686950099662; Fri, 16 Jun 2023 14:14:59 -0700 (PDT) Received: from ltnt-nyc-580testdevin.livetimenet.com (pool-71-105-132-214.nycmny.fios.verizon.net. [71.105.132.214]) by smtp.gmail.com with ESMTPSA id t8-20020a0cb388000000b0061a68b5a8c4sm7450812qve.134.2023.06.16.14.14.59 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Jun 2023 14:14:59 -0700 (PDT) From: Devin Heitmueller X-Google-Original-From: Devin Heitmueller To: ffmpeg-devel@ffmpeg.org Date: Fri, 16 Jun 2023 18:12:54 -0400 Message-Id: <1686953578-18843-2-git-send-email-dheitmueller@ltnglobal.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1686953578-18843-1-git-send-email-dheitmueller@ltnglobal.com> References: <1686953578-18843-1-git-send-email-dheitmueller@ltnglobal.com> Subject: [FFmpeg-devel] [PATCH 1/5] avcodec: Add new side data type to contain original PTS value X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Devin Heitmueller MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Q5Dpp1ZSQDVc In order to properly process SCTE-35 packets, we need the original PTS value from the demux (i.e. not mangled by the application or reclocked for the output). This allows us to set the pts_adjustment field in an BSF on the output side. Introduce a new side data type to store the original PTS. Signed-off-by: Devin Heitmueller --- libavcodec/packet.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libavcodec/packet.h b/libavcodec/packet.h index f28e7e7..a86a550 100644 --- a/libavcodec/packet.h +++ b/libavcodec/packet.h @@ -300,6 +300,16 @@ enum AVPacketSideDataType { AV_PKT_DATA_DYNAMIC_HDR10_PLUS, /** + * Provides the original PTS when passed through the demux. This can + * be used to offset any subsequent changes made by the caller to + * adjust PTS values (such as pts_offset). We need this for SCTE-35, + * since by the time the packets reach the output the PTS values have + * already been re-written, and we cannot calculate pre-roll values + * using the PTS values embedded in the packet content + */ + AV_PKT_DATA_ORIG_PTS, + + /** * The number of side data types. * This is not part of the public API/ABI in the sense that it may * change when new side data types are added. From patchwork Fri Jun 16 22:12:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Devin Heitmueller X-Patchwork-Id: 42158 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c526:b0:117:ac03:c9de with SMTP id gm38csp1831558pzb; Fri, 16 Jun 2023 14:15:31 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4PP1Gwpm6+/Pdh2/VBwbkMQ8lryhBG2+mAw6QaSTrtO+X/j4tUW0ZYEqyzy1DFK1vcd5VW X-Received: by 2002:a17:907:6e10:b0:973:ddfe:e074 with SMTP id sd16-20020a1709076e1000b00973ddfee074mr3051454ejc.2.1686950131085; Fri, 16 Jun 2023 14:15:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686950131; cv=none; d=google.com; s=arc-20160816; b=UvIWBS+KYF6RwX6J8PXzzGXkDfYPcAM2pBRrFpjJeiXuDQ0//mViDFfs37Ay1IaTlt PgnyRxcDZe4zf057m0mgeSmlsPY21xjpk0X8GifzVMDHpNPAc/L3fUcptaReMDWc6brn 5oJd19MSh6/XTijOvfv7ClkyAHy8J3tTcsWQAhkzU5rWPf5C3HwKfWqD8dqS5T1f4iI8 wpRuYfYU3Z9J3QqfuDN2kRhsGF5H46k49isCMTIghQElfxEsAf9Nb3fczy5IzrotXrQp /C6ruw9wqoklE/CqdNtPiDoJ/Oeb44BQ/mXUi0bbzjcuugKjWybjTz3Qr0K68OVUQoWW J9mA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=Z3vLT1vFo2tYkUECBdTCIoMf6KvqdfAVUqqxkYaoH8o=; b=A5CiutOiZqvBLuJN5/0tU2bMk0J4IJZmh8i4CuVu9RlMriJCYIbZ9u4uhgi1Auu0gZ /uiK00GMn0/DL3affdwlJEXg9gZ8u1aGZg601e4zUmrdo38tKzVU1iZpZwUnvSgKIhoJ sIRJpssvUFgD9WDwWpXHN5VwS/csYKcf/aEqZYVqpBqSQ4UYyPOfoe5pPMaL2VIpKpx3 4Gfnaxz9GqZBvmnzWEmKwpSM1ZXl4Ay341EGUGt3yYYrFtkJwgUQrFPGQ1cd71eam3AK RR9Ca4rzvC2hOtEYQtC7TbZ9wuG0cxhHifkVTDNDveH3zrPs5T1GGVdI7u670B8tCiyQ yuNA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@ltnglobal-com.20221208.gappssmtp.com header.s=20221208 header.b=BXPkE13p; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v25-20020a17090690d900b009868abfe2dasi902121ejw.163.2023.06.16.14.15.30; Fri, 16 Jun 2023 14:15:31 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@ltnglobal-com.20221208.gappssmtp.com header.s=20221208 header.b=BXPkE13p; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 392EA68AD70; Sat, 17 Jun 2023 00:15:10 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f42.google.com (mail-qv1-f42.google.com [209.85.219.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A65ED68BB5A for ; Sat, 17 Jun 2023 00:15:01 +0300 (EEST) Received: by mail-qv1-f42.google.com with SMTP id 6a1803df08f44-630038f13daso4001466d6.3 for ; Fri, 16 Jun 2023 14:15:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ltnglobal-com.20221208.gappssmtp.com; s=20221208; t=1686950100; x=1689542100; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to; bh=4bxjdigo8lbgFAeuJu6ft3XO30Nr5McH4Z4TVM4pxPY=; b=BXPkE13pC2WiRgRxubd5KztLppmXKdPdssIdtJeOIhOYhgeZ4bi3feOsAqS5liJ3jt vqHJlLAyyjxO6Z06rnEAeNPtDPVtj82QTjvNAZYsoN0PAS0oK1WxO/ib/Gk5ToY2ESqU JlsJUk248gKeXEEekhY+giaTbU5zJS81oxMwuIrq7qYjy2n/L8iH/JCs/F+AF8z7fTXS p+dV81aRhz2zrUAEbqGbvuPm5Y50O1ERyO8h7oOrqWTjAG785F66P7e7giunOGoGTFqJ QSIxFW944FobOlTSkZFwEmoieqDyujzcu1zeA7NohYV1z4PoZrLXoxmuV7HhmCT9UIv1 pbKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686950100; x=1689542100; h=references:in-reply-to:message-id:date:subject:cc:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4bxjdigo8lbgFAeuJu6ft3XO30Nr5McH4Z4TVM4pxPY=; b=UdwFXOrr9KRUwSzgHcN9evW41x4Evu1gRTVByJfR9evOHLtEz70nIz5VtvaU66WbI9 /xHaWd87Nxj963+9Qa412bHcMy9pTeTDu+T4K+7OJb+p6KpDnU4Oau4jJbhWdsr6I/Zj GZEKyn4ZpT39qYwVk+hCCuAY+hQco8eJM0cfREMKlb2xD/HJcwXdz4w2ZCMjmLVDt9jG FckITpIYoQRSzsGD2aWVR2vw8fIty3Pjl8TY2MnLDKUqYQg++I4BRs8yweqmPL1aE7Id NQp5uoCJr3N7Zriy1ga3Lfxz5wMgHacEu1CvQMfJudxkwF+Ge5WzlKVIQgPxFpNf2Swn 9x/A== X-Gm-Message-State: AC+VfDwmbQWMYCZ92y8JmYaKeZbLao7xD9sX+szkIYjZVPJtx2tPNfDW 78P6hgZFFqdPkykHpoPdImQ+zIrBe4hkQ1Jgsaw= X-Received: by 2002:a05:6214:2684:b0:62b:4ecb:fa72 with SMTP id gm4-20020a056214268400b0062b4ecbfa72mr4409948qvb.20.1686950100257; Fri, 16 Jun 2023 14:15:00 -0700 (PDT) Received: from ltnt-nyc-580testdevin.livetimenet.com (pool-71-105-132-214.nycmny.fios.verizon.net. [71.105.132.214]) by smtp.gmail.com with ESMTPSA id t8-20020a0cb388000000b0061a68b5a8c4sm7450812qve.134.2023.06.16.14.14.59 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Jun 2023 14:14:59 -0700 (PDT) From: Devin Heitmueller X-Google-Original-From: Devin Heitmueller To: ffmpeg-devel@ffmpeg.org Date: Fri, 16 Jun 2023 18:12:55 -0400 Message-Id: <1686953578-18843-3-git-send-email-dheitmueller@ltnglobal.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1686953578-18843-1-git-send-email-dheitmueller@ltnglobal.com> References: <1686953578-18843-1-git-send-email-dheitmueller@ltnglobal.com> Subject: [FFmpeg-devel] [PATCH 2/5] mpegts: Stash original PTS for SCTE-35 sections for processing later X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Devin Heitmueller MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 3cy4kd3NselS We need the original PTS value in order to do subsequent processing, so set it as packet side data. Signed-off-by: Devin Heitmueller --- libavformat/mpegts.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 385d78b..b8f1d7d 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -1782,8 +1782,15 @@ static void scte_data_cb(MpegTSFilter *filter, const uint8_t *section, prg = av_find_program_from_stream(ts->stream, NULL, idx); if (prg && prg->pcr_pid != -1 && prg->discard != AVDISCARD_ALL) { MpegTSFilter *f = ts->pids[prg->pcr_pid]; - if (f && f->last_pcr != -1) + if (f && f->last_pcr != -1) { + int64_t *orig_pts; ts->pkt->pts = ts->pkt->dts = f->last_pcr/300; + orig_pts = (int64_t *) av_packet_new_side_data(ts->pkt, + AV_PKT_DATA_ORIG_PTS, + sizeof(int64_t)); + if (orig_pts) + *orig_pts = ts->pkt->pts; + } } ts->stop_parse = 1; From patchwork Fri Jun 16 22:12:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Devin Heitmueller X-Patchwork-Id: 42159 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c526:b0:117:ac03:c9de with SMTP id gm38csp1831645pzb; Fri, 16 Jun 2023 14:15:43 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4vRLoUcy/2W/iX0yqLdDMOhQjAZZzPpJ9mKXj/l8dTWE4Qvhvt+EIhWxf41uOK96GKLL1H X-Received: by 2002:a17:907:1b17:b0:96f:1f79:c0a6 with SMTP id mp23-20020a1709071b1700b0096f1f79c0a6mr2677434ejc.70.1686950143072; Fri, 16 Jun 2023 14:15:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686950143; cv=none; d=google.com; s=arc-20160816; b=ojwU14fyR2vNY4v6Lz0Xn0I058UkA/6dDzWDbDSg3nAI5vwpDpJNtNU2Ynlertpzfs p5iQt0VtTQ1bOcv3uTqsHb8fGWwF3xHjkytFzODdMqGOnI/lNZ5NSOPG5faNyzAkVmx4 ymxU3HfC4A3aKW+sLvKjUudrHrT7MWtRZTha8rBHeHUpvgW82eHD512u0mYlixzXHAx5 REg6tR+H54AT5SPqljDw2IkkbYlDMFFh6sUnrnlq0MSp4U5m4gwDI5yek1iGLTh2n6an 7aN7rw1pK8EmghPZVbWFjVSbcq16NxXNQ8cB4ExODAWNZNkU9xMuQkmP8MpXV0VaCwHI iorA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=avgFnl6HNAVzdvvAjCF+yXZAt4n/dTgq+Y6281Jhzsw=; b=At93PcE2NnX3nAXlkUFWaP8+z4I2kKrVNxD/WNSK/6Bd0a9ah9b0MhFylOyFsv6P29 4xgxW30kvC69UL7UtiqUZYIUCtTGF2cYOzODFlTDHS6Oq1l6uMJv/NqvfFNV/hy1BOfY m6v36SChQ65FLJU6HLUmJfVD+S1xQve9aCEN0HJ/EvM5NUU/lkfdLMN+Om+BRoyAcajZ zqyVrMGbEjgkgHUlHNjkWAamgcTDgbD+KNwN+d+nPxTnOazefVhRaAOU43IAs1lmqf0h FsVdyVPa8knv9WvbckjqCBt3FwmF87ETp6chk6F/N+QOMBEbIJJceAmlOiSsJpmR+DTV r5Vg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@ltnglobal-com.20221208.gappssmtp.com header.s=20221208 header.b="1lR/kxth"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id i23-20020a170906251700b00982c69d8103si2040252ejb.797.2023.06.16.14.15.39; Fri, 16 Jun 2023 14:15:43 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@ltnglobal-com.20221208.gappssmtp.com header.s=20221208 header.b="1lR/kxth"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 20F2E68C297; Sat, 17 Jun 2023 00:15:11 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f177.google.com (mail-qk1-f177.google.com [209.85.222.177]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CCE9A68BD68 for ; Sat, 17 Jun 2023 00:15:02 +0300 (EEST) Received: by mail-qk1-f177.google.com with SMTP id af79cd13be357-7622f7903edso96725885a.0 for ; Fri, 16 Jun 2023 14:15:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ltnglobal-com.20221208.gappssmtp.com; s=20221208; t=1686950101; x=1689542101; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to; bh=mgn1IXm5zp+Oc2RiyejXeVRTpXXr4BQSkba+CMTiD5g=; b=1lR/kxth7zScPOqOzALWY21Ro45x9EQGPIdo73ulWS8yR5dd49kyXJWqvReBRkZ7d/ zt60wzuz31jZIQbVpBO7ChUhLli6PQ1rWhoHlWhgoiBLM1gZ1mcYcqcWs+Q+QgZ3oPIz 9gX5mAZl9tZiY+huQ1k8zlB1X/vfC/JqBBFLRLwq7qPPXC7FmuoP/8BnOT0u5jqM0ize Vv3FZ4hyTm1l6KBQ77tiZjQBdDmQz5xEIPQL523pws1/1wlM2RvDYdWB29sZ9cmIQ7y9 5RndyXG+b0Y/HuhmTjRC6qGBGesC9s09Jg5PP+AJlU3QjJewCQlxzrx24L6CemHIz3m8 I0zA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686950101; x=1689542101; h=references:in-reply-to:message-id:date:subject:cc:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=mgn1IXm5zp+Oc2RiyejXeVRTpXXr4BQSkba+CMTiD5g=; b=CYtlOJo62pZ0Iq4wpQfCQAG8akt9zaARjRJpNqRxrxWC7XEyz6ZGxA6VA70VHb/4rd GTe8xdhW4Vx0v2r+W+rXcEn319zLRxXWEgNlOm0YEZk/RDPvXJdH3n2OUaR4rL0bovYO 0Egx8BouOsaoJYhOa/rvNja5O50JI4Utu3eTSfa6r6U4viyJ2dfOfmfj29Usnvl68Irp SJMlv8QyVw0ojvFVGLUMYrJE0bM0qbpdRKqs3B53nB4oOhKGiTZgyEtj+W3S2NOVKgnM TqzEyesALynDkKPvlUjLUTudIuOjM+Bl7aYpC1O/Z/QFQ5B/mFNkasXCXOIy9aRQUEfl +aMg== X-Gm-Message-State: AC+VfDxN/198LTMU798TpG/iH7Dhh4MLL7fuBEE3L/fMVGn8KfegB+tb Br2UV7g0Ud8JkTPjFiljS4icbJpNogHBD86QPfs= X-Received: by 2002:a05:6214:21c1:b0:62d:e3c1:b884 with SMTP id d1-20020a05621421c100b0062de3c1b884mr3830207qvh.16.1686950100975; Fri, 16 Jun 2023 14:15:00 -0700 (PDT) Received: from ltnt-nyc-580testdevin.livetimenet.com (pool-71-105-132-214.nycmny.fios.verizon.net. [71.105.132.214]) by smtp.gmail.com with ESMTPSA id t8-20020a0cb388000000b0061a68b5a8c4sm7450812qve.134.2023.06.16.14.15.00 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Jun 2023 14:15:00 -0700 (PDT) From: Devin Heitmueller X-Google-Original-From: Devin Heitmueller To: ffmpeg-devel@ffmpeg.org Date: Fri, 16 Jun 2023 18:12:56 -0400 Message-Id: <1686953578-18843-4-git-send-email-dheitmueller@ltnglobal.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1686953578-18843-1-git-send-email-dheitmueller@ltnglobal.com> References: <1686953578-18843-1-git-send-email-dheitmueller@ltnglobal.com> Subject: [FFmpeg-devel] [PATCH 3/5] mpegtsenc: Add support for output of SCTE-35 streams over TS X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Devin Heitmueller MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: +uAqtZb/4MnM Introduce the ability to pass through SCTE-35 packets when creating MPEG transport streams. Note that this patch makes no effort to change the PTS values in the SCTE-35 packets, and thus only works when not reclocking the stream (i.e. using -copyts). A subsequent patch includes a BSF to recompute the PTS values. Signed-off-by: Devin Heitmueller --- libavformat/mpegts.h | 1 + libavformat/mpegtsenc.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++--- libavformat/mux.c | 6 ++-- 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/libavformat/mpegts.h b/libavformat/mpegts.h index a48f14e..a7aaaba 100644 --- a/libavformat/mpegts.h +++ b/libavformat/mpegts.h @@ -137,6 +137,7 @@ #define STREAM_TYPE_AUDIO_AC3 0x81 #define STREAM_TYPE_AUDIO_DTS 0x82 #define STREAM_TYPE_AUDIO_TRUEHD 0x83 +#define STREAM_TYPE_SCTE_35 0x86 #define STREAM_TYPE_AUDIO_EAC3 0x87 /* ISO/IEC 13818-1 Table 2-22 */ diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index 700fc54..c6cd1fd 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -425,6 +425,9 @@ static int get_dvb_stream_type(AVFormatContext *s, AVStream *st) case AV_CODEC_ID_SMPTE_2038: stream_type = STREAM_TYPE_PRIVATE_DATA; break; + case AV_CODEC_ID_SCTE_35: + stream_type = STREAM_TYPE_SCTE_35; + break; case AV_CODEC_ID_DVB_SUBTITLE: case AV_CODEC_ID_DVB_TELETEXT: case AV_CODEC_ID_ARIB_CAPTION: @@ -522,6 +525,16 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) *q++ = 0xfc; // private_data_byte } + /* If there is an SCTE-35 stream, we need a registration descriptor + at the program level (SCTE 35 2016 Sec 8.1) */ + for (i = 0; i < s->nb_streams; i++) { + AVStream *st = s->streams[i]; + if (st->codecpar->codec_id == AV_CODEC_ID_SCTE_35) { + put_registration_descriptor(&q, MKTAG('C', 'U', 'E', 'I')); + break; + } + } + val = 0xf000 | (q - program_info_length_ptr - 2); program_info_length_ptr[0] = val >> 8; program_info_length_ptr[1] = val; @@ -533,6 +546,14 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) const char default_language[] = "und"; const char *language = lang && strlen(lang->value) >= 3 ? lang->value : default_language; enum AVCodecID codec_id = st->codecpar->codec_id; + uint16_t pid; + + if (st->codecpar->codec_id == AV_CODEC_ID_SCTE_35) { + MpegTSSection *sect = st->priv_data; + pid = sect->pid; + } else { + pid = ts_st->pid; + } if (s->nb_programs) { int k, found = 0; @@ -556,7 +577,7 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) stream_type = ts->m2ts_mode ? get_m2ts_stream_type(s, st) : get_dvb_stream_type(s, st); *q++ = stream_type; - put16(&q, 0xe000 | ts_st->pid); + put16(&q, 0xe000 | pid); desc_length_ptr = q; q += 2; /* patched after */ @@ -819,6 +840,10 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) putbuf(&q, tag, strlen(tag)); *q++ = 0; /* metadata service ID */ *q++ = 0xF; /* metadata_locator_record_flag|MPEG_carriage_flags|reserved */ + } else if (st->codecpar->codec_id == AV_CODEC_ID_SCTE_35) { + *q++ = 0x8a; /* Cue Identifier Descriptor */ + *q++ = 0x01; /* length */ + *q++ = 0x01; /* Cue Stream Type (see Sec 8.2) */ } break; } @@ -1159,6 +1184,33 @@ static int mpegts_init(AVFormatContext *s) AVStream *st = s->streams[i]; MpegTSWriteStream *ts_st; + if (st->codecpar->codec_id == AV_CODEC_ID_SCTE_35) { + struct MpegTSSection *sect; + sect = av_mallocz(sizeof(MpegTSSection)); + if (!sect) { + ret = AVERROR(ENOMEM); + continue; + } + + if (st->id < 16) { + sect->pid = ts->start_pid + i; + } else if (st->id < 0x1FFF) { + sect->pid = st->id; + } else { + av_log(s, AV_LOG_ERROR, + "Invalid stream id %d, must be less than 8191\n", st->id); + ret = AVERROR(EINVAL); + continue; + } + + sect->write_packet = section_write_packet; + sect->opaque = s; + sect->cc = 15; + sect->discontinuity= ts->flags & MPEGTS_FLAG_DISCONT; + st->priv_data = sect; + continue; + } + ts_st = av_mallocz(sizeof(MpegTSWriteStream)); if (!ts_st) { return AVERROR(ENOMEM); @@ -1877,6 +1929,19 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt) dts += delay; } + if (st->codecpar->codec_id == AV_CODEC_ID_SCTE_35) { + MpegTSSection *s = st->priv_data; + uint8_t data[SECTION_LENGTH]; + + if (size > SECTION_LENGTH) { + av_log(s, AV_LOG_ERROR, "SCTE-35 section too long\n"); + return AVERROR_INVALIDDATA; + } + memcpy(data, buf, size); + mpegts_write_section(s, data, size); + return 0; + } + if (!ts_st->first_timestamp_checked && (pts == AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE)) { av_log(s, AV_LOG_ERROR, "first pts and dts value must be set\n"); return AVERROR_INVALIDDATA; @@ -2149,7 +2214,8 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt) return 0; } - if (ts_st->payload_size && (ts_st->payload_size + size > ts->pes_payload_size || + if (st->codecpar->codec_id != AV_CODEC_ID_SCTE_35 && + ts_st->payload_size && (ts_st->payload_size + size > ts->pes_payload_size || (dts != AV_NOPTS_VALUE && ts_st->payload_dts != AV_NOPTS_VALUE && dts - ts_st->payload_dts >= max_audio_delay) || ts_st->opus_queued_samples + opus_samples >= 5760 /* 120ms */)) { @@ -2194,7 +2260,7 @@ static void mpegts_write_flush(AVFormatContext *s) for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; MpegTSWriteStream *ts_st = st->priv_data; - if (ts_st->payload_size > 0) { + if (st->codecpar->codec_id != AV_CODEC_ID_SCTE_35 && ts_st->payload_size > 0) { mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size, ts_st->payload_pts, ts_st->payload_dts, ts_st->payload_flags & AV_PKT_FLAG_KEY, -1); @@ -2237,7 +2303,7 @@ static void mpegts_deinit(AVFormatContext *s) for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; MpegTSWriteStream *ts_st = st->priv_data; - if (ts_st) { + if (ts_st && st->codecpar->codec_id != AV_CODEC_ID_SCTE_35) { av_freep(&ts_st->dvb_ac3_desc); av_freep(&ts_st->payload); if (ts_st->amux) { diff --git a/libavformat/mux.c b/libavformat/mux.c index 415bd39..55bec25 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -307,7 +307,8 @@ FF_ENABLE_DEPRECATION_WARNINGS } if (par->codec_type != AVMEDIA_TYPE_ATTACHMENT && - par->codec_id != AV_CODEC_ID_SMPTE_2038) + par->codec_id != AV_CODEC_ID_SMPTE_2038 && + par->codec_id != AV_CODEC_ID_SCTE_35) si->nb_interleaved_streams++; } si->interleave_packet = of->interleave_packet; @@ -946,7 +947,8 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *pkt, } else if (par->codec_type != AVMEDIA_TYPE_ATTACHMENT && par->codec_id != AV_CODEC_ID_VP8 && par->codec_id != AV_CODEC_ID_VP9 && - par->codec_id != AV_CODEC_ID_SMPTE_2038) { + par->codec_id != AV_CODEC_ID_SMPTE_2038 && + par->codec_id != AV_CODEC_ID_SCTE_35) { ++noninterleaved_count; } } From patchwork Fri Jun 16 22:12:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Devin Heitmueller X-Patchwork-Id: 42160 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c526:b0:117:ac03:c9de with SMTP id gm38csp1831736pzb; Fri, 16 Jun 2023 14:15:55 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7BRQ2a8OpH0d+KNfSVWa/efsmjadqme0h8o8njtihpfFuocUdAb402CrvMzzFfUIcUpVE6 X-Received: by 2002:a17:906:eecb:b0:958:4c75:705e with SMTP id wu11-20020a170906eecb00b009584c75705emr2777807ejb.17.1686950154862; Fri, 16 Jun 2023 14:15:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686950154; cv=none; d=google.com; s=arc-20160816; b=wQeQU/al3s/4j2WSj0u+ITnHSy4jK3kLiRpUz4d5RiCvdly9ltm54dvabXaKM7ZnJZ BzBWNJqURpOlQDr+iLhaxcYYA1SO+s5A6KbewOJEFrIy2mPqE+sW/iXJCl67EZ/Fk9mT 3ybLTdHx7wpsFteRei8SbrpKvg2IXy3wvDF+qn/LPf6Xj0/rJODzPj7Px907EOrSXqPd LAMhLi20g9/AdON7JoPgfPHyZW8mF7v/Tu+QIENqwHa8WyYbT6MB3h2nr7y478TuCWKC q3Z44wL10VAFHO+/Z5oQhPrYmgjJj74BZDBeV9mnuJsncy7F6OC9ykFNRuQU1COr346S FmeQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=mVlWGiAZIAhoCyt5uSFeBXBjQnEci/2qpi69DxRODnQ=; b=bpYxPNbQIW4/J1ymaZ5O9B60/hpchLsuieh3aU/npoxY8NNOL29gX+iR0nWE6uKkYp 5Usl4WGq8huaZuX65kJoFOtbhoN7H9HP34qEwiYcVi3Eym3G5GY+0h0ES7ExnuwMghkU NceacRLJjG0FS+twTpt2tKJWv7ZCIAnm0Pr3GzJAnqZYnQaA52G9lOsc7qE8TptcEIYR Dyu/zt9iTn/QByRZBgbwAO2/KU1rdDHG+13hJNEeE1tqOtKZqCp1PFtSiBRs7re4+p3Q U7HYVZvZqAxnWMK8VE5Xu294jLgY9U2jULSPxkcA+8ryS85tYDZ94PSNx4Hg7dhOaA4v qkGg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@ltnglobal-com.20221208.gappssmtp.com header.s=20221208 header.b=P+U2sJXl; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id d25-20020a170906345900b0096f8ed4f5cbsi11632588ejb.77.2023.06.16.14.15.48; Fri, 16 Jun 2023 14:15:54 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@ltnglobal-com.20221208.gappssmtp.com header.s=20221208 header.b=P+U2sJXl; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 160ED68BD32; Sat, 17 Jun 2023 00:15:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f42.google.com (mail-qv1-f42.google.com [209.85.219.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3D70368BDA3 for ; Sat, 17 Jun 2023 00:15:03 +0300 (EEST) Received: by mail-qv1-f42.google.com with SMTP id 6a1803df08f44-62fff19e8fdso4729906d6.1 for ; Fri, 16 Jun 2023 14:15:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ltnglobal-com.20221208.gappssmtp.com; s=20221208; t=1686950102; x=1689542102; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to; bh=Y8ncL2CxP4zGv82QWMhbLDwM4fPSjVx1QjahU35uC0A=; b=P+U2sJXloSIFI/bJ0RLWxFj85ZyAIAasJ3dHZpev5ZMqNjykafI9rF3GMHKFdAYrb6 T4ULKgd/pozGZolLoTXLTZpDPEf7wpSJFfDYJCZ7IvyNN1M7G6kVau7ZEakQ26lHJqVl R5cjpXhYjmeOOE7Tw381W/EMjzjtCnqLzUJxE3Jd2lvWzxmJIEA7dMhR0UXrFMAPqGDr YHgPDswtvRsNurkLZb7Yjqm7UmTtZcL2IAeokIwGxd0tinK24M2HkdlaZrZMVRCQKA4d HObwBqzdZoEscp+asTQfTx94fsprnAYp8PQvjn5ENGK56n/udGcSvYn19KIvNvUe548h npzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686950102; x=1689542102; h=references:in-reply-to:message-id:date:subject:cc:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Y8ncL2CxP4zGv82QWMhbLDwM4fPSjVx1QjahU35uC0A=; b=VZMZVPS5mrQfFuG439Fp2diw1vblYYozu/NyK54lJHtz8Rm/oZqjzteQ4DypwKWDJy Fvbt+s7fxBdA4ZLyREyD6IwnUv4SgAtiSjMkLLnZ6bWq8rH2CoIskqQC4uGTLziOstH1 JDrxH04sr69FjuYHSm0cMQ3iizyeRkyqjtytpLS35DWqHI+b0nq8s3O5AaHiCf3t4qWG l3yOVAcLb5LZwv5mgDJdNSedOPx8LJ6t0RMqUpsHHprYCn3rPMHdueE2fOrg+ZhFHCYD XwuHnNjBFEOtpLadeOQlMHxoN9GWbk2qa7ormJtvCW+3kd39e6ytqkSI7jURSgSoyGdV etBA== X-Gm-Message-State: AC+VfDzexyFPnWSflYpAbDzE0G23R9vSKx1uWY5NqiO+rQkwTKmZOkcF nAY5z6TphEcIoPulxXvTDKFDOCg2iu1MsZ1T9CU= X-Received: by 2002:ad4:5caf:0:b0:621:54d:23e1 with SMTP id q15-20020ad45caf000000b00621054d23e1mr10347051qvh.14.1686950101784; Fri, 16 Jun 2023 14:15:01 -0700 (PDT) Received: from ltnt-nyc-580testdevin.livetimenet.com (pool-71-105-132-214.nycmny.fios.verizon.net. [71.105.132.214]) by smtp.gmail.com with ESMTPSA id t8-20020a0cb388000000b0061a68b5a8c4sm7450812qve.134.2023.06.16.14.15.01 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Jun 2023 14:15:01 -0700 (PDT) From: Devin Heitmueller X-Google-Original-From: Devin Heitmueller To: ffmpeg-devel@ffmpeg.org Date: Fri, 16 Jun 2023 18:12:57 -0400 Message-Id: <1686953578-18843-5-git-send-email-dheitmueller@ltnglobal.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1686953578-18843-1-git-send-email-dheitmueller@ltnglobal.com> References: <1686953578-18843-1-git-send-email-dheitmueller@ltnglobal.com> Subject: [FFmpeg-devel] [PATCH 4/5] bsf: Add new bitstream filter to set pts_adjustment when reclocking X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Devin Heitmueller MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: cuveWvbCJH6N Because SCTE-35 messages are represented in TS streams as sections rather than PES packets, we cannot rely on ffmpeg's standard mechanisms to adjust PTS values if reclocking the stream. This filter will leverage the SCTE-35 pts_adjust field to compensate for any change in the PTS values in the stream. See SCTE-35 2019 Sec 9.6 for information about the use of the pts_adjust field. This filter also tweaks the mpegtsenc mux to automatically add it so the user doesn't have to include it manually. Signed-off-by: Devin Heitmueller --- libavcodec/Makefile | 1 + libavcodec/bitstream_filters.c | 1 + libavcodec/scte35ptsadjust_bsf.c | 114 +++++++++++++++++++++++++++++++++++++++ libavformat/mpegtsenc.c | 2 + 4 files changed, 118 insertions(+) create mode 100644 libavcodec/scte35ptsadjust_bsf.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 0ce8fe5..6944c82 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -1250,6 +1250,7 @@ OBJS-$(CONFIG_PCM_RECHUNK_BSF) += pcm_rechunk_bsf.o OBJS-$(CONFIG_PGS_FRAME_MERGE_BSF) += pgs_frame_merge_bsf.o OBJS-$(CONFIG_PRORES_METADATA_BSF) += prores_metadata_bsf.o OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF) += remove_extradata_bsf.o av1_parse.o +OBJS-$(CONFIG_SCTE35PTSADJUST_BSF) += scte35ptsadjust_bsf.o OBJS-$(CONFIG_SETTS_BSF) += setts_bsf.o OBJS-$(CONFIG_TEXT2MOVSUB_BSF) += movsub_bsf.o OBJS-$(CONFIG_TRACE_HEADERS_BSF) += trace_headers_bsf.o diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c index 7512fcc..d30dfbd 100644 --- a/libavcodec/bitstream_filters.c +++ b/libavcodec/bitstream_filters.c @@ -57,6 +57,7 @@ extern const FFBitStreamFilter ff_pcm_rechunk_bsf; extern const FFBitStreamFilter ff_pgs_frame_merge_bsf; extern const FFBitStreamFilter ff_prores_metadata_bsf; extern const FFBitStreamFilter ff_remove_extradata_bsf; +extern const FFBitStreamFilter ff_scte35ptsadjust_bsf; extern const FFBitStreamFilter ff_setts_bsf; extern const FFBitStreamFilter ff_text2movsub_bsf; extern const FFBitStreamFilter ff_trace_headers_bsf; diff --git a/libavcodec/scte35ptsadjust_bsf.c b/libavcodec/scte35ptsadjust_bsf.c new file mode 100644 index 0000000..e6e9ec9 --- /dev/null +++ b/libavcodec/scte35ptsadjust_bsf.c @@ -0,0 +1,114 @@ +/* + * SCTE-35 PTS fixup bitstream filter + * Copyright (c) 2023 LTN Global Communications, Inc. + * + * Author: Devin Heitmueller + * + * Because SCTE-35 messages are represented in TS streams as sections + * rather than PES packets, we cannot rely on ffmpeg's standard + * mechanisms to adjust PTS values if reclocking the stream. + * This filter will leverage the SCTE-35 pts_adjust field to + * compensate for any change in the PTS values in the stream. + * + * See SCTE-35 2019 Sec 9.6 for information about the use of + * the pts_adjust field. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "avcodec.h" +#include "bsf.h" +#include "bsf_internal.h" + +static int scte35ptsadjust_filter(AVBSFContext *ctx, AVPacket *out) +{ + AVPacket *in; + size_t size; + const int64_t *orig_pts; + int64_t cur_pts_adjust; + int ret = 0; + + ret = ff_bsf_get_packet(ctx, &in); + if (ret < 0) + return ret; + + /* Retrieve the original PTS, which will be used to calculate the pts_adjust */ + orig_pts = (int64_t *) av_packet_get_side_data(in, AV_PKT_DATA_ORIG_PTS, &size); + if (orig_pts == NULL) { + /* No original PTS specified, so just pass the packet through */ + av_packet_move_ref(out, in); + av_packet_free(&in); + return 0; + } + + av_log(ctx, AV_LOG_DEBUG, "%s pts=%" PRId64 " orig_pts=%" PRId64 "\n", __func__, + in->pts, *orig_pts); + + /* The pts_adjust field is logically buf[4]-buf[8] of the payload */ + if (in->size < 8) + goto fail; + + /* Extract the current pts_adjust value from the packet */ + cur_pts_adjust = ((int64_t) in->data[4] & (int64_t) 0x01 << 32) | + ((int64_t) in->data[5] << 24) | + ((int64_t) in->data[6] << 16) | + ((int64_t) in->data[7] << 8) | + ((int64_t) in->data[8] ); + + av_log(ctx, AV_LOG_DEBUG, "%s pts_adjust=%" PRId64 "\n", __func__, + cur_pts_adjust); + + /* Compute the new PTS adjust value */ + cur_pts_adjust -= *orig_pts; + cur_pts_adjust += in->pts; + cur_pts_adjust &= (int64_t) 0x1ffffffff; + + av_log(ctx, AV_LOG_DEBUG, "%s new pts_adjust=%" PRId64 "\n", __func__, + cur_pts_adjust); + + /* Clone the incoming packet since we need to modify it */ + ret = av_new_packet(out, in->size); + if (ret < 0) + goto fail; + ret = av_packet_copy_props(out, in); + if (ret < 0) + goto fail; + memcpy(out->data, in->data, in->size); + + /* Insert the updated pts_adjust value */ + out->data[4] &= 0xfe; /* Preserve top 7 unrelated bits */ + out->data[4] |= cur_pts_adjust >> 32; + out->data[5] = cur_pts_adjust >> 24; + out->data[6] = cur_pts_adjust >> 16; + out->data[7] = cur_pts_adjust >> 8; + out->data[8] = cur_pts_adjust; + +fail: + av_packet_free(&in); + + return ret; +} + +static const enum AVCodecID codec_ids[] = { + AV_CODEC_ID_SCTE_35, AV_CODEC_ID_NONE, +}; + +const FFBitStreamFilter ff_scte35ptsadjust_bsf = { + .p.name = "scte35ptsadjust", + .p.codec_ids = codec_ids, + .filter = scte35ptsadjust_filter, +}; diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index c6cd1fd..48d7833 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -2337,6 +2337,8 @@ static int mpegts_check_bitstream(AVFormatContext *s, AVStream *st, (st->codecpar->extradata_size > 0 && st->codecpar->extradata[0] == 1))) ret = ff_stream_add_bitstream_filter(st, "hevc_mp4toannexb", NULL); + } else if (st->codecpar->codec_id == AV_CODEC_ID_SCTE_35) { + ret = ff_stream_add_bitstream_filter(st, "scte35ptsadjust", NULL); } return ret; From patchwork Fri Jun 16 22:12:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Devin Heitmueller X-Patchwork-Id: 42161 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c526:b0:117:ac03:c9de with SMTP id gm38csp1831749pzb; Fri, 16 Jun 2023 14:15:57 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4BAT4t54rFsexCSDAZz0XbTI9gFMsBeTwwEvP3pZh0tFo6KQdGV1XTx7PAjkRB8NXTtCYg X-Received: by 2002:a17:907:16a2:b0:977:4b68:bf2 with SMTP id hc34-20020a17090716a200b009774b680bf2mr2868977ejc.54.1686950157137; Fri, 16 Jun 2023 14:15:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686950157; cv=none; d=google.com; s=arc-20160816; b=T1mpvdhxsJZlqHKKgKgLDS6A+DNE8B65tr0afZJH01hG8G4QpIpDdMiTmKgX0yrK6d 7zNvmnzl5gCt0E3A38kBAps7DsNct9tauW4YfGDB9WQRAX7vQI2HTf0806KY4izLeX5H HKdgD7XmmI+gqDAGGTP8cLGxqzCYgkhUBRp+My7juXgVe9p8SUQrjkyqbVifxN0GJbgp HMY5KXMdNVOMVEg9o8vF1VEgkr8yNI++zgVWQ06mUJVJ4+yZSuSM8mdTBV8i2SA9g8EI I/3EAJlV7rqLGMgNRElP3ZVCvm7TYN7LaEBe0xffXyKwjXnfQTmHpgz85Rm3wHH/Xi7d I/4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=SLeBL5j1JXPMr9esxYEqlYodKev9H0bie1r/m8COC0Y=; b=HPa40667CZIT6ewvM3Y6BGO79eSkmS59vcTnNI8bFF+klSerYmFAFZ3OxlioBfKek7 DdpVtFzUaPButSlgJridrftYjpH7VC5EF6z4wczGaB9VdHCzQwbyCokGCgxJ+YKb82Wu +nJ5AL6mTx8qUjuhWEEUQ4rV+CdSvXrqJlVwx/XN9BpTjp8INQU3matxVclVBTfODpw/ WED7kF8LSfUcOwm2TIVl4mG2oZ4XJoMQ6IiXB+V2knsTup8ujroFwsY+sdt2tx0uCUFb Sq/Z2CXjxpXwfiD19ZXmeWNOg/7JKfccVDyUrmA4Qibs0GehjfDd3jdtmJs5XHwYeTkX KyMg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@ltnglobal-com.20221208.gappssmtp.com header.s=20221208 header.b=QKKmbiaX; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b6-20020a170906708600b009827485a8besi3732239ejk.448.2023.06.16.14.15.56; Fri, 16 Jun 2023 14:15:57 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@ltnglobal-com.20221208.gappssmtp.com header.s=20221208 header.b=QKKmbiaX; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id ECCA168C355; Sat, 17 Jun 2023 00:15:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f41.google.com (mail-qv1-f41.google.com [209.85.219.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 013E268BF7D for ; Sat, 17 Jun 2023 00:15:03 +0300 (EEST) Received: by mail-qv1-f41.google.com with SMTP id 6a1803df08f44-62ff0e0c5d7so9884286d6.1 for ; Fri, 16 Jun 2023 14:15:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ltnglobal-com.20221208.gappssmtp.com; s=20221208; t=1686950102; x=1689542102; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to; bh=YNCtW3t5T8I3nGD2unvqGq1v10FgkGu8ntSZYTtHvGo=; b=QKKmbiaXfhmBfCPkijdFoGa1ZVDdjyf00J+QSECkDJb6lrmK+K4WbovDZ2kP0sBQYr cRp/dhL4+p8jYSVkC/dDcTiqXR+fYNrnsQJyPCfMR4Nh1sFmJwitVThnpOmOk8wCrowq n4oeik9saUaNewfGCJ153HGp9Hm+MSH297bJBxw8oWEEcMBqNaAXXzEcIJLddFKQRr44 BqBxSXCSYaWNT+ONtvCERuxG4EkA+2Q2W3bU9XRnAVign3lI2S+l43D8AzByofMph4TJ 6aJYpfUzVXS9aLbEx6uBxW1Cr+lpDHCSfOJhJOqWQMo0FhUhYvnK8J7DoVi/IQ38xZTJ quXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686950102; x=1689542102; h=references:in-reply-to:message-id:date:subject:cc:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YNCtW3t5T8I3nGD2unvqGq1v10FgkGu8ntSZYTtHvGo=; b=OTakdlxSHCnHzh1dvn4SvWh+SEomumwnJur4wqhfTP56KX1Xf8WNeQIAJNRzQ2Bhxn njEgAUEN8d2dIRvrjv1YYLpu5xtg1N0oFNvBSryDcELLGCtcfcPEN30vkDKtGPA/tqF8 Z42oZjzFeNS+JissikwV13TFkqm7UGIyTjT/CYwdXuDZrywvR1FqXzmCRa8DnU+9rYTb VnrjxeBHpJvGIXwQJxWmTba2jEg21/V74ojPLkxEyiwJtJGagiqjQB44rCzyGk0dicLe XoeG1jkCUTj17AcI5DyrsMIyZF18Z3u+i6PZ7cEH9phIwubQrt4uIVv5XSVd2eZsipxL EKog== X-Gm-Message-State: AC+VfDwPUgyvEwdKHzEcmd4SnEzytMdFlCkxucRkI3AKyaVfwW9rRQ3S pP/AOqE+rcCuUG24H2btKNwd0c/sFio5DRHbQT4= X-Received: by 2002:a05:6214:2468:b0:62d:eb59:77f8 with SMTP id im8-20020a056214246800b0062deb5977f8mr4781051qvb.28.1686950102562; Fri, 16 Jun 2023 14:15:02 -0700 (PDT) Received: from ltnt-nyc-580testdevin.livetimenet.com (pool-71-105-132-214.nycmny.fios.verizon.net. [71.105.132.214]) by smtp.gmail.com with ESMTPSA id t8-20020a0cb388000000b0061a68b5a8c4sm7450812qve.134.2023.06.16.14.15.01 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Jun 2023 14:15:02 -0700 (PDT) From: Devin Heitmueller X-Google-Original-From: Devin Heitmueller To: ffmpeg-devel@ffmpeg.org Date: Fri, 16 Jun 2023 18:12:58 -0400 Message-Id: <1686953578-18843-6-git-send-email-dheitmueller@ltnglobal.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1686953578-18843-1-git-send-email-dheitmueller@ltnglobal.com> References: <1686953578-18843-1-git-send-email-dheitmueller@ltnglobal.com> Subject: [FFmpeg-devel] [PATCH 5/5] mpegtsenc: Don't periodically announce PCR on SCTE-35 streams X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Devin Heitmueller MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: NY98D7jrySFJ Changes were made between in the last two years to periodically send PCR-only packets on all PIDs, but for cases where the stream may send packets very infrequently (like SCTE-35), this results in extra TR101290 errors because it fails the PCR interval test. I am not quite sure what the "right" fix should be for this, but for now just disable all periodic sending of PCR-only packets on SCTE-35 streams. Signed-off-by: Devin Heitmueller --- libavformat/mpegtsenc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index 48d7833..728057e 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -1579,7 +1579,7 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st, int st2_index = i < st->index ? i : (i + 1 == s->nb_streams ? st->index : i + 1); AVStream *st2 = s->streams[st2_index]; MpegTSWriteStream *ts_st2 = st2->priv_data; - if (ts_st2->pcr_period) { + if (ts_st2->pcr_period && st2->codecpar->codec_id != AV_CODEC_ID_SCTE_35) { if (pcr - ts_st2->last_pcr >= ts_st2->pcr_period) { ts_st2->last_pcr = FFMAX(pcr - ts_st2->pcr_period, ts_st2->last_pcr + ts_st2->pcr_period); if (st2 != st) {