* [FFmpeg-devel] [PR] Improve -fshort-enums compatibility (PR #21612)
@ 2026-01-30 18:51 mkver via ffmpeg-devel
0 siblings, 0 replies; only message in thread
From: mkver via ffmpeg-devel @ 2026-01-30 18:51 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: mkver
PR #21612 opened by mkver
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21612
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21612.patch
>From 3703d78fd55bab1a5316d47ef90f74861288d200 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 30 Jan 2026 16:48:06 +0100
Subject: [PATCH 1/9] fftools/ffmpeg_mux_init: Improve type-safety
This makes fftools -fshort-enums compatible.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
fftools/ffmpeg_mux_init.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
index 4cb8f91d6e..5c0c8ca36f 100644
--- a/fftools/ffmpeg_mux_init.c
+++ b/fftools/ffmpeg_mux_init.c
@@ -482,9 +482,9 @@ static int parse_matrix_coeffs(void *logctx, uint16_t *dest, const char *str)
return 0;
}
-static int fmt_in_list(const int *formats, int format)
+static int pixfmt_in_list(const enum AVPixelFormat *formats, enum AVPixelFormat format)
{
- for (; *formats != -1; formats++)
+ for (; *formats != AV_PIX_FMT_NONE; formats++)
if (*formats == format)
return 1;
return 0;
@@ -544,7 +544,7 @@ static enum AVPixelFormat pix_fmt_parse(OutputStream *ost, const char *name)
* endianness by av_get_pix_fmt();
* the following code handles the case when the native endianness is not
* supported by the encoder, but the other one is */
- if (fmts && !fmt_in_list(fmts, fmt)) {
+ if (fmts && !pixfmt_in_list(fmts, fmt)) {
const char *name_canonical = av_get_pix_fmt_name(fmt);
int len = strlen(name_canonical);
@@ -557,7 +557,7 @@ static enum AVPixelFormat pix_fmt_parse(OutputStream *ost, const char *name)
snprintf(name_other, sizeof(name_other), "%s%ce",
name, name_canonical[len - 2] == 'l' ? 'b' : 'l');
fmt_other = av_get_pix_fmt(name_other);
- if (fmt_other != AV_PIX_FMT_NONE && fmt_in_list(fmts, fmt_other)) {
+ if (fmt_other != AV_PIX_FMT_NONE && pixfmt_in_list(fmts, fmt_other)) {
av_log(ost, AV_LOG_VERBOSE, "Mapping pixel format %s->%s\n",
name, name_other);
fmt = fmt_other;
@@ -565,7 +565,7 @@ static enum AVPixelFormat pix_fmt_parse(OutputStream *ost, const char *name)
}
}
- if (fmts && !fmt_in_list(fmts, fmt))
+ if (fmts && !pixfmt_in_list(fmts, fmt))
fmt = choose_pixel_fmt(ost->enc->enc_ctx, fmt);
return fmt;
--
2.52.0
>From e9198f3b48e5f9b416750fdf2e9d24dc8955ccf1 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 30 Jan 2026 17:01:30 +0100
Subject: [PATCH 2/9] avfilter/filters: Restrict ff_fmt_is_in() to enum
AVPixelFormat
Also rename it to ff_pixfmt_is_in(). This is more type-safe;
in particular, it is required to support -fshort-enum.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavfilter/filters.h | 9 ++++-----
libavfilter/formats.c | 8 +++-----
libavfilter/vf_blackdetect.c | 2 +-
libavfilter/vf_fade.c | 2 +-
libavfilter/vf_lut.c | 4 ++--
libavfilter/vf_overlay.c | 4 ++--
libavfilter/vf_tinterlace.c | 4 ++--
7 files changed, 15 insertions(+), 18 deletions(-)
diff --git a/libavfilter/filters.h b/libavfilter/filters.h
index bc79527b87..3a3bdb9b1c 100644
--- a/libavfilter/filters.h
+++ b/libavfilter/filters.h
@@ -26,6 +26,7 @@
*/
#include "avfilter.h"
+#include "libavutil/pixfmt.h"
/**
* Special return code when activate() did not do anything.
@@ -807,15 +808,13 @@ int ff_append_inpad_free_name (AVFilterContext *f, AVFilterPad *p);
int ff_append_outpad_free_name(AVFilterContext *f, AVFilterPad *p);
/**
- * Tell if an integer is contained in the provided -1-terminated list of integers.
- * This is useful for determining (for instance) if an AVPixelFormat is in an
- * array of supported formats.
+ * Tell if a pixel format is contained the provided AV_PIX_FMT_NONE-terminated list.
*
* @param fmt provided format
- * @param fmts -1-terminated list of formats
+ * @param fmts AV_PIX_FMT_NONE-terminated list of formats
* @return 1 if present, 0 if absent
*/
-int ff_fmt_is_in(int fmt, const int *fmts);
+int ff_pixfmt_is_in(enum AVPixelFormat fmt, const enum AVPixelFormat *fmts);
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func,
void *arg, int *ret, int nb_jobs);
diff --git a/libavfilter/formats.c b/libavfilter/formats.c
index 6fbdeb2d26..3315922cc7 100644
--- a/libavfilter/formats.c
+++ b/libavfilter/formats.c
@@ -468,12 +468,10 @@ const AVFilterNegotiation *ff_filter_get_negotiation(const AVFilterLink *link)
}
}
-int ff_fmt_is_in(int fmt, const int *fmts)
+int ff_pixfmt_is_in(enum AVPixelFormat fmt, const enum AVPixelFormat *fmts)
{
- const int *p;
-
- for (p = fmts; *p != -1; p++) {
- if (fmt == *p)
+ for (; *fmts != AV_PIX_FMT_NONE; ++fmts) {
+ if (fmt == *fmts)
return 1;
}
return 0;
diff --git a/libavfilter/vf_blackdetect.c b/libavfilter/vf_blackdetect.c
index df11a2140e..d39b2df006 100644
--- a/libavfilter/vf_blackdetect.c
+++ b/libavfilter/vf_blackdetect.c
@@ -187,7 +187,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
const int max = (1 << s->depth) - 1;
const int factor = (1 << (s->depth - 8));
const int full = picref->color_range == AVCOL_RANGE_JPEG ||
- ff_fmt_is_in(picref->format, yuvj_formats) ||
+ ff_pixfmt_is_in(picref->format, yuvj_formats) ||
s->alpha;
s->pixel_black_th_i = full ? s->pixel_black_th * max :
diff --git a/libavfilter/vf_fade.c b/libavfilter/vf_fade.c
index a9026992f1..efe0ea380d 100644
--- a/libavfilter/vf_fade.c
+++ b/libavfilter/vf_fade.c
@@ -447,7 +447,7 @@ static int config_input(AVFilterLink *inlink)
/* use CCIR601/709 black level for studio-level pixel non-alpha components */
s->black_level =
- ff_fmt_is_in(inlink->format, studio_level_pix_fmts) && !s->alpha ? 16 * (1 << (s->depth - 8)): 0;
+ ff_pixfmt_is_in(inlink->format, studio_level_pix_fmts) && !s->alpha ? 16 * (1 << (s->depth - 8)): 0;
/* 32768 = 1 << 15, it is an integer representation
* of 0.5 and is for rounding. */
s->black_level_scaled = (s->black_level << 16) + 32768;
diff --git a/libavfilter/vf_lut.c b/libavfilter/vf_lut.c
index ed00969e75..14c9964751 100644
--- a/libavfilter/vf_lut.c
+++ b/libavfilter/vf_lut.c
@@ -285,8 +285,8 @@ static int config_props(AVFilterLink *inlink)
s->is_yuv = s->is_rgb = 0;
s->is_planar = desc->flags & AV_PIX_FMT_FLAG_PLANAR;
- if (ff_fmt_is_in(inlink->format, yuv_pix_fmts)) s->is_yuv = 1;
- else if (ff_fmt_is_in(inlink->format, rgb_pix_fmts)) s->is_rgb = 1;
+ if (ff_pixfmt_is_in(inlink->format, yuv_pix_fmts)) s->is_yuv = 1;
+ else if (ff_pixfmt_is_in(inlink->format, rgb_pix_fmts)) s->is_rgb = 1;
if (s->is_rgb) {
ff_fill_rgba_map(rgba_map, inlink->format);
diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c
index cdd5448076..d627db0889 100644
--- a/libavfilter/vf_overlay.c
+++ b/libavfilter/vf_overlay.c
@@ -316,7 +316,7 @@ static int config_input_overlay(AVFilterLink *inlink)
s->overlay_is_packed_rgb =
ff_fill_rgba_map(s->overlay_rgba_map, inlink->format) >= 0;
- s->overlay_has_alpha = ff_fmt_is_in(inlink->format, alpha_pix_fmts);
+ s->overlay_has_alpha = ff_pixfmt_is_in(inlink->format, alpha_pix_fmts);
if (s->eval_mode == EVAL_MODE_INIT) {
eval_expr(ctx);
@@ -753,7 +753,7 @@ static int config_input_main(AVFilterLink *inlink)
s->main_is_packed_rgb =
ff_fill_rgba_map(s->main_rgba_map, inlink->format) >= 0;
- s->main_has_alpha = ff_fmt_is_in(inlink->format, alpha_pix_fmts);
+ s->main_has_alpha = ff_pixfmt_is_in(inlink->format, alpha_pix_fmts);
return 0;
}
diff --git a/libavfilter/vf_tinterlace.c b/libavfilter/vf_tinterlace.c
index 59fe82abe3..2806e55752 100644
--- a/libavfilter/vf_tinterlace.c
+++ b/libavfilter/vf_tinterlace.c
@@ -235,7 +235,7 @@ static int config_out_props(AVFilterLink *outlink)
}
ff_draw_color(&tinterlace->draw, &tinterlace->color, black);
/* limited range */
- if (!ff_fmt_is_in(outlink->format, full_scale_yuvj_pix_fmts)) {
+ if (!ff_pixfmt_is_in(outlink->format, full_scale_yuvj_pix_fmts)) {
ret = av_image_alloc(tinterlace->black_data[0], tinterlace->black_linesize,
outlink->w, outlink->h, outlink->format, 16);
if (ret < 0)
@@ -444,7 +444,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
out->sample_aspect_ratio = av_mul_q(cur->sample_aspect_ratio, av_make_q(2, 1));
field = (1 + l->frame_count_in) & 1 ? FIELD_UPPER : FIELD_LOWER;
- full = out->color_range == AVCOL_RANGE_JPEG || ff_fmt_is_in(out->format, full_scale_yuvj_pix_fmts);
+ full = out->color_range == AVCOL_RANGE_JPEG || ff_pixfmt_is_in(out->format, full_scale_yuvj_pix_fmts);
/* copy upper and lower fields */
copy_picture_field(tinterlace, out->data, out->linesize,
(const uint8_t **)cur->data, cur->linesize,
--
2.52.0
>From 5e255985fe1737ef3ffffec2e04135ac733e1778 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 30 Jan 2026 17:34:13 +0100
Subject: [PATCH 3/9] avfilter/vf_removelogo: Properly handle allocation error
Don't rely on av_image_copy_plane() handling a NULL dst
gracefully.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavfilter/vf_removelogo.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/libavfilter/vf_removelogo.c b/libavfilter/vf_removelogo.c
index 70e4eef0a0..87cbc09233 100644
--- a/libavfilter/vf_removelogo.c
+++ b/libavfilter/vf_removelogo.c
@@ -223,8 +223,10 @@ static int load_mask(uint8_t **mask, int *w, int *h,
/* copy mask to a newly allocated array */
*mask = av_malloc(*w * *h);
- if (!*mask)
+ if (!*mask) {
ret = AVERROR(ENOMEM);
+ goto end;
+ }
av_image_copy_plane(*mask, *w, gray_data[0], gray_linesize[0], *w, *h);
end:
--
2.52.0
>From a7efd04e42d35dff7eb893f8e66753836b8476c0 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 30 Jan 2026 18:24:05 +0100
Subject: [PATCH 4/9] avfilter/lavfutils: Avoid copying frame in
ff_load_image()
Return the data in an AVFrame instead. This is what several users
({find,cover}_rect*) want anyway. This also avoids accessing
AVFrame.format (an int) via an enum AVPixelFormat*.
*: This commit actually avoids two frame copies For find_rect:
av_frame_clone() contained an implicit alloc+copy.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavfilter/avf_showcqt.c | 28 +++++++++++++---------------
libavfilter/lavfutils.c | 36 +++++++++++++-----------------------
libavfilter/lavfutils.h | 13 +++++--------
libavfilter/vf_cover_rect.c | 9 ++-------
libavfilter/vf_find_rect.c | 12 ++----------
libavfilter/vf_removelogo.c | 20 ++++++++++++--------
6 files changed, 47 insertions(+), 71 deletions(-)
diff --git a/libavfilter/avf_showcqt.c b/libavfilter/avf_showcqt.c
index bea311cd19..7395b0bfc2 100644
--- a/libavfilter/avf_showcqt.c
+++ b/libavfilter/avf_showcqt.c
@@ -404,33 +404,31 @@ static int init_axis_empty(ShowCQTContext *s)
static int init_axis_from_file(ShowCQTContext *s)
{
- uint8_t *tmp_data[4] = { NULL };
- int tmp_linesize[4];
- enum AVPixelFormat tmp_format;
- int tmp_w, tmp_h, ret;
-
- if ((ret = ff_load_image(tmp_data, tmp_linesize, &tmp_w, &tmp_h, &tmp_format,
- s->axisfile, s->ctx)) < 0)
- goto error;
+ AVFrame *tmp_frame;
+ int ret = ff_load_image(&tmp_frame, s->axisfile, s->ctx);
+ if (ret < 0)
+ return ret;
ret = AVERROR(ENOMEM);
if (!(s->axis_frame = av_frame_alloc()))
goto error;
- if ((ret = ff_scale_image(s->axis_frame->data, s->axis_frame->linesize, s->width, s->axis_h,
- convert_axis_pixel_format(s->format), tmp_data, tmp_linesize, tmp_w, tmp_h,
- tmp_format, s->ctx)) < 0)
+ ret = ff_scale_image(s->axis_frame->data, s->axis_frame->linesize, s->width, s->axis_h,
+ convert_axis_pixel_format(s->format),
+ tmp_frame->data, tmp_frame->linesize, tmp_frame->width, tmp_frame->height,
+ tmp_frame->format, s->ctx);
+ if (ret < 0) {
+ av_frame_free(&s->axis_frame);
goto error;
+ }
s->axis_frame->width = s->width;
s->axis_frame->height = s->axis_h;
s->axis_frame->format = convert_axis_pixel_format(s->format);
- av_freep(tmp_data);
- return 0;
+ ret = 0;
error:
- av_frame_free(&s->axis_frame);
- av_freep(tmp_data);
+ av_frame_free(&tmp_frame);
return ret;
}
diff --git a/libavfilter/lavfutils.c b/libavfilter/lavfutils.c
index 6130f21e7f..cc1b5de722 100644
--- a/libavfilter/lavfutils.c
+++ b/libavfilter/lavfutils.c
@@ -21,9 +21,8 @@
#include <stdint.h>
#include "libavutil/dict.h"
-#include "libavutil/imgutils.h"
+#include "libavutil/frame.h"
#include "libavutil/log.h"
-#include "libavutil/pixfmt.h"
#include "libavformat/avformat.h"
@@ -31,8 +30,7 @@
#include "lavfutils.h"
-int ff_load_image(uint8_t *data[4], int linesize[4],
- int *w, int *h, enum AVPixelFormat *pix_fmt,
+int ff_load_image(struct AVFrame **outframe,
const char *filename, void *log_ctx)
{
const AVInputFormat *iformat = NULL;
@@ -45,6 +43,8 @@ int ff_load_image(uint8_t *data[4], int linesize[4],
AVPacket pkt;
AVDictionary *opt=NULL;
+ *outframe = NULL;
+
iformat = av_find_input_format("image2pipe");
if ((ret = avformat_open_input(&format_ctx, filename, iformat, NULL)) < 0) {
av_log(log_ctx, AV_LOG_ERROR,
@@ -84,12 +84,6 @@ int ff_load_image(uint8_t *data[4], int linesize[4],
goto end;
}
- if (!(frame = av_frame_alloc()) ) {
- av_log(log_ctx, AV_LOG_ERROR, "Failed to alloc frame\n");
- ret = AVERROR(ENOMEM);
- goto end;
- }
-
ret = av_read_frame(format_ctx, &pkt);
if (ret < 0) {
av_log(log_ctx, AV_LOG_ERROR, "Failed to read frame from file\n");
@@ -103,27 +97,23 @@ int ff_load_image(uint8_t *data[4], int linesize[4],
goto end;
}
- ret = avcodec_receive_frame(codec_ctx, frame);
- if (ret < 0) {
- av_log(log_ctx, AV_LOG_ERROR, "Failed to decode image from file\n");
+ if (!(frame = av_frame_alloc()) ) {
+ av_log(log_ctx, AV_LOG_ERROR, "Failed to alloc frame\n");
+ ret = AVERROR(ENOMEM);
goto end;
}
- *w = frame->width;
- *h = frame->height;
- *pix_fmt = frame->format;
-
- if ((ret = av_image_alloc(data, linesize, *w, *h, *pix_fmt, 16)) < 0)
+ ret = avcodec_receive_frame(codec_ctx, frame);
+ if (ret < 0) {
+ av_frame_free(&frame);
+ av_log(log_ctx, AV_LOG_ERROR, "Failed to decode image from file\n");
goto end;
- ret = 0;
-
- av_image_copy2(data, linesize, frame->data, frame->linesize,
- *pix_fmt, *w, *h);
+ }
+ *outframe = frame;
end:
avcodec_free_context(&codec_ctx);
avformat_close_input(&format_ctx);
- av_frame_free(&frame);
av_dict_free(&opt);
if (ret < 0)
diff --git a/libavfilter/lavfutils.h b/libavfilter/lavfutils.h
index 96738cead1..3b603f3fc7 100644
--- a/libavfilter/lavfutils.h
+++ b/libavfilter/lavfutils.h
@@ -24,21 +24,18 @@
#ifndef AVFILTER_LAVFUTILS_H
#define AVFILTER_LAVFUTILS_H
-#include <stdint.h>
-#include "libavutil/pixfmt.h"
+struct AVFrame;
/**
- * Load image from filename and put the resulting image in data.
+ * Load image from filename and put the resulting image in an AVFrame.
*
- * @param w pointer to the width of the loaded image
- * @param h pointer to the height of the loaded image
- * @param pix_fmt pointer to the pixel format of the loaded image
+ * @param outframe pointer to a pointer to an AVFrame; *outframe will
+ * point to a new allocated AVFrame on success
* @param filename the name of the image file to load
* @param log_ctx log context
* @return >= 0 in case of success, a negative error code otherwise.
*/
-int ff_load_image(uint8_t *data[4], int linesize[4],
- int *w, int *h, enum AVPixelFormat *pix_fmt,
+int ff_load_image(struct AVFrame **outframe,
const char *filename, void *log_ctx);
#endif /* AVFILTER_LAVFUTILS_H */
diff --git a/libavfilter/vf_cover_rect.c b/libavfilter/vf_cover_rect.c
index 410869d9c3..3a35def0e1 100644
--- a/libavfilter/vf_cover_rect.c
+++ b/libavfilter/vf_cover_rect.c
@@ -205,13 +205,8 @@ static av_cold int init(AVFilterContext *ctx)
return AVERROR(EINVAL);
}
- cover->cover_frame = av_frame_alloc();
- if (!cover->cover_frame)
- return AVERROR(ENOMEM);
-
- if ((ret = ff_load_image(cover->cover_frame->data, cover->cover_frame->linesize,
- &cover->cover_frame->width, &cover->cover_frame->height,
- &cover->cover_frame->format, cover->cover_filename, ctx)) < 0)
+ ret = ff_load_image(&cover->cover_frame, cover->cover_filename, ctx);
+ if (ret < 0)
return ret;
if (cover->cover_frame->format != AV_PIX_FMT_YUV420P && cover->cover_frame->format != AV_PIX_FMT_YUVJ420P) {
diff --git a/libavfilter/vf_find_rect.c b/libavfilter/vf_find_rect.c
index b0be1a6f11..9276bb46d4 100644
--- a/libavfilter/vf_find_rect.c
+++ b/libavfilter/vf_find_rect.c
@@ -22,7 +22,6 @@
* @todo switch to dualinput
*/
-#include "libavutil/mem.h"
#include "libavutil/opt.h"
#include "filters.h"
@@ -254,8 +253,6 @@ static av_cold void uninit(AVFilterContext *ctx)
av_frame_free(&foc->haystack_frame[i]);
}
- if (foc->obj_frame)
- av_freep(&foc->obj_frame->data[0]);
av_frame_free(&foc->obj_frame);
}
@@ -269,13 +266,8 @@ static av_cold int init(AVFilterContext *ctx)
return AVERROR(EINVAL);
}
- foc->obj_frame = av_frame_alloc();
- if (!foc->obj_frame)
- return AVERROR(ENOMEM);
-
- if ((ret = ff_load_image(foc->obj_frame->data, foc->obj_frame->linesize,
- &foc->obj_frame->width, &foc->obj_frame->height,
- &foc->obj_frame->format, foc->obj_filename, ctx)) < 0)
+ ret = ff_load_image(&foc->obj_frame, foc->obj_filename, ctx);
+ if (ret < 0)
return ret;
if (foc->obj_frame->format != AV_PIX_FMT_GRAY8) {
diff --git a/libavfilter/vf_removelogo.c b/libavfilter/vf_removelogo.c
index 87cbc09233..1da5f5d0c7 100644
--- a/libavfilter/vf_removelogo.c
+++ b/libavfilter/vf_removelogo.c
@@ -207,18 +207,22 @@ static int load_mask(uint8_t **mask, int *w, int *h,
const char *filename, void *log_ctx)
{
int ret;
- enum AVPixelFormat pix_fmt;
- uint8_t *src_data[4], *gray_data[4];
- int src_linesize[4], gray_linesize[4];
+ uint8_t *gray_data[4];
+ AVFrame *src_frame;
+ int gray_linesize[4];
/* load image from file */
- if ((ret = ff_load_image(src_data, src_linesize, w, h, &pix_fmt, filename, log_ctx)) < 0)
+ ret = ff_load_image(&src_frame, filename, log_ctx);
+ if (ret < 0)
return ret;
+ *w = src_frame->width;
+ *h = src_frame->height;
/* convert the image to GRAY8 */
- if ((ret = ff_scale_image(gray_data, gray_linesize, *w, *h, AV_PIX_FMT_GRAY8,
- src_data, src_linesize, *w, *h, pix_fmt,
- log_ctx)) < 0)
+ ret = ff_scale_image(gray_data, gray_linesize, *w, *h, AV_PIX_FMT_GRAY8,
+ src_frame->data, src_frame->linesize, *w, *h,
+ src_frame->format, log_ctx);
+ if (ret < 0)
goto end;
/* copy mask to a newly allocated array */
@@ -230,8 +234,8 @@ static int load_mask(uint8_t **mask, int *w, int *h,
av_image_copy_plane(*mask, *w, gray_data[0], gray_linesize[0], *w, *h);
end:
- av_freep(&src_data[0]);
av_freep(&gray_data[0]);
+ av_frame_free(&src_frame);
return ret;
}
--
2.52.0
>From 383773ef244082c6fc2864ede6bc6e0bc96a89ba Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 30 Jan 2026 18:40:32 +0100
Subject: [PATCH 5/9] avutil/opt: Improve type-safety
In particular, make this code -fshort-enums compatible.
The branch can be optimized away by compilers when
sizeof(enum AVPixelFormat) == sizeof(enum AVSampleFormat).
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavutil/opt.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/libavutil/opt.c b/libavutil/opt.c
index 911e064914..7c6a01068a 100644
--- a/libavutil/opt.c
+++ b/libavutil/opt.c
@@ -1336,7 +1336,7 @@ int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRatio
return av_opt_get_q(obj, name, search_flags, out_val);
}
-static int get_format(void *obj, const char *name, int search_flags, int *out_fmt,
+static int get_format(void *obj, const char *name, int search_flags, void *out_fmt,
enum AVOptionType type, const char *desc)
{
void *dst, *target_obj;
@@ -1350,7 +1350,11 @@ static int get_format(void *obj, const char *name, int search_flags, int *out_fm
}
dst = ((uint8_t*)target_obj) + o->offset;
- *out_fmt = *(int *)dst;
+ if (type == AV_OPT_TYPE_PIXEL_FMT)
+ *(enum AVPixelFormat *)out_fmt = *(enum AVPixelFormat *)dst;
+ else
+ *(enum AVSampleFormat*)out_fmt = *(enum AVSampleFormat*)dst;
+
return 0;
}
--
2.52.0
>From 82ffbf80988bf8dc1d6c6c8ccc772664ad953bb2 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 30 Jan 2026 18:44:40 +0100
Subject: [PATCH 6/9] swscale/utils: Improve type-safety
SwsContext.{src,dst}_format is int (but uses enum AVPixelFormat)
values, so the accesses need to be performed using an int
for -fshort-enums support.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libswscale/utils.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 195af846d4..52095ab2c7 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -766,7 +766,7 @@ av_cold int ff_sws_fill_xyztables(SwsInternal *c)
return 0;
}
-static int handle_jpeg(enum AVPixelFormat *format)
+static int handle_jpeg(/* enum AVPixelFormat */ int *format)
{
switch (*format) {
case AV_PIX_FMT_YUVJ420P:
@@ -804,7 +804,7 @@ static int handle_jpeg(enum AVPixelFormat *format)
}
}
-static int handle_0alpha(enum AVPixelFormat *format)
+static int handle_0alpha(/* enum AVPixelFormat */ int *format)
{
switch (*format) {
case AV_PIX_FMT_0BGR : *format = AV_PIX_FMT_ABGR ; return 1;
@@ -815,7 +815,7 @@ static int handle_0alpha(enum AVPixelFormat *format)
}
}
-static int handle_xyz(enum AVPixelFormat *format)
+static int handle_xyz(/* enum AVPixelFormat */ int *format)
{
switch (*format) {
case AV_PIX_FMT_XYZ12BE : *format = AV_PIX_FMT_RGB48BE; return 1;
--
2.52.0
>From 5b155073e707be09b242c2850b93668415eefc67 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 30 Jan 2026 18:48:12 +0100
Subject: [PATCH 7/9] avfilter/lavfutils: Avoid AVDictionary
Set thread_type directly instead.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavfilter/lavfutils.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/libavfilter/lavfutils.c b/libavfilter/lavfutils.c
index cc1b5de722..b86c31d4ee 100644
--- a/libavfilter/lavfutils.c
+++ b/libavfilter/lavfutils.c
@@ -20,7 +20,6 @@
#include <stdint.h>
-#include "libavutil/dict.h"
#include "libavutil/frame.h"
#include "libavutil/log.h"
@@ -41,7 +40,6 @@ int ff_load_image(struct AVFrame **outframe,
AVFrame *frame = NULL;
int ret = 0;
AVPacket pkt;
- AVDictionary *opt=NULL;
*outframe = NULL;
@@ -78,8 +76,8 @@ int ff_load_image(struct AVFrame **outframe,
goto end;
}
- av_dict_set(&opt, "thread_type", "slice", 0);
- if ((ret = avcodec_open2(codec_ctx, codec, &opt)) < 0) {
+ codec_ctx->thread_type = FF_THREAD_SLICE;
+ if ((ret = avcodec_open2(codec_ctx, codec, NULL)) < 0) {
av_log(log_ctx, AV_LOG_ERROR, "Failed to open codec\n");
goto end;
}
@@ -114,7 +112,6 @@ int ff_load_image(struct AVFrame **outframe,
end:
avcodec_free_context(&codec_ctx);
avformat_close_input(&format_ctx);
- av_dict_free(&opt);
if (ret < 0)
av_log(log_ctx, AV_LOG_ERROR, "Error loading image file '%s'\n", filename);
--
2.52.0
>From 132f0d02a995fce78b1a2306a6e9f7208c5c49aa Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 30 Jan 2026 19:11:24 +0100
Subject: [PATCH 8/9] avcodec/flacenc: Use int for AV_OPT_TYPE_INT
Necessary for -fshort-enums.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/flacenc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c
index 48478749d9..ead2c55f10 100644
--- a/libavcodec/flacenc.c
+++ b/libavcodec/flacenc.c
@@ -57,7 +57,7 @@ enum CodingMode {
typedef struct CompressionOptions {
int compression_level;
int block_time_ms;
- enum FFLPCType lpc_type;
+ int /* enum FFLPCType */ lpc_type;
int lpc_passes;
int lpc_coeff_precision;
int min_prediction_order;
--
2.52.0
>From fa77beb6ffefc22302a2c3794f2874d8c9e244f3 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 30 Jan 2026 19:36:01 +0100
Subject: [PATCH 9/9] avformat/spdif: Make enum IEC61937DataType at least
16bits
Fixes the spdif-dca-master FATE-test when compiling with
-fshort-enums.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/spdif.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/libavformat/spdif.h b/libavformat/spdif.h
index 0039fcfe5c..0b6567fac8 100644
--- a/libavformat/spdif.h
+++ b/libavformat/spdif.h
@@ -50,6 +50,7 @@ enum IEC61937DataType {
IEC61937_MPEG2_AAC_LSF_4096 = 0x13 | 0x20, ///< MPEG-2 AAC ADTS quarter-rate low sampling frequency
IEC61937_EAC3 = 0x15, ///< E-AC-3 data
IEC61937_TRUEHD = 0x16, ///< TrueHD data
+ IEC61937_MAX_ENUM = 0xFFFF ///< to force the underlying type to be at least 16bits
};
static const uint16_t spdif_mpeg_pkt_offset[2][3] = {
--
2.52.0
_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-01-30 18:52 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-01-30 18:51 [FFmpeg-devel] [PR] Improve -fshort-enums compatibility (PR #21612) mkver via ffmpeg-devel
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