[FFmpeg-devel] libavcodec: add timer bitstream filter

Submitted by Andreas Håkon on June 28, 2019, 8:44 a.m.

Details

Message ID cYRz2eYAMPP6ssjA3iBq9GmNcD_tjTUEkEDaVWxZgJuyQ59fzFN4-yFoOD5LsFduaoC3Dk7uTgOZhRSmeTrO0UKM-eaqKwY7k8hdozPSf7c=@protonmail.com
State New
Headers show

Commit Message

Andreas Håkon June 28, 2019, 8:44 a.m.
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 <andreas.hakon@protonmail.com>
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 <andreas.hakon@protonmail.com>
---
 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

Comments

Andreas Håkon July 24, 2019, 7:16 a.m.
Hi,

‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Friday, 28 de June de 2019 10:44, Andreas Håkon <andreas.hakon@protonmail.com> wrote:

> Hi,
> This is a refined version of the initial version for the new “timer” BSF.
> Supersedes: https://patchwork.ffmpeg.org/patch/13699/

Still waiting to receive comments (or acceptance).

Regards.
A.H.

---
Andreas Håkon July 29, 2019, 7:14 p.m.
Ping

‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Wednesday, 24 de July de 2019 9:16, Andreas Håkon <andreas.hakon@protonmail.com> wrote:

> Hi,
>
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> On Friday, 28 de June de 2019 10:44, Andreas Håkon <andreas.hakon@protonmail.com> wrote:
>
>> Hi,
>> This is a refined version of the initial version for the new “timer” BSF.
>> Supersedes: https://patchwork.ffmpeg.org/patch/13699/
>
> Still waiting to receive comments (or acceptance).
>
> Regards.
> A.H.
>
> ---
Paul B Mahol July 29, 2019, 7:19 p.m.
Documentation for bsf does document single option, thus is incomplete.

On Mon, Jul 29, 2019 at 9:14 PM Andreas Håkon <andreas.hakon@protonmail.com>
wrote:

> Ping
>
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> On Wednesday, 24 de July de 2019 9:16, Andreas Håkon <
> andreas.hakon@protonmail.com> wrote:
>
> > Hi,
> >
> > ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> > On Friday, 28 de June de 2019 10:44, Andreas Håkon <
> andreas.hakon@protonmail.com> wrote:
> >
> >> Hi,
> >> This is a refined version of the initial version for the new “timer”
> BSF.
> >> Supersedes: https://patchwork.ffmpeg.org/patch/13699/
> >
> > Still waiting to receive comments (or acceptance).
> >
> > Regards.
> > A.H.
> >
> > ---
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Andreas Håkon Aug. 2, 2019, 1:04 p.m.
Hi Paul,


‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Monday, 29 de July de 2019 21:19, Paul B Mahol <onemda@gmail.com> wrote:

> Documentation for bsf does document single option, thus is incomplete.

Done: https://patchwork.ffmpeg.org/patch/14195/

Regards.
A.H.

---

Patch hide | download patch | download mbox

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,
+};