diff mbox series

[FFmpeg-devel] lavc/bsf: add a showinfo filter

Message ID 20240129184215.16685-1-anton@khirnov.net
State New
Headers show
Series [FFmpeg-devel] lavc/bsf: add a showinfo filter | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov Jan. 29, 2024, 6:42 p.m. UTC
Analogous to the (a)showinfo lavfi filters, logs basic packet
information. Mainly useful for debugging/testing/development.
---
 Changelog                      |  1 +
 doc/bitstream_filters.texi     |  4 +++
 libavcodec/bitstream_filters.c |  1 +
 libavcodec/bsf/Makefile        |  1 +
 libavcodec/bsf/showinfo.c      | 66 ++++++++++++++++++++++++++++++++++
 5 files changed, 73 insertions(+)
 create mode 100644 libavcodec/bsf/showinfo.c

Comments

Andreas Rheinhardt Jan. 30, 2024, 7:17 a.m. UTC | #1
Anton Khirnov:
> Analogous to the (a)showinfo lavfi filters, logs basic packet
> information. Mainly useful for debugging/testing/development.
> ---
>  Changelog                      |  1 +
>  doc/bitstream_filters.texi     |  4 +++
>  libavcodec/bitstream_filters.c |  1 +
>  libavcodec/bsf/Makefile        |  1 +
>  libavcodec/bsf/showinfo.c      | 66 ++++++++++++++++++++++++++++++++++
>  5 files changed, 73 insertions(+)
>  create mode 100644 libavcodec/bsf/showinfo.c
> 
> diff --git a/Changelog b/Changelog
> index c1fd66b4bd..c5fb21d198 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -23,6 +23,7 @@ version <next>:
>  - ffmpeg CLI -bsf option may now be used for input as well as output
>  - ffmpeg CLI options may now be used as -/opt <path>, which is equivalent
>    to -opt <contents of file <path>>
> +- showinfo bitstream filter
>  
>  version 6.1:
>  - libaribcaption decoder
> diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi
> index dc4f85bac0..d5bac105ff 100644
> --- a/doc/bitstream_filters.texi
> +++ b/doc/bitstream_filters.texi
> @@ -887,6 +887,10 @@ For example, to set PTS equal to DTS (not recommended if B-frames are involved):
>  ffmpeg -i INPUT -c:a copy -bsf:a setts=pts=DTS out.mkv
>  @end example
>  
> +@section showinfo
> +Log basic packet information. Mainly useful for testing, debugging,
> +and development.
> +
>  @anchor{text2movsub}
>  @section text2movsub
>  
> diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c
> index 1e9a676a3d..1bae113d92 100644
> --- a/libavcodec/bitstream_filters.c
> +++ b/libavcodec/bitstream_filters.c
> @@ -58,6 +58,7 @@ 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_setts_bsf;
> +extern const FFBitStreamFilter ff_showinfo_bsf;
>  extern const FFBitStreamFilter ff_text2movsub_bsf;
>  extern const FFBitStreamFilter ff_trace_headers_bsf;
>  extern const FFBitStreamFilter ff_truehd_core_bsf;
> diff --git a/libavcodec/bsf/Makefile b/libavcodec/bsf/Makefile
> index 7831b0f2aa..62609eb24e 100644
> --- a/libavcodec/bsf/Makefile
> +++ b/libavcodec/bsf/Makefile
> @@ -36,6 +36,7 @@ OBJS-$(CONFIG_PGS_FRAME_MERGE_BSF)        += bsf/pgs_frame_merge.o
>  OBJS-$(CONFIG_PRORES_METADATA_BSF)        += bsf/prores_metadata.o
>  OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF)       += bsf/remove_extradata.o
>  OBJS-$(CONFIG_SETTS_BSF)                  += bsf/setts.o
> +OBJS-$(CONFIG_SHOWINFO_BSF)               += bsf/showinfo.o
>  OBJS-$(CONFIG_TEXT2MOVSUB_BSF)            += bsf/movsub.o
>  OBJS-$(CONFIG_TRACE_HEADERS_BSF)          += bsf/trace_headers.o
>  OBJS-$(CONFIG_TRUEHD_CORE_BSF)            += bsf/truehd_core.o
> diff --git a/libavcodec/bsf/showinfo.c b/libavcodec/bsf/showinfo.c
> new file mode 100644
> index 0000000000..dc1ac8ceb6
> --- /dev/null
> +++ b/libavcodec/bsf/showinfo.c
> @@ -0,0 +1,66 @@
> +/*
> + * Copyright (c) 2024 Anton Khirnov <anton@khirnov.net>
> + *
> + * 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 <stdint.h>

You should use inttypes.h instead -- it provides everything stdint.h
provides and the print directive defines like PRId64.

> +
> +#include "bsf.h"
> +#include "bsf_internal.h"
> +
> +#include "libavutil/log.h"
> +#include "libavutil/timestamp.h"
> +
> +typedef struct ShowinfoContext {
> +    uint64_t nb_packets;
> +} ShowinfoContext;
> +
> +static int showinfo_filter(AVBSFContext *ctx, AVPacket *pkt)
> +{
> +    ShowinfoContext *priv = ctx->priv_data;
> +
> +    while (1) {

This loop will only ever be executed once and should be removed.

> +        int ret;
> +
> +        ret = ff_bsf_get_packet_ref(ctx, pkt);
> +        if (ret < 0)
> +            return ret;
> +
> +        av_log(ctx, AV_LOG_INFO,
> +               "n:%7"PRIu64" "
> +               "size:%7d "
> +               "pts:%s pt:%s "
> +               "dts:%s dt:%s "
> +               "ds:%"PRId64" d:%s "
> +               "\n",
> +               priv->nb_packets, pkt->size,
> +               av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ctx->time_base_in),
> +               av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ctx->time_base_in),
> +               pkt->duration, av_ts2timestr(pkt->duration, &ctx->time_base_in));
> +
> +        priv->nb_packets++;
> +
> +        return 0;
> +    }
> +}
> +
> +const FFBitStreamFilter ff_showinfo_bsf = {
> +    .p.name         = "showinfo",
> +    .filter         = showinfo_filter,
> +    .priv_data_size = sizeof(ShowinfoContext),
> +};
Anton Khirnov Jan. 30, 2024, 9:11 a.m. UTC | #2
Quoting Andreas Rheinhardt (2024-01-30 08:17:23)
> > +#include <stdint.h>
> 
> You should use inttypes.h instead -- it provides everything stdint.h
> provides and the print directive defines like PRId64.
> 
> > +static int showinfo_filter(AVBSFContext *ctx, AVPacket *pkt)
> > +{
> > +    ShowinfoContext *priv = ctx->priv_data;
> > +
> > +    while (1) {
> 
> This loop will only ever be executed once and should be removed.

Right, both done locally.

Thanks,
James Almer Jan. 30, 2024, 12:39 p.m. UTC | #3
On 1/29/2024 3:42 PM, Anton Khirnov wrote:
> Analogous to the (a)showinfo lavfi filters, logs basic packet
> information. Mainly useful for debugging/testing/development.
> ---
>   Changelog                      |  1 +
>   doc/bitstream_filters.texi     |  4 +++
>   libavcodec/bitstream_filters.c |  1 +
>   libavcodec/bsf/Makefile        |  1 +
>   libavcodec/bsf/showinfo.c      | 66 ++++++++++++++++++++++++++++++++++
>   5 files changed, 73 insertions(+)
>   create mode 100644 libavcodec/bsf/showinfo.c
> 
> diff --git a/Changelog b/Changelog
> index c1fd66b4bd..c5fb21d198 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -23,6 +23,7 @@ version <next>:
>   - ffmpeg CLI -bsf option may now be used for input as well as output
>   - ffmpeg CLI options may now be used as -/opt <path>, which is equivalent
>     to -opt <contents of file <path>>
> +- showinfo bitstream filter
>   
>   version 6.1:
>   - libaribcaption decoder
> diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi
> index dc4f85bac0..d5bac105ff 100644
> --- a/doc/bitstream_filters.texi
> +++ b/doc/bitstream_filters.texi
> @@ -887,6 +887,10 @@ For example, to set PTS equal to DTS (not recommended if B-frames are involved):
>   ffmpeg -i INPUT -c:a copy -bsf:a setts=pts=DTS out.mkv
>   @end example
>   
> +@section showinfo
> +Log basic packet information. Mainly useful for testing, debugging,
> +and development.
> +
>   @anchor{text2movsub}
>   @section text2movsub
>   
> diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c
> index 1e9a676a3d..1bae113d92 100644
> --- a/libavcodec/bitstream_filters.c
> +++ b/libavcodec/bitstream_filters.c
> @@ -58,6 +58,7 @@ 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_setts_bsf;
> +extern const FFBitStreamFilter ff_showinfo_bsf;
>   extern const FFBitStreamFilter ff_text2movsub_bsf;
>   extern const FFBitStreamFilter ff_trace_headers_bsf;
>   extern const FFBitStreamFilter ff_truehd_core_bsf;
> diff --git a/libavcodec/bsf/Makefile b/libavcodec/bsf/Makefile
> index 7831b0f2aa..62609eb24e 100644
> --- a/libavcodec/bsf/Makefile
> +++ b/libavcodec/bsf/Makefile
> @@ -36,6 +36,7 @@ OBJS-$(CONFIG_PGS_FRAME_MERGE_BSF)        += bsf/pgs_frame_merge.o
>   OBJS-$(CONFIG_PRORES_METADATA_BSF)        += bsf/prores_metadata.o
>   OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF)       += bsf/remove_extradata.o
>   OBJS-$(CONFIG_SETTS_BSF)                  += bsf/setts.o
> +OBJS-$(CONFIG_SHOWINFO_BSF)               += bsf/showinfo.o
>   OBJS-$(CONFIG_TEXT2MOVSUB_BSF)            += bsf/movsub.o
>   OBJS-$(CONFIG_TRACE_HEADERS_BSF)          += bsf/trace_headers.o
>   OBJS-$(CONFIG_TRUEHD_CORE_BSF)            += bsf/truehd_core.o
> diff --git a/libavcodec/bsf/showinfo.c b/libavcodec/bsf/showinfo.c
> new file mode 100644
> index 0000000000..dc1ac8ceb6
> --- /dev/null
> +++ b/libavcodec/bsf/showinfo.c
> @@ -0,0 +1,66 @@
> +/*
> + * Copyright (c) 2024 Anton Khirnov <anton@khirnov.net>
> + *
> + * 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 <stdint.h>
> +
> +#include "bsf.h"
> +#include "bsf_internal.h"
> +
> +#include "libavutil/log.h"
> +#include "libavutil/timestamp.h"
> +
> +typedef struct ShowinfoContext {
> +    uint64_t nb_packets;
> +} ShowinfoContext;
> +
> +static int showinfo_filter(AVBSFContext *ctx, AVPacket *pkt)
> +{
> +    ShowinfoContext *priv = ctx->priv_data;
> +
> +    while (1) {
> +        int ret;
> +
> +        ret = ff_bsf_get_packet_ref(ctx, pkt);
> +        if (ret < 0)
> +            return ret;
> +
> +        av_log(ctx, AV_LOG_INFO,
> +               "n:%7"PRIu64" "
> +               "size:%7d "
> +               "pts:%s pt:%s "
> +               "dts:%s dt:%s "
> +               "ds:%"PRId64" d:%s "

Why the trailing space?

> +               "\n",
> +               priv->nb_packets, pkt->size,
> +               av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ctx->time_base_in),
> +               av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ctx->time_base_in),
> +               pkt->duration, av_ts2timestr(pkt->duration, &ctx->time_base_in));

No av_ts2str for duration?

Also, missing side data. It's useful to know if a bitstream in the 
chain/list added or removed any.
Maybe all the printing from lavf/dump.c can be shared somehow? Or just 
duplicated.

> +
> +        priv->nb_packets++;
> +
> +        return 0;
> +    }
> +}
> +
> +const FFBitStreamFilter ff_showinfo_bsf = {
> +    .p.name         = "showinfo",
> +    .filter         = showinfo_filter,
> +    .priv_data_size = sizeof(ShowinfoContext),
> +};
Anton Khirnov Jan. 30, 2024, 12:51 p.m. UTC | #4
Quoting James Almer (2024-01-30 13:39:19)
> > +        av_log(ctx, AV_LOG_INFO,
> > +               "n:%7"PRIu64" "
> > +               "size:%7d "
> > +               "pts:%s pt:%s "
> > +               "dts:%s dt:%s "
> > +               "ds:%"PRId64" d:%s "
> 
> Why the trailing space?

Copypasted from above mainly. But also it doesn't hurt and adding more
entries won't require modifying this line.

> 
> > +               "\n",
> > +               priv->nb_packets, pkt->size,
> > +               av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ctx->time_base_in),
> > +               av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ctx->time_base_in),
> > +               pkt->duration, av_ts2timestr(pkt->duration, &ctx->time_base_in));
> 
> No av_ts2str for duration?

Yes, duration cannot be AV_NOPTS_VALUE.

> Also, missing side data. It's useful to know if a bitstream in the 
> chain/list added or removed any.
> Maybe all the printing from lavf/dump.c can be shared somehow? Or just 
> duplicated.

Exactly, side data makes this more complicated. I'd rather get the basic
filter in, and then people can it as they see fit. Another thing I'm
deliberately not printing yet is some sort of codec parameters summary.
Patches welcome.
Alexander Strasser Feb. 12, 2024, 10:35 p.m. UTC | #5
On 2024-01-29 19:42 +0100, Anton Khirnov wrote:
[...]
> --- a/doc/bitstream_filters.texi
> +++ b/doc/bitstream_filters.texi
> @@ -887,6 +887,10 @@ For example, to set PTS equal to DTS (not recommended if B-frames are involved):
>  ffmpeg -i INPUT -c:a copy -bsf:a setts=pts=DTS out.mkv
>  @end example
>
> +@section showinfo
> +Log basic packet information. Mainly useful for testing, debugging,
> +and development.
> +

Maybe it's a good idea to state something about the stability of
the output format. I assume it's to be treated like other logging
and is not expected to stay stable. Not sure how much it helps to
state it clearly, but it can't hurt IMHO.


[...]
> --- /dev/null
> +++ b/libavcodec/bsf/showinfo.c
[...]
> +static int showinfo_filter(AVBSFContext *ctx, AVPacket *pkt)
> +{
> +    ShowinfoContext *priv = ctx->priv_data;
> +
> +    while (1) {
> +        int ret;
> +
> +        ret = ff_bsf_get_packet_ref(ctx, pkt);
> +        if (ret < 0)
> +            return ret;
> +
> +        av_log(ctx, AV_LOG_INFO,
> +               "n:%7"PRIu64" "
> +               "size:%7d "
> +               "pts:%s pt:%s "
> +               "dts:%s dt:%s "
> +               "ds:%"PRId64" d:%s "
> +               "\n",
> +               priv->nb_packets, pkt->size,
> +               av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ctx->time_base_in),
> +               av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ctx->time_base_in),
> +               pkt->duration, av_ts2timestr(pkt->duration, &ctx->time_base_in));
> +
> +        priv->nb_packets++;
> +
> +        return 0;
> +    }
> +}

It's late here and I surely must be missing something. Anyway,
why do we use a while loop here?


Best regards,
  Alexander

[...]
diff mbox series

Patch

diff --git a/Changelog b/Changelog
index c1fd66b4bd..c5fb21d198 100644
--- a/Changelog
+++ b/Changelog
@@ -23,6 +23,7 @@  version <next>:
 - ffmpeg CLI -bsf option may now be used for input as well as output
 - ffmpeg CLI options may now be used as -/opt <path>, which is equivalent
   to -opt <contents of file <path>>
+- showinfo bitstream filter
 
 version 6.1:
 - libaribcaption decoder
diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi
index dc4f85bac0..d5bac105ff 100644
--- a/doc/bitstream_filters.texi
+++ b/doc/bitstream_filters.texi
@@ -887,6 +887,10 @@  For example, to set PTS equal to DTS (not recommended if B-frames are involved):
 ffmpeg -i INPUT -c:a copy -bsf:a setts=pts=DTS out.mkv
 @end example
 
+@section showinfo
+Log basic packet information. Mainly useful for testing, debugging,
+and development.
+
 @anchor{text2movsub}
 @section text2movsub
 
diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c
index 1e9a676a3d..1bae113d92 100644
--- a/libavcodec/bitstream_filters.c
+++ b/libavcodec/bitstream_filters.c
@@ -58,6 +58,7 @@  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_setts_bsf;
+extern const FFBitStreamFilter ff_showinfo_bsf;
 extern const FFBitStreamFilter ff_text2movsub_bsf;
 extern const FFBitStreamFilter ff_trace_headers_bsf;
 extern const FFBitStreamFilter ff_truehd_core_bsf;
diff --git a/libavcodec/bsf/Makefile b/libavcodec/bsf/Makefile
index 7831b0f2aa..62609eb24e 100644
--- a/libavcodec/bsf/Makefile
+++ b/libavcodec/bsf/Makefile
@@ -36,6 +36,7 @@  OBJS-$(CONFIG_PGS_FRAME_MERGE_BSF)        += bsf/pgs_frame_merge.o
 OBJS-$(CONFIG_PRORES_METADATA_BSF)        += bsf/prores_metadata.o
 OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF)       += bsf/remove_extradata.o
 OBJS-$(CONFIG_SETTS_BSF)                  += bsf/setts.o
+OBJS-$(CONFIG_SHOWINFO_BSF)               += bsf/showinfo.o
 OBJS-$(CONFIG_TEXT2MOVSUB_BSF)            += bsf/movsub.o
 OBJS-$(CONFIG_TRACE_HEADERS_BSF)          += bsf/trace_headers.o
 OBJS-$(CONFIG_TRUEHD_CORE_BSF)            += bsf/truehd_core.o
diff --git a/libavcodec/bsf/showinfo.c b/libavcodec/bsf/showinfo.c
new file mode 100644
index 0000000000..dc1ac8ceb6
--- /dev/null
+++ b/libavcodec/bsf/showinfo.c
@@ -0,0 +1,66 @@ 
+/*
+ * Copyright (c) 2024 Anton Khirnov <anton@khirnov.net>
+ *
+ * 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 <stdint.h>
+
+#include "bsf.h"
+#include "bsf_internal.h"
+
+#include "libavutil/log.h"
+#include "libavutil/timestamp.h"
+
+typedef struct ShowinfoContext {
+    uint64_t nb_packets;
+} ShowinfoContext;
+
+static int showinfo_filter(AVBSFContext *ctx, AVPacket *pkt)
+{
+    ShowinfoContext *priv = ctx->priv_data;
+
+    while (1) {
+        int ret;
+
+        ret = ff_bsf_get_packet_ref(ctx, pkt);
+        if (ret < 0)
+            return ret;
+
+        av_log(ctx, AV_LOG_INFO,
+               "n:%7"PRIu64" "
+               "size:%7d "
+               "pts:%s pt:%s "
+               "dts:%s dt:%s "
+               "ds:%"PRId64" d:%s "
+               "\n",
+               priv->nb_packets, pkt->size,
+               av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ctx->time_base_in),
+               av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ctx->time_base_in),
+               pkt->duration, av_ts2timestr(pkt->duration, &ctx->time_base_in));
+
+        priv->nb_packets++;
+
+        return 0;
+    }
+}
+
+const FFBitStreamFilter ff_showinfo_bsf = {
+    .p.name         = "showinfo",
+    .filter         = showinfo_filter,
+    .priv_data_size = sizeof(ShowinfoContext),
+};