From patchwork Fri Jun 28 08:44:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andreas_H=C3=A5kon?= X-Patchwork-Id: 13743 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 3903A448D4D for ; Fri, 28 Jun 2019 11:44:14 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0A04A68AAC6; Fri, 28 Jun 2019 11:44:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-40136.protonmail.ch (mail-40136.protonmail.ch [185.70.40.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3661968A362 for ; Fri, 28 Jun 2019 11:44:08 +0300 (EEST) Date: Fri, 28 Jun 2019 08:44:05 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=default; t=1561711447; bh=7tSpBcbPDvfRN4ImA8lTWC/1CL/JIJ6EEli5ii1gq8w=; h=Date:To:From:Reply-To:Subject:Feedback-ID:From; b=uemJCVUhVxErLDj5vkiV7GYaCGK4mRYQlAD+1iQkjH1XXstpr1CnxQ/0/ruJ955hy ynqVSY4Kbc8/jMt+Bm/VtUWUb27+DgP+7hiK0LsUHX7egKVtpilWbNLtU5MPcI6HPb ooixYeXA8N4A/x+aps6gwQCdwKSsl9eN/F3xDszQ= To: FFmpeg development discussions and patches From: =?UTF-8?Q?Andreas_H=C3=A5kon?= Message-ID: Feedback-ID: Mx8CaiV20jk_fqXDN0fFpg3vRaGkb9VCTrYRnZNHwEija3aOdqvFspzl6ODkmHrlSKJSx29p-LzkuvS_96L02A==:Ext:ProtonMail MIME-Version: 1.0 X-Spam-Status: No, score=-1.2 required=7.0 tests=ALL_TRUSTED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HTML_MESSAGE autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mail.protonmail.ch X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] libavcodec: add timer bitstream filter 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Hi, This is a refined version of the initial version for the new “timer” BSF. Supersedes: https://patchwork.ffmpeg.org/patch/13699/ Changes from the last version: 1. Name changed from “delayer” to “timer”. 2. Enabled negative offset values (aka time advance). 3. Improved less verbose log functionality. It will be updated in the future with more parameters. However, the idea is to add it first as is. Regards. A.H. --- From db0f73bde33cfb52361d9905f16cd7ad773ece3d Mon Sep 17 00:00:00 2001 From: Andreas Hakon Date: Fri, 28 Jun 2019 09:38:54 +0100 Subject: [PATCH] libavcodec: add timer bitstream filter This implements the new timer bitstream filter. Signed-off-by: Andreas Hakon --- doc/bitstream_filters.texi | 4 ++ libavcodec/Makefile | 1 + libavcodec/bitstream_filters.c | 1 + libavcodec/timer_bsf.c | 86 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 libavcodec/timer_bsf.c diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi index 40e8ada..777f4b6 100644 --- a/doc/bitstream_filters.texi +++ b/doc/bitstream_filters.texi @@ -629,6 +629,10 @@ codec) with metadata headers. See also the @ref{mov2textsub} filter. +@section timer + +Apply an offset to the PTS/DTS timestamps. + @section trace_headers Log trace output containing all syntax elements in the coded stream diff --git a/libavcodec/Makefile b/libavcodec/Makefile index edccd73..0f2770a 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -1096,6 +1096,7 @@ OBJS-$(CONFIG_NULL_BSF) += null_bsf.o OBJS-$(CONFIG_PRORES_METADATA_BSF) += prores_metadata_bsf.o OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF) += remove_extradata_bsf.o OBJS-$(CONFIG_TEXT2MOVSUB_BSF) += movsub_bsf.o +OBJS-$(CONFIG_TIMER_BSF) += timer_bsf.o OBJS-$(CONFIG_TRACE_HEADERS_BSF) += trace_headers_bsf.o OBJS-$(CONFIG_TRUEHD_CORE_BSF) += truehd_core_bsf.o mlp_parse.o mlp.o OBJS-$(CONFIG_VP9_METADATA_BSF) += vp9_metadata_bsf.o diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c index 4630039..be6af05 100644 --- a/libavcodec/bitstream_filters.c +++ b/libavcodec/bitstream_filters.c @@ -51,6 +51,7 @@ extern const AVBitStreamFilter ff_null_bsf; extern const AVBitStreamFilter ff_prores_metadata_bsf; extern const AVBitStreamFilter ff_remove_extradata_bsf; extern const AVBitStreamFilter ff_text2movsub_bsf; +extern const AVBitStreamFilter ff_timer_bsf; extern const AVBitStreamFilter ff_trace_headers_bsf; extern const AVBitStreamFilter ff_truehd_core_bsf; extern const AVBitStreamFilter ff_vp9_metadata_bsf; diff --git a/libavcodec/timer_bsf.c b/libavcodec/timer_bsf.c new file mode 100644 index 0000000..3f1c7f6 --- /dev/null +++ b/libavcodec/timer_bsf.c @@ -0,0 +1,86 @@ +/* + * 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 + */ + +/** + * @file + * This bitstream filter applies an offset to the PTS/DTS timestamps. + * + */ + +// TODO: Control time wrapping +// TODO: Instead of using absolute timestamp offsets, use frame numbers + +#include "avcodec.h" +#include "bsf.h" + +#include "libavutil/opt.h" + +typedef struct TimerContext { + const AVClass *class; + int offset; + int first_debug_done; +} TimerContext; + +static int timer_filter(AVBSFContext *ctx, AVPacket *pkt) +{ + int ret; + TimerContext *s = ctx->priv_data; + int64_t opts,odts; + + ret = ff_bsf_get_packet_ref(ctx, pkt); + if (ret < 0) + return ret; + + opts = pkt->pts; + if (pkt->pts != AV_NOPTS_VALUE) { + pkt->pts += s->offset; + } + odts = pkt->dts; + if (pkt->dts != AV_NOPTS_VALUE) { + pkt->dts += s->offset; + } + + if (!s->first_debug_done) { + av_log(ctx, AV_LOG_DEBUG, "Updated PTS/DTS (%"PRId64"/%"PRId64" : %"PRId64"/%"PRId64") with offset:%d\n", + pkt->pts, pkt->dts, opts, odts, s->offset ); + } + s->first_debug_done = 1; + + return 0; +} + +#define OFFSET(x) offsetof(TimerContext, x) +#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_SUBTITLE_PARAM|AV_OPT_FLAG_BSF_PARAM) +static const AVOption options[] = { + { "offset", NULL, OFFSET(offset), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FLAGS }, + { NULL }, +}; + +static const AVClass timer_class = { + .class_name = "timer", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +const AVBitStreamFilter ff_timer_bsf = { + .name = "timer", + .priv_data_size = sizeof(TimerContext), + .priv_class = &timer_class, + .filter = timer_filter, +};