# Enciris Technologies > Professional video capture cards, 4K cameras and edge AI platforms, engineered and manufactured in France for demanding OEM applications. ISO 9001 certified, REST API and long-term support. > Generated by All in One SEO Pro v5.0.3, this is an llms-full.txt file, used by LLMs to index the site. ## Posts ### [Enciris Adds 4K Compositing Features to Entire LT-300 Family](https://www.enciris.com/news/enciris-adds-4k-compositing-features-to-entire-lt-300-family/) **Published:** October 26, 2023 **Author:** Luke Montgomery **Excerpt:** Enciris Technologies rolls out new compositing features for LT-300 series of 4K Capture Cards, allowing multiple incoming video streams to be combined **Content:** ## **Easy to use features roll-out in software update** Gaillac, France – 26th October 2023 – Enciris Technologies has extended the functionality of the 4K-compatible LT-300 series of Capture Cards to include new compositing features, allowing easily arrangement of two, three or four captured video inputs. Applications for compositing include video wall, 3D and other medical or industrial applications where it is useful to be able to combine multiple incoming video sources into a single output stream. The LT-300 products also include overlay features for text, shape(s) and image(s) with alpha blending, allowing image-injection of overlays, templates and text onto the incoming video via the direct output. The new compositing features are available via a free software-update 🙂. Contact Enciris for more details. Visit us at the Enciris Booth at Medica in Düsseldorf ([Hall 15, Stand E10-1](https://www.medica-tradefair.com/vis/v1/en/exhprofiles/VWV4GqsuQUaBdPcgczSqCw)) from 13th – 16th November 2023. For more information [reach out to us now](https://www.enciris.com/contact-page/contact-page-no-sidebar/), or [visit us at Medica](https://www.medica-tradefair.com/vis/v1/en/exhprofiles/VWV4GqsuQUaBdPcgczSqCw). Click [here](https://www.einpresswire.com/article/664325093/enciris-adds-4k-compositing-features-to-entire-lt-300-family "EIN Press Wire ") to view the original Press Release. **About Enciris Technologies** Enciris Products are Engineered and built in France. The Enciris story started in 2006 with a vision to make a range of accessible high performance video capture products using the latest, state-of-the-art technology. The company has evolved to become a leading designer and manufacturer of high-performance video processing hardware for OEMs, system integrators, embedded systems, and professional users. Enciris provides solutions for customers to add Ultra HD 4K/Full HD/SD camera technology, video acquisition, hardware compression, video routing, video format conversion, video overlay, video streaming and storage capabilities. We design for ultra-high reliability and Long-Term Support (LTS). [www.enciris.com](http://www.enciris.com) Enciris is an ISO9001:2015 company. **Categories:** News **Tags:** Overlay, LT-300 --- ### [Enciris Launches 4K Remote Head Camera & Camera Control Unit](https://www.enciris.com/news/enciris-launches-4k-remote-head-camera-camera-control-unit/) **Published:** November 1, 2023 **Author:** Luke Montgomery **Content:** ## ****New compact microscopy camera features large half-inch native 4K CMOS chip for highest image quality****. Gaillac, France – 3rd November 2023 – Enciris Technologies is announcing today the launch of its 4K remote head camera and camera control unit (CCU) which features crystal clear native Ultra HD 4K resolution, half-inch 10-bit sensor and image processing combined with super-fast latency performance. The camera and CCU will be shown on the Enciris Booth at Medica in Düsseldorf – ([Hall 15, Stand E10-1](https://www.medica-tradefair.com/vis/v1/en/exhprofiles/VWV4GqsuQUaBdPcgczSqCw)) from 13th – 16th November 2023. “There is full auto-exposure, sharpness controls, advanced de-noise filtering, binning modes and low-light enhancement, all of which work together to provide ultra-clear, ultra-low-noise imagery in almost all possible lighting conditions.” Commented Phillip Weissfloch, CEO. The new camera is compatible with C-Mount lenses or optionally available as a module version for integration into medical equipment such as microscopes and endoscopes. With an ultra-compact low-power design, the camera sensor typically consumes just 1.5W and offers extended temperature operation. The accompanying Camera Control Unit (CCU) features 10-bit video processing, four direct 3G/12G SDI outputs and a HDMI 4K output. For more information [reach out to us now](https://www.enciris.com/contact-page/contact-page-no-sidebar/), or [visit us at Medica](https://www.medica-tradefair.com/vis/v1/en/exhprofiles/VWV4GqsuQUaBdPcgczSqCw). Click [here](https://www.einpresswire.com/article/666055682/enciris-launches-4k-remote-head-camera-and-camera-control-unit) to view the original Press Release. **About Enciris Technologies** Enciris Products are Engineered and built in France. The Enciris story started in 2006 with a vision to make a range of accessible high performance video capture products using the latest, state-of-the-art technology. The company has evolved to become a leading designer and manufacturer of high-performance video processing hardware for OEMs, system integrators, embedded systems, and professional users. Enciris provides solutions for customers to add Ultra HD 4K/Full HD/SD camera technology, video acquisition, hardware compression, video routing, video format conversion, video overlay, video streaming and storage capabilities. We design for ultra-high reliability and Long-Term Support (LTS). [www.enciris.com](http://www.enciris.com) Enciris is an ISO9001:2015 company. **Categories:** News **Tags:** CV-400 --- ### [Enciris Launches 4K Recording, AI & Processing Board](https://www.enciris.com/news/enciris-launches-4k-recording-ai-processing-board-based-on-nvidia/) **Published:** November 2, 2023 **Author:** Luke Montgomery **Content:** ## ***New Enciris CH-1001 Processor board based on NVIDIA makes integration easier***. Gaillac, France – 2nd November 2023 – Enciris Technologies is announcing today the launch of a new 4K video recording and AI processing board featuring a horizontal PCIe slot to partner with any 4K / HD Enciris capture or frame grabber card. The new board comes with provision for multiple NVIDIA processor options, offering differing RAM and FLASH to provide maximum flexibility for different medical use cases. The small form-factor also facilitates easy integration into a compact enclosure. “This is an exciting new development for Enciris – to release a complimentary processing board which can be used with video capture and camera solutions to form a complete video processing solution” Stated Phillip Weissfloch CEO, adding “The new board is equipped with all the connectivity a typical medical OEM requires, offering four USB 3.0, Gigabit Ethernet, SD Card slot and 4K HDMI output.” This product will debut on the Enciris Booth at Medica in Düsseldorf ([Hall 15, Stand E10-1](https://www.medica-tradefair.com/vis/v1/en/exhprofiles/VWV4GqsuQUaBdPcgczSqCw)) from 13th – 16th November 2023. For more information [reach out to us now](https://www.enciris.com/contact-page/contact-page-no-sidebar/), or [visit us at Medica](https://www.medica-tradefair.com/vis/v1/en/exhprofiles/VWV4GqsuQUaBdPcgczSqCw). Click [here](https://www.einpresswire.com/article/665842884/enciris-launches-new-4k-recording-ai-and-processing-board-based-on-nvidia) to see the original press release. **About Enciris Technologies** Enciris Products are Engineered and built in France. The Enciris story started in 2006 with a vision to make a range of accessible high performance video capture products using the latest, state-of-the-art technology. The company has evolved to become a leading designer and manufacturer of high-performance video processing hardware for OEMs, system integrators, embedded systems, and professional users. Enciris provides solutions for customers to add Ultra HD 4K/Full HD/SD camera technology, video acquisition, hardware compression, video routing, video format conversion, video overlay, video streaming and storage capabilities. We design for ultra-high reliability and Long-Term Availability (LTA). [www.enciris.com](http://www.enciris.com) Enciris is an ISO9001:2015 company. **Categories:** News **Tags:** CH-007, Edge AI --- ### [Enciris Demonstrates 4K Endoscopy/Microscopy Camera Modules at Medica show in Dusseldorf](https://www.enciris.com/news/enciris-demos-4k-endoscopy-microscopy-camera-at-medica-show-in-dusseldorf/) **Published:** November 17, 2023 **Author:** Luke Montgomery **Content:** ## ****Visual Performance Leadership Attracts OEM’s****. The Enciris Team are delighted with the huge response to our new 4K Camera Modules from the Medica Show. We set up one of our Housed Demo Cameras units trained on some skittles and projected the images onto overhead TV’s on the show stand. The crowds came and paused, then often asked about the striking image quality 🙂. We had many scores of new customers returning back to look again and again at the stunning visuals from our camera. After so much work that went into our products, it is absolutely wonderful to have such a strong response. Thank you everybody that stopped by our stand. **About Enciris Technologies** Enciris Products are Engineered and built in France. The Enciris story started in 2006 with a vision to make a range of accessible high performance video capture products using the latest, state-of-the-art technology. The company has evolved to become a leading designer and manufacturer of high-performance video processing hardware for OEMs, system integrators, embedded systems, and professional users. Enciris provides solutions for customers to add Ultra HD 4K/Full HD/SD camera technology, video acquisition, hardware compression, video routing, video format conversion, video overlay, video streaming and storage capabilities. We design for ultra-high reliability and Long-Term Availability (LTA). [www.enciris.com](http://www.enciris.com) Enciris is an ISO9001:2015 company. **Categories:** News **Tags:** CV-400, Events --- ### [New Enciris Remote Head Camera Module delivers Stunning Ultra HD 4K Imagery with Rich Vibrant Colour Rendition](https://www.enciris.com/news/new-enciris-remote-head-camera-module-delivers-stunning-ultra-hd-4k-imagery-with-rich-vibrant-colour-rendition/) **Published:** December 12, 2023 **Author:** Luke Montgomery **Content:** ## *Medical OEM’s can benefit from Enciris technologies’ performance milestone* Gaillac, France – Enciris Technologies is announcing today the launch of the new CV-40 remote head camera module and CV-42 Camera Control Unit (CCU) capture card. The camera module and CCU both feature native Ultra HD 4K resolution, 10-bit sensor and image processing combined with blazingly fast sub-frame latency. The new camera is supplied as a module for direct integration into medical equipment such as endoscopes and microscopes. With an ultra-compact low-power design, the camera sensor typically consumes just 1.5W and offers extended temperature operation. There is full auto-exposure, variable exposure window, sharpness controls, advanced de-noise filtering, binning modes, digital zoom and low-light enhancement, “all of which work with the on-board Enciris processing to provide rich and vibrant colours and life-like imagery in nearly all possible lighting conditions” stated Phillip Weissfloch, CEO, adding “In addition, the CV-42 CCU board can be combined with our [newly released CH-1001 recording and AI processing board](https://www.enciris.com/4k-capture/enciris-launches-4k-recording-ai-processing-board-based-on-nvidia/) to form a complete AI-capable endoscope processing and recording solution” The CV-42 capture card offers less than one frame latency including overlay capabilities and also provides 10-bit video processing, PCIe 4xGen 2 bus, four direct 12G SDI outputs and a HDMI 4K output. The on-board overlay functions allow for text, shape(s) and image injection with alpha blending, enabling customers to inject their own overlays and templates onto the incoming camera video, for example to display patient data. In addition, the CV-42 also supports the new Enciris-Empowered API with simultaneous multi-channel capture for Windows, Linux, Direct Show, Python, C++, C#, .NET and Golang. The new API runs as a service and reduces time to market due to the fact that typical customer use-cases are less than 100 lines of code. **About Enciris Technologies** Enciris Products are Engineered and built in France. The Enciris story started in 2006 with a vision to make a range of accessible high performance video capture products using the latest, state-of-the-art technology. The company has evolved to become a leading designer and manufacturer of high-performance video processing hardware for OEMs, system integrators, embedded systems, and professional users. Enciris provides solutions for customers to add Ultra HD 4K/Full HD/SD camera technology, video acquisition, hardware compression, video routing, video format conversion, video overlay, video streaming and storage capabilities. We design for ultra-high reliability and Long-Term Availability (LTA). [www.enciris.com](http://www.enciris.com) Enciris is an ISO9001:2015 company. **Categories:** News **Tags:** CV-400 --- ### [Enciris Confirms Attendance Medica 2024](https://www.enciris.com/news/enciris-confirms-attendance-medica-2024/) **Published:** June 21, 2024 **Author:** Luke Montgomery **Content:** Following an incredible week at MEDICA last year, I am delighted to announce we are re-attending this year. Are you curious to know what we are going to be showing 🙂 ? **Categories:** News **Tags:** Events --- ### [Count down to Medica (11th – 14th November, Dusseldorf)](https://www.enciris.com/news/count-down-to-medica-11th-14th-november-dusseldorf/) **Published:** September 9, 2024 **Author:** Luke Montgomery **Content:** Preparations are underway here for our participation at Medica in Germany in November. This year we are located in in the middle of Hall 14, at stand E42-3. We have lots of innovations to show – including our forthcoming **3D 4K Endoscope/Microscope Camera Products**. We also have our **4K Stand-Alone Microscopy Box**, as well as rock-solid optimized 24/7 performance from our 1.0.0 software release across all 4K product families delivering sharper, clearer and even more colorful images. Come and see us to catch up with the latest tech and talk about your requirements. Don’t forget to ping us on <info@enciris.com> to reserve your slot with the Team. We look forward to seeing you. **Categories:** News **Tags:** Events --- ### [3 Weeks to Go…. To Discover Our Latest Product Innovations at MEDICA 2026 in Düsseldorf](https://www.enciris.com/news/3-weeks-to-go/) **Published:** October 24, 2024 **Author:** Luke Montgomery **Content:** Looking forward to demoing our latest Product Innovations at Medica 🙂 Hope to see you in Dusseldorf (11th -14th November, Hall 14/E42-3) **Categories:** News **Tags:** Events --- ### [Enciris Launches Revolutionary Real Time Overlay for AI](https://www.enciris.com/news/4k-latency-overlay-for-ai-applications/) **Published:** December 11, 2025 **Author:** Luke Montgomery **Excerpt:** Watch our dynamic overlay capabilities in action: the CV-400 Video Platform seamlessly integrates live camera sources with a powerful, fully customizable overlay solution. **Content:** ## Innovative overlay adapted for Emerging use-cases The latest generation of Enciris 4K capture cards and camera products all include a set of flexible latency-free overlay features combined with a loop-through HDMI output. This applies to all of the Enciris Lautrec LT-300 capture cards as well as the CV-4X family of camera products. In this article we consider AI use cases for overlay within the medical domain. ## Recap on Overlay and Loop Through Overlay provides the ability to mix and combine video images with drawn shapes and text created within the Enciris API or even with other video streams or images. For Enciris products, this also includes being able to set transparency information dynamically on different parts of the overlayed image as is shown in the image. Loop-through is a video output that mirrors one of the selected incoming video signals. With all Enciris 4K products there is a loop-through output combined with an overlay function. This output is referred to as latency-free because the delay for both overlay and loop-through functions combined is less than 20 video lines, which is undetectable to the naked eye. ## Merging AI information onto incoming video feed data using CH-1001 An emerging application for Overlay is AI. The Enciris CH-1001 is a flexible AI video processor board with many different applications. It has a in-line PCIe connector, that allows it to be directly plugged together with any Enciris capture card or camera product in a low-profile enclosure. The processor board uses a powerful NVIDIA AI processor chip-on-module, to be able to both record the incoming video as well as to provide AI object recognition from the incoming video streams. We will be discussing in detail the recording functions of the CH-1001 board in forthcoming articles. AI technology is reaching a point of maturity where object recognition has become a useful tool for both screening and surgery. One practical medical example of the use for AI is its use to recognise polyps. A colon polyp is a small clump of cells that forms on the lining of the digestive tract. Whilst most colon polyps are completely harmless it is possible over time that some colon polyps can develop into colon cancer. After the AI processor has been trained to recognise the desired object; it takes the incoming video feed from an endoscope and immediately starts scanning image by image for visual patterns that resemble the desired object – in this case polyps. In many AI applications the output from the AI engine is a box drawn around a recognised object, and in the given example this allows the doctor to have an additional check for polyps in the areas indicated by the AI. Within an AI application, there is often the need to be able to blend the output from the AI processor onto the incoming video signals. This is required so that you can see both the original video and also the AI component that is used to highlight an area of interest. On the CH-1001 there are several methods to be able to merge the video data with the objects recognised by the AI; overlay is one way to achieve this on both LT-300 series Frame Grabbers and the CV-4X Camera products. This allows the AI signal to be merged onto the video feed without any noticeable latency. ## Summary All Enciris 4K products include an embedded latency-free overlay function on the loop-through output. This can be used to mix different data(s) or video with the incoming video feed(s) which can be useful in a variety of different medical applications including emerging AI use cases, where the recognised AI data needs to be merged with the incoming video feed with minimal latency. Got question, or want to know more? Reach out to us today. Call +33 5 82 95 09 55. **Categories:** News **Tags:** Overlay, LT-300, Edge AI --- ### [Your Questions Answered About Powerful Video API Solutions](https://www.enciris.com/news/restful-api/) **Published:** December 11, 2025 **Author:** Luke Montgomery **Excerpt:** Enciris CEO and Principal Engineer reveal how 18 years of experience shaped the new Empowered API—a RESTful architecture with just three core commands that supports Python, C++, C#, and GoLang across Windows, Linux, and ARM64 platforms with built-in hardware acceleration. **Content:** In this interview we talk to Enciris CEO, Phillip Weissfloch and Principal Engineer, Remi about the Enciris Empowered API that powers the new range of 4K products including Capture Cards (frame Grabbers) and Camera Components. **Can you tell us about the background of the creation of a new API?** Phillip *“When we started out working on our new 4K series, we realized fairly early on that we needed a new API concept to be able to manage all the new features that we had added. With up to 4 parallel inputs to manage, a latency-free output with overlay, as well as compositing, we wanted our customers to be able to access these features easily to make our hardware more accessible.”* **And what were the main technology drivers?** Remi *“We had seen quite a lot of implementations of our LT-100 family and learned a lot about what functionality the customers most often require. We began to work on some concepts based on a RESTful API. REST stands for representational state transfer which is an architectural style using internet-like URL’s to provide a lightweight way to integrate high levels of scalability and efficiency for developers. We knew pretty much from the start that we wanted to go in this direction. We also had the idea that we wanted to allow easy display of live content on the screen as well as recordings, and still captures, wherever possible by using single commands.”* **And what type of obstacles did you had to overcome?** Phillip *“One of the main challenges was that we wanted to create the API with just three core commands, such that customer integration phase would be easier from an Engineering standpoint. At the same time, we wanted to integrate native support for multiple different languages including Python, C++, C Sharp and GoLang. In addition, we also wanted multi-platform and multi-architecture support; with Windows & Linux both on Intel X86, AMD64 and ARM64 Architectures also supporting Quick Sync, AMD and NVIDIA graphics engines. Added to all of this, we also wanted a way that Engineers could try out the new commands before they started programming, so they could get familiar with the API without actually having to start off in a programming environment”* **Interesting, quite a list! and in terms of implementation how did you achieve this all?** Remi *“We created the API to be both simpler and highly intuitive, based on the three targeted main commands. We made it accessible both in the programming environments and also via a simple Command Line Interface (CLI). The API runs as a service and provides the backbone for all the various native programming interfaces (C++, C Sharp, Python and GoLang), and the CLI means that you can also just type the commands in at the command-line in Windows or Linux to be able to see how each command works. This allows Engineers to start working straight away on their integration, without having the overhead of starting their evaluation inside a set of programming tools. In addition, we created a demo application in Windows and Linux that provides access to all the main required functions. This allows customers to be able to evaluate our 4K products faster using a visual interface. We also added support for Quick Sync, AMD and NVIDIA, such that there is no additional work to do”* **Were there any other architectural features you wanted to integrate?** Remi *“Yes, indeed. We wanted to also have unlimited clients, so that customers could have multiple different concurrent programs (or consumers) for the incoming video data. We wanted these consumers to have access to the data at the operating system level without having to copy it each time in memory.”* Phillip *”Another aspect we wanted to provide was onboard PCI-express DMA and parallel pipeline processing, such that we could continue to push the envelope in terms of ultra-low latency capture. We have a lot of positive feedback about our low-latency being useful in the Operating Room, and we wanted to continue this tradition in our 4K products.”* **Thank you. Any summary comments?** Phillip *“Sure, to sum up we took nearly everything we learned over 18 years and integrated this into our latest API. This has made our hardware both faster and more accessible.”* Got question, or want to know more? Reach out to us today. Call +33 5 82 95 09 55. **Categories:** News **Tags:** RESTful API, Command Line Interface, Edge AI --- ### [7 Ways Medical Imaging Technology Transforms Patient Care](https://www.enciris.com/news/technology-to-transforms-patient-care/) **Published:** December 11, 2025 **Author:** Luke Montgomery **Excerpt:** Enciris CV-400 camera modules deliver crystal-clear 4K imagery optimized for endoscopy and microscopy—featuring single-cable connectivity, sub-frame latency, and over 22 adjustable parameters including white balance, tone mapping, and noise reduction for mission-critical medical applications. **Content:** ## Enciris CV-400 4K Camera Modules: Ultra-Compact and Ready for Endoscope Integration Crystal-clear **4K imaging meets effortless integration** — Enciris Technologies introduces the **CV-400 remote head** camera series, specifically engineered for demanding medical and scientific applications like **endoscopy and microscopy.** Whether you’re developing next-generation endoscopes or need a high-performance camera for surgical microscopes, the CV-400 delivers exceptional image quality with the flexibility OEMs and system integrators need. ## We achieve this level of **4K resolution** and imaging by using 7 different processes : - **Ultra-compact module design** — Fits perfectly into tight endoscope housings where space is extremely limited. - **Single lightweight coax cable** — Carries both power and low-latency video to the Camera Control Unit (CCU), dramatically simplifying your system architecture and reducing cable clutter. - **Sub-frame latency** — Real-time performance critical for live surgical procedures and precise visualization. - **Dedicated IO connections** — Easy integration of control buttons directly on the endoscope head and CCU. - **Over 22 adjustable image parameters** — Including white balance, auto exposure, tone mapping, noise reduction, sharpness, HSBC (Hue, Saturation, Brightness, Contrast), binning, and flare compensation — giving you full control to optimize for challenging medical lighting conditions. - **Two versions available**: - **Bare modules** — Ideal for deep custom integration into endoscopes and embedded systems. - **Finished cameras with C-Mount** — Perfect for quick attachment to microscopes, adapters, or rapid prototyping. The result ? **Vibrant, natural 4K colors**, superior detail in low-light environments, and reliable performance that medical professionals can trust during mission-critical procedures. ## Built for Real-World Medical Applications - **Endoscopy systems (rigid and flexible)** - **Surgical microscopy** - **Minimally invasive procedures** - **Medical robotics** - **Laboratory imaging and live video streaming** The CV-400 series is fully supported by Enciris evaluation software for easy setup, **high-resolution recording**, **screen capture**, and **live preview** — speeding up your development cycle. ## Proven Reliability from a Trusted Partner Enciris Technologies (ISO 9001:2015 certified, based in France) specializes in high-performance Ultra HD 4K solutions for medical, industrial, aerospace, and defense applications. We don’t just sell cameras — we deliver tailored embedded vision solutions. Ready to elevate your endoscope or imaging system? For more information visit [www.enciris.com](https://www.enciris.com/) now. Got question, or want to know more? Reach out to us today. Call +33 5 82 95 09 55. **Categories:** News **Tags:** CV-400, Low Latency --- ### [Enciris Unveils the LT-300 Series Video Platform: A New Era of Flexibility in Video Acquisition](https://www.enciris.com/news/new-era-of-flexibility-in-video-acquisition/) **Published:** December 11, 2025 **Author:** Luke Montgomery **Excerpt:** Enciris Technologies unveils the LT-300 Series Video Platform-transforming trusted capture card technology into a software-reconfigurable video processing powerhouse with zero-latency overlay, picture-in-picture, and future-ready innovation built for evolving OEM demands. **Content:** **Enciris Creates the Future Through Continuous Innovation** **Gaillac, France – April 2, 2025** – Enciris Technologies is excited to announce a significant evolution in its product lineup. **LT-300 Series Rebranded as Video Platform** While the LT-300 series continues its strong heritage as a high-performance capture card, its exceptional flexibility has led the company to rebrand the entire frame grabber series as the **LT-300 Series Video Platform**. This new name better reflects the product’s expanded role as a versatile, multi-function video processing engine designed for advanced low-latency applications. **Powerful New Capabilities** “At its core, the LT-300 Video Platform remains an outstanding high-performance frame grabber and video capture solution,” said Phillip Weissfloch, CEO of Enciris Technologies. “Thanks to its software-reconfigurable hardware, industry-leading API, and comprehensive SDK, it now delivers powerful new capabilities. These include an integrated hardware video output that supports zero-latency video overlay, picture-in-picture, and quad display functionality (coming soon). This transforms the LT-300 from a simple capture card into a true video processing powerhouse.” **Built for the Future** Weissfloch added: “The reconfigurable design is built for the future. New functionalities will continue to be added over time, and OEM partners can request custom enhancements at little to no extra cost. This ensures the LT-300 Series Video Platform can easily adapt to the evolving needs of modern video applications.” **Trusted by Industry Leaders** Enciris Technologies remains committed to its mission as a video solutions innovator, delivering high-performance, high-reliability video acquisition and processing products, along with advanced camera hardware components. The company’s solutions are trusted by leading OEMs in the medical, aerospace, broadcast, and military sectors. By keeping the LT-300 series hardware unchanged while continuously expanding its capabilities through software, this rebranding highlights Enciris Technologies’ strong commitment to performance, long-term value, and future-ready innovation. For more information visit [www.enciris.com](http://www.enciris.com) now. Got question, or want to know more? Reach out to us today. Call +33 5 82 95 09 55. See The Original Press Release [Here](https://www.newswiretoday.com/view.php?id=183709&editor=yes&auth_sess=4u6a3ob10d7fg0vrot72f9as3s) **Categories:** News **Tags:** Picture-in-Picture, Overlay, Capture Card, LT-300 --- ### [Revolutionize Your Video with Amazing Picture in Picture](https://www.enciris.com/news/overlay-features-to-get-picture-in-picture/) **Published:** December 11, 2025 **Author:** Luke Montgomery **Excerpt:** LT-300 Video Platform combines two live sources with picture-in-picture and dynamic overlay, in real time, no post-processing **Content:** *Newly Released [YouTube Video](https://www.youtube.com/watch?v=hji2hH8hEpo "YouTube Video") from Enciris Previews Forthcoming Features* **Gaillac France, 08/04/25:** Enciris’ latest range of advanced 4K/HD Video Capture Card/Frame Grabbers – entitled the LT-300 Series Video Platform, includes state of the art dynamic overlay capabilities designed for such use cases as broadcast, professional-grade video production, live streaming, as well as advanced medical and industrial applications. The term, ‘overlay’ means that image-injection capabilities are provided on-board that allow users to combine and mix live incoming captured video with a combination of text, titles and data-driven info-graphics. The resulting blended ‘overlayed’ images are provided on the HDMI loop-through output. They can also be recorded using the on-board PCIe connectivity to the host PC, which also can provide streaming, CDN or cloud connectivity to share content in real-time. Dynamic Overlay adds the ability for these text and graphics to be moving, i.e., dynamically rendered on screen to provide moving titles, embedded content and real-time info-graphics. [Recently rebranded with the ‘Video Platform’ nomenclature](https://www.enciris.com/4k-capture/press-release-enciris-unveils-the-lt-300-series-video-platform-a-new-era-of-flexibility-in-video-acquisition/), the LT-300 series are the first products from the company to leverage *Enciris Upgrade-able Innovation*; a term used to describe the *Software Reconfigurable Hardware* that all three members of the family have on-board (LT-311, LT-312, LT-313). This allows the entire functionality of the products to be upgraded, adding completely new innovative features and extending the product lifecycle, whilst at the same time providing more ecologically friendly solutions by reducing waste. *“With the release of this video we are providing a preview of why we took the strategic decision to re-brand our LT-300 series as our first Video Platform. By Leveraging our software-reconfigurable hardware we are able to take leaps in the supported functionality – allowing our Team to innovate, and extending dramatically the product families original functionality. In this case we are expanding the impressive dynamic overlay effects and adding Picture-in-Picture; combining two input sources and also providing rendered info-graphics on screen. All of this is possible without any post-processing, using just one of our LT-311, LT-312 or LT-313 Video Platform cards!”* Explained Phillip Weissfloch, CEO of Enciris. Continuing, he added *“Creation of stunning user content, using transparency (alpha-blending) of the dynamic overlays for visuals, titles, and info-graphics is easy using our industry-leading API and SDK. Transparency is a valuable tool because it provides additional visual clarity for info-graphics. The displayed information always stands-out even if the primary background image changes brightness or color around the overlaid content”.* All of these visual effects are provided with absolute minimal latency – ensuring true real-time feedback. This is particularly important for multiple different use-cases including live broadcast, as well as medical applications. For example, when the primary incoming video is being used for displaying live-surgery, it is critical to have minimal latency so that the surgeon can continue to judge his or her hand movements with complete precision when looking up at the live display in the operating theater. In combination with this, the high-quality native 4K resolution (up to 4096 x 2160 pixels with up to 60 Hz refresh rate) also provides ultra-sharp, detailed natural imagery for better visualization. Target use cases also include production of live sporting events, where the LT-300 Series Video Platform can be used for *display of live scores* by overlaying a dynamic, transparent scoreboard that updates in real time. Other broadcast applications include *adding player stats and replays to live feeds*, showing instant replays with picture-in-picture effects combined with player information. The Dynamic Overlay capabilities make Enciris Capture Cards ideal for a range of professional applications – from live event broadcasting, through to advanced medical imaging where real-time embedded info-graphic data combined with picture-in-picture provides added value to surgeons. The overlays are updated instantly, without any noticeable delay thanks to the low-latency processing which helps to keep the broadcast smooth as well as engaging. Some users also find that aligning overlays with control software or hardware control unlocks even more dynamic possibilities, such as timed transitions or interactive updates based on external triggers. Some users also find that aligning overlays with control software or hardware control unlocks even more dynamic possibilities, such as timed transitions or interactive updates based on external triggers. See the demo video [here](http://new%20overlay%20video%20https//youtu.be/hji2hH8hEpo) If you’re interested or just curious about how these features might integrate into your specific workflow or would like some guidance on how to use the overlay configurations, please don’t hesitate to get in contract with Enciris. **Categories:** News **Tags:** Picture-in-Picture, Overlay, LT-300 --- ### [Transform Your Video Workflow with Powerful Enciris Solutions](https://www.enciris.com/news/powerful-enciris-solutions/) **Published:** December 11, 2025 **Author:** Dimitri Suso **Excerpt:** Enciris integrates FFmpeg into its API and CLI software, eliminating the complexity of multimedia stream management while delivering hardware-accelerated encoding, cross-platform compatibility, and future-proof processing for the LT-300 and CV-40 product lines. **Content:** ## **How Enciris Makes FFmpeg Easy to Use** ### **Making FFmpeg Simple** Enciris integrates FFmpeg directly into its API and CLI tools, making powerful multimedia processing much simpler and more fun to work with. Instead of wrestling with complicated settings and tricky stream management, Enciris gives you a clean and intuitive interface so you can focus on building great media solutions. ### **Handling All Types of Media** This smart integration smoothly manages both live streams and file-based videos. It supports tons of formats, codecs, and protocols, turning tasks like encoding, transcoding, packaging, and routing into straightforward steps that save time and deliver reliable results every time. ### **Boosting Performance** We takes full advantage of hardware acceleration, including GPUs and other specialized hardware. This means faster processing, lower latency, and less strain on the CPU, so you can handle more streams efficiently without losing quality. ### **Works Everywhere** Enciris runs smoothly across different operating systems and hardware setups. Whether you’re using it on-premises, in the cloud, or at the edge, it behaves the same everywhere, making integration, testing, and maintenance much easier. ### **Ready for the Future** The architecture is built to grow with new codecs and media standards. Enciris can adapt easily without breaking your current workflows, so your investment stays protected and your systems keep performing well for years to come. ### **Easy to Use – API or CLI** Enciris offers both an API for automated systems and a simple CLI for manual control and quick debugging. This flexible approach makes it comfortable whether you’re building big integrations or just experimenting. ### **A Complete Media Solution** By mixing simplicity, strong performance, flexibility, and scalability, Enciris turns the LT-300 and CV-40 into an easy-to-use multimedia powerhouse. It helps teams manage, transform, and deliver media content at scale while keeping everything reliable and fast. ## **The Best of FFmpeg, Made Friendly** In short, Enciris takes the full power of FFmpeg and makes it far more accessible and user-friendly. You get all the advanced features without the usual headaches, so you can focus on creating amazing media experiences instead of struggling with code. For more information visit [www.enciris.com](http://www.enciris.com) now. Got question, or want to know more? Reach out to us today. Call +33 5 82 95 09 55. **Categories:** News **Tags:** FFmpeg, RESTful API, Command Line Interface, LT-300, CV-400 --- ### [Enciris New Release of The CV400 Series](https://www.enciris.com/news/enciris-newest-release-of-the-cv400-series/) **Published:** April 8, 2026 **Author:** Dimitri Suso **Excerpt:** This release focuses on improving stability, performance, and expanding camera and video capabilities. **Content:** **Version 1.3.3 – Major Feature Update for the CV400 Series (17/11/2025)** This release focuses on improving overall stability and performance while expanding camera and video capabilities. It delivers a more reliable and efficient system, enhances image processing features, and provides greater flexibility for handling video workflows, ensuring a smoother and more robust experience for both development and deployment. ### 🚀 New Features - Added camera temperature retrieval support - Introduced agent configuration file - Added native NV12 format support - Implemented independent RGB gain control - Added advanced video encoder parameters (hardware accelerators, codecs, etc.) - Integrated dead pixel correction ### ⚙️ Improvements - Improved overlay performance - Enhanced agent reliability - Improved overall programming reliability - Strengthened Linux support - Updated SDK ### 🛠 Fixes - Fixed camera access via “Get Camera” button (CV40Q) - Resolved zoom issues (boards now operate correctly without PCIe) - Fixed serial/UART client - Corrected downscaling issues ### 🧹 Changes - Removed serial/UART client from SDK - Dropped support for Windows 7 and 8 ### 🔧 Miscellaneous - Minor fixes and general optimizations For more information visit [www.enciris.com](http://www.enciris.com) now. Got question, or want to know more? Reach out to us today. Call +33 5 82 95 09 55. Click [here](https://www.einpresswire.com/article/704672612/enciris-launches-4k-latency-free-overlay-for-ai-applications) to see the original press release. **Categories:** News **Tags:** CV-400 --- ### [Enciris New Release of The LT310 Series](https://www.enciris.com/news/enciris-newest-release-of-the-lt310-series/) **Published:** April 8, 2026 **Author:** Dimitri Suso **Excerpt:** We’re proud to announce version 1.4.0, a major update aligned with our new LT310 series. This release introduces enhanced video and audio features, improved reliability, and a smoother experience for both developers and users. **Content:** **Version 1.4.0 – Major Feature Update for the LT310 Series (28/11/2025)** We’re proud to announce the release of **version 1.4.0**, a significant update designed to unlock new capabilities and elevate performance across the board—now fully aligned with our new **LT310 series**. This release brings enhanced video and audio features, improved reliability, and a smoother development experience for integrators and users alike. ### 🚀 New Features - **NV12 Native Support** Native support for the NV12 format enables more efficient video processing pipelines, reducing conversion overhead and improving compatibility with modern systems and workflows. - **Audio Recording** With built-in audio recording capabilities, users can now capture synchronized audio streams directly, opening the door to richer media applications and easier content creation. - **2K DCI Resolution Support** Support for **2K DCI resolution** ensures sharper, cinema-grade image quality, making the LT310 series even more suitable for professional and high-end visual applications. ### ⚙️ Improvements - **Audio Acquisition** We’ve enhanced the stability and precision of audio capture, resulting in clearer sound and more consistent performance across different environments. - **Quality of Service (QoS)** System-level optimizations improve overall responsiveness and reliability, especially in demanding or real-time scenarios. - **HDMI Input** Improved HDMI input handling provides better signal stability, faster detection, and broader compatibility with external devices. - **SDK Clients & Examples** Updated SDK clients and refined example projects make development faster and more intuitive, helping you integrate and deploy solutions with greater ease. - **Documentation Update** Our documentation has been thoroughly updated to reflect new features and improvements, ensuring you have the guidance needed to get the most out of the LT310 series. Version **1.4.0** represents a key step forward for the **LT310 series**, combining new functionality with meaningful refinements to deliver a more powerful, reliable, and developer-friendly experience. We’re excited to see what you’ll build with it. Enciris camera evaluation software is included that provide support for many different use-cases including video streaming, recording and live display. For more information visit [www.enciris.com](http://www.enciris.com) now. Got question, or want to know more? Reach out to us today. Call +33 5 82 95 09 55. See The Original Press Release [Here](https://www.newswiretoday.com/view.php?id=183709&editor=yes&auth_sess=4u6a3ob10d7fg0vrot72f9as3s) **Categories:** News **Tags:** LT-300 --- ### [Enciris 4K Latency-Free Overlay Features Explained](https://www.enciris.com/news/enciris-4k-latency-free-overlay-features-explained/) **Published:** April 3, 2024 **Author:** Luke Montgomery **Excerpt:** Displaying patient data on live surgical video without adding latency: how Enciris overlay and loop-through work in the operating room. **Content:** ## Innovation for Capture Cards and Camera Components Gaillac, France – 3rd April 2024 – The latest generation of Enciris 4K capture cards and camera products all include a loop-through HDMI output with a whole batch of flexible overlay features embedded ready to use. Overlay is provided on all of the Enciris Lautrec 4Kp60 LT-300 capture cards as well as the CV-400 family of 4Kp60 camera products. In this article, we discuss the features and consider some use cases within the medical domain. ## What is overlay? Overlay provides the ability to combine and mix video images; with either other video images or with text and/or drawn shapes created within the Enciris API. This mixing is also accompanied by transparency information. Overlay combined with loop-through provides a useful feature set for a variety of different application areas. ## What is a loop-through output? Loop-through is a video output that mirrors one of the selected incoming video signals. On the LT-300 family, there is one HDMI loop-through output with up to 4 select-able video inputs, dependent on the card option. With the Enciris 4Kp60 Camera products there are 5 loop-through outputs (1 HDMI and 4 SDI) and one camera input. In an operating theater environment loop-through is useful because depending on the procedure; sometimes it is easier for the surgeon to see what he is doing through a monitor rather than using a microscope or endoscope directly. It is also extremely useful for the other staff to be able view the operation live so they are prepared to be able to assist in the process. The latency between input and output needs to be minimized such that the Surgeon or Doctor can judge his or her movements. With Enciris 4K products the combined loop-through and overlay delay is less than 20 lines of video, and hence we refer to this as latency-free because there is no perceivable input/output difference. 4K quality (up to 4096 x 2160 pixels) is preferred since this delivers sharper more detailed imagery with 60 Hz refresh rate providing more natural movement, allowing better real-time feedback. ## What can Overlay be used for? ### Display of Patient Data At the beginning and also during an exploratory or surgical procedure, it is useful for the Surgeon or Doctor to be able to review the patient information, conveniently overlayed on the incoming video image. Patient information can be seamlessly integrated and overlayed to appear on the screen inside the operating theatre, clinic, or medical facility. ### OR Integration The information displayed on the overlay can be of any format including for example, outputs from heart-rate or other monitoring equipment etc. Mixed images or output data with text etc. etc. This renders the Enciris 4K products ideal as components as part of an Operating Room (OR) Integration. Monitoring information or icons can be placed at the extremities of the picture so they do not interfere with the live video feed. ## Summary All Enciris 4K products include an embedded overlay function on the loop-through output. This can be used to mix different data(s) or video with the incoming video feed(s) with zero latency on the incoming video streams which can be useful in a variety of different medical and OR Integration use cases. *In our next article*, *we will be discussing loop-through overlay for **AI applications.** Please* [*subscribe now*](https://www.linkedin.com/company/enciris/) *to our Linked-In feed, and click Follow to be able to see our regular updates.* **Categories:** News --- ### [FFmpeg Integration Explained: Faster, Scalable 4K Video Processing Made Easy](https://www.enciris.com/news/whitepaper-1-integration-of-ffmpeg-into-enciris-technologies-software/) **Published:** March 19, 2025 **Author:** Luke Montgomery **Content:** The processing and management of large numbers of multimedia streams can be a headache, particularly in the fields of broadcasting, medical, telemedicine, surveillance, and video analysis. FFmpeg is one of the best-known open-source software solutions that enables manipulation of video/audio streams and files in various formats and standards. This document discusses the various reasons why we chose to integrate FFmpeg into the Enciris Technologies API (Application Protocol Interface) and CLI (Command Line Interface) software for our LT300 range of 4K/HD capture cards (frame grabbers) as well as the CV40 range of 4K camera products, and presents the resulting benefits to our customers. ## **Overview, Features and History of FFmpeg** FFmpeg is an open-source project that started life in the year 2000. The project was originally started by Fabrice Bellard, a well-known programmer that is well respected for his numerous contributions to the open-source world. From its original inception, the FFmpeg project quickly established itself as a valuable and popular tool worldwide for handling all kinds of multimedia files, due mostly to its huge degree of flexibility. Now adopted and supported by a large community of both companies and developers world-wide, the core of its architecture is based on a collection of powerful open-source libraries. These include notable tools such as libavcodec for encoding and decoding, libavformat for managing multimedia containers, and libavutil, which provides various utility functions. Today, FFmpeg is used across a vast range of application use cases, being deployed in everything from streaming platforms through video editing software to its various integrations in multiple embedded systems. ### **Key Features** Offering an extremely comprehensive suite of tools that supports nearly all essential operations for the processing of multimedia files. FFmpeg enables the encoding and decoding of video and audio streams using a wide range of codecs, including commonly used standards such as H.264, HEVC, and VP9 for video as well as AAC, MP3, and Opus for audio. In addition to its encoding and decoding capabilities, FFmpeg manages the multiplexing and demultiplexing of multimedia files, making it significantly easier to handle audio and video streams within containers like MP4, MKV, or AVI. In terms of use cases, it is also deployed extensively for live streaming, offering real-time conversion between different formats and protocols. Finally, it integrates a useful set of filters that allow various image and sound processing tasks, for example resizing, adding subtitles, doing color correction, and also performing audio resampling tasks. ### **Advantages and Disadvantages** Like all solutions, FFmpeg has undeniable strengths in certain areas as well as some limitations in others. Here is an overview of its main perceived advantages and disadvantages: ### **Advantages:** - Free and open-source (licensed under GPL or LGPL, depending on the chosen options) - Broad compatibility with video and audio formats - Support for hardware acceleration (NVIDIA NVENC, Intel Quick Sync, AMD VCE) - Highly flexible and customizable with a wide range of options ### **Disadvantages:** - Complexity of the associated commands and configuration - Dependency and update management can be challenging - It has a relatively steep learning curve for non-experts ## **API and CLI overview** Enciris Technologies has developed an API and CLI software suite designed to simplify the control and operation of its LT-300 capture card family of frame grabbers as well as the CV-4x range of camera products. Accessible via a RESTful API as well as directly from the Windows or Linux Command Line, this software allows direct interaction with the hardware to configure settings and manage multimedia streams. It provides the ability to acquire multiple video streams simultaneously, record them, and encode them in various formats. It also supports decoding and playback of various multimedia files, along with numerous integrated audio processing features including encoding, decoding, as well as resampling. Through this simple to-use API, users can leverage all of these functions without worrying about handling the complex FFmpeg commands or management of associated software dependencies. ### **Why Use FFmpeg?** The integration of FFmpeg into our software addresses several key needs in multimedia stream management for customers. Firstly, FFmpeg enables leveraging hardware encoding and decoding capabilities offered by various different computer platforms, particularly through NVIDIA NVENC, Intel Quick Sync, and AMD VCE processors and accelerators. This support significantly improves performance and reduces CPU load during video processing. Additionally, FFmpeg supports a wide range of video and audio codecs, including common formats such as H.264, HEVC (H.265), and VP9 for video, as well as AAC, MP3, and Opus for audio. Because of the diversity of different standards supported, our software can adapt to many different application use-cases and ensure optimal compatibility with a large range of different formats and devices. Another major benefit of integration is FFmpeg’s ability to perform advanced video processing tasks. It offers features such as resizing, format conversion, filter application, and color correction. These tools are essential for ensuring the highest quality of processed and recorded streams, whether this is for real-time broadcasting or for archiving or other purposes. Finally, FFmpeg is a cross-platform solution, compatible with Windows, Linux, and other operating systems. This flexibility ensures that our software can operate seamlessly across multiple different customer infrastructures, facilitating integration into various environments and reducing deployment complexity and maintenance effort for both users, developers and IT support. Enciris Technologies utilizes FFmpeg and its libraries under the LGPL license, ensuring compliance with open-source standards while maintaining flexibility for integration into our commercial solutions. The integration of FFmpeg into our software significantly also simplifies the required software integration effort required from day 1 of the development process for our customers in the following areas: - **Version and dependency management**: Users don’t need to worry about installing and updating FFmpeg. - **Operating system abstraction**: The tool works seamlessly across multiple different OS platforms, and computer hardware (Intel, AMD or Nvidia). - **Simplified video encoding and decoding via the API**: This provides direct access to FFmpeg’s functionality without requiring users to handle complex commands and options. Through our API, users can encode, decode, multiplex, and process video streams from our cards effortlessly, with our multimedia server managing all aspects of FFmpeg’s technical configuration. ## **Use Case: Video Recording** ### **With our API:** 1. The user sends a request to our RESTful API, specifying only the output file format 2. The software automatically handles acquisition, encoding, and recording ### **With our API and FFmpeg:** 1. The user requests the video stream via our API 2. The stream is then redirected to FFmpeg for custom encoding (choosing codec, bitrate, etc.) 3. The encoded video is saved as a file ## **Conclusions** The integration of FFmpeg into Enciris Technologies’ software provides a powerful and efficient solution for multimedia processing. By embedding FFmpeg, we offer users a seamless experience, removing the complexity of configuring and managing it while ensuring access to all of its extremely powerful features. This approach significantly reduces the technical burden on users, because it eliminates the need to handle dependencies, updates, and manage platform-specific issues. Through our RESTful API, users can effortlessly control video encoding, decoding, and processing, allowing them to focus on the creative aspects of application development rather than on the tasks of multimedia stream management. It also takes away the pain of managing hardware platform and software dependencies for updates and Long-Term Support (LTS). By leveraging FFmpeg, and integrating it we can ensure our software remains versatile and future-proof. With continuous updates from the open-source community, FFmpeg provides ongoing improvements in performance, codec support, and hardware acceleration, allowing our customers to benefit from cutting-edge multimedia processing without any additional effort. Enciris Technologies’ integration of FFmpeg not only enhances our software’s capabilities but also provides our users with a streamlined, efficient, and scalable solutions for multimedia management. By abstracting the complexities of FFmpeg, we deliver a robust and easy-to-use system that empowers users to optimize their workflows with minimal technical overhead. ### **Other notable alternatives to FFmpeg include:** - **GStreamer**: Which is a modular framework for multimedia processing - **LibVLC**: This is a library used by VLC for multimedia stream management - **HandBrake**: This is a dedicated video conversion solution based on FFmpeg - **AVConv (formerly part of Libav)**: This is an alternative derivative of FFmpeg Got a question, or want to know more? Reach out to us today. Call +33 (0)5 82 9509 55 or email: <info@enciris.com> [www.enciris.com](http://www.enciris.com) Enciris is an ISO9001:2015 company. **Categories:** News **Tags:** FFmpeg, RESTful API, Command Line Interface --- ### [Enciris LT-313 Sets New Standard for 4K Video Capture with Real-Time Overlay and Low Latency](https://www.enciris.com/news/ultra-hd-4k-lautrec-lt-313-video-capture-card-combines-flexible-dual-sdi-and-hdmi-inputs-with-hdmi-output/) **Published:** March 30, 2023 **Author:** Luke Montgomery **Content:** ## *Flexible Input Sources, Extensive Real-time Overlay Features and Long-Term Support (LTS)* Gaillac, France – 29th March 2023 – Enciris Technologies announced today the launch and production availability\* of the latest addition to the Lautrec LT-300 series with the LT-313 video acquisition card. Featuring Ultra HD 4K up to 60fps, dual SDI and HDMI 4K inputs, 3D, 10-bit video processing, ultra-low latency, PCIe 4xGen 2 bus and direct HDMI 4K output with integrated overlay functions, this new card complements the previously released LT-311 and LT-312 products, offering four 12G SDI inputs and dual HDMI 4K inputs respectively. All Enciris Ultra HD 4K products include overlay features for text, shape(s) and image injection with alpha blending, allowing customers to inject their own overlays and templates onto the incoming video streams, set required transparency levels and view this both on the HDMI direct out and via the host. Colour space conversion and colour adjustment are also provided. The product range is ideally suited to Medical, Aerospace, Industrial, Military and other real-time and high-reliability applications. All 4K Enciris products also include support for the new Enciris-Empowered API with simultaneous multi-channel capture for Windows, Linux, Direct Show, Python, C++, C#, .NET and Golang. The new API runs as a service and reduces time to market due to the fact that typical customer use-cases are less than 100 lines of code. Extended temperature versions of the board are available on request. The LT-313 consumes typically less than 12 Watts offering efficient operation contributing to your low power system. \*The LT-313 is Sampling Now, Production availability is Q2/2023. **About Enciris Technologies** Enciris Products are Engineered and built in France. The Enciris story started in 2006 with a vision to make a range of accessible high performance video capture products using the latest, state-of-the-art technology. We design for ultra-high reliability and Long-Term Support (LTS). [www.enciris.com](http://www.enciris.com) Enciris is an ISO9001:2015 company. **Categories:** News --- ### [New Enciris CV-40 Camera Series delivers crystal clear Ultra HD 4K imagery with lightning-fast sub frame latency](https://www.enciris.com/news/new-enciris-cv-40-camera-series-delivers-crystal-clear-ultra-hd-4k-imagery-with-lightning-fast-sub-frame-latency-2/) **Published:** December 15, 2022 **Author:** Luke Montgomery **Content:** *Medical OEM’s and System Integrators benefit from Enciris technologies’ milestone* Gaillac, France – Thursday 15th December 2022 – Enciris Technologies is announcing today the launch and production availability\* of the new CV-40 camera and CV-42 capture card, which features native Ultra HD 4K resolution, 10-bit sensor and image processing combined with blazingly fast sub-frame latency. The new camera is compatible with C-Mount lenses or optionally available as a bare board version for integration into medical equipment such as microscopes and endoscopes. With an ultra-compact low-power design, the camera sensor typically consumes just 1.5W and offers extended temperature operation. There is full auto-exposure, sharpness controls, advanced de-noise filtering, binning modes and low-light enhancement, all of which work together to provide crystal clear imagery in almost all possible lighting conditions. *“This represents a new milestone in medical imaging and adds a step function in providing greater clarity and resolution for medical OEM’s and system integrators, which is especially valuable for surgical microscopes, endoscopy, minimum evasive surgery and advanced medical robotics”* stated Phillip Weissfloch, CEO of Enciris, adding *“The camera and capture card also have an innovative design that allows a single-core flexible coax cable to perform several functions including: providing the video link, powering the camera and as well providing bi-directional i/o for the camera head. This aids usability because a large variety of cabling methods can be used”.* The CV-42 capture card offers less than one frame latency including overlay capabilities and also provides 10-bit video processing, PCIe 4xGen 2 bus, four direct 12G SDI outputs and a HDMI 4K output. The overlay function allows for text, shape(s) and image injection with alpha blending, enabling customers to inject their own overlays and templates onto the incoming camera video. In addition, the CV-42 also supports the new Enciris-Empowered API with simultaneous multi-channel capture for Windows, Linux, Direct Show, Python, C++, C#, .NET and Golang. The new API runs as a service and reduces time to market due to the fact that typical customer use-cases are less than 100 lines of code. With some reduced functionality, the CV-42 can also be run without a PCI express host and be thus controlled via USB or UART. \* The CV-40 and CV-42 are Sampling now, production quantities Q1/2023. A standalone version of the CV-42 is currently in development. **Categories:** News --- ### [New Lautrec LT-312 extends Enciris Ultra HD 4K video capture range with dual HDMI inputs and real-time overlay](https://www.enciris.com/news/new-lautrec-lt-312-extends-enciris-ultra-hd-4k-video-capture-range-with-dual-hdmi-inputs-and-real-time-overlay/) **Published:** February 10, 2023 **Author:** Luke Montgomery **Content:** ## *Unmatched Flexibility, Reliability and Long-Term Support (LTS)* Gaillac, France – 10th February 2023 – Enciris Technologies announced today the launch and production availability\* of the Lautrec LT-312 video acquisition card featuring Ultra HD 4K up to 60fps, dual HDMI 4K inputs, 3D, 10-bit video processing, less than one frame latency, PCIe 4xGen 2 bus and a direct HDMI 4K output with integrated overlay function. This complements the previously released LT-311 product, offering four 12G SDI inputs. The LT-300 series includes overlay features for text, shape(s) and image injection with alpha blending, allowing customers to inject their own overlays and templates onto the incoming video streams and view this both on the HDMI direct out and via the host. Colour space conversion and colour adjustment are also provided. The product range is ideally suited to Medical, Aerospace, Industrial, Military and other real-time and high-reliability applications. The family also includes support for the new Enciris-Empowered API with simultaneous multi-channel capture for Windows, Linux, Direct Show, Python, C++, C#, .NET and Golang. The new API runs as a service and reduces time to market due to the fact that typical customer use-cases are less than 100 lines of code. Extended temperature versions of the board are available on request. The LT-312 consumes less than 12 Watts offering efficient operation contributing to your low power system. \*The LT-312 is Sampling Now, Production availability is for early Q2/2023 **About Enciris Technologies** Enciris Products are Engineered and built in France. The Enciris story started in 2006 with a vision to make a range of accessible high performance video capture products using the latest, state-of-the-art technology. The company has evolved to become a leading designer and manufacturer of high-performance video processing hardware for OEMs, system integrators, embedded systems, and professional users. Enciris provides solutions for customers to add Ultra HD 4K/Full HD camera technology, video acquisition, hardware compression, video routing, video format conversion, video overlay, video streaming and storage capabilities. We design for Long Term Support (LTS) and ultra-high reliability. [www.enciris.com](http://www.enciris.com) Enciris is an ISO9001:2015 company. **Categories:** News --- ### [New Enciris Lautrec LT-311 brings Ultra HD 4K 60fps video capture with sub frame latency and real-time HDMI overlay](https://www.enciris.com/news/new-enciris-lautrec-lt-311-brings-ultra-hd-4k-60fps-video-capture-with-sub-frame-latency-and-real-time-hdmi-overlay/) **Published:** February 1, 2023 **Author:** Luke Montgomery **Content:** ## *Ground-breaking performance and reliability* Gaillac, France – Wednesday 1st February 2023 – Enciris Technologies is announcing today the launch and production availability\* of the new Lautrec LT-311 video acquisition card featuring Ultra HD 4K up to 60fps, four 12G SDI inputs, 3D, 10-bit video processing, less than one frame latency, PCIe 4xGen 2 bus and direct HDMI 4K output with overlay. The new board is ideally suited to Medical, Aerospace, Industrial, Military and other real-time and high-reliability applications. It also provides an overlay including text, shape(s) and image injection with alpha blending, allowing customers to inject their own overlays and templates onto the incoming video streams and view this both on the HDMI direct out and via the host. Colour space conversion and colour adjustment are also provided. The LT-311 includes the new Enciris-Empowered API with simultaneous multi-channel capture for Windows, Linux, Direct Show, Python, C++, C#, .NET and Golang. The new API runs as a service and reduces time to market due to the fact that typical customer use-cases are less than 100 lines of code. Extended temperature versions of the board are available on request. The LT-311 consumes less than 12 Watts offering efficient operation contributing to your low power system. \*The LT-311 is Sampling Now, Production availability Q1/2023 **About Enciris Technologies** Enciris Products are Engineered and built in France. The Enciris story started in 2006 with a vision to make a range of accessible high performance video capture products using the latest, state-of-the-art technology. The company has evolved to become a leading designer and manufacturer of high-performance video processing hardware for OEMs, system integrators, embedded systems, and professional users. Enciris provides solutions for customers to add Ultra HD 4K/Full HD camera technology, video acquisition, hardware compression, video routing, video format conversion, video overlay, video streaming and storage capabilities. We design for Long Term Support (LTS) and ultra-high reliability. [www.enciris.com](http://www.enciris.com) Enciris is an ISO9001:2015 company. **Categories:** News --- ## Pages ### [Home page](https://www.enciris.com/) **Published:** June 18, 2026 **Author:** Guillaume Bussat **Content:** Video electronics, engineered in France # We don't just sell video capture cards We help you build your product Video capture cards, 4K cameras and edge AI platforms. Adaptable sample code in 4 languages and direct engineering support. [ Talk to an engineer ](https://www.enciris.com/contact/) [ Explore products ](https://www.enciris.com/products/) FRANCE Designed & Manufactured 24/7 Continuous Operation 20+ Years of Expertise ISO 9001 Certified Manufacturing ## Hardware Platforms Enciris designs professional video capture cards, 4K cameras and edge AI platforms for medical, aerospace and industrial OEMs. Build your product on proven hardware, engineered in France. [ ![LT-122 Dual-Channel SDI Capture Card, H.264 hardware encoding](https://www.enciris.com/wp-content/uploads/elementor/thumbs/lt122_photo-rqxervuwgvx9czglwwbjyex7fgm9v1lfhga8kg8lq8.png "lt122_photo") VIDEO Capture ### LT-100 Series Reliable HD and SD video capture with integrated H.264 compression. Supporting both modern digital and legacy analog video sources. Full HD Capture Analog & Digital 24/7 operation Long-Term Availability ](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/) [ ![Enciris LT-313 hybrid SDI and HDMI 4K video capture card PCIe frame grabber for multi-source video acquisition](https://www.enciris.com/wp-content/uploads/elementor/thumbs/lt-313_photo-1-rr8ourhm9y2ee6q2xhl4kw39hw0yk4j326lxvqojr4.png "lt-313_photo") VIDEO PROCESSING ### LT-300 Series Flexible 4K video platform for multi-channel capture, recording, streaming and real-time processing. 4K 60fps Dynamic Overlay Easy Integration Multi-Channel ](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/) [ ![Enciris CV-440 4K camera platform high performance imaging system for real-time video acquisition and processing](https://www.enciris.com/wp-content/uploads/elementor/thumbs/cv-440_photo-rrbe2pjhw188fyuvpcxrsox5pp8ljl2m9b2dol9zb4.png "cv-440_photo") 4K CAMERAS ### CV-400 Series Modular 4K camera platform delivering uncompromising image quality in compact, low-power designs. Remote Camera Head Native 4K Compact Design RESTful API ](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/) [ ![ch007_photo](https://www.enciris.com/wp-content/uploads/elementor/thumbs/ch007_photo-rr8otxes78x82nxrt4l2d3oihk57pt7oa1qeivx5a8.png "ch007_photo") EDGE AI ### CH-007 AI Platform Compact NVIDIA Jetson Orin platform built for AI inference, video processing and rapid application development. NVIDIA Orin AI-ready Platform Ultra-compact Vision Processing ](https://www.enciris.com/ch-007-edge-ai-carrier-board-jetson-orin/) [ View all products ](https://www.enciris.com/products/) ## Need more than a standard product? From product adaptation to fully custom system developments, we help customers to build specialized video systems for demanding applications. ### Adapt an existing platform Build on a proven Enciris card and tailor it to your project: different connectors, form factor, firmware tweaks, qualification level… *Faster and lower risk, starts from production-ready hardware.* ![Ruggedized LT-122 custom video capture card for aerospace](https://www.enciris.com/wp-content/uploads/2026/06/ea111_photo_blur-300x200.png) ### Develop a full custom solution Ground-up engineering of hardware, firmware and software designed around your exact requirements, when no existing platform fits. *Maximum flexibility, backed by 20 years of video engineering.* ![Custom Full HD video receiver board with Ethernet decompression for medical applications](https://www.enciris.com/wp-content/uploads/2026/06/es260_photo_blur2-300x200.png) [ Explore custom solutions ](https://www.enciris.com/custom-video-capture-solutions/) ## Built for your software stack A REST API at the core, with helper bindings in C++, C#, Go and Python, an ecurl CLI for shell scripting, and ready-to-run demo apps in every language. Runs natively on Linux and Windows, x86 or ARM64. TOP OF THE STACK **Your application** DEVELOPER TOOLS, PICK YOUR INTEGRATION PATH LANGUAGE BINDINGS C++ C# Go Python *Typed helpers wrapping the REST API* COMMAND-LINE ecurl *Scriptable CLI, built on the Go binding* *+ ready-to-use demo apps and sample code in every language* THE INTEGRATION CONTRACT **REST API** POST / GET *Family specific, scoped under* *lt300:/* *and* *cv400:/* PLATFORM COMPATIBILITY OPERATING SYSTEM Windows Linux CPU ARCHITECTURE x86 ARM64 (Jetson Orin) GPU ACCELERATION Intel NVIDIA AMD BOTTOM OF THE STACK **Enciris hardware** CAPTURE & PROCESSING CARDS LT-100 \* LT-300 CV-400 CARRIER BOARD CH-007 *Jetson Orin baseboard, hosts one card via PCIe* \* *The LT-100 series follows a legacy integration model based on a C library (DLL/SO) and C wrapper.* ## Why Choose Enciris Engineering excellence and long-term commitment to your success ### Direct Access To Engineers From your first prototype, talk directly to the engineers who designed the product. **No L1 ticketing, no scripted answers**. Just fast, competent help during integration and development. ### Built for Continuous Operation Engineered in **France to ISO 9001:2015 standards** for 24/7 performance. Ultra-low latency and rock-solid reliability under heavy loads. ### Long-Term Availability Products available for **10+ years**. Integrate once, deploy with confidence. No need to re-engineer or re-qualify your solution. ### Lifetime Technical Support Once you’re in production, support continues. Bug fixes, firmware updates, deployment guidance, **for the full life of your deployment**. Year after year. Our support doesn’t end when the product ships. --- ### [Product Portfolio](https://www.enciris.com/products/) **Published:** April 15, 2026 **Author:** Guillaume Bussat **Content:** # Professional video capture cards, 4K cameras & edge AI platforms Enciris designs and manufactures professional video capture cards, 4K cameras, and edge AI platforms for embedded applications. Explore our four product families below. ## Professional video capture cards Professional video capture solutions from SD to 4K for real-time acquisition, processing and compression. [### LT-100 Series SD/HD Capture & Hardware Compression ](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/)Capture and compress SD and HD video from legacy and professional video sources. SD to Full HD USB or PCIe Hardware H.264 Encoding [ ![Enciris LT-101 USB video capture system with H.264 encoding supporting HDMI DVI and analog inputs for real time processing](https://www.enciris.com/wp-content/uploads/2026/02/lt101_photo.png) #### LT-101 USB SD/HD capture and compression solution for SDI , DVI-I and legacy video formats. ](https://www.enciris.com/products/lt-101/) [ ![Enciris LT-102 PCIe video capture card with H.264 hardware encoder supporting SD to Full HD inputs](https://www.enciris.com/wp-content/uploads/2026/02/lt-102_photo.png) #### LT-102 PCIe SD/HD capture and compression card supporting SDI, DVI-I and legacy video formats. ](https://www.enciris.com/products/lt-102/) [ ![Enciris LT-122 dual channel SDI PCIe video capture card with dual H.264 encoders for broadcast and embedded applications](https://www.enciris.com/wp-content/uploads/2026/02/lt-122_photo.png) #### LT-122 Dual-channel SDI capture and compression card for professional SD and HD workflows. ](https://www.enciris.com/products/lt-122/) [ ![Enciris LT-124 dual channel DVI-I PCIe video capture card with hardware compression for SD and Full HD video acquisition](https://www.enciris.com/wp-content/uploads/2026/02/lt-124_photo.png) #### LT-124 Dual-channel DVI-D capture and compression card for professional SD and HD workflows. ](https://www.enciris.com/products/lt-124/) [### LT-300 Series HD/4K Acquisition & Processing Platform ](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/)Multi-channel HD/4K acquisition and processing for demanding video applications. Up to 4K60 HDMI & SDI Multi-Source Acquisition [ ![Enciris LT-311 4K SDI video capture card PCIe multi-channel frame grabber for real-time UHD acquisition and recording](https://www.enciris.com/wp-content/uploads/2026/02/lt-311_photo.png) #### LT-311 Quad-SDI video acquisition and processing platform for HD and 4K workflows ](https://www.enciris.com/products/lt-311/) [ ![Enciris LT-312 dual HDMI 4K video capture card PCIe with real-time acquisition and low latency video processing](https://www.enciris.com/wp-content/uploads/2026/02/lt-312_photo.png) #### LT-312 Dual-HDMI video acquisition and processing platform for HD and 4K workflows. ](https://www.enciris.com/products/lt-312/) [ ![Enciris LT-313 hybrid SDI and HDMI 4K video capture card PCIe frame grabber for multi-source video acquisition](https://www.enciris.com/wp-content/uploads/2026/02/lt-313_photo-1.png) #### LT-313 Hybrid SDI/HDMI video acquisition and processing platform for multi-source applications. ](https://www.enciris.com/products/lt-313/) ## 4K camera systems Modular camera platforms delivering high-quality 4K imaging with low-latency video output. [### CV-400 Series Professional 4K Imaging ](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/)Modular 4K camera platforms for professional imaging and vision applications. Native 4K Modular Design Professional Outputs [ ![Enciris CV-420 4K camera platform remote head imaging system for medical and industrial applications](https://www.enciris.com/wp-content/uploads/2026/02/cv420_photo5.png) #### CV-420 Remote-head 4K camera platform for integration into advanced imaging systems. ](https://www.enciris.com/products/cv-420/) [ ![Enciris CV-440 4K camera platform high performance imaging system for real-time video acquisition and processing](https://www.enciris.com/wp-content/uploads/2026/02/cv-440_photo.png) #### CV-440 Stand-alone 4K camera system with integrated control and professional video outputs. ](https://www.enciris.com/products/cv-440/) ## Edge AI Platforms Embedded computing platforms for real-time video processing and AI inference at the edge. [### CH-007 Series NVIDIA Jetson Orin Edge AI Platform ](https://www.enciris.com/ch-007-edge-ai-carrier-board-jetson-orin/)Deploy AI-powered vision applications at the edge. Jetson Orin Up to 157 TOPS Embedded AI [ ![](https://www.enciris.com/wp-content/uploads/2026/03/ch-007_photo-1.png) #### CH-007 Board​ Jetson Orin carrier board with deployment tools for embedded AI applications. ](https://www.enciris.com/ch-007-edge-ai-carrier-board-jetson-orin) [ ![](https://www.enciris.com/wp-content/uploads/2026/03/ch-007_jetson_photo-1.png) #### Developer Kit​ Ready-to-use edge AI platform featuring Jetson Orin NX 8GB and NVMe storage. ](https://www.enciris.com/ch-007-edge-ai-carrier-board-jetson-orin) [ ![](https://www.enciris.com/wp-content/uploads/2026/03/ch-007_jetson_lt-313_photo.png) #### Video Development Kit​ Complete video AI platform combining Jetson Orin NX and LT-313 video acquisition. ](https://www.enciris.com/ch-007-edge-ai-carrier-board-jetson-orin) ![](https://www.enciris.com/wp-content/uploads/2026/02/test-scaled.jpg) ## Have a specific project in mind? From custom hardware development to evaluation boards, our engineering team in France supports you from prototype to long-term production. ISO 9001:2015 certified Designed & assembled in France 10+ years product availability [ Request an evaluation board ](https://www.enciris.com/contact/?type=eval) [ Explore a custom solution ](https://www.enciris.com/custom-video-capture-solutions) ## FAQ ### What is a capture card ? A capture card is a hardware device that acquires video and audio signals from an external source — such as a surgical camera, industrial imager, or broadcast system — and transfers them to a computer for recording, streaming, or real-time processing. In medical applications, capture cards are used to acquire video from endoscopes, surgical cameras, or imaging systems where signal fidelity and latency are critical. In industrial and aerospace environments, they are integrated into inspection, monitoring, and simulation systems that demand deterministic, high-quality video acquisition. ### What is hardware video encoding, and why does it matter ? A video encoder converts raw video signals into a compressed digital format suitable for storage, transmission, or streaming. Offloading this task from the host CPU results in lower latency, reduced CPU load, and more predictable performance in real-time applications. LT-100 series cards embed hardware H.264 encoding directly on the board — no GPU required. For the LT-300 series and CV-400 cameras, encoding is performed via the host GPU (NVIDIA, AMD, or Intel), giving you flexibility to choose the codec and encoder that fits your pipeline. ### What is Ecurl ? Ecurl is the common RESTful API and command-line interface (CLI) shared across all Enciris capture cards and cameras. It lets you start developing your application immediately — before writing any code — by sending simple commands from the Windows or Linux terminal. For example, to start recording on an LT-300 card: `ecurl rec lt310:/0/sdi-in/0 -d` Full API documentation is available for the [LT-300 series](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/#software) and [camera products](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/#software). ### Which GPUs do you support ? For the LT-300 series and CV-400 camera products, we support NVIDIA, AMD, and Intel GPU acceleration. You can select the hardware encoder via the API or directly on the command line: `ecurl rec lt310:/canvas/0 –d extra.hw=nvenc` *(NVIDIA)* `ecurl rec lt310:/canvas/0 –d extra.hw=amf` *(AMD)* `ecurl rec lt310:/canvas/0 –d extra.hw=qsv` *(Intel)* For the CH-007 platform, GPU processing is handled by the NVIDIA Jetson Orin module’s integrated CUDA cores and hardware video engine (NVENC/NVDEC depending on the module). ### What operating systems do you support ? - Windows 11 and 10 for all current products - Ubuntu Linux LTS 22.04 and later (equivalent Debian versions are also supported) For the CH-007 Edge AI platform, the system runs on Ubuntu 22.04 via NVIDIA JetPack, with automated environment setup and flash scripts provided out of the box. ### What programming languages are supported ? Our RESTful API is language-agnostic — any language capable of sending HTTP requests and parsing JSON can interface with our products. We provide example code and helper libraries for Go, C++, C#, and Python. ### What is EDID, and why does it matter for capture cards ? EDID (Extended Display Identification Data) is metadata stored in a display or capture device that describes its supported resolutions, refresh rates, and audio capabilities. When a video source connects to a capture card, it reads the card’s EDID to automatically configure its output to a compatible format. Incorrect or missing EDID can cause resolution mismatches, blank signals, or handshake failures. Enciris capture cards expose EDID configuration through the API, allowing integrators to set custom EDID profiles and ensure stable signal acquisition in complex or non-standard video chains. ### What are the differences between the CH-007 configurations ? The CH-007 is available in three configurations depending on your project stage: **CH-007 Board** — the carrier board alone, for teams integrating their own Jetson Orin NX or Nano module. Includes setup and flash scripts, and full documentation. **Developer Kit** — the CH-007 board paired with a Jetson Orin NX 8 GB module and a 1 TB M.2 NVMe SSD. Ready to flash and develop from day one. **Video Development Kit** — the complete Developer Kit bundled with an LT-313 4K PCIe capture card. The recommended starting point for building edge AI video pipelines. All configurations include the same software toolkit (environment setup, flash scripts, customizable Ubuntu rootfs, pre-configuration file). ### Can I use any capture card with the CH-007, or only Enciris cards ? The CH-007 exposes a full-size PCIe Gen3 x4 slot with 12V power — a genuine expansion slot that accepts any compatible PCIe card. Enciris LT-300 and CV-400 products are tested and supported out of the box with dedicated drivers and API integration. Note that the LT-100 series is not compatible with the CH-007 platform. Third-party PCIe cards can also be installed, subject to driver availability for Ubuntu/JetPack. ### What AI frameworks are supported on the CH-007 ? The core AI frameworks — CUDA, cuDNN, and TensorRT — are bundled directly in the NVIDIA JetPack binaries and installed automatically when you flash the module. DeepStream, PyTorch, and TensorFlow are available separately via the standard JetPack SDK channels and can be installed with the environment setup script provided with the CH-007. ### Which product is right for my application ? **Use Case** **Recommended Products** Acquiring SD/HD video with onboard encoding [ LT-100 series](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/ "LT-100 Professional SD/HD Video Capture and Compression") Multi-channel HD/4K acquisition and recording [ LT-300 series](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/ "LT-300 Series – Professional HD/4K Video Acquisition & Streaming") Compact 4K camera with real-time SDI/HDMI output [CV-400 series](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/ "CV-400 Series – 4K Professional Camera Platform") Edge AI inference + video acquisition in an embedded system [CH-007 series](https://www.enciris.com/ch-007-edge-ai-carrier-board-jetson-orin/ "CH-007 — Edge AI Development Platform for NVIDIA Jetson Orin") Not sure? [Contact our team](https://www.enciris.com/contact-enciris-professional-video-capture-solutions/) — we support custom configurations for specific requirements. ## About Enciris video capture & edge AI hardware Enciris designs and manufactures professional video capture solutions for OEMs, system integrators, and embedded application developers. Our product portfolio covers SD/HD and 4K capture cards (PCIe and USB) supporting SDI, HDMI, DVI-I, and DisplayPort inputs, modular 4K camera systems with low-latency video output, and edge AI platforms for real-time vision and inference at the edge. From legacy video formats to ultra-low-latency 4K acquisition, our hardware is engineered and assembled in France for medical imaging, defense, broadcast, industrial automation, and scientific research. Backed by ISO 9001:2015 certified manufacturing and long-term product availability, Enciris supports your project from prototype to production. --- ### [Custom Video Capture Solutions](https://www.enciris.com/custom-video-capture-solutions/) **Published:** June 17, 2026 **Author:** Guillaume Bussat **Content:** # Custom video capture solutions, built on proven technology Every custom video capture project we deliver is anchored on our [standard products](https://www.enciris.com/products/) and 20 years of frame grabber expertise. Whether you need to adapt an existing card to extreme constraints, extend our software, or build a complete pipeline around our hardware, our team designs reliable solutions tailored to your application. [ Discuss your project ](#contact) ## What you can customize A broad customization perimeter, always rooted in our products and engineering competencies. #### Inputs & Outputs SDI, HDMI, DisplayPort, audio jack, custom connectors #### Form Factor PCIe, Mini PCIe, M.2, custom mechanical & thermal envelope #### Firmware Features Overlays, compositing, scaling, color processing, sync #### Software & API REST endpoints, CLI extensions, OS drivers, SDK hooks #### Graphical interfaces Touchscreen GUIs, control panels, operator consoles #### Qualification Medical, aerospace, EMC, EMI, extended temperature ## Past custom video capture projects A selection of cards and systems we’ve designed for specific customer requirements. ![Custom Full HD video receiver board with Ethernet decompression for medical applications](https://www.enciris.com/wp-content/uploads/2026/06/es260_photo_blur2.png) #### Low-latency video receiver Receives a compressed Full HD video stream over Ethernet, decompresses and displays it with ultra low latency. ![Ruggedized LT-122 custom video capture card for aerospace](https://www.enciris.com/wp-content/uploads/2026/06/ea111_photo_blur.png) #### Ruggedized LT-122 variant LT-122 adapted with mission-specific connectors and qualified for an extended operating range. ![Custom camera platform with HDMI, SDI, DisplayPort and PCIe video outputs](https://www.enciris.com/wp-content/uploads/2026/02/cv22_photo_blur.png) #### Camera Platform Direct interface for a camera head with HDMI, SDI, DisplayPort and PCIe outputs and a complete on-board image pipeline. ## How a custom project unfolds A shared engineering process from first call to long-term production. The design phase adapts to your starting point — an existing Enciris card, or a new project from scratch. 1 #### Discovery Requirements & feasability 2 #### Design Two path, see below 3 #### Prototype Tests & qualification 4 #### Production Long-term availability — Design phase: two starting points — PATH 1 #### Product Adaptation Adapt a proven Enciris card, such as the [LT-300](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/) or [CV-400](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/), to your specific constraints: connectors, form factor, firmware features, software stack. PATH 2 #### Full custom development Define system architecture from scratch and design custom frame grabber hardware, firmware and software around your application. ## Why Enciris for custom work Two decades of video capture engineering, all under one roof, from first specs to long-term production support. #### 20+ years of expertise Battle-tested architectures, not first attempts. #### Designed & built in France Direct contact with the engineers who design your board. #### 10+ year availability Integrate once, deploy for a decade without re-qualification. #### Lifetime support Direct line to the engineering team for the life of the product. ## Have a project in mind? Share a short brief and our engineering team will get back to you to discuss feasibility and next steps. Name Company Email Phone Industry Medical Aerospace & Defense Industrial / Machine vision Broadcast Transportation Research & Education Other Starting point Adapt an existing Enciris card Design a new board Custom software or firmware Custom user interface (GUI / touchscreen) Complete custom system Not sure yet — need advice Project description Send --- ### [CH-007 — Edge AI Development Platform for NVIDIA Jetson Orin](https://www.enciris.com/ch-007-edge-ai-carrier-board-jetson-orin/) **Published:** March 30, 2026 **Author:** Guillaume Bussat **Excerpt:** Compact carrier board for NVIDIA Jetson Orin NX and Nano. Features a true PCIe Gen2 x4 slot with 12V power, dual M.2 NVMe, and ready-to-use flash and environment setup scripts. Available as board only or developer kit. **Content:** # CH-007 Edge AI platform ## Compact carrier board for NVIDIA Jetson Orin NX & Nano modules The CH-007 is a compact carrier board designed to unlock the full potential of NVIDIA Jetson Orin NX and Nano modules — with a true PCIe x4 slot, dual NVMe storage, and a complete software toolkit to get from unboxing to running inference in minutes. - True PCIe Gen3 x4 with 12V — accepts full-size expansion cards - Dual M.2 NVMe slots for OS and data storage - One-command environment setup and flash scripts - Customizable Ubuntu rootfs - Compatible with NVIDIA Jetson Orin NX 8/16 GB and Orin Nano 4/8 GB modules - Designed and assembled in France ![](https://www.enciris.com/wp-content/uploads/2026/02/ch007_photo.png) ## Choose your configuration The CH-007 is available in several configurations to match your project needs — from the board alone to a complete ready-to-develop kit. ![](https://www.enciris.com/wp-content/uploads/2026/03/ch-007_photo-1.png) #### CH-007 Board The carrier board alone, for integration with your own Jetson Orin module. - CH-007 carrier board - Setup & flash scripts - Documentation ![](https://www.enciris.com/wp-content/uploads/2026/03/ch-007_jetson_photo-1.png) #### Developer Kit Ready-to-develop package with module and storage included. - CH-007 carrier board - NVIDIA Jetson Orin NX 8 GB - M.2 NVMe SSD 1 TB - Setup & flash scripts ![](https://www.enciris.com/wp-content/uploads/2026/03/ch-007_jetson_lt-313_photo.png) #### Video Development Kit Developer Kit bundled with the LT-313 4K capture card for AI video pipelines. - CH-007 carrier board - NVIDIA Jetson Orin NX 8 GB - M.2 NVMe SSD 1 TB - [LT-313](https://www.enciris.com/products/lt-313/) capture card - Setup & flash scripts [ Contact Us For OEM Pricing ](https://www.enciris.com/contact/?type=sales) ## Designed for real expansion Most Jetson carrier boards limit expansion to M.2 slots. The CH-007 goes further — a genuine PCIe x4 slot with 12V power opens the door to full-size cards: video capture, networking, custom accelerators. Combined with dual NVMe and a complete I/O set, it covers both development and embedded deployment. ### PCIe Gen3 x4 — 12V Full-size slot with 12V power rail. Accepts professional expansion cards — capture, networking, accelerators. Unique among compact Jetson boards. ### Dual M.2 NVMe Two independent NVMe slots (PCIe x2 + x1). Dedicate one to the OS, one to data or model storage — no compromise needed. ### USB & connectivity 2× USB-C Gen 3.0 including recovery mode, 1× USB-A Gen 3.0, Gigabit Ethernet, HDMI output via extender. ### GPIO & power SPI, I2C, I2S headers, battery connector, fan connector for Jetson heatsink, onboard fuse for reliable embedded deployment. [ ![](https://www.enciris.com/wp-content/uploads/2026/04/ch-007_schema_top.png) ](https://www.enciris.com/wp-content/uploads/2026/04/ch-007_schema_top.png) ###### Top View [ ![](https://www.enciris.com/wp-content/uploads/2026/04/ch-007_schema_bot-1.png) ](https://www.enciris.com/wp-content/uploads/2026/04/ch-007_schema_bot-1.png) ###### Bottom View ## From unboxing to running inference Setting up a Jetson development environment typically takes days — flashing the module, configuring the OS, installing the full SDK stack. The CH-007 ships with a set of scripts that automate the entire process, from a bare module to a fully configured Ubuntu environment ready for AI development. ### Environment Setup Script Installs the complete NVIDIA JetPack stack and all SDK components in a single command — no manual dependency resolution or version conflicts. ### Flash Script Automates the full flash sequence for module and SSD. Handles recovery mode, partition layout, and all CH-007-specific boot configuration. ### Custom Ubuntu rootfs Recompile a trimmed Ubuntu image with a custom package list, lighter footprint while retaining full GNOME desktop support or completly headless configuration. ### Pre-configuration File Inject locale, users, network and package settings at flash time. The board boots fully configured — no post-flash setup required. ## Specifications #### Connectivity PCIe expansion Gen3 x4, 12V M.2 NVMe – slot 1 PCIe x2 M.2 NVMe – slot 2 PCIe x1 USB-C 2x Gen 3.0 (inc. recovery) USB-A 1x Gen 3.0 Ethernet 1x Gigabit HDMI Output Optional via extender #### I/O & power Battery connector Yes Fan connector 4-pin (Jetson heatsink) Expansion header 38-pin (GPIOs, UART, SPI, I2C, I2S) Fuse 1x Input voltage 12-19 V Power consumption Module + PCIe card dependent #### Mechanical Dimensions (L × W) 118 x 87 mm Height (board only) 22.5 mm Weight (board only) 93 g Mounting holes 4x M3 – see mechanical drawing Operating temperature 0 to 50 °C (ambient, system dependent) #### General Form factor Compact carrier board Compatible modules All NVIDIA Jetson Orin NX & Nano Designed & assembled France OS support Ubuntu 22.04 (JetPack) Certifications CE marking #### NVIDIA Jetson Module The CH-007 supports all NVIDIA Jetson Orin NX and Orin Nano modules. AI performance and memory capacity depend on the selected module. Module CPU Cores GPU Cores AI Perf. HW Encoder HW Decoder TDP Orin NX 16 GB 8× Cortex-A78AE 1024 CUDA / 32 Tensor 157 TOPS 4K60 H.265 8K30 H.265 10W – 40W Orin NX 8 GB 6× Cortex-A78AE 1024 CUDA / 32 Tensor 117 TOPS 4K60 H.265 8K30 H.265 10W – 40W Orin Nano 8 GB 6× Cortex-A78AE 1024 CUDA / 32 Tensor 67 TOPS – 4K60 H.265 7W – 25W Orin Nano 4 GB 6× Cortex-A78AE 512 CUDA / 16 Tensor 34 TOPS – 4K60 H.265 7W – 25W Specifications are based on NVIDIA datasheets. TDP values reflect configurable power modes. The Jetson Orin Nano series does not include hardware video encoding (NVENC); video encoding must be performed using CPU-based software solutions (e.g. FFmpeg/libx264). Refer to [official NVIDIA documentation](https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-orin/) for complete specifications. ## What you can build The CH-007 is a general-purpose edge AI platform. Here is what becomes possible when you combine it with a camera and the right model. ![](https://www.enciris.com/wp-content/uploads/2026/04/ch-007_cv-420_photo.png) ###### CH-007 + CV-420 — a complete embedded vision platform ![](https://www.enciris.com/wp-content/uploads/2026/04/Ai_cv-20_legend-2.png) ###### Electronic board inspection Identify defective components on a production line — missing parts, wrong orientation, soldering anomalies. With the right vision model, the CH-007 gives you the compute foundation to build your own AOI system. ![](https://www.enciris.com/wp-content/uploads/2026/04/Ai_traffic_legend-2.png) ###### Traffic analysis Imagine a system that counts and classifies road users in real time — vehicles, buses, pedestrians — processed locally at the edge, without cloud dependency or network infrastructure. ![](https://www.enciris.com/wp-content/uploads/2026/02/test-scaled.jpg) ## Get in Touch with Our Team Have a specific requirement or a long-term project ? Our team supports you from hardware and software integration to long-term availability and product lifecycle management. - Custom features, form factors and interface combinations - Software and hardware integration support, tailored to your workflow - Long-term support and guaranteed product availability - Designed and assembled in France [ Contact Us ](https://www.enciris.com/contact) ## Downloads CH-007\_HW\_Reference\_Manual\_v1.0.0.pdf 1 MB \| 04/17/2026 [Download](https://www.enciris.com/ch-007-edge-ai-carrier-board-jetson-orin/?rdownload_file=ch007/CH-007_HW_Reference_Manual_v1.0.0.pdf&require_login=0) ## Related Products [ ![Enciris LT-313 hybrid SDI and HDMI 4K video capture card PCIe frame grabber for multi-source video acquisition](https://www.enciris.com/wp-content/uploads/2026/02/lt-313_photo-1.png) ###### LT-313 ](https://www.enciris.com/products/lt-313) [ ![Enciris CV-420 4K camera platform remote head imaging system for medical and industrial applications](https://www.enciris.com/wp-content/uploads/2026/02/cv420_photo5.png) ###### CV-420 ](https://www.enciris.com/products/cv-420) --- ### [CV-400 Modular 4K Camera Platform](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/) **Published:** July 7, 2026 **Author:** Guillaume Bussat **Content:** # CV-400 Professional 4K Camera Series Modular low-power 4K camera platform The **CV-400** is a modular 4K camera platform for OEM and professional imaging. Built on a 1/2-inch 10-bit sensor and the Enciris image engine, it delivers native 4Kp60 video with low latency and on-camera control over exposure, color, noise, and enhancement across more than 22 parameters. Two form factors share this imaging core: the **CV-420** remote head with a Camera Control Unit for board-level OEM integration, and the **CV-440** standalone system with a built-in touchscreen. Both output over SDI and HDMI and run on the same software environment as the LT-300 through a RESTful API. Designed and assembled in France, the CV-400 targets medical, microscopy, and industrial imaging. Native 4K60 10-bit 4× 12G SDI + HDMI 4K C-mount ## Choose the right CV-400 for your integration Two form factors share the same 4K imaging core. Pick the one that fits how you build. [ ![Enciris CV-420 4K camera platform remote head imaging system for medical and industrial applications](https://www.enciris.com/wp-content/uploads/2026/02/cv420_photo5.png) #### CV-420 4K Camera A compact remote head paired with a Camera Control Unit that captures over PCIe. Designed for board-level OEM integration into instruments and embeded systems, with multiple SDI and HDMI outputs and real-time overlay. Remote head with PCIe capture ](https://www.enciris.com/products/cv-420) [ ![Enciris CV-440 4K camera platform high performance imaging system for real-time video acquisition and processing](https://www.enciris.com/wp-content/uploads/2026/02/cv-440_photo.png) #### CV-440 4K Camera System A self-contained system combining the same remote head with a compact host enclosure and a built-in touchscreen. It runs independently, with no host PC or capture card, driving its SDI and HDMI outputs directly. Standalone with built-in touchscreen ](https://www.enciris.com/products/cv-440) Need a different configuration? The CV-400 series covers most 4K camera needs, but if your application requires specific optics, form factor, image processing features or software integration, we design custom solutions built on the same proven technology. [ Discuss your project ](https://www.enciris.com/custom-video-capture-solutions/#contact) ## Software & Integration The CV-400 series is supported by a comprehensive software stack designed to simplify integration while offering advanced video processing capabilities. From low-level access to raw frames to high-level features such as compositing, recording, and HDMI overlays, the Enciris software environment provides the flexibility needed to build a wide range of professional video workflows. ![Enciris CV-400 touchscreen interface for camera control and real-time configuration of 4K imaging parameters](https://www.enciris.com/wp-content/uploads/2026/01/cv400_touchscreen-1.png) ### Touchscreen Interface - CV440 The CV440 is a standalone camera system designed to operate independently, without relying on the media server. It features an integrated touchscreen that provides a local user interface for camera configuration and system control. Through this interface, users can adjust camera settings, monitor system status, and perform setup operations directly on the device. Video monitoring is handled via the video outputs of the system, while the touchscreen focuses on configuration rather than capture or processing workflows. ![Enciris CV-400 media server architecture for real-time video processing streaming and recording management](https://www.enciris.com/wp-content/uploads/2026/01/cv400_media_server-1.png) ### Media Server - CV420 CV-420 systems are managed through a dedicated Media Server, specifically designed for this camera family. It provides unified access to video acquisition, camera controls, and processing features, along with snapshot and recording capabilities. By abstracting hardware complexity, this Media Server exposes a single interface to acquire video, configure camera settings, and manage capture operations, allowing users to integrate CV-420 cameras easily into custom applications or automated environments. ![Enciris CV-400 video compositing system enabling multi-source 4K image processing and real-time signal fusion](https://www.enciris.com/wp-content/uploads/2026/01/cv400_compositing-1.png) ### Compositing The Media Server can combine multiple incoming video streams to produce a single composited output, allowing multi‑source views without additional hardware. This composited output can be used for live display, recording, or snapshot capture, offering a flexible foundation for a wide range of use cases. ![Enciris CV-400 HDMI overlay system enabling real-time annotations and data injection on 4K video streams](https://www.enciris.com/wp-content/uploads/2026/01/cv400_hdmi_overlay.png) ### HDMI / SDI Overlay The platform includes built-in overlay capabilities that allow text, shapes, and images to be added directly onto incoming video streams. With transparency control and dynamic updates, users can integrate custom graphics or predefined templates in real time. Overlays are applied directly to all video outputs, including HDMI and SDI, providing immediate and consistent visual feedback across all display interfaces. ![Enciris API software stack enabling Go C++ Python and C# integration for real-time video processing](https://www.enciris.com/wp-content/uploads/2026/01/api_frameworks.png) ### APIs & Frameworks Enciris provides a RESTful API to access the Media Server features and control camera system. To simplify integration, client libraries are available in C++, Go, and Python, allowing applications to interact with the server without dealing with low-level communication details. Support for standard multimedia frameworks such as DirectShow on Windows and V4L2 on Linux enables CV-420 cameras to be integrated easily into existing video pipelines and third-party applications. [ Documentation ](https://www.enciris.com/cv-400-api-the-programmer-guide/) ![Enciris ECURL command-line tool for CV-400 media server control based on REST API enabling scripting automation and system testing](https://www.enciris.com/wp-content/uploads/2026/01/cv400_ecurl.png) ### Command-Line Interface - Ecurl Ecurl is a command‑line tool built on top of the RESTful API. It allows users to control the Media Server directly from a terminal using simple URLs and commands, making it suitable for scripting, automation, and testing in both development and deployment environments. [ Command generator ](https://enciris.com/ecurl-cmd-generator) ### Demonstration Application – Ecam Ecam is an interactive demonstration application built using the Enciris Go API. It provides a graphical interface to explore CV‑420 camera features, including live video acquisition, camera configuration, snapshot capture, and recording. It is an effective tool for evaluating camera behavior and system capabilities without writing any code. Enciris Camera Control Home Exposure Colors Visuals camera/0 3840x2160p 59.94Hz SDI Outputs 0# 12G 4x3G 3G Off 1# 12G 4x3G 3G Off 2# 12G 4x3G 3G Off 3# 12G 4x3G 3G Off HDMI Output 0# Auto Full HD Off Monitors Overlay None Overlay 0 Load Overlay 1 Load Auto Manual Framerate 50Hz 60Hz Level 50 90 80 Speed 20 100 80 MaxSaturation 0 30 2 Auto exposure advanced parameters - Enable / disable binning and/or low light boost - Minimum and maximum limits for shutter and gain - Metering zone Shutter 1.0 240.0 240.0 Gain 1.0 22.5 22.4 Binning 1.0 8.0 1.0 Low light gain 1.0 2.5 1.2 Perform white balance Red x1.00 Green x1.00 Blue x1.00 Temperature 6500 K Manual temperature Temperature 3500 7500 6500 Gamma 1.0 1.8 2.0 2.2 HSBC Hue -30 30 0 Saturation 0 100 50 Brightness 0 100 50 Contrast 0 100 50 View Flip None X Y XY Zoom 1.0 4.0 1.0 Details sharpness Strength 1.0 9.0 1.0 Floor 0 50 1 Noise reduction Anisotropic 0 100 100 Bilateral 0 100 0 Shadow lighting Gain 1.0 2.5 1.0 ## Imaging capabilities The image engine is shared across both variants and driven entirely through the API, with over 22 adjustable parameters. It shapes the image from sensor to output, before the shared media server handles capture, recording, and overlay. ### Image processing Exposure Auto-exposure, analog and digital gain, shutter Color White balance, HSBC, gamma Enhancement Tone mapping, sharpness, zoom Noise Advanced de-noise, low-light ### Video outputs HDMI RGB / YUV 4:4:4 (8-bit), YUV 4:2:2 (12-bit) SDI YUV 4:2:2 (10-bit) Resolution Up to 4K at 60 Hz, all outputs Legacy 4Kp60 via 4× 3G-SDI (2SI) Configured once through the API, applied consistently across every output. Need to go further with the software? Beyond default stream configurations, we can tailor the Media Server, APIs, codecs and integrations to your specific workflow. [ Discuss your integration ](https://www.enciris.com/custom-video-capture-solutions/#contact) ## Downloads Documentation Installer & SDK Product Brief 8 MB \| 02/11/2026 [Download](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/?rdownload_auto=cv400&type=brief&require_login=0) API Programmer Guide 1.3.3 3 MB \| 02/11/2026 [Download](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/?rdownload_auto=cv400&type=api&require_login=0) Installer 1.3.3 Windows: 112 MB \| Linux: 50 MB [⊞ Windows](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/?rdownload_auto=cv400&type=installer&platform=windows&require_login=0 "Download ⊞ Windows")[🐧 Linux](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/?rdownload_auto=cv400&type=installer&platform=linux&require_login=0 "Download 🐧 Linux") SDK 1.3.3 Windows: 2 MB \| Linux: 5 MB [⊞ Windows](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/?rdownload_auto=cv400&type=sdk&platform=windows&require_login=0 "Download ⊞ Windows")[🐧 Linux](https://www.enciris.com/cv-400-series-4k-professional-camera-platform/?rdownload_auto=cv400&type=sdk&platform=linux&require_login=0 "Download 🐧 Linux") ## Frequently asked questions ### What is the difference between the CV-420 and the CV-440? The CV-420 is a remote head camera with a Camera Control Unit that captures over PCIe, built for OEM integration into equipment such as microscopes and endoscopes. The CV-440 is a standalone system with a built-in touchscreen that runs on its own, with no host PC or capture card. Both share the same 1/2-inch 10-bit sensor, native 4Kp60 imaging, and SDI/HDMI outputs. ### Can the camera head be supplied as bare boards for OEM integration? Yes. For integration into instruments such as endoscopes and microscopes, the CV-420 camera head can be supplied as bare electronic boards, without an enclosure, to build directly into your device. Housed heads and the fully packaged CV-440 are available when you need a finished product. ### What sensor, resolution, and lenses does the CV-400 use? The camera head uses a 1/2-inch 10-bit CMOS sensor and delivers native Ultra HD 4Kp60 with low latency. It takes standard C-Mount lenses, with CS-Mount supported through an adapter, and mounts as a remote head inside optical instruments such as microscopes and endoscopes. ### Can a CV-400 camera feed an Enciris capture card? Yes. Over SDI and HDMI it feeds the LT-300 series, which captures, processes, and records the full 4K stream. It also works with the LT-100 series: over HDMI or DVI-D the connection is automatic, and over SDI you set the camera output to 1080p, since the LT-100 is an HD/SD card. ### Which operating systems, languages, and hardware encoders are supported? Windows 10 and newer with native API and DirectShow support, and Linux (Ubuntu 22.04 and newer, Debian 12 and newer). Client code is provided in Go, C++, C#, and Python, driven through the RESTful API and the Ecurl CLI. Hardware encoding uses the host GPU from Intel, NVIDIA, or AMD. ### Are the CV-400 products medically certified? No. The CV-400 is not sold as a certified medical device, but it ships with standard CE and EMC certification and is designed for medical integration. Customers have already obtained medical certification for their own devices built on Enciris cameras. As the device manufacturer you complete that certification, and the CV-420 head can be supplied at board level to build directly into your instrument. ## Beyond the CV-400 Explore the rest of the Enciris hardware range. [ ![Enciris LT-122 dual channel SDI PCIe video capture card with dual H.264 encoders for broadcast and embedded applications](https://www.enciris.com/wp-content/uploads/2026/02/lt-122_photo-300x200.png) VIDEO PROCESSING ### LT-300 Series Capture, process, and record CV-400 streams on a multi-channel HD/4K platform. Explore → ](http://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/) [ ![](https://www.enciris.com/wp-content/uploads/2026/02/ch007_photo-300x200.png) EDGE AI ### CH-007 AI Platform Run AI inference on CV-400 video with an NVIDIA Jetson Orin platform. Explore → ](http://www.enciris.com/ch-007-edge-ai-carrier-board-jetson-orin/) [ ![Enciris LT-122 dual channel SDI PCIe video capture card with dual H.264 encoders for broadcast and embedded applications](https://www.enciris.com/wp-content/uploads/2026/02/lt-122_photo-300x200.png) VIDEO CAPTURE ### LT-100 Series Reliable SD and HD capture with on-board H.264 compression for legacy and professional sources. Explore → ](http://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/) --- ### [LT-100 SD/HD Video Capture Cards with H.264](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/) **Published:** July 7, 2026 **Author:** Guillaume Bussat **Content:** # LT-100 Capture & Compression Card Series Reliable SD/HD video capture cards with integrated H.264 compression The LT-100 series is a family of SD/HD video capture cards with integrated **H.264 hardware compression**, from 1080p60 down to legacy analog standards. Built to handle both **digital and analog** sources, it ensures efficient, low-latency capture while offloading encoding from the host CPU. Available as **PCIe cards and a standalone USB system**, single or dual-channel, the LT-100 family is a proven solution for medical, industrial, broadcast and embedded environments that require reliable, frame-accurate video capture. Full HD Capture Analog & Digital Hardware H.264 PCIe & USB ## Choose the right LT-100 for your inputs Four capture options sharing the same H.264 hardware compression. Pick the form factor and inputs that match your integration. [ ![Enciris LT-102 PCIe video capture card with H.264 hardware encoder supporting SD to Full HD inputs](https://www.enciris.com/wp-content/uploads/2026/02/lt-102_photo.png) #### LT-102 PCIe Capture Card Single-channel PCIe capture with one H.264 encoder. Supports DVI-I, Composite and S-Video, with optional SDI. Handles SD to Full HD and legacy analog resolutions, with embedded or external audio. Most versatile single-channel card ](https://www.enciris.com/products/lt-102/) [ ![Enciris LT-122 dual channel SDI PCIe video capture card with dual H.264 encoders for broadcast and embedded applications](https://www.enciris.com/wp-content/uploads/2026/02/lt-122_photo.png) #### LT-122 Dual-Channel SDI Capture Card Dual-channel PCIe SDI capture with two H.264 encoders and direct loopthrough on each input. Supports SD to Full HD, with embedded audio and dual external audio. Two SDI channels with loopthrough ](https://www.enciris.com/products/lt-122/) [ ![Enciris LT-124 dual channel DVI-I PCIe video capture card with hardware compression for SD and Full HD video acquisition](https://www.enciris.com/wp-content/uploads/2026/02/lt-124_photo.png) #### LT-124 Dual-Channel DVI-I Capture Card Dual-channel PCIe DVI-I capture with two H.264 encoders. Supports SD to Full HD and legacy DVI resolutions, with embedded and optional external audio. Two DVI-I channels on one card ](https://www.enciris.com/products/lt-124/) [ ![Enciris LT-101 USB video capture system with H.264 encoding supporting HDMI DVI and analog inputs for real time processing](https://www.enciris.com/wp-content/uploads/2026/02/lt101_photo.png) #### LT-101-USB Capture System Standalone USB capture system with one H.264 encoder. Supports Composite, S-Video and DVI-I, with optional SDI. Handles SD to Full HD and legacy analog resolutions, with embedded or external audio. No PCIe slot required ](https://www.enciris.com/products/lt-101/) Need a different configuration? The LT-100 series covers most SD/HD capture and compression needs, but if your application requires specific input formats, form factor, encoding parameters or software integration, we design custom solutions built on the same proven technology. [ Discuss your project ](https://www.enciris.com/custom-video-capture-solutions/#contact) ## Software & Integration The LT-100 comes with lightweight software tools to integrate video capture into your applications, whether you need direct access to raw or compressed streams, or plug-and-play integration on Windows. ![Enciris LT-100 series C API for configuring PCIe video capture cards and accessing compressed H.264 streams](https://www.enciris.com/wp-content/uploads/2026/02/lt100_api-1.png) ### Simple C API A straightforward C API configures hardware compression and capture settings, and lets applications retrieve either compressed H.264 streams or raw video frames. The lightweight, deterministic interface is well suited to custom software, embedded systems and industrial environments where reliability and predictable timing matter. [ Documentation ](https://www.enciris.com/lt100-api-the-programmer-guide/) ![Enciris DirectShow filter for LT-100 video capture cards enabling standard Windows video device integration](https://www.enciris.com/wp-content/uploads/2026/02/lt100_dshow-1.png) ### DirectShow Filter On Windows, a DirectShow filter exposes LT-100 cards as standard video sources in any DirectShow-compatible application. A dedicated configuration utility sets video format, resolution and framerate, enabling fast, code-free setup and simplifying integration into Windows-based workflows. ## Capture & encoding capabilities The LT-100 captures both digital and analog sources and compresses them in hardware, in real time — keeping host CPU load low and latency predictable across the whole series. ### Capture & processing Video standards SD, HD, Full HD VESA CVT / GTF (DVI-I, DVI-D) Resolutions Broadcast standards plus user-defined CVT / GTF (e.g. 1920×1200) Video inputs SDI, DVI-I, DVI-D, S-Video, Composite (by model) Channels 1 or 2 per card Hardware processing Deinterlacing, downscaling, cropping, noise reduction Loopthrough output available on LT-122 ### Compression & output Compression Real-time H.264, hardware-based, up to 1080p30 per channel Encoder control Configurable bitrate & GOP Native formats YUV 4:2:2, H.264 Audio PCM, 2 ch, 48 kHz / 16-bit SDK C library, Windows & Linux A DirectShow filter is also available on Windows for code-free integration. Need to go further with the software? Beyond the standard C API and DirectShow filter, we tailor firmware, encoding parameters and integration to your specific workflow. [ Discuss your integration ](https://www.enciris.com/custom-video-capture-solutions/#contact) ## Downloads Documentation Installer & SDK LT101 USB Product Brief r3 697 KB \| 02/12/2026 [Download](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/?rdownload_file=lt100/lt101-usb_product_brief_r3.pdf&require_login=0) LT102 Product Brief r3 735 KB \| 02/12/2026 [Download](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/?rdownload_file=lt100/lt102-pcie_product_brief_r3.pdf&require_login=0) LT122 Product Brief r2 758 KB \| 02/12/2026 [Download](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/?rdownload_file=lt100/lt122_pcie_product_brief_r2.pdf&require_login=0) LT124 Product Brief r3 691 KB \| 02/12/2026 [Download](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/?rdownload_file=lt100/lt124-pcie_product_brief_r3.pdf&require_login=0) Documentation 4 MB \| 02/12/2026 [Download](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/?rdownload_auto=lt100&type=api&require_login=0) Installer 2.91.2 Win x64: 12 MB \| Win x86: 13 MB \| Linux: 11 MB [⊞ Win x64](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/?rdownload_auto=lt100&type=installer&platform=windows_x64&require_login=0 "Download ⊞ Win x64")[⊞ Win x86](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/?rdownload_auto=lt100&type=installer&platform=windows_x86&require_login=0 "Download ⊞ Win x86")[🐧 Linux](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/?rdownload_auto=lt100&type=installer&platform=linux&require_login=0 "Download 🐧 Linux") SDK 2.91.2 Windows: 111 KB \| Linux: 3 MB [⊞ Windows](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/?rdownload_auto=lt100&type=sdk&platform=windows&require_login=0 "Download ⊞ Windows")[🐧 Linux](https://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/?rdownload_auto=lt100&type=sdk&platform=linux&require_login=0 "Download 🐧 Linux") ## Frequently asked questions ### What's the difference between the LT-100 models? All LT-100 cards share the same H.264 hardware compression; they differ by inputs and form factor. The LT-101-USB and LT-102 handle both analog and digital sources (Composite, S-Video, DVI-I, optional SDI): the LT-101 as a standalone USB system that needs no PCIe slot, the LT-102 as a single-channel PCIe card. The LT-122 is dual-channel SDI with loopthrough, and the LT-124 is dual-channel DVI-D; both are digital-only. ### Does the LT-100 handle both analog and digital sources? It depends on the model. The LT-101 and LT-102 capture both analog (Composite, S-Video) and digital (DVI-I, optional SDI). The LT-122 (SDI) and LT-124 (DVI-D) are digital-only. Across the series, incoming resolution and frame rate are detected automatically. ### What resolutions does the LT-100 support? Beyond broadcast standards (SD PAL/NTSC, 720p, 1080i, 1080p60), the DVI inputs accept user-defined VESA CVT/GTF resolutions, up to 1920×1200 at 60 Hz to date. Raw capture reaches 1080p60, while real-time H.264 compression runs up to 1080p30 per channel. ### Does it work on Linux, or only Windows? Both. The C library SDK is fully compatible with Windows (8, 10, 11) and Linux (Ubuntu 22.04+, Debian 12+), and ships with example code, including for recording. The DirectShow filter is Windows-only. ### Can I capture and compress two channels at the same time? Yes, on the dual-channel cards (LT-122, LT-124). Any input can be routed to any channel, and a single input can even feed both channels at once. Each channel has its own hardware encoder, running real-time H.264 up to 1080p30 per channel, in parallel and without loading the host CPU. ## Beyond the LT-100 Other Enciris families that extend or complement LT-100 capture. [ ![Enciris LT-122 dual channel SDI PCIe video capture card with dual H.264 encoders for broadcast and embedded applications](https://www.enciris.com/wp-content/uploads/2026/02/lt-122_photo-300x200.png) VIDEO PROCESSING ### LT-300 Series When SD/HD reaches its limits, the LT-300 adds HD/4K acquisition, multi-channel capture and on-board recording, compositing and overlay. Explore → ](http://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/) [ ![Enciris CV-420 4K camera platform remote head imaging system for medical and industrial applications](https://www.enciris.com/wp-content/uploads/2026/02/cv420_photo5-300x200.png) 4K CAMERAS ### CV-400 Series A modular low-power 4K camera that pairs directly with the LT-100: automatic over HDMI or DVI-D, or over SDI with the camera set to 1080p. Explore → ](http://www.enciris.com/cv-400-series-4k-professional-camera-platform/) --- ### [LT-300 Multi-Channel HD/4K Video Capture Cards](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/) **Published:** July 7, 2026 **Author:** Guillaume Bussat **Content:** # LT-300 HD/4K Capture Card Series A programmable capture platform for real-time video applications The LT-300 series is a family of multi-channel **HD/4K video capture cards** backed by an integrated software stack. Together they form a programmable platform supporting standards from 4K60 down to 720p over flexible **SDI** and **HDMI** inputs. Designed for low-latency operation, it handles raw acquisition, recording, real-time processing, compositing, and [dynamic overlays](https://www.youtube.com/watch?v=hji2hH8hEpo). An integrated **HDMI loop-through** output provides live display with overlays applied, making the platform suitable for medical, industrial, avionic, extended-temperature, and high-end broadcast applications. SDI & HDMI inputs Embedded audio Up to 4K60 PCIe ## Choose the right LT-300 for your inputs Three variants share the same platform. Pick the one that matches your input mix. [ ![Enciris LT-311 4K SDI video capture card PCIe multi-channel frame grabber for real-time UHD acquisition and recording](https://www.enciris.com/wp-content/uploads/2026/02/lt-311_photo.png) #### LT-311 HD/4K Capture Card Four SDI inputs for high-performance video capture. Supports HD to 4K formats with embedded audio and HDMI loopthrough with real-time overlay. Up to 4 simultaneous streams ](https://www.enciris.com/products/lt-311) [ ![Enciris LT-312 dual HDMI 4K video capture card PCIe with real-time acquisition and low latency video processing](https://www.enciris.com/wp-content/uploads/2026/02/lt-312_photo.png) #### LT-312 HD/4K Capture Card Dual HDMI inputs provide flexible 4K/HD capture, with embedded audio and real-time HDMI loopthrough. Up to 2 simultaneous streams ](https://www.enciris.com/products/lt-312) [ ![Enciris LT-313 hybrid SDI and HDMI 4K video capture card PCIe frame grabber for multi-source video acquisition](https://www.enciris.com/wp-content/uploads/2026/02/lt-313_photo-1.png) #### LT-313 HD/4K Capture Card Hybrid 2 SDI + 1 HDMI inputs for versatile video capture. Supports HD to 4K formats with embedded audio, HDMI loopthrough, and real-time overlay. Up to 3 simultaneous streams ](https://www.enciris.com/products/lt-313) Need a different configuration? The LT-300 series covers most HD/4K capture needs, but if your application requires specific connectors, form factor, firmware features or software integration, we design custom solutions built on the same proven technology. [ Discuss your project ](https://www.enciris.com/custom-video-capture-solutions/#contact) ## Integrated Software Platform The LT-300 series is supported by an integrated software stack designed to simplify integration while offering advanced video and audio processing capabilities. From low-level access to raw video and audio streams to high-level features such as compositing, recording, and dynamic overlays, the Enciris software environment provides the flexibility required to build a wide range of professional capture and processing workflows. ![Enciris media server architecture for LT-300 video platform managing multi-channel capture streaming and recording workflows](https://www.enciris.com/wp-content/uploads/2026/01/lt300_media_server.png) ### Media Server The LT-300 cards are managed through a dedicated Media Server, a central software component that handles all video and audio streams, along with their associated metadata. It provides access to raw frames in the desired format, as well as capture and recording capabilities. By abstracting the complexity of the hardware, the Media Server exposes a unified interface to control acquisition, processing, and output. Users can integrate the video streams into their own applications, while the server takes care of stream management, synchronization, and recording. ![Enciris LT-300 video compositing system enabling picture-in-picture multi-source HDMI and SDI processing in real time](https://www.enciris.com/wp-content/uploads/2026/01/lt300_compositing.png) ### Compositing The Media Server can combine multiple incoming video streams into a single composited output, enabling multi-source views without additional hardware. This composited output can be used for live display, recording, or snapshot capture, providing a flexible foundation for a wide range of professional use cases. ![Enciris LT-300 HDMI loop-through output with zero latency video overlay for live monitoring and real-time display applications](https://www.enciris.com/wp-content/uploads/2026/01/lt300_hdmi_overlay.png) ### HDMI Overlay The platform includes built-in overlay capabilities that allow text, shapes, and images to be added directly onto video streams. With transparency control and dynamic updates, custom graphics or predefined templates can be integrated in real time. Overlays are applied on the HDMI output, providing immediate visual feedback. Overlay content can be updated dynamically to display live labeling, status information, or on-screen cues in real time. ![Enciris API software stack enabling Go C++ Python and C# integration for real-time video processing](https://www.enciris.com/wp-content/uploads/2026/01/api_frameworks.png) ### APIs & Frameworks Enciris provides a RESTful API to control the Media Server and access all LT-300 features. To simplify integration, client libraries are available in C++, Go, and Python, allowing applications to interact with the server without dealing with low-level communication details. Standard multimedia frameworks are also supported through DirectShow on Windows and V4L2 on Linux, making LT-300 cards easy to integrate into existing video pipelines and third-party applications. [ Documentation ](https://www.enciris.com/lt-310-api-the-programmer-guide/) ![Enciris ECURL command-line tool for Media Server control based on RESTful API enabling scripting automation and testing of video capture and streaming systems](https://www.enciris.com/wp-content/uploads/2026/01/ecurl_3.png) ### Command-Line Interface - Ecurl Ecurl is a command‑line tool built on top of the RESTful API. It allows users to control the Media Server directly from a terminal using simple URLs and commands, making it suitable for scripting, automation, and testing in both development and deployment environments. [ CMD GENERATOR ](https://enciris.com/ecurl-cmd-generator) ### Demonstration Application - Ecap Ecap is an interactive demonstration application built using the Enciris Go API. It provides a graphical interface to explore LT‑300 capture features. It allows users to evaluate video and audio acquisition, configure capture parameters, perform recording and snapshot operations, and validate system behavior without writing any code. ECAP LIVE STILL RECORD **HDMI IN 0** 3840x2160p 60.00 Hz **HDMI IN 1** 1920x1080p 60.00 Hz HDMI Output Source HDMI 0 HDMI 1 Monitors overlay ![](https://www.enciris.com/wp-content/uploads/2026/01/ovl_none.png) ![](https://www.enciris.com/wp-content/uploads/2026/01/ovl_full-1.png) ![](https://www.enciris.com/wp-content/uploads/2026/01/ovl_api.png) HDMI Input 0 HDMI Input 1 ![](https://www.enciris.com/wp-content/uploads/2025/12/enciris-api-150x150.png) Patient: John Doe Recovery room: 12 HDMI Output ![Enciris Ecap demo app for LT-300 capture and recording](https://www.enciris.com/wp-content/uploads/2026/01/ecap.png) ### Demonstration Application - Ecap **Ecap** is an interactive demonstration application built using the Enciris Go API. It provides a graphical interface to explore LT‑300 capture features. It allows users to evaluate video and audio acquisition, configure capture parameters, perform recording and snapshot operations, and validate system behavior without writing any code. ## Capture & recording capabilities LT-300 boards handle the full pipeline from hardware capture to file recording. Input streams are captured and scaled by the board itself, then processed by the Media Server for encoding, compositing, and file output. ### Capture output per stream 1 stream 4K60 2 streams 2x 4K30 3 streams 1x 4K30 + 2x 1080p60 4 streams 4x 1080p60 HDMI loopthrough output is not affected by this scaling, it always outputs at the input’s native resolution. ### Recording formats & codecs Video containers MP4, raw H.264, NV12/YUYV Video codecs H.264, HEVC Audio formats AAC, MP3, PCM, WAV Hardware encoders NVIDIA NVENC, Intel QSV, AMD AMF Concurrent recordings Multiple files per input File splitting By size or duration One captured stream, multiple parallel outputs: file recording, network streaming, and application-level processing all share the same buffers with zero-copy transfer. Need to go further with the software? Beyond default stream configurations, we can tailor the Media Server, APIs, codecs and integrations to your specific workflow. [ Discuss your integration ](https://www.enciris.com/custom-video-capture-solutions/#contact) ## Downloads Documentation Installer & SDK Product Brief 311 KB \| 02/11/2026 [Download](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/?rdownload_auto=lt300&type=brief&require_login=0) API Programmer Guide 1.6.0 1 MB \| 07/29/2026 [Download](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/?rdownload_auto=lt300&type=api&require_login=0) Installer 1.6.0 Windows: 95 MB \| Linux: 39 MB [⊞ Windows](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/?rdownload_auto=lt300&type=installer&platform=windows&require_login=0 "Download ⊞ Windows")[🐧 Linux](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/?rdownload_auto=lt300&type=installer&platform=linux&require_login=0 "Download 🐧 Linux") SDK 1.6.0 Windows: 7 MB \| Linux: 7 MB [⊞ Windows](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/?rdownload_auto=lt300&type=sdk&platform=windows&require_login=0 "Download ⊞ Windows")[🐧 Linux](https://www.enciris.com/lt-300-series-professional-hd-4k-video-acquisition-streaming/?rdownload_auto=lt300&type=sdk&platform=linux&require_login=0 "Download 🐧 Linux") ## Frequently asked questions ### How many streams can each LT-300 card capture, and at what resolution? The maximum number of simultaneous streams matches the number of physical inputs: 4 on the LT-311, 2 on the LT-312, and 3 on the LT-313. The Media Server scales resolution with the number of active streams: one stream at 4K60, two at 4K30 each, three as one 4K30 plus two 1080p60, or four at 1080p60 each. HDMI loopthrough output always stays at the input’s native resolution, unaffected by this scaling. ### What recording formats and codecs does the LT-300 support? The LT-300 records to MP4 containers with H.264 or HEVC video codecs, and AAC, MP3, PCM, or WAV audio. Hardware-accelerated encoding is available through NVIDIA NVENC, Intel Quick Sync Video, and AMD AMF. Multiple recordings can run in parallel on the same input, and files can be split automatically by size or duration for long-duration archival. ### Can I record and play the same LT-300 capture at the same time? Yes. A single captured stream can be recorded to file and simultaneously played back through the LT-300 API, using the recording and player examples provided in the SDK. Both outputs share the same memory buffers with zero-copy transfer, so playback and recording run in parallel with minimal CPU load. ### What is the latency of the LT-300 in HDMI loopthrough mode? The LT-300 HDMI loopthrough lets you select which input to route to the output, with a latency of about 16 video lines (overlay included). It runs independently of the capture pipeline, so it is not affected by the resolution scaling applied to recorded or streamed channels. ### What is the difference between the LT-100 and LT-300 series? The LT-100 series covers single- and dual-channel SD to Full HD capture, over PCIe or USB, with SDI, DVI-I, Composite and S-Video inputs. Its onboard H.264 hardware compression runs independently of the host, keeping CPU load minimal — well suited for constrained embedded systems on Windows via a C API or DirectShow. The LT-300 series is a multi-channel HD/4K platform, supporting up to four simultaneous streams up to 4K60, HDMI loopthrough with real-time overlay, and GPU-based compression that works with any NVIDIA, AMD or Intel GPU and is not limited to H.264 — driven by the Media Server through a cross-platform REST API. ### Does the LT-313 support mixed SDI/HDMI input simultaneously? Yes. The LT-313 is a hybrid capture card with 2 SDI inputs and 1 HDMI input, all usable concurrently. Up to three streams can be captured in parallel, with resolution allocated by the Media Server according to the total number of active channels. ## Beyond the LT-300 Other Enciris families that pair with or extend LT-300 capture. [ ![Enciris LT-122 dual channel SDI PCIe video capture card with dual H.264 encoders for broadcast and embedded applications](https://www.enciris.com/wp-content/uploads/2026/02/lt-122_photo-300x200.png) VIDEO CAPTURE ### LT-100 Series Single and dual channel SD/HD capture with onboard H.264 compression. Host independent, low CPU load, on PCIe or USB. Explore → ](http://www.enciris.com/lt-100-professional-sd-hd-video-capture-and-compression/) [ ![Enciris CV-420 4K camera platform remote head imaging system for medical and industrial applications](https://www.enciris.com/wp-content/uploads/2026/02/cv420_photo5-300x200.png) 4K CAMERAS ### CV-400 Series Modular 4K camera heads. A native input source for LT-300 capture and processing. Explore → ](http://www.enciris.com/cv-400-series-4k-professional-camera-platform/) [ ![](https://www.enciris.com/wp-content/uploads/2026/02/ch007_photo-300x200.png) EDGE AI ### CH-007 AI Platform Pairs with LT-300 output for on device inference and real time video processing. Explore → ](http://www.enciris.com/ch-007-edge-ai-carrier-board-jetson-orin/) --- ### [Ecurl Cmd Generator](https://www.enciris.com/ecurl-cmd-generator/) **Published:** February 4, 2026 **Author:** Luke Montgomery **Content:** ## Ecurl Generator Shortcode Active If you see this red box, the shortcode is correctly placed, but the React Javascript failed to load or is being blocked by a caching plugin. --- ### [Contact Us](https://www.enciris.com/contact/) **Published:** February 26, 2026 **Author:** Guillaume Bussat **Content:** # Contact us - [ +33 (0)5 82 95 09 55 ](tel:05%2082%2095%2009%2055) - [ sales@enciris.com ](mailto:sales@enciris.com) - [ Gaillac, France ](https://www.google.com/maps/place/Enciris+Technologies/@43.9020604,1.8744594,17z/data=!3m1!4b1!4m6!3m5!1s0x12add2598ece4d69:0xc5176b02a743a9d4!8m2!3d43.9020604!4d1.8770343!16s%2Fg%2F11b6dtd0z9?entry=ttu&g_ep=EgoyMDI2MDYyMS4wIKXMDSoASAFQAw%3D%3D) Fill out the form below and we will get back to you as soon as possible. Name Company Email Phone Contact type Sales / Quote Evaluation board Technical support Other Message Send --- ### [Enciris News](https://www.enciris.com/news/) **Published:** February 26, 2026 **Author:** Guillaume Bussat **Content:** # Enciris Blog Technical Insights & Innovation Updates From Video Processing Experts [![](https://www.enciris.com/wp-content/uploads/2025/12/lt310-realese.png)](https://www.enciris.com/news/enciris-newest-release-of-the-lt310-series/)#### [ Enciris New Release of The LT310 Series ](https://www.enciris.com/news/enciris-newest-release-of-the-lt310-series/) We’re proud to announce version 1.4.0, a major update aligned with our new LT310 series. This release introduces enhanced video and audio features, improved reliability, and a smoother experience for both developers and users. [ Read More ](https://www.enciris.com/news/enciris-newest-release-of-the-lt310-series/) [![](https://www.enciris.com/wp-content/uploads/2026/04/cv400-realese-1.png)](https://www.enciris.com/news/enciris-newest-release-of-the-cv400-series/)#### [ Enciris New Release of The CV400 Series ](https://www.enciris.com/news/enciris-newest-release-of-the-cv400-series/) This release focuses on improving stability, performance, and expanding camera and video capabilities. [ Read More ](https://www.enciris.com/news/enciris-newest-release-of-the-cv400-series/) [![](https://www.enciris.com/wp-content/uploads/2026/03/Video-Workflow.png)](https://www.enciris.com/news/powerful-enciris-solutions/)#### [ Transform Your Video Workflow with Powerful Enciris Solutions ](https://www.enciris.com/news/powerful-enciris-solutions/) Enciris integrates FFmpeg into its API and CLI software, eliminating the complexity of multimedia stream management while delivering hardware-accelerated encoding, cross-platform compatibility, and future-proof processing for the LT-300 and CV-40 product lines. [ Read More ](https://www.enciris.com/news/powerful-enciris-solutions/) [![](https://www.enciris.com/wp-content/uploads/2025/12/Picture-in-Picture-lt313-1.png)](https://www.enciris.com/news/overlay-features-to-get-picture-in-picture/)#### [ Revolutionize Your Video with Amazing Picture in Picture ](https://www.enciris.com/news/overlay-features-to-get-picture-in-picture/) LT-300 Video Platform combines two live sources with picture-in-picture and dynamic overlay, in real time, no post-processing [ Read More ](https://www.enciris.com/news/overlay-features-to-get-picture-in-picture/) [![](https://www.enciris.com/wp-content/uploads/2026/03/Video-Acquisition-2-boards.png)](https://www.enciris.com/news/new-era-of-flexibility-in-video-acquisition/)#### [ Enciris Unveils the LT-300 Series Video Platform: A New Era of Flexibility in Video Acquisition ](https://www.enciris.com/news/new-era-of-flexibility-in-video-acquisition/) Enciris Technologies unveils the LT-300 Series Video Platform-transforming trusted capture card technology into a software-reconfigurable video processing powerhouse with zero-latency overlay, picture-in-picture, and future-ready innovation built for evolving OEM demands. [ Read More ](https://www.enciris.com/news/new-era-of-flexibility-in-video-acquisition/) [![](https://www.enciris.com/wp-content/uploads/2025/12/7-Ways-Medical-Imaging-Technology-1.png)](https://www.enciris.com/news/technology-to-transforms-patient-care/)#### [ 7 Ways Medical Imaging Technology Transforms Patient Care ](https://www.enciris.com/news/technology-to-transforms-patient-care/) Enciris CV-400 camera modules deliver crystal-clear 4K imagery optimized for endoscopy and microscopy—featuring single-cable connectivity, sub-frame latency, and over 22 adjustable parameters including white balance, tone mapping, and noise reduction for mission-critical medical applications. [ Read More ](https://www.enciris.com/news/technology-to-transforms-patient-care/) Page1[Page2](https://www.enciris.com/news/2/?doing_wp_cron=1791661826.6322669982910156250000)[Page3](https://www.enciris.com/news/3/?doing_wp_cron=1791661826.6322669982910156250000)[Page4](https://www.enciris.com/news/4/?doing_wp_cron=1791661826.6322669982910156250000) ## Join our newsletter to stay updated Your email subscribe --- ### [About Enciris – Innovating Professional Video Capture Solutions](https://www.enciris.com/about-enciris-innovating-professional-video-capture-solutions/) **Published:** December 11, 2025 **Author:** Luke Montgomery **Content:** ## About Enciris ## Who We Are Enciris is a French technology company specializing in advanced video capture and processing solutions. Founded in 2006, we design and manufacture high-performance video capture cards, embedded solutions, and software designed to meet the needs of medical, industrial, and defense sectors worldwide. Every product we build reflects our passion for innovation, reliability, and precision engineering. ![CV-440 Full Graphic](https://www.enciris.com/wp-content/uploads/elementor/thumbs/CV-440-Full-Graphic-rql5izdz2d544h5z9ooz1ksdvyb2er8wrwgdyho6jy.png "CV-440 Full Graphic") ![](https://www.enciris.com/wp-content/uploads/2022/11/EncrisEntireBuildingMedRes-1024x251.jpg) ## Our Mission At Enciris, our mission is to deliver cutting-edge video technology that empowers professionals to capture, process, and analyze high-quality video with unparalleled speed and accuracy. We are driven by the pursuit of technological excellence and the desire to help our clients achieve their most ambitious goals. ## What We Do We provide a complete ecosystem of video solutions: - **Frame grabbers and capture cards** supporting SD to 4K/UHD formats. - **Embedded video systems** optimized for performance, reliability, and low latency. - **Software SDKs and APIs** enabling seamless integration into custom workflows. - **Comprehensive support and engineering services** for tailored solutions. Enciris products are designed, developed, and manufactured in France, ensuring full control over quality, performance, and long-term support. ![](https://www.enciris.com/wp-content/uploads/2025/12/2c946df3-6b91-4555-87c5-0c546c935e41-768x512.png) ## Our Technology Enciris’ technology bridges the gap between hardware precision and software flexibility. Our solutions leverage FPGA-based architectures, high-speed interfaces (HDMI, SDI, DVI), and advanced compression formats to deliver real-time video capture and processing performance. From OEM applications to mission-critical systems, our technology adapts to any environment. ### The difference with Enciris? Our technology solves problems other manufacturers can't and our customers know it. Montgomery Luke, Software Developer --- ### [LT-100 Series Full Specifications](https://www.enciris.com/lt-100-series-full-specifications/) **Published:** February 24, 2026 **Author:** Guillaume Bussat **Content:** [ Go Back ](#) # LT-100 Series Full Specifications The specifications below apply to all LT-100 series models unless otherwise specified. Differences between models (such as input configuration) are explicitly indicated where relevant. ## **Interfaces & Connectivity** **Host Interface** - PCIe Gen2 x1 - Multiple cards can be installed in the same system for scalable input expansion **Video Inputs** - LT-101 / LT-102: - 1x SDI (SD/HD/3G) – Optionnal - 1x DVI-I - 1x S-Video - 1x Composite video (BNC) - LT-122: - 2x SDI (SD/HD/3G) - LT-124: - 2x DVI-D **Video Outputs** - LT-122: - 2x SDI (SD/HD/3G) - LT-124: - 1x DVI-D **Audio Interfaces** - 3.5mm audio analog jack (1x on LT-101, LT-102 and LT-124, 2x on LT-122) - Embedded audio over SDI and DVI-D only ### **Video & Audio Standards** **Video Standards** - Support for SD, HD and Full HD video standards with various frame rates (see table below) - Support for user-defined resolutions following VESA CVT and GTF standards (for DVI-I, DVI-D) - Automatic detection of incoming video resolution and frame rate **Supported Video Resolutions \*** - 1080p HD (1920×1080, Progressive) 23.97 / 24 / 25 / 29.97 / 30 / 50 / 59.94 / 60 Hz - 1080i HD (1920×1080, Interlaced) 50 / 59.94 / 60 Hz - 720p HD (1280×720, Progressive) 23.98 / 24 / 25 / 29.97 / 30 / 50 / 59.94 / 60 Hz - SD PAL (720×576, Progressive) 50 Hz - SD PAL (720×576, Interlaced) 25 / 50 Hz - SD NTSC (720×480, Progressive) 59.94 Hz - SD NTSC (720×480, Interlaced) 29.97 Hz - User-defined CVT / GTF resolutions (DVI), e.g. 800×600, 1280×1024 Horizontal: 640 -> 1920 px, Vertical: 480 -> 1080 px Progressive/interlaced up to 60 Hz \* *Non exaustive list, please contact us for more information* **SDI Standards** - SMPTE-compliant SDI standards: - SD-SDI (SMPTE 259M) - HD-SDI (SMPTE ST 292) - 3G-SDI (SMPTE ST 424, Level A) **Color Space & Bit Depth** - SDI Input Formats: - YUV 4:2:2 - Composite Input Formats: - Y/C Analog signal - S-Video Input Formats: - Y/C Analog signal - DVI-I Input Formats: - YUV 4:2:2 - RGB 4:4:4 **Native Video Formats** - Video frames are transferred to the host system via PCIe or USB (depending on board model) - YUV 4:2:2 - H.264 or VC1 (depending on firmware selected) **Audio Standard** - PCM - 2 audio channels - 48 kHz sampling rate - 16-bit audio depth ### **Signal Processing** **Video Processing** - Fully hardware-based processing pipeline for low-latency operation - Concurrent acquisition and processing of video streams - Hardware color space conversion - Advanced hardware deinterlacing - Hardware video preprocessing prior to compression: - Downscaling - Cropping - Noise reduction - HSBC **Overlay** - On Screen Display (OSD) overlay **Compression** - Real-time H.264 hardware-based compression - Configurable compression parameters (e.g. bitrate control, GOP) ### **Software & Integration** **Operating Systems** - Windows 8, 10, 11 - Linux: Ubuntu 22.04 and newer, Debian 12 and newer **Platforms** - AMD, Intel **Media & Compression** - Image formats: H.264 or VC1, YUYV - Video formats: H.264 or VC1, YUYV - Audio formats: PCM, WAV, AAC **Applications & Tools** - DirectShow support (Windows only) **SDK & Developer Support (fully compatible with Windows and Linux)** - C Library with documentation - Exemple code for recording ### **Physical & Environmental Specifications** **Physical** - Dimensions (W × H): 91 × 110 mm - Supplied with 1-slot PCIe bracket - Weight: ~140 g (with heatsink) - Power consumption: 6 W typical - Powering: PCIe slot or External PSU - Cooling: heatsink (fan configuration possible, please contact us) **Environmental** - Operating temperature: 0 °C to 70 °C (extended options available) - Storage temperature: -20 °C to 70 °C - Humidity: 5% to 95% non-condensing **Reliability & Compliance** - Designed for continuous 24/7 operation - CE Certified, CE Tested to IEC 61000-4-2, IEC 61000-4-3 and EN 55022 - REACH and RoHS compliant - Long Term availability (LTA) **Warranty & Support** - Standard warranty: 2 years - Technical support included for hardware, software, and SDK --- ### [CV-400 Series Full Specifications](https://www.enciris.com/cv-400-series-full-specifications/) **Published:** January 8, 2026 **Author:** Guillaume Bussat **Content:** [ Go Back ](#) # CV-400 Series Full Specifications The specifications below apply to all CV-400 series models unless otherwise specified. Differences between models are explicitly indicated where relevant. ## **Interfaces & Connectivity** **CV42 Host Interface** - PCIe Gen2 x4 - Video data transfer between CCU and host system - Multiple cards can be installed in the same system for scalable expansion **CV440 System Interface** - Integrated capacitive touchscreen **Video Input** - Single CoaXPress camera head connection - Proprietary protocol between camera head and CCU **Video Outputs** - 12G-SDI (BNC) - HDMI 2.0 output (Type A) - Automatic configuration based on connected display - Single real-time overlay, independently enabled or disabled per output (CV42 only) **Digital Input Interfaces (CV42 only)** - General-purpose digital inputs depending on selected model **Firmware & Updates** - Field-upgradable Software Reconfigurable Hardware (SRH) - CV42: Firmware loaded via PCIe at system startup through Enciris agent - CV440: Firmware loaded via USB ### **Video Standards** **Supported Video Resolutions** - 4K UHD (3840 × 2160, Progressive), 50 / 59.94 Hz - 1080p HD (1920 × 1080, Progressive), 50 / 59.94 Hz **SDI Standards** - SMPTE-compliant SDI standards: - 3G-SDI (SMPTE ST 424, Level A) - 12G-SDI (SMPTE ST 2082) - Legacy 4Kp60 output via multi-link SDI (4 × 3G, 2SI mode) **HDMI Standards** - HDMI 2.0 compliant - Supports video formats up to 4K UHD (3840×2160) at 60 Hz - HDCP not supported **Color Space & Bit Depth** - SDI Output Formats: - YUV 4:2:2 (10-bit) - HDMI Output Formats: - RGB 4:4:4 or YUV 4:4:4 (8-bit) - YUV 4:2:2 (12-bit) **Native Video Formats (PCIe transfert)** - Video frames delivered to host via DMA - YUV 4:2:2 - NV12 - Bayer ### **Signal Processing** **Video Pipeline** - Fully hardware-based processing pipeline for low-latency operation - Native 10-bit video processing pipeline Manual Exposure** - Sensor shutter - Sensor analog gain - Hardware binning (performed in CCU) **Automatic Exposure** - Shutter, analog gain, and hardware binning automatically adjusted - Adjustments take into account key user settings such as: - Target brightness - Metering zone - Minimum and maximum limits for shutter and gain **Image Processing** - White balance control - RGB gain adjustment - Gamma selection - Color space conversion - Hue, Saturation, Brightness, Contrast - Digital zoom - Image flip (horizontal and vertical) - Sharpness adjustment - Additional image controls **Overlay** - Hardware-applied video overlay on HDMI output - Overlay image generated by software and transferred via PCIe **Timestamping** - Hardware-generated timestamp added during video acquisition - Timestamp precision: 1 µs ### **Software & Integration** **Operating Systems** - Windows 10, 11 (native API + DirectShow support) - Linux: Ubuntu 22.04 and newer, Debian 12 and newer **Platforms** - AMD, Intel, ARM **Media & Compression** - Image formats: JPEG, PNG, YUYV, RGBA, and more - Video formats: YUYV, NV12, H.264, HEVC, MP4, and more - Audio formats: PCM, WAV, AAC - GPU acceleration: Internal use of FFmpeg with support for Intel, NVIDIA, and AMD GPUs for hardware-accelerated video compression and processing - **Applications & Tools (fully compatible with Windows and Linux)** - *cv0agent*: background multimedia server handling all card requests - *ecurl*: command-line interface for rapid interaction with the card - *ecam*: demo application for quick evaluation - Visualizes input and output status - Live video player - Recording and snapshot functions - Simple overlay testing - Exposure, colors and visuals controls **SDK & Developer Support (fully compatible with Windows and Linux)** - Reference client implementations provided as full source code in Go, C++, and Python - Example code for typical tasks: - Video capture and recording in H.264 - Accessing input/output status - Overlay generation and injection ### **Physical & Environmental Specifications** **CCU Physical** - Dimensions (W × H): 94 × 100 mm - Supplied with 1-slot PCIe bracket - Weight: 265 g (with heatsink) - Power consumption: 12 W typical (with camera head) - Power supply: PCIe slot - Cooling: heatsink with fan (fanless configuration possible, please contact us) **Camera Head Physical** - Form factors: - Square housing - Cylindrical housing - Dimensions: - Square mode (W x H x D): 38 x 41 x 30 mm - Cylindrical model (⌀ x L): 37 x 28 mm - Weight: - Square model: 74 g - Cylindrical model: 48 g - Cooling: passive (fanless) - Lens mount: Standard C-mount - Power supply: provided via CCU over camera head cable **CV440 Physical** - Dimensions (W x H x D) : 148 x 156 x 58 mm - Weight: 1110 g - Power consumption: 15 W typical (with camera head) - Power supply: 100–240 VAC, internal power supply **Environmental** - Operating temperature: 0 °C to 60 °C (extended options available) - Storage temperature: -20 °C to 70 °C - Humidity: 5% to 95% non-condensing **Reliability & Compliance** - Designed for continuous 24/7 operation - CE Certified, CE Tested to 60601 ESD and EMI - Long Term availability (LTA) **Warranty & Support** - Standard warranty: 3 years - Technical support included for hardware, software, and SDK --- ### [LT-300 Series Full Specifications](https://www.enciris.com/lt-300-series-full-specifications/) **Published:** January 8, 2026 **Author:** Guillaume Bussat **Content:** [ Go Back ](#) # LT-300 Series Full Specifications ## **Interfaces & Connectivity** **Host Interface** - PCIe Gen2 x4 - Handles video and audio data transfer and firmware updates - Multiple cards can be installed in the same system for scalable input expansion **Video Inputs** - LT-311: - 4x SDI (HD/3G/6G/12G) - LT-312: - 2x HDMI type A - LT-313: - 2x SDI (HD/3G/6G/12G) - 1x HDMI type A **Video Outputs** - HDMI 2.0 loop-through (Type A) - Automatic configuration according to connected display - Overlay applied in real-time on the output, can be enabled or disabled **Audio Interfaces** - Embedded audio over SDI and HDMI - 2 channels **Firmware & Updates** - Field-upgradable Software Reconfigurable Hardware (SRH) - Firmware loaded via PCIe at system startup through Enciris agent ### **Video & Audio Standards** **Video Standards** - Support for HD, Full HD, UHD and 4K video standards with various frame rates (see table below) - Automatic detection of incoming video resolution and frame rate **Supported Video Resolutions** - DCI 4K (4096 × 2160, Progressive) 23.98 / 24 / 25 / 29.97 / 30 / 48 / 50 / 59.94 / 60 Hz - 4K UHD (3840 × 2160, Progressive) 23.98 / 24 / 25 / 29.97 / 30 / 48 / 50 / 59.94 / 60 Hz - DCI 2K (2048 × 1080, Progressive) 23.98 / 24 / 25 / 29.97 / 30 / 48 / 50 / 59.94 / 60 Hz - 1080p HD (1920 × 1080, Progressive) 23.98 / 24 / 25 / 29.97 / 30 / 48 / 50 / 59.94 / 60 Hz - 1080i HD (1920 × 1080, Interlaced) 50 / 59.94 / 60 Hz - 720p HD (1280 × 720, Progressive) 50 / 59.94 / 60 Hz **SDI Standards** - SMPTE-compliant SDI standards: - HD-SDI (SMPTE ST 292) - 3G-SDI (SMPTE ST 424, Level A) - 6G-SDI (SMPTE ST 2081) - 12G-SDI (SMPTE ST 2082) - Support for legacy 4Kp60 acquisition via multi-link SDI where applicable **HDMI Standards** - HDMI 2.0 compliant input and output - Supports video formats up to 4K UHD (3840×2160) at 60 Hz - HDCP not supported **Color Space & Bit Depth** - SDI Input Formats: - YUV 4:2:2, 10-bit - HDMI Input Formats: - RGB 4:4:4 or YUV 4:4:4 (8-bit) - YUV 4:2:2 (12-bit) - HDMI Output Formats: - RGB 4:4:4 or YUV 4:4:4 (8-bit) - YUV 4:2:2 (12-bit) - Output color space automatically selected to preserve the input color space when supported by the connected display **Native Video Formats over PCIe** - Video frames are transferred to the host system via PCIe using DMA - YUV 4:2:2 - NV12 **Audio Standard** - PCM - 2 audio channels - 48 kHz sampling rate - 16-bit audio depth - Audio synchronized with video capture ### **Signal Processing** **Video Processing** - Fully hardware-based processing pipeline for low-latency operation - Concurrent acquisition and processing of video streams - Per-input hardware scaler and decimator - Hardware color space conversion - Support for progressive and interlaced formats - 10-bit internal video processing **Overlay** - Hardware-applied video overlay on HDMI output - Overlay image generated by software and transferred via PCIe **Timestamping** - Hardware-generated timestamp added to each video frame (precision: 1 µs) - Corresponding timestamp applied to associated audio samples for synchronization ### **Software & Integration** **Operating Systems** - Windows 10, 11 (native API + DirectShow support) - Linux: Ubuntu 22.04 and newer, Debian 12 and newer **Platforms** - AMD, Intel, ARM **Media & Compression** - Image formats: JPEG, PNG, YUYV, RGBA, and more - Video formats: YUYV, NV12, H.264, HEVC, MP4, and more - Audio formats: PCM, WAV, AAC - GPU acceleration: Internal use of FFmpeg with support for Intel, NVIDIA, and AMD GPUs for hardware-accelerated video compression and processing - **Applications & Tools (fully compatible with Windows and Linux)** - *lt310agent*: background multimedia server handling all card requests - *ecurl*: command-line interface for rapid interaction with the card - *ecap*: demo application for quick evaluation - Visualizes input and output status - Live video player - Recording and snapshot functions - Simple overlay testing **SDK & Developer Support (fully compatible with Windows and Linux)** - Reference client implementations provided as full source code in Go, C++, and Python - Example code for typical tasks: - Video capture and recording in H.264 - Accessing input/output status - Overlay generation and injection ### **Physical & Environmental Specifications** **Physical** - Dimensions (W × H): 94 × 100 mm - Supplied with 1-slot PCIe bracket - Weight: ~200 g (with heatsink) - Power consumption: 12 W typical - Power supply: PCIe slot - Cooling: heatsink with fan (fanless configuration possible, please contact us) **Environmental** - Operating temperature: 0 °C to 60 °C (extended options available) - Storage temperature: -20 °C to 70 °C - Humidity: 5% to 95% non-condensing **Reliability & Compliance** - Designed for continuous 24/7 operation - CE Certified, CE Tested to 60601 ESD and EMI - Long Term availability (LTA) **Warranty & Support** - Standard warranty: 3 years - Technical support included for hardware, software, and SDK --- ### [CV-400 API](https://www.enciris.com/cv-400-api-the-programmer-guide/) **Published:** January 27, 2026 **Author:** Luke Montgomery **Content:** CV40 API: The programmer guide # CV40 API: The programmer guide Enciris Technologies version 1.3.3, 17/09/2025 Table of Contents - [1. Introduction](#_introduction) - [2. Installation](#_installation) - [2.1. Windows](#_windows) - [2.2. Linux](#_linux) - [2.3. SDK](#_sdk) - [2.4. Tools](#_tools) - [2.5. cv40agent Controls](#_cv40agent_controls) - [2.6. Board Firmware](#_board_firmware) - [3. ecurl (CLI)](#_ecurl_cli) - [3.1. GET command](#_get_command) - [3.2. POST command](#_post_command) - [3.3. DELETE Command](#_delete_command) - [3.4. PLAY Command](#_play_command) - [3.5. REC Command](#_rec_command) - [4. ecam (GUI)](#ecam) - [5. API description](#api) - [5.1. Agent](#agent) - [5.1.1. Agent Configuration File](#agent_config) - [5.1.2. Agent Object](#_agent_object) - [5.1.3. View cv40agent Information](#_view_cv40agent_information) - [5.2. Board](#_board) - [5.2.1. Board Object](#_board_object) - [5.2.2. View Board Information](#_view_board_information) - [5.2.3. Button Object](#_button_object) - [5.2.4. View Button State](#_view_button_state) - [5.2.5. Buttons Object](#_buttons_object) - [5.2.6. View Buttons State](#_view_buttons_state) - [5.3. Audio/Video structure](#structure) - [5.3.1. Audio object](#signal_audio) - [5.3.2. Video object](#structure_video) - [5.4. Camera](#_camera) - [5.4.1. Camera Object](#_camera_object) - [5.4.2. View Camera Status](#_view_camera_status) - [5.4.3. White Object](#_white_object) - [5.4.4. View White Settings](#_view_white_settings) - [5.4.5. Update White Settings](#_update_white_settings) - [5.4.6. Colors Object](#_colors_object) - [5.4.7. View Colors Settings](#_view_colors_settings) - [5.4.8. Update Colors Settings](#_update_colors_settings) - [5.4.9. Exposure Object](#_exposure_object) - [5.4.10. View Exposure Settings](#_view_exposure_settings) - [5.4.11. Update Exposure Settings](#_update_exposure_settings) - [5.4.12. Visuals Object](#_visuals_object) - [5.4.13. View Visuals Settings](#_view_visuals_settings) - [5.4.14. Update Visuals Settings](#_update_visuals_settings) - [5.4.15. Button Object](#_button_object_2) - [5.4.16. View Button State](#_view_button_state_2) - [5.4.17. Buttons Object](#_buttons_object_2) - [5.4.18. View Buttons State](#_view_buttons_state_2) - [5.5. HDMI Output](#_hdmi_output) - [5.5.1. HDMI Output Object](#_hdmi_output_object) - [5.5.2. View HDMI Output Status](#_view_hdmi_output_status) - [5.5.3. Configure HDMI Output](#_configure_hdmi_output) - [5.6. SDI Output](#_sdi_output) - [5.6.1. SDI Output Object](#_sdi_output_object) - [5.6.2. View SDI Output Status](#_view_sdi_output_status) - [5.6.3. Configure SDI Output](#_configure_sdi_output) - [5.7. Canvas](#_canvas) - [5.7.1. Canvas Object](#_canvas_object) - [5.7.2. View Canvas Status](#_view_canvas_status) - [5.7.3. Delete Operation](#_delete_operation) - [5.7.4. Init Operation](#_init_operation) - [5.7.5. Text Operation](#_text_operation) - [5.7.6. Line Operation](#_line_operation) - [5.7.7. Ellipse Operation](#_ellipse_operation) - [5.7.8. Rectangle Operation](#_rectangle_operation) - [5.7.9. Image Operation](#_image_operation) - [5.7.10. Video Operation](#_video_operation) - [5.7.11. Clear Operation](#_clear_operation) - [5.7.12. Batch Operations](#_batch_operations) - [5.8. Client](#_client) - [5.8.1. Fetch Worker Updates](#_fetch_worker_updates) - [5.8.2. Release Referenced Memory](#_release_referenced_memory) - [5.9. Workers](#worker) - [5.9.1. Worker Creation](#_worker_creation) - [5.9.2. Worker Object](#_worker_object) - [5.9.3. Packet Object](#_packet_object) - [5.9.4. Data Worker Workflow](#_data_worker_workflow) - [5.9.5. File Worker Workflow](#_file_worker_workflow) - [6. Cheatsheet](#_cheatsheet) - [7. Changelog](#_changelog) ## 1. Introduction The **LT API** is built around the [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) architecture (Representational State Transfer). REST defines a structured approach for exposing system functionalities via a consistent interface. A REST API is typically accessed using predefined URLs, which represent various resources returned as JSON objects. These resources support standard methods such as GET, POST, and DELETE. The **LT API** requests are processed by a host service called **cv40agent**, which utilizes standard OS mechanisms such as IPC, SG-DMA, and shared memory. This ensures minimal latency when handling API requests. To optimize performance, video and audio data are shared among consumers using memory segments, allowing large data buffers and concurrent access. With **LT boards** designed to be seen as *hardware-as-a-service* approach, the **LT API** abstracts hardware-specific implementations behind a unified API. This allows users to focus on core functionalities such as capturing, playing, recording, and streaming audio/video data. The **LT API** is accessible through various clients, including the **ecurl** command line interface (CLI) and the **ecam** graphical user interface (GUI). The API can also be accessed directly through C++, Python, DirectShow, V4L2, NamedPipe, and UART. <pre> Clients REST LT API LT Agent LT Driver ============= ========== <-- | | | | | ecurl (CLI) <-- | | | | | ecap (GUI) <-- | | Controls | | | <-- | | Status | | | <-- | | Logs | | | GO <-- | | | | | <--> LT board #0 C++ <-- | | | | | Python <-- | | | | PCIe | <-- | --> |-----------| <--> | Driver | <-- | | | | (DMA) | Directshow <-- | | | | | V4L2 <-- | | Data | | | <--> LT board #1 <-- | | Server | | | <-- | | | | | NamedPipe <-- | | | | | UART <-- | |-----------| | | <-- | | Firmwares | | | ============= ==========</pre> ## 2. Installation ### 2.1. Windows Download and run the latest **cv40install\_x.x.x.exe** to install the **cv40 family** drivers, tools and services. If necessary the previous version will be uninstalled. Once installed, the **cv40agent** service will be started automatically and will be (re)started automatically with each system (re)boot. The **cv40agent** can be controlled using the Windows Services Manager or the command line. For more details, see [\[control\_service\]](#control_service). The **LT boards** plugged into the host should appear in the Windows Device Manager under the **Sound, video and game controllers**. Directshow All the boards inputs are accessible through directshow filters, and then are available in any directshow compatible application. The directshow filters are managed by the **cv40agent** service, so you can use them only if the service is running. | Note | To uninstall the **cv40 family** drivers, tools and services, run the installer and choose "Remove" or use "Apps & features" menu. | |---|---| ### 2.2. Linux Download and extract the latest **cv40install\_x.x.x.tar.gz**, then run the **cv40install.sh** script to install the **cv40 family** drivers, tools and services. If necessary, the previous version will be uninstalled. Upon successful installation, the **cv40agent** daemon will start automatically and will also (re)started with each system (re)boot. If the installation fails, contact us and check the **cv40install.log** file for details. The **cv40agent** can be controlled using the command line. For more details, see [\[control\_service\]](#control_service). V4L2 All the boards inputs are accessible through V4L2 drivers, and then are available in any V4L2/GStreamer compatible application. The V4L2 drivers are managed by the **cv40agent** service, so you can use them only if the service is running. | Note | To uninstall the **cv40 family** drivers, tools and services, run cv40\_uninstall.sh from the installation directory. | |---|---| ### 2.3. SDK Download the latest **cv40sdk\_x.x.x.zip** or **cv40sdk\_x.x.x.tar.gz** archive and extract it anywhere you want. The SDK contains the API documentation, the API libraries and examples for the following languages **Go**, **C++** and **Python**. Please navigate through the examples to learn how to program the API. You can also create scripts using the **ecurl** command-line tool. For more details, see [\[ecurl\]](#ecurl). ### 2.4. Tools Two tools are installed along with the **cv40agent** service: - **[ecurl](#ecurl)** - a command-line tool to send REST API requests to the **cv40agent**. - **[ecam](#ecam)** - a graphical user interface to control and/or test LT boards. By default, the service and tools are added to the **PATH** environment variable, allowing you to use them from any command line. ### 2.5. cv40agent Controls To access the **LT API**, ensure that the **cv40agent** is installed and running on your host system. You can use the following commands, which require administrative privileges, to control the **cv40agent**. Start the cv40agent <pre><span class="nv">$ </span>cv40agent start</pre> Stop the cv40agent <pre><span class="nv">$ </span>cv40agent stop</pre> Check the cv40agent and boards firmware version <pre><span class="nv">$ </span>cv40agent version</pre> Check the cv40agent status <pre><span class="nv">$ </span>cv40agent status</pre> ### 2.6. Board Firmware If the boards installed in the host require a firmware update, the **cv40agent** service will automatically update them when the service starts. This process may take up to 2 minutes, depending on the board type. The service will be unavailable until the update is completed. Please use the command below if you want to check the firmware version of the boards. Check the cv40agent and boards firmware version <pre><span class="nv">$ </span>cv40agent version</pre> It is also possible to manually update the board firmware. Update the boards firmware <pre><span class="nv">$ </span>cv40agent update</pre> | Note | To update the board firmware, the **cv40agent** must be stopped. | |---|---| ## 3. ecurl (CLI) The **ecurl** program is a developer tool to help you make requests on the **LT API** directly from your terminal. The tool is deployed along with the **cv40agent** at the installation stage. The tool has been developed with our SDK and is available for both Linux and Windows platforms. You can use the **ecurl** CLI to: - Create, retrieve, update or delete **LT API** objects. - Play and record any video or audio resources. - Use the multi-channel feature of the **LT boards**. - Control and test the installed **LT boards**. | Note | The **cv40agent** must be running otherwise **ecurl** will not work. | |---|---| ### 3.1. GET command <pre><span class="nv">$ </span>ecurl get <url></pre> Send a GET request to retrieve a specific API object identified by the **<url>**. **Examples**Retrieve information about the cv40 family agent <pre><span class="nv">$ </span>ecurl get cv40:/</pre> Retrieve informaton from cv40 board located at index 0 <pre><span class="nv">$ </span>ecurl get cv40:/0</pre> Make a JPEG capture <pre><span class="nv">$ </span>ecurl get cv40:/0/<span class="o">{</span><span class="k">in</span><span class="o">}</span>/0/file <span class="nt">-d</span> <span class="nb">type</span><span class="o">=</span>image/jpeg</pre> ### 3.2. POST command <pre><span class="nv">$ </span>ecurl post <url> <span class="o">[</span><span class="nt">-d</span> @file.json] <span class="o">[</span><span class="nt">-d</span> <span class="nv">field</span><span class="o">=</span>value] <span class="o">[</span><span class="nt">-d</span> <span class="nv">data</span><span class="o">=</span>@file.bin]</pre> Create or modify the resource designated by the **<url>**. Arguments may be added to the request with the **-d** optional flags. It is possible to use a file content as input by preceding the filename with the **@** character. By preceding the filename with the **$** charater, relative path will be translated to the absolute full path. **Examples**Create a virtual video input from a mp4 file <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/init <span class="nt">-d</span> <span class="nb">source</span><span class="o">=</span><span class="nv">$video</span>.mp4</pre> Load a custom HDMI-IN Edid <pre><span class="nv">$ </span>ecurl post cv40:/0/hdmi-in/0/edid <span class="nt">-d</span> <span class="nv">data</span><span class="o">=</span>@custom.edid</pre> ### 3.3. DELETE Command <pre><span class="nv">$ </span>ecurl delete <url></pre> Delete or reset the resource pointed by the **<url>**. **Examples**Unplug virtual video input <pre><span class="nv">$ </span>ecurl delete cv40:/canvas/0</pre> ### 3.4. PLAY Command <pre><span class="nv">$ </span>ecurl play <url> <span class="o">[</span><span class="nt">-d</span><span class="o">]</span></pre> Play video or audio source until Ctrl+c is pressed. Arguments may be added to the request with the **-d** optional flags. **Examples**Live display of camera video <pre><span class="nv">$ </span>ecurl play cv40:/0/camera/0</pre> ### 3.5. REC Command <pre><span class="nv">$ </span>ecurl rec <url> <span class="o">[</span><span class="nt">-d</span><span class="o">]</span></pre> Record video or audio source until Ctrl+c is pressed. Arguments may be added to the request with the **-d** optional flags. **Examples**Record camera video into a mp4 file <pre><span class="nv">$ </span>ecurl rec cv40:/0/camera/0/file <span class="nt">-d</span> <span class="nv">media</span><span class="o">=</span>video/mp4</pre> Record camera video using NVENC hardware encoder and hevc codec <pre><span class="nv">$ </span>ecurl rec cv40:/0/camera/0 <span class="nt">-d</span> <span class="nv">media</span><span class="o">=</span>video/mp4 <span class="nt">-d</span> extra.hw<span class="o">=</span>nvenc <span class="nt">-d</span> extra.codec<span class="o">=</span>hevc</pre> ## 4. ecam (GUI) The **ecam** program is a simple graphical user interface developed with our SDK and is available for Linux and Windows platforms. You can use the **ecam** application to: | - Play and record the camera input. You can also control HDMI and SDI output configuration and test the overlay feature. | - Switch between automatic and manual exposure, and adjust the exposure settings. | |---|---| | | | |---|---| | - Adjust the colors settings (HSBC and gamma correction), perform white balance or modify the color temperature. | - Control the visuals settings like edge enhancement, noise reduction. | |---|---| | | | |---|---| | Note | The **cv40agent** has to be running otherwise **ecam** will not work. | |---|---| ## 5. API description An API endpoint is a URL where the API processes requests for a specific resource. Endpoints are accessed via [URLs](https://en.wikipedia.org/wiki/URL) using the syntax <code>scheme:/path</code>. It consists of: - A non-empty scheme component followed by a colon <code>cv40:</code>. - A path component made up of path segments separated by slashes <code>/</code>. For clarity, the URLs endpoints are presented in tables where: - The **scheme <code>cv40:</code> is omitted**. - **Tables vertical separators replace slashes <code>/</code>**. - Each method listed in a cell represents an available operation for that path. - An **empty cell** means that no method exists for that path. ### 5.1. Agent The **agent** endpoint allows to retrieve the **cv40agent** software version. | <code><strong><a href="#agent">/</a></strong></code> <code><a href="#agent_get"><kbd>GET</kbd></a></code> | |---| | - [<code>GET     /</code>](#agent_get) | | |---|---| #### 5.1.1. Agent Configuration File The agent can be configured using a optional configuration file. You can place the <code>cv40agent.config</code> file in the same directory as the application executable. Configuration options: | Option | Description | |---|---| | <code>WD</code> | Working directory for the agent (default: current working directory) | | <code>numCanvases</code> | Number of canvas objects to create (default 4) | | <code>noVideoSignal</code> | Settings for when no video signal is detected (default: gray background with "NO SIGNAL" text) | | <code>dshowFilters</code> | Enable/disable DirectShow filters (default: true) | | <code>v4l2Filters</code> | Enable/disable V4l2 filters (default: false) | | <code>devMode</code> | Enable/disable development mode (default: false) | This file is included in the agent folder. The configuration file is optional and can be omitted if not needed. #### 5.1.2. Agent Object | revision <code><em>string</em></code> Commit hash. time <code><em>string</em></code> Commit timestamp. version <code><em>string</em></code> Commit tagged version. | Agent object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"revision"</span><span class="p">:</span><span class="w"> </span><span class="s2">"...hash..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"time"</span><span class="p">:</span><span class="w"> </span><span class="s2">"...time..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.3.3"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.1.3. View cv40agent Information Retrieves the **cv40agent** software version. | Parameters None. --- Response Returns the [agent](#agent_object) object if the request succeeded. | GET / request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"revision"</span><span class="p">:</span><span class="w"> </span><span class="s2">"...hash..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"time"</span><span class="p">:</span><span class="w"> </span><span class="s2">"...time..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.3.3"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/</pre> GO <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Agent</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">Agent</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/</span><span class="sh">"</span><span class="p">)</span></pre> ### 5.2. Board The **board** endpoint allows to retrieve information on boards installed into the host. These information are described in the [board object](#board_object) section. | <code><a href="#board"><strong>:board</strong></a></code> <code><a href="#board_get"><kbd>GET</kbd></a></code> | <code><a href="#board_button_object"><strong>buttons</strong></a></code> <code><a href="#board_buttons_get"><kbd>GET</kbd></a></code> | <code><strong>:pin</strong></code> <code><a href="#board_button_get"><kbd>GET</kbd></a></code> | |---|---|---| | - [<code>GET     /:board</code>](#board_get) - [<code>GET     /:board/buttons/:pin</code>](#board_button_get) | <code><strong>board</strong></code> Device position into the host <code>[0 .. 1]</code>. <code><strong>pin</strong></code> Button position <code>[0 .. 4]</code>. | |---|---| #### 5.2.1. Board Object | model <code><em>string</em></code> Board model identifier. If no devices is found, the value is left empty. sn <code><em>int</em></code> Board serial number. cpu <code><em>uint</em></code> Board CPU datecode. fpga <code><em>uint</em></code> Board FPGA datecode. bridge <code><em>uint</em></code> Board bridge datecode. | Board object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"model"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"cv42"</span><span class="p">,</span><span class="w"> </span><span class="nl">"sn"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">64000000</span><span class="p">,</span><span class="w"> </span><span class="nl">"cpu"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"fpga"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"bridge"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.2.2. View Board Information To retrieve the board information at a given position, send a GET request to the **/:board** endpoint. | Parameters None. --- Response Returns the [board](#board_object) object if the request succeeded. | GET /:board request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"model"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"cv42"</span><span class="p">,</span><span class="w"> </span><span class="nl">"sn"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">64000000</span><span class="p">,</span><span class="w"> </span><span class="nl">"cpu"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"fpga"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"bridge"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0</pre> GO <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Board</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">Board</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// object to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.2.3. Button Object The **button** object allows to capture the button pin state. | description <code><em>string</em></code> Description of the button pin. pressed <code><em>bool</em></code> Is the button currently 'pressed'. pressedCount <code><em>int</em></code> Number of times the button has been pressed since the last 'release' event. timestamp <code><em>int64</em></code> The unix timestamp of the last 'press' or 'release' event in microseconds. | Button object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/buttons/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.2.4. View Button State To retrieve the button status, send a GET request to the **button/:pin** endpoint. | Parameters None. --- Response Returns the [button](#board_button_object) object if the request succeeded. | GET /0/buttons/:pin request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/buttons/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/buttons/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0/buttons/0</pre> golang <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Button</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/buttons/0"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">Button</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/buttons/0"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/buttons/0</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.2.5. Buttons Object The **buttons** object is a collection of [button](#board_button_object) objects. It allows to capture the state of multiple buttons at once. #### 5.2.6. View Buttons State To retrieve the status of all buttons at once, send a GET request to the **buttons** endpoint. | Parameters None. --- Response Returns the [buttons](#board_buttons_object) object if the request succeeded. | GET /0/buttons request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/buttons"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/buttons/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/buttons/1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/buttons/2"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/buttons/3"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0/buttons</pre> golang <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Buttons</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/buttons"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">Buttons</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/buttons"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/buttons/0</span><span class="sh">"</span><span class="p">)</span></pre> ### 5.3. Audio/Video structure This is not an endpoint, but data structure used by other endpoints. #### 5.3.1. Audio object | audio <code><em>json</em></code> Audio signal object. → description <code><em>string</em></code> A short description of the audio signal. → format <code><em>string</em></code> The audio sample format <code>pcm</code>. → channels <code><em>int</em></code> The number of audio channels. → samplerate <code><em>int</em></code> The number of audio samples per second. → depth <code><em>int</em></code> The number of bits per audio sample. → signal <code><em>string</em></code> <code>none</code> (not found), or <code>locked</code> (ready to use). | Audio object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.3.2. Video object | video <code><em>json</em></code> Video signal object. → description <code><em>string</em></code> The video signal short description. → format <code><em>string</em></code> The pixel color format <code>rgb444</code>, <code>yuv444</code> or <code>yuv422</code>. → framerate <code><em>float</em></code> The number of video frames per second. → size <code><em>[2]int</em></code> The video frame width and height in pixel units. → interlaced <code><em>bool</em></code> The video frame interlaced status. → signal <code><em>string</em></code> <code>none</code> (not found), or <code>locked</code> (ready to use). | Video object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| ### 5.4. Camera This endpoint describes how to use **camera** inputs. Native data can be accessed via the **format** path enumerator <code>yuyv</code> (video). Some of the proposed **format** might require to use the host CPU and/or GPU before being delivered. The <code>pci</code> endpoint allows to limit the maximum **framerate** coming through the PCIe bus to save bandwidth and ensure best quality of service for **multi-channel** scenarios. Some camera has GPIOs buttons that can be used to trigger a capture, a recording or zoom control. | <code><a href="#board"><strong>:board</strong></a></code> <code><a href="#board_get"><kbd>GET</kbd></a></code> | <code><a href="#camera_object"><strong>camera</strong></a></code> | <code><strong>:id</strong></code> <code><a href="#camera_get"><kbd>GET</kbd></a></code> | <code><a href="#worker"><strong>data</strong></a></code> <code><a href="#worker_data_post"><kbd>POST</kbd></a></code> | |---|---|---|---| | <code><a href="#worker"><strong>file</strong></a></code> <code><a href="#worker_file_post"><kbd>POST</kbd></a></code> | | <code><a href="#worker"><strong>net</strong></a></code> <code><a href="#worker_net_post"><kbd>POST</kbd></a></code> | | <code><a href="#camera_white_object"><strong>white</strong></a></code> <code><a href="#camera_white_get"><kbd>GET</kbd></a> <a href="#camera_white_post"><kbd>POST</kbd></a></code> | | <code><a href="#camera_colors_object"><strong>colors</strong></a></code> <code><a href="#camera_colors_get"><kbd>GET</kbd></a> <a href="#camera_colors_post"><kbd>POST</kbd></a></code> | | <code><a href="#camera_exposure_object"><strong>exposure</strong></a></code> <code><a href="#camera_exposure_get"><kbd>GET</kbd></a> <a href="#camera_exposure_post"><kbd>POST</kbd></a></code> | | <code><a href="#camera_visuals_object"><strong>visuals</strong></a></code> <code><a href="#camera_visuals_get"><kbd>GET</kbd></a> <a href="#camera_visuals_post"><kbd>POST</kbd></a></code> | | <code><a href="#camera_button_object"><strong>buttons</strong></a></code> <code><a href="#camera_buttons_get"><kbd>GET</kbd></a></code> | <code><strong>:pin</strong></code> <code><a href="#camera_button_get"><kbd>GET</kbd></a></code> | | - [<code>GET     /:board/camera/:id</code>](#camera_get) - [<code>POST    /:board/camera/:id/data</code>](#worker_post_data) - [<code>POST    /:board/camera/:id/file</code>](#worker_post_file) - [<code>POST    /:board/camera/:id/net</code>](#worker_post_net) - [<code>GET     /:board/camera/:id/white</code>](#camera_white_get) - [<code>POST    /:board/camera/:id/white</code>](#camera_white_post) - [<code>GET     /:board/camera/:id/colors</code>](#camera_colors_get) - [<code>POST    /:board/camera/:id/colors</code>](#camera_colors_post) - [<code>GET     /:board/camera/:id/exposure</code>](#camera_exposure_get) - [<code>POST    /:board/camera/:id/exposure</code>](#camera_exposure_post) - [<code>GET     /:board/camera/:id/visuals</code>](#camera_visuals_get) - [<code>POST    /:board/camera/:id/visuals</code>](#camera_visuals_post) - [<code>GET     /:board/camera/:id/buttons/:pin</code>](#camera_button_get) | <code><strong>board</strong></code> Device position into the host <code>[0 .. 1]</code>. <code><strong>id</strong></code> camera index number <code>[0 .. 1]</code>. <code><strong>pin</strong></code> Button position <code>[0 .. 4]</code>. | |---|---| #### 5.4.1. Camera Object | model <code><em>string</em></code> Camera head model. If no devices is found, the value is left empty. sn <code><em>int</em></code> Camera head serial number. cpu <code><em>int</em></code> Camera head CPU datecode. fpga <code><em>int</em></code> Camera head FPGA datecode. --- audio <code><em>object</em></code> The [audio object](#structure_audio) for the Camera. --- video <code><em>object</em></code> The [video object](#structure_video) for the Camera. | Camera object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"cpu"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"fpga"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"sn"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.4.2. View Camera Status To retrieve the camera signal status, send a GET request to the **camera/:id** endpoint | Parameters None. --- Response Returns the [camera](#camera_object) object if the request succeeded. | GET /:board/camera/:id request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/camera/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"cpu"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"fpga"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"sn"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0/camera/0</pre> GO <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Camera</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">Camera</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/camera/0</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.4.3. White Object The **white** object is used to control the white balance and color temperature of the camera. | balance <code><em>[3]float64</em></code> White balance red, green and blue gains <code>[0.0 .. 2.0]</code>. temperature <code><em>int</em></code> Color temperature in Kelvin <code>[3500 .. 7500]</code>. | White Object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"balance"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">],</span><span class="w"> </span><span class="nl">"temperature"</span><span class="p">:</span><span class="w"> </span><span class="mi">6500</span><span class="p">,</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.4.4. View White Settings To retrieve the camera white parameters, send a GET request to the **white** endpoint. | Parameters None. --- Response Returns the [white](#camera_white_object) object if the request succeeded. | GET /:board/camera/:id/white request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/camera/0/white"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"balance"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">],</span><span class="w"> </span><span class="nl">"temperature"</span><span class="p">:</span><span class="w"> </span><span class="mi">6500</span><span class="p">,</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0/camera/0/white</pre> GO <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">CameraWhite</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/white"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">CameraWhite</span> <span class="n">response</span><span class="p">;</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/white"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/camera/0/white</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.4.5. Update White Settings To update the white settings, send a POST request with the parameters you want to update to the **white** endpoint. If you want to perform a white balance operation, send an empty body. In that case, the camera will automatically adjust the white balance gains and temperature. | Parameters None to perform a white balance operation. Otherwise, include parameters of the [white](#camera_white_object) object you want to update. In the example, the <code>temperature</code> is set to <code>3800</code>. --- Response Returns the [white](#camera_white_object) object if the request succeeded. | POST /:board/camera/:id/white request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/camera/0/white"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"temperature"</span><span class="p">:</span><span class="w"> </span><span class="mi">3800</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"balance"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">],</span><span class="w"> </span><span class="nl">"temperature"</span><span class="p">:</span><span class="w"> </span><span class="mi">3800</span><span class="p">,</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/0/camera/0/white <span class="nt">-d</span> <span class="nv">temperature</span><span class="o">=</span>3800</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="n">temperature</span><span class="o">:</span> <span class="m">3800</span><span class="p">,</span> <span class="p">}</span> <span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">CameraWhite</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/white"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"temperature"</span><span class="p">,</span> <span class="mi">3800</span><span class="p">}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">CameraWhite</span> <span class="n">response</span><span class="p">;</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/white"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">temperature</span><span class="sh">"</span><span class="p">:</span> <span class="mi">3800</span> <span class="p">}</span> <span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/camera/0/white</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> #### 5.4.6. Colors Object The **colors** object is used to customize the color saturation, hue, brightness, contrast and gamma correction. | hue <code><em>int</em></code> Color hue <code>[-30 .. 30]</code>. saturation <code><em>int</em></code> Color saturation <code>[0 .. 100]</code>. brightness <code><em>int</em></code> Color brightness <code>[0 .. 100]</code>. contrast <code><em>int</em></code> Color contrast <code>[0 .. 100]</code>. gamma <code><em>float64</em></code> Color contrast <code>[1.0 .. 2.4]</code>. colorGain <code><em>[3]float64</em></code> Color gain red, green and blue <code>[0.0 .. 2.0]</code>. | Colors Object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"hue"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"saturation"</span><span class="p">:</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="nl">"brightness"</span><span class="p">:</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="nl">"contrast"</span><span class="p">:</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="nl">"gamma"</span><span class="p">:</span><span class="w"> </span><span class="mf">2.2</span><span class="p">,</span><span class="w"> </span><span class="nl">"colorGain"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.4.7. View Colors Settings To retrieve the camera colors parameters, send a GET request to the **colors** endpoint. | Parameters None. --- Response Returns the [colors](#camera_colors_object) object if the request succeeded. | GET /:board/camera/:id/colors request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/camera/0/colors"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"hue"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"saturation"</span><span class="p">:</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="nl">"brightness"</span><span class="p">:</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="nl">"contrast"</span><span class="p">:</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="nl">"gamma"</span><span class="p">:</span><span class="w"> </span><span class="mf">2.2</span><span class="p">,</span><span class="w"> </span><span class="nl">"colorGain"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0/camera/0/colors</pre> GO <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">CameraColors</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/colors"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">CameraColors</span> <span class="n">response</span><span class="p">;</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/colors"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/camera/0/colors</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.4.8. Update Colors Settings To update the colors settings, send a POST request with the parameters you want to update to the **colors** endpoint. | Parameters Include parameters of the [colors](#camera_colors_object) object you want to update. In the example, the <code>saturation</code> is set to <code>80</code> and the <code>brightness</code> to <code>60</code>. --- Response Returns the [colors](#camera_colors_object) object if the request succeeded. | POST /:board/camera/:id/colors request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/camera/0/colors"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"brightness"</span><span class="p">:</span><span class="w"> </span><span class="mi">60</span><span class="p">,</span><span class="w"> </span><span class="nl">"saturation"</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"hue"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"saturation"</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span><span class="p">,</span><span class="w"> </span><span class="nl">"brightness"</span><span class="p">:</span><span class="w"> </span><span class="mi">60</span><span class="p">,</span><span class="w"> </span><span class="nl">"contrast"</span><span class="p">:</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="nl">"gamma"</span><span class="p">:</span><span class="w"> </span><span class="mf">2.2</span><span class="p">,</span><span class="w"> </span><span class="nl">"colorGain"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/0/camera/0/colors <span class="nt">-d</span> <span class="nv">saturation</span><span class="o">=</span>80 <span class="nt">-d</span> <span class="nv">brightness</span><span class="o">=</span>60</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="n">Saturation</span><span class="o">:</span> <span class="m">80</span><span class="p">,</span> <span class="n">Brightness</span><span class="o">:</span> <span class="m">60</span><span class="p">,</span> <span class="p">}</span> <span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">CameraColors</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/colors"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"saturation"</span><span class="p">,</span> <span class="mi">80</span><span class="p">},</span> <span class="p">{</span><span class="s">"brightness"</span><span class="p">,</span> <span class="mi">60</span><span class="p">}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">CameraColors</span> <span class="n">response</span><span class="p">;</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/colors"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">saturation</span><span class="sh">"</span><span class="p">:</span> <span class="mi">80</span><span class="p">,</span> <span class="sh">"</span><span class="s">brightness</span><span class="sh">"</span><span class="p">:</span> <span class="mi">60</span> <span class="p">}</span> <span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/camera/0/colors</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> #### 5.4.9. Exposure Object The **exposure** object is used to control the manual and auto exposure settings of the camera. | framerate <code><em>string</em></code> Camera framerate <code>50</code> or <code>60</code>. --- shutter <code><em>float64</em></code> Sensor shutter gain <code>[1.0 .. 240.0]</code>. gain <code><em>float64</em></code> Sensor analog gain <code>[1.0 .. 22.5]</code>. binning <code><em>float64</em></code> Sensor binning gain <code>[1.0 .. 8.0]</code>. lowLightGain <code><em>float64</em></code> Artificially increase the luminosity level of the camera with a non linear gain on darker pixels <code>[1.0 .. 2.45]</code>. --- isAuto <code><em>bool</em></code> Enable/disable auto exposure. level <code><em>float64</em></code> Luminance target when auto exposure is enabled <code>[50 .. 90]</code>. speed <code><em>float64</em></code> Auto exposure convergence speed <code>[20 .. 100]</code>. maxSaturation <code><em>float64</em></code> Auto exposure maximum saturated pixel tolerance <code>[0 .. 30]</code> percent. window <code><em>[4]int</em></code> Auto exposure window position and size: **x**, **y**, **width**, **height**. --- | Exposure object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="nl">"shutter"</span><span class="p">:</span><span class="w"> </span><span class="mf">153.777777</span><span class="p">,</span><span class="w"> </span><span class="nl">"gain"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nl">"binning"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"lowLightGain"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"isAuto"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="nl">"level"</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span><span class="p">,</span><span class="w"> </span><span class="nl">"speed"</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span><span class="p">,</span><span class="w"> </span><span class="nl">"maxSaturation"</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="nl">"window"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">72</span><span class="p">,</span><span class="w"> </span><span class="mi">3840</span><span class="p">,</span><span class="w"> </span><span class="mi">2048</span><span class="p">],</span><span class="w"> </span><span class="nl">"shutterLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mf">240.0</span><span class="p">],</span><span class="w"> </span><span class="nl">"gainLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mf">22.5</span><span class="p">],</span><span class="w"> </span><span class="nl">"binningLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">],</span><span class="w"> </span><span class="nl">"lowLightGainLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">],</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | shutterLimits <code><em>[2]float64</em></code> Sensor shutter auto exposure minimum and maximum limits. gainLimits <code><em>[2]float64</em></code> Sensor analog gain auto exposure minimum and maximum limits. binningLimits <code><em>[2]float64</em></code> Sensor binning gain auto exposure minimum and maximum limits. lowLightGainLimits <code><em>[2]float64</em></code> Low light gain auto exposure minimum and maximum limits. | | #### 5.4.10. View Exposure Settings To retrieve the camera exposure parameters, send a GET request to the **exposure** endpoint. | Parameters None. --- Response Returns the [exposure](#camera_exposure_object) object if the request succeeded. | GET /:board/camera/:id/exposure request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/camera/0/exposure"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="nl">"shutter"</span><span class="p">:</span><span class="w"> </span><span class="mf">153.777777</span><span class="p">,</span><span class="w"> </span><span class="nl">"gain"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nl">"binning"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"lowLightGain"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"isAuto"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="nl">"level"</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span><span class="p">,</span><span class="w"> </span><span class="nl">"speed"</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span><span class="p">,</span><span class="w"> </span><span class="nl">"maxSaturation"</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="nl">"window"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">72</span><span class="p">,</span><span class="w"> </span><span class="mi">3840</span><span class="p">,</span><span class="w"> </span><span class="mi">2048</span><span class="p">],</span><span class="w"> </span><span class="nl">"shutterLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mf">240.0</span><span class="p">],</span><span class="w"> </span><span class="nl">"gainLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mf">22.5</span><span class="p">],</span><span class="w"> </span><span class="nl">"binningLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">],</span><span class="w"> </span><span class="nl">"lowLightGainLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">],</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0/camera/0/exposure</pre> GO <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">CameraExposure</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/exposure"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">CameraExposure</span> <span class="n">response</span><span class="p">;</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/exposure"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/camera/0/exposure</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.4.11. Update Exposure Settings Change the exposure parameters as required by your application by sending a POST request to the **exposure** endpoint. | Parameters Include settings of the [exposure](#camera_exposure_object) object you want to update. In the example, the <code>gainLimits</code> is set to <code>[2.5, 15]</code>. --- Response Returns the [exposure](#camera_exposure_object) object if the request succeeded. | POST /:board/camera/:id/exposure request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/camera/0/exposure"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"gainLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mf">2.5</span><span class="p">,</span><span class="w"> </span><span class="mf">15.0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="nl">"shutter"</span><span class="p">:</span><span class="w"> </span><span class="mf">153.777777</span><span class="p">,</span><span class="w"> </span><span class="nl">"gain"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nl">"binning"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"lowLightGain"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"isAuto"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="nl">"level"</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span><span class="p">,</span><span class="w"> </span><span class="nl">"speed"</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span><span class="p">,</span><span class="w"> </span><span class="nl">"maxSaturation"</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="nl">"window"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">72</span><span class="p">,</span><span class="w"> </span><span class="mi">3840</span><span class="p">,</span><span class="w"> </span><span class="mi">2048</span><span class="p">],</span><span class="w"> </span><span class="nl">"shutterLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mf">240.0</span><span class="p">],</span><span class="w"> </span><span class="nl">"gainLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mf">2.5</span><span class="p">,</span><span class="w"> </span><span class="mi">15</span><span class="p">],</span><span class="w"> </span><span class="nl">"binningLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">],</span><span class="w"> </span><span class="nl">"lowLightGainLimits"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">],</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/0/camera/0/exposure <span class="nt">-d</span> <span class="nv">gainLimits</span><span class="o">=</span>2.5,15.0</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="n">GainLimits</span><span class="o">:</span> <span class="p">[</span><span class="m">2.5</span><span class="p">,</span> <span class="m">15.0</span><span class="p">],</span> <span class="p">}</span> <span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">CameraExposure</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/exposure"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"gainLimits"</span><span class="p">,</span> <span class="p">{</span><span class="mf">2.5</span><span class="p">,</span> <span class="mf">15.0</span><span class="p">}}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">CameraExposure</span> <span class="n">response</span><span class="p">;</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/exposure"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">gainLimits</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mf">2.5</span><span class="p">,</span> <span class="mf">15.0</span><span class="p">]</span> <span class="p">}</span> <span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/camera/0/exposure</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> #### 5.4.12. Visuals Object The **visuals** object regroups parameters to enhance the camera picture. It includes sharpness, anisotropic and bilateral denoising filters, shadow lighting effect, flip and zoom settings. | anisotropic <code><em>int</em></code> Strength of the anisotropic denoising filter <code>[0 .. 100]</code>. bilateral <code><em>int</em></code> Strength of the bilateral denoising filter <code>[0 .. 100]</code>. flip <code><em>string</em></code> Flip **Horizontally** and/or **Vertically** the camera. <code>none</code>, <code>x</code>, <code>y</code>, <code>xy</code>. shadow lighting gain <code><em>float64</em></code> Artificially increase the luminosity level of the camera with a non linear gain on darker pixels <code>[1.0 .. 2.5]</code>. sharpness <code><em>float64</em></code> Strength of the sharpness filter <code>[1.0 .. 9.0]</code>. sharpnessFloor <code><em>int</em></code> Floor threshold at which the sharpness filter begin to take effect <code>[0 .. 50]</code>. zoom <code><em>float64</em></code> Digital zoom <code>[1.0 .. 4.0]</code>. | Visuals object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"anisotropic"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"bilateral"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"flip"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"shadowLightingGain"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nl">"sharpness"</span><span class="p">:</span><span class="w"> </span><span class="mf">3.1</span><span class="p">,</span><span class="w"> </span><span class="nl">"sharpnessFloor"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"zoom"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.4.13. View Visuals Settings To retrieve the camera visuals parameters, send a GET request to the **visuals** endpoint. | Parameters None. --- Response Returns the [visuals](#camera_visuals_object) object if the request succeeded. | GET /:board/camera/:id/visuals request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/camera/0/visuals"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"anisotropic"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"bilateral"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"flip"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"shadowLightingGain"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nl">"sharpness"</span><span class="p">:</span><span class="w"> </span><span class="mf">3.1</span><span class="p">,</span><span class="w"> </span><span class="nl">"sharpnessFloor"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"zoom"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0/camera/0/visuals</pre> GO <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">CameraVisuals</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/visuals"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">CameraVisuals</span> <span class="n">response</span><span class="p">;</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/visuals"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/camera/0/visuals</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.4.14. Update Visuals Settings Change the camera visuals as required by your application by sending a POST request to the **visuals** endpoint. | Parameters Include settings of the [visuals](#camera_visuals_object) object you want to update. In the example, the <code>sharpness</code> is set to <code>2.5</code>. --- Response Returns the [visuals](#camera_visuals_object) object if the request succeeded. | POST /:board/camera/:id/visuals request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/camera/0/visuals"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"sharpness"</span><span class="p">:</span><span class="w"> </span><span class="mf">2.5</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"anisotropic"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"bilateral"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"flip"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"shadowLightingGain"</span><span class="p">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="nl">"sharpness"</span><span class="p">:</span><span class="w"> </span><span class="mf">2.5</span><span class="p">,</span><span class="w"> </span><span class="nl">"sharpnessFloor"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"zoom"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/0/camera/0/visuals <span class="nt">-d</span> <span class="nv">sharpness</span><span class="o">=</span>2.5</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="n">Sharpness</span><span class="o">:</span> <span class="m">2.5</span><span class="p">,</span> <span class="p">}</span> <span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">CameraVisuals</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/visuals"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"sharpness"</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">CameraVisuals</span> <span class="n">response</span><span class="p">;</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/visuals"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">sharpness</span><span class="sh">"</span><span class="p">:</span> <span class="mf">2.5</span> <span class="p">}</span> <span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/camera/0/visuals</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> #### 5.4.15. Button Object The **button** object allows to capture the button pin state. | description <code><em>string</em></code> Description of the button pin. pressed <code><em>bool</em></code> Is the button currently 'pressed'. pressedCount <code><em>int</em></code> Number of times the button has been pressed since the last 'release' event. timestamp <code><em>int64</em></code> The unix timestamp of the last 'press' or 'release' event in microseconds. | Button object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/camera/0/buttons/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.4.16. View Button State To retrieve the button status, send a GET request to the **button/:pin** endpoint. | Parameters None. --- Response Returns the [button](#camera_button_object) object if the request succeeded. | GET /0/camera/0/buttons/:pin request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/camera/0/buttons/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/camera/0/buttons/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0/camera/0/buttons/0</pre> golang <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Button</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/buttons/0"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">Button</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/buttons/0"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/camera/0/buttons/0</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.4.17. Buttons Object The **buttons** object is a collection of [button](#camera_button_object) objects. It allows to capture the state of multiple buttons at once. #### 5.4.18. View Buttons State To retrieve the status of all buttons at once, send a GET request to the **buttons** endpoint. | Parameters None. --- Response Returns the [buttons](#camera_buttons_object) object if the request succeeded. | GET /0/camera/0/buttons request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/camera/0/buttons"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/camera/0/buttons/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/camera/0/buttons/1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/camera/0/buttons/2"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/camera/0/buttons/3"</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"pressedCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0/camera/0/buttons</pre> golang <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Buttons</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/buttons"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">Buttons</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/camera/0/buttons"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/camera/0/buttons/0</span><span class="sh">"</span><span class="p">)</span></pre> ### 5.5. HDMI Output Allows to configure the physical hdmi outputs on a LT board. | <code><a href="#board"><strong>:board</strong></a></code> <code><a href="#board_get"><kbd>GET</kbd></a></code> | <code><a href="#hdmi_out"><strong>hdmi-out</strong></a></code> | <code><strong>:id</strong></code> <code><a href="#hdmi_out_get"><kbd>GET</kbd></a><a href="#hdmi_out_post"><kbd>POST</kbd></a></code> | |---|---|---| | - [<code>GET     /:board/hdmi-out/:id</code>](#hdmi_out_get) - [<code>POST    /:board/hdmi-out/:id</code>](#hdmi_out_post) | <code><strong>board</strong></code> Device position into the host <code>[0 .. 1]</code>. <code><strong>id</strong></code> hdmi-out index number <code>0</code>. | |---|---| #### 5.5.1. HDMI Output Object | source <code><em>string</em></code> The hdmi-out source. Values can be <code>auto</code>, <code>camera/:id</code>. overlay <code><em>string</em></code> The overlay source applied on the hdmi-out. Values can be <code>canvas/:id</code> or <code>none</code> for no overlay. overlayMode <code><em>string</em></code> Controls how overlay content is processed on the output device. This parameter affects the quality and performance of overlays. Values can be <code>performance</code> or <code>quality</code>. format <code><em>string</em></code> The color format applied to the output. Values can be <code>auto</code>, <code>rgb444</code>, <code>yuv444</code> and <code>yuv422</code>. link <code><em>string</em></code> The hdmi-out link carrier. Values can be <code>auto</code>, <code>fhd</code> or <code>off</code>. --- audio <code><em>object</em></code> The [audio object](#structure_audio) for the HDMI Output. video <code><em>object</em></code> The [video object](#structure_video) for the HDMI Output. --- | HDMI Output object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"overlay"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"overlayMode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"performance"</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"link"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.5.2. View HDMI Output Status To retrieve the hdmi-out configuration, send a GET request to the **hdmi-out/:id** endpoint. | Parameters None. --- Response Returns the [hdmi-out](#hdmi_out_object) object if the request succeeded. | GET /:board/hdmi-out/:id request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/hdmi-out/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"overlay"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"overlayMode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"performance"</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"link"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0/hdmi-out/0</pre> GO <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Output</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/hdmi-out/0"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">HdmiOutput</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/hdmi-out/0"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/hdmi-out/0</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.5.3. Configure HDMI Output In order to update the hdmi-out configuration, send a POST request to the **hdmi-out/:id** endpoint with the desired settings. | Parameters Include settings of the [hdmi-out](#hdmi_out_object) object you want to update. In the example, the hdmi-out <code>overlay</code> is set to <code>canvas/0</code>. --- Response Returns the [hdmi-out](#hdmi_out_object) object if the request succeeded. | POST /:board/hdmi-out/:id request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/hdmi-out/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"overlay"</span><span class="p">:</span><span class="w"> </span><span class="s2">"canvas/0"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"overlay"</span><span class="p">:</span><span class="w"> </span><span class="s2">"canvas/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"overlayMode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"performance"</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"link"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/0/hdmi-out/0 <span class="nt">-d</span> <span class="nv">overlay</span><span class="o">=</span>canvas/0</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"overlay"</span><span class="o">:</span> <span class="s">"canvas/0"</span><span class="p">,</span> <span class="p">}</span> <span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Output</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/0/hdmi-out/0"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"overlay"</span><span class="p">,</span> <span class="s">"canvas/0"</span><span class="p">}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">HdmiOutput</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/0/hdmi-out/0"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">overlay</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">canvas/0</span><span class="sh">"</span> <span class="p">}</span> <span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/hdmi-out/0</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> ### 5.6. SDI Output Allows to configure the physical sdi outputs on a LT board. | <code><a href="#board"><strong>:board</strong></a></code> <code><a href="#board_get"><kbd>GET</kbd></a></code> | <code><a href="#sdi_out"><strong>sdi-out</strong></a></code> | <code><strong>:id</strong></code> <code><a href="#sdi_out_get"><kbd>GET</kbd></a> <a href="#sdi_out_post"><kbd>POST</kbd></a></code> | |---|---|---| | - [<code>GET     /:board/sdi-out/:id</code>](#sdi_out_get) - [<code>POST    /:board/sdi-out/:id</code>](#sdi_out_post) | <code><strong>board</strong></code> Device position into the host <code>[0 .. 1]</code>. <code><strong>id</strong></code> sdi-out index number <code>0</code>. | |---|---| #### 5.6.1. SDI Output Object | source <code><em>string</em></code> The sdi-out source. Values can be <code>auto</code>, <code>camera/:id</code>. overlay <code><em>string</em></code> The overlay source applied on the sdi-out. Values can be <code>none</code> or <code>canvas/:id</code>. format <code><em>string</em></code> The color format applied to the output. Values is <code>yuv422</code>. link <code><em>string</em></code> The sdi-out link carrier. Values can be <code>auto</code>, <code>uhd_4x3g</code>, <code>fhd</code> or <code>off</code>. --- audio <code><em>json</em></code> Audio signal object. → description <code><em>string</em></code> A short description of the audio signal. → format <code><em>string</em></code> The audio sample format <code>pcm</code>. → channels <code><em>int</em></code> The number of audio channels. → samplerate <code><em>int</em></code> The number of audio samples per second. → depth <code><em>int</em></code> The number of bits per audio sample. → signal <code><em>string</em></code> <code>none</code> (not found), or <code>locked</code> (ready to use). --- | SDI Output object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"overlay"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"link"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | video <code><em>json</em></code> Video signal object. → description <code><em>string</em></code> The video signal short description. → format <code><em>string</em></code> The pixel color format <code>rgb444</code>, <code>yuv444</code> or <code>yuv422</code>. → framerate <code><em>float</em></code> The number of video frames per second. → size <code><em>[2]int</em></code> The video frame width and height in pixel units. → interlaced <code><em>bool</em></code> The video frame interlaced status. → signal <code><em>string</em></code> <code>none</code> (not found), or <code>locked</code> (ready to use). | | |---|---| #### 5.6.2. View SDI Output Status To retrieve the sdi-out configuration, send a GET request to the **sdi-out/:id** endpoint. | Parameters None. --- Response Returns the [sdi-out](#sdi_out_object) object if the request succeeded. | GET /:board/sdi-out/:id request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/sdi-out/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"overlay"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"link"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/0/sdi-out/0</pre> GO <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Output</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/sdi-out/0"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">SdiOutput</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/0/sdi-out/0"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/sdi-out/0</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.6.3. Configure SDI Output In order to update the sdi-out configuration, send a POST request to the **sdi-out/:id** endpoint with the desired settings. | Parameters Include settings of the [sdi-out](#sdi_out_object) object you want to update. In the example, the sdi-out <code>overlay</code> is set to <code>canvas/0</code>. --- Response Returns the [sdi-out](#sdi_out_object) object if the request succeeded. | POST /:board/sdi-out/:id request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/0/sdi-out/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"overlay"</span><span class="p">:</span><span class="w"> </span><span class="s2">"canvas/0"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"overlay"</span><span class="p">:</span><span class="w"> </span><span class="s2">"canvas/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"link"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/0/sdi-out/0 <span class="nt">-d</span> <span class="nv">overlay</span><span class="o">=</span>canvas/0</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"overlay"</span><span class="o">:</span> <span class="s">"canvas/0"</span><span class="p">,</span> <span class="p">}</span> <span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Output</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/0/sdi-out/0"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"overlay"</span><span class="p">,</span> <span class="s">"canvas/0"</span><span class="p">}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">SdiOutput</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"/0/sdi-out/0"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">overlay</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">canvas/0</span><span class="sh">"</span> <span class="p">}</span> <span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/0/sdi-out/0</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> ### 5.7. Canvas The **canvas** endpoint is both a virtual audio/video source and a dynamic synthetic image generator which supports draw operations. It could be used to emulate the LT boards video inputs and to send overlay images onto the hdmi and/or sdi outputs. Data operations | <code><a href="#canvas"><strong>canvas</strong></a></code> | <code><strong>:id</strong></code> <code><a href="#canvas_get"><kbd>GET</kbd></a><a href="#canvas_delete"><kbd>DELETE</kbd></a></code> | <code><a href="#worker"><strong>data</strong></a></code> <code><a href="#worker_data_post"><kbd>POST</kbd></a></code> | |---|---|---| | <code><a href="#worker"><strong>file</strong></a></code> <code><a href="#worker_file_post"><kbd>POST</kbd></a></code> | | - [<code>GET     /canvas/:id</code>](#canvas_get) - [<code>POST    /canvas/:id/:format/data</code>](#worker_data_post) - [<code>POST    /canvas/:id/:format/file</code>](#worker_file_post) | <code><strong>id</strong></code> canvas index number <code>[0 .. 3]</code>. | |---|---| Draw operations | <code><a href="#canvas"><strong>canvas</strong></a></code> | <code><strong>:id</strong></code> <code><a href="#canvas_get"><kbd>GET</kbd></a></code> | <code><a href="#canvas_init"><strong>init</strong></a></code> <code><a href="#canvas_init"><kbd>POST</kbd></a></code> | |---|---|---| | <code><a href="#canvas_text"><strong>text</strong></a></code> <code><a href="#canvas_text"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_line"><strong>line</strong></a></code> <code><a href="#canvas_line"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_ellipse"><strong>ellipse</strong></a></code> <code><a href="#canvas_ellipse"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_rectangle"><strong>rectangle</strong></a></code> <code><a href="#canvas_rectangle"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_image"><strong>image</strong></a></code> <code><a href="#canvas_image"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_video"><strong>video</strong></a></code> <code><a href="#canvas_video"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_clear"><strong>clear</strong></a></code> <code><a href="#canvas_clear"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_op"><strong>op</strong></a></code> <code><a href="#canvas_op"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_ops"><strong>ops</strong></a></code> <code><a href="#canvas_ops"><kbd>POST</kbd></a></code> | | - [<code>GET     /canvas/:id</code>](#canvas_get) - [<code>POST    /canvas/:id/init</code>](#canvas_init) - [<code>POST    /canvas/:id/line</code>](#canvas_line) - [<code>POST    /canvas/:id/ellipse</code>](#canvas_ellipse) - [<code>POST    /canvas/:id/rectangle</code>](#canvas_rect) - [<code>POST    /canvas/:id/image</code>](#canvas_image) - [<code>POST    /canvas/:id/video</code>](#canvas_video) - [<code>POST    /canvas/:id/clear</code>](#canvas_clear) - [<code>POST    /canvas/:id/op</code>](#canvas_op) - [<code>POST    /canvas/:id/ops</code>](#canvas_ops) | <code><strong>id</strong></code> canvas index number <code>[0 .. 3]</code>. | |---|---| #### 5.7.1. Canvas Object | audio <code><em>object</em></code> The [audio object](#structure_audio) for the Canvas. --- video <code><em>object</em></code> The [video object](#structure_video) for the Canvas. | Canvas object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.7.2. View Canvas Status To retrieve the canvas signal status, send a GET request to the **canvas/:id** endpoint | Parameters None. --- Response Returns the [canvas](#canvas_object) object if the request succeeded. | GET /canvas/:id request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/canvas/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl get cv40:/canvas/0</pre> GO <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Input</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/canvas/0"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">Input</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"cv40:/canvas/0"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/canvas/0</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.7.3. Delete Operation Clear the canvas to a "NO SIGNAL" equivalent. Helps to simulate a video input loss. | Parameters None. --- Response Returns an error if the request failed. | DELETE /canvas/:id request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"DELETE"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/canvas/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl delete cv40:/canvas/0</pre> GO <pre><span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Delete</span><span class="p">(</span><span class="s">"cv40:/canvas/0"</span><span class="p">,</span> <span class="no">nil</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Delete</span><span class="p">(</span><span class="s">"cv40:/canvas/0"</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> Python <pre><span class="n">err</span> <span class="o">=</span> <span class="nc">Delete</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/canvas/0</span><span class="sh">"</span><span class="p">)</span></pre> #### 5.7.4. Init Operation Clear the canvas and fill the background with the specified file, pattern or color. | Parameters op <code><em>string</em></code> Operation identifier <code>init</code>. source <code><em>string</em></code> The canvas *size* and *framerate* is derived from the file content. Supported formats are <code>jpeg</code>, <code>png</code>, <code>bmp</code> and <code>mp4</code> files. In the example, the **source** is a mp4 video file. color <code><em>[4]int</em></code> The RGBA background color with transparency. Default <code>[0,0,0,0]</code>. size <code><em>[2]int</em></code> Set the canvas width and height. Default <code>[3840,2160]</code>. framerate <code><em>float</em></code> Set the canvas refresh rate. Default <code>30.0</code>. --- Response Returns the init operation parameters if the request succeeded. | POST /canvas/:id/init request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/canvas/0/init"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video.mp4"</span><span class="p">,</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"init"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video.mp4"</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/init <span class="nt">-d</span> <span class="nb">source</span><span class="o">=</span>video.mp4</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"source"</span><span class="o">:</span> <span class="s">"video.mp4"</span><span class="p">,</span> <span class="p">}</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/init"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"source"</span><span class="p">,</span> <span class="s">"video.mp4"</span><span class="p">}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/init"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">video.mp4</span><span class="sh">"</span> <span class="p">}</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/canvas/0/init</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> #### 5.7.5. Text Operation Draw text onto the canvas. | Parameters op <code><em>string</em></code> Operation identifier <code>text</code>. text <code><em>string</em></code> Text to draw. **This parameter is mandatory.** align <code><em>string</em></code> Set the text position into the container.The possible values are <code>top-left</code>, <code>top</code>, <code>top-right</code>, <code>left</code>, <code>center</code>, <code>right</code>, <code>bottom-left</code>, <code>bottom</code> and <code>bottom-right</code>. Default is <code>center</code>. font <code><em>string</em></code> Font type. Default is <code>regular</code>, could also be <code>mono</code> and <code>smallcaps</code>. fontSize <code><em>int</em></code> Font size in pt unit. Default is <code>32</code>. italic <code><em>bool</em></code> Draw the text with the ***italic*** attribute. Default <code>false</code>. bold <code><em>bool</em></code> Draw the text with the ***bold*** attribute. Default <code>false</code>. color <code><em>[4]int</em></code> The RGBA shape color with transparency. Default <code>{0,0,0,255}</code>. angle <code><em>float</em></code> Rotation angle in degree unit. Default <code>0</code>. position <code><em>[2]int</em></code> The top left corner **{x, y}** position of the container. Default is <code>{0,0}</code>. size <code><em>[2]int</em></code> The container size **{width, height}**. --- | POST /canvas/:id/text request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/canvas/0/text"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hello world!"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="nl">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hello world!"</span><span class="p">,</span><span class="w"> </span><span class="nl">"align"</span><span class="p">:</span><span class="w"> </span><span class="s2">"center"</span><span class="p">,</span><span class="w"> </span><span class="nl">"font"</span><span class="p">:</span><span class="w"> </span><span class="s2">"regular"</span><span class="p">,</span><span class="w"> </span><span class="nl">"fontSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">32</span><span class="p">,</span><span class="w"> </span><span class="nl">"italic"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"bold"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"angle"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="w"> </span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Response Returns the text operation parameters if the request succeeded. | | **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/text <span class="nt">-d</span> <span class="nv">text</span><span class="o">=</span><span class="s2">"hello world!"</span></pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"text"</span><span class="o">:</span> <span class="s">"hello world!"</span><span class="p">,</span> <span class="p">}</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/text"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"text"</span><span class="p">,</span> <span class="s">"hello world!"</span><span class="p">}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/text"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">text</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">hello world!</span><span class="sh">"</span> <span class="p">}</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/canvas/0/text</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> #### 5.7.6. Line Operation Draw a line whose top left anchor is <code>(x,y)</code> coordinates. | Parameters op <code><em>string</em></code> Operation identifier <code>line</code>. width <code><em>int</em></code> The shape width size in pixel unit. Default <code>1</code>. color <code><em>[4]int</em></code> The RGBA shape color with transparency. Default <code>{0,0,0,255}</code>. pattern <code><em>[]int</em></code> The dash size pattern in pixel units. The pattern is repeated. Default no dash pattern: <code>{}</code>. angle <code><em>float</em></code> Rotation angle in degree unit. Default <code>0</code>. position <code><em>[2]int</em></code> The top left corner **{x, y}** position of the container. Default is <code>{0,0}</code>. size <code><em>[2]int</em></code> The container size **{width, height}**. **This parameter is mandatory.** --- Response Returns the line operation parameters if the request succeeded. | POST /canvas/:id/line request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/canvas/0/line"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"line"</span><span class="p">,</span><span class="w"> </span><span class="nl">"width"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"pattern"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="nl">"angle"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="w"> </span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/line <span class="se">\</span> <span class="nt">-d</span> <span class="nv">position</span><span class="o">=</span>0,0 <span class="se">\</span> <span class="nt">-d</span> <span class="nv">size</span><span class="o">=</span>3840,2160 <span class="se">\</span> <span class="nt">-d</span> <span class="nv">color</span><span class="o">=</span>255,0,0,255</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"position"</span><span class="o">:</span> <span class="p">[</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">],</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[</span><span class="m">3840</span><span class="p">,</span><span class="m">2160</span><span class="p">],</span> <span class="s">"color"</span><span class="o">:</span> <span class="p">[</span><span class="m">255</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">255</span><span class="p">]</span> <span class="p">}</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/line"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"position"</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">}},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">3840</span><span class="p">,</span><span class="mi">2160</span><span class="p">}},</span> <span class="p">{</span><span class="s">"color"</span><span class="p">,</span> <span class="p">{</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">}}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/line"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">3840</span><span class="p">,</span> <span class="mi">2160</span><span class="p">],</span> <span class="sh">"</span><span class="s">color</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">]</span> <span class="p">}</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/canvas/0/line</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> #### 5.7.7. Ellipse Operation Draw an ellipse whose top left anchor is <code>(x,y)</code> coordinates. | Parameters op <code><em>string</em></code> Operation identifier <code>ellipse</code>. width <code><em>int</em></code> The shape width size in pixel unit. Default <code>1</code>. color <code><em>[4]int</em></code> The RGBA shape color with transparency. Default <code>{0,0,0,255}</code>. pattern <code><em>[]int</em></code> The dash size pattern in pixel units. The pattern is repeated. Default no dash pattern: <code>{}</code>. fill <code><em>[4]int</em></code> Fill the shape with a RGBA color. Default is <code>{0,0,0,0}</code>. angle <code><em>float</em></code> Rotation angle in degree unit. Default <code>0</code>. position <code><em>[2]int</em></code> The top left corner **{x, y}** position of the container. Default is <code>{0,0}</code>. size <code><em>[2]int</em></code> The container size **{width, height}**. **This parameter is mandatory.** --- Response Returns the ellipse operation parameters if the request succeeded. | POST /canvas/:id/ellipse request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/canvas/0/ellipse"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"fill"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ellipse"</span><span class="p">,</span><span class="w"> </span><span class="nl">"width"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"pattern"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="nl">"fill"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"angle"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="w"> </span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/ellipse <span class="se">\</span> <span class="nt">-d</span> <span class="nv">position</span><span class="o">=</span>0,0 <span class="se">\</span> <span class="nt">-d</span> <span class="nv">size</span><span class="o">=</span>3840,2160 <span class="se">\</span> <span class="nt">-d</span> <span class="nv">color</span><span class="o">=</span>255,0,0,255 <span class="se">\</span> <span class="nt">-d</span> <span class="nv">fill</span><span class="o">=</span>0,255,0,255</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"position"</span><span class="o">:</span> <span class="p">[</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">],</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[</span><span class="m">3840</span><span class="p">,</span><span class="m">2160</span><span class="p">],</span> <span class="s">"color"</span><span class="o">:</span> <span class="p">[</span><span class="m">255</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">255</span><span class="p">],</span> <span class="s">"fill"</span><span class="o">:</span> <span class="p">[</span><span class="m">0</span><span class="p">,</span><span class="m">255</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">255</span><span class="p">]</span> <span class="p">}</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/ellipse"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"position"</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">}},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">3840</span><span class="p">,</span><span class="mi">2160</span><span class="p">}},</span> <span class="p">{</span><span class="s">"color"</span><span class="p">,</span> <span class="p">{</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">}},</span> <span class="p">{</span><span class="s">"fill"</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">}}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/ellipse"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="mi">2160</span><span class="p">],</span> <span class="sh">"</span><span class="s">color</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">],</span> <span class="sh">"</span><span class="s">fill</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">]</span> <span class="p">}</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/canvas/0/ellipse</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> #### 5.7.8. Rectangle Operation Draw a rectangle whose top left anchor is <code>(x,y)</code> coordinates. | Parameters op <code><em>string</em></code> Batch operation identifier <code>rectangle</code>. width <code><em>int</em></code> The shape width size in pixel unit. Default <code>1</code>. color <code><em>[4]int</em></code> The RGBA shape color with transparency. Default <code>{0,0,0,255}</code>. pattern <code><em>[]int</em></code> The dash size pattern in pixel units. The pattern is repeated. Default no dash pattern: <code>{}</code>. fill <code><em>[4]int</em></code> Fill the shape with a RGBA color. Default is <code>{0,0,0,0}</code>. rounded <code><em>int</em></code> The shape corner radius in pixel unit. Default <code>0</code>. angle <code><em>float</em></code> Rotation angle in degree unit. Default <code>0</code>. position <code><em>[2]int</em></code> The top left corner **{x, y}** position of the container. Default is <code>{0,0}</code>. size <code><em>[2]int</em></code> The container size **{width, height}**. **This parameter is mandatory.** --- Response Returns the rectangle operation parameters if the request succeeded. | POST /canvas/:id/rectangle request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/canvas/0/rectangle"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">400</span><span class="p">,</span><span class="mi">400</span><span class="p">],</span><span class="w"> </span><span class="nl">"fill"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rectangle"</span><span class="p">,</span><span class="w"> </span><span class="nl">"width"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"pattern"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="nl">"fill"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"rounded"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"angle"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">400</span><span class="p">,</span><span class="w"> </span><span class="mi">400</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/rectangle <span class="se">\</span> <span class="nt">-d</span> <span class="nv">position</span><span class="o">=</span>100,100 <span class="se">\</span> <span class="nt">-d</span> <span class="nv">size</span><span class="o">=</span>400,400 <span class="se">\</span> <span class="nt">-d</span> <span class="nv">fill</span><span class="o">=</span>0,0,255,255</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"position"</span><span class="o">:</span> <span class="p">[</span><span class="m">100</span><span class="p">,</span><span class="m">100</span><span class="p">],</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[</span><span class="m">400</span><span class="p">,</span><span class="m">400</span><span class="p">],</span> <span class="s">"fill"</span><span class="o">:</span> <span class="p">[</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">255</span><span class="p">,</span><span class="m">255</span><span class="p">]</span> <span class="p">}</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/rectangle"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"position"</span><span class="p">,</span> <span class="p">{</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">}},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">400</span><span class="p">,</span><span class="mi">400</span><span class="p">}},</span> <span class="p">{</span><span class="s">"fill"</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">}}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/rectangle"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">],</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">400</span><span class="p">,</span><span class="mi">400</span><span class="p">],</span> <span class="sh">"</span><span class="s">fill</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">]</span> <span class="p">}</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/canvas/0/rectangle</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> #### 5.7.9. Image Operation There are two ways to draw an image on the canvas: - Using a file path with the <code>source</code> parameter. The <code>format</code>, <code>data</code>, <code>width</code> and <code>height</code> parameters are ignored. - Using a data buffer with the <code>data</code> parameter. The <code>format</code> parameter is mandatory and if a raw format is used (i.e. <code>rgba</code> or <code>rgb</code>), the <code>width</code> and <code>height</code> parameters are required too. | Parameters op <code><em>string</em></code> Operation identifier <code>image</code>. source <code><em>string</em></code> Filepath. Supported formats are <code>jpeg</code>, <code>png</code> and <code>bmp</code> files. angle <code><em>float</em></code> Rotation angle in degree unit. Default <code>0</code>. position <code><em>[2]int</em></code> The top left corner **{x, y}** position of the container. Default is <code>{0,0}</code>. size <code><em>[2]int</em></code> The container size **{width, height}**. **This parameter is mandatory.** --- format <code><em>string</em></code> The image data format. Could be <code>rgba</code>, <code>rgb</code>, <code>bmp</code>, <code>jpeg</code> or <code>png</code>. data <code><em>[]byte</em></code> Image data buffer. width <code><em>int</em></code> Image width. Mandatory for <code>rgba</code> or <code>rgb</code> data buffer. height <code><em>int</em></code> Image height. Mandatory for <code>rgba</code> or <code>rgb</code> data buffer. --- Response Returns the image operation parameters if the request succeeded. | POST /canvas/:id/image request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/canvas/0/image"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"C:</span><span class="se">\\</span><span class="s2">image.png"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">640</span><span class="p">,</span><span class="mi">480</span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"image"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"C:</span><span class="se">\\</span><span class="s2">image.png"</span><span class="p">,</span><span class="w"> </span><span class="nl">"angle"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">640</span><span class="p">,</span><span class="w"> </span><span class="mi">480</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"data"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="nl">"width"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"height"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/image <span class="se">\</span> <span class="nt">-d</span> <span class="nb">source</span><span class="o">=</span>C:<span class="se">\\</span>image.png <span class="se">\</span> <span class="nt">-d</span> <span class="nv">position</span><span class="o">=</span>0,0 <span class="se">\</span> <span class="nt">-d</span> <span class="nv">size</span><span class="o">=</span>640,480</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"source"</span><span class="o">:</span> <span class="s">"C:</span><span class="se">\\</span><span class="s">image.png"</span><span class="p">,</span> <span class="s">"position"</span><span class="o">:</span> <span class="p">[</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">],</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[</span><span class="m">640</span><span class="p">,</span><span class="m">480</span><span class="p">]</span> <span class="p">}</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/image"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"source"</span><span class="p">,</span> <span class="s">"C:</span><span class="se">\\</span><span class="s">image.png"</span><span class="p">},</span> <span class="p">{</span><span class="s">"position"</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">}},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">640</span><span class="p">,</span><span class="mi">480</span><span class="p">}}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/image"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">C:</span><span class="se">\\</span><span class="s">image.png</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">640</span><span class="p">,</span><span class="mi">480</span><span class="p">]</span> <span class="p">}</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/canvas/0/image</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> #### 5.7.10. Video Operation Place a video on the canvas. | Parameters op <code><em>string</em></code> Batch operation identifier <code>video</code>. source <code><em>string</em></code> Supported sources are <code>:board/camera/:id</code> and <code>canvas/:id</code>. position <code><em>[2]int</em></code> The top left corner **{x, y}** position of the container. Default is <code>{0,0}</code>. size <code><em>[2]int</em></code> The container size **{width, height}**. --- Response Returns the video operation parameters if the request succeeded. | POST /canvas/:id/video request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/canvas/0/video"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/camera/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="mi">1080</span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/{source}/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/video <span class="se">\</span> <span class="nt">-d</span> <span class="nb">source</span><span class="o">=</span>0/camera/0 <span class="se">\</span> <span class="nt">-d</span> <span class="nv">position</span><span class="o">=</span>0,0 <span class="se">\</span> <span class="nt">-d</span> <span class="nv">size</span><span class="o">=</span>1920,1080</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"source"</span><span class="o">:</span> <span class="s">"0/camera/0"</span><span class="p">,</span> <span class="s">"position"</span><span class="o">:</span> <span class="p">[</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">],</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[</span><span class="m">1920</span><span class="p">,</span><span class="m">1080</span><span class="p">]</span> <span class="p">}</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/video"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"source"</span><span class="p">,</span> <span class="s">"0/camera/0"</span><span class="p">},</span> <span class="p">{</span><span class="s">"position"</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">}},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">1920</span><span class="p">,</span><span class="mi">1080</span><span class="p">}}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/video"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">0/sdi-in/0</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="mi">1080</span><span class="p">]</span> <span class="p">}</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/canvas/0/video</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> #### 5.7.11. Clear Operation Clear the canvas and fill the background with the specified color or remove video sources from the canvas. | Parameters op <code><em>string</em></code> Operation identifier <code>clear</code>. source <code><em>string</em></code> Supported sources are <code>:board/sdi-in/:id</code>, <code>:board/hdmi-in/:id</code>, <code>canvas/:id</code> and <code>all</code>. color <code><em>[4]int</em></code> The RGBA background color with transparency. Default <code>[0,0,0,0]</code>. position <code><em>[2]int</em></code> The top left corner position for partial clearing. Default is <code>[0,0]</code>. size <code><em>[2]int</em></code> Area dimensions to clear. If omitted, clears the entire canvas. thickness <code><em>int</em></code> Expand the area to clear by this amount of pixels on all sides. Default <code>0</code>. --- Response Returns the clear operation parameters if the request succeeded. | POST /canvas/:id/op request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/canvas/0/op"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"clear"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/sdi-in/0"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"clear"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/sdi-in/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"thickness"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** ecurl - Clear entire canvas <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/op <span class="nt">-d</span> <span class="nv">op</span><span class="o">=</span>clear <span class="nt">-d</span> <span class="nv">color</span><span class="o">=</span>0,0,0,255</pre> ecurl - Remove specific video source <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/op <span class="nt">-d</span> <span class="nv">op</span><span class="o">=</span>clear <span class="nt">-d</span> <span class="nb">source</span><span class="o">=</span>0/hdmi-in/0</pre> ecurl - Remove all video sources <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/op <span class="nt">-d</span> <span class="nv">op</span><span class="o">=</span>clear <span class="nt">-d</span> <span class="nb">source</span><span class="o">=</span>all</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"op"</span><span class="o">:</span> <span class="s">"clear"</span><span class="p">,</span> <span class="s">"source"</span><span class="o">:</span> <span class="s">"0/sdi-in/0"</span><span class="p">,</span> <span class="p">}</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/op"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"op"</span><span class="p">,</span> <span class="s">"clear"</span><span class="p">},</span> <span class="p">{</span><span class="s">"source"</span><span class="p">,</span> <span class="s">"0/sdi-in/0"</span><span class="p">}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/canvas/0/op"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> #### 5.7.12. Batch Operations Draw operations in batch. | Parameters ops <code><em>[]JSON</em></code> Array of canvas operations. --- Response Returns the operations if succeeded. | POST /canvas/:id/ops request <pre><span class="nv">$ </span>ecurl post cv40:/canvas/0/ops <span class="se">\</span> <span class="nt">-d</span> <span class="nv">ops</span><span class="o">=</span>@draw.json</pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"ops"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="err">...</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| ### 5.8. Client The **client** endpoint retains the connection context, the living memory references and the running workers. Once a **client** is done with a resource, it has to delete it. If the **client** dies or ceases to communicate, the **cv40agent** will automatically collect the resources and clean them. | <code><a href="#client"><strong>client</strong></a></code> | <code><strong>jobs</strong></code> | <code><strong>:id</strong></code> <code><a href="#client_job_get"><kbd>GET</kbd></a></code> | <code><strong>start</strong></code> <code><a href="#client_job_post"><kbd>POST</kbd></a></code> | |---|---|---|---| | <code><strong>stop</strong></code> <code><a href="#client_job_post"><kbd>POST</kbd></a></code> | | <code><strong>pause</strong></code> <code><a href="#client_job_post"><kbd>POST</kbd></a></code> | | <code><strong>refs</strong></code> | <code><strong>:id</strong></code> <code><a href="#client_ref_delete"><kbd>DELETE</kbd></a></code> | | - [<code>GET     /client/jobs/:id</code>](#client_job_get) - [<code>POST    /client/jobs/:id/start</code>](#client_job_post) - [<code>POST    /client/jobs/:id/pause</code>](#client_job_post) - [<code>POST    /client/jobs/:id/stop</code>](#client_job_post) - [<code>DELETE /client/refs/:id</code>](#client_ref_delete) | <code><strong>id</strong></code> Object identifier. | |---|---| #### 5.8.1. Fetch Worker Updates | The long running task(s) (eg: recording a mp4) are child processe(s) of the **client(s)** which have initiated the request(s). These task(s) are processed by worker(s) that are attached into the **client(s)** context(s) with an **unique ID**. Retrieving the updates periodically ensures that the tasks are properly processed and allow to fetch the data out of the **cv40agent**. | GET /client/job/:id Please go to [Section 5.9, “Workers”](#worker) to learn the complete workflow usage. | |---|---| #### 5.8.2. Release Referenced Memory | Clients and **cv40agent** communicate by exchanging references on shared memory blocks. Once processed, it is recommended to expressly release the references, otherwise the **cv40agent** memory pool can run out of shared memory blocks. Depending to your development language (Garbage Collected or not), the SDK wrapper might automatically release the memory for you. | DELETE /client/ref/:id Please go to [Section 5.9, “Workers”](#worker) to learn the complete workflow usage. | |---|---| ### 5.9. Workers All the API processing is based on **Worker objects** created by the server (on behalf of the clients requests) to serve data or metadata packets. The workers creation endpoints are easily recognizable by their URLs patterns: | <code><strong>:url</strong></code> | <code><strong>data</strong></code> <code><a href="#worker_data_post"><kbd>POST</kbd></a></code> | |---|---| | <code><strong>file</strong></code> <code><a href="#worker_file_post"><kbd>POST</kbd></a></code> | | - [<code>POST    /:url/data</code>](#worker_data_post) - [<code>POST    /:url/file</code>](#worker_file_post) | <code><strong>url</strong></code> URL can be any valid API resource that point toward a <code>data</code> or a <code>file</code> endpoint. | |---|---| The workers can serve streams under 3 types: - <code>data</code> the de facto interface to **process data** into a third party application. These kind of workers use the host shared memory mechanisms with pooled buffers to distribute large chunk of data to multiple concurrent consumers. - <code>file</code> this helps you **record files** onto the host hard drive. These workers supports splitting and containerized formats like mp4, asf, or avi. Each time that a file is finished or split, the **completed** field of the Worker object is set to true. The next request will point toward a new file via a redirected URL. Finally, the Workers transfer packets from the LT agent to the LT clients. Packets may contains data, metadata, video, audio, …​ #### 5.9.1. Worker Creation A **type** has to be submitted to the **data** or **file** endpoint to create a worker. The type is a string that describes the data class <code>audio</code>, <code>image</code> and <code>video</code> and the data format. The type is a mandatory field and must be set to a valid value. Audio: <code>audio/pcm</code>, <code>audio/wav</code>, <code>audio/aac</code>. Image: <code>image/yuyv</code>, <code>image/yuv422</code>, <code>image/nv12</code>, <code>image/rgba</code>, <code>image/rgb</code>, <code>image/jpeg</code>, <code>image/png</code>, <code>image/bmp</code>. Video: <code>video/yuyv</code>, <code>video/yuv422</code>, <code>video/nv12</code>, <code>video/rgba</code>, <code>video/rgb</code>, <code>video/jpeg</code>, <code>video/png</code>, <code>video/bmp</code>, <code>video/h264</code>, <code>video/mp4</code>. ##### 5.9.1.1. Audio Data Worker Create a worker object that serves audio data packets. | Parameters media <code><em>string</em></code> Media type identifier. Could be <code>audio/pcm</code> or <code>audio/aac</code>. source <code><em>string</em></code> The audio board input source: <code>:board/hdmi-in/:id</code>, <code>:board/sdi-in/:id</code> and <code>canvas/:id</code>. channels <code><em>int</em></code> The number of audio channels. Default <code>2</code>. samplerate <code><em>int</em></code> The audio sample rate. Default <code>48000</code>. depth <code><em>int</em></code> The audio sample depth. Default <code>16</code>. --- Response Returns the location of the worker object onto the form of a **redirect** error. | POST /:url/data request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/:url/data"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"audio/pcm"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/hdmi-in/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">48000</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** GO <pre><span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">AudioDataWorker</span><span class="p">{</span><span class="n">Media</span><span class="o">:</span> <span class="s">"audio/pcm"</span><span class="p">},</span> <span class="no">nil</span><span class="p">)</span> <span class="k">if</span> <span class="o">!</span><span class="n">errors</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ErrRedirect</span><span class="p">)</span> <span class="p">{</span> <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span> <span class="p">}</span> <span class="n">workerURL</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">AudioDataWorker</span><span class="p">{</span> <span class="s">"audio/pcm"</span> <span class="p">},</span> <span class="nb">nullptr</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">lt</span><span class="o">::</span><span class="n">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ErrRedirect</span><span class="p">))</span> <span class="p">{</span> <span class="n">logFatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span> <span class="o">+</span> <span class="n">err</span><span class="p">);</span> <span class="p">}</span> <span class="n">string</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">);</span></pre> Python <pre><span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/:url/data</span><span class="sh">"</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">media</span><span class="sh">'</span><span class="p">:</span> <span class="sh">"</span><span class="s">audio/pcm</span><span class="sh">"</span><span class="p">})</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">lt</span><span class="p">.</span><span class="nc">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="p">.</span><span class="n">ErrRedirect</span><span class="p">):</span> <span class="nf">exit</span><span class="p">(</span><span class="n">err</span><span class="p">)</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="p">.</span><span class="nc">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> ##### 5.9.1.2. Image Data Worker Create a worker object that serves one image data packet. | Parameters media <code><em>string</em></code> Media type identifier. Could be <code>image/yuyv</code>, <code>image/yuv422</code>, <code>image/nv12</code>, <code>image/rgba</code>, <code>image/rgb</code>, <code>image/jpeg</code>, <code>image/png</code> and <code>image/bmp</code>. source <code><em>string</em></code> The audio board input source: <code>:board/hdmi-in/:id</code>, <code>:board/sdi-in/:id</code> and <code>canvas/:id</code>. size <code><em>[2]int</em></code> The image frame size. Let empty to use the default size. --- Response Returns the location of the worker object onto the form of a **redirect** error. | POST /:url/data request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/:url/data"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/nv12"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/hdmi-in/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** GO <pre><span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ImageDataWorker</span><span class="p">{</span><span class="n">Media</span><span class="o">:</span> <span class="s">"image/jpeg"</span><span class="p">},</span> <span class="no">nil</span><span class="p">)</span> <span class="k">if</span> <span class="o">!</span><span class="n">errors</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ErrRedirect</span><span class="p">)</span> <span class="p">{</span> <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span> <span class="p">}</span> <span class="n">workerURL</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ImageDataWorker</span><span class="p">{</span> <span class="s">"image/jpeg"</span> <span class="p">},</span> <span class="nb">nullptr</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">lt</span><span class="o">::</span><span class="n">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ErrRedirect</span><span class="p">))</span> <span class="p">{</span> <span class="n">logFatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span> <span class="o">+</span> <span class="n">err</span><span class="p">);</span> <span class="p">}</span> <span class="n">string</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">);</span></pre> Python <pre><span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/:url/data</span><span class="sh">"</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">media</span><span class="sh">'</span><span class="p">:</span> <span class="sh">"</span><span class="s">image/jpeg</span><span class="sh">"</span><span class="p">})</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">lt</span><span class="p">.</span><span class="nc">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="p">.</span><span class="n">ErrRedirect</span><span class="p">):</span> <span class="nf">exit</span><span class="p">(</span><span class="n">err</span><span class="p">)</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="p">.</span><span class="nc">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> ##### 5.9.1.3. Video Data Worker Create a worker object that continuously serves video data packets. | Parameters media <code><em>string</em></code> Media type identifier. Could be <code>video/yuyv</code>, <code>video/yuv422</code>, <code>video/nv12</code>, <code>video/rgba</code>, <code>video/rgb</code>, <code>video/jpeg</code>, <code>video/png</code>, <code>video/bmp</code>, <code>video/h264</code>, <code>video/hevc</code> and <code>video/mp4</code>. source <code><em>string</em></code> The audio board input source: <code>:board/hdmi-in/:id</code>, <code>:board/sdi-in/:id</code> and <code>canvas/:id</code>. size <code><em>[2]int</em></code> The image frame size. Let empty to use the default size. framerate <code><em>float</em></code> The video frame rate. Let empty to use the default framerate. --- Response Returns the location of the worker object onto the form of a **redirect** error. | POST /:url/data request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/:url/data"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/nv12"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/hdmi-in/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** GO <pre><span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">VideoDataWorker</span><span class="p">{</span><span class="n">Media</span><span class="o">:</span> <span class="s">"video/nv12"</span><span class="p">},</span> <span class="no">nil</span><span class="p">)</span> <span class="k">if</span> <span class="o">!</span><span class="n">errors</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ErrRedirect</span><span class="p">)</span> <span class="p">{</span> <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span> <span class="p">}</span> <span class="n">workerURL</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">VideoDataWorker</span><span class="p">{</span> <span class="s">"video/nv12"</span> <span class="p">},</span> <span class="nb">nullptr</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">lt</span><span class="o">::</span><span class="n">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ErrRedirect</span><span class="p">))</span> <span class="p">{</span> <span class="n">logFatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span> <span class="o">+</span> <span class="n">err</span><span class="p">);</span> <span class="p">}</span> <span class="n">string</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">);</span></pre> Python <pre><span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/:url/data</span><span class="sh">"</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">media</span><span class="sh">'</span><span class="p">:</span> <span class="sh">"</span><span class="s">video/nv12</span><span class="sh">"</span><span class="p">})</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">lt</span><span class="p">.</span><span class="nc">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="p">.</span><span class="n">ErrRedirect</span><span class="p">):</span> <span class="nf">exit</span><span class="p">(</span><span class="n">err</span><span class="p">)</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="p">.</span><span class="nc">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> ##### 5.9.1.4. Audio File Worker Create a worker object that records an audio file. The file is split when the file length or the file duration is reached. | Parameters media <code><em>string</em></code> Media type identifier. Could be <code>audio/pcm</code>, <code>audio/wav</code> or <code>audio/aac</code>. source <code><em>string</em></code> The audio board input source: <code>:board/hdmi-in/:id</code>, <code>:board/sdi-in/:id</code> and <code>canvas/:id</code>. channels <code><em>int</em></code> The number of audio channels. Default <code>2</code>. samplerate <code><em>int</em></code> The audio sample rate. Default <code>48000</code>. depth <code><em>int</em></code> The audio sample depth. Default <code>16</code>. location <code><em>string</em></code> The file location. duration <code><em>int</em></code> The file duration in milliseconds to record. Default <code>0</code> (infinite). splitSize <code><em>int</em></code> The file split length in bytes. Default <code>0</code> (no split). splitDuration <code><em>int</em></code> The file split duration in milliseconds. Default <code>0</code> (no split). --- Response Returns the location of the worker object onto the form of a **redirect** error. | POST /:url/file request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/:url/file"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"audio/wav"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/hdmi-in/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">48000</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="p">,</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/path/to/audio/directory"</span><span class="p">,</span><span class="w"> </span><span class="nl">"duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"splitSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"splitDuration"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** GO <pre><span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/file"</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">AudioFileWorker</span><span class="p">{</span><span class="n">Media</span><span class="o">:</span> <span class="s">"audio/wav"</span><span class="p">},</span> <span class="no">nil</span><span class="p">)</span> <span class="k">if</span> <span class="o">!</span><span class="n">errors</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ErrRedirect</span><span class="p">)</span> <span class="p">{</span> <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span> <span class="p">}</span> <span class="n">workerURL</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/file"</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">AudioFileWorker</span><span class="p">{</span> <span class="s">"audio/wav"</span> <span class="p">},</span> <span class="nb">nullptr</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">lt</span><span class="o">::</span><span class="n">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ErrRedirect</span><span class="p">))</span> <span class="p">{</span> <span class="n">logFatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span> <span class="o">+</span> <span class="n">err</span><span class="p">);</span> <span class="p">}</span> <span class="n">string</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">);</span></pre> Python <pre><span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/:url/file</span><span class="sh">"</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">media</span><span class="sh">'</span><span class="p">:</span> <span class="sh">"</span><span class="s">audio/wav</span><span class="sh">"</span><span class="p">})</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">lt</span><span class="p">.</span><span class="nc">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="p">.</span><span class="n">ErrRedirect</span><span class="p">):</span> <span class="nf">exit</span><span class="p">(</span><span class="n">err</span><span class="p">)</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="p">.</span><span class="nc">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> ##### 5.9.1.5. Image File Worker Create a worker object that records one image file. | Parameters media <code><em>string</em></code> Media type identifier. Could be <code>image/yuyv</code>, <code>image/yuv422</code>, <code>image/nv12</code>, <code>image/rgba</code>, <code>image/rgb</code>, <code>image/jpeg</code>, <code>image/png</code> and <code>image/bmp</code>. source <code><em>string</em></code> The audio board input source: <code>:board/hdmi-in/:id</code>, <code>:board/sdi-in/:id</code> and <code>canvas/:id</code>. size <code><em>[2]int</em></code> The image frame size. Let empty to use the default size. location <code><em>string</em></code> The file location. --- Response Returns the location of the worker object onto the form of a **redirect** error. | POST /:url/file request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/:url/file"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/nv12"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/hdmi-in/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/path/to/image/directory"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** GO <pre><span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/file"</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ImageFileWorker</span><span class="p">{</span><span class="n">Media</span><span class="o">:</span> <span class="s">"image/jpeg"</span><span class="p">},</span> <span class="no">nil</span><span class="p">)</span> <span class="k">if</span> <span class="o">!</span><span class="n">errors</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ErrRedirect</span><span class="p">)</span> <span class="p">{</span> <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span> <span class="p">}</span> <span class="n">workerURL</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/file"</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ImageFileWorker</span><span class="p">{</span> <span class="s">"image/jpeg"</span> <span class="p">},</span> <span class="nb">nullptr</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">lt</span><span class="o">::</span><span class="n">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ErrRedirect</span><span class="p">))</span> <span class="p">{</span> <span class="n">logFatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span> <span class="o">+</span> <span class="n">err</span><span class="p">);</span> <span class="p">}</span> <span class="n">string</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">);</span></pre> Python <pre><span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/:url/file</span><span class="sh">"</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">media</span><span class="sh">'</span><span class="p">:</span> <span class="sh">"</span><span class="s">image/jpeg</span><span class="sh">"</span><span class="p">})</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">lt</span><span class="p">.</span><span class="nc">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="p">.</span><span class="n">ErrRedirect</span><span class="p">):</span> <span class="nf">exit</span><span class="p">(</span><span class="n">err</span><span class="p">)</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="p">.</span><span class="nc">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> ##### 5.9.1.6. Video File Worker Create a worker object that records a video file. The file is split when the file length or the file duration is reached. | Parameters media <code><em>string</em></code> Media type identifier. Could be <code>video/yuyv</code>, <code>video/yuv422</code>, <code>video/nv12</code>, <code>video/rgba</code>, <code>video/rgb</code>, <code>video/jpeg</code>, <code>video/png</code>, <code>video/h264</code>, <code>video/hevc</code> and <code>video/mp4</code>. source <code><em>string</em></code> The audio board input source: <code>:board/hdmi-in/:id</code>, <code>:board/sdi-in/:id</code> and <code>canvas/:id</code>. size <code><em>[2]int</em></code> The image frame size. Let empty to use the default size. framerate <code><em>float</em></code> The video frame rate. Let empty to use the default framerate. location <code><em>string</em></code> The file location. duration <code><em>int</em></code> The file duration in seconds to record. Default <code>0</code> (infinite). splitSize <code><em>int</em></code> The file split length in bytes. Default <code>0</code> (no split). splitDuration <code><em>int</em></code> The file split duration in seconds. Default <code>0</code> (no split). | POST /:url/file request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/:url/file"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/mp4"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/hdmi-in/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/path/to/video/directory"</span><span class="p">,</span><span class="w"> </span><span class="nl">"duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"splitSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"splitDuration"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="nl">"extra"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"hw"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"bitrate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"quality"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"gop"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"codec"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"preset"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cv40:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Extra <code><em>string</em></code> Video encoder configuration parameters that control the encoding process: - <code>hw</code> - Hardware encoder to use: <code>"qsv"</code> (Intel), <code>"nvenc"</code> (NVIDIA), or <code>"amf"</code> (AMD) - <code>bitrate</code> - Target bitrate in bits per second (e.g., 5000000 for 5 Mbps) - <code>quality</code> - Quality/compression level (19-24, lower values = higher quality) - <code>gop</code> - Group of Pictures - keyframe interval in frames - <code>codec</code> - Video codec to use: <code>"h264"</code> or <code>"hevc"</code> - <code>preset</code> - Preset for the encoder (e.g., <code>"veryfast"</code>, <code>"faster"</code>, <code>"fast"</code>, <code>"medium"</code>, <code>"slow", `"slower"</code>, <code>"veryslow"</code>) \| Note \| Use either <code>bitrate</code> or <code>quality</code> for rate control, but not both simultaneously. Using <code>bitrate</code> creates a constant bitrate encoding, while <code>quality</code> creates variable bitrate encoding with consistent visual quality. \| \|---\|---\| Response Returns the location of the worker object onto the form of a **redirect** error. | |---| | | **Examples** GO <pre><span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/file"</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">VideoFileWorker</span><span class="p">{</span><span class="n">Media</span><span class="o">:</span> <span class="s">"video/mp4"</span><span class="p">},</span> <span class="no">nil</span><span class="p">)</span> <span class="k">if</span> <span class="o">!</span><span class="n">errors</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ErrRedirect</span><span class="p">)</span> <span class="p">{</span> <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span> <span class="p">}</span> <span class="n">workerURL</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"cv40:/:url/file"</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">VideoFileWorker</span><span class="p">{</span> <span class="s">"video/mp4"</span> <span class="p">},</span> <span class="nb">nullptr</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">lt</span><span class="o">::</span><span class="n">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ErrRedirect</span><span class="p">))</span> <span class="p">{</span> <span class="n">logFatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span> <span class="o">+</span> <span class="n">err</span><span class="p">);</span> <span class="p">}</span> <span class="n">string</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">);</span></pre> Python <pre><span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">cv40:/:url/file</span><span class="sh">"</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">media</span><span class="sh">'</span><span class="p">:</span> <span class="sh">"</span><span class="s">video/mp4</span><span class="sh">"</span><span class="p">})</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">lt</span><span class="p">.</span><span class="nc">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="p">.</span><span class="n">ErrRedirect</span><span class="p">):</span> <span class="nf">exit</span><span class="p">(</span><span class="n">err</span><span class="p">)</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="p">.</span><span class="nc">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> #### 5.9.2. Worker Object The Worker object is the result of a GET request onto a worker endpoint. It contains the worker status, data packets and metadata. A Worker might process one or multiples tracks and the SDK provides helpers functions to automatically parse the worker into a comprehensive structure with the contained audio and video packets. | name <code><em>string</em></code> Name. location <code><em>string</em></code> Location. start <code><em>int64</em></code> Unix timestamp at which the worker started. duration <code><em>int64</em></code> Elapsed time since the worker started. size <code><em>int</em></code> Quantity of byte processed since the segment started. status <code><em>string</em></code> <code>running</code>, <code>paused</code>, <code>break</code> (file split) or <code>completed</code>. packets <code><em>map[int]packet</em></code> Packets maps [packet](#packet_object) or [shared packet](#shared_packet_object) of video, audio or text data samples and/or metadata samples. | Worker object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"start"</span><span class="p">:</span><span class="w"> </span><span class="mi">1644248369455566</span><span class="p">,</span><span class="w"> </span><span class="nl">"duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">16667</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="mi">4147200</span><span class="p">,</span><span class="w"> </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"completed"</span><span class="p">,</span><span class="w"> </span><span class="nl">"packets"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"0"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"... packet object #0 ..."</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.9.3. Packet Object The packet object wraps the data and the metadata of an audio, video, …​ track. The SDK provides a helper function to automatically parse the packets into a comprehensive structure. | track <code><em>int</em></code> The track ID of the packet if the worker process multiple tracks. type <code><em>string</em></code> The packet type and format. signal <code><em>string</em></code> <code>none</code> (not found), or <code>locked</code> (ready to use). timestamp <code><em>int64</em></code> Unix timestamp at which the packet has been sampled. data <code><em>[]byte</em></code> The packet plain data buffer. meta <code><em>JSON</em></code> The metadata fields for audio and video. See audio and video metadata objects. | Packet object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"track"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"audio/pcm"</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">1695816377020822</span><span class="p">,</span><span class="w"> </span><span class="nl">"data"</span><span class="p">:</span><span class="w"> </span><span class="s2">"..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"meta"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">48000</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="p">,</span><span class="w"> </span><span class="nl">"samples"</span><span class="p">:</span><span class="w"> </span><span class="mi">1600</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| ##### 5.9.3.1. SharedPacket Object This has the same description as the [Packet object](#packet_object), use only for reference. To lower the cpu consumption and the latency, big data blocks are transmitted to the user using the OS standard shared memory mechanisms. No memory copy is involved in the packet transmission. The SDK provides a helper function to automatically parse the shared packets into a comprehensive structure. | track <code><em>int</em></code> The track ID of the packet if the worker process multiple tracks. type <code><em>string</em></code> The packet type and format. signal <code><em>string</em></code> <code>none</code> (not found), or <code>locked</code> (ready to use). timestamp <code><em>int64</em></code> Unix timestamp at which the packet has been sampled. meta <code><em>JSON</em></code> The packet metadata fields for video, audio, …​ ref <code><em>string</em></code> The shared memory reference to be deleted once the data has been used. client <code><em>string</em></code> The client id which has made the request. handle <code><em>string</em></code> The handle that allows to access the shared memory. size <code><em>int</em></code> The shared memory block total capacity. ptr <code><em>int</em></code> The pointer at which the shared buffer start inside the shared memory block. len <code><em>int</em></code> The shared buffer length inside the shared memory block. | SharedPacket object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"track"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/yuyv"</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"locked"</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">1695815814430318</span><span class="p">,</span><span class="w"> </span><span class="nl">"len"</span><span class="p">:</span><span class="w"> </span><span class="mi">16588800</span><span class="p">,</span><span class="w"> </span><span class="nl">"meta"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"keyframe"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"{lt}:/client/ref/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"client"</span><span class="p">:</span><span class="w"> </span><span class="s2">"q5jrzd2OIQuxCq1IJWICuA"</span><span class="p">,</span><span class="w"> </span><span class="nl">"handle"</span><span class="p">:</span><span class="w"> </span><span class="s2">"{lt}_global_24"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="mi">1275592704</span><span class="p">,</span><span class="w"> </span><span class="nl">"ptr"</span><span class="p">:</span><span class="w"> </span><span class="mi">478347264</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| ##### 5.9.3.2. Audio Metadata Packets with <code>audio/*</code> type. | channels <code><em>int</em></code> The number of channels. samplerate <code><em>int</em></code> The number of samples per second. depth <code><em>int</em></code> The number of bits per sample. Samples <code><em>int</em></code> The number of samples contained into the buffer. | Audio metadata <pre><span class="p">{</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">48000</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="p">,</span><span class="w"> </span><span class="nl">"samples"</span><span class="p">:</span><span class="w"> </span><span class="mi">800</span><span class="p">,</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| ##### 5.9.3.3. Image Metadata Packets with <code>image/*</code> type. | size <code><em>[2]int</em></code> The image frame size. | Image metadata <pre><span class="p">{</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| ##### 5.9.3.4. Video Metadata Packets with <code>video/*</code> type. | size <code><em>[2]int</em></code> The video frame size. framerate <code><em>float</em></code> The number of video frame per second. interlaced <code><em>bool</em></code> Is the frame interlaced. keyframe <code><em>bool</em></code> Is the frame intra coded. | Video metadata <pre><span class="p">{</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">60</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"keyframe"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.9.4. Data Worker Workflow Create a worker object that serves data packets. Data packets could be of type [audio](#worker_audio_data), [image](#worker_image_data) or [video](#worker_video_data). | Create Worker <code>> POST cv40:/canvas/0/yuyv/data</code> - A worker is created. - Check non-null error. - Retrieve worker location with 'redirect' URL. <code>> GET workerURL</code> - JSON Worker object is returned. - Check non-null error. <code>> Check EndOfStream signal</code> - Exit or pass to the next step. <code>> Process Worker</code> - See [data worker processing](#worker_data_process) below. - Continue the worker loop until the EndOfStream signal is met. | | |---|---| | <code>> Monitor the Worker progress</code> - Start, duration, total processed bytes <code>> Loop over the Worker Packets</code> - Grab one packet. - Check the packet track ID. - Check the packet track signal. <code>> Process the Packet</code> - Check the media type field. - Parse and load the metadata. - Use the data. <code>> Release the Packet</code> - Call the packet.Close() function. - Shared memory reference is released. - Check non-null error. | | |---|---| #### 5.9.5. File Worker Workflow Create a worker object that records a file. The file is split when the file length or the file duration is reached. Files could be of type [audio](#worker_audio_file), [image](#worker_image_file) or [video](#worker_video_file). | Create file worker <code>> POST cv40:/canvas/0/png/file</code> - A worker is created. - Check non-null error. <code>> GET worker</code> - JSON Worker object is returned. - Check non-null error. <code>> Check EndOfStream signal</code> - Exit or pass to the next step. <code>> Process Worker</code> - See process Worker [workflow](#worker_file_process) above. - Continue the worker loop | | |---|---| | Process file worker <code>> GET cv40:/canvas/0/png/file</code> - JSON Worker object is returned. - Check non-null error. <code>> Monitor the Worker progress</code> - Name, location - Start, duration, total processed bytes, completed <code>> Loop over the Worker Packets</code> - Grab one packet. - Check the packet track ID. - Check the packet track signal. <code>> Process the Packet</code> - Check the media type field. - Parse and load the metadata. <code>> Release the Packet</code> - Call the packet.Close() function. - Check non-null error. | | |---|---| ## 6. Cheatsheet | <code><strong><a href="#agent">/</a></strong></code> <code><a href="#agent_get"><kbd>GET</kbd></a></code> | |---| | <code><a href="#board"><strong>:board</strong></a></code> <code><a href="#board_get"><kbd>GET</kbd></a></code> | <code><a href="#board_button_object"><strong>buttons</strong></a></code> <code><a href="#board_buttons_get"><kbd>GET</kbd></a></code> | <code><strong>:pin</strong></code> <code><a href="#board_button_get"><kbd>GET</kbd></a></code> | |---|---|---| | <code><a href="#board"><strong>:board</strong></a></code> <code><a href="#board_get"><kbd>GET</kbd></a></code> | <code><a href="#camera_object"><strong>camera</strong></a></code> | <code><strong>:id</strong></code> <code><a href="#camera_get"><kbd>GET</kbd></a></code> | <code><a href="#worker"><strong>data</strong></a></code> <code><a href="#worker_data_post"><kbd>POST</kbd></a></code> | |---|---|---|---| | <code><a href="#worker"><strong>file</strong></a></code> <code><a href="#worker_file_post"><kbd>POST</kbd></a></code> | | <code><a href="#worker"><strong>net</strong></a></code> <code><a href="#worker_net_post"><kbd>POST</kbd></a></code> | | <code><a href="#camera_white_object"><strong>white</strong></a></code> <code><a href="#camera_white_get"><kbd>GET</kbd></a> <a href="#camera_white_post"><kbd>POST</kbd></a></code> | | <code><a href="#camera_colors_object"><strong>colors</strong></a></code> <code><a href="#camera_colors_get"><kbd>GET</kbd></a> <a href="#camera_colors_post"><kbd>POST</kbd></a></code> | | <code><a href="#camera_exposure_object"><strong>exposure</strong></a></code> <code><a href="#camera_exposure_get"><kbd>GET</kbd></a> <a href="#camera_exposure_post"><kbd>POST</kbd></a></code> | | <code><a href="#camera_visuals_object"><strong>visuals</strong></a></code> <code><a href="#camera_visuals_get"><kbd>GET</kbd></a> <a href="#camera_visuals_post"><kbd>POST</kbd></a></code> | | <code><a href="#camera_button_object"><strong>buttons</strong></a></code> <code><a href="#camera_buttons_get"><kbd>GET</kbd></a></code> | <code><strong>:pin</strong></code> <code><a href="#camera_button_get"><kbd>GET</kbd></a></code> | | <code><a href="#board"><strong>:board</strong></a></code> <code><a href="#board_get"><kbd>GET</kbd></a></code> | <code><a href="#hdmi_out"><strong>hdmi-out</strong></a></code> | <code><strong>:id</strong></code> <code><a href="#hdmi_out_get"><kbd>GET</kbd></a><a href="#hdmi_out_post"><kbd>POST</kbd></a></code> | |---|---|---| | <code><a href="#board"><strong>:board</strong></a></code> <code><a href="#board_get"><kbd>GET</kbd></a></code> | <code><a href="#sdi_out"><strong>sdi-out</strong></a></code> | <code><strong>:id</strong></code> <code><a href="#sdi_out_get"><kbd>GET</kbd></a> <a href="#sdi_out_post"><kbd>POST</kbd></a></code> | |---|---|---| | <code><a href="#canvas"><strong>canvas</strong></a></code> | <code><strong>:id</strong></code> <code><a href="#canvas_get"><kbd>GET</kbd></a><a href="#canvas_delete"><kbd>DELETE</kbd></a></code> | <code><a href="#worker"><strong>data</strong></a></code> <code><a href="#worker_data_post"><kbd>POST</kbd></a></code> | |---|---|---| | <code><a href="#worker"><strong>file</strong></a></code> <code><a href="#worker_file_post"><kbd>POST</kbd></a></code> | | <code><a href="#canvas"><strong>canvas</strong></a></code> | <code><strong>:id</strong></code> <code><a href="#canvas_get"><kbd>GET</kbd></a></code> | <code><a href="#canvas_init"><strong>init</strong></a></code> <code><a href="#canvas_init"><kbd>POST</kbd></a></code> | |---|---|---| | <code><a href="#canvas_text"><strong>text</strong></a></code> <code><a href="#canvas_text"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_line"><strong>line</strong></a></code> <code><a href="#canvas_line"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_ellipse"><strong>ellipse</strong></a></code> <code><a href="#canvas_ellipse"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_rectangle"><strong>rectangle</strong></a></code> <code><a href="#canvas_rectangle"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_image"><strong>image</strong></a></code> <code><a href="#canvas_image"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_video"><strong>video</strong></a></code> <code><a href="#canvas_video"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_clear"><strong>clear</strong></a></code> <code><a href="#canvas_clear"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_op"><strong>op</strong></a></code> <code><a href="#canvas_op"><kbd>POST</kbd></a></code> | | <code><a href="#canvas_ops"><strong>ops</strong></a></code> <code><a href="#canvas_ops"><kbd>POST</kbd></a></code> | | <code><a href="#client"><strong>client</strong></a></code> | <code><strong>jobs</strong></code> | <code><strong>:id</strong></code> <code><a href="#client_job_get"><kbd>GET</kbd></a></code> | <code><strong>start</strong></code> <code><a href="#client_job_post"><kbd>POST</kbd></a></code> | |---|---|---|---| | <code><strong>stop</strong></code> <code><a href="#client_job_post"><kbd>POST</kbd></a></code> | | <code><strong>pause</strong></code> <code><a href="#client_job_post"><kbd>POST</kbd></a></code> | | <code><strong>refs</strong></code> | <code><strong>:id</strong></code> <code><a href="#client_ref_delete"><kbd>DELETE</kbd></a></code> | ## 7. Changelog <pre><span class="gh"># 1.3.3 (17/09/2025):</span> <span class="p">-</span> Fix get camera button with CV40Q <span class="p">-</span> Add get camera temperature <span class="gh"># 1.3.2 (11/09/2025):</span> <span class="p">-</span> Remove serial/uart client from sdk <span class="p">-</span> Fix zoom problem (now boards can work properly without PCIe) <span class="p">-</span> Minor fixes <span class="gh"># 1.3.1 (31/07/2025):</span> <span class="p">-</span> Fix serial/uart client <span class="p">-</span> Fix downscaling <span class="gh"># 1.3.0 (21/07/2025):</span> <span class="p">-</span> Add agent configuration file <span class="p">-</span> Add NV12 native support <span class="p">-</span> Add independent RGB gain <span class="p">-</span> Add video encoder parameters (hardware accelerators, codecs, ...) <span class="p">-</span> Add dead pixels correction <span class="p">-</span> Improve overlay performance <span class="p">-</span> Improve agent reliability <span class="p">-</span> Improve programmation reliability <span class="p">-</span> Improve Linux support <span class="p">-</span> Update sdk <span class="p">-</span> Remove Windows 7 & 8 support <span class="p">-</span> Minor fixes <span class="gh"># 1.2.1 (11/02/2025):</span> <span class="p">-</span> Improve player colorimetry <span class="p">-</span> Minor fixes <span class="gh"># 1.2.0 (22/01/2025):</span> <span class="p">-</span> Add low light boost <span class="p">-</span> Add shadow lighting <span class="p">-</span> Add OSD feature into server <span class="p">-</span> Add overlay scaling option <span class="p">-</span> Improve DirectShow filters <span class="p">-</span> Update sdk <span class="p">-</span> Minor fixes <span class="gh"># 1.1.0 (22/08/2024):</span> <span class="p">-</span> Add OSD feature (only works with UART interface) <span class="gh"># 1.0.0 (19/07/2024):</span> <span class="p">-</span> First official release</pre> Version 1.3.3 --- ### [LT-310 API](https://www.enciris.com/lt-310-api-the-programmer-guide/) **Published:** January 27, 2026 **Author:** Luke Montgomery **Content:** LT310 API: The programmer guide # LT310 API: The programmer guide Enciris Technologies version 1.4.0, 28/11/2025 Table of Contents - [1. Introduction](#_introduction) - [2. Installation](#_installation) - [2.1. Windows](#_windows) - [2.2. Linux](#_linux) - [2.3. SDK](#_sdk) - [2.4. Tools](#_tools) - [2.5. lt310agent Controls](#_lt310agent_controls) - [2.6. Board Firmware](#_board_firmware) - [3. ecurl (CLI)](#_ecurl_cli) - [3.1. GET command](#_get_command) - [3.2. POST command](#_post_command) - [3.3. DELETE Command](#_delete_command) - [3.4. PLAY Command](#_play_command) - [3.5. REC Command](#_rec_command) - [4. ecap (GUI)](#ecap) - [5. API Description](#api) - [5.1. Endpoint Structure](#_endpoint_structure) - [5.2. Request and Response Format](#_request_and_response_format) - [5.2.1. Retrieve parameters (GET)](#_retrieve_parameters_get) - [5.2.2. Update parameters (POST)](#_update_parameters_post) - [5.2.3. Error Handling](#_error_handling) - [5.3. Audio/Video structures](#_audiovideo_structures) - [5.3.1. Audio object](#structure_audio) - [5.3.2. Video object](#structure_video) - [5.4. Agent](#_agent) - [5.4.1. Agent Object](#_agent_object) - [5.4.2. Agent Configuration File](#_agent_configuration_file) - [5.5. Board](#_board) - [5.5.1. Board Object](#_board_object) - [5.6. HDMI Input](#_hdmi_input) - [5.6.1. HDMI Input Object](#_hdmi_input_object) - [5.6.2. EDID Object](#_edid_object) - [5.7. SDI Input](#_sdi_input) - [5.7.1. SDI Input Object](#_sdi_input_object) - [5.8. HDMI Output](#_hdmi_output) - [5.8.1. HDMI Output Object](#_hdmi_output_object) - [5.9. Canvas](#_canvas) - [5.9.1. Canvas Object](#_canvas_object) - [5.9.2. Understanding Canvas Operations](#_understanding_canvas_operations) - [5.9.3. Initialize Canvas](#_initialize_canvas) - [5.9.4. Drawing Operations](#_drawing_operations) - [5.9.5. Clear Operation](#_clear_operation) - [5.9.6. Single Operation Endpoint](#_single_operation_endpoint) - [5.9.7. Batch Operations Endpoint](#_batch_operations_endpoint) - [5.9.8. Examples](#_examples) - [5.10. Workers](#worker_full) - [5.10.1. Worker Creation](#_worker_creation) - [5.10.2. Worker Object](#_worker_object) - [5.10.3. Packet and SharedPacket Objects](#_packet_and_sharedpacket_objects) - [5.10.4. Worker lifecycle](#_worker_lifecycle) - [5.10.5. Example 1: fetching audio data with a data worker](#_example_1_fetching_audio_data_with_a_data_worker) - [5.10.6. Example 2: recording a video stream with a file worker](#_example_2_recording_a_video_stream_with_a_file_worker) - [6. Cheatsheet](#_cheatsheet) - [7. Changelog](#_changelog) ## 1. Introduction The **LT API** is built around the [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) architecture (Representational State Transfer). REST defines a structured approach for exposing system functionalities via a consistent interface. A REST API is typically accessed using predefined URLs, which represent various resources returned as JSON objects. These resources support standard methods such as GET, POST, and DELETE. The **LT API** requests are processed by a host service called **lt310agent**, which utilizes standard OS mechanisms such as IPC, SG-DMA, and shared memory. This ensures minimal latency when handling API requests. To optimize performance, video and audio data are shared among consumers using memory segments, allowing large data buffers and concurrent access. With **LT boards** designed to be seen as *hardware-as-a-service* approach, the **LT API** abstracts hardware-specific implementations behind a unified API. This allows users to focus on core functionalities such as capturing, playing, recording, and streaming audio/video data. The **LT API** is accessible through various clients, including the **ecurl** command line interface (CLI) and the **ecap** graphical user interface (GUI). The API can also be accessed directly through C++, Python, DirectShow, V4L2, NamedPipe, and UART. ## 2. Installation ### 2.1. Windows Download and run the latest **lt310install\_x.x.x.exe** to install the **lt310 family** drivers, tools and services. If necessary the previous version will be uninstalled. Once installed, the **lt310agent** service will be started automatically and will be (re)started automatically with each system (re)boot. The **lt310agent** can be controlled using the Windows Services Manager or the command line. For more details, see [\[control\_service\]](#control_service). The **LT boards** plugged into the host should appear in the Windows Device Manager under the **Sound, video and game controllers**. Directshow All the boards inputs are accessible through directshow filters, and then are available in any directshow compatible application. The directshow filters are managed by the **lt310agent** service, so you can use them only if the service is running. | Note | To uninstall the **lt310 family** drivers, tools and services, run the installer and choose "Remove" or use "Apps & features" menu. | |---|---| ### 2.2. Linux Download and extract the latest **lt310install\_x.x.x.tar.gz**, then run the **lt310install.sh** script to install the **lt310 family** drivers, tools and services. If necessary, the previous version will be uninstalled. Upon successful installation, the **lt310agent** daemon will start automatically and will also (re)started with each system (re)boot. If the installation fails, contact us and check the **lt310install.log** file for details. The **lt310agent** can be controlled using the command line. For more details, see [\[control\_service\]](#control_service). V4L2 All the boards inputs are accessible through V4L2 drivers, and then are available in any V4L2/GStreamer compatible application. The V4L2 drivers are managed by the **lt310agent** service, so you can use them only if the service is running. | Note | To uninstall the **lt310 family** drivers, tools and services, run lt310\_uninstall.sh from the installation directory. | |---|---| ### 2.3. SDK Download the latest **lt310sdk\_x.x.x.zip** or **lt310sdk\_x.x.x.tar.gz** archive and extract it anywhere you want. The SDK contains the API documentation, the API libraries and examples for the following languages **Go**, **C++** and **Python**. Please navigate through the examples to learn how to program the API. You can also create scripts using the **ecurl** command-line tool. For more details, see [\[ecurl\]](#ecurl). ### 2.4. Tools Two tools are installed along with the **lt310agent** service: - **[ecurl](#ecurl)** - a command-line tool to send REST API requests to the **lt310agent**. - **[ecap](#ecap)** - a graphical user interface to control and/or test LT boards. By default, the service and tools are added to the **PATH** environment variable, allowing you to use them from any command line. ### 2.5. lt310agent Controls To access the **LT API**, ensure that the **lt310agent** is installed and running on your host system. You can use the following commands, which require administrative privileges, to control the **lt310agent**. Start the lt310agent <pre><span class="nv">$ </span>lt310agent start</pre> Stop the lt310agent <pre><span class="nv">$ </span>lt310agent stop</pre> Check the lt310agent and boards firmware version <pre><span class="nv">$ </span>lt310agent version</pre> Check the lt310agent status <pre><span class="nv">$ </span>lt310agent status</pre> ### 2.6. Board Firmware If the boards installed in the host require a firmware update, the **lt310agent** service will automatically update them when the service starts. This process may take up to 2 minutes, depending on the board type. The service will be unavailable until the update is completed. Please use the command below if you want to check the firmware version of the boards. Check the lt310agent and boards firmware version <pre><span class="nv">$ </span>lt310agent version</pre> It is also possible to manually update the board firmware. Update the boards firmware <pre><span class="nv">$ </span>lt310agent update</pre> | Note | To update the board firmware, the **lt310agent** must be stopped. | |---|---| ## 3. ecurl (CLI) The **ecurl** program is a developer tool to help you make requests on the **LT API** directly from your terminal. The tool is deployed along with the **lt310agent** at the installation stage. The tool has been developed with our SDK and is available for both Linux and Windows platforms. You can use the **ecurl** CLI to: - Create, retrieve, update or delete **LT API** objects. - Play and record any video or audio resources. - Use the multi-channel feature of the **LT boards**. - Control and test the installed **LT boards**. | Note | The **lt310agent** must be running otherwise **ecurl** will not work. | |---|---| ### 3.1. GET command <pre><span class="nv">$ </span>ecurl get <url></pre> Send a GET request to retrieve a specific API object identified by the **<url>**. **Examples**Retrieve information about the lt310 family agent <pre><span class="nv">$ </span>ecurl get lt310:/</pre> Retrieve informaton from lt310 board located at index 0 <pre><span class="nv">$ </span>ecurl get lt310:/0</pre> Make a JPEG capture <pre><span class="nv">$ </span>ecurl get lt310:/0/<span class="o">{</span><span class="k">in</span><span class="o">}</span>/0/file <span class="nt">-d</span> <span class="nb">type</span><span class="o">=</span>image/jpeg</pre> ### 3.2. POST command <pre><span class="nv">$ </span>ecurl post <url> <span class="o">[</span><span class="nt">-d</span> @file.json] <span class="o">[</span><span class="nt">-d</span> <span class="nv">field</span><span class="o">=</span>value] <span class="o">[</span><span class="nt">-d</span> <span class="nv">data</span><span class="o">=</span>@file.bin]</pre> Create or modify the resource designated by the **<url>**. Arguments may be added to the request with the **-d** optional flags. It is possible to use a file content as input by preceding the filename with the **@** character. By preceding the filename with the **$** charater, relative path will be translated to the absolute full path. **Examples**Create a virtual video input from a mp4 file <pre><span class="nv">$ </span>ecurl post lt310:/canvas/0/init <span class="nt">-d</span> <span class="nb">source</span><span class="o">=</span><span class="nv">$video</span>.mp4</pre> Load a custom HDMI-IN Edid <pre><span class="nv">$ </span>ecurl post lt310:/0/hdmi-in/0/edid <span class="nt">-d</span> <span class="nv">data</span><span class="o">=</span>@custom.edid</pre> ### 3.3. DELETE Command <pre><span class="nv">$ </span>ecurl delete <url></pre> Delete or reset the resource pointed by the **<url>**. **Examples**Unplug virtual video input <pre><span class="nv">$ </span>ecurl delete lt310:/canvas/0</pre> ### 3.4. PLAY Command <pre><span class="nv">$ </span>ecurl play <url> <span class="o">[</span><span class="nt">-d</span><span class="o">]</span></pre> Play video or audio source until Ctrl+c is pressed. Arguments may be added to the request with the **-d** optional flags. **Examples**Live display of hdmi-in video <pre><span class="nv">$ </span>ecurl play lt310:/0/hdmi-in/0 <span class="nt">-d</span> <span class="nv">media</span><span class="o">=</span>video/yuyv</pre> Live listening of hdmi-in audio <pre><span class="nv">$ </span>ecurl play lt310:/0/hdmi-in/0 <span class="nt">-d</span> <span class="nv">media</span><span class="o">=</span>audio/pcm</pre> ### 3.5. REC Command <pre><span class="nv">$ </span>ecurl rec <url> <span class="o">[</span><span class="nt">-d</span><span class="o">]</span></pre> Record video or audio source until Ctrl+c is pressed. Arguments may be added to the request with the **-d** optional flags. **Examples**Record hdmi-in video into a mp4 file <pre><span class="nv">$ </span>ecurl rec lt310:/0/hdmi-in/0/file <span class="nt">-d</span> <span class="nv">media</span><span class="o">=</span>video/mp4</pre> Record camera video using NVENC hardware encoder and hevc codec <pre><span class="nv">$ </span>ecurl rec lt310:/0/camera/0 <span class="nt">-d</span> <span class="nv">media</span><span class="o">=</span>video/mp4 <span class="nt">-d</span> extra.hw<span class="o">=</span>nvenc <span class="nt">-d</span> extra.codec<span class="o">=</span>hevc</pre> ## 4. ecap (GUI) | The **ecap** program is a simple graphical user interface designed to capture and record using the **LT310 boards**. The tool has been developed with our SDK and is available for both Linux and Windows platforms. You can use the **ecap** GUI to: - Play and record any video or audio content. - Use the multi-channel features of the **LT boards**. - Control and test the installed **LT boards**. | | |---|---| | Note | The **lt310agent** must be running; otherwise, **ecap** will not work. | |---|---| ## 5. API Description ### 5.1. Endpoint Structure An API endpoint is a URL where the API processes requests for a specific resource. Endpoints are accessed via [URLs](https://en.wikipedia.org/wiki/URL) using the syntax <code>scheme:/path</code>, which consists of: - A non-empty scheme component followed by a colon <code>lt310:</code> - A path component made up of path segments separated by slashes <code>/</code> For clarity in this documentation, the **scheme <code>lt310:</code> is omitted** from endpoint URLs. ### 5.2. Request and Response Format All API endpoints use JSON format for requests and responses. Endpoints are divided into two categories: - **Read-write endpoints**: Support both GET and POST methods to retrieve and modify parameters - **Read-only endpoints**: Support only GET method to retrieve current state #### 5.2.1. Retrieve parameters (GET) | To retrieve parameters, send a GET request to the appropriate endpoint. The server returns the complete object with all current parameter values. | Example: GET request request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/0/endpoint"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"parameter1"</span><span class="p">:</span><span class="w"> </span><span class="s2">"value1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"parameter2"</span><span class="p">:</span><span class="w"> </span><span class="mi">42</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.2.2. Update parameters (POST) | To update parameters, send a POST request with the attributes you want to modify. You don’t have to send the complete object. The server will: - Validate the new values - Apply the requested changes - Return the complete object with all current values (including unchanged ones) | Example: POST request request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/0/endpoint"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"parameter1"</span><span class="p">:</span><span class="w"> </span><span class="s2">"newValue"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"parameter1"</span><span class="p">:</span><span class="w"> </span><span class="s2">"newValue"</span><span class="p">,</span><span class="w"> </span><span class="nl">"parameter2"</span><span class="p">:</span><span class="w"> </span><span class="mi">42</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Note | Specific examples with actual endpoints and parameters are provided in each endpoint’s documentation section. | |---|---| #### 5.2.3. Error Handling If a request fails, the server returns an error response with an explicit message describing the cause of the failure. Common error causes include: - Invalid parameter values (out of range) - Missing required parameters - Invalid endpoint or resource ID - Hardware not responding Example error response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"invalid parameter value"</span><span class="p">,</span><span class="w"> </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"parameter must be between 0 and 100, got 150"</span><span class="p">,</span><span class="w"> </span><span class="nl">"code"</span><span class="p">:</span><span class="w"> </span><span class="mi">400</span><span class="w"> </span><span class="p">}</span></pre> ### 5.3. Audio/Video structures This section describes the JSON data structures used to represent [audio](#structure_audio) and [video](#structure_video) stream information. These structures are embedded in various endpoints related to audio/video sources and outputs. #### 5.3.1. Audio object | The <code>audio</code> structure contains detailed information about an audio stream. | **Audio object** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | description | string | A short description of the audio signal. | | format | string | The audio sample format <code>pcm</code>. | | channels | int | The number of audio channels. | | samplerate | int | The number of audio samples per second. | | depth | int | The number of bits per audio sample. | | signal | string | The audio signal status: `none` (not found), or `locked` (ready to use). | #### 5.3.2. Video object | The <code>video</code> structure contains detailed information about a video stream. | **Video object** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | description | string | A short description of the video signal. | | format | string | The pixel color format <code>rgb444</code>, <code>yuv444</code> or <code>yuv422</code>. | | size | \[2\]int | The video frame width and height in pixel units. | | framerate | float | The number of video frames per second. | | interlaced | bool | The video frame interlaced status. | | signal | string | The video signal status: `none` (not found), or `locked` (ready to use). | ### 5.4. Agent The **agent** endpoint allows to retrieve the **lt310agent** software version. | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/**](#agent) | GET | Retrieve the current agent information. | #### 5.4.1. Agent Object | The **agent** object provides information about the currently running **lt310agent** software. | GET **lt310:/** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.4.0"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | version | string | The current agent version. | #### 5.4.2. Agent Configuration File The agent can be configured using an optional configuration file named <code>lt310agent.cfg</code>. Configuration options: | Option | Description | |---|---| | <code>WD</code> | Working directory for the agent (default: current working directory) | | <code>numCanvases</code> | Number of canvas objects to create (default: 4) | | <code>defaultPixelFormat</code> | Default pixel format for video input (default: nv12) | | <code>noVideoSignal</code> | Settings for when no video signal is detected (default: gray background with "NO SIGNAL" text) | | <code>dshowFilters</code> | Enable/disable DirectShow filters (default: true) | | <code>v4l2Filters</code> | Enable/disable V4l2 filters (default: false) | | <code>devMode</code> | Enable/disable development mode (default: false) | If you choose to use it, place the file in the same directory as the application executable. This file is already included in the agent folder. The configuration file is optional and may be omitted if no custom configuration is required. | Note | The configuration file is read only when the agent starts. Any changes to the file will take effect only after restarting the agent. | |---|---| ### 5.5. Board The **board** endpoint provides access to information about boards installed in the host system. | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/:board**](#board_object) | GET | Retrieve information about the board installed in the host system. | **URL parameters** - <code><strong>:board</strong></code> Device position into the host <code>[0 .. 1]</code>. #### 5.5.1. Board Object | The **board** object provides information about a specific board installed in the host system. | Board object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"model"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"lt311"</span><span class="p">,</span><span class="w"> </span><span class="nl">"sn"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">71000012</span><span class="p">,</span><span class="w"> </span><span class="nl">"cpu"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"fpga"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"bridge"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | model | string | Board model identifier. Could be <code>lt311</code>, <code>lt312`</code>, <code>lt313</code>. If the board model is not recognized, the value is left empty. | | sn | uint32 | Board serial number. | | cpu | uint32 | Embedded processing cpu tagged time. | | fpga | uint32 | Processing fpga tagged time. | | bridge | uint32 | Bridge fpga tagged time. | ### 5.6. HDMI Input This endpoint allows you to monitor the **hdmi-in** signal status and access the audio and video streams, when available, in various formats. Data can be retrieved as raw data or files, in different formats and encodings. Native formats are <code>yuyv</code> or <code>nv12</code> (video) and <code>pcm</code> (audio). Depending on the requested format, the host CPU and/or GPU may be used for processing and conversion. | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/:board/hdmi-in/:id**](#hdmi-in_object) | GET | Retrieve the current HDMI Input information. | | [**/:board/hdmi-in/:id/data**](#worker_full) | POST | Retrieve raw data from the HDMI Input. | | [**/:board/hdmi-in/:id/file**](#worker_full) | POST | Retrieve a file from the HDMI Input. | | [**/:board/hdmi-in/:id/edid**](#edid_object) | GET, POST | Retrieve or set the EDID data for the HDMI Input. | **URL parameters** - <code><strong>:board</strong></code> Device position into the host <code>[0 .. 1]</code>. - <code><strong>:id</strong></code> hdmi-in index, dependent on the board type: <code>not applicable</code> for LT311, <code>[0 .. 1]</code> for LT312, <code>0</code> for LT313. #### 5.6.1. HDMI Input Object | The **hdmi-in** object contains the current state of its audio and video signals. | GET **/:board/hdmi-in/:id** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | audio | object | [Audio object](#structure_audio) for the HDMI Input. | | video | object | [Video object](#structure_video) for the HDMI Input. | #### 5.6.2. EDID Object | The **edid** object provides the Extended Display Identification Data (EDID) which describe capabilities for a specific hdmi-in. A default EDID is provided, it supports standard resolutions up to 4K 60Hz and audio format 2 channels PCM 48kHz. The EDID can be customized by the user, but make sure it matches the board capabilities. | GET, POST **/:board/hdmi-in/:id/edid** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"data"</span><span class="p">:</span><span class="w"> </span><span class="s2">" ... 256-byte ... "</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | data | \[256\]byte | The 256-byte E-EDID data. | **POST Example**These code examples demonstrate how to set custom EDID data for the HDMI Input. ecurlTo set a custom EDID using **ecurl**, the custom EDID file must be provided using the <code>data=@filename</code> syntax: <pre><span class="nv">$ </span>ecurl post lt310:/0/hdmi-in/0/edid <span class="nt">-d</span> <span class="nv">data</span><span class="o">=</span>@customEdid.bin</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"data"</span><span class="o">:</span> <span class="s">"00FFFFFFFFFF00..."</span> <span class="c">// 256-byte EDID data</span> <span class="p">}</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/0/hdmi-in/0/edid"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"data"</span><span class="p">,</span> <span class="s">"00FFFFFFFFFF00..."</span><span class="p">}</span> <span class="c1">// 256-byte EDID data</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/hdmi-in/0/edid"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> Python <pre><span class="n">edid</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">00FFFFFFFFFF00...</span><span class="sh">"</span> <span class="c1"># 256-byte EDID data </span><span class="p">}</span> <span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">lt310:/0/hdmi-in/0/edid</span><span class="sh">"</span><span class="p">,</span> <span class="n">edid</span><span class="p">)</span></pre> ### 5.7. SDI Input This endpoint allows you to monitor the **sdi-in** signal status and access the audio and video streams, when available, in various formats. Data can be retrieved as raw data or files, in different formats and encodings. Native formats are <code>yuyv</code> or <code>nv12</code> (video) and <code>pcm</code> (audio). Depending on the requested format, the host CPU and/or GPU may be used for processing and conversion. | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/:board/sdi-in/:id**](#sdi-in_object) | GET | Retrieve the current SDI Input information. | | [**/:board/sdi-in/:id/data**](#worker_full) | POST | Retrieve raw data from the SDI Input. | | [**/:board/sdi-in/:id/file**](#worker_full) | POST | Retrieve a file from the SDI Input. | **URL parameters** - <code><strong>:board</strong></code> Device position into the host <code>[0 .. 1]</code>. - <code><strong>:id</strong></code> sdi-in index, dependent on the board type: <code>[0 .. 3]</code> for LT311, <code>not applicable</code> for LT312, <code>[0 .. 1]</code> for LT313. #### 5.7.1. SDI Input Object | The **sdi-in** object contains the current state of its audio and video signals. | GET **/:board/sdi-in/:id** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | audio | object | [Audio object](#structure_audio) for the SDI Input. | | video | object | [Video object](#structure_video) for the SDI Input. | ### 5.8. HDMI Output Allows to configure the physical hdmi outputs on a LT board. | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/:board/hdmi-out/:id**](#hdmi-out) | GET, POST | Retrieve or configure the specified hdmi-out. | **URL parameters** - <code><strong>:board</strong></code> Device position into the host <code>[0 .. 1]</code>. - <code><strong>:id</strong></code> hdmi-out index <code>0</code>. #### 5.8.1. HDMI Output Object | The **HDMI Output** object provides configuration and status information about a specific hdmi-out. | GET, POST **/:board/hdmi-out/:id** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"overlay"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"overlayMode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"performance"</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"link"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auto"</span><span class="p">,</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | source | string | The hdmi-out source. Values can be <code>auto</code> or any valid board input source. | | overlay | string | The overlay source applied on the hdmi-out. Values can be <code>canvas/:id</code> or <code>none</code> for no overlay. | | overlayMode | string | Controls how overlay content is processed on the output device. This parameter affects the quality and performance of overlays. Values can be <code>performance</code> or <code>quality</code>. | | format | string | The color format applied to the output. Values can be <code>auto</code>, <code>rgb444</code>, <code>yuv444</code> and <code>yuv422</code>. | | link | string | The hdmi-out link carrier. Values can be <code>auto</code>, <code>fhd</code> or <code>off</code>. | | audio | *object* | The [audio object](#structure_audio) for the HDMI Output (read only). | | video | *object* | The [video object](#structure_video) for the HDMI Output (read only). | **GET Example**These code examples demonstrate how to retrieve the configuration and status of hdmi-out 0 on board 0. ecurl <pre><span class="nv">$ </span>ecurl get lt310:/0/hdmi-out/0</pre> GO <pre><span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Output</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"lt310:/0/hdmi-out/0"</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">Output</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Get</span><span class="p">(</span><span class="s">"lt310:/0/hdmi-out/0"</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Get</span><span class="p">(</span><span class="sh">"</span><span class="s">lt310:/0/hdmi-out/0</span><span class="sh">"</span><span class="p">)</span></pre> **POST Example**These code examples demonstrate how to enable the overlay with canvas 0 on hdmi-out 0. ecurl <pre><span class="nv">$ </span>ecurl post lt310:/0/hdmi-out/0 <span class="nt">-d</span> <span class="nv">overlay</span><span class="o">=</span>canvas/0</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"overlay"</span><span class="o">:</span> <span class="s">"canvas/0"</span><span class="p">,</span> <span class="p">}</span> <span class="k">var</span> <span class="n">response</span> <span class="n">lt</span><span class="o">.</span><span class="n">Output</span> <span class="c">// struct to store the response</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/0/hdmi-out/0"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="o">&</span><span class="n">response</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"overlay"</span><span class="p">,</span> <span class="s">"canvas/0"</span><span class="p">}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">Output</span> <span class="n">response</span><span class="p">;</span> <span class="c1">// struct to store the response</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/0/hdmi-out/0"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="n">response</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">overlay</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">canvas/0</span><span class="sh">"</span> <span class="p">}</span> <span class="n">response</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">lt310:/0/hdmi-out/0</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> ### 5.9. Canvas The **canvas** endpoint is both a virtual audio/video source and a dynamic synthetic image generator which supports draw operations. It could be used to emulate the LT boards video inputs and to send overlay images onto the hdmi and/or sdi outputs. Data operations | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/canvas/:id**](#canvas_object) | GET | canvas **:id** configuration. | | [**/canvas/:id/data**](#worker_full) | POST | Data stream | | [**/canvas/:id/file**](#worker_full) | POST | File recording | Draw operations | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/canvas/:id/init**](#canvas_init) | POST | Initialize the canvas. | | [**/canvas/:id/text**](#canvas_text) | POST | Draw text on the canvas. | | [**/canvas/:id/line**](#canvas_line) | POST | Draw a line on the canvas. | | [**/canvas/:id/ellipse**](#canvas_ellipse) | POST | Draw an ellipse on the canvas. | | [**/canvas/:id/rectangle**](#canvas_rectangle) | POST | Draw a rectangle on the canvas. | | [**/canvas/:id/image**](#canvas_image) | POST | Put an image on the canvas. | | [**/canvas/:id/video**](#canvas_video) | POST | Put a video on the canvas. | | [**/canvas/:id/clear**](#canvas_clear) | POST | Clear a canvas area or a source. | | [**/canvas/:id/op**](#canvas_op) | POST | Perform a single draw operation on the canvas. | | [**/canvas/:id/ops**](#canvas_ops) | POST | Perform multiple draw operations on the canvas. | **URL parameters** - <code><strong>:id</strong></code> canvas index <code>[0 .. 3]</code> (configurable with <code>numCanvases</code> in agent configuration file) #### 5.9.1. Canvas Object | The **Canvas** object provides status information about a specific canvas. | GET **/canvas/:id** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"audio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rgba"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="w"> </span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"locked"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | audio | *object* | The [audio object](#structure_audio) for the Canvas (read only). | | video | *object* | The [video object](#structure_video) for the Canvas (read only). | #### 5.9.2. Understanding Canvas Operations Each drawing operation works within a **container** - a rectangular area that defines where and how the element is drawn. The schema of a container is illustrated below: All operations share these common parameters: | Parameter | Type | Default | Description | |---|---|---|---| | position | \[2\]int | <code>[0, 0]</code> | The top-left corner coordinates <code>{x, y}</code> of the container on the canvas. | | size | \[2\]int | varies | The container dimensions <code>{width, height}</code> in pixels. **This parameter is mandatory for most operations.** | | angle | float | <code>0</code> | Rotation angle in degrees, applied around the center of the container. | | anchor | \[2\]int | <code>[0, 0]</code> | The pivot point for rotation and scaling transformations, relative to the container’s top-left corner. | The mandatory parameters for each operation are highlighted in the respective sections below. **Rendering Order Rules:** - Standard drawing operations (<code>text</code>, <code>line</code>, <code>ellipse</code>, <code>rectangle</code>, <code>image</code>) are stacked in the order they are sent. Later operations draw over earlier ones. - Video sources (<code>video</code> operations) are always rendered on top of all standard drawing operations. - Among multiple video sources, the most recently added video appears on top of earlier video sources. **Note:** There is no layer system - operations cannot be reordered after being sent. #### 5.9.3. Initialize Canvas | Canvas initialization is done using the **init** operation. This operation sets up the canvas with the specified background color, size, and framerate. If a file source is provided, the canvas size and framerate are derived from the file content. | POST **/canvas/:id/init** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"init"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | op | string | Operation identifier. | | source | string | Path to the file source. Supported formats are <code>jpeg</code>, <code>png</code>, <code>bmp</code> and <code>mp4</code> files. If no source is provided, the canvas is filled with the specified color. | | color | \[4\]int | The RGBA background color with transparency. Default <code>[0,0,0,0]</code>. | | size | \[2\]int | The video frame width and height in pixel units. Default <code>[3840,2160]</code>. | | framerate | float | The video frame rate in frames per second. Default <code>30.0</code>. | #### 5.9.4. Drawing Operations ##### 5.9.4.1. Text Operation | Draw text onto the canvas with various font styles and attributes. The text can be positioned, rotated and scaled within a defined container. | POST **/canvas/:id/text** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="nl">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hello world!"</span><span class="p">,</span><span class="w"> </span><span class="nl">"align"</span><span class="p">:</span><span class="w"> </span><span class="s2">"center"</span><span class="p">,</span><span class="w"> </span><span class="nl">"font"</span><span class="p">:</span><span class="w"> </span><span class="s2">"regular"</span><span class="p">,</span><span class="w"> </span><span class="nl">"fontSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">32</span><span class="p">,</span><span class="w"> </span><span class="nl">"italic"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"bold"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"angle"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="w"> </span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | op | string | Operation identifier. | | text | string | Text to draw. **This parameter is mandatory.** | | align | string | Set the text position into the container. The possible values are <code>top-left</code>, <code>top</code>, <code>top-right</code>, <code>left</code>, <code>center</code>, <code>right</code>, <code>bottom-left</code>, <code>bottom</code> and <code>bottom-right</code>. Default is <code>center</code>. | | font | string | Font type. Default is <code>regular</code>, could also be <code>mono</code> and <code>smallcaps</code>. | | fontSize | int | Font size in pt unit. Default is <code>32</code>. | | italic | bool | Draw the text with the *italic* attribute. Default <code>false</code>. | | bold | bool | Draw the text with the **bold** attribute. Default <code>false</code>. | | color | \[4\]int | Text color in RGBA format. Default <code>[0,0,0,255]</code>. | *See [Understanding Canvas Operations](#canvas_container) section for container parameters.* ##### 5.9.4.2. Line Operation | Draw a line within the container. The line extends from the top-left corner to the bottom-right corner of the container defined by <code>position</code> and <code>size</code>. | POST **/canvas/:id/line** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"line"</span><span class="p">,</span><span class="w"> </span><span class="nl">"width"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"pattern"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="nl">"angle"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="w"> </span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | op | string | Operation identifier. | | width | int | The shape width size in pixel unit. Default <code>1</code>. | | color | \[4\]int | The shape RGBA color. Default is <code>[255,255,255,255]</code>. | | pattern | \[\]int | The dash size pattern in pixel units. The pattern is repeated. Default no dash pattern: <code>{}</code>. | *See [Understanding Canvas Operations](#canvas_container) section for container parameters.* ##### 5.9.4.3. Ellipse Operation | Draw an ellipse that fits within the container rectangle. The ellipse is inscribed in a bounding box defined by the container’s <code>position</code> (top-left corner) and <code>size</code> (width and height). | POST **/canvas/:id/ellipse** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ellipse"</span><span class="p">,</span><span class="w"> </span><span class="nl">"width"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"pattern"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="nl">"fill"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"angle"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="w"> </span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | op | string | Operation identifier. | | width | int | The shape width size in pixel unit. Default <code>1</code>. | | color | \[4\]int | The shape RGBA color. Default is <code>[255,255,255,255]</code>. | | pattern | \[\]int | The dash size pattern in pixel units. The pattern is repeated. Default no dash pattern: <code>{}</code>. | | fill | \[4\]int | Fill the shape with a RGBA color. Default is <code>{0,0,0,0}</code>. | *See [Understanding Canvas Operations](#canvas_container) section for container parameters.* ##### 5.9.4.4. Rectangle Operation | Draw a rectangle that exactly matches the container boundaries. The rectangle’s top-left corner is positioned at <code>position</code> coordinates, and its dimensions are defined by <code>size</code>. | POST **/canvas/:id/rectangle** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rectangle"</span><span class="p">,</span><span class="w"> </span><span class="nl">"width"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"pattern"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="nl">"fill"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"rounded"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"angle"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">400</span><span class="p">,</span><span class="w"> </span><span class="mi">400</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | op | string | Operation identifier. | | width | int | The shape width size in pixel unit. Default <code>1</code>. | | color | \[4\]int | The shape RGBA color. Default is <code>[255,255,255,255]</code>. | | pattern | \[\]int | The dash size pattern in pixel units. The pattern is repeated. Default no dash pattern: <code>{}</code>. | | fill | \[4\]int | Fill the shape with a RGBA color. Default is <code>{0,0,0,0}</code>. | | rounded | int | The rectangle corner rounding radius in pixel unit. Default <code>0</code>. | *See [Understanding Canvas Operations](#canvas_container) section for container parameters.* ##### 5.9.4.5. Image Operation | Draw an image within the container. There are two ways to provide the image: - Using a file path with the <code>source</code> parameter. The <code>format</code>, <code>data</code>, <code>width</code> and <code>height</code> parameters are ignored as they are derived from the file content. - Using a data buffer with the <code>data</code> parameter. The <code>format</code> parameter is mandatory, and for raw formats (<code>rgba</code> or <code>rgb</code>), the <code>width</code> and <code>height</code> parameters are also required. If the <code>size</code> parameter is provided, the image is scaled to fit the container while maintaining its aspect ratio. If omitted, the image is drawn at its original dimensions. | POST **/canvas/:id/image** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"image"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"C:</span><span class="se">\\</span><span class="s2">image.png"</span><span class="p">,</span><span class="w"> </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"data"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="nl">"width"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"height"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"angle"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">640</span><span class="p">,</span><span class="w"> </span><span class="mi">480</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | op | string | Operation identifier. | | source | string | Filepath. Supported formats are <code>jpeg</code>, <code>png</code> and <code>bmp</code> files. | | format | string | The image data format. Could be <code>rgba</code>, <code>rgb</code>, <code>bmp</code>, <code>jpeg</code> or <code>png</code>. | | data | \[\]byte | Image data buffer. | | width | int | Image width. Mandatory for <code>rgba</code> or <code>rgb</code> data buffer. | | height | int | Image height. Mandatory for <code>rgba</code> or <code>rgb</code> data buffer. | *See [Understanding Canvas Operations](#canvas_container) section for container parameters.* ##### 5.9.4.6. Video Operation | Draw a live video source within the container. The video source can be a board input (SDI/HDMI) or another canvas. If the <code>size</code> parameter is provided, the video is scaled to fit the container while maintaining its aspect ratio. If omitted, the video is drawn at its original dimensions. **Note:** The <code>angle</code> parameter is not supported for video operations. | POST **/canvas/:id/video** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"canvas/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"anchor"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | op | string | Operation identifier. | | source | string | Supported sources are <code>:board/camera/:id</code> and <code>canvas/:id</code>. | *See [Understanding Canvas Operations](#canvas_container) section for container parameters.* #### 5.9.5. Clear Operation | The clear operation can be used for two purposes that can be combined: **1. Remove video sources:** - Specify a <code>source</code> parameter to remove a specific video source (<code>:board/camera/:id</code> or <code>canvas/:id</code>) - Use <code>source: "all"</code> to remove all video sources from the canvas **2. Clear a canvas area:** - Define a rectangular area using <code>position</code> and <code>size</code> parameters - The area will be filled with the specified <code>color</code> (default: transparent black) - Use <code>thickness</code> to expand the clearing area by a given number of pixels on all sides (acts as padding) **Default behavior:** If no parameters are provided, the entire canvas is cleared to transparent black. All drawing operations are removed, but video sources remain untouched. | POST **/canvas/:id/clear** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"clear"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">200</span><span class="p">,</span><span class="mi">200</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">512</span><span class="p">,</span><span class="mi">256</span><span class="p">],</span><span class="w"> </span><span class="nl">"thickness"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | op | string | Operation identifier. | | source | string | Video source to remove. Supported values: <code>:board/camera/:id</code>, <code>canvas/:id</code>, or <code>"all"</code> to remove all video sources. If omitted, no video sources are removed. | | color | \[4\]int | The RGBA background color with transparency. Default <code>[0,0,0,0]</code> (transparent black). | | position | \[2\]int | The top-left corner coordinates of the area to clear. If omitted, starts at <code>[0,0]</code>. | | size | \[2\]int | Dimensions of the area to clear. If omitted, clears the entire canvas (except video sources). | | thickness | int | Expand the clearing area by this number of pixels on all sides (acts as padding). Default <code>0</code>. | #### 5.9.6. Single Operation Endpoint | The <code>op</code> endpoint is a generic endpoint that accepts any canvas operation (<code>init</code>, <code>text</code>, <code>line</code>, <code>ellipse</code>, <code>rectangle</code>, <code>image</code>, <code>video</code>, or <code>clear</code>). This provides a unified way to send operations without using operation-specific endpoints. The operation type is determined by the <code>op</code> field in the JSON payload. | POST **/canvas/:id/op** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="nl">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Hello, World!"</span><span class="p">,</span><span class="w"> </span><span class="nl">"fontSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">48</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">800</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | op | string | Operation type. Must be one of: <code>init</code>, <code>text</code>, <code>line</code>, <code>ellipse</code>, <code>rectangle</code>, <code>image</code>, <code>video</code>, or <code>clear</code>. **This parameter is mandatory.** | | …​ | varies | Additional parameters depend on the operation type. See the corresponding operation section for details. | #### 5.9.7. Batch Operations Endpoint | The <code>ops</code> endpoint allows sending multiple canvas operations in a single request. Operations are executed sequentially in the order they appear in the array. This is useful for: - Atomic updates (all operations succeed or fail together) - Performance optimization (reduces HTTP overhead) - Initial canvas setup with multiple elements Each operation in the array must include an <code>op</code> field specifying its type, followed by the operation-specific parameters. | POST **/canvas/:id/ops** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"ops"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"init"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">]</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rectangle"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">400</span><span class="p">,</span><span class="w"> </span><span class="mi">300</span><span class="p">],</span><span class="w"> </span><span class="nl">"fill"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">180</span><span class="p">]</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="nl">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Overlay"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">400</span><span class="p">,</span><span class="w"> </span><span class="mi">300</span><span class="p">],</span><span class="w"> </span><span class="nl">"align"</span><span class="p">:</span><span class="w"> </span><span class="s2">"center"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| | Attribute | Type | Description | |---|---|---| | ops | \[\]object | Array of operation objects. Each object must contain an <code>op</code> field and the corresponding parameters for that operation type. **This parameter is mandatory.** | #### 5.9.8. Examples This section provides practical examples demonstrating common canvas use cases. Additional examples are available in the SDK code samples. ##### 5.9.8.1. Example 1: Simple text banner This example demonstrates how to create a simple text banner overlay using standard drawing operations. The canvas is assumed to be already initialized with dimensions 1920x1080 and a transparent background. A semi-transparent dark banner is drawn at the bottom of the screen with white centered text. This is commonly used for displaying information, captions, or alerts over video content. | **Step 1:** *Draw the banner background using a rectangle with rounded corners and transparency.* | **Step 2:** *Add centered text on top of the banner.* | |---|---| | POST **lt310:/canvas/0/rectangle** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rectangle"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="mi">900</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1200</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">],</span><span class="w"> </span><span class="nl">"fill"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">180</span><span class="p">],</span><span class="w"> </span><span class="nl">"rounded"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="p">}</span></pre> | POST **lt310:/canvas/0/text** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="nl">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Hello, World!"</span><span class="p">,</span><span class="w"> </span><span class="nl">"fontSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">48</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"align"</span><span class="p">:</span><span class="w"> </span><span class="s2">"center"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="mi">900</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1200</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | These operations use the standard drawing endpoints (<code>/rectangle</code> and <code>/text</code>) which are specific to each operation type. **Code Examples** ecurl <pre><span class="nv">$ </span>ecurl post lt310:/canvas/0/rectangle <span class="nt">-d</span> <span class="nv">position</span><span class="o">=</span>50,900 <span class="nt">-d</span> <span class="nv">size</span><span class="o">=</span>1200,100 <span class="nt">-d</span> <span class="nv">fill</span><span class="o">=</span>0,0,0,180 <span class="nt">-d</span> <span class="nv">rounded</span><span class="o">=</span>10 <span class="nv">$ </span>ecurl post lt310:/canvas/0/text <span class="nt">-d</span> <span class="nv">position</span><span class="o">=</span>50,900 <span class="nt">-d</span> <span class="nv">size</span><span class="o">=</span>1200,100 <span class="nt">-d</span> <span class="nv">text</span><span class="o">=</span><span class="s2">"Hello, World!"</span> <span class="nt">-d</span> <span class="nv">fontSize</span><span class="o">=</span>48 <span class="nt">-d</span> <span class="nv">color</span><span class="o">=</span>255,255,255,255 <span class="nt">-d</span> <span class="nv">align</span><span class="o">=</span>center</pre> GO <pre><span class="c">// Add semi-transparent background bar</span> <span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"position"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">50</span><span class="p">,</span> <span class="m">900</span><span class="p">},</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">1200</span><span class="p">,</span> <span class="m">100</span><span class="p">},</span> <span class="s">"fill"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">180</span><span class="p">},</span> <span class="s">"rounded"</span><span class="o">:</span> <span class="m">10</span><span class="p">,</span> <span class="p">}</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/canvas/0/rectangle"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span> <span class="c">// Add text over the background</span> <span class="n">body</span> <span class="o">=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"position"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">50</span><span class="p">,</span> <span class="m">900</span><span class="p">},</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">1200</span><span class="p">,</span> <span class="m">100</span><span class="p">},</span> <span class="s">"text"</span><span class="o">:</span> <span class="s">"Hello, World!"</span><span class="p">,</span> <span class="s">"fontSize"</span><span class="o">:</span> <span class="m">48</span><span class="p">,</span> <span class="s">"color"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">255</span><span class="p">,</span> <span class="m">255</span><span class="p">,</span> <span class="m">255</span><span class="p">,</span> <span class="m">255</span><span class="p">},</span> <span class="s">"align"</span><span class="o">:</span> <span class="s">"center"</span><span class="p">,</span> <span class="p">}</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/canvas/0/text"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="c1">// Add semi-transparent background bar</span> <span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"position"</span><span class="p">,</span> <span class="p">{</span><span class="mi">50</span><span class="p">,</span> <span class="mi">900</span><span class="p">}},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">1200</span><span class="p">,</span> <span class="mi">100</span><span class="p">}},</span> <span class="p">{</span><span class="s">"fill"</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">180</span><span class="p">}},</span> <span class="p">{</span><span class="s">"rounded"</span><span class="p">,</span> <span class="mi">10</span><span class="p">}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/canvas/0/rectangle"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span> <span class="c1">// Add text over the background</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"position"</span><span class="p">,</span> <span class="p">{</span><span class="mi">50</span><span class="p">,</span> <span class="mi">900</span><span class="p">}},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">1200</span><span class="p">,</span> <span class="mi">100</span><span class="p">}},</span> <span class="p">{</span><span class="s">"text"</span><span class="p">,</span> <span class="s">"Hello, World!"</span><span class="p">},</span> <span class="p">{</span><span class="s">"fontSize"</span><span class="p">,</span> <span class="mi">48</span><span class="p">},</span> <span class="p">{</span><span class="s">"color"</span><span class="p">,</span> <span class="p">{</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">}},</span> <span class="p">{</span><span class="s">"align"</span><span class="p">,</span> <span class="s">"center"</span><span class="p">}</span> <span class="p">};</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/canvas/0/text"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> Python <pre><span class="c1"># Add semi-transparent background bar </span><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">50</span><span class="p">,</span> <span class="mi">900</span><span class="p">],</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">1200</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span> <span class="sh">"</span><span class="s">fill</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">180</span><span class="p">],</span> <span class="sh">"</span><span class="s">rounded</span><span class="sh">"</span><span class="p">:</span> <span class="mi">10</span> <span class="p">}</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">lt310:/canvas/0/rectangle</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span> <span class="c1"># Add text over the background </span><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">50</span><span class="p">,</span> <span class="mi">900</span><span class="p">],</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">1200</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span> <span class="sh">"</span><span class="s">text</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Hello, World!</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">fontSize</span><span class="sh">"</span><span class="p">:</span> <span class="mi">48</span><span class="p">,</span> <span class="sh">"</span><span class="s">color</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">],</span> <span class="sh">"</span><span class="s">align</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">center</span><span class="sh">"</span> <span class="p">}</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">lt310:/canvas/0/text</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> ##### 5.9.8.2. Example 2: Side-by-Side SDI Display Create a 4K canvas displaying two sdi sources side-by-side with labels. This example uses batch operations to set up the entire composition in a single request, including canvas initialization. | **Step 1:** Initialize a 4K canvas with a black background. **Step 2:** Add the first camera video source on the left half of the canvas. **Step 3:** Overlay a text label below the first camera feed. **Step 4:** Add the second camera video source on the right half of the canvas. **Step 5:** Overlay a text label below the second camera feed. | POST **lt310:/canvas/0/ops** <pre><span class="p">{</span><span class="w"> </span><span class="nl">"ops"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"init"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">3840</span><span class="p">,</span><span class="w"> </span><span class="mi">2160</span><span class="p">],</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/sdi-in/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">600</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">]</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="nl">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"SDI 0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"fontSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">48</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"align"</span><span class="p">:</span><span class="w"> </span><span class="s2">"center"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1680</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">]</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/sdi-in/1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">600</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">]</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"op"</span><span class="p">:</span><span class="w"> </span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="nl">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"SDI 1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"fontSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">48</span><span class="p">,</span><span class="w"> </span><span class="nl">"color"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">],</span><span class="w"> </span><span class="nl">"align"</span><span class="p">:</span><span class="w"> </span><span class="s2">"center"</span><span class="p">,</span><span class="w"> </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1680</span><span class="p">],</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| Instead of using standard drawing endpoints, all operations are sent via the batch endpoint <code>/ops</code> in a single request. **Code Examples** ecurlTo perform the batch operation using <code>ecurl</code>, a JSON file is created containing all the operations as described above, and then sent in a single POST request. <pre><span class="nv">$ </span>ecurl post lt310:/canvas/0/ops <span class="nt">-d</span> @batch_ops.json</pre> GO <pre><span class="n">body</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="s">"ops"</span><span class="o">:</span> <span class="p">[]</span><span class="n">lt</span><span class="o">.</span><span class="n">JSON</span><span class="p">{</span> <span class="p">{</span> <span class="s">"op"</span><span class="o">:</span> <span class="s">"init"</span><span class="p">,</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">3840</span><span class="p">,</span> <span class="m">2160</span><span class="p">},</span> <span class="s">"color"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">255</span><span class="p">},</span> <span class="s">"framerate"</span><span class="o">:</span> <span class="m">30.0</span><span class="p">,</span> <span class="p">},</span> <span class="p">{</span> <span class="s">"op"</span><span class="o">:</span> <span class="s">"video"</span><span class="p">,</span> <span class="s">"source"</span><span class="o">:</span> <span class="s">"0/sdi-in/0"</span><span class="p">,</span> <span class="s">"position"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">0</span><span class="p">,</span> <span class="m">600</span><span class="p">},</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">1920</span><span class="p">,</span> <span class="m">1080</span><span class="p">},</span> <span class="p">},</span> <span class="p">{</span> <span class="s">"op"</span><span class="o">:</span> <span class="s">"text"</span><span class="p">,</span> <span class="s">"text"</span><span class="o">:</span> <span class="s">"SDI 0"</span><span class="p">,</span> <span class="s">"fontSize"</span><span class="o">:</span> <span class="m">48</span><span class="p">,</span> <span class="s">"color"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">255</span><span class="p">,</span> <span class="m">255</span><span class="p">,</span> <span class="m">255</span><span class="p">,</span> <span class="m">255</span><span class="p">},</span> <span class="s">"align"</span><span class="o">:</span> <span class="s">"center"</span><span class="p">,</span> <span class="s">"position"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">0</span><span class="p">,</span> <span class="m">1680</span><span class="p">},</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">1920</span><span class="p">,</span> <span class="m">100</span><span class="p">},</span> <span class="p">},</span> <span class="p">{</span> <span class="s">"op"</span><span class="o">:</span> <span class="s">"video"</span><span class="p">,</span> <span class="s">"source"</span><span class="o">:</span> <span class="s">"0/sdi-in/1"</span><span class="p">,</span> <span class="s">"position"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">1920</span><span class="p">,</span> <span class="m">600</span><span class="p">},</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">1920</span><span class="p">,</span> <span class="m">1080</span><span class="p">},</span> <span class="p">},</span> <span class="p">{</span> <span class="s">"op"</span><span class="o">:</span> <span class="s">"text"</span><span class="p">,</span> <span class="s">"text"</span><span class="o">:</span> <span class="s">"SDI 1"</span><span class="p">,</span> <span class="s">"fontSize"</span><span class="o">:</span> <span class="m">48</span><span class="p">,</span> <span class="s">"color"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">255</span><span class="p">,</span> <span class="m">255</span><span class="p">,</span> <span class="m">255</span><span class="p">,</span> <span class="m">255</span><span class="p">},</span> <span class="s">"align"</span><span class="o">:</span> <span class="s">"center"</span><span class="p">,</span> <span class="s">"position"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">1920</span><span class="p">,</span> <span class="m">1680</span><span class="p">},</span> <span class="s">"size"</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">1920</span><span class="p">,</span> <span class="m">100</span><span class="p">},</span> <span class="p">},</span> <span class="p">},</span> <span class="p">}</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/canvas/0/ops"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span></pre> C++ <pre><span class="n">lt</span><span class="o">::</span><span class="n">json</span> <span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="s">"ops"</span><span class="p">,</span> <span class="p">{</span> <span class="p">{</span> <span class="p">{</span><span class="s">"op"</span><span class="p">,</span> <span class="s">"init"</span><span class="p">},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">3840</span><span class="p">,</span> <span class="mi">2160</span><span class="p">}},</span> <span class="p">{</span><span class="s">"color"</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">}},</span> <span class="p">{</span><span class="s">"framerate"</span><span class="p">,</span> <span class="mf">30.0</span><span class="p">}</span> <span class="p">},</span> <span class="p">{</span> <span class="p">{</span><span class="s">"op"</span><span class="p">,</span> <span class="s">"video"</span><span class="p">},</span> <span class="p">{</span><span class="s">"source"</span><span class="p">,</span> <span class="s">"0/sdi-in/0"</span><span class="p">},</span> <span class="p">{</span><span class="s">"position"</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="mi">600</span><span class="p">}},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">1080</span><span class="p">}}</span> <span class="p">},</span> <span class="p">{</span> <span class="p">{</span><span class="s">"op"</span><span class="p">,</span> <span class="s">"text"</span><span class="p">},</span> <span class="p">{</span><span class="s">"text"</span><span class="p">,</span> <span class="s">"SDI 0"</span><span class="p">},</span> <span class="p">{</span><span class="s">"fontSize"</span><span class="p">,</span> <span class="mi">48</span><span class="p">},</span> <span class="p">{</span><span class="s">"color"</span><span class="p">,</span> <span class="p">{</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">}},</span> <span class="p">{</span><span class="s">"align"</span><span class="p">,</span> <span class="s">"center"</span><span class="p">},</span> <span class="p">{</span><span class="s">"position"</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1680</span><span class="p">}},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">100</span><span class="p">}}</span> <span class="p">},</span> <span class="p">{</span> <span class="p">{</span><span class="s">"op"</span><span class="p">,</span> <span class="s">"video"</span><span class="p">},</span> <span class="p">{</span><span class="s">"source"</span><span class="p">,</span> <span class="s">"0/sdi-in/1"</span><span class="p">},</span> <span class="p">{</span><span class="s">"position"</span><span class="p">,</span> <span class="p">{</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">600</span><span class="p">}},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">1080</span><span class="p">}}</span> <span class="p">},</span> <span class="p">{</span> <span class="p">{</span><span class="s">"op"</span><span class="p">,</span> <span class="s">"text"</span><span class="p">},</span> <span class="p">{</span><span class="s">"text"</span><span class="p">,</span> <span class="s">"SDI 1"</span><span class="p">},</span> <span class="p">{</span><span class="s">"fontSize"</span><span class="p">,</span> <span class="mi">48</span><span class="p">},</span> <span class="p">{</span><span class="s">"color"</span><span class="p">,</span> <span class="p">{</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">}},</span> <span class="p">{</span><span class="s">"align"</span><span class="p">,</span> <span class="s">"center"</span><span class="p">},</span> <span class="p">{</span><span class="s">"position"</span><span class="p">,</span> <span class="p">{</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">1680</span><span class="p">}},</span> <span class="p">{</span><span class="s">"size"</span><span class="p">,</span> <span class="p">{</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">100</span><span class="p">}}</span> <span class="p">}</span> <span class="p">}}</span> <span class="p">};</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/canvas/0/ops"</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span></pre> Python <pre><span class="n">body</span> <span class="o">=</span> <span class="p">{</span> <span class="sh">"</span><span class="s">ops</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span> <span class="p">{</span> <span class="sh">"</span><span class="s">op</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">init</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">3840</span><span class="p">,</span> <span class="mi">2160</span><span class="p">],</span> <span class="sh">"</span><span class="s">color</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">],</span> <span class="sh">"</span><span class="s">framerate</span><span class="sh">"</span><span class="p">:</span> <span class="mf">30.0</span> <span class="p">},</span> <span class="p">{</span> <span class="sh">"</span><span class="s">op</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">video</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">0/sdi-in/0</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">600</span><span class="p">],</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">1080</span><span class="p">]</span> <span class="p">},</span> <span class="p">{</span> <span class="sh">"</span><span class="s">op</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">text</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">text</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">SDI 0</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">fontSize</span><span class="sh">"</span><span class="p">:</span> <span class="mi">48</span><span class="p">,</span> <span class="sh">"</span><span class="s">color</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">],</span> <span class="sh">"</span><span class="s">align</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">center</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1680</span><span class="p">],</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">100</span><span class="p">]</span> <span class="p">},</span> <span class="p">{</span> <span class="sh">"</span><span class="s">op</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">video</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">0/sdi-in/1</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">600</span><span class="p">],</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">1080</span><span class="p">]</span> <span class="p">},</span> <span class="p">{</span> <span class="sh">"</span><span class="s">op</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">text</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">text</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">SDI 1</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">fontSize</span><span class="sh">"</span><span class="p">:</span> <span class="mi">48</span><span class="p">,</span> <span class="sh">"</span><span class="s">color</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">],</span> <span class="sh">"</span><span class="s">align</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">center</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">1680</span><span class="p">],</span> <span class="sh">"</span><span class="s">size</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">100</span><span class="p">]</span> <span class="p">}</span> <span class="p">]</span> <span class="p">}</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="p">.</span><span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">lt310:/canvas/0/ops</span><span class="sh">"</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span></pre> ### 5.10. Workers All the API processing is based on **Worker objects** created by the multimedia server on behalf of clients requests. A Worker is a software entity that receives, processes, and outputs streams of **Packets**. **Packets** encapsulate video, audio, or control data moving through the system. Workers allow the construction of pipelines that capture data from Enciris boards, process it, or store it in files. The workers creation endpoints are easily recognizable by their URLs patterns: | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/:url/data**](#worker_data) | POST | Create a data worker for the specified resource. | | [**/:url/file**](#worker_file) | POST | Create a file worker for the specified resource. | **URL parameters** - <code><strong>:url</strong></code> URL can be any valid API resource that point toward a <code>data</code> or a <code>file</code> endpoint. There are two types of workers available: - <code>data</code> workers expose media data directly to the client application for real-time analysis or custom processing. The worker object provides packets containing shared memory buffers with raw video or audio data, ensuring minimal latency and zero-copy transfer. Data workers are useful for applications that require direct access to raw frames or audio samples. - <code>file</code> workers record media streams into files on disk, supporting features such as file splitting and multiple container formats. The worker object provides packets containing recording status information instead of raw media buffers. File workers are ideal for applications that need to store streams for later playback or archival. The general workflow is the same for both worker types: 1. The client creates a worker by sending a POST request to the appropriate endpoint (<code>/:url/data</code> or <code>/:url/file</code>) with the desired configuration. 2. The API responds with a redirect URL to the newly created worker object. 3. The client follows this redirect to access the worker object, which provides status information and related packets. The client can also stop the worker at any time by sending a POST request to the <code>/:url/stop</code> endpoint. This workflow is illustrated in the diagram below: The following sections provide further details on: - Worker creation and configuration parameters, - The structure of the worker object, - The packet and shared packet object models, - The worker lifecycle and its associated threads, - Usage examples for common scenarios. #### 5.10.1. Worker Creation Workers are created by sending a POST request to the appropriate endpoint (<code>/:url/data</code> for data workers or <code>/:url/file</code> for file workers) along with the required parameters. If successful, the API responds with a redirect URL that identifies the newly created worker. This URL must be used by the client to fetch updates or to send commands to the worker. The configuration for each worker type varies based on the media type and processing requirements. The media are separated into distinct categories, each with its own set of parameters and options. - Audio workers focus on audio data processing and support parameters like channels, sample rate, and bit depth. Available media: <code>audio/pcm</code>, <code>audio/wav</code>, <code>audio/aac</code>. - Image workers are designed for image data processing and include parameters such as width, height, and pixel format. Available media: <code>image/yuyv</code>, <code>image/yuv422</code>, <code>image/nv12</code>, <code>image/rgba</code>, <code>image/rgb</code>, <code>image/jpeg</code>, <code>image/png</code>, <code>image/bmp</code>. - Video workers are tailored for video data processing and support parameters like frame rate, resolution, and codec. Available media: <code>video/yuyv</code>, <code>video/nv12</code>, <code>video/h264</code>, <code>video/mp4</code>. The following sections detail the parameters and usage for each worker type. ##### 5.10.1.1. Audio Workers This section describes the parameters used for configuring audio workers. The data worker provides direct access to audio packets for real-time use, while the file worker records audio into a file according to the specified parameters. The URL used with the POST request must point to an audio source, such as <code>:board/hdmi-in/:id/data</code> or <code>:board/sdi-in/:id/data</code>. | Common parameters media <code><em>string</em></code> Media type identifier. Supported values: <code>audio/pcm</code>, <code>audio/wav</code>, <code>audio/aac</code>. channels <code><em>int</em></code> Number of audio channels. Default: <code>2</code>. samplerate <code><em>int</em></code> Audio sample rate in Hz. Default: <code>48000</code>. depth <code><em>int</em></code> Audio sample bit depth. Default: <code>16</code>. | Additional file worker parameters location <code><em>string</em></code> The file location to save the recorded audio. Must be a valid file path. duration <code><em>int</em></code> The duration of the recording in seconds. Default: <code>0</code> (infinite). splitSize <code><em>int</em></code> The maximum size of each split file in bytes. Default: <code>0</code> (unlimited, no splitting). splitDuration <code><em>int</em></code> The duration of each split file in seconds. Default: <code>0</code> (unlimited, no splitting). | |---|---| | --- Response Returns the location of the worker object onto the form of a **redirect** error. | |---| | **Data Worker Creation** | **File Worker Creation** | |---|---| | POST /:url/data request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/:url/data"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"audio/pcm"</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">48000</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | POST /:url/file request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/:url/file"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"audio/pcm"</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">48000</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="p">,</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"path_to_directory"</span><span class="p">,</span><span class="w"> </span><span class="nl">"duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"splitSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"splitDuration"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** GO <pre><span class="c">// Create Data worker</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">AudioDataWorker</span><span class="p">{</span><span class="n">Media</span><span class="o">:</span> <span class="s">"audio/pcm"</span><span class="p">},</span> <span class="no">nil</span><span class="p">)</span> <span class="c">// Create File worker</span> <span class="c">// err := lt.Post("lt310:/:url/file", lt.AudioFileWorker{Media: "audio/wav"}, nil)</span> <span class="k">if</span> <span class="o">!</span><span class="n">errors</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ErrRedirect</span><span class="p">)</span> <span class="p">{</span> <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span> <span class="p">}</span> <span class="n">workerURL</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> C++ <pre><span class="c1">// Create Data worker</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">AudioDataWorker</span><span class="p">{</span> <span class="s">"audio/pcm"</span> <span class="p">},</span> <span class="nb">nullptr</span><span class="p">);</span> <span class="c1">// Create File worker</span> <span class="c1">// err := lt.Post("lt310:/:url/file", lt.AudioFileWorker{Media: "audio/wav"}, nil);</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">lt</span><span class="o">::</span><span class="n">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ErrRedirect</span><span class="p">))</span> <span class="p">{</span> <span class="n">logFatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span> <span class="o">+</span> <span class="n">err</span><span class="p">);</span> <span class="p">}</span> <span class="n">string</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">);</span></pre> Python <pre><span class="c1"># Create Data worker </span><span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">lt310:/:url/data</span><span class="sh">"</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">media</span><span class="sh">'</span><span class="p">:</span> <span class="sh">"</span><span class="s">audio/pcm</span><span class="sh">"</span><span class="p">})</span> <span class="c1"># Create File worker # err := lt.Post("lt310:/:url/file", lt.AudioFileWorker{Media: "audio/wav"}, nil); </span> <span class="k">if</span> <span class="ow">not</span> <span class="n">lt</span><span class="p">.</span><span class="nc">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="p">.</span><span class="n">ErrRedirect</span><span class="p">):</span> <span class="nf">exit</span><span class="p">(</span><span class="n">err</span><span class="p">)</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="p">.</span><span class="nc">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> ##### 5.10.1.2. Image Workers This section describes the parameters used for configuring image workers. The data worker provides direct access to image packets, while the file worker records images into a file according to the specified parameters. The URL used with the POST request must point to an image source, such as <code>:board/hdmi-in/:id</code> <code>:board/sdi-in/:id</code> or <code>canvas/:id</code>. | Common parameters media <code><em>string</em></code> Media type identifier. Could be <code>image/yuyv</code>, <code>image/yuv422</code>, <code>image/nv12</code>, <code>image/rgba</code>, <code>image/rgb</code>, <code>image/jpeg</code>, <code>image/png</code> and <code>image/bmp</code>. size <code><em>[2]int</em></code> The image frame size. Let empty to use the default size. | Additional file worker parameters location <code><em>string</em></code> The file location to save the recorded audio. Must be a valid file path. | |---|---| | --- Response Returns the location of the worker object onto the form of a **redirect** error. | |---| | **Data Worker Creation** | **File Worker Creation** | |---|---| | POST /:url/data request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/:url/data"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"image/jpeg"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | POST /:url/file request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/:url/file"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"image/jpeg"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"path_to_directory"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** GO <pre><span class="c">// Create Data worker</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ImageDataWorker</span><span class="p">{</span><span class="n">Media</span><span class="o">:</span> <span class="s">"image/jpeg"</span><span class="p">},</span> <span class="no">nil</span><span class="p">)</span> <span class="c">// Create File worker</span> <span class="c">// err := lt.Post("lt310:/:url/file", lt.ImageFileWorker{Media: "image/jpeg"}, nil)</span> <span class="k">if</span> <span class="o">!</span><span class="n">errors</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ErrRedirect</span><span class="p">)</span> <span class="p">{</span> <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span> <span class="p">}</span> <span class="n">workerURL</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> C++ <pre><span class="c1">// Create Data worker</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ImageDataWorker</span><span class="p">{</span> <span class="s">"image/jpeg"</span> <span class="p">},</span> <span class="nb">nullptr</span><span class="p">);</span> <span class="c1">// Create File worker</span> <span class="c1">// lt::error err = lt::Post("lt310:/:url/file", lt::ImageFileWorker{ "image/jpeg" }, nullptr);</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">lt</span><span class="o">::</span><span class="n">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ErrRedirect</span><span class="p">))</span> <span class="p">{</span> <span class="n">logFatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span> <span class="o">+</span> <span class="n">err</span><span class="p">);</span> <span class="p">}</span> <span class="n">string</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">);</span></pre> Python <pre><span class="c1"># Create Data worker </span><span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">lt310:/:url/data</span><span class="sh">"</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">media</span><span class="sh">'</span><span class="p">:</span> <span class="sh">"</span><span class="s">image/jpeg</span><span class="sh">"</span><span class="p">})</span> <span class="c1"># Create File worker </span><span class="o">//</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">lt310:/:url/file</span><span class="sh">"</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">media</span><span class="sh">'</span><span class="p">:</span> <span class="sh">"</span><span class="s">image/jpeg</span><span class="sh">"</span><span class="p">})</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">lt</span><span class="p">.</span><span class="nc">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="p">.</span><span class="n">ErrRedirect</span><span class="p">):</span> <span class="nf">exit</span><span class="p">(</span><span class="n">err</span><span class="p">)</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="p">.</span><span class="nc">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> ##### 5.10.1.3. Video Workers This section describes the parameters used for configuring video workers. The data worker provides direct access to video packets for real-time use, while the file worker records video into a file according to the specified parameters. The URL used with the POST request must point to a video source, such as <code>:board/hdmi-in/:id</code>, <code>:board/sdi-in/:id</code> or <code>canvas/:id</code>. | Common parameters media <code><em>string</em></code> Media type identifier. Could be <code>video/yuyv</code>, <code>video/nv12</code>, <code>video/h264</code>, <code>video/mp4</code>. size <code><em>[2]int</em></code> The image frame size. Let empty to use the default size. framerate <code><em>float</em></code> The video frame rate. Let empty to use the default framerate. | Additional file worker parameters location <code><em>string</em></code> The file location to save the recorded video. Must be a valid file path. duration <code><em>int</em></code> The duration of the recording in seconds. Default <code>0</code> (infinite). splitSize <code><em>int</em></code> The maximum size of each split file in bytes. Default: <code>0</code> (unlimited, no splitting). splitDuration <code><em>int</em></code> The duration of each split file in seconds. Default: <code>0</code> (unlimited, no splitting). | |---|---| | --- Extra <code><em>string</em></code> Video encoder configuration parameters that control the encoding process: - <code>hw</code> - Hardware encoder to use: <code>"qsv"</code> (Intel), <code>"nvenc"</code> (NVIDIA), or <code>"amf"</code> (AMD) - <code>bitrate</code> - Target bitrate in bits per second (e.g., 5000000 for 5 Mbps) - <code>quality</code> - Quality/compression level (19-24, lower values = higher quality) - <code>gop</code> - Group of Pictures - keyframe interval in frames - <code>codec</code> - Video codec to use: <code>"h264"</code> or <code>"hevc"</code> - <code>preset</code> - Preset for the encoder (e.g., <code>"veryfast"</code>, <code>"faster"</code>, <code>"fast"</code>, <code>"medium"</code>, <code>"slow", `"slower"</code>, <code>"veryslow"</code>) \| Note \| Use either <code>bitrate</code> or <code>quality</code> for rate control, but not both simultaneously. Using <code>bitrate</code> creates a constant bitrate encoding, while <code>quality</code> creates variable bitrate encoding with consistent visual quality. \| \|---\|---\| --- Response Returns the location of the worker object onto the form of a **redirect** error. | |---| | **Data Worker Creation** | **File Worker Creation** | |---|---| | POST /:url/data request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/:url/data"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/nv12"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | POST /:url/file request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/:url/file"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/mp4"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"path_to_directory"</span><span class="p">,</span><span class="w"> </span><span class="nl">"duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"splitSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"splitDuration"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"extra"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"hw"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"bitrate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"quality"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"gop"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"codec"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"preset"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> response <pre><span class="p">{</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/client/jobs/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="s2">"redirect"</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| **Examples** GO <pre><span class="c">// Create Data worker</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">VideoDataWorker</span><span class="p">{</span><span class="n">Media</span><span class="o">:</span> <span class="s">"video/nv12"</span><span class="p">},</span> <span class="no">nil</span><span class="p">)</span> <span class="c">// Create File worker</span> <span class="c">// err := lt.Post("lt310:/:url/nv12", lt.VideoFileWorker{Media: "video/nv12"}, nil)</span> <span class="k">if</span> <span class="o">!</span><span class="n">errors</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">.</span><span class="n">ErrRedirect</span><span class="p">)</span> <span class="p">{</span> <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span> <span class="p">}</span> <span class="n">workerURL</span> <span class="o">:=</span> <span class="n">lt</span><span class="o">.</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> C++ <pre><span class="c1">// Create Data worker</span> <span class="n">lt</span><span class="o">::</span><span class="n">error</span> <span class="n">err</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">Post</span><span class="p">(</span><span class="s">"lt310:/:url/data"</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">VideoDataWorker</span><span class="p">{</span> <span class="s">"video/nv12"</span> <span class="p">},</span> <span class="nb">nullptr</span><span class="p">);</span> <span class="c1">// Create File worker</span> <span class="c1">// lt::error err = lt::Post("lt310:/:url/file", lt::VideoFileWorker{ "video/nv12" }, nullptr);</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">lt</span><span class="o">::</span><span class="n">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="o">::</span><span class="n">ErrRedirect</span><span class="p">))</span> <span class="p">{</span> <span class="n">logFatal</span><span class="p">(</span><span class="s">"worker creation failed:"</span> <span class="o">+</span> <span class="n">err</span><span class="p">);</span> <span class="p">}</span> <span class="n">string</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="o">::</span><span class="n">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">);</span></pre> Python <pre><span class="c1"># Create Data worker </span><span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">lt310:/:url/data</span><span class="sh">"</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">media</span><span class="sh">'</span><span class="p">:</span> <span class="sh">"</span><span class="s">video/nv12</span><span class="sh">"</span><span class="p">})</span> <span class="c1"># Create File worker </span><span class="o">//</span> <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="nc">Post</span><span class="p">(</span><span class="sh">"</span><span class="s">lt310:/:url/file</span><span class="sh">"</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">media</span><span class="sh">'</span><span class="p">:</span> <span class="sh">"</span><span class="s">video/nv12</span><span class="sh">"</span><span class="p">})</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">lt</span><span class="p">.</span><span class="nc">ErrorIs</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">lt</span><span class="p">.</span><span class="n">ErrRedirect</span><span class="p">):</span> <span class="nf">exit</span><span class="p">(</span><span class="n">err</span><span class="p">)</span> <span class="n">workerURL</span> <span class="o">=</span> <span class="n">lt</span><span class="p">.</span><span class="nc">RedirectLocation</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></pre> #### 5.10.2. Worker Object The Worker object is the result of a GET request onto a worker endpoint. It contains the worker status, data packets and metadata. A Worker might process one or multiples tracks and the SDK provides helpers functions to automatically parse the worker into a comprehensive structure with the contained audio and video packets. | name <code><em>string</em></code> In case of file workers, the name of the output file. Otherwise, it is empty. location <code><em>string</em></code> In case of file workers, the location of the output file. Otherwise, it is empty. start <code><em>int64</em></code> Unix timestamp at which the worker started. duration <code><em>int64</em></code> Elapsed time since the worker started. size <code><em>int</em></code> Quantity of byte processed since the segment started. status <code><em>string</em></code> Worker current status (<code>running</code>, <code>paused</code> or <code>completed</code>). packets <code><em>map[int]packet</em></code> Packets maps [packet](#packet_object) or [shared packet](#shared_packet_object) of video, audio or text data samples and/or metadata samples. | Worker object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"start"</span><span class="p">:</span><span class="w"> </span><span class="mi">1644248369455566</span><span class="p">,</span><span class="w"> </span><span class="nl">"duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">16667</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="mi">4147200</span><span class="p">,</span><span class="w"> </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"completed"</span><span class="p">,</span><span class="w"> </span><span class="nl">"packets"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"0"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"... packet object #0 ..."</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.10.3. Packet and SharedPacket Objects Packets are the fundamental units delivered by a worker. They may contain raw media data (PCM audio samples, raw video frames), or status information (e.g., file recording progress). Two packet models exist: - **Packet**: contains metadata and inline media data. - **SharedPacket**: references a buffer in shared memory for zero-copy access to larger media payloads. Clients must release packets after processing them to free system resources. | Common parameters track <code><em>int</em></code> The track ID of the packet if the worker process multiple tracks. type <code><em>string</em></code> The packet type and format. signal <code><em>string</em></code> `none` (not found), or `locked` (ready to use) timestamp <code><em>int64</em></code> Unix timestamp at which the packet has been sampled. meta <code><em>JSON</em></code> The metadata fields for audio and video. See audio and video metadata objects. --- Packet object specific parameters data <code><em>[]byte</em></code> The packet plain data buffer. --- SharedPacket object specific parameters ref <code><em>string</em></code> The shared memory reference to be deleted once the data has been used. client <code><em>string</em></code> The client id which has made the request. handle <code><em>string</em></code> The handle that allows to access the shared memory. size <code><em>int</em></code> The shared memory block total capacity. len <code><em>int</em></code> The shared buffer length inside the shared memory block. | Packet object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"track"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/nv12"</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"locked"</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">1695815814430318</span><span class="p">,</span><span class="w"> </span><span class="nl">"meta"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"keyframe"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"data"</span><span class="p">:</span><span class="w"> </span><span class="s2">"bytes_array"</span><span class="p">,</span><span class="w"> </span><span class="p">}</span></pre> SharedPacket object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"track"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/nv12"</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"locked"</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">1695815814430318</span><span class="p">,</span><span class="w"> </span><span class="nl">"meta"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"keyframe"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"len"</span><span class="p">:</span><span class="w"> </span><span class="mi">16588800</span><span class="p">,</span><span class="w"> </span><span class="nl">"ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"{lt}:/client/ref/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"client"</span><span class="p">:</span><span class="w"> </span><span class="s2">"client_id"</span><span class="p">,</span><span class="w"> </span><span class="nl">"handle"</span><span class="p">:</span><span class="w"> </span><span class="s2">"shared_memory_handle"</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="mi">1275592704</span><span class="p">,</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| To simplify integration, the SDK provides a helper function that automatically parses each packet type into a unified structure, making it easier for developers to work with the data. This approach streamlines packet handling and ensures consistency across different worker types and media formats. The new packet object model maintains common parameters while standardizing how the data sections are represented, as described below. | data <code><em>[]byte</em></code> If the packet is a Packet object, this field contains the packet data. If the packet is a SharedPacket object, the shared memory content is loaded into this field. ref <code><em>string</em></code> If the packet is a Packet object, this field is empty. If the packet is a SharedPacket object, this field contains the shared memory reference, which indicates to the user that the data is loaded from shared memory. | SDK Packet Object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"track"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/nv12"</span><span class="p">,</span><span class="w"> </span><span class="nl">"signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"locked"</span><span class="p">,</span><span class="w"> </span><span class="nl">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">1695815814430318</span><span class="p">,</span><span class="w"> </span><span class="nl">"meta"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"keyframe"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"{lt}:/client/ref/..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"client"</span><span class="p">:</span><span class="w"> </span><span class="s2">"q5jrzd2OIQuxCq1IJWICuA"</span><span class="p">,</span><span class="w"> </span><span class="nl">"handle"</span><span class="p">:</span><span class="w"> </span><span class="s2">"{lt}_global_24"</span><span class="p">,</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| ##### 5.10.3.1. Metadata The content of metadata structure present in packet object or shared packet object depends on the packet type. It exposes some fields that are specific to the type of media being processed. The following sections describe the fields for audio, image and video metadata. **Audio Metadata** | channels <code><em>int</em></code> The number of channels. samplerate <code><em>int</em></code> The number of samples per second. depth <code><em>int</em></code> The number of bits per sample. Samples <code><em>int</em></code> The number of samples contained into the buffer. | Audio metadata <pre><span class="p">{</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">48000</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="p">,</span><span class="w"> </span><span class="nl">"samples"</span><span class="p">:</span><span class="w"> </span><span class="mi">800</span><span class="p">,</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| --- **Image Metadata** | size <code><em>[2]int</em></code> The image frame size. | Image metadata <pre><span class="p">{</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| --- **Video Metadata** | size <code><em>[2]int</em></code> The video frame size. framerate <code><em>float</em></code> The number of video frame per second. interlaced <code><em>bool</em></code> Is the frame interlaced. keyframe <code><em>bool</em></code> Is the frame intra coded. | Video metadata <pre><span class="p">{</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">60</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"keyframe"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="p">}</span></pre> | |---|---| #### 5.10.4. Worker lifecycle The worker lifecycle consists of three main stages: creation, processing, and termination. The following diagram provides a detailed view of this workflow: The first step is to create the worker by sending a POST request to the appropriate endpoint. If the request is successful, the response contains the location of the created worker (<code>workerURL</code>), which can be used to interact with the worker during its lifecycle. To manage this interaction, two client-side threads are typically used: - **Worker Update Thread**: continuously fetches the worker object from the server, updating its status and packets. The loop continues until an <code>EOF</code> error is returned, indicating that the worker has completed its task. - **User Command Thread (optional)**: processes user commands and forwards them to the worker. Typical commands include <code>stop</code>, <code>pause</code>, and <code>start</code>. Sending such a command will eventually lead to an <code>EOF</code> being returned to the update thread, signaling the end of the worker. ##### 5.10.4.1. Worker Update Thread This thread is responsible for regularly fetching the worker object from the server, processing the returned packets and worker status, and detecting the EndOfStream (<code>EOF</code>) condition. It usually runs concurrently with the main application logic. | **Step by step:** <code>1. Fetch worker update</code> Perform a <code>GET</code> request on the <code>workerURL</code> to retrieve the latest worker object. <code>2. Check for errors</code> - If <code>EOF</code> is returned by the server, signal job completion and exit. - If another error occurs, handle it appropriately (log, retry, etc.). - Otherwise, parse the worker object. <code>3. Process worker information</code> Extract status, progress, and available data packets. **Note:** A <code>completed</code> status may indicate a finished file segment depending on the worker type. <code>4. Process worker packets</code> Loop over packets and process each according to its type. **Tip:** Process asynchronously to avoid blocking the update loop. Release each packet after use with <code>Close()</code>. <code>5. Repeat</code> Return to step 1 until the server returns <code>EOF</code>. | | |---|---| ##### 5.10.4.2. User Command Thread This thread handles user commands and sends them to the worker. It is optional and may not be needed in all applications. Supported commands are: <code>stop</code>, <code>pause</code>, and <code>start</code>. | **Step by step:** <code>1. Wait for command</code> Listen non-blocking for <code>stop</code>, <code>pause</code>, or <code>start</code>. <code>2. Verify and send</code> Ensure the command is valid and POST it to <code>workerURL</code>. <code>3. Check for completion</code> Exit the loop if the <code>stop</code> command is sent, or if a job-done signal is received from the Worker Update Thread. <code>4. Repeat</code> Return to step 1 until termination. | | |---|---| #### 5.10.5. Example 1: fetching audio data with a data worker This example demonstrates how to create an audio data worker, fetch audio packets, and process them using the SDK. The audio data can then be played back or analyzed as needed. Only the Worker Update Thread is used in this example, since the User Command Thread is optional. **Creating an audio data worker** Send the following request to create a data worker for fetching audio from <code>0/hdmi-in/0</code> input: request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/0/hdmi-in/0/data"</span><span class="p">,</span><span class="w"> </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"audio/pcm"</span><span class="p">,</span><span class="w"> </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0/hdmi-in/0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">48000</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> If successful, the server responds with a redirect containing the worker location (<code>workerURL</code>): response (redirect) <pre>redirect: lt310:/client/jobs/VCW90ecK90GwE</pre> The user can now start the Worker Update Thread to fetch and process audio packets. **Fetching worker updates** To fetch updates, send a GET request to the worker URL: request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/client/jobs/VCW90ecK90GwE"</span><span class="w"> </span><span class="p">}</span></pre> Possible outcomes: - <code>null</code>: request successful, worker object returned. - <code>EOF</code>: special error returned by the server indicating EndOfStream - no more packets will be produced. - Any other value: an error occurred while fetching the update. **Processing the worker object** A successful response contains the worker object, including status, packets, and metadata. Example parsed by the SDK: | Worker Object with SDK Packet Object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">595015</span><span class="p">,</span><span class="w"> </span><span class="nl">"length"</span><span class="p">:</span><span class="w"> </span><span class="mi">114240</span><span class="p">,</span><span class="w"> </span><span class="nl">"start"</span><span class="p">:</span><span class="w"> </span><span class="mi">1758272241958140</span><span class="p">,</span><span class="w"> </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"running"</span><span class="p">,</span><span class="w"> </span><span class="nl">"packets"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"Track"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"Media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"audio/pcm"</span><span class="p">,</span><span class="w"> </span><span class="nl">"Signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"locked"</span><span class="p">,</span><span class="w"> </span><span class="nl">"Timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">1758616846077989</span><span class="p">,</span><span class="w"> </span><span class="nl">"Ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"Data"</span><span class="p">:</span><span class="w"> </span><span class="s2">"AAAAAAAAA..."</span><span class="p">,</span><span class="w"> </span><span class="nl">"Meta"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"channels"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="nl">"samplerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">48000</span><span class="p">,</span><span class="w"> </span><span class="nl">"depth"</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="p">,</span><span class="w"> </span><span class="nl">"samples"</span><span class="p">:</span><span class="w"> </span><span class="mi">1020</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | Notes: - <code>"name"</code> and <code>"location"</code> are empty (data worker). - Each packet contains audio data and metadata (channels, sample rate, bit depth, sample count). - <code>"ref"</code> is empty because this is a <code>Packet</code> object, not a <code>SharedPacket</code>. - <code>"data"</code> contains the raw audio samples in bytes. | |---|---| Release each packet with <code>Close()</code> to free resources. Loop back to fetch the next update until the server returns an <code>EOF</code> error. **End of Stream handling** A data worker runs indefinitely until explicitly stopped. To stop it, the client should: - Send a <code>stop</code> command via the User Command Thread (recommended). - Or terminate the application directly (not recommended, may leave resources inconsistent). After receiving <code>stop</code>, the worker finishes processing any remaining data. The client must continue fetching updates until the server returns an <code>EOF</code> error, which signals that the worker has terminated. #### 5.10.6. Example 2: recording a video stream with a file worker This example demonstrates how to create a video file worker to record a video stream from an input source and process worker updates. Only the Worker Update Thread is implemented in this example, as the User Command Thread is optional. **Creating a video file worker** Send the following request to create a file worker for recording video from <code>0/sdi-in/0</code> input with this configuration: - recording format: <code>video/mp4</code> - save files to <code>C:\Users\A\Videos</code> - record 10 seconds, splitting every 5 seconds - other parameters are left to default values. request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"Method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w"> </span><span class="nl">"URL"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/0/sdi-in/0/file"</span><span class="p">,</span><span class="w"> </span><span class="nl">"Body"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/mp4"</span><span class="p">,</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"C:</span><span class="se">\\</span><span class="s2">Users</span><span class="se">\\</span><span class="s2">A</span><span class="se">\\</span><span class="s2">Videos"</span><span class="p">,</span><span class="w"> </span><span class="nl">"duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="nl">"splitSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"splitDuration"</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"extra"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"hw"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"bitrate"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"quality"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"gop"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"codec"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"preset"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span></pre> If successful, the server responds with a redirect containing the worker location (<code>workerURL</code>): response (redirect) <pre>redirect: lt310:/client/jobs/NBCgXxNEOsc</pre> Recording starts immediately. The client can now start the Worker Update Thread to fetch and process packets. **Fetching worker updates** To fetch updates, send a GET request to the worker URL: request <pre><span class="p">{</span><span class="w"> </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GET"</span><span class="p">,</span><span class="w"> </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lt310:/client/jobs/NBCgXxNEOsc"</span><span class="w"> </span><span class="p">}</span></pre> Possible outcomes: - <code>null</code>: request successful, worker object returned. - <code>EOF</code>: special error returned by the server indicating EndOfStream - no more packets will be produced. - Any other value: an error occurred while fetching the update. **Processing the worker object** | Worker Object with SDK Packet Object <pre><span class="p">{</span><span class="w"> </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"VID_20250919_172235_449.mp4"</span><span class="p">,</span><span class="w"> </span><span class="nl">"location"</span><span class="p">:</span><span class="w"> </span><span class="s2">"C:</span><span class="se">\\</span><span class="s2">Users</span><span class="se">\\</span><span class="s2">A</span><span class="se">\\</span><span class="s2">Videos"</span><span class="p">,</span><span class="w"> </span><span class="nl">"start"</span><span class="p">:</span><span class="w"> </span><span class="mi">1758295355449982</span><span class="p">,</span><span class="w"> </span><span class="nl">"duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">640004</span><span class="p">,</span><span class="w"> </span><span class="nl">"length"</span><span class="p">:</span><span class="w"> </span><span class="mi">555098</span><span class="p">,</span><span class="w"> </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"running"</span><span class="p">,</span><span class="w"> </span><span class="nl">"packets"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"Track"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"Media"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/h264"</span><span class="p">,</span><span class="w"> </span><span class="nl">"Signal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"locked"</span><span class="p">,</span><span class="w"> </span><span class="nl">"Timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">1758295356049986</span><span class="p">,</span><span class="w"> </span><span class="nl">"Ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="nl">"Data"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="nl">"Meta"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="mi">1920</span><span class="p">,</span><span class="w"> </span><span class="mi">1080</span><span class="w"> </span><span class="p">],</span><span class="w"> </span><span class="nl">"framerate"</span><span class="p">:</span><span class="w"> </span><span class="mi">60</span><span class="p">,</span><span class="w"> </span><span class="nl">"interlaced"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="nl">"keyframe"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">}</span></pre> | Notes: - <code>"name"</code> and <code>"location"</code> indicate the name and location of the recorded file. When a split occurs, the name will change to reflect the new file (e.g., <code>VID_20250919_172235_450.mp4</code>). - <code>"status"</code> shows <code>running</code> while recording. It changes to <code>completed</code> when the recording duration is reached or just before a split. - Each packet (e.g., track ID <code>"0"</code>) contains video metadata and encoding information such as frame size, framerate, interlacing status, and keyframe status. - <code>"ref"</code> and <code>"data"</code> are empty because the <code>FileWorker</code> provides metadata only, not direct video data. | |---|---| Release each packet with <code>Close()</code> and loop back to fetch the next update until the server returns <code>EOF</code>. **End of Stream handling** This file worker runs for a specified duration and automatically completes the recording. The client should continue fetching updates until the server returns an <code>EOF</code> error, indicating that no more packets will be produced and the worker is terminated. On the final worker object, <code>"status"</code> is typically <code>completed</code>, and <code>"duration"</code> reflects the total recording time. ## 6. Cheatsheet **Agent** | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/**](#agent) | GET | Retrieve the current agent information. | **Board** | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/:board**](#board_object) | GET | Retrieve information about the board installed in the host system. | **HDMI Input** | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/:board/hdmi-in/:id**](#hdmi-in_object) | GET | Retrieve the current HDMI Input information. | | [**/:board/hdmi-in/:id/data**](#worker_full) | POST | Retrieve raw data from the HDMI Input. | | [**/:board/hdmi-in/:id/file**](#worker_full) | POST | Retrieve a file from the HDMI Input. | | [**/:board/hdmi-in/:id/edid**](#edid_object) | GET, POST | Retrieve or set the EDID data for the HDMI Input. | **SDI Input** | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/:board/sdi-in/:id**](#sdi-in_object) | GET | Retrieve the current SDI Input information. | | [**/:board/sdi-in/:id/data**](#worker_full) | POST | Retrieve raw data from the SDI Input. | | [**/:board/sdi-in/:id/file**](#worker_full) | POST | Retrieve a file from the SDI Input. | **HDMI Output** | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/:board/hdmi-out/:id**](#hdmi-out) | GET, POST | Retrieve or configure the specified hdmi-out. | **Canvas** | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/canvas/:id**](#canvas_object) | GET | canvas **:id** configuration. | | [**/canvas/:id/data**](#worker_full) | POST | Data stream | | [**/canvas/:id/file**](#worker_full) | POST | File recording | | **Endpoint** | **Method** | **Description** | |---|---|---| | [**/canvas/:id/init**](#canvas_init) | POST | Initialize the canvas. | | [**/canvas/:id/text**](#canvas_text) | POST | Draw text on the canvas. | | [**/canvas/:id/line**](#canvas_line) | POST | Draw a line on the canvas. | | [**/canvas/:id/ellipse**](#canvas_ellipse) | POST | Draw an ellipse on the canvas. | | [**/canvas/:id/rectangle**](#canvas_rectangle) | POST | Draw a rectangle on the canvas. | | [**/canvas/:id/image**](#canvas_image) | POST | Put an image on the canvas. | | [**/canvas/:id/video**](#canvas_video) | POST | Put a video on the canvas. | | [**/canvas/:id/clear**](#canvas_clear) | POST | Clear a canvas area or a source. | | [**/canvas/:id/op**](#canvas_op) | POST | Perform a single draw operation on the canvas. | | [**/canvas/:id/ops**](#canvas_ops) | POST | Perform multiple draw operations on the canvas. | ## 7. Changelog <pre><span class="gh"># 1.4.0 (28/11/2025):</span> <span class="p">-</span> Add NV12 native support <span class="p">-</span> Add audio recording <span class="p">-</span> Add 2K DCI resolution support <span class="p">-</span> Improve audio acquisition <span class="p">-</span> Improve QoS <span class="p">-</span> Improve HDMI input <span class="p">-</span> Improve SDK clients & examples <span class="p">-</span> Update documentation <span class="gh"># 1.3.1 (25/08/2025):</span> <span class="p">-</span> Add audio/video player example (Go & C++) <span class="p">-</span> Improve audio fetching <span class="gh"># 1.3.0 (29/04/2025):</span> <span class="p">-</span> Add HEVC codec options <span class="p">-</span> Add interlace support <span class="p">-</span> Add python client <span class="p">-</span> Add video encoder parameters <span class="p">-</span> Improve agent reliability <span class="p">-</span> Improve canvas <span class="p">-</span> Improve HDMI output <span class="p">-</span> Improve overlay performance <span class="p">-</span> Minor fixes <span class="p">-</span> Hardware acceleration on Linux currently works only with Intel QSV (Quick Sync Video) <span class="gh"># 1.2.0 (18/12/2024):</span> <span class="p">-</span> Improve DirectShow filters <span class="p">-</span> Update sdk <span class="p">-</span> Change boards EDID <span class="p">-</span> Minor fixes <span class="gh"># 1.1.0 (27/09/2024):</span> <span class="p">-</span> Add DirectShow audio <span class="gh"># 1.0.0 (10/07/2024):</span> <span class="p">-</span> First official release</pre> Version 1.4.0 --- ### [Enciris and Competitors: A Frame Grabber Comparison Guide](https://www.enciris.com/enciris-and-competitors-a-frame-grabber-comparison-guide/) **Published:** February 10, 2026 **Author:** Luke Montgomery **Content:** Frame Grabber Vendor Comparison # Frame Grabber Vendor Comparison Discover and compare leading frame grabber manufacturers for machine vision, medical, and industrial applications. To help you make an informed decision, we highlight unique features, certifications, and pricing. Furthermore, you will find that each vendor’s strengths and differences are clearly presented. As a result, you can quickly identify the best fit for your needs. In addition, you can use the comparison tool below to see vendors side by side. ## Why Use This Comparison? Choosing the right frame grabber can be challenging. Therefore, this page provides a side-by-side comparison of top vendors, highlighting their unique selling points and available price ranges. As a result, you can quickly find the best solution for your imaging needs. Moreover, you can expand each card for detailed specifications. In addition, the layout is designed for clarity and ease of use, so you can focus on what matters most. Euresys S.A. Manufactured: Belgium ![Belgium](https://flagcdn.com/be.svg "Belgium") CE FCC RoHS ![Euresys S.A. image](https://logo.clearbit.com/euresys.com) Key Features ✓ 4K Support ✓ FPGA-based ✓ API/SDK ✓ External Grabber ✓ CoaXPress ✓ Camera Link ✓ GigE Vision ✓ Medical/Industrial ✓ Low Latency ✓ Software Bundle ✓ GenICam Not Included ✗ Long Term Avail. ✗ PoE Reliable and versatile frame grabbers (Coaxlink, Grablink) from Euresys excel in computer and machine vision. In addition, they are designed for high-speed image acquisition, factory automation, and medical imaging. As a result, users benefit from both performance and flexibility. Moreover, Euresys provides comprehensive support and a wide product range. Price: $1,995.00 Show Detailed Specs - **Max Resolution:** 4K (3840×2160) - **Color Depth:** 8/10-bit - **Inputs:** Camera Link, CoaXPress, GigE Vision - **Outputs:** HDMI, SDI, USB 3.0 - **Supported OS:** Windows, Linux - **API/SDK:** C/C++, .NET, GenICam - **Board Size:** 100 x 75 mm - **Power:** 6W (typical) - **Compliance:** CE, FCC, RoHS Source: [Euresys Frame Grabbers](https://www.euresys.com/Products/Frame-Grabbers) Kaya Instruments Manufactured: Israel ![Israel](https://flagcdn.com/il.svg "Israel") CE FCC RoHS ![Kaya Instruments image](https://logo.clearbit.com/kayainstruments.com) Key Features ✓ 4K Support ✓ FPGA-based ✓ API/SDK ✓ External Grabber ✓ CoaXPress ✓ Medical/Industrial Not Included ✗ Camera Link ✗ GigE Vision ✗ Long Term Avail. ✗ PoE Kaya Instruments specializes in high-performance CoaXPress frame grabbers. Therefore, they are ideal for industrial, defense, and aerospace applications. Furthermore, their solutions are engineered for demanding environments. As a result, users can expect reliability and speed in mission-critical tasks. Price: £2,000 (Komodo II 4CH) Show Detailed Specs - **Max Resolution:** 4K (3840×2160) - **Color Depth:** 8/10-bit - **Inputs:** CoaXPress - **Outputs:** HDMI, SDI, USB 3.0 - **Supported OS:** Windows, Linux - **API/SDK:** C/C++, .NET, GenICam - **Board Size:** 100 x 75 mm - **Power:** 5W (typical) - **Compliance:** CE, FCC, RoHS Source: [Kaya Instruments Frame Grabbers](https://www.kayainstruments.com/frame-grabbers/) Enciris Technologies Manufactured: France ![France](https://flagcdn.com/fr.svg "France") CE FCC RoHS Key Features ✓ 4K Support ✓ FPGA-based ✓ API/SDK ✓ Camera Link ✓ Medical/Industrial ✓ Long Term Avail. ✓ Low Latency ✓ Software Bundle ✓ External Grabber ✓ CoaXPress Not Included ✗ GenICam ✗ GigE Vision ✗ PoE The LT-300 Series offers versatile, low-latency video processing. It supports frame grabbing, overlay, PiP, and quad display. Because it is FPGA-based and provides an extensive API/SDK, you can achieve up to 4K60, 10-bit, and high reliability. With 12+ years LTA, it is built in France for demanding applications. Furthermore, its robust compliance ensures suitability for both medical and industrial environments. Consequently, Enciris stands out for long-term availability and advanced features. Price: Quote Show Detailed Specs - **Max Resolution:** 4K (3840×2160) - **Color Depth:** 10-bit - **Inputs:** HDMI 2.0, SDI (option) - **Outputs:** HDMI, SDI, USB 3.0 (option) - **Supported OS:** Windows, Linux - **API/SDK:** C#/C++, Python, Golang - **Board Size:** 110 x 70 mm - **Power:** 7W (typical) - **Compliance:** CE, FCC, RoHS Source: [Enciris Technologies](https://www.enciris.com/products/) Matrox Imaging (Zebra) Manufactured: Canada ![Canada](https://flagcdn.com/ca.svg "Canada") CE FCC RoHS ![Matrox Imaging image](https://logo.clearbit.com/matrox.com) Key Features ✓ 4K Support ✓ FPGA-based ✓ API/SDK ✓ Camera Link ✓ Medical/Industrial ✓ Long Term Avail. ✓ Low Latency ✓ Software Bundle ✓ GenICam Not Included ✗ External Grabber ✗ CoaXPress ✗ GigE Vision ✗ PoE Matrox Imaging offers an extensive range of frame grabbers (Rapixo CXP/CL Pro). In particular, they provide FPGA offload and engineering expertise for complex applications. Consequently, users benefit from both performance and technical support. Moreover, their products are trusted in a variety of industries. Price: $1,160–$3,495 (Rapixo CXP series) Show Detailed Specs - **Max Resolution:** 4K (3840×2160) - **Color Depth:** 8/10-bit - **Inputs:** Camera Link, CoaXPress, GigE Vision - **Outputs:** HDMI, SDI, USB 3.0 - **Supported OS:** Windows, Linux - **API/SDK:** C/C++, .NET, GenICam - **Board Size:** 100 x 75 mm - **Power:** 6W (typical) - **Compliance:** CE, FCC, RoHS Source: [Matrox Imaging Frame Grabbers](https://www.matrox.com/en/imaging/products/frame-grabbers) Pleora Technologies Manufactured: Canada ![Canada](https://flagcdn.com/ca.svg "Canada") CE FCC RoHS ![Pleora Technologies image](https://logo.clearbit.com/pleora.com) Key Features ✓ 4K Support ✓ FPGA-based ✓ API/SDK ✓ External Grabber ✓ CoaXPress ✓ Camera Link ✓ GigE Vision ✓ Medical/Industrial ✓ Low Latency ✓ Software Bundle ✓ GenICam Not Included ✗ Long Term Avail. ✗ PoE Pleora Technologies specializes in real-time video connectivity. Their external frame grabbers (iPORT CL-Ten) are known for low-latency and are targeted at industrial and medical applications. In addition, their solutions are designed for seamless integration. As a result, users experience reliable performance and easy deployment. Price: $2,850–$3,225 Show Detailed Specs - **Max Resolution:** 4K (3840×2160) - **Color Depth:** 8/10-bit - **Inputs:** Camera Link, CoaXPress, GigE Vision - **Outputs:** HDMI, SDI, USB 3.0 - **Supported OS:** Windows, Linux - **API/SDK:** C/C++, .NET, GenICam - **Board Size:** 100 x 75 mm - **Power:** 6W (typical) - **Compliance:** CE, FCC, RoHS Source: [Pleora Frame Grabbers](https://www.pleora.com/products/frame-grabbers/) ADLINK Technology Manufactured: Taiwan ![Taiwan](https://flagcdn.com/tw.svg "Taiwan") CE FCC RoHS ![ADLINK Technology image](https://logo.clearbit.com/adlinktech.com) Key Features ✓ 4K Support ✓ FPGA-based ✓ API/SDK ✓ GigE Vision ✓ Medical/Industrial ✓ PoE Not Included ✗ External Grabber ✗ CoaXPress ✗ Camera Link ✗ Long Term Avail. ADLINK Technology offers GigE Vision frame grabbers (PCIe-GIE7x PRO) that are reliable and high-speed. In fact, they are marketed as half the price of competing FPGA GigE grabbers, with PoE protection. Therefore, customers seeking value and performance may find ADLINK especially attractive. Furthermore, their products are supported globally. Price: Quote (marketed as half price of competitors) Show Detailed Specs - **Max Resolution:** 4K (3840×2160) - **Color Depth:** 8/10-bit - **Inputs:** GigE Vision - **Outputs:** HDMI, SDI, USB 3.0 - **Supported OS:** Windows, Linux - **API/SDK:** C/C++, .NET, GenICam - **Board Size:** 100 x 75 mm - **Power:** 5W (typical) - **Compliance:** CE, FCC, RoHS Source: [ADLINK Frame Grabbers](https://www.adlinktech.com/en/index.aspx) Active Silicon Manufactured: United Kingdom ![United Kingdom](https://flagcdn.com/gb.svg "United Kingdom") CE FCC RoHS ![Active Silicon image](https://logo.clearbit.com/activesilicon.com) Key Features ✓ 4K Support ✓ FPGA-based ✓ API/SDK ✓ CoaXPress ✗ Camera Link Not Included ✗ Camera Link ✗ GigE Vision ✗ Long Term Avail. ✗ PoE Active Silicon’s FireBird CoaXPress frame grabbers are cost-effective and low-profile. In particular, they feature ActiveDMA for zero CPU intervention and are suitable for various industrial applications. As a result, users benefit from both efficiency and affordability. Moreover, their compact design allows for easy integration. Price: Cost-effective (Quote) Show Detailed Specs - **Max Resolution:** 4K (3840×2160) - **Color Depth:** 8/10-bit - **Inputs:** CoaXPress - **Outputs:** HDMI, SDI, USB 3.0 - **Supported OS:** Windows, Linux - **API/SDK:** C/C++, .NET, GenICam - **Board Size:** 100 x 75 mm - **Power:** 5W (typical) - **Compliance:** CE, FCC, RoHS Source: [Active Silicon FireBird CoaXPress](https://www.activesilicon.com/products/frame-grabbers/) BitFlow Manufactured: United States ![United States](https://flagcdn.com/us.svg "United States") CE FCC (unverified) RoHS ![BitFlow image](https://logo.clearbit.com/bitflow.com) Key Features ✓ 4K Support ✓ FPGA-based ✓ API/SDK ✓ Camera Link ✓ CoaXPress ✓ Medical/Industrial ✗ Long Term Avail. Not Included ✗ Long Term Avail. ✗ PoE BitFlow provides frame grabbers designed for high data and frame rates. In addition, they offer complex triggering and easy-to-use software, making them suitable for various imaging applications. Consequently, users can expect both speed and flexibility. Furthermore, BitFlow is recognized for its innovative approach. Price: Quote Show Detailed Specs - **Max Resolution:** 4K (3840×2160) - **Color Depth:** 8/10-bit - **Inputs:** Camera Link, CoaXPress, GigE Vision - **Outputs:** HDMI, SDI, USB 3.0 - **Supported OS:** Windows, Linux - **API/SDK:** C/C++, .NET, GenICam - **Board Size:** 100 x 75 mm - **Power:** 6W (typical) - **Compliance:** CE, FCC, RoHS Source: [BitFlow Frame Grabbers](https://www.bitflow.com/) Teledyne DALSA Manufactured: Canada ![Canada](https://flagcdn.com/ca.svg "Canada") CE FCC RoHS ![Teledyne DALSA image](https://logo.clearbit.com/teledynedalsa.com) Key Features ✓ 4K Support ✓ FPGA-based ✓ API/SDK ✓ CoaXPress ✓ Camera Link ✓ Medical/Industrial ✗ Long Term Avail. Not Included ✗ Long Term Avail. ✗ PoE Teledyne DALSA’s Xtium series supports CoaXPress and Camera Link. In addition, they are known for high speed, reliability, and robust synchronization features. As a result, users benefit from consistent performance in demanding applications. Moreover, Teledyne DALSA is a trusted name in the industry. Price: Quote Show Detailed Specs - **Inputs:** Camera Link, CoaXPress - **Outputs:** PCIe, HDMI Source: [Teledyne DALSA Frame Grabbers](https://www.teledynedalsa.com/en/home/) Advantech Manufactured: Taiwan ![Taiwan](https://flagcdn.com/tw.svg "Taiwan") CE FCC RoHS ![Advantech image](https://logo.clearbit.com/advantech.com) Key Features ✓ 4K Support ✓ FPGA-based ✓ API/SDK ✓ Medical/Industrial Not Included ✗ External Grabber ✗ CoaXPress ✗ Camera Link ✗ GigE Vision ✗ Long Term Avail. ✗ PoE Advantech provides IoT and embedded platforms. Their frame grabbers are designed for industrial automation and AI/big data integration. In addition, Advantech emphasizes innovation and connectivity. As a result, their products are well-suited for modern, data-driven environments. Furthermore, they offer global support and integration services. Price: Quote Show Detailed Specs - **Max Resolution:** 4K (3840×2160) - **Color Depth:** 8/10-bit - **Inputs:** Camera Link, CoaXPress, GigE Vision - **Outputs:** HDMI, SDI, USB 3.0 - **Supported OS:** Windows, Linux - **API/SDK:** C/C++, .NET, GenICam - **Board Size:** 100 x 75 mm - **Power:** 6W (typical) - **Compliance:** CE, FCC, RoHS Source: [Advantech Frame Grabbers](https://www.advantech.com/en-eu) --- ### [Accessibility statement](https://www.enciris.com/accessibility-statement/) **Published:** January 5, 2026 **Author:** Luke Montgomery **Content:** ###### Accessibility Statement for https://enciris.com **Enciris Technologies** is committed to ensuring digital accessibility for people with disabilities. We are continually improving the user experience for everyone and applying the relevant accessibility standards. ###### Conformance status The Web Content Accessibility Guidelines (WCAG) defines requirements for designers and developers to improve accessibility for people with disabilities. It defines three levels of conformance: Level A, Level AA, and Level AAA. **Enciris Technologies** is making constant efforts to improve the accessibility of its site and services in the belief that it is our collective moral obligation to allow seamless, accessible, and unhindered use for those of us with disabilities. We aim to make all pages and content on **https://enciris.com** accessible, but some content may not yet fully meet the highest accessibility standards. This could be due to challenges in identifying the most suitable technological solution. We may revise this Statement periodically to reflect improvements or changes to our accessibility practices. ###### Feedback We welcome your feedback on the accessibility of **Enciris Technologies** website. Please let us know if you encounter accessibility barriers on our website: E-mail: **sales@enciris.com** We try to respond to feedback within 3–5 business days. This statement was created on 1/5/2026. --- ## Products ### [LT-101](https://www.enciris.com/products/lt-101/) **Published:** July 15, 2026 **Author:** Guillaume Bussat **Product Series:** LT-100 Series --- ### [LT-102](https://www.enciris.com/products/lt-102/) **Published:** July 16, 2026 **Author:** Guillaume Bussat **Product Series:** LT-100 Series --- ### [CV-420](https://www.enciris.com/products/cv-420/) **Published:** July 15, 2026 **Author:** Guillaume Bussat **Product Series:** CV-400 Series --- ### [CV-440](https://www.enciris.com/products/cv-440/) **Published:** July 15, 2026 **Author:** Guillaume Bussat **Product Series:** CV-400 Series --- ### [LT-124](https://www.enciris.com/products/lt-124/) **Published:** July 16, 2026 **Author:** Guillaume Bussat **Product Series:** LT-100 Series --- ### [LT-122](https://www.enciris.com/products/lt-122/) **Published:** July 16, 2026 **Author:** Guillaume Bussat **Product Series:** LT-100 Series --- ### [LT-313](https://www.enciris.com/products/lt-313/) **Published:** July 15, 2026 **Author:** Guillaume Bussat **Product Series:** LT-300 Series --- ### [LT-312](https://www.enciris.com/products/lt-312/) **Published:** July 15, 2026 **Author:** Guillaume Bussat **Product Series:** LT-300 Series --- ### [LT-311](https://www.enciris.com/products/lt-311/) **Published:** July 15, 2026 **Author:** Guillaume Bussat **Product Series:** LT-300 Series ---