]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/v4l2_m2m: fix av_pix_fmt changing when multiple /dev/video* devices are probed
authorAman Gupta <aman@tmm1.net>
Wed, 28 Aug 2019 00:21:36 +0000 (17:21 -0700)
committerAman Gupta <aman@tmm1.net>
Wed, 11 Sep 2019 01:52:37 +0000 (18:52 -0700)
On the RPI, three different /dev/video devices exist (decoder, scaler, encoder).

When probing the devices in order, the originally requested pix fmt
would be mutated causing the wrong one to be chosen when a matching
device was finally found.

Signed-off-by: Aman Gupta <aman@tmm1.net>
libavcodec/v4l2_context.c
libavcodec/v4l2_context.h
libavcodec/v4l2_m2m.c

index 6924760840f7238b757e2a681fd1430aa339aa80..3f8a51033143623728c2d90ef549a350940a7e6e 100644 (file)
@@ -621,7 +621,7 @@ int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt)
     return ff_v4l2_buffer_buf_to_avpkt(pkt, avbuf);
 }
 
-int ff_v4l2_context_get_format(V4L2Context* ctx)
+int ff_v4l2_context_get_format(V4L2Context* ctx, int probe)
 {
     struct v4l2_format_update fmt = { 0 };
     int ret;
@@ -631,7 +631,7 @@ int ff_v4l2_context_get_format(V4L2Context* ctx)
         if (ret)
             return ret;
 
-        fmt.update_avfmt = 1;
+        fmt.update_avfmt = !probe;
         v4l2_save_to_context(ctx, &fmt);
 
         /* format has been tried already */
index 632f1d0aac0191dd50824835b65df032fbcd368f..ee08f3de415644efa14c20babcfd13df0d204cb3 100644 (file)
@@ -113,9 +113,10 @@ int ff_v4l2_context_set_format(V4L2Context* ctx);
  * Queries the driver for a valid v4l2 format and copies it to the context.
  *
  * @param[in] ctx A pointer to a V4L2Context. See V4L2Context description for required variables.
+ * @param[in] probe Probe only and ignore changes to the format.
  * @return 0 in case of success, a negative value representing the error otherwise.
  */
-int ff_v4l2_context_get_format(V4L2Context* ctx);
+int ff_v4l2_context_get_format(V4L2Context* ctx, int probe);
 
 /**
  * Releases a V4L2Context.
index 0cf5db284abe1b109b4004362541c0466fbcc899..827662b9a53745133c6eb984c39634a5d4c0a0b5 100644 (file)
@@ -108,13 +108,13 @@ static int v4l2_probe_driver(V4L2m2mContext* s)
     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;
@@ -222,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;
@@ -273,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;