RE: width and height of JPEG compressed images
Hi, On 21 August 2013 14:29, Laurent Pinchart wrote: On Wednesday 21 August 2013 16:17:37 Sakari Ailus wrote: On Wed, Aug 07, 2013 at 05:43:56PM +, Thomas Vajzovic wrote: It defines the exact size of the physical frame. The JPEG data is padded to this size. The size of the JPEG before it was padded is also written into the last word of the physical frame. That would require either using a custom pixel format and have userspace reading the size from the buffer, or mapping the buffer in kernel space and reading the size there. The latter is easier for userspace, but might it hinder performances ? I think it ought to be a custom format and handled in userspace, otherwise the bridge driver would have to call a subdev function each frame to get it to fix-up the used size each time, which is quite ugly. Regards, Tom -- Mr T. Vajzovic Software Engineer Infrared Integrated Systems Ltd Visit us at www.irisys.co.uk Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited Park Circle Tithe Barn Way Swan Valley Northampton NN4 9BG Registration Number: 3186364. -- 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: width and height of JPEG compressed images
Hi, On 21 August 2013 14:34, Sakari Ailus wrote: On Tue, Aug 06, 2013 at 04:26:56PM +, Thomas Vajzovic wrote: On 24 July 2013 10:30 Sylwester Nawrocki wrote: On 07/22/2013 10:40 AM, Thomas Vajzovic wrote: On 21 July 2013 21:38 Sylwester Nawrocki wrote: On 07/19/2013 10:28 PM, Sakari Ailus wrote: On Sat, Jul 06, 2013 at 09:58:23PM +0200, Sylwester Nawrocki wrote: On 07/05/2013 10:22 AM, Thomas Vajzovic wrote: The hardware reads AxB sensor pixels from its array, resamples them to CxD image pixels, and then compresses them to ExF bytes. If the sensor driver is only told the user's requested sizeimage, it can be made to factorize (ExF) into (E,F) itself, but then both the parallel interface and the 2D DMA peripheral need to be told the particular factorization that it has chosen. If the user requests sizeimage which cannot be satisfied (eg: a prime number) then it will need to return (E,F) to the bridge driver which does not multiply exactly to sizeimage. Because of this the bridge driver must set the corrected value of sizeimage which it returns to userspace to the product ExF. Ok, let's consider following data structure describing the frame: struct v4l2_frame_desc_entry { u32 flags; u32 pixelcode; u32 samples_per_line; u32 num_lines; u32 size; }; I think we could treat the frame descriptor to be at lower lever in the protocol stack than struct v4l2_mbus_framefmt. Then the bridge would set size and pixelcode and the subdev would return (E, F) in (samples_per_frame, num_lines) and adjust size if required. Number of bits per sample can be determined by pixelcode. It needs to be considered that for some sensor drivers it might not be immediately clear what samples_per_line, num_lines values are. In such case those fields could be left zeroed and bridge driver could signal such condition as a more or less critical error. In end of the day specific sensor driver would need to be updated to interwork with a bridge that requires samples_per_line, num_lines. I think we ought to try to consider the four cases: 1D sensor and 1D bridge: already works 2D sensor and 2D bridge: my use case 1D sensor and 2D bridge, 2D sensor and 1D bridge: Are there any bridge devices that CANNOT receive 2D images? I've never seen any. I meant bridge with 1D DMA. Perhaps both of these cases could be made to work by setting: num_lines = 1; samples_per_line = ((size * 8) / bpp); (Obviously this would also require the appropriate pull-up/down on the second sync input on a 2D bridge). And typically also 2D-only bridges have very limited maximum image width which is unsuitable for any decent images. I'd rather like to only support cases that we actually have right now. That makes sense. I would make a small change though: I think your proposed structure and protocol has redundant data which could lead to ambiguity. Perhaps the structure should only have size and samples_per_line. If the subdev supports 2D output of a compressed stream then it examines size, and sets samples_per_line and adjusts size. If not then it may still adjust size but leaves samples_per_line zeroed. As you said if the bridge finds samples_per_line still zeroed and it needs it then it will have to give up. If it has a non-zero samples_per_line then it can divide to find num_lines. Not sure if we need to add image width and height in pixels to the above structure. It wouldn't make much sensor when single frame carries multiple images, e.g. interleaved YUV and compressed image data at different resolutions. If image size were here then we are duplicating get_fmt/set_fmt. But then, by having pixelcode here we are already duplicating part of get_fmt/set_fmt. If the bridge changes pixelcode and calls Pixelcode would be required to tell which other kind of data is produced by the device. But I agree in principle --- there could (theoretically) be multiple pixelcodes that you might want to configure on a sensor. We don't have a way to express that currently. I wasn't thinking that set_frame_desc should be able to configure currently unselected pixelcodes, quite the contrary, I would expect that the pad should have a selected pixelcode, set by set_mbus_fmt, so having pixelcode in frame_desc_entry is extra duplication, I don't know why it is there. Do you have an example of something you'd like to set (or try) in frame descriptors outside struct v4l2_subdev_format? I only have a need to try/set the buffersize which is tried/set by userspace. Best regards, Tom -- Mr T. Vajzovic Software Engineer Infrared Integrated Systems Ltd Visit us at www.irisys.co.uk Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited
RE: width and height of JPEG compressed images
It defines the exact size of the physical frame. The JPEG data is padded to this size. The size of the JPEG before it was padded is also written into the last word of the physical frame. From: Sakari Ailus [sakari.ai...@iki.fi] Sent: 07 August 2013 10:35 To: Thomas Vajzovic Cc: Sylwester Nawrocki; Sylwester Nawrocki; linux-media@vger.kernel.org; Laurent Pinchart Subject: Re: width and height of JPEG compressed images Hi Tom, Before replying the rest, let me first ask you a question. Does ExF define the size of the image, or does it define its maximum size? I think that may make a big difference here. -- Cheers, Sakari Ailus e-mail: sakari.ai...@iki.fi XMPP: sai...@retiisi.org.uk Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited Park Circle Tithe Barn Way Swan Valley Northampton NN4 9BG Registration Number: 3186364. -- 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: width and height of JPEG compressed images
Hi, On 26 July 2013 10:07 Sakari Ailus wrote: On Wed, Jul 24, 2013 at 10:39:11AM +0200, Sylwester Nawrocki wrote: On 07/24/2013 09:47 AM, Thomas Vajzovic wrote: On 23 July 2013 23:21 Sakari Ailus wrote: On Sun, Jul 21, 2013 at 10:38:18PM +0200, Sylwester Nawrocki wrote: On 07/19/2013 10:28 PM, Sakari Ailus wrote: On Sat, Jul 06, 2013 at 09:58:23PM +0200, Sylwester Nawrocki wrote: On 07/05/2013 10:22 AM, Thomas Vajzovic wrote: The hardware reads AxB sensor pixels from its array, resamples them to CxD image pixels, and then compresses them to ExF bytes. sensor matrix (AxB pixels) - binning/skipping (CxD pixels) - - JPEG compresion (width = C, height = D, sizeimage ExF bytes) Does the user need to specify ExF, for other purposes than limiting the size of the image? I would leave this up to the sensor driver (with reasonable alignment). The sensor driver would tell about this to the receiver through AFAIU ExF is closely related to the memory buffer size, so the sensor driver itself wouldn't have enough information to fix up ExF, would it ? If the desired sizeimage is known, F can be calculated if E is fixed, say 1024 should probably work for everyone, shoulnd't it? It's a nice clean idea (and I did already consider it) but it reduces the flexibility of the system as a whole. Suppose an embedded device wants to send the compressed image over a network in packets of 1500 bytes, and they want to allow 3 packets per frame. Your proposal limits sizeimage to a multiple of 1K, so they have to set sizeimage to 4K when they want 4.5K, meaning that they waste 500 bytes of bandwidth every frame. You could say tough luck, extra overhead like this is something you should expect if you want to use a general purpose API like V4L2, but why make it worse if we can make it better? I entirely agree with that. Other issue with fixed number of samples per line is that internal (FIFO) line buffer size of the transmitter devices will vary, and for example some devices might have line buffer smaller than the value we have arbitrarily chosen. I'd expect the optimal number of samples per line to vary among different devices and use cases. I guess the sensor driver could factor the size as well (provided it can choose an arbitrary size) but then to be fully generic, I think alignment must also be taken care of. Many receivers might require width to be even but some might have tighter requirements. They have a minimum width, too. To make this working in a generic case might not be worth the time and effort of being able to shave up to 1 kiB off of video buffer allocations. I think that a good enough solution here is that the code within each sensor driver that does the factorization has to be written to account for whatever reasonable restrictions that a bridge might require. Eg: if the userspace requests 49 bytes, it doesn't give back 7x7, because it knows that some bridges don't like odd numbers. A sensor driver author would have to do a quick survey of bridges to see what was likely to be problematic. A bit of common sense would solve the vast majority of cases. After that if the bridge didn't like what the sensor set, then the whole operation would fail. The user would then have to make a feature request to the sensor driver author saying can you please tweak it to work with such-a-bridge. This solution is only slightly more complicated than picking a fixed width, and I think that the advantage is worth the extra complication. Remember v4l2_buffer.length is different from v4l2_pix_format.sizeimage. Hmm. Yes --- so to the sensor goes desired maximum size, and back you'd get ExF (i.e. buffer length) AND the size of the image. I really don't understand this last paragraph. Try adding coffee ;-) Best regards, Tom -- Mr T. Vajzovic Software Engineer Infrared Integrated Systems Ltd Visit us at www.irisys.co.uk Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited Park Circle Tithe Barn Way Swan Valley Northampton NN4 9BG Registration Number: 3186364. -- 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: width and height of JPEG compressed images
Hi, On 24 July 2013 10:30 Sylwester Nawrocki wrote: On 07/22/2013 10:40 AM, Thomas Vajzovic wrote: On 21 July 2013 21:38 Sylwester Nawrocki wrote: On 07/19/2013 10:28 PM, Sakari Ailus wrote: On Sat, Jul 06, 2013 at 09:58:23PM +0200, Sylwester Nawrocki wrote: On 07/05/2013 10:22 AM, Thomas Vajzovic wrote: The hardware reads AxB sensor pixels from its array, resamples them to CxD image pixels, and then compresses them to ExF bytes. If the sensor driver is only told the user's requested sizeimage, it can be made to factorize (ExF) into (E,F) itself, but then both the parallel interface and the 2D DMA peripheral need to be told the particular factorization that it has chosen. If the user requests sizeimage which cannot be satisfied (eg: a prime number) then it will need to return (E,F) to the bridge driver which does not multiply exactly to sizeimage. Because of this the bridge driver must set the corrected value of sizeimage which it returns to userspace to the product ExF. Ok, let's consider following data structure describing the frame: struct v4l2_frame_desc_entry { u32 flags; u32 pixelcode; u32 samples_per_line; u32 num_lines; u32 size; }; I think we could treat the frame descriptor to be at lower lever in the protocol stack than struct v4l2_mbus_framefmt. Then the bridge would set size and pixelcode and the subdev would return (E, F) in (samples_per_frame, num_lines) and adjust size if required. Number of bits per sample can be determined by pixelcode. It needs to be considered that for some sensor drivers it might not be immediately clear what samples_per_line, num_lines values are. In such case those fields could be left zeroed and bridge driver could signal such condition as a more or less critical error. In end of the day specific sensor driver would need to be updated to interwork with a bridge that requires samples_per_line, num_lines. I think we ought to try to consider the four cases: 1D sensor and 1D bridge: already works 2D sensor and 2D bridge: my use case 1D sensor and 2D bridge, 2D sensor and 1D bridge: Perhaps both of these cases could be made to work by setting: num_lines = 1; samples_per_line = ((size * 8) / bpp); (Obviously this would also require the appropriate pull-up/down on the second sync input on a 2D bridge). Since the frame descriptor interface is still new and used in so few drivers, is it reasonable to expect them all to be fixed to do this? Not sure if we need to add image width and height in pixels to the above structure. It wouldn't make much sensor when single frame carries multiple images, e.g. interleaved YUV and compressed image data at different resolutions. If image size were here then we are duplicating get_fmt/set_fmt. But then, by having pixelcode here we are already duplicating part of get_fmt/set_fmt. If the bridge changes pixelcode and calls set_frame_desc then is this equivalent to calling set_fmt? I would like to see as much data normalization as possible and eliminate the redundancy. Whatever mechanism is chosen needs to have corresponding get/set/try methods to be used when the user calls VIDIOC_G_FMT/VIDIOC_S_FMT/VIDIOC_TRY_FMT. Agreed, it seems we need some sort of negotiation of those low level parameters. Should there be set/get/try function pointers, or should the struct include an enum member like v4l2_subdev_format.which to determine which operation is to be perfomed? Personally I think that it is a bit ugly having two different function pointers for set_fmt/get_fmt but then a structure member to determine between set/try. IMHO it should be three function pointers or one function with a three valued enum in the struct. Best regards, Tom -- Mr T. Vajzovic Software Engineer Infrared Integrated Systems Ltd Visit us at www.irisys.co.uk Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited Park Circle Tithe Barn Way Swan Valley Northampton NN4 9BG Registration Number: 3186364. -- 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: width and height of JPEG compressed images
Hi Sakiri, On 23 July 2013 23:21 Sakari Ailus wrote: On Sun, Jul 21, 2013 at 10:38:18PM +0200, Sylwester Nawrocki wrote: On 07/19/2013 10:28 PM, Sakari Ailus wrote: On Sat, Jul 06, 2013 at 09:58:23PM +0200, Sylwester Nawrocki wrote: On 07/05/2013 10:22 AM, Thomas Vajzovic wrote: The hardware reads AxB sensor pixels from its array, resamples them to CxD image pixels, and then compresses them to ExF bytes. sensor matrix (AxB pixels) - binning/skipping (CxD pixels) - - JPEG compresion (width = C, height = D, sizeimage ExF bytes) Does the user need to specify ExF, for other purposes than limiting the size of the image? I would leave this up to the sensor driver (with reasonable alignment). The sensor driver would tell about this to the receiver through AFAIU ExF is closely related to the memory buffer size, so the sensor driver itself wouldn't have enough information to fix up ExF, would it ? If the desired sizeimage is known, F can be calculated if E is fixed, say 1024 should probably work for everyone, shoulnd't it? It's a nice clean idea (and I did already consider it) but it reduces the flexibility of the system as a whole. Suppose an embedded device wants to send the compressed image over a network in packets of 1500 bytes, and they want to allow 3 packets per frame. Your proposal limits sizeimage to a multiple of 1K, so they have to set sizeimage to 4K when they want 4.5K, meaning that they waste 500 bytes of bandwidth every frame. You could say tough luck, extra overhead like this is something you should expect if you want to use a general purpose API like V4L2, but why make it worse if we can make it better? Best regards, Tom -- Mr T. Vajzovic Software Engineer Infrared Integrated Systems Ltd Visit us at www.irisys.co.uk Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited Park Circle Tithe Barn Way Swan Valley Northampton NN4 9BG Registration Number: 3186364. -- 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: width and height of JPEG compressed images
Hi Sylwester, On 22 July 2013 22:48 Sylwester Nawrocki wrote: On 07/15/2013 11:18 AM, Thomas Vajzovic wrote: On 10 July 2013 20:44 Sylwester Nawrocki wrote: On 07/07/2013 10:18 AM, Thomas Vajzovic wrote: On 06 July 2013 20:58 Sylwester Nawrocki wrote: On 07/05/2013 10:22 AM, Thomas Vajzovic wrote: The hardware reads AxB sensor pixels from its array, resamples them to CxD image pixels, and then compresses them to ExF bytes. Yes you are correct that the sensor zero pads the compressed data to a fixed size. That size must be specified in two separate registers, called spoof width and spoof height. Above CxD is the image size after binning/skipping and resizing, ExF is the spoof size. All right. We need to make it clear that the format on video node refers to data in memory, while media bus format/frame descriptor specifies how data is transmitted on the physical bus. When there is scaling, etc. involved on the bridge side relations between the two are not that straightforward. sizeimage / bytesperline needs to be translatable to frame descriptor/media bus format information and the other way around. I'm not sure that translating them is reasonable. The image width and height are one thing, and the data size (whether 1D or 2D) is another thing. They just need to be expressed explicitly. Secondly, the pair of numbers (E,F) in my case have exaclty the same meaning and are used in exactly the same way as the single number (sizeimage) which is used in the cameras that use the current API. Logically the two numbers should be passed around and set and modified in all the same places that sizeimage currently is, but as a tuple. The two cannot be separated with one set using one API and the other a different API. Sure, we just need to think of how to express (E, F) in the frame descriptors API and teach the bridge driver to use it. As Sakari mentioned width, height and bpp is probably going to be sufficient. Bits-per-image-pixel is variable, but I assume you mean average- bits-per-image-pixel. This is confusing and inexact: What if the user wants to compress 800x600 to 142kB? then bpp = 2.4234667. This number doesn't really mean very much, and how would you express it so that the bridge always get exact pair of integers that the sensor chose without rounding error? I suggest that the clean and sensible solution is to explicitly express physical width, with physical-bits- per-pixel = always 8 (assuming FMT_JPEG_1X8). Many thanks for your time on this. Please see also my reply at Mon 22/07/2013 09:41. Your proposal above sounds sane, I've seen already 1D/2D DMA notations in some documentation. Is datasheet of your bridge device available publicly ? Which Blackfin processor is that ? http://www.analog.com/static/imported-files/processor_manuals/ADSP-BF51x_hwr_rev1.2.pdf Best regards, Tom -- Mr T. Vajzovic Software Engineer Infrared Integrated Systems Ltd Visit us at www.irisys.co.uk Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited Park Circle Tithe Barn Way Swan Valley Northampton NN4 9BG Registration Number: 3186364. -- 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: width and height of JPEG compressed images
Hello, On 21 July 2013 21:38 Sylwester Nawrocki wrote: On 07/19/2013 10:28 PM, Sakari Ailus wrote: On Sat, Jul 06, 2013 at 09:58:23PM +0200, Sylwester Nawrocki wrote: On 07/05/2013 10:22 AM, Thomas Vajzovic wrote: The hardware reads AxB sensor pixels from its array, resamples them to CxD image pixels, and then compresses them to ExF bytes. I think you should use VIDIOC_S_FMT(width = C, height = D, sizeimage = ExF) for that. And s_frame_desc sudev op could be used to pass sizeimage to the sensor subdev driver. Agreed. Let me take this into account in the next RFC. I agree that in my use case the user only needs to be able to specify sizeimage, and then be told in response what the adjusted value of sizeimage is. Does the user need to specify ExF, for other purposes than limiting the size of the image? I would leave this up to the sensor driver (with reasonable alignment). The sensor driver would tell about this to the receiver through AFAIU ExF is closely related to the memory buffer size, so the sensor driver itself wouldn't have enough information to fix up ExF, would it ? If the sensor driver is only told the user's requested sizeimage, it can be made to factorize (ExF) into (E,F) itself, but then both the parallel interface and the 2D DMA peripheral need to be told the particular factorization that it has chosen. Eg: if the user requests images of 8K, then the bridge needs to know that they will come out as 10 lines of 800 bytes. If the user requests sizeimage which cannot be satisfied (eg: a prime number) then it will need to return (E,F) to the bridge driver which does not multiply exactly to sizeimage. Because of this the bridge driver must set the corrected value of sizeimage which it returns to userspace to the product ExF. Eg: if the user requests sizeimage = 1601, then the sensor cannot provide 1601x1 (width exceeds internal FIFO), it will have to tell the bridge that it will give 800x2 or 801x2. The userspace needs to be told that sizeimage was adjusted to 1600 or 1602 because there are data fields aligned to the end of the data. (BTW, would you suggest rounding up or down in this case? If the user knew how much memory that an embedded system had available and specified sizeimage to the maximum, then rounding up might result in failed allocation. But then, if the user knows how much entropy-coded JPEG data to expect, then rounding down might result in truncated frames that have to be dropped.) frame descriptors. (But still I don't think frame descriptors should be settable; what sensors can support is fully sensor specific and the parameters that typically need to be changed are quite limited in numbers. So I'd go with e.g. controls, again.) I agree it would have been much more clear to have read only frame descriptors outside of the subdev. But the issue with controls is that it would have been difficult to define same parameter for multiple logical stream on the data bus. And data interleaving is a standard feature, it is well defined in the MIPI CSI-2 specification. So my feeling is that we would be better off with data structure and a callback, rather than creating multiple strange controls. However if we don't use media bus format callbacks, nor frame descriptor callbacks, then what ?... :) It sounds reasonable to me to have frame frame descriptor defined by the sensor (data source) based on media bus format, frame interval, link frequency, etc. Problematic seem to be parameters that are now handled on the video node side, like, e.g. buffer size. I think that this is definitely not a candidate for using controls. I think that whatever mechanism is used for setting sizemage on JPEG sensors with 1D DMA, then the same mechanism needs to be extended for this case. Currently this is frame descriptors. Whatever mechanism is chosen needs to have corresponding get/set/try methods to be used when the user calls VIDIOC_G_FMT/VIDIOC_S_FMT/VIDIOC_TRY_FMT. Regards, Tom -- Mr T. Vajzovic Software Engineer Infrared Integrated Systems Ltd Visit us at www.irisys.co.uk Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited Park Circle Tithe Barn Way Swan Valley Northampton NN4 9BG Registration Number: 3186364. -- 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: MT9D131 context switching [was RE: width and height of JPEG compressed images]
Hi Sakari, On 17 July 2013 00:58 Sakari Ailus wrote: On Mon, Jul 15, 2013 at 09:30:33AM +, Thomas Vajzovic wrote: On 10 July 2013 20:44 Sylwester Nawrocki wrote: On 07/07/2013 10:18 AM, Thomas Vajzovic wrote: On 06 July 2013 20:58 Sylwester Nawrocki wrote: On 07/05/2013 10:22 AM, Thomas Vajzovic wrote: I am writing a driver for the sensor MT9D131. As a side note, looking at the MT9D131 sensor datasheet I can see it has preview (Mode A) and capture (Mode B) modes. Are you also planning adding proper support for switching between those modes ? I'm interested in supporting this in standard way in V4L2, as lot's of sensors I have been working with also support such modes. This camera has more like three modes: preview (context A) up to 800x600, up to 30fps, YUV/RGB capture video (context B) up to 1600x1200, up to 15fps, YUV/RGB/JPEG capture stills (context B) up to 1600x1200, sequence of 1 or more frames with no fixed timing, YUV/RGB/JPEG I have implemented switching between the first two of these, but the choice is forced by the framerate, resolution and format that the user requests, so I have not exposed any interface to change the context, the driver just chooses the one that can do what the user wants. As for the third mode, I do not currently plan to implement it, but if I was going to then I think the only API that would be required is V4L2_MODE_HIGHQUALITY in v4l2_captureparm.capturemode. Is there a practical difference in video and still capture in this case? I haven't read the docs fully because I don't use that mode, but AFAIK: If you select capture stills then it takes a few frames and then changes mode back to preview on its own. As it is changing modes then the auto- exposure and gain does clever things. I think it might discard or mask all but one of the frames to help you just get the single best one. This mode also supports triggering a synchronized flash light in hardware and I don't know what else. Regards, Tom Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited Park Circle Tithe Barn Way Swan Valley Northampton NN4 9BG Registration Number: 3186364. -- 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: width and height of JPEG compressed images
Hi Sylwester, On 10 July 2013 20:44 Sylwester Nawrocki wrote: On 07/07/2013 10:18 AM, Thomas Vajzovic wrote: On 06 July 2013 20:58 Sylwester Nawrocki wrote: On 07/05/2013 10:22 AM, Thomas Vajzovic wrote: I am writing a driver for the sensor MT9D131. This device supports digital zoom and JPEG compression. The hardware reads AxB sensor pixels from its array, resamples them to CxD image pixels, and then compresses them to ExF bytes. Yes you are correct that the sensor zero pads the compressed data to a fixed size. That size must be specified in two separate registers, called spoof width and spoof height. Above CxD is the image size after binning/skipping and resizing, ExF is the spoof size. The reason for two numbers for the number of bytes is that as the sensor outputs the JPEG bytes the VSYNC and HSYNC lines behave as though they were still outputting a 2D image with 8bpp. This means that no changes are required in the bridge hardware. I am trying to make it so very few changes are required in the bridge driver too. As far as the bridge driver is concerned the only size is ExF, it is unconcerned with CxD. v4l2_pix_format.width= C; v4l2_pix_format.height = D; v4l2_pix_format.bytesperline = E; v4l2_pix_format.sizeimage= (E * F); bytesperline width (sizeimage % bytesperline) == 0 (sizeimage / bytesperline) height bytesperline has not much meaning for compressed formats at the video device (DMA) driver side. This is not true for the platform I am using. The Blackfin has a 2D DMA peripheral, meaning that it does need to separately know bytesperline and (sizeimage / bytesperline). These values have a physical hardware meaning in terms of the signals on the sync lines even though they do not have a logical meaning because the data is compressed. For compressed streams like JPEG size of the memory buffer to allocate is normally determined by sizeimage. It is two numbers in my use case. 'bytesperline' could be less than 'width', that means a virtual bits-per-pixel factor is less than 8. But this factor could (should?) be configurable e.g. indirectly through V4L2_CID_JPEG_QUALITY control, This is absolutely not a virtual width, it is a real physical property of the hardware signal. The hardware signal always has exactly 8 bits per sample, but its height and width (ExF) are not related to the image height and width (CxD). It is not appropriate to group the hardware data size together with compression controls for two reasons: Firstly, the bridge driver would need to intercept the control and then pass it on to the bridge driver because they both need to know E and F. Secondly, the pair of numbers (E,F) in my case have exaclty the same meaning and are used in exactly the same way as the single number (sizeimage) which is used in the cameras that use the current API. Logically the two numbers should be passed around and set and modified in all the same places that sizeimage currently is, but as a tuple. The two cannot be separated with one set using one API and the other a different API. and the bridge can query it from the sensor through g_frame_desc subdev op. The bridge has normally no clue what the compression ratio at the sensor side is. It could hard code some default bpp, but then it needs to be ensured the sensor doesn't transmit more data than the size of allocated buffer. It has no idea what the true compression ratio size is, but it does have to know the padded size. The sensor will always send exactly that size. But the question now is how does the bridge device communicate this to the I2C subdevice? v4l2_mbus_framefmt doesn't have bytesperline or sizeimage, and v4l2_mbus_frame_desc_entry has only length (which I presume is sizeimage) but not both dimensions. That's a good question. The frame descriptors really need more discussion and improvement, to also cover use cases as your JPEG sensor. Currently it is pretty pre-eliminary stuff, used by just a few drivers. Here is the original RFC from Sakari [1]. The version that has made it to kernel.org is much watered down from this proposal. It could be suitable for doing what I need if an extra member were added, or preferably there should be something like: enum { DMA_1D, DMA_2D, }; union { struct { // Valid if DMA_1D u32 size; }; struct { // Valid if DMA_2D u32 width; u32 height; }; }; Since we can't add bytesperline/sizeimage to struct v4l2_mbus_framefmt Isn't this a sensible case for using some of those reserved bytes? If not, why are they there? I think struct v4l2_mbus_frame_desc_entry needs to be extended and interaction between subdev ops like video.{s,g}_mbus_fmt, pad.{set,get}_fmt needs to be specified. Failing adding to v4l2_mbus_framefmt, I agree. I notice also that there is only set_frame_desc and get_frame_desc, and no try_frame_desc. In the only bridge driver that currently uses this interface, fimc-capture
MT9D131 context switching [was RE: width and height of JPEG compressed images]
Hi Sylwester, On 10 July 2013 20:44 Sylwester Nawrocki wrote: On 07/07/2013 10:18 AM, Thomas Vajzovic wrote: On 06 July 2013 20:58 Sylwester Nawrocki wrote: On 07/05/2013 10:22 AM, Thomas Vajzovic wrote: I am writing a driver for the sensor MT9D131. As a side note, looking at the MT9D131 sensor datasheet I can see it has preview (Mode A) and capture (Mode B) modes. Are you also planning adding proper support for switching between those modes ? I'm interested in supporting this in standard way in V4L2, as lot's of sensors I have been working with also support such modes. This camera has more like three modes: preview (context A) up to 800x600, up to 30fps, YUV/RGB capture video (context B) up to 1600x1200, up to 15fps, YUV/RGB/JPEG capture stills (context B) up to 1600x1200, sequence of 1 or more frames with no fixed timing, YUV/RGB/JPEG I have implemented switching between the first two of these, but the choice is forced by the framerate, resolution and format that the user requests, so I have not exposed any interface to change the context, the driver just chooses the one that can do what the user wants. As for the third mode, I do not currently plan to implement it, but if I was going to then I think the only API that would be required is V4L2_MODE_HIGHQUALITY in v4l2_captureparm.capturemode. Regards, Tom Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited Park Circle Tithe Barn Way Swan Valley Northampton NN4 9BG Registration Number: 3186364. -- 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: width and height of JPEG compressed images
Hi Sylwester, On 06 July 2013 20:58 Sylwester Nawrocki wrote: On 07/05/2013 10:22 AM, Thomas Vajzovic wrote: I am writing a driver for the sensor MT9D131. This device supports digital zoom and JPEG compression. The hardware reads AxB sensor pixels from its array, resamples them to CxD image pixels, and then compresses them to ExF bytes. fmt-width and fmt-height then ought to specify the size of the compressed image ExF, that is, the size specified is the size in the format specified (the number of JPEG_1X8), not the size it would be in a raw format. In VIDIOC_S_FMT 'sizeimage' specifies size of the buffer for the compressed frame at the bridge driver side. And width/height should specify size of the re-sampled (binning, skipping ?) frame - CxD, if I understand what you are saying correctly. I don't quite what transformation is done at CxD - ExF. Why you are using ExF (two numbers) to specify number of bytes ? And how can you know exactly beforehand what is the frame size after compression ? Does the sensor transmit fixed number of bytes per frame, by adding some padding bytes if required to the compressed frame data ? Is it something like: sensor matrix (AxB pixels) - binning/skipping (CxD pixels) - - JPEG compresion (width = C, height = D, sizeimage ExF bytes) I think you should use VIDIOC_S_FMT(width = C, height = D, sizeimage = ExF) for that. And s_frame_desc sudev op could be used to pass sizeimage to the sensor subdev driver. Yes you are correct that the sensor zero pads the compressed data to a fixed size. That size must be specified in two separate registers, called spoof width and spoof height. Above CxD is the image size after binning/skipping and resizing, ExF is the spoof size. The reason for two numbers for the number of bytes is that as the sensor outputs the JPEG bytes the VSYNC and HSYNC lines behave as though they were still outputting a 2D image with 8bpp. This means that no changes are required in the bridge hardware. I am trying to make it so very few changes are required in the bridge driver too. As far as the bridge driver is concerned the only size is ExF, it is unconcerned with CxD. I somehow overlooked the member sizeimage. Having re-read the documentation I think that in the user-bridge device the interface is clear: v4l2_pix_format.width= C; v4l2_pix_format.height = D; v4l2_pix_format.bytesperline = E; v4l2_pix_format.sizeimage= (E * F); bytesperline width (sizeimage % bytesperline) == 0 (sizeimage / bytesperline) height But the question now is how does the bridge device communicate this to the I2C subdevice? v4l2_mbus_framefmt doesn't have bytesperline or sizeimage, and v4l2_mbus_frame_desc_entry has only length (which I presume is sizeimage) but not both dimensions. Thanks, Tom Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited Park Circle Tithe Barn Way Swan Valley Northampton NN4 9BG Registration Number: 3186364. -- 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
width and height of JPEG compressed images
Hello, I am writing a driver for the sensor MT9D131. This device supports digital zoom and JPEG compression. Although I am writing it for my company's internal purposes, it will be made open-source, so I would like to keep the API as portable as possible. The hardware reads AxB sensor pixels from its array, resamples them to CxD image pixels, and then compresses them to ExF bytes. The subdevice driver sets size AxB to the value it receives from v4l2_subdev_video_ops.s_crop(). To enable compression then v4l2_subdev_video_ops.s_mbus_fmt() is called with fmt-code=V4L2_MBUS_FMT_JPEG_1X8. fmt-width and fmt-height then ought to specify the size of the compressed image ExF, that is, the size specified is the size in the format specified (the number of JPEG_1X8), not the size it would be in a raw format. This allows the bridge driver to be compression agnostic. It gets told how many bytes to allocate per buffer and it reads that many bytes. It doesn't have to understand that the number of bytes isn't directly related to the number of pixels. So how does the user tell the driver what size image to capture before compression, CxD? (or alternatively, if you disagree and think CxD should be specified by s_fmt(), then how does the user specify ExF?) Regards, Tom -- Mr T. Vajzovic Software Engineer Infrared Integrated Systems Ltd Visit us at www.irisys.co.uk Disclaimer: This e-mail message is confidential and for use by the addressee only. If the message is received by anyone other than the addressee, please return the message to the sender by replying to it and then delete the original message and the sent message from your computer. Infrared Integrated Systems Limited Park Circle Tithe Barn Way Swan Valley Northampton NN4 9BG Registration Number: 3186364. -- 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