Skip to contentSkip to conversation

Using atmel-isi for direct output on framebuffer ?

DISCUSSION Thomas Petazzoni 5 participants 8 messages Sep 1, 2011 – Sep 2, 2011 Media (V4L/DVB)

lore
Share & tools
lore
#0 lore raw

Hello Josh,

I am currently looking at V4L2 and your atmel-isi driver for an AT91 based platform on which I would like the ISI interface to capture the image from a camera and have this image directly output in RGB format at a specific location on the screen (so that it can be nicely integrated into a Qt application for example).

At the moment, I grab frames from the V4L2 device to userspace, do the YUV -> RGB conversion manually in my application, and then displays the converted frame on the framebuffer thanks to normal Qt painting mechanisms. This works, but obviously consumes a lot of CPU.

Quoted 1 line

From the AT91 datasheet, I understand that the ISI interface is capable

of doing the YUV -> RGB conversion and is also capable of outputting the frame at some location in the framebuffer, but I don't see how to use this capability with the Linux V4L2 and framebuffer infrastructures.

Is this possible ? If so, could you provide some pointers or starting points to get me started ? If not, what is missing in the driver ?

Thanks a lot,

Thomas

Signature · 4 lines
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
#1 lore raw

Hi Thomas

Quoted 7 lines · Thomas Petazzoni

Hello Josh,

I am currently looking at V4L2 and your atmel-isi driver for an AT91 based platform on which I would like the ISI interface to capture the image from a camera and have this image directly output in RGB format at a specific location on the screen (so that it can be nicely integrated into a Qt application for example).

Isn't this what V4L2_CAP_VIDEO_OVERLAY type drivers are doing? I've never dealt with those, but it seems to be exactly what you need. ATM there are no soc-camera drivers, implementing this capability, so, looks like implementing this in atmel-isi won't be a very boring task for you;-)

Thanks
Guennadi

Quoted 11 lines

At the moment, I grab frames from the V4L2 device to userspace, do the YUV -> RGB conversion manually in my application, and then displays the converted frame on the framebuffer thanks to normal Qt painting mechanisms. This works, but obviously consumes a lot of CPU.

Quoted 1 line

From the AT91 datasheet, I understand that the ISI interface is capable

of doing the YUV -> RGB conversion and is also capable of outputting the frame at some location in the framebuffer, but I don't see how to use this capability with the Linux V4L2 and framebuffer infrastructures.

Quoted 16 lines

Is this possible ? If so, could you provide some pointers or starting points to get me started ? If not, what is missing in the driver ?

Thanks a lot,

Thomas

Signature · 8 lines
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
--
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

---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/

#2 lore raw
In reply to Thomas Petazzoni

Hi, Thomas

Quoted 13 lines · Thomas Petazzoni

Hello Josh,

I am currently looking at V4L2 and your atmel-isi driver for an AT91 based platform on which I would like the ISI interface to capture the image from a camera and have this image directly output in RGB format at a specific location on the screen (so that it can be nicely integrated into a Qt application for example).

At the moment, I grab frames from the V4L2 device to userspace, do the YUV -> RGB conversion manually in my application, and then displays the converted frame on the framebuffer thanks to normal Qt painting mechanisms. This works, but obviously consumes a lot of CPU.

Quoted 7 lines

From the AT91 datasheet, I understand that the ISI interface is capable of doing the YUV -> RGB conversion and is also capable of outputting the frame at some location in the framebuffer, but I don't see how to use this capability with the Linux V4L2 and framebuffer infrastructures.

Is this possible ? If so, could you provide some pointers or starting points to get me started ? If not, what is missing in the driver ?

My understanding is that you want to use Atmel ISI to output RGB data then work with framebuffer. So yes, it is possible.

Since current atmel_isi.c only uses its codec path to output YUV data. So first need add RGB format support in isi_camera_get_formats().
Then you have two choices to enable RGB output of ISI:
1. Enable isi's preview path(DMA, interrupts) to convert YUV to RGB.
2. Or still use codec path but don't need add much ISI code, just set camera sensor(if it support RGB565 output) to output RGB565 data for ISI, then what the data ISI output now should be RGB565 format. But in this way you cannot do any scale.

For V4L2_CAP_VIDEO_OVERLAY type driver, I don't know much about that.

Best Regards,
Josh Wu

Quoted 12 lines

Thanks a lot,

Thomas

Signature · 8 lines
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
--
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
#3 lore raw

Hello Josh,

Quoted 2 lines · Josh

My understanding is that you want to use Atmel ISI to output RGB data then work with framebuffer. So yes, it is possible.

Good.

Quoted 8 lines

Since current atmel_isi.c only uses its codec path to output YUV data. So first need add RGB format support in isi_camera_get_formats(). Then you have two choices to enable RGB output of ISI: 1. Enable isi's preview path(DMA, interrupts) to convert YUV to RGB. 2. Or still use codec path but don't need add much ISI code, just set camera sensor(if it support RGB565 output) to output RGB565 data for ISI, then what the data ISI output now should be RGB565 format. But in this way you cannot do any scale.

Doing the YUV -> RGB within the V4L2 driver is something I understand quite well. The part I miss is how the V4L2 driver interacts with the framebuffer driver to output the camera image into the framebuffer.

Quoted 1 line

For V4L2_CAP_VIDEO_OVERLAY type driver, I don't know much about that.

Hum, ok, found http://v4l2spec.bytesex.org/spec/x6570.htm which seems to explain a bit the userspace interface for this.

Thanks for your feedback!

Thomas

Signature · 4 lines
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
#4 lore raw

Hi,

Quoted 8 lines · Thomas Petazzoni

Doing the YUV -> RGB within the V4L2 driver is something I understand quite well. The part I miss is how the V4L2 driver interacts with the framebuffer driver to output the camera image into the framebuffer.

Quoted 1 line

For V4L2_CAP_VIDEO_OVERLAY type driver, I don't know much about that.

Hum, ok, found http://v4l2spec.bytesex.org/spec/x6570.htm which seems to explain a bit the userspace interface for this.

Most up to date documentation is hosted at linuxtv.org:

http://linuxtv.org/downloads/v4l-dvb-apis/overlay.html

#5 lore raw
In reply to Thomas Petazzoni

Hi Thomas,

Quoted 15 lines · On Friday 02 September 2011 11:18:53 Thomas Petazzoni wrote:
Quoted 2 lines · Josh

My understanding is that you want to use Atmel ISI to output RGB data then work with framebuffer. So yes, it is possible.

Good.

Quoted 8 lines

Since current atmel_isi.c only uses its codec path to output YUV data. So first need add RGB format support in isi_camera_get_formats(). Then you have two choices to enable RGB output of ISI: 1. Enable isi's preview path(DMA, interrupts) to convert YUV to RGB. 2. Or still use codec path but don't need add much ISI code, just set camera sensor(if it support RGB565 output) to output RGB565 data for ISI, then what the data ISI output now should be RGB565 format. But in this way you cannot do any scale.

Quoted 8 lines

Doing the YUV -> RGB within the V4L2 driver is something I understand quite well. The part I miss is how the V4L2 driver interacts with the framebuffer driver to output the camera image into the framebuffer.

Quoted 1 line

For V4L2_CAP_VIDEO_OVERLAY type driver, I don't know much about that.

Hum, ok, found http://v4l2spec.bytesex.org/spec/x6570.htm which seems to explain a bit the userspace interface for this.

I'm not sure if V4L2_CAP_VIDEO_OVERLAY is a good solution for this. This driver type (or rather buffer type) was used on old systems to capture directly to the PCI graphics card memory. Nowadays I would advice using USERPTR with framebuffer memory.

Signature · 3 lines
Regards,

Laurent Pinchart
#6 lore raw

Hi Laurent,

Quoted 4 lines · Laurent Pinchart

I'm not sure if V4L2_CAP_VIDEO_OVERLAY is a good solution for this. This driver type (or rather buffer type) was used on old systems to capture directly to the PCI graphics card memory. Nowadays I would advice using USERPTR with framebuffer memory.

Could you give a short summary of how the USERPTR mechanism works?

Thanks,

Thomas

Signature · 4 lines
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
#7 lore raw

Hi Thomas,

Quoted 7 lines · On Friday 02 September 2011 13:51:58 Thomas Petazzoni wrote:
Quoted 4 lines · Laurent Pinchart

I'm not sure if V4L2_CAP_VIDEO_OVERLAY is a good solution for this. This driver type (or rather buffer type) was used on old systems to capture directly to the PCI graphics card memory. Nowadays I would advice using USERPTR with framebuffer memory.

Could you give a short summary of how the USERPTR mechanism works?

In a nutshell, instead of asking the capture driver to allocate buffers and map them to userspace, applications pass userspace buffer pointers to the driver.

In your case the application would mmap() the framebuffer memory and give pointers to that memory to the capture driver.

Signature · 3 lines
Regards,

Laurent Pinchart