Selections targets at V4L2 video mem-to-mem interface
Hi All,
I'd like to clarify the meaning of selection targets on a mem-to-mem video device, in order to document it and to make sure new m2m drivers get it right, and also that the existing ones, using originally the crop ioctls, are converted to the selection ioctls properly.
Until the selections API was introduced we used the CROP ioctls to configure cropping on OUTPUT buffer queue and composition onto CAPTURE buffer. Looking at Figure 1.2, [1] it seems obvious that there should be applied following mapping of the CROP to SELECTION ioctls:
S_CROP(V4L2_BUF_TYPE_VIDEO_OUTPUT) -> S_SELECTION(V4L2_BUF_TYPE_VIDEO_OUTPUT,
V4L2_SEL_TGT_CROP)
S_CROP(V4L2_BUF_TYPE_VIDEO_CAPTURE) -> S_SELECTION(V4L2_BUF_TYPE_VIDEO_CAPTURE,
V4L2_SEL_TGT_COMPOSE)
And that's how selections are currently documented at video output and capture interfaces:
--------------------------------------------------------------------------------
*Configuration of video output*
For output devices targets and ioctls are used similarly to the video capture case. The composing rectangle refers to the insertion of an image into a video signal. The cropping rectangles refer to a memory buffer."
*Configuration of video capture*
... The top left corner, width and height of the source rectangle, that is the area actually sampled, is given by the V4L2_SEL_TGT_CROP target.
...
The composing targets refer to a memory buffer.
--------------------------------------------------------------------------------
If we apply this mapping, then current VIDIOC_S/G_CROP -> VIDIOC_S/G_SELECTION ioctl fallback code wouldn't be valid, as we have there, e.g.
static int v4l_s_crop(const struct v4l2_ioctl_ops *ops,
struct file *file, void *fh, void *arg)
{
struct v4l2_crop *p = arg;
struct v4l2_selection s = {
.type = p->type,
.r = p->c,
};
if (ops->vidioc_s_crop)
return ops->vidioc_s_crop(file, fh, p);
/* simulate capture crop using selection api */
/* crop means compose for output devices */
if (V4L2_TYPE_IS_OUTPUT(p->type))
s.target = V4L2_SEL_TGT_COMPOSE_ACTIVE;
else
s.target = V4L2_SEL_TGT_CROP_ACTIVE;
return ops->vidioc_s_selection(file, fh, &s);
}i.e. it does exactly opposite to what we would expect for M2M.
One possible solution would be to get hold of struct video_device and do proper targets conversion after checking the vfl_dir field.
Does anyone have suggestions on this ?
BTW, we still have some V4L2_SEL_TGT*_ACTIVE symbols left, I'll write a patch to clean this up.
[1] http://hverkuil.home.xs4all.nl/spec/media.html#idp9025504
[2] http://hverkuil.home.xs4all.nl/spec/media.html#idp9031840
--
Thanks,
Sylwester
Hi Sylwester,
Quoted 67 lines · Sylwester Nawrocki
Hi All,
I'd like to clarify the meaning of selection targets on a mem-to-mem video device, in order to document it and to make sure new m2m drivers get it right, and also that the existing ones, using originally the crop ioctls, are converted to the selection ioctls properly.
Until the selections API was introduced we used the CROP ioctls to configure cropping on OUTPUT buffer queue and composition onto CAPTURE buffer. Looking at Figure 1.2, [1] it seems obvious that there should be applied following mapping of the CROP to SELECTION ioctls:
S_CROP(V4L2_BUF_TYPE_VIDEO_OUTPUT)->
S_SELECTION(V4L2_BUF_TYPE_VIDEO_OUTPUT,V4L2_SEL_TGT_CROP)
S_CROP(V4L2_BUF_TYPE_VIDEO_CAPTURE)->
S_SELECTION(V4L2_BUF_TYPE_VIDEO_CAPTURE,V4L2_SEL_TGT_COMPOSE)And that's how selections are currently documented at video output and capture interfaces:
--------------------------------------------------------------------------------
*Configuration of video output*For output devices targets and ioctls are used similarly to the video capture
case. The composing rectangle refers to the insertion of an image into a video
signal. The cropping rectangles refer to a memory buffer."*Configuration of video capture*
... The top left corner, width and height of the source rectangle, that is the
area actually sampled, is given by theV4L2_SEL_TGT_CROPtarget.
...
The composing targets refer to a memory buffer.
--------------------------------------------------------------------------------If we apply this mapping, then current VIDIOC_S/G_CROP -> VIDIOC_S/G_SELECTION
ioctl fallback code wouldn't be valid, as we have there, e.g.static int v4l_s_crop(const struct
v4l2_ioctl_ops*ops,
struct file *file, void *fh, void *arg){ struct v4l2_crop *p = arg; struct v4l2_selection s = { .type = p->type, .r = p->c, }; if (ops->vidioc_s_crop) return ops->vidioc_s_crop(file, fh, p); /* simulate capture crop using selection api */ /* crop means compose for output devices */ if (V4L2_TYPE_IS_OUTPUT(p->type)) s.target = V4L2_SEL_TGT_COMPOSE_ACTIVE; else s.target = V4L2_SEL_TGT_CROP_ACTIVE; return ops->vidioc_s_selection(file, fh, &s); }
Quoted 1 line
i.e. it does exactly opposite to what we would expect for M2M.
You are right. Instead of handling this confusion in driver, as you mentioned, we can usevfl_dir field to select the target before sending it to the driver.
apart from using this vfl_dir field, I can't able to see any other solution here.
Regards,
Shaik Ameer Basha
Quoted 20 lines
One possible solution would be to get hold of struct
video_deviceand do proper targets conversion after checking thevfl_dirfield.Does anyone have suggestions on this ?
BTW, we still have some V4L2_SEL_TGT*_ACTIVE symbols left, I'll write a patch to clean this up.
[1] http://hverkuil.home.xs4all.nl/spec/media.html#idp9025504
[2] http://hverkuil.home.xs4all.nl/spec/media.html#idp9031840--
Thanks,
Sylwester
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 62 lines · On Thursday 22 November 2012 14:25:18 Shaik Ameer Basha wrote:
Quoted 61 lines · Sylwester Nawrocki
Hi All,
I'd like to clarify the meaning of selection targets on a mem-to-mem video device, in order to document it and to make sure new m2m drivers get it right, and also that the existing ones, using originally the crop ioctls, are converted to the selection ioctls properly.
Until the selections API was introduced we used the CROP ioctls to configure cropping on OUTPUT buffer queue and composition onto CAPTURE buffer. Looking at Figure 1.2, [1] it seems obvious that there should be applied following mapping of the CROP to SELECTION ioctls:
S_CROP(V4L2_BUF_TYPE_VIDEO_OUTPUT)->S_SELECTION(V4L2_BUF_TYPE_VIDEO_OUTPUT, V4L2_SEL_TGT_CROP)
S_CROP(V4L2_BUF_TYPE_VIDEO_CAPTURE)->S_SELECTION(V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_SEL_TGT_COMPOSE)And that's how selections are currently documented at video output and capture interfaces:
--------------------------------------------------------------------------
*Configuration of video output*For output devices targets and ioctls are used similarly to the video capture case. The composing rectangle refers to the insertion of an image into avideo signal. The cropping rectangles refer to a memory buffer."
*Configuration of video capture*
... The top left corner, width and height of the source rectangle, that is the area actually sampled, is given by theV4L2_SEL_TGT_CROPtarget.
...
The composing targets refer to a memory buffer.
--------------------------------------------------------------------------If we apply this mapping, then current VIDIOC_S/G_CROP -> VIDIOC_S/G_SELECTION
ioctl fallback code wouldn't be valid, as we have there, e.g.static int v4l_s_crop(const struct
v4l2_ioctl_ops*ops,
struct file *file, void *fh, void *arg){ struct v4l2_crop *p = arg; struct v4l2_selection s = { .type = p->type, .r = p->c, }; if (ops->vidioc_s_crop) return ops->vidioc_s_crop(file, fh, p); /* simulate capture crop using selection api */ /* crop means compose for output devices */ if (V4L2_TYPE_IS_OUTPUT(p->type)) s.target = V4L2_SEL_TGT_COMPOSE_ACTIVE; else s.target = V4L2_SEL_TGT_CROP_ACTIVE; return ops->vidioc_s_selection(file, fh, &s); }
Quoted 13 lines
Quoted 1 line
i.e. it does exactly opposite to what we would expect for M2M.
You are right. Instead of handling this confusion in driver, as you mentioned, we can use
vfl_dirfield to select the target before sending it to the driver.apart from using this
vfl_dirfield, I can't able to see any other solution here.Quoted 4 lines
One possible solution would be to get hold of struct
video_deviceand do proper targets conversion after checking thevfl_dirfield.Does anyone have suggestions on this ?
As the video_device can easily be retrieved with video_devdata(file) I think that's the easiest solution (and the only practical one I can see as well).
Quoted 5 lines
Quoted 5 lines
BTW, we still have some V4L2_SEL_TGT*_ACTIVE symbols left, I'll write a patch to clean this up.
[1] http://hverkuil.home.xs4all.nl/spec/media.html#idp9025504
[2] http://hverkuil.home.xs4all.nl/spec/media.html#idp9031840
Signature · 3 lines
Regards, Laurent Pinchart