* [FFmpeg-devel] [PATCH v5 0/3] ffmpeg: Add display_{rotation, hflip, vflip, scale} options
@ 2022-09-25 16:15 Thilo Borgmann
2022-09-25 16:15 ` [FFmpeg-devel] [PATCH v5 1/3] lavu/display: Add scaling functions to the display matrix Thilo Borgmann
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Thilo Borgmann @ 2022-09-25 16:15 UTC (permalink / raw)
To: ffmpeg-devel
Hi,
this is an updated and cleaned-up version of Jan's patchset discussed in [1], now v5...
Should fix #8329 and #6370.
Thanks,
Thilo
Jan Ekström (2):
ffmpeg: Add display_{rotation, hflip, vflip, scale} options
ffmpeg: Deprecate display rotation override with a metadata key
Thilo Borgmann (1):
lavu/display: Add scaling functions to the display matrix
doc/APIchanges | 3 ++
doc/ffmpeg.texi | 36 ++++++++++++++++++
fftools/ffmpeg.c | 2 +
fftools/ffmpeg.h | 13 +++++++
fftools/ffmpeg_filter.c | 12 ++++++
fftools/ffmpeg_opt.c | 75 +++++++++++++++++++++++++++++++++++++
libavutil/display.c | 21 +++++++++++
libavutil/display.h | 15 ++++++++
libavutil/version.h | 4 +-
tests/fate/filter-video.mak | 2 +-
10 files changed, 180 insertions(+), 3 deletions(-)
--
2.20.1 (Apple Git-117)
_______________________________________________
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".
^ permalink raw reply [flat|nested] 5+ messages in thread
* [FFmpeg-devel] [PATCH v5 1/3] lavu/display: Add scaling functions to the display matrix
2022-09-25 16:15 [FFmpeg-devel] [PATCH v5 0/3] ffmpeg: Add display_{rotation, hflip, vflip, scale} options Thilo Borgmann
@ 2022-09-25 16:15 ` Thilo Borgmann
2022-09-25 17:48 ` Andreas Rheinhardt
2022-09-25 16:15 ` [FFmpeg-devel] [PATCH v5 2/3] ffmpeg: Add display_{rotation, hflip, vflip, scale} options Thilo Borgmann
2022-09-25 16:15 ` [FFmpeg-devel] [PATCH v5 3/3] ffmpeg: Deprecate display rotation override with a metadata key Thilo Borgmann
2 siblings, 1 reply; 5+ messages in thread
From: Thilo Borgmann @ 2022-09-25 16:15 UTC (permalink / raw)
To: ffmpeg-devel
---
doc/APIchanges | 3 +++
libavutil/display.c | 21 +++++++++++++++++++++
libavutil/display.h | 15 +++++++++++++++
libavutil/version.h | 4 ++--
4 files changed, 41 insertions(+), 2 deletions(-)
diff --git a/doc/APIchanges b/doc/APIchanges
index 729f56be7b..42e3391b72 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -14,6 +14,9 @@ libavutil: 2021-04-27
API changes, most recent first:
+2022-09-25 - xxxxxxxxxx - lavu 57.37.100 - display.h
+ Add av_display_matrix_scale(), av_display_scale_get()
+
2022-09-03 - xxxxxxxxxx - lavu 57.36.100 - pixfmt.h
Add AV_PIX_FMT_P012, AV_PIX_FMT_Y212, AV_PIX_FMT_XV30, AV_PIX_FMT_XV36
diff --git a/libavutil/display.c b/libavutil/display.c
index d31061283c..90758656e3 100644
--- a/libavutil/display.c
+++ b/libavutil/display.c
@@ -48,6 +48,19 @@ double av_display_rotation_get(const int32_t matrix[9])
return -rotation;
}
+double av_display_scale_get(const int32_t matrix[9])
+{
+ double scale[2];
+
+ scale[0] = hypot(CONV_FP(matrix[0]), CONV_FP(matrix[3]));
+ scale[1] = hypot(CONV_FP(matrix[1]), CONV_FP(matrix[4]));
+
+ if (scale[0] == 0.0 || scale[1] == 0.0)
+ return NAN;
+
+ return scale[0];
+}
+
void av_display_rotation_set(int32_t matrix[9], double angle)
{
double radians = -angle * M_PI / 180.0f;
@@ -72,3 +85,11 @@ void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip)
for (i = 0; i < 9; i++)
matrix[i] *= flip[i % 3];
}
+
+void av_display_matrix_scale(int32_t matrix[9], double scale)
+{
+ matrix[0] = CONV_DB(CONV_FP(matrix[0]) * scale);
+ matrix[1] = CONV_DB(CONV_FP(matrix[1]) * scale);
+ matrix[3] = CONV_DB(CONV_FP(matrix[3]) * scale);
+ matrix[4] = CONV_DB(CONV_FP(matrix[4]) * scale);
+}
diff --git a/libavutil/display.h b/libavutil/display.h
index 31d8bef361..73767b3a71 100644
--- a/libavutil/display.h
+++ b/libavutil/display.h
@@ -86,6 +86,14 @@
*/
double av_display_rotation_get(const int32_t matrix[9]);
+/**
+ * Extract the scaling component of the transformation matrix.
+ *
+ * @param matrix the transformation matrix
+ * @return the scaling by which the transformation matrix scales the frame
+ */
+double av_display_scale_get(const int32_t matrix[9]);
+
/**
* Initialize a transformation matrix describing a pure clockwise
* rotation by the specified angle (in degrees).
@@ -105,6 +113,13 @@ void av_display_rotation_set(int32_t matrix[9], double angle);
*/
void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip);
+/**
+ * Scale the input matrix.
+ *
+ * @param matrix an allocated transformation matrix
+ * @param scale scale factor by which the matrix should be scaled
+ */
+void av_display_matrix_scale(int32_t matrix[9], double scale);
/**
* @}
* @}
diff --git a/libavutil/version.h b/libavutil/version.h
index 0585fa7b80..9c44cef6aa 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,8 +79,8 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 57
-#define LIBAVUTIL_VERSION_MINOR 36
-#define LIBAVUTIL_VERSION_MICRO 102
+#define LIBAVUTIL_VERSION_MINOR 37
+#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \
--
2.20.1 (Apple Git-117)
_______________________________________________
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".
^ permalink raw reply [flat|nested] 5+ messages in thread
* [FFmpeg-devel] [PATCH v5 2/3] ffmpeg: Add display_{rotation, hflip, vflip, scale} options
2022-09-25 16:15 [FFmpeg-devel] [PATCH v5 0/3] ffmpeg: Add display_{rotation, hflip, vflip, scale} options Thilo Borgmann
2022-09-25 16:15 ` [FFmpeg-devel] [PATCH v5 1/3] lavu/display: Add scaling functions to the display matrix Thilo Borgmann
@ 2022-09-25 16:15 ` Thilo Borgmann
2022-09-25 16:15 ` [FFmpeg-devel] [PATCH v5 3/3] ffmpeg: Deprecate display rotation override with a metadata key Thilo Borgmann
2 siblings, 0 replies; 5+ messages in thread
From: Thilo Borgmann @ 2022-09-25 16:15 UTC (permalink / raw)
To: ffmpeg-devel
From: Jan Ekström <jeebjp@gmail.com>
This enables overriding the scale, rotation as well as horizontal/vertical
flip state of a specific video stream on the input side.
Additionally, switch the singular test that was utilizing the rotation
metadata to instead override the input display rotation, thus leading
to the same result.
---
doc/ffmpeg.texi | 36 ++++++++++++++++++++
fftools/ffmpeg.h | 8 +++++
fftools/ffmpeg_filter.c | 12 +++++++
fftools/ffmpeg_opt.c | 65 +++++++++++++++++++++++++++++++++++++
tests/fate/filter-video.mak | 2 +-
5 files changed, 122 insertions(+), 1 deletion(-)
diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
index 42440d93b4..066aa463b2 100644
--- a/doc/ffmpeg.texi
+++ b/doc/ffmpeg.texi
@@ -912,6 +912,42 @@ If used together with @option{-vcodec copy}, it will affect the aspect ratio
stored at container level, but not the aspect ratio stored in encoded
frames, if it exists.
+@item -display_rotation[:@var{stream_specifier}] @var{rotation} (@emph{input,per-stream})
+Set the video display rotation in degrees specified by @var{rotation}.
+
+@var{rotation} is a floating point number that describes a pure
+counter-clockwise rotation in degrees.
+
+When setting this, @code{-autorotate} logic will be affected.
+For additional parameters affecting display matrix side data into which this
+information is saved, see @code{-display_hflip}, @code{-display_vflip}
+and @code{-display_scale}.
+
+These options work as a unit, so if only one of them is set, then the display
+matrix will be overridden to that specific value with the rest being set to
+default values. When applied the order of transformations is scale, flip and rotate.
+
+If unset, the default value if a display matrix is being defined is a rotation
+of zero degrees.
+
+@item -display_hflip[:@var{stream_specifier}] (@emph{input,per-stream})
+Set whether on display the image should be horizontally flipped.
+
+If unset, the default value if a display matrix is being defined is that there
+is no additional horizontal flip. See @code{-display_rotation}.
+
+@item -display_vflip[:@var{stream_specifier}] (@emph{input,per-stream})
+Set whether on display the image should be vertically flipped.
+
+If unset, the default value if a display matrix is being defined is that there
+is no additional vertical flip. See @code{-display_rotation}.
+
+@item -display_scale[:@var{stream_specifier}] (@emph{input,per-stream})
+Set whether on display the image should be scaled.
+
+If unset, the default value if a display matrix is being defined is that there
+is no additional scale. See @code{-display_rotation}.
+
@item -vn (@emph{input/output})
As an input option, blocks all video streams of a file from being filtered or
being automatically selected or mapped for any output. See @code{-discard}
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index ede0b2bd96..44a838d29b 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -193,6 +193,14 @@ typedef struct OptionsContext {
int nb_force_fps;
SpecifierOpt *frame_aspect_ratios;
int nb_frame_aspect_ratios;
+ SpecifierOpt *display_rotations;
+ int nb_display_rotations;
+ SpecifierOpt *display_hflips;
+ int nb_display_hflips;
+ SpecifierOpt *display_vflips;
+ int nb_display_vflips;
+ SpecifierOpt *display_scales;
+ int nb_display_scales;
SpecifierOpt *rc_overrides;
int nb_rc_overrides;
SpecifierOpt *intra_matrices;
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 7a5308425d..09e1e0a863 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -779,9 +779,21 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
if (ist->autorotate && !(desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) {
int32_t *displaymatrix = ifilter->displaymatrix;
double theta;
+ double scale;
if (!displaymatrix)
displaymatrix = (int32_t *)av_stream_get_side_data(ist->st, AV_PKT_DATA_DISPLAYMATRIX, NULL);
+
+ if (displaymatrix) {
+ scale = av_display_scale_get(displaymatrix);
+
+ if (scale != 1.0f) {
+ char scale_buf[128];
+ snprintf(scale_buf, sizeof(scale_buf), "%f*iw:%f*ih", scale, scale);
+ ret = insert_filter(&last_filter, &pad_idx, "scale", scale_buf);
+ }
+ }
+
theta = get_rotation(displaymatrix);
if (fabs(theta - 90) < 1.0) {
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 5febe319e4..52709ca133 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -20,6 +20,7 @@
#include "config.h"
+#include <float.h>
#include <stdint.h>
#if HAVE_SYS_RESOURCE_H
@@ -45,6 +46,7 @@
#include "libavutil/avutil.h"
#include "libavutil/bprint.h"
#include "libavutil/channel_layout.h"
+#include "libavutil/display.h"
#include "libavutil/getenv_utf8.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/fifo.h"
@@ -86,6 +88,10 @@ static const char *const opt_name_forced_key_frames[] = {"forced_key_fra
static const char *const opt_name_fps_mode[] = {"fps_mode", NULL};
static const char *const opt_name_force_fps[] = {"force_fps", NULL};
static const char *const opt_name_frame_aspect_ratios[] = {"aspect", NULL};
+static const char *const opt_name_display_rotations[] = {"display_rotation", NULL};
+static const char *const opt_name_display_hflips[] = {"display_hflip", NULL};
+static const char *const opt_name_display_vflips[] = {"display_vflip", NULL};
+static const char *const opt_name_display_scales[] = {"display_scale", NULL};
static const char *const opt_name_rc_overrides[] = {"rc_override", NULL};
static const char *const opt_name_intra_matrices[] = {"intra_matrix", NULL};
static const char *const opt_name_inter_matrices[] = {"inter_matrix", NULL};
@@ -801,6 +807,49 @@ static int opt_recording_timestamp(void *optctx, const char *opt, const char *ar
return 0;
}
+static void add_display_matrix_to_stream(OptionsContext *o,
+ AVFormatContext *ctx, AVStream *st)
+{
+ double rotation = DBL_MAX, scale = DBL_MAX;
+ int hflip = -1, vflip = -1;
+ int hflip_set = 0, vflip_set = 0, rotation_set = 0, scale_set = 0;
+ uint8_t *buf = NULL;
+
+ MATCH_PER_STREAM_OPT(display_rotations, dbl, rotation, ctx, st);
+ MATCH_PER_STREAM_OPT(display_hflips, i, hflip, ctx, st);
+ MATCH_PER_STREAM_OPT(display_vflips, i, vflip, ctx, st);
+ MATCH_PER_STREAM_OPT(display_scales, dbl, scale, ctx, st);
+
+ rotation_set = rotation != DBL_MAX;
+ hflip_set = hflip != -1;
+ vflip_set = vflip != -1;
+ scale_set = scale != DBL_MAX;
+
+ if (!rotation_set && !hflip_set && !vflip_set && !scale_set)
+ return;
+
+ if (scale <= 0.0f) {
+ av_log(NULL, AV_LOG_FATAL, "Invalid scale factor '%f'\n", scale);
+ exit_program(1);
+ }
+
+ if (!(buf = av_stream_new_side_data(st, AV_PKT_DATA_DISPLAYMATRIX,
+ sizeof(int32_t) * 9))) {
+ av_log(NULL, AV_LOG_FATAL, "Failed to generate a display matrix!\n");
+ exit_program(1);
+ }
+
+ av_display_rotation_set((int32_t *)buf,
+ rotation_set ? -(rotation) :
+ -0.0f);
+ av_display_matrix_flip((int32_t *)buf,
+ hflip_set ? hflip : 0,
+ vflip_set ? vflip : 0);
+
+ av_display_matrix_scale((int32_t *)buf,
+ scale_set ? scale : 1.0f);
+}
+
static const AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
{
const AVCodecDescriptor *desc;
@@ -935,6 +984,8 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
}
if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
+ add_display_matrix_to_stream(o, ic, st);
+
MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
hwaccel_output_format, ic, st);
@@ -4021,6 +4072,20 @@ const OptionDef options[] = {
{ "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
"set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
+ { "display_rotation", OPT_VIDEO | HAS_ARG | OPT_DOUBLE | OPT_SPEC |
+ OPT_INPUT, { .off = OFFSET(display_rotations) },
+ "set pure counter-clockwise rotation in degrees for stream(s)",
+ "angle" },
+ { "display_hflip", OPT_VIDEO | OPT_BOOL | OPT_SPEC | OPT_INPUT, { .off = OFFSET(display_hflips) },
+ "set display horizontal flip for stream(s) "
+ "(overrides any display rotation if it is not set)"},
+ { "display_vflip", OPT_VIDEO | OPT_BOOL | OPT_SPEC | OPT_INPUT, { .off = OFFSET(display_vflips) },
+ "set display vertical flip for stream(s) "
+ "(overrides any display rotation if it is not set)"},
+ { "display_scale", OPT_VIDEO | HAS_ARG | OPT_DOUBLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(display_scales) },
+ "set display scale for stream(s) "
+ "(overrides any display rotation if it is not set)",
+ "scale" },
{ "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
"set pixel format", "format" },
diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak
index 372c70bba7..f3c27ed1c8 100644
--- a/tests/fate/filter-video.mak
+++ b/tests/fate/filter-video.mak
@@ -691,7 +691,7 @@ fate-filter-metadata-avf-aphase-meter-out-of-phase: SRC = $(TARGET_SAMPLES)/filt
fate-filter-metadata-avf-aphase-meter-out-of-phase: CMD = run $(FILTER_METADATA_COMMAND) "amovie='$(SRC)',aphasemeter=video=0"
FATE_FILTER_SAMPLES-$(call TRANSCODE, RAWVIDEO H264, MOV, ARESAMPLE_FILTER AAC_FIXED_DECODER) += fate-filter-meta-4560-rotate0
-fate-filter-meta-4560-rotate0: CMD = transcode mov $(TARGET_SAMPLES)/filter/sample-in-issue-505.mov mov "-c copy -metadata:s:v:0 rotate=0" "-af aresample" "" "" "-flags +bitexact -c:a aac_fixed"
+fate-filter-meta-4560-rotate0: CMD = transcode "mov -display_rotation:v:0 0" $(TARGET_SAMPLES)/filter/sample-in-issue-505.mov mov "-c copy" "-af aresample" "" "" "-flags +bitexact -c:a aac_fixed"
FATE_FILTER_CMP_METADATA-$(CONFIG_BLOCKDETECT_FILTER) += fate-filter-refcmp-blockdetect-yuv
fate-filter-refcmp-blockdetect-yuv: CMD = cmp_metadata blockdetect yuv420p 0.015
--
2.20.1 (Apple Git-117)
_______________________________________________
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".
^ permalink raw reply [flat|nested] 5+ messages in thread
* [FFmpeg-devel] [PATCH v5 3/3] ffmpeg: Deprecate display rotation override with a metadata key
2022-09-25 16:15 [FFmpeg-devel] [PATCH v5 0/3] ffmpeg: Add display_{rotation, hflip, vflip, scale} options Thilo Borgmann
2022-09-25 16:15 ` [FFmpeg-devel] [PATCH v5 1/3] lavu/display: Add scaling functions to the display matrix Thilo Borgmann
2022-09-25 16:15 ` [FFmpeg-devel] [PATCH v5 2/3] ffmpeg: Add display_{rotation, hflip, vflip, scale} options Thilo Borgmann
@ 2022-09-25 16:15 ` Thilo Borgmann
2 siblings, 0 replies; 5+ messages in thread
From: Thilo Borgmann @ 2022-09-25 16:15 UTC (permalink / raw)
To: ffmpeg-devel
From: Jan Ekström <jeebjp@gmail.com>
Now that we have proper options for defining display matrix
overrides, this should no longer be required.
fftools does not have its own versioning, so for now the define is
just set to 1 and disables the functionality if set to zero.
---
fftools/ffmpeg.c | 2 ++
fftools/ffmpeg.h | 5 +++++
fftools/ffmpeg_opt.c | 10 ++++++++++
3 files changed, 17 insertions(+)
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 0e1477299d..65b0b83a18 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -2831,12 +2831,14 @@ static int init_output_stream_streamcopy(OutputStream *ost)
}
}
+#if FFMPEG_ROTATION_METADATA
if (ost->rotate_overridden) {
uint8_t *sd = av_stream_new_side_data(ost->st, AV_PKT_DATA_DISPLAYMATRIX,
sizeof(int32_t) * 9);
if (sd)
av_display_rotation_set((int32_t *)sd, -ost->rotate_override_value);
}
+#endif
switch (par->codec_type) {
case AVMEDIA_TYPE_AUDIO:
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 44a838d29b..3d2b39b78a 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -53,6 +53,7 @@
#define FFMPEG_OPT_PSNR 1
#define FFMPEG_OPT_MAP_CHANNEL 1
#define FFMPEG_OPT_MAP_SYNC 1
+#define FFMPEG_ROTATION_METADATA 1
enum VideoSyncMethod {
VSYNC_AUTO = -1,
@@ -538,11 +539,15 @@ typedef struct OutputStream {
int is_cfr;
int force_fps;
int top_field_first;
+#if FFMPEG_ROTATION_METADATA
int rotate_overridden;
+#endif
int autoscale;
int bitexact;
int bits_per_raw_sample;
+#if FFMPEG_ROTATION_METADATA
double rotate_override_value;
+#endif
AVRational frame_aspect_ratio;
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 52709ca133..a609f01599 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -2870,16 +2870,26 @@ static void of_add_metadata(AVFormatContext *oc, const OptionsContext *o)
for (int j = 0; j < oc->nb_streams; j++) {
OutputStream *ost = output_streams[nb_output_streams - oc->nb_streams + j];
if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
+#if FFMPEG_ROTATION_METADATA
if (!strcmp(o->metadata[i].u.str, "rotate")) {
char *tail;
double theta = av_strtod(val, &tail);
if (!*tail) {
ost->rotate_overridden = 1;
ost->rotate_override_value = theta;
+
+ av_log(NULL, AV_LOG_WARNING,
+ "Conversion of a 'rotate' metadata key to a "
+ "proper display matrix rotation is deprecated. "
+ "See -display_rotation for setting rotation "
+ "instead.");
}
} else {
+#endif
av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
+#if FFMPEG_ROTATION_METADATA
}
+#endif
} else if (ret < 0)
exit_program(1);
}
--
2.20.1 (Apple Git-117)
_______________________________________________
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".
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FFmpeg-devel] [PATCH v5 1/3] lavu/display: Add scaling functions to the display matrix
2022-09-25 16:15 ` [FFmpeg-devel] [PATCH v5 1/3] lavu/display: Add scaling functions to the display matrix Thilo Borgmann
@ 2022-09-25 17:48 ` Andreas Rheinhardt
0 siblings, 0 replies; 5+ messages in thread
From: Andreas Rheinhardt @ 2022-09-25 17:48 UTC (permalink / raw)
To: ffmpeg-devel
Thilo Borgmann:
> ---
> doc/APIchanges | 3 +++
> libavutil/display.c | 21 +++++++++++++++++++++
> libavutil/display.h | 15 +++++++++++++++
> libavutil/version.h | 4 ++--
> 4 files changed, 41 insertions(+), 2 deletions(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 729f56be7b..42e3391b72 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -14,6 +14,9 @@ libavutil: 2021-04-27
>
> API changes, most recent first:
>
> +2022-09-25 - xxxxxxxxxx - lavu 57.37.100 - display.h
> + Add av_display_matrix_scale(), av_display_scale_get()
> +
> 2022-09-03 - xxxxxxxxxx - lavu 57.36.100 - pixfmt.h
> Add AV_PIX_FMT_P012, AV_PIX_FMT_Y212, AV_PIX_FMT_XV30, AV_PIX_FMT_XV36
>
> diff --git a/libavutil/display.c b/libavutil/display.c
> index d31061283c..90758656e3 100644
> --- a/libavutil/display.c
> +++ b/libavutil/display.c
> @@ -48,6 +48,19 @@ double av_display_rotation_get(const int32_t matrix[9])
> return -rotation;
> }
>
> +double av_display_scale_get(const int32_t matrix[9])
> +{
> + double scale[2];
> +
> + scale[0] = hypot(CONV_FP(matrix[0]), CONV_FP(matrix[3]));
> + scale[1] = hypot(CONV_FP(matrix[1]), CONV_FP(matrix[4]));
> +
> + if (scale[0] == 0.0 || scale[1] == 0.0)
> + return NAN;
> +
> + return scale[0];
> +}
> +
> void av_display_rotation_set(int32_t matrix[9], double angle)
> {
> double radians = -angle * M_PI / 180.0f;
> @@ -72,3 +85,11 @@ void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip)
> for (i = 0; i < 9; i++)
> matrix[i] *= flip[i % 3];
> }
> +
> +void av_display_matrix_scale(int32_t matrix[9], double scale)
> +{
> + matrix[0] = CONV_DB(CONV_FP(matrix[0]) * scale);
> + matrix[1] = CONV_DB(CONV_FP(matrix[1]) * scale);
> + matrix[3] = CONV_DB(CONV_FP(matrix[3]) * scale);
> + matrix[4] = CONV_DB(CONV_FP(matrix[4]) * scale);
> +}
> diff --git a/libavutil/display.h b/libavutil/display.h
> index 31d8bef361..73767b3a71 100644
> --- a/libavutil/display.h
> +++ b/libavutil/display.h
> @@ -86,6 +86,14 @@
> */
> double av_display_rotation_get(const int32_t matrix[9]);
>
> +/**
> + * Extract the scaling component of the transformation matrix.
> + *
> + * @param matrix the transformation matrix
> + * @return the scaling by which the transformation matrix scales the frame
> + */
> +double av_display_scale_get(const int32_t matrix[9]);
Since when does a matrix have a well-defined scaling component at all?
(Apart from that: I have no clue what relationship the formula in
av_display_scale_get() is supposed to have to scaling. Is it possible
that you forgot that in the vector-matrix multiplication the matrix is
to the right (as opposed to the typical convention in linear algebra)
and that you actually wanted to get the length of the image of the unit
vector in the x direction? If so, you would have still forgotten about
the scaling involving matrix[8] (i.e. w and z in display.h).)
> +
> /**
> * Initialize a transformation matrix describing a pure clockwise
> * rotation by the specified angle (in degrees).
> @@ -105,6 +113,13 @@ void av_display_rotation_set(int32_t matrix[9], double angle);
> */
> void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip);
>
> +/**
> + * Scale the input matrix.
> + *
> + * @param matrix an allocated transformation matrix
The requirement of the matrix being allocated is bullshit. No need to
copy this.
> + * @param scale scale factor by which the matrix should be scaled
> + */
> +void av_display_matrix_scale(int32_t matrix[9], double scale);
> /**
> * @}
> * @}
> diff --git a/libavutil/version.h b/libavutil/version.h
> index 0585fa7b80..9c44cef6aa 100644
> --- a/libavutil/version.h
> +++ b/libavutil/version.h
> @@ -79,8 +79,8 @@
> */
>
> #define LIBAVUTIL_VERSION_MAJOR 57
> -#define LIBAVUTIL_VERSION_MINOR 36
> -#define LIBAVUTIL_VERSION_MICRO 102
> +#define LIBAVUTIL_VERSION_MINOR 37
> +#define LIBAVUTIL_VERSION_MICRO 100
>
> #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
> LIBAVUTIL_VERSION_MINOR, \
_______________________________________________
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".
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-09-25 17:48 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-25 16:15 [FFmpeg-devel] [PATCH v5 0/3] ffmpeg: Add display_{rotation, hflip, vflip, scale} options Thilo Borgmann
2022-09-25 16:15 ` [FFmpeg-devel] [PATCH v5 1/3] lavu/display: Add scaling functions to the display matrix Thilo Borgmann
2022-09-25 17:48 ` Andreas Rheinhardt
2022-09-25 16:15 ` [FFmpeg-devel] [PATCH v5 2/3] ffmpeg: Add display_{rotation, hflip, vflip, scale} options Thilo Borgmann
2022-09-25 16:15 ` [FFmpeg-devel] [PATCH v5 3/3] ffmpeg: Deprecate display rotation override with a metadata key Thilo Borgmann
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git