Re: V4L2 subdevice query

2012-01-02 Thread Sakari Ailus
Hi Vinay,

On Mon, Dec 19, 2011 at 12:08:31PM -0800, vka...@codeaurora.org wrote:
 Hi
 
 I am trying to implement a video encoder v4l2 device and
 need your help to find answers to some of the questions.
 There is one hardware core which can do multiple sessions
 (multiple file handles) of encode simultaneously.
 The encode functionalty needs to be exposed to userspace
 as well as kernel through standard set of APIs. Userspace
 should be able to use this functionality through V4l2 interface
 and another kernel module should be able to use encoder
 as a subdevice. I am trying to explore the framework to achieve this
 and have following questions:

Is there a physical link (a bus) between the device which the another kernel
module drives, and the video encoder? Memory does not count. I have never
seen a video encoder which would be connected to somewhere else, e.g. an
ISP.

Typically video encoders will have to access the image data in tiles that do
not match with the linear read of the sensor's pixel array, which is the
same order as the output of ISPs. This requires an intermediate buffer, at
least, which is typically the system memory.

Any further technical information on the encoder, its connections to the
rest of the SoC and the SoC itself would be helpful.

 1. I am planning to create a V4L2 device and also initializing
it as a subdev in the probe function i.e the probe function
of this driver will have:
struct venc_device {
 struct v4l2_device v4l2_dev;
 struct v4l2_subdev sd;
};
 
struct venc_device *vdev;
v4l2_device_register(vdev-v4l2_dev);
v4l2_subdev_init(vdev-sd, venc_sd_ops);
 
How do other modules discover this subdevice. Is there an API
I can use to find module by name?
 
 2. Most of the subdevice interface functions have input parameters
as struct v4l2_subdev *sd and another API specific structure.
How do I distinguish between different instances (file handles)
of a subdevice. Do I always need to pass file handle/instance
specific information in void *arg of the ioctl subdev core ops.

The subdev API, as it stands currently, is intended for configuring hardware
devices which only can have a single, global configuration.

If you implement your video encoder as a memory-to-memory device, I think
the interface has exactly what you'll need. By default everything in
memory-to-memory devices is file handle specific.

 3. Controls are instance specific, eg: one encoder application might
encode at bitrate of 4Mbps and another at 128kbps, so I want controls
to be specific to file handles. I see that the control handler has been
moved to v4l2_fh structure for this purpose. How do I do it for  
 subdevices
so that the v4l2 device using this subdevice inherits the instance
specific controls defined by the subdevice.

Kind regards,

-- 
Sakari Ailus
e-mail: sakari.ai...@iki.fi jabber/XMPP/Gmail: sai...@retiisi.org.uk
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: V4L2 subdevice query

2011-12-20 Thread Laurent Pinchart
Hi Vinay,

On Monday 19 December 2011 21:08:31 vka...@codeaurora.org wrote:
 
 I am trying to implement a video encoder v4l2 device and need your help to
 find answers to some of the questions. There is one hardware core which can
 do multiple sessions (multiple file handles) of encode simultaneously. The
 encode functionalty needs to be exposed to userspace as well as kernel
 through standard set of APIs. Userspace should be able to use this
 functionality through V4l2 interface and another kernel module should be
 able to use encoder as a subdevice. I am trying to explore the framework to
 achieve this and have following questions:
 
 1. I am planning to create a V4L2 device and also initializing it as a
subdev in the probe function i.e the probe function of this driver will
have:
struct venc_device {
 struct v4l2_device v4l2_dev;
 struct v4l2_subdev sd;
};
 
struct venc_device *vdev;
v4l2_device_register(vdev-v4l2_dev);
v4l2_subdev_init(vdev-sd, venc_sd_ops);
 
How do other modules discover this subdevice. Is there an API I can use
to find module by name?
 
 2. Most of the subdevice interface functions have input parameters as
struct v4l2_subdev *sd and another API specific structure. How do I
distinguish between different instances (file handles) of a subdevice.

The short answer is that you don't.

If your hardware block can encode a fixed number of streams separately, one 
possible solution would be to create N subdevices, or to create a single 
subdevice with N input pads and N output pads, where N is the number of 
logical streams. Input and output pads could then be connected to video nodes 
or to other subdevices in the system.

Another solution is to use the mem-to-mem framework, which allows streams 
multiplexing through multiple opens. However, there is no clear mapping to 
subdevs (that I'm aware of) at the moment.

Can you share a bit more information about your hardware ? A block diagram 
would be useful.

Do I always need to pass file handle/instance specific information in
void *arg of the ioctl subdev core ops.

 3. Controls are instance specific, eg: one encoder application might encode
at bitrate of 4Mbps and another at 128kbps, so I want controls to be
specific to file handles. I see that the control handler has been moved
to v4l2_fh structure for this purpose. How do I do it for subdevices so
that the v4l2 device using this subdevice inherits the instance specific
controls defined by the subdevice.

-- 
Regards,

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


V4L2 subdevice query

2011-12-19 Thread vkalia
Hi

I am trying to implement a video encoder v4l2 device and
need your help to find answers to some of the questions.
There is one hardware core which can do multiple sessions
(multiple file handles) of encode simultaneously.
The encode functionalty needs to be exposed to userspace
as well as kernel through standard set of APIs. Userspace
should be able to use this functionality through V4l2 interface
and another kernel module should be able to use encoder
as a subdevice. I am trying to explore the framework to achieve this
and have following questions:

1. I am planning to create a V4L2 device and also initializing
   it as a subdev in the probe function i.e the probe function
   of this driver will have:
   struct venc_device {
struct v4l2_device v4l2_dev;
struct v4l2_subdev sd;
   };

   struct venc_device *vdev;
   v4l2_device_register(vdev-v4l2_dev);
   v4l2_subdev_init(vdev-sd, venc_sd_ops);

   How do other modules discover this subdevice. Is there an API
   I can use to find module by name?

2. Most of the subdevice interface functions have input parameters
   as struct v4l2_subdev *sd and another API specific structure.
   How do I distinguish between different instances (file handles)
   of a subdevice. Do I always need to pass file handle/instance
   specific information in void *arg of the ioctl subdev core ops.

3. Controls are instance specific, eg: one encoder application might
   encode at bitrate of 4Mbps and another at 128kbps, so I want controls
   to be specific to file handles. I see that the control handler has been
   moved to v4l2_fh structure for this purpose. How do I do it for  
subdevices
   so that the v4l2 device using this subdevice inherits the instance
   specific controls defined by the subdevice.


Thanks
Vinay


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