From: Niklas Haas <ffmpeg@haasn.xyz>
To: ffmpeg-devel@ffmpeg.org
Cc: Niklas Haas <git@haasn.dev>
Subject: [FFmpeg-devel] [PATCH 06/11] fftools/ffmpeg_filter: simplify choose_pix_fmts
Date: Fri, 12 Jan 2024 09:26:03 +0100
Message-ID: <20240112082950.41637-7-ffmpeg@haasn.xyz> (raw)
In-Reply-To: <20240112082950.41637-1-ffmpeg@haasn.xyz>
From: Niklas Haas <git@haasn.dev>
The only meaningful difference between choose_pix_fmts and the default
code was the inclusion of an extra branch for `keep_pix_fmt` being true.
However, in this case, we either:
1. Force the specific `ofp->format` that we inherited from
ofilter_bind_ost, or if no format was set:
2. Print an empty format list
Both of these goals can be accomplished by simply moving the decision
logic to ofilter_bind_ost, to avoid setting any format list when
keep_pix_fmt is enabled. This is arguably cleaner as it moves format
selection logic to a single function. In the case of branch 1, nothing
else needs to be done as we already force the format provided in
ofp->format, if any is set. Add an assertion to verify this assumption
just in case.
(Side note: The "choose_*" family of functions are arguably misnomers,
as they should really be called "print_*" - their current behavior is to
print the relevant format lists to the `vf/af_format` filter arguments)
---
fftools/ffmpeg_filter.c | 49 ++++++++---------------------------------
1 file changed, 9 insertions(+), 40 deletions(-)
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 82ee4fae7d..39f5cde514 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -361,36 +361,6 @@ static void sub2video_update(InputFilterPriv *ifp, int64_t heartbeat_pts,
ifp->sub2video.initialize = 0;
}
-/* *dst may return be set to NULL (no pixel format found), a static string or a
- * string backed by the bprint. Nothing has been written to the AVBPrint in case
- * NULL is returned. The AVBPrint provided should be clean. */
-static int choose_pix_fmts(OutputFilter *ofilter, AVBPrint *bprint,
- const char **dst)
-{
- OutputFilterPriv *ofp = ofp_from_ofilter(ofilter);
- OutputStream *ost = ofilter->ost;
-
- *dst = NULL;
-
- if (ost->keep_pix_fmt || ofp->format != AV_PIX_FMT_NONE) {
- *dst = ofp->format == AV_PIX_FMT_NONE ? NULL :
- av_get_pix_fmt_name(ofp->format);
- } else if (ofp->formats) {
- const enum AVPixelFormat *p = ofp->formats;
-
- for (; *p != AV_PIX_FMT_NONE; p++) {
- const char *name = av_get_pix_fmt_name(*p);
- av_bprintf(bprint, "%s%c", name, p[1] == AV_PIX_FMT_NONE ? '\0' : '|');
- }
- if (!av_bprint_is_complete(bprint))
- return AVERROR(ENOMEM);
-
- *dst = bprint->str;
- }
-
- return 0;
-}
-
/* Define a function for appending a list of allowed formats
* to an AVBPrint. If nonempty, the list will have a header. */
#define DEF_CHOOSE_FORMAT(name, type, var, supported_list, none, printf_format, get_name) \
@@ -413,8 +383,8 @@ static void choose_ ## name (OutputFilterPriv *ofp, AVBPrint *bprint) \
av_bprint_chars(bprint, ':', 1); \
}
-//DEF_CHOOSE_FORMAT(pix_fmts, enum AVPixelFormat, format, formats, AV_PIX_FMT_NONE,
-// GET_PIX_FMT_NAME)
+DEF_CHOOSE_FORMAT(pix_fmts, enum AVPixelFormat, format, formats,
+ AV_PIX_FMT_NONE, "%s", av_get_pix_fmt_name)
DEF_CHOOSE_FORMAT(sample_fmts, enum AVSampleFormat, format, formats,
AV_SAMPLE_FMT_NONE, "%s", av_get_sample_fmt_name)
@@ -748,7 +718,7 @@ int ofilter_bind_ost(OutputFilter *ofilter, OutputStream *ost,
ofp->height = ost->enc_ctx->height;
if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
ofp->format = ost->enc_ctx->pix_fmt;
- } else {
+ } else if (!ost->keep_pix_fmt) {
ofp->formats = c->pix_fmts;
// MJPEG encoder exports a full list of supported pixel formats,
@@ -1233,7 +1203,6 @@ static int configure_output_video_filter(FilterGraph *fg, AVFilterGraph *graph,
AVBPrint bprint;
int pad_idx = out->pad_idx;
int ret;
- const char *pix_fmts;
char name[255];
snprintf(name, sizeof(name), "out_%d_%d", ost->file->index, ost->index);
@@ -1268,17 +1237,17 @@ static int configure_output_video_filter(FilterGraph *fg, AVFilterGraph *graph,
pad_idx = 0;
}
+ av_assert0(!ost->keep_pix_fmt || (!ofp->format && !ofp->formats));
av_bprint_init(&bprint, 0, AV_BPRINT_SIZE_UNLIMITED);
- ret = choose_pix_fmts(ofilter, &bprint, &pix_fmts);
- if (ret < 0)
- return ret;
-
- if (pix_fmts) {
+ choose_pix_fmts(ofp, &bprint);
+ if (!av_bprint_is_complete(&bprint))
+ return AVERROR(ENOMEM);
+ if (bprint.len) {
AVFilterContext *filter;
ret = avfilter_graph_create_filter(&filter,
avfilter_get_by_name("format"),
- "format", pix_fmts, NULL, graph);
+ "format", bprint.str, NULL, graph);
av_bprint_finalize(&bprint, NULL);
if (ret < 0)
return ret;
--
2.43.0
_______________________________________________
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".
next prev parent reply other threads:[~2024-01-12 8:31 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-12 8:25 [FFmpeg-devel] [PATCH 00/11] YUVJ removal Niklas Haas
2024-01-12 8:25 ` [FFmpeg-devel] [PATCH 01/11] avfilter/buffersrc: promote unspecified color metadata Niklas Haas
2024-01-12 8:25 ` [FFmpeg-devel] [PATCH 02/11] avfilter/buffersrc: allow promoting color range to MPEG Niklas Haas
2024-01-12 8:26 ` [FFmpeg-devel] [PATCH 03/11] avfilter/vf_tiltandshift: check outlink->color_range Niklas Haas
2024-01-12 8:26 ` [FFmpeg-devel] [PATCH 04/11] avcodec: add YUV color space metadata to AVCodec Niklas Haas
2024-01-12 8:26 ` [FFmpeg-devel] [PATCH 05/11] avcodec: set color_ranges for all video encoders Niklas Haas
2024-01-12 8:26 ` Niklas Haas [this message]
2024-01-12 21:10 ` [FFmpeg-devel] [PATCH 06/11] fftools/ffmpeg_filter: simplify choose_pix_fmts Michael Niedermayer
2024-02-05 17:14 ` Niklas Haas
2024-01-12 8:26 ` [FFmpeg-devel] [PATCH 07/11] fftools/ffmpeg_filter: propagate codec yuv metadata to filters Niklas Haas
2024-01-12 8:26 ` [FFmpeg-devel] [PATCH 08/11] tests/fate: force MPEG range for rawvideo tests Niklas Haas
2024-01-12 8:26 ` [FFmpeg-devel] [PATCH 09/11] lavfi/lavu/lavc: remove YUVJ pixel formats Niklas Haas
2024-01-12 8:26 ` [FFmpeg-devel] [PATCH 10/11] avutil/pixdesc: remove old yuvj pixel format check Niklas Haas
2024-01-12 8:26 ` [FFmpeg-devel] [PATCH 11/11] avcodec/encode: enforce AVCodec capabilities at encode time Niklas Haas
2024-01-12 20:59 ` [FFmpeg-devel] [PATCH 00/11] YUVJ removal Michael Niedermayer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240112082950.41637-7-ffmpeg@haasn.xyz \
--to=ffmpeg@haasn.xyz \
--cc=ffmpeg-devel@ffmpeg.org \
--cc=git@haasn.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
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