X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fv4l2_m2m.c;h=827662b9a53745133c6eb984c39634a5d4c0a0b5;hb=7bb6898b16f3c5b1cd5c4c15ca96278df569ccd2;hp=427e165f586f940f14fdef16dc411364580cc1b8;hpb=762c2b5dcd99a08452299cd1f83070f88115f1f3;p=ffmpeg diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c index 427e165f586..827662b9a53 100644 --- a/libavcodec/v4l2_m2m.c +++ b/libavcodec/v4l2_m2m.c @@ -60,14 +60,14 @@ static inline int v4l2_mplane_video(struct v4l2_capability *cap) return 0; } -static int v4l2_prepare_contexts(V4L2m2mContext* s) +static int v4l2_prepare_contexts(V4L2m2mContext* s, int probe) { struct v4l2_capability cap; int ret; s->capture.done = s->output.done = 0; s->capture.name = "capture"; - s->output.name = "output "; + s->output.name = "output"; atomic_init(&s->refcount, 0); sem_init(&s->refsync, 0, 0); @@ -76,7 +76,10 @@ static int v4l2_prepare_contexts(V4L2m2mContext* s) if (ret < 0) return ret; - av_log(s->avctx, AV_LOG_INFO, "driver '%s' on card '%s'\n", cap.driver, cap.card); + av_log(s->avctx, probe ? AV_LOG_DEBUG : AV_LOG_INFO, + "driver '%s' on card '%s' in %s mode\n", cap.driver, cap.card, + v4l2_mplane_video(&cap) ? "mplane" : + v4l2_splane_video(&cap) ? "splane" : "unknown"); if (v4l2_mplane_video(&cap)) { s->capture.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; @@ -101,17 +104,17 @@ static int v4l2_probe_driver(V4L2m2mContext* s) if (s->fd < 0) return AVERROR(errno); - ret = v4l2_prepare_contexts(s); + ret = v4l2_prepare_contexts(s, 1); if (ret < 0) goto done; - ret = ff_v4l2_context_get_format(&s->output); + ret = ff_v4l2_context_get_format(&s->output, 1); if (ret) { av_log(s->avctx, AV_LOG_DEBUG, "v4l2 output format not supported\n"); goto done; } - ret = ff_v4l2_context_get_format(&s->capture); + ret = ff_v4l2_context_get_format(&s->capture, 1); if (ret) { av_log(s->avctx, AV_LOG_DEBUG, "v4l2 capture format not supported\n"); goto done; @@ -132,15 +135,26 @@ static int v4l2_configure_contexts(V4L2m2mContext* s) { void *log_ctx = s->avctx; int ret; + struct v4l2_format ofmt, cfmt; s->fd = open(s->devname, O_RDWR | O_NONBLOCK, 0); if (s->fd < 0) return AVERROR(errno); - ret = v4l2_prepare_contexts(s); + ret = v4l2_prepare_contexts(s, 0); if (ret < 0) goto error; + ofmt = s->output.format; + cfmt = s->capture.format; + av_log(log_ctx, AV_LOG_INFO, "requesting formats: output=%s capture=%s\n", + av_fourcc2str(V4L2_TYPE_IS_MULTIPLANAR(ofmt.type) ? + ofmt.fmt.pix_mp.pixelformat : + ofmt.fmt.pix.pixelformat), + av_fourcc2str(V4L2_TYPE_IS_MULTIPLANAR(cfmt.type) ? + cfmt.fmt.pix_mp.pixelformat : + cfmt.fmt.pix.pixelformat)); + ret = ff_v4l2_context_set_format(&s->output); if (ret) { av_log(log_ctx, AV_LOG_ERROR, "can't set v4l2 output format\n"); @@ -208,7 +222,7 @@ int ff_v4l2_m2m_codec_reinit(V4L2m2mContext* s) ff_v4l2_context_release(&s->capture); /* 3. get the new capture format */ - ret = ff_v4l2_context_get_format(&s->capture); + ret = ff_v4l2_context_get_format(&s->capture, 0); if (ret) { av_log(s->avctx, AV_LOG_ERROR, "query the new capture format\n"); return ret; @@ -241,13 +255,13 @@ int ff_v4l2_m2m_codec_full_reinit(V4L2m2mContext *s) ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMOFF); if (ret) { - av_log(s->avctx, AV_LOG_ERROR, "output VIDIOC_STREAMOFF\n"); + av_log(log_ctx, AV_LOG_ERROR, "output VIDIOC_STREAMOFF\n"); goto error; } ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF); if (ret) { - av_log(s->avctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF\n"); + av_log(log_ctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF\n"); goto error; } @@ -259,13 +273,13 @@ int ff_v4l2_m2m_codec_full_reinit(V4L2m2mContext *s) s->draining = 0; s->reinit = 0; - ret = ff_v4l2_context_get_format(&s->output); + ret = ff_v4l2_context_get_format(&s->output, 0); if (ret) { av_log(log_ctx, AV_LOG_DEBUG, "v4l2 output format not supported\n"); goto error; } - ret = ff_v4l2_context_get_format(&s->capture); + ret = ff_v4l2_context_get_format(&s->capture, 0); if (ret) { av_log(log_ctx, AV_LOG_DEBUG, "v4l2 capture format not supported\n"); goto error; @@ -324,7 +338,7 @@ int ff_v4l2_m2m_codec_end(AVCodecContext *avctx) ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMOFF); if (ret) - av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->output.name); + av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->output.name); ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF); if (ret) @@ -401,6 +415,7 @@ int ff_v4l2_m2m_create_context(AVCodecContext *avctx, V4L2m2mContext **s) priv->context->capture.num_buffers = priv->num_capture_buffers; priv->context->output.num_buffers = priv->num_output_buffers; priv->context->self_ref = priv->context_ref; + priv->context->fd = -1; return 0; }