Re: [FFmpeg-devel] [PATCH 1/7] lavc: factor out encoder init/validation from avcodec_open2()

2021-03-16 Thread Anton Khirnov
Quoting James Almer (2021-03-10 16:17:35)
> On 3/10/2021 9:03 AM, Anton Khirnov wrote:
> > avcodec_open2() is massive, splitting it makes it more readable.
> > 
> > Also, add a missing error code to ticks_per_frame sanity check.
> > ---
> >   libavcodec/encode.c | 157 +
> >   libavcodec/encode.h |   6 ++
> >   libavcodec/utils.c  | 166 +---
> >   3 files changed, 166 insertions(+), 163 deletions(-)
> > 
> > diff --git a/libavcodec/encode.c b/libavcodec/encode.c
> > index 282337e453..bbf03d62fc 100644
> > --- a/libavcodec/encode.c
> > +++ b/libavcodec/encode.c
> > @@ -462,3 +462,160 @@ int attribute_align_arg 
> > avcodec_encode_video2(AVCodecContext *avctx,
> >   return ret;
> >   }
> >   #endif
> > +
> > +int ff_encode_preinit(AVCodecContext *avctx)
> 
> nit: Would prefer if this and ff_decode_preinit() could stay in the same 
> file as avcodec_open2() as static functions. This includes moving 
> decode_bsfs_init() there, too.
> decode.c and encode.c seem to me that they should contain functions used 
> during decoding and encoding, and not initialization.

For the record: discussed this on IRC and James dropped his objection to
the move

> 
> That being said, not related to this set and not really a priority, but 
> avcodec_open2() is not a "utility" function as much as a core lavc 
> function. av_get_bits_per_sample() for example is a util, as are 
> av_get_audio_frame_duration() and avcodec_align_dimensions2(). So 
> perhaps it, avcodec_alloc_context3() and avcodec_free_context() should 
> be together (options.c is also not exactly the best name for the file 
> currently hosting the latter two, so maybe it could be renamed to 
> avcodec.c while at it).

I would certainly be in favor of that. utils.c is way too huge.

-- 
Anton Khirnov
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/7] lavc: factor out encoder init/validation from avcodec_open2()

2021-03-10 Thread James Almer

On 3/10/2021 9:03 AM, Anton Khirnov wrote:

avcodec_open2() is massive, splitting it makes it more readable.

Also, add a missing error code to ticks_per_frame sanity check.
---
  libavcodec/encode.c | 157 +
  libavcodec/encode.h |   6 ++
  libavcodec/utils.c  | 166 +---
  3 files changed, 166 insertions(+), 163 deletions(-)

diff --git a/libavcodec/encode.c b/libavcodec/encode.c
index 282337e453..bbf03d62fc 100644
--- a/libavcodec/encode.c
+++ b/libavcodec/encode.c
@@ -462,3 +462,160 @@ int attribute_align_arg 
avcodec_encode_video2(AVCodecContext *avctx,
  return ret;
  }
  #endif
+
+int ff_encode_preinit(AVCodecContext *avctx)


nit: Would prefer if this and ff_decode_preinit() could stay in the same 
file as avcodec_open2() as static functions. This includes moving 
decode_bsfs_init() there, too.
decode.c and encode.c seem to me that they should contain functions used 
during decoding and encoding, and not initialization.


That being said, not related to this set and not really a priority, but 
avcodec_open2() is not a "utility" function as much as a core lavc 
function. av_get_bits_per_sample() for example is a util, as are 
av_get_audio_frame_duration() and avcodec_align_dimensions2(). So 
perhaps it, avcodec_alloc_context3() and avcodec_free_context() should 
be together (options.c is also not exactly the best name for the file 
currently hosting the latter two, so maybe it could be renamed to 
avcodec.c while at it).

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 1/7] lavc: factor out encoder init/validation from avcodec_open2()

2021-03-10 Thread Anton Khirnov
avcodec_open2() is massive, splitting it makes it more readable.

Also, add a missing error code to ticks_per_frame sanity check.
---
 libavcodec/encode.c | 157 +
 libavcodec/encode.h |   6 ++
 libavcodec/utils.c  | 166 +---
 3 files changed, 166 insertions(+), 163 deletions(-)

diff --git a/libavcodec/encode.c b/libavcodec/encode.c
index 282337e453..bbf03d62fc 100644
--- a/libavcodec/encode.c
+++ b/libavcodec/encode.c
@@ -462,3 +462,160 @@ int attribute_align_arg 
avcodec_encode_video2(AVCodecContext *avctx,
 return ret;
 }
 #endif
+
+int ff_encode_preinit(AVCodecContext *avctx)
+{
+int i;
+#if FF_API_CODED_FRAME
+FF_DISABLE_DEPRECATION_WARNINGS
+avctx->coded_frame = av_frame_alloc();
+if (!avctx->coded_frame) {
+return AVERROR(ENOMEM);
+}
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+
+if (avctx->time_base.num <= 0 || avctx->time_base.den <= 0) {
+av_log(avctx, AV_LOG_ERROR, "The encoder timebase is not set.\n");
+return AVERROR(EINVAL);
+}
+
+if (avctx->codec->sample_fmts) {
+for (i = 0; avctx->codec->sample_fmts[i] != AV_SAMPLE_FMT_NONE; 
i++) {
+if (avctx->sample_fmt == avctx->codec->sample_fmts[i])
+break;
+if (avctx->channels == 1 &&
+av_get_planar_sample_fmt(avctx->sample_fmt) ==
+av_get_planar_sample_fmt(avctx->codec->sample_fmts[i])) {
+avctx->sample_fmt = avctx->codec->sample_fmts[i];
+break;
+}
+}
+if (avctx->codec->sample_fmts[i] == AV_SAMPLE_FMT_NONE) {
+char buf[128];
+snprintf(buf, sizeof(buf), "%d", avctx->sample_fmt);
+av_log(avctx, AV_LOG_ERROR, "Specified sample format %s is 
invalid or not supported\n",
+   (char 
*)av_x_if_null(av_get_sample_fmt_name(avctx->sample_fmt), buf));
+return AVERROR(EINVAL);
+}
+}
+if (avctx->codec->pix_fmts) {
+for (i = 0; avctx->codec->pix_fmts[i] != AV_PIX_FMT_NONE; i++)
+if (avctx->pix_fmt == avctx->codec->pix_fmts[i])
+break;
+if (avctx->codec->pix_fmts[i] == AV_PIX_FMT_NONE
+&& !((avctx->codec_id == AV_CODEC_ID_MJPEG || avctx->codec_id 
== AV_CODEC_ID_LJPEG)
+ && avctx->strict_std_compliance <= 
FF_COMPLIANCE_UNOFFICIAL)) {
+char buf[128];
+snprintf(buf, sizeof(buf), "%d", avctx->pix_fmt);
+av_log(avctx, AV_LOG_ERROR, "Specified pixel format %s is 
invalid or not supported\n",
+   (char 
*)av_x_if_null(av_get_pix_fmt_name(avctx->pix_fmt), buf));
+return AVERROR(EINVAL);
+}
+if (avctx->codec->pix_fmts[i] == AV_PIX_FMT_YUVJ420P ||
+avctx->codec->pix_fmts[i] == AV_PIX_FMT_YUVJ411P ||
+avctx->codec->pix_fmts[i] == AV_PIX_FMT_YUVJ422P ||
+avctx->codec->pix_fmts[i] == AV_PIX_FMT_YUVJ440P ||
+avctx->codec->pix_fmts[i] == AV_PIX_FMT_YUVJ444P)
+avctx->color_range = AVCOL_RANGE_JPEG;
+}
+if (avctx->codec->supported_samplerates) {
+for (i = 0; avctx->codec->supported_samplerates[i] != 0; i++)
+if (avctx->sample_rate == 
avctx->codec->supported_samplerates[i])
+break;
+if (avctx->codec->supported_samplerates[i] == 0) {
+av_log(avctx, AV_LOG_ERROR, "Specified sample rate %d is not 
supported\n",
+   avctx->sample_rate);
+return AVERROR(EINVAL);
+}
+}
+if (avctx->sample_rate < 0) {
+av_log(avctx, AV_LOG_ERROR, "Specified sample rate %d is not 
supported\n",
+avctx->sample_rate);
+return AVERROR(EINVAL);
+}
+if (avctx->codec->channel_layouts) {
+if (!avctx->channel_layout) {
+av_log(avctx, AV_LOG_WARNING, "Channel layout not 
specified\n");
+} else {
+for (i = 0; avctx->codec->channel_layouts[i] != 0; i++)
+if (avctx->channel_layout == 
avctx->codec->channel_layouts[i])
+break;
+if (avctx->codec->channel_layouts[i] == 0) {
+char buf[512];
+av_get_channel_layout_string(buf, sizeof(buf), -1, 
avctx->channel_layout);
+av_log(avctx, AV_LOG_ERROR, "Specified channel layout '%s' 
is not supported\n", buf);
+return AVERROR(EINVAL);
+}
+}
+}
+if (avctx->channel_layout && avctx->channels) {
+int channels = 
av_get_channel_layout_nb_channels(avctx->channel_layout);
+if