Lvgl buffer size cf-- color format for generated image. Essentially I don't want to resize the dma descriptor between flushes and keep it consistant. I have been using the sample demo code void lv_example_canvas_1(void) that comes with lvgl/demos. So I set the draw buffer to 1/8 as 38400. full_refresh = 1. 0, I’ve tried to create objects and control touch actions. For the double buffer, I am using two LvGL buffer to render the picture on the scree. These calculations are done on blocks the size of your draw buffers. There is no reason to have it set to 10. What MCU/Processor/Board and compiler are you using? STM32F746G-DISCO board What do you want to achieve? Put buffer into external SDRAM and use a full display sized memory use I believe. There seems to be a cap of _LV_MASK_BUF_MAX_SIZE which is defined by default to 2048 bytes (see here). The ESP32 does not have enough SRAM to hold a whole screen frame buffer let alone 2 if you are using double buffer. Through my exploration, I observed that employing two full-screen frame buffers consistently resulted in a frame rate of approximately 4 or 5 FPS. out_buf_size – size of the output buffer in bytes LVGL needs just one simple driver function to copy an array of pixels into a given area of the display. In the display driver (lv_disp_drv_t) enabling the full_refresh bit will force LVGL to always redraw the whole screen. Having it be portable is easy to do. it’s your hardware specifically the RAM allocation. So lvgl will use the 1/4 of the buffer. 8 What do you want to achieve? multiple displays with one screen each and update text > #include <SPI. h> #define SPI_FREQUENCY 27000000 #define NUM_DISPLAYS 3 #define BUFFER_SIZE Can I do this in a custom display driver, or do I need to change the LVGL source code? And I’m wondering if not someone has already done something for a fast VSYNC and double buffer implementation, looks like general a requirement you often have for high performance displays with 60 Hz update rate, if you want to avoid a tearing effect. why is this? #define LINE LVGL Forum Buffer size and flushing action. So you have to find a balance here. Double buffering * Set 2 screens sized buffers and set disp_drv. modify more large size => LV_MEM_SIZE (@lv_conf. show post in topic. 2 Open main menu. jpg 3408×2133 2. 1 What do you want to achieve? I want to use 2 full screen size buffer in direct render mode. x. Code to reproduce Right now, the code looks I have tried separating the draw buffer into 1/8 of the displaybuffer. Display buffers are critical for rendering graphics but can consume significant memory. I don’t think that I have a memory leak, since I initialize all the styles only at startup and the Introduction. Is it due to full-refresh mode? In the LVGL Doc it`s explained like this draw buffer(s) needs to be screen sized. use static buffer => static lv_color_t color_buffer[] 3. The buffer size is 76800 for each of the buffers. width – width of the buffer . If full_refresh is enabled and two screen sized draw buffers are provided, LVGL's display handling works like "traditional" double buffering. Where can I ask LVGL allocates two buffers of size glyph_width * glyph_height. buf_size-- provided buffer size in bytes. pabian October 24, 2019, 6:11am 16. dmasar October 26, Hi @pete-pjb and @xennex, To be sure we are on the same page I’d like to clarify the difference between v7 and v8 in this regard. out_buf – pointer to the output buffer . I’ve read that in direct mode, LVGL first redraws all the dirty areas in the screen-sized buffer and then calls the flush function, then in that case what is the meaning of checking lv_disp_flush_is_last(drv) == true because only 1 chunk is being flushed right? (Q1) This way the buffers can be smaller then the display to save RAM. What do you want to achieve? Fully DMA without waiting in while(); What have you tried so far? I use two buffers sized 240x30x2, 240 X , 30 Y and two byte. which means any frame buffer is going to be stored in SPIRAM. I think the problem is that memory is being dynamically allocated using malloc() (or similar) and it must not be getting freed. Flush callback should receive array of invalidated areas, so smallest possible I can imagine this: Declare DMA_ATTR lv_color_t buffer_a[ pixels_size * 4]. I came across LVGL while looking for a graphics library to use in my personal project. *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes. Based what I understand is that the flush cb has to call a function tha sends the data to the screen. To work with lower LV_MEM_SIZE you can create Widgets only when required and delete them when they are not needed anymore. Dynamic buffer If you are using Cortex-M7, it might be worthwhile to try disabling the cache temporarily. static I conducted experiments on a customized ESP32 S3-powered board with 16 MB of flash, running at a clock speed of 160 MHz. kisvegabor October 30, 2020, 1:22pm 4. Caching works fine, in principle, for the LCD - if I just have a single cached buffer and memcpy to it from the lvgl Library for EEZ Flow and EEZ-GUI. You can probably reduce the size to 1/4 or potentially even lower if your system is fast enough without seeing a noticeable performance drop. Draw the icon or text fill on the camera display, buffer size is **800X50** Because there is not enough memory on my device, so when switch between function 1 and function 2, I need to exit lvgl each time, and then reinit lvgl with the new buff size. x, for LV_COLOR_DEPTH 16, I was using the following: lv_canvas_set_buffer(stormlapse_canGraph, lightGraphBufStart, 474, 110, LV_IMG_CF_INDEXED_4BIT) The buffer referenced by lightGraphBufStart was sized at 52,140 bytes (474 * 110 * 4 bits) and everything worked smoothly. It may vary between different color formats and hardware. mp4 I don't know exactly why this happens. jpg 3135×1951 1. The implementation of lv_canvas_copy_buf basically calls (ESP32 document about DMA-Capable memory allocation). buf2, buffer_size, LV_DISPLAY_RENDER_MODE_DIRECT); } Description I’d like to be able to draw a png to the display from a plain pixel array. The buffer can be smaller than the screen. Here one of the two problems can be observed: as soon as an object is used/touched, it gets multiplied one time to the right, with slight When true double buffering is enabled, flush callback always receive area equal of LCD size. Some special purpose defines are also introduced: LV_OPA_TRANSP Value: 0, means no opacity making the color completely transparent. LV_DRAW_BUF_STRIDE (w, cf) Stride alignment for draw buffers. buf1 0x2000cba8 0x5a00 . ~1 FPS), and some of them are more There are 3 possible configurations regarding the buffer size: One buffer LVGL draws the content of the screen into a buffer and sends it to the display. Then get one call to flush once the frame is config LVGL_VDB_SIZE int "Rendering buffer size" range 1 100 default 10 depends on LVGL help Size of the buffer used for rendering screen content as a percentage of total display size. BTW If you are not already aware the example projects included with NXP’s SDK are based on V7 and configured to use full size double buffers for all LVGL certified boards from NXP. Is there another way to You can decrease the size of the display buffers by setting the factor argument in ili9341 constructor. Internal frame buffers if your device supports these, this may be the size of your entire display I don’t know if the ESP32-WROOM-32E-N16 has this- but on an MCU I use this takes up about 260 KB of RAM already. What LVGL version are you using? 9. Use LVGL on the receiving end with the built in SDL driver. The official LVGL guide recommends choosing the size of the drawing buffers of at least 1/10 of the ocument provides steps, how to set up your LCD and LVGL port f. Returns. Description What MCU/Processor/Board and compiler are you using? LVGL 9. buf-- the buffer to store image data. Also if double buffering is not being used there are no benefits to be had from using DMA memory. pabian October 18, 2019, 2:39am 8. (Old v7 behaviour) LVGL Forum Buffer size and flushing action. How-to. Setting factor to 8 means that the buffer will be 1/8 of the display and the Increase this to allow more stops. I do know that it should be set to the size of the buffer when DMA memory is being used. h) so that LVGL can retrieve the current time directly. Optimizing their usage is essential for efficient memory management with LVGL ESP32. When framebuffers are located in cached memory, CPU cache need to be flushed for large memory block before the buffer can be processed by LCD controller. . LVGL draw buffer(s): these are used for the partial draw operations if you use those. But in the draw_bg() in lv_draw_sw_rect. These are used by lvgl to do the actual graphic drawing calculations. Call lv_init() Create a draw buffer: LVGL will render the graphics here first, and send the rendered image to the display. v7 If you set 2 screens sized buffers, v7 worked in a special “true double buffered mode”. This is set to 8192. use malloc() (system memory is large enough, usually apply in simulation mode) but take errors to lvgl objects in now on cube ide. However, I discovered that by using a framebuffer with a size 0. h. The behavior I’m after is all drawing is done into the full size frame buffer, I don’t see the point of drawing it into small buffers, then copying it to the frame buffer. g. So I assumed that the dirty; redrawn areas are given in the flush_cb. obj-- The object to generate snapshot. So, as usual, your mileage may vary. What I’d like to know what the correct display buffer size should be for my 7 inch display and if I should be using 2 or 1 of them LVGL supports double-buffer so the display driver can DMA data in the background from one buffer in the same time LVGL renders into the other buffer. The Linux framebuffer (fbdev) is a linux subsystem used to display graphics. Neither lv. Description Hello for LVGL 9 I was trying to integrate a display, so for initialising the display there was an API named lv_display_set_buffers(display, buf1, buf2, buf_size_byte, render_mode), so I want to know what wil Hello, It needs to be set to the size of one buffer in bytes. What MCU/Processor/Board and compiler are you using? Linux dev env What LVGL version are you using? v9 What do you want to achieve? I have the raw bytes of the image that I request using curl and I want to render on the screen but for some reason doesn’t work. Where can I ask What LVGL version are you using? 7. One thing with LVGL is you also need memory for objects info (the one for LV_MEM_SIZE). In flush_cb you can rearrange the bytes into the same buffer with a for cycle (starting from the end to not overwrite the content). But if I decrease the buffer size, the screen doesn’t display correctly. What have you tried so far? Using two Description Through simple example for LVGL6. (try 2,4,8,16,32,64, choose the lowest value that works for you. I am working with esp32 and currently I am an ili9488 controller. 4. Contact us if you need Description Through simple example for LVGL6. 1 yanked; 9. 3. The buffer size if 150KB (76800 * 2byte per pixel) which will holds the pixel information. This means an object's bounding box will be enlarged with the addition of padding. Description What MCU/Processor/Board and compiler are you using? esp32 What LVGL version are you using? v8. I don’t The receiving end would need to know the size of the display that is being simulated, and the color format of the display. Navigation Menu draw_buf_size *= LV_LINUX_FBDEV_BUFFER_SIZE;} However, there is no LV_DISPLAY_RENDER_MODE_PARTIAL in lv_conf. I need some more clarity regarding the implementation. Increase the size of the display buffer. **Services**<br> Our team is ready to help you with graphics design, UI implementation and consulting services. If you can do this with your display then you can use it with LVGL. So if you have a display with 16-bit colors, one pixel would use two bytes. LVGL Forum Buffer size and flushing action. Canvas is always blank I am have been developing an application using SDL (eventually to be run on Raspi) and things were going smoothly so far, until i tried to draw a custom shape using canvas. 3 the relative function does not include the portion that sends the data to the screen using spi etc so I LVGL version 9. Parameters: buf – pointer to the buffer to be converted . Personally in my use case for display of (320240) I use two buffers of size 3205*lv_color_t and I am satisfied with FPS. CD performance (FPS). Blockquote It’s an A5. 0; 8. But Description Through simple example for LVGL6. In LVGL 8. With 2 buffers the buffers' content are kept in sync automatically. The documentation is being updated continously to match to code. To describe opacity the lv_opa_t type is created from uint8_t. lv_color_white() and lv_color_black() return 0xFFFFFF and 0x000000 respectively. Detail of component lvgl/lvgl - 9. This is quite slow operation. 7. I was able to develop custom driver for SDRAM on STM32F429 Discovery board with 8MB in size. It is somewhat working (image displays but it is very distorted) but there seems to be an issue with the colour format and I * BSP example `display_lvgl_demos` with `ws_7inch` component * LCD: 7" 800x480 * Intarface: 16bit parallel Intel 8080 * LCD IO clock: 20 MHz * LVGL buffer size: 800 x 50 * LVGL double buffer: YES * Optimization: Debug * CPU frequency: 160 MHz * Flash frequency: 80 MHz * Flash mode: DIO * LVGL display refresh period: 30 ms ### Internal RAM with DMA Set task_max_sleep_ms to big value, the LVGL task will wait for events only. 2. What MCU/Processor/Board and compiler are you using? STM32F767II, IAR Workbench What do you want to achieve? I wou Lower the size of the Display buffer. ) Remote control for LVGL apps over WiFi I’ve built a library that allows you to view your LVGL based application (in my case, let alone two full-screen sized buffers with DMA transfer. This means the flush_cb callback only has to update Custom Buffersize. 1. (The ‘depends on’ condition includes propagated dependencies from ifs and menus. How do I use LVGL with an operating system? Description MCU goes to HardFault_Handler if I put buffer to external SDRAM and press any key on on screen keyboard. h> #include <lvgl. The author never wrote this for that scenario, nor made that claim, Full refresh¶. 0; 9. Previous LVGL drawing buffer static lv_color_t buf1[240 * 320 / 10]; static lv_color_t buf2[240 * 320 / 10]; . It seems external ram leads to high cpu usage. The full LCD buffer is located at the external SDRAM as following: __attribute__ Hi @kisvegabor, on my project lvgl has the following functions:. The LVGL task can sleep till these situations: LVGL display invalidate; LVGL animation in process; Touch interrupt; Button interrupt; Knob interrupt; USB mouse/keyboard interrupt; Timeout (task_max_sleep_ms in configuration structure) User wake (by function lvgl_port I can tell you this for a fact. LV_DISPLAY_RENDER_MODE_DIRECT The buffer(s) has to be screen sized and LVGL will render into the correct location of the buffer. Normal case Buffer size = 480 x 1; Normal case Buffer size Alternatively, configure LV_TICK_CUSTOM (see lv_conf. At least 1/10 sceen size buffer(s) are recommended. I see, then it looks good. Docs; Blog; Sign in; lvgl/lvgl 9. height – height of the buffer . Other examples in lv_tutorials folder seem to work flawless. In port examples in v8. This way a display sized buffer can be created on the receiving end. *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again. I am using lodepng (specifically lodepng_decode32_file) to put the decoded png into memory and creating a lv_img_dsc_t variable to pass to lv_image_set_src. it’;s not LVGL. I have Built-in colors . What MCU/Processor/Board and compiler are you using? STM32F767II, IAR Workbench What do you want to achieve? I wou Description I’m trying to display a sensor data in a display with LVGL What MCU/Processor/Board and compiler are you using? ESP32 NodeMCU and ILI9341 and Arduino IDE What LVGL version are you using? But the DEMO_FB_SIZE is too big which is 480x640x2,so I have to place the variable to SDRAM. It makes rendering and flushing parallel. Refine it to suit your needs. Opacity . lv_disp_buf_init(&lvDisplayBuffer, lvBuffer1, NULL, LV_BUFFER_SIZE); I set this up so that I could use multiple buffers if required - I have disabled lvBuffer2 (for those of you you who are trying to setup multiple buffers). I tried to run the dma in tft_flush function when only y_fill_act is smaller than y2_fill. LVGL Forum Figuring out display buffer size. bss. Gui window management, buffer size **800X600** 2. the percentage of time spent on LVGL rendering vs buffer transfer to the TFT, etc. Hi, I have a display with 240x240 resolution, what would be the most optimized way to define rendering buffers? Documentation states that it should be 1/10 screen sized buffers, what does it actually mean? If my resolution is 240x240, then frame buffer should be 1/10 * It needs to be set to the size of one buffer in bytes. I am seeing an empty square being rendered. So if you have a display with 16-bit colors buffer size < 480x272 -> flush function may be OK, But when clicked the button, weird display as shown below 20191010_120744. If only small areas of the screen are updated then smaller buffers would work well. kisvegabor October 22, 2019, 4:17am 13. It’s strange that destination is the same value in the last two “blocks”. 99 times that of the screen, In the second one, VDB was enabled (in external SDRAM, buffer size = screen size). Key features; Requirements; License; Repository layout; Release policy. buf_size – size of the buffer in bytes . Release cycle; Branches; Change log; Version support; FAQ. This means the flush_cb callback only has to update Description I’m using LVGL in FreeRTOS with the LV_MEM iwith a size of nearly 5 MB in external SDRAM but still I’m getting the message “Out of memory, can’t allocate a new buffer (increase your LV_MEM_SIZE/heap size)” from time to time (most of the time it works fine). Home ; Categories ; FAQ This has a pretty decent boost in performance when the program doesn’t have to sit around and wait for the buffer to get emptied before it is able to do any more work. Now - I need 16bit colour and there is insufficient RAM to buffer this (I have no control over the hardware) - so the LVGL library seem to offer this. Buffers need to be at least 1/10th of the display buffer size (and I tried several sizes both dynamically and statically allocated) Description Need help to render an image from buffer. If the font is big enough, this may be a significantly large buffer. 1 + ESP32S3 with platformIO (framework : Arduino) Library use to drive screen : LovyanGFX Screen used : ILI9488 What LVGL version are you using? LVGL 9. During Therefore it's recommended to choose the size of the draw buffer(s) to at least 1/10 screen sized. 2 Platform ESP_IDF , eps32s3 with 8MB external psram What happened? The lv_lottie_set_buffer is not able to set more than 180 *180 buffer even though psram is enabled and set to allocate by malloc() How to reproduce? Cod I am using the FMC peripheral and parallel interface of my microcontroller and I was looking into the best approach for sending the frame update to the LCD. This memory is used when you create Widgets like buttons, labels, etc. Dear Friend: I have a board which running lvgl-7I already immigrate the latest png decoder into the project. LV_RES_OK on success, LV_RES_INV on Description My project is a 800x480 screen in a board that also includes a microSD slot, so, my goal is to load images from the microSD to the screen, my code compiles and works on the ESP32-S3, but I always get white screen and the same error: [Error] (0. tft_flush with dma in double buffer dose work properly. Contribute to eez-open/eez-framework development by creating an account on GitHub. 9. Parameters. This is Description How the flush function works as process and consept. Fuzzy graphics with external SDRAM. If only one buffer is used LVGL draws the content of the screen into that draw buffer and Therefore it's recommended to choose the size of the draw buffer (s) to be at least 1/10 screen sized. This way the buffer always contain the whole image. Use two display buffers and flush the buffer with DMA (or similar peripheral) Does having a full screen buffer results in a significantly faster screen refresh compared to let’s say a half or quarter screen buffer?. It this case flush_cb will be called only once when all dirty areas are redrawn. LV_OPA_10 Value: 25, means the color covers only a little The conversion assumes that the buffer width and height is rounded to a multiple of 8. draw_buf_create() will not allocate DMA-capable Introduction. 1. The size would then be ( (400 * 200) * sizeof In LVGL, an lv_display_t (not to be confused with a Screen) is a data type that represents a single display panel — the hardware that displays LVGL-rendered pixels on your device. LV_DRAW_BUF_SIZE (w, h, cf) Allocate a slightly larger buffer, so we can adjust the start address to meet alignment Full refresh¶. b instead the display stores the color format, and the pixel size is calculated from it. you are using pre LVGL configured to work with a standard Linux framebuffer - Some bug-like issues · Issue #44 · lvgl/lv_port_linux. What MCU/Processor/Board and compiler are you using? STM32F767II, IAR Workbench What do you want to achieve? I wou The above functions set the size of an object's bounding box but the size of the content area can be set as well. 566, +566) block_locate_free: Asserted at expression: block_size(block) >= size lv_tlsf. It really depends on your use case. h, and perhaps more details are needed Using the current LVGL master or stable, as soon as the double buffering and direct render mode is on, the bar animation is glitchy lvgl. h) 2. It I have enough memory in DDR I’m wondering if LVGL can be made to use a more conventional mechanism of having a double-buffer of size for the full frame and have LVGL redraw the entire screen for each new frame it wants to output and simply Use this value to let LVGL calculate stride automatically . again this is more memory use when it doesn’t need to be used. Regarding buffer size, from my experiments factor of 4 gives good results. TL;DR Larger buffers are better on modern LVGL versions. h> #include <ui/ui. Two screen-sized buffers - After calling flush_cb, the first buffer, if I was wondering if it is possible to have lvgl output a full buffer each time (LV_VDB_SIZE) and not allow arbitrary smaller sizes? I am trying to use DMA and I can do a quick integration if I can keep the buffer size the same between flushes. 0. and I changed the memory request and free by below but the issue is the buffer of PNG decoding need really biglike 3screen widthscreen heightis there a way I can directly usie the lvgl disp buffer for decoding and display directly #ifdef LVGL Forum Buffer size and flushing action. The buffer size can be The size must be large enough to hold the data you are wanting to copy and the color format must match the Are you sure it is to copy FROM the canvas? In LVGL 8 it copied an external buffer TO the canvas and as I mention below, it copies TO the canvas in LVGL 9. It worked like this: Render invalid areas to the inactive buffer Swap the buffers Copy the redrawn areas to new inactive buffer to have them the same Take snapshot for object with its children, save image info to provided buffer. The DMA_TransferComplete function has been used before. c the function continued to draw the buffer over the draw buffer size so it will cause memory overwrite. This works in both one buffer and two buffers modes. pabian October 21, 2019, 2:32am 10. I hope i have * It will enable LVGL to draw the next part of the screen to the other buffer while * the data is being sent form the first buffer. It is a hardware-independent API that gives user space software access to the framebuffer (the part of a computer's video memory containing a current video frame) using only the Linux kernel's own basic facilities and its device file system interface, avoiding the need for #define LVGL_PORT_RGB_BOUNCE_BUFFER_SIZE (LVGL_PORT_DISP_WIDTH * 12) this can seemingly handle a few buttons, but the issue comes back when I run the keypad example which has 12 buttons. 3 and at least an 1/10 screen sized buffer for rendering. *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ #define LV_GRADIENT_MAX_STOPS 2 /*Default gradient buffer size. Linux Framebuffer Driver Overview . but single buffer still dose not work. set the DISP_BUF_SIZE like: #if defined (CONFIG_CUSTOM_DISPLAY_BUFFER_SIZE) #define DISP_BUF_SIZE CONFIG_CUSTOM intr_alloc: Connected src 16 to int 12 (cpu 0) I (2880) Two non-screen-sized buffers - LVGL can immediately draw to the second buffer when the first is sent to flush_cb because the flushing should be done by DMA (or similar hardware) in the background. These 2 lines allocate memory which can be accessed by DMA, and returns void *, so a simple memory area, and it cannot be passed to lv_display_set_draw_buffers(lv_display_t * disp, lv_draw_buf_t * buf1, lv_draw_buf_t * buf2), which was refactored in this PR. I am using DMA2D (Chrom-Art Accelerator™ controller) to transfer data from the LvGL buffer to the screen Description How can I convert uint32_t image_buffer so that i could set it as image src into lv_img_set_src(img, src) What MCU/Processor/Board and compiler are you using? Kendryte K210 processor, KD233 dev board What LVGL version are you using? V7. Reduce LV_MEM_SIZE in lv_conf. lv_obj_set_content_width ( obj , 50 ); //The actual width: padding left + 50 + padding right lv_obj_set_content_height ( obj , 30 ); //The actual width: padding top + 30 + padding bottom I don’t actually think I need to increase the LV_MEM_SIZE/heap size. That in theory should result into a max of 4 kB per glyph. There are several settings to adjust the number draw buffers and buffering/refreshing Note: The buffer size must be customized according to the system available memory. The size of LVGL buffer and double buffering feature has big impact on performance. buffer sizes should be about 1/10th the total size of the Normal case Buffer size = 480 x 1 Normal case Buffer size = 480 x 272 Abnormal case: occurs when y_fill_act > y2_fill Buffer size = 480 x 2 ~ 480 x 271 ex: Buffer size = 480 x 10. Only the changed ares will be updated. I don’t know why the buffer should be so high. But still, tell LittlevGL you have pixels_size buffers. 0 What do you want to achieve? I’m trying to preview my camera feed in to lv_img object. enumerator LV_DISPLAY_RENDER_MODE_DIRECT The buffer(s) has to be screen sized and LVGL will render into the correct location of the buffer. Some options yield only small difference in FPS (e. Raspberry PI Zero W What LVGL version are you u Description I’m using a raspberry PI Zero W and was wondering what the correct display buffer(s) should be set to. For the DMA. 77 MB Next to the framebuffer you also have one or two lvgl draw buffers. c:774 What Item #2: Two external buffers were used previously in V7 and worked perfectly so there is clearly some significant change in V8 wrt updating/refreshing regions. At least 1/10 screen size buffer(s) are recommended. Frame buffer size >25% of the screen does not bring relevant performance boost; Frame buffer size <10% will have severe negative effect on performance; Note: The measurements are valid for frame buffer in internal SRAM. Obviously it has a performance impact. Skip to content. 05 MB 20191010_120732. trans_queue_depth should be set to 1. My panel’s resolution is 1280*720, and I only have a 256K ram can be used. * * 3. dsc-- image descriptor to store the image result. xnmqj azcexb onkr yzzzc ktibwpnj yjjsx bsmjbm kby enuruk jwqhv