Message ID | 20191110194210.18010-1-andriy.gelman@gmail.com |
---|---|
State | Superseded |
Headers | show |
> Am 11.11.2019 um 04:42 schrieb Andriy Gelman <andriy.gelman@gmail.com>: > > + /* check configured pix_fmt matches avctx->pix_fmt */ Is this comment really useful? > + pix_fmt_output = ff_v4l2_format_v4l2_to_avfmt(v4l2_fmt_output, AV_CODEC_ID_RAWVIDEO); > + if (pix_fmt_output != avctx->pix_fmt) { > + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt_output); > + av_log(priv, AV_LOG_ERROR, "Pixel format not configured. Encoder requires %s " > + " pixel format. On command line add setting:" > + " -pix_fmt %s to force correct pixel format.\n", This should be rarely printed by a library, I don’t think this is a good exception. Thank you for looking into this issue, Carl Eugen
On Mon, 11. Nov 07:05, Carl Eugen Hoyos wrote: > > > > Am 11.11.2019 um 04:42 schrieb Andriy Gelman <andriy.gelman@gmail.com>: > > > > + /* check configured pix_fmt matches avctx->pix_fmt */ > > Is this comment really useful? ok, will remove > > > + pix_fmt_output = ff_v4l2_format_v4l2_to_avfmt(v4l2_fmt_output, AV_CODEC_ID_RAWVIDEO); > > + if (pix_fmt_output != avctx->pix_fmt) { > > + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt_output); > > + av_log(priv, AV_LOG_ERROR, "Pixel format not configured. Encoder requires %s " > > > > + " pixel format. On command line add setting:" > > + " -pix_fmt %s to force correct pixel format.\n", > > This should be rarely printed by a library, I don’t think this is a good exception. I thought it would be useful to tell the user how to solve the problem. I can modify the docs instead and add option -list_pix_fmt that tells the user what pixel formats are supported?
diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c index 474e6bef89..5c8d49bd2c 100644 --- a/libavcodec/v4l2_m2m_enc.c +++ b/libavcodec/v4l2_m2m_enc.c @@ -30,6 +30,7 @@ #include "libavutil/opt.h" #include "v4l2_context.h" #include "v4l2_m2m.h" +#include "v4l2_fmt.h" #define MPEG_CID(x) V4L2_CID_MPEG_VIDEO_##x #define MPEG_VIDEO(x) V4L2_MPEG_VIDEO_##x @@ -288,6 +289,8 @@ static av_cold int v4l2_encode_init(AVCodecContext *avctx) V4L2Context *capture, *output; V4L2m2mContext *s; V4L2m2mPriv *priv = avctx->priv_data; + enum AVPixelFormat pix_fmt_output; + uint32_t v4l2_fmt_output; int ret; ret = ff_v4l2_m2m_create_context(priv, &s); @@ -316,6 +319,22 @@ static av_cold int v4l2_encode_init(AVCodecContext *avctx) } s->avctx = avctx; + if (V4L2_TYPE_IS_MULTIPLANAR(output->type)) + v4l2_fmt_output = output->format.fmt.pix_mp.pixelformat; + else + v4l2_fmt_output = output->format.fmt.pix.pixelformat; + + /* check configured pix_fmt matches avctx->pix_fmt */ + pix_fmt_output = ff_v4l2_format_v4l2_to_avfmt(v4l2_fmt_output, AV_CODEC_ID_RAWVIDEO); + if (pix_fmt_output != avctx->pix_fmt) { + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt_output); + av_log(priv, AV_LOG_ERROR, "Pixel format not configured. Encoder requires %s " + " pixel format. On command line add setting:" + " -pix_fmt %s to force correct pixel format.\n", + av_fourcc2str(v4l2_fmt_output), desc->name); + return AVERROR(EINVAL); + } + return v4l2_prepare_encoder(s); }