[PATCH v3 2/5] stream_pvr: validate extended v4l2 controls before setting them

Reza Arbab <[email protected]>
Newsgroups gmane.comp.video.mplayer.devel
Message-ID <[email protected]>
An hdpvr device does not support the extended v4l2 controls

	V4L2_CID_MPEG_VIDEO_ASPECT
	V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ
	V4L2_CID_MPEG_AUDIO_L1_BITRATE
	V4L2_CID_MPEG_AUDIO_L2_BITRATE
	V4L2_CID_MPEG_AUDIO_L3_BITRATE
	V4L2_CID_MPEG_AUDIO_MODE

Also, it supports only a subset of the menu options for

	V4L2_CID_MPEG_AUDIO_ENCODING
	V4L2_CID_MPEG_STREAM_TYPE

This results in the mplayer error

	[encoder] Error setting MPEG controls (Invalid argument).

Change add_v4l2_ext_control to do basic validation of a control/value pair
before adding it.

Signed-off-by: Reza Arbab <[email protected]>
---
 v2:
  * Move qmenu declaration into the block that uses it.
  * Use designated struct initializers for qctrl and qmenu.
  * Change MSGL_DBG2 to MSGL_V.

 stream/stream_pvr.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/stream/stream_pvr.c b/stream/stream_pvr.c
index db02cfd..ecce2c5 100644
--- a/stream/stream_pvr.c
+++ b/stream/stream_pvr.c
@@ -1021,6 +1021,31 @@ static void
 add_v4l2_ext_control (struct v4l2_ext_controls *ctrls, struct pvr_t *pvr,
                       uint32_t id, int32_t value)
 {
+  struct v4l2_query_ext_ctrl qctrl = { .id = id };
+
+  /* add only if the device supports this control */
+  if (ioctl (pvr->dev_fd, VIDIOC_QUERY_EXT_CTRL, &qctrl) < 0)
+  {
+    mp_msg (MSGT_OPEN, MSGL_V,
+            "%s can't set control %d (unsupported)\n",
+            LOG_LEVEL_ENCODER, qctrl.id);
+    return;
+  }
+
+  if (qctrl.type == V4L2_CTRL_TYPE_MENU)
+  {
+    struct v4l2_querymenu qmenu = { .id = id, .index = value };
+
+    /* add only if the value is a valid menu choice */
+    if (ioctl (pvr->dev_fd, VIDIOC_QUERYMENU, &qmenu) < 0)
+    {
+      mp_msg (MSGT_OPEN, MSGL_ERR,
+              "%s can't set %s to %d (invalid menu choice)\n",
+              LOG_LEVEL_ENCODER, qctrl.name, value);
+      return;
+    }
+  }
+
   ctrls->controls[ctrls->count].id = id;
   ctrls->controls[ctrls->count].value = value;
   ctrls->count++;
-- 
2.5.0

_______________________________________________
MPlayer-dev-eng mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.