RFC: Improve VIDIOC_S_HW_FREQ_SEEK

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all!

While working on a test function for the hardware seek functionality in
v4l2-compliance I realized that the specification is rather vague and
incomplete, making it hard to write a decent test for it.

There are a number of issues with this API:

1) There is no way for the application to know whether the hardware supports
   wrap around scanning or not (or both). It is only reported because the
   ioctl will return EINVAL if it doesn't support it, which is rather awkward.
   It's important for applications to know what to do here.

   The solution would be to add two new capability flags to struct v4l2_tuner:
   V4L2_TUNER_CAP_SEEK_BOUNDED and V4L2_TUNER_CAP_SEEK_WRAP.

2) What happens when the seek didn't find anything? It's not a timeout, it has
   to return some decent error code. I propose ENODATA for this.

3) What should the frequency be if the seek returns an error? I think the original
   frequency should be restored in that case.

4) What should happen if you try to set the frequency while a seek is in operation?
   In that case -EBUSY should be returned by VIDIOC_S_FREQUENCY.

5) What should happen if you try to get the frequency while a seek is in operation?
   It would be nice if you could get the frequency that is currently being scanned.

   There are two options to implement this:

   a) Add a new 'scan_frequency' field to struct v4l2_frequency. So the frequency
      field would always contain the frequency that was set when the seek started,
      and the scan_frequency is either 0 (no seek is in progress), a special value
      V4L2_SCAN_IN_PROGRESS (seek is in progress, but the hardware can't tell what
      the current seek frequency is) or it contains the frequency that is currently
      being scanned.

   b) Add a new V4L2_TUNER_CAP_HAS_SEEK_FREQ capability to struct v4l2_tuner. If
      set, then VIDIOC_G_FREQUENCY will return the scan frequency when scanning,
      otherwise it will return the normal frequency.

   I think I like option a) better. It gives you all the information you need.

6) What does it mean when you get a time out? The spec just says 'Try again'. But
   try what? If it times out due to hardware issues, then a proper error should be
   returned. That leaves a time out due to the scan not finding any channels, but not
   reaching the end of the scan either (because that would be a ENODATA return code).

   What should be the frequency in this case? The original frequency or the last
   scanned frequency? And on older hardware you may not be able to get that last scanned
   frequency.

   I suggest one of two options:

   a) Abolish the time out altogether. The driver author has to set the internal
      timeout to such a large value that if you time out, then you can just return
      -ENODATA.

   b) Hardware that cannot detect the current scan frequency behaves as a). Hardware
      that can detect the scan frequency will return -EAGAIN, but sets the frequency
      at the last scanned frequency.

7) It would be nice if the ioctl was RW instead of just a write ioctl. That way the
   driver could report the proper spacing value that it used. I'm not entirely sure
   it is worth the effort at this moment though.

Comments? Questions?

Regards,

	Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux