diff mbox series

[FFmpeg-devel] avfilter/vf_showinfo: add udu_sei_as_ascii option

Message ID tencent_771DC19DB73468DA01F968DE7CFEACA63A0A@qq.com
State New
Headers show
Series [FFmpeg-devel] avfilter/vf_showinfo: add udu_sei_as_ascii option | 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

Zhao Zhili Dec. 13, 2023, 3:46 a.m. UTC
From: Zhao Zhili <zhilizhao@tencent.com>

Some encoders (e.g., libx264) dump encoder configuration as user
data unregistered SEI message. This option try to print it as
ascii character when possible.
---
 doc/filters.texi          |  4 ++++
 libavfilter/version.h     |  2 +-
 libavfilter/vf_showinfo.c | 14 ++++++++++++--
 3 files changed, 17 insertions(+), 3 deletions(-)

Comments

Zhao Zhili Dec. 21, 2023, 3:05 a.m. UTC | #1
> On Dec 13, 2023, at 11:46, Zhao Zhili <quinkblack@foxmail.com> wrote:
> 
> From: Zhao Zhili <zhilizhao@tencent.com>
> 
> Some encoders (e.g., libx264) dump encoder configuration as user
> data unregistered SEI message. This option try to print it as
> ascii character when possible.
> ---
> doc/filters.texi          |  4 ++++
> libavfilter/version.h     |  2 +-
> libavfilter/vf_showinfo.c | 14 ++++++++++++--
> 3 files changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 6d00ba2c3f..0d4c5a47a0 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -21796,6 +21796,10 @@ This filter supports the following options:
> @table @option
> @item checksum
> Calculate checksums of each plane. By default enabled.
> +
> +@item udu_sei_as_ascii
> +Try to print user data unregistered SEI as ascii character when possible,
> +in hex format otherwise.
> @end table
> 
> The shown line contains a sequence of key/value pairs of the form
> diff --git a/libavfilter/version.h b/libavfilter/version.h
> index 7642b670d1..83931e11dd 100644
> --- a/libavfilter/version.h
> +++ b/libavfilter/version.h
> @@ -32,7 +32,7 @@
> #include "version_major.h"
> 
> #define LIBAVFILTER_VERSION_MINOR  14
> -#define LIBAVFILTER_VERSION_MICRO 100
> +#define LIBAVFILTER_VERSION_MICRO 101
> 
> 
> #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
> diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c
> index 71869446c6..309de28df9 100644
> --- a/libavfilter/vf_showinfo.c
> +++ b/libavfilter/vf_showinfo.c
> @@ -22,6 +22,7 @@
>  * filter for showing textual video frame information
>  */
> 
> +#include <ctype.h>
> #include <inttypes.h>
> 
> #include "libavutil/bswap.h"
> @@ -52,6 +53,7 @@
> typedef struct ShowInfoContext {
>     const AVClass *class;
>     int calculate_checksums;
> +    int udu_sei_as_ascii;
> } ShowInfoContext;
> 
> #define OFFSET(x) offsetof(ShowInfoContext, x)
> @@ -59,6 +61,8 @@ typedef struct ShowInfoContext {
> 
> static const AVOption showinfo_options[] = {
>     { "checksum", "calculate checksums", OFFSET(calculate_checksums), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, VF },
> +    { "udu_sei_as_ascii", "try to print user data unregistered SEI as ascii character when possible",
> +        OFFSET(udu_sei_as_ascii), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VF },
>     { NULL }
> };
> 
> @@ -418,6 +422,7 @@ static void dump_video_enc_params(AVFilterContext *ctx, const AVFrameSideData *s
> static void dump_sei_unregistered_metadata(AVFilterContext *ctx, const AVFrameSideData *sd)
> {
>     const uint8_t *user_data = sd->data;
> +    ShowInfoContext *s = ctx->priv;
> 
>     if (sd->size < AV_UUID_LEN) {
>         av_log(ctx, AV_LOG_ERROR, "invalid data(%"SIZE_SPECIFIER" < "
> @@ -428,8 +433,13 @@ static void dump_sei_unregistered_metadata(AVFilterContext *ctx, const AVFrameSi
>     av_log(ctx, AV_LOG_INFO, "UUID=" AV_PRI_UUID "\n", AV_UUID_ARG(user_data));
> 
>     av_log(ctx, AV_LOG_INFO, "User Data=");
> -    for (size_t i = 16; i < sd->size; i++)
> -        av_log(ctx, AV_LOG_INFO, "%02x", user_data[i]);
> +    for (size_t i = 16; i < sd->size; i++) {
> +        const char *format = "%02x";
> +
> +        if (s->udu_sei_as_ascii)
> +            format = isprint(user_data[i]) ? "%c" : "\\x%02x";
> +        av_log(ctx, AV_LOG_INFO, format, user_data[i]);
> +    }
>     av_log(ctx, AV_LOG_INFO, "\n");
> }
> 
> -- 
> 2.25.1

Ping. Any comments on this idea and implementation?
Zhao Zhili Dec. 28, 2023, 5:30 a.m. UTC | #2
> On Dec 21, 2023, at 11:05, Zhao Zhili <quinkblack@foxmail.com> wrote:
> 
> 
>> On Dec 13, 2023, at 11:46, Zhao Zhili <quinkblack@foxmail.com> wrote:
>> 
>> From: Zhao Zhili <zhilizhao@tencent.com>
>> 
>> Some encoders (e.g., libx264) dump encoder configuration as user
>> data unregistered SEI message. This option try to print it as
>> ascii character when possible.
>> ---
>> doc/filters.texi          |  4 ++++
>> libavfilter/version.h     |  2 +-
>> libavfilter/vf_showinfo.c | 14 ++++++++++++--
>> 3 files changed, 17 insertions(+), 3 deletions(-)
>> 
> 
> Ping. Any comments on this idea and implementation?

Applied. Hope it doesn’t make trouble during Christmas.

> 
> _______________________________________________
> 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".
diff mbox series

Patch

diff --git a/doc/filters.texi b/doc/filters.texi
index 6d00ba2c3f..0d4c5a47a0 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -21796,6 +21796,10 @@  This filter supports the following options:
 @table @option
 @item checksum
 Calculate checksums of each plane. By default enabled.
+
+@item udu_sei_as_ascii
+Try to print user data unregistered SEI as ascii character when possible,
+in hex format otherwise.
 @end table
 
 The shown line contains a sequence of key/value pairs of the form
diff --git a/libavfilter/version.h b/libavfilter/version.h
index 7642b670d1..83931e11dd 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -32,7 +32,7 @@ 
 #include "version_major.h"
 
 #define LIBAVFILTER_VERSION_MINOR  14
-#define LIBAVFILTER_VERSION_MICRO 100
+#define LIBAVFILTER_VERSION_MICRO 101
 
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c
index 71869446c6..309de28df9 100644
--- a/libavfilter/vf_showinfo.c
+++ b/libavfilter/vf_showinfo.c
@@ -22,6 +22,7 @@ 
  * filter for showing textual video frame information
  */
 
+#include <ctype.h>
 #include <inttypes.h>
 
 #include "libavutil/bswap.h"
@@ -52,6 +53,7 @@ 
 typedef struct ShowInfoContext {
     const AVClass *class;
     int calculate_checksums;
+    int udu_sei_as_ascii;
 } ShowInfoContext;
 
 #define OFFSET(x) offsetof(ShowInfoContext, x)
@@ -59,6 +61,8 @@  typedef struct ShowInfoContext {
 
 static const AVOption showinfo_options[] = {
     { "checksum", "calculate checksums", OFFSET(calculate_checksums), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, VF },
+    { "udu_sei_as_ascii", "try to print user data unregistered SEI as ascii character when possible",
+        OFFSET(udu_sei_as_ascii), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VF },
     { NULL }
 };
 
@@ -418,6 +422,7 @@  static void dump_video_enc_params(AVFilterContext *ctx, const AVFrameSideData *s
 static void dump_sei_unregistered_metadata(AVFilterContext *ctx, const AVFrameSideData *sd)
 {
     const uint8_t *user_data = sd->data;
+    ShowInfoContext *s = ctx->priv;
 
     if (sd->size < AV_UUID_LEN) {
         av_log(ctx, AV_LOG_ERROR, "invalid data(%"SIZE_SPECIFIER" < "
@@ -428,8 +433,13 @@  static void dump_sei_unregistered_metadata(AVFilterContext *ctx, const AVFrameSi
     av_log(ctx, AV_LOG_INFO, "UUID=" AV_PRI_UUID "\n", AV_UUID_ARG(user_data));
 
     av_log(ctx, AV_LOG_INFO, "User Data=");
-    for (size_t i = 16; i < sd->size; i++)
-        av_log(ctx, AV_LOG_INFO, "%02x", user_data[i]);
+    for (size_t i = 16; i < sd->size; i++) {
+        const char *format = "%02x";
+
+        if (s->udu_sei_as_ascii)
+            format = isprint(user_data[i]) ? "%c" : "\\x%02x";
+        av_log(ctx, AV_LOG_INFO, format, user_data[i]);
+    }
     av_log(ctx, AV_LOG_INFO, "\n");
 }