[FFmpeg-cvslog] fftools/ffmpeg_mux_init: move OutputFilter setup code to ffmpeg_filter
Anton Khirnov
git at videolan.org
Wed May 31 17:25:57 EEST 2023
ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Sun May 21 22:46:59 2023 +0200| [7520cd9f07293259759783ba003d3aa1a87b17c2] | committer: Anton Khirnov
fftools/ffmpeg_mux_init: move OutputFilter setup code to ffmpeg_filter
That is a more appropriate place for it.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7520cd9f07293259759783ba003d3aa1a87b17c2
---
fftools/ffmpeg_filter.c | 70 ++++++++++++++++++++++++++++++++++++++++++
fftools/ffmpeg_mux_init.c | 77 -----------------------------------------------
2 files changed, 70 insertions(+), 77 deletions(-)
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 5f77f1e00f..3f6b906468 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -464,10 +464,80 @@ static int ifilter_bind_ist(InputFilter *ifilter, InputStream *ist)
return 0;
}
+static void set_channel_layout(OutputFilter *f, OutputStream *ost)
+{
+ const AVCodec *c = ost->enc_ctx->codec;
+ int i, err;
+
+ if (ost->enc_ctx->ch_layout.order != AV_CHANNEL_ORDER_UNSPEC) {
+ /* Pass the layout through for all orders but UNSPEC */
+ err = av_channel_layout_copy(&f->ch_layout, &ost->enc_ctx->ch_layout);
+ if (err < 0)
+ report_and_exit(AVERROR(ENOMEM));
+ return;
+ }
+
+ /* Requested layout is of order UNSPEC */
+ if (!c->ch_layouts) {
+ /* Use the default native layout for the requested amount of channels when the
+ encoder doesn't have a list of supported layouts */
+ av_channel_layout_default(&f->ch_layout, ost->enc_ctx->ch_layout.nb_channels);
+ return;
+ }
+ /* Encoder has a list of supported layouts. Pick the first layout in it with the
+ same amount of channels as the requested layout */
+ for (i = 0; c->ch_layouts[i].nb_channels; i++) {
+ if (c->ch_layouts[i].nb_channels == ost->enc_ctx->ch_layout.nb_channels)
+ break;
+ }
+ if (c->ch_layouts[i].nb_channels) {
+ /* Use it if one is found */
+ err = av_channel_layout_copy(&f->ch_layout, &c->ch_layouts[i]);
+ if (err < 0)
+ report_and_exit(AVERROR(ENOMEM));
+ return;
+ }
+ /* If no layout for the amount of channels requested was found, use the default
+ native layout for it. */
+ av_channel_layout_default(&f->ch_layout, ost->enc_ctx->ch_layout.nb_channels);
+}
+
void ofilter_bind_ost(OutputFilter *ofilter, OutputStream *ost)
{
+ const AVCodec *c = ost->enc_ctx->codec;
+
ofilter->ost = ost;
av_freep(&ofilter->linklabel);
+
+ switch (ost->enc_ctx->codec_type) {
+ case AVMEDIA_TYPE_VIDEO:
+ ofilter->frame_rate = ost->frame_rate;
+ ofilter->width = ost->enc_ctx->width;
+ ofilter->height = ost->enc_ctx->height;
+ if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
+ ofilter->format = ost->enc_ctx->pix_fmt;
+ } else {
+ ofilter->formats = c->pix_fmts;
+ }
+ break;
+ case AVMEDIA_TYPE_AUDIO:
+ if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
+ ofilter->format = ost->enc_ctx->sample_fmt;
+ } else {
+ ofilter->formats = c->sample_fmts;
+ }
+ if (ost->enc_ctx->sample_rate) {
+ ofilter->sample_rate = ost->enc_ctx->sample_rate;
+ } else {
+ ofilter->sample_rates = c->supported_samplerates;
+ }
+ if (ost->enc_ctx->ch_layout.nb_channels) {
+ set_channel_layout(ofilter, ost);
+ } else if (c->ch_layouts) {
+ ofilter->ch_layouts = c->ch_layouts;
+ }
+ break;
+ }
}
static InputFilter *ifilter_alloc(FilterGraph *fg)
diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
index 99708b9621..4fc6f0fb46 100644
--- a/fftools/ffmpeg_mux_init.c
+++ b/fftools/ffmpeg_mux_init.c
@@ -1886,44 +1886,6 @@ static void of_add_metadata(OutputFile *of, AVFormatContext *oc,
}
}
-static void set_channel_layout(OutputFilter *f, OutputStream *ost)
-{
- const AVCodec *c = ost->enc_ctx->codec;
- int i, err;
-
- if (ost->enc_ctx->ch_layout.order != AV_CHANNEL_ORDER_UNSPEC) {
- /* Pass the layout through for all orders but UNSPEC */
- err = av_channel_layout_copy(&f->ch_layout, &ost->enc_ctx->ch_layout);
- if (err < 0)
- report_and_exit(AVERROR(ENOMEM));
- return;
- }
-
- /* Requested layout is of order UNSPEC */
- if (!c->ch_layouts) {
- /* Use the default native layout for the requested amount of channels when the
- encoder doesn't have a list of supported layouts */
- av_channel_layout_default(&f->ch_layout, ost->enc_ctx->ch_layout.nb_channels);
- return;
- }
- /* Encoder has a list of supported layouts. Pick the first layout in it with the
- same amount of channels as the requested layout */
- for (i = 0; c->ch_layouts[i].nb_channels; i++) {
- if (c->ch_layouts[i].nb_channels == ost->enc_ctx->ch_layout.nb_channels)
- break;
- }
- if (c->ch_layouts[i].nb_channels) {
- /* Use it if one is found */
- err = av_channel_layout_copy(&f->ch_layout, &c->ch_layouts[i]);
- if (err < 0)
- report_and_exit(AVERROR(ENOMEM));
- return;
- }
- /* If no layout for the amount of channels requested was found, use the default
- native layout for it. */
- av_channel_layout_default(&f->ch_layout, ost->enc_ctx->ch_layout.nb_channels);
-}
-
static int copy_chapters(InputFile *ifile, OutputFile *ofile, AVFormatContext *os,
int copy_metadata)
{
@@ -2458,45 +2420,6 @@ int of_open(const OptionsContext *o, const char *filename)
/* check if all codec options have been used */
validate_enc_avopt(mux, o->g->codec_opts);
- for (int i = 0; i < of->nb_streams; i++) {
- OutputStream *ost = of->streams[i];
-
- /* set the filter output constraints */
- if (ost->filter) {
- const AVCodec *c = ost->enc_ctx->codec;
- OutputFilter *f = ost->filter;
- switch (ost->enc_ctx->codec_type) {
- case AVMEDIA_TYPE_VIDEO:
- f->frame_rate = ost->frame_rate;
- f->width = ost->enc_ctx->width;
- f->height = ost->enc_ctx->height;
- if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
- f->format = ost->enc_ctx->pix_fmt;
- } else {
- f->formats = c->pix_fmts;
- }
- break;
- case AVMEDIA_TYPE_AUDIO:
- if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
- f->format = ost->enc_ctx->sample_fmt;
- } else {
- f->formats = c->sample_fmts;
- }
- if (ost->enc_ctx->sample_rate) {
- f->sample_rate = ost->enc_ctx->sample_rate;
- } else {
- f->sample_rates = c->supported_samplerates;
- }
- if (ost->enc_ctx->ch_layout.nb_channels) {
- set_channel_layout(f, ost);
- } else if (c->ch_layouts) {
- f->ch_layouts = c->ch_layouts;
- }
- break;
- }
- }
- }
-
/* check filename in case of an image number is expected */
if (oc->oformat->flags & AVFMT_NEEDNUMBER && !av_filename_number_test(oc->url)) {
av_log(mux, AV_LOG_FATAL,
More information about the ffmpeg-cvslog
mailing list