# Architecture and features

The video software stack consists of a client application that interacts with the Adreno VPU using the V4L2 framework. The following figures show the video software architecture for decoder and encoder.

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->

<!-- Generated by Microsoft Visio, SVG Export Video decoder and encoder sw architecture.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="17.8264in" height="8.02257in" viewbox="0 0 1283.5 577.625" xml:space="preserve" color-interpolation-filters="sRGB" class="st23"><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(0):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { fill: #f7f8fa; stroke: #c8c8c8; stroke-width: 0.25 }
.svg-1 .st2 { fill: #acbacf; stroke: #666666; stroke-width: 0.25 }
.svg-1 .st3 { fill: #000000; font-family: Arial; font-size: 1.00001em }
.svg-1 .st4 { fill: #3253dc; stroke: #3253dc; stroke-width: 0.25 }
.svg-1 .st5 { fill: #ffffff; font-family: Arial; font-size: 1.00001em }
.svg-1 .st6 { stroke: #000000; stroke-dasharray: 7, 5; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st7 { fill: none; stroke: none; stroke-width: 0.25 }
.svg-1 .st8 { fill: #000000; font-family: Arial; font-size: 0.833336em; font-weight: bold }
.svg-1 .st9 { fill: none; stroke: #000000; stroke-width: 0.25 }
.svg-1 .st10 { fill: #ffffff; font-family: Arial; font-size: 0.833336em }
.svg-1 .st11 { font-size: 1em }
.svg-1 .st12 { marker-end: url("#mrkr4-41"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st13 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.28409090909091 }
.svg-1 .st14 { fill: #ffffff; stroke: none; stroke-linecap: butt; stroke-width: 7.2 }
.svg-1 .st15 { fill: #000000; font-family: Arial; font-size: 0.75em }
.svg-1 .st16 { fill: #ffffff; stroke: none; stroke-linecap: butt }
.svg-1 .st17 { font-size: 0.888885em }
.svg-1 .st18 { marker-start: url("#mrkr4-64"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st19 { fill: #acbacf; stroke: #000000; stroke-width: 0.25 }
.svg-1 .st20 { fill: #000000; font-family: Arial; font-size: 0.833336em }
.svg-1 .st21 { fill: #ffffff; stroke: #666666; stroke-width: 0.25 }
.svg-1 .st22 { fill: #f7f8fa; font-family: Arial; font-size: 0.75em }
.svg-1 .st23 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-41" class="st13" v:arrowtype="4" v:arrowsize="2" v:setback="7.04" refx="-7.04" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-3.52,-3.52) "></use>	</marker>	<marker id="mrkr4-64" class="st13" v:arrowtype="4" v:arrowsize="2" v:setback="6.68" refx="6.68" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(3.52) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<v:userdefs>		<v:ud v:nameu="msvThemeOrder" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="0" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<v:layer v:name="Flowchart" v:index="1"></v:layer>	<g id="shape73-1" v:mid="73" v:groupcontext="shape" transform="translate(651.688,-9)">		<title>Sheet.73</title>		<rect x="0" y="14" width="626.312" height="563.625" class="st1"></rect>	</g>	<g id="shape72-3" v:mid="72" v:groupcontext="shape" transform="translate(18.5625,-10.1433)">		<title>Sheet.72</title>		<rect x="0" y="16.2865" width="626.312" height="561.338" class="st1"></rect>	</g>	<g id="shape1-5" v:mid="1" v:groupcontext="shape" transform="translate(64,-504.25)">		<title>Sheet.1</title>		<desc>Applications (V4L2, GStreamer)</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="180" cy="550.625" width="360.01" height="54"></v:textrect>		<rect x="0" y="523.625" width="360" height="54" rx="9" ry="9" class="st2"></rect>		<text x="95.3" y="554.23" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Applications (V4L2, GStreamer)</text>		</g>	<g id="shape2-8" v:mid="2" v:groupcontext="shape" transform="translate(64,-288.25)">		<title>Sheet.2</title>		<desc>V4L2 framework</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="180" cy="550.625" width="360.01" height="54"></v:textrect>		<rect x="0" y="523.625" width="360" height="54" rx="9" ry="9" class="st2"></rect>		<text x="136.31" y="554.23" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>V4L2 framework</text>		</g>	<g id="shape3-11" v:mid="3" v:groupcontext="shape" transform="translate(64,-162.25)">		<title>Sheet.3</title>		<desc>Adreno VPU driver</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="180" cy="550.625" width="360.01" height="54"></v:textrect>		<rect x="0" y="523.625" width="360" height="54" rx="9" ry="9" class="st4"></rect>		<text x="129.98" y="554.23" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Adreno VPU driver</text>		</g>	<g id="shape4-14" v:mid="4" v:groupcontext="shape" transform="translate(64,-36.25)">		<title>Sheet.4</title>		<desc>Adreno VPU</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="180" cy="550.625" width="360.01" height="54"></v:textrect>		<rect x="0" y="523.625" width="360" height="54" rx="9" ry="9" class="st4"></rect>		<text x="146.65" y="554.23" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Adreno VPU</text>		</g>	<g id="shape6-17" v:mid="6" v:groupcontext="shape" transform="translate(18.5,-371.5)">		<title>Sheet.6</title>		<path d="M0 577.63 L585.5 577.63" class="st6"></path>	</g>	<g id="shape7-20" v:mid="7" v:groupcontext="shape" transform="translate(18.5,-144.25)">		<title>Sheet.7</title>		<path d="M0 577.63 L585.5 577.63" class="st6"></path>	</g>	<g id="shape8-23" v:mid="8" v:groupcontext="shape" transform="translate(523,-371.5)">		<title>Sheet.8</title>		<desc>User space</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="40.5" cy="568.625" width="81" height="18"></v:textrect>		<rect x="0" y="559.625" width="81" height="18" class="st7"></rect>		<text x="13.82" y="571.63" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>User space</text>		</g>	<g id="shape9-26" v:mid="9" v:groupcontext="shape" transform="translate(523,-146.5)">		<title>Sheet.9</title>		<desc>Kernel space</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="40.5" cy="568.625" width="81" height="18"></v:textrect>		<rect x="0" y="559.625" width="81" height="18" class="st7"></rect>		<text x="9.37" y="571.63" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Kernel space</text>		</g>	<g id="shape10-29" v:mid="10" v:groupcontext="shape" transform="translate(520.75,-124)">		<title>Sheet.10</title>		<desc>Hardware</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="40.5" cy="568.625" width="81" height="18"></v:textrect>		<rect x="0" y="559.625" width="81" height="18" class="st7"></rect>		<text x="17.71" y="571.63" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hardware</text>		</g>	<g id="shape11-32" v:mid="11" v:groupcontext="shape" transform="translate(338.5,-45.25)">		<title>Sheet.11</title>		<desc>Adreno VPU firmware</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="40.5" cy="559.625" width="81" height="36"></v:textrect>		<rect x="0" y="541.625" width="81" height="36" rx="9" ry="9" class="st9"></rect>		<text x="12.71" y="556.62" class="st10" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Adreno VPU <tspan x="21.33" dy="1.2em" class="st11">firmware</tspan></text>		</g>	<g id="shape26-36" v:mid="26" v:groupcontext="shape" transform="translate(785.625,73.375) rotate(90)">		<title>Sheet.26</title>		<desc>Bitstream buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="81" cy="577.625" width="162.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M0 577.63 L154.96 577.63" class="st12"></path>		<rect v:rectcontext="textBkgnd" x="-609.386" y="75.5999" width="63.5229" height="10.7998" transform="rotate(-90)" class="st14"></rect>		<text x="-609.39" y="83.7" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Bitstream buffer</text>		</g>	<g id="shape27-44" v:mid="27" v:groupcontext="shape" transform="translate(785.625,289.375) rotate(90)">		<title>Sheet.27</title>		<desc>Bitstream buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="36" cy="577.625" width="72.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M0 577.63 L64.96 577.63" class="st12"></path>		<rect v:rectcontext="textBkgnd" x="-609.386" y="30.5999" width="63.5229" height="10.7998" transform="rotate(-90)" class="st14"></rect>		<text x="-609.39" y="38.7" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Bitstream buffer</text>		</g>	<g id="shape28-51" v:mid="28" v:groupcontext="shape" transform="translate(785.625,415.375) rotate(90)">		<title>Sheet.28</title>		<desc>Bitstream buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="36" cy="577.625" width="72.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M0 577.63 L64.96 577.63" class="st12"></path>		<rect v:rectcontext="textBkgnd" x="-608.108" y="30.5999" width="60.9656" height="10.7998" transform="rotate(-90)" class="st16"></rect>		<text x="-608.11" y="38.7" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Bitstream <tspan class="st17">buffer</tspan></text>		</g>	<g id="shape29-59" v:mid="29" v:groupcontext="shape" transform="translate(893.625,73.375) rotate(90)">		<title>Sheet.29</title>		<desc>YUV buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="81" cy="577.625" width="162.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M6.68 577.63 L7.04 577.63 L162 577.63" class="st18"></path>		<rect v:rectcontext="textBkgnd" x="-599.635" y="75.5999" width="44.02" height="10.7998" transform="rotate(-90)" class="st14"></rect>		<text x="-599.64" y="83.7" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>YUV buffer</text>		</g>	<g id="shape30-67" v:mid="30" v:groupcontext="shape" transform="translate(893.625,289.375) rotate(90)">		<title>Sheet.30</title>		<desc>YUV buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="36" cy="577.625" width="72.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M6.68 577.63 L7.04 577.63 L72 577.63" class="st18"></path>		<rect v:rectcontext="textBkgnd" x="-599.635" y="30.5999" width="44.02" height="10.7998" transform="rotate(-90)" class="st14"></rect>		<text x="-599.64" y="38.7" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>YUV buffer</text>		</g>	<g id="shape31-74" v:mid="31" v:groupcontext="shape" transform="translate(893.625,415.375) rotate(90)">		<title>Sheet.31</title>		<desc>YUV buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="36" cy="577.625" width="72.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M6.68 577.63 L7.04 577.63 L72 577.63" class="st18"></path>		<rect v:rectcontext="textBkgnd" x="-599.635" y="30.5999" width="44.02" height="10.7998" transform="rotate(-90)" class="st14"></rect>		<text x="-599.64" y="38.7" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>YUV buffer</text>		</g>	<g id="shape33-81" v:mid="33" v:groupcontext="shape" transform="translate(64,-441.25)">		<title>Sheet.33</title>		<desc>Demuxer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="40.5" cy="568.625" width="81" height="18"></v:textrect>		<rect x="0" y="559.625" width="81" height="18" rx="9" ry="9" class="st19"></rect>		<text x="20.22" y="571.63" class="st20" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Demuxer</text>		</g>	<g id="shape34-84" v:mid="34" v:groupcontext="shape" transform="translate(64,-378.25)">		<title>Sheet.34</title>		<desc>FileSource</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="40.5" cy="568.625" width="81" height="18"></v:textrect>		<rect x="0" y="559.625" width="81" height="18" rx="9" ry="9" class="st9"></rect>		<text x="16.6" y="571.63" class="st20" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>FileSource</text>		</g>	<g id="shape35-87" v:mid="35" v:groupcontext="shape" transform="translate(496,-504.25)">		<title>Sheet.35</title>		<desc>Display</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="67.5" cy="550.625" width="135.01" height="54"></v:textrect>		<rect x="0" y="523.625" width="135" height="54" rx="9" ry="9" class="st21"></rect>		<text x="47.83" y="554.23" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Display</text>		</g>	<g id="shape36-90" v:mid="36" v:groupcontext="shape" transform="translate(424,-531.25)">		<title>Sheet.36</title>		<desc>YUV buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="36" cy="577.625" width="72.01" height="0"></v:textrect>		<path d="M0 577.63 L64.96 577.63" class="st12"></path>		<rect v:rectcontext="textBkgnd" x="13.99" y="572.225" width="44.02" height="10.7998" class="st14"></rect>		<text x="13.99" y="580.32" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>YUV buffer</text>		</g>	<g id="shape39-97" v:mid="39" v:groupcontext="shape" transform="translate(677.625,73.375) rotate(90)">		<title>Sheet.39</title>		<desc>Bitstream buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="22.5" cy="577.625" width="45.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M6.68 577.63 L7.04 577.63 L45 577.63" class="st18"></path>		<rect v:rectcontext="textBkgnd" x="-596.629" y="11.7002" width="38.0083" height="21.5997" transform="rotate(-90)" class="st14"></rect>		<text x="-596.63" y="19.8" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Bitstream <tspan x="-589.13" dy="1.2em" class="st11">buffer</tspan></text>		</g>	<g id="shape44-105" v:mid="44" v:groupcontext="shape" transform="translate(677.625,136.375) rotate(90)">		<title>Sheet.44</title>		<desc>Container file</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="22.5" cy="577.625" width="45.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M6.68 577.63 L7.04 577.63 L45 577.63" class="st18"></path>		<rect v:rectcontext="textBkgnd" x="-597.137" y="11.7002" width="39.0234" height="21.5997" transform="rotate(-90)" class="st14"></rect>		<text x="-597.14" y="19.8" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Container <tspan x="-583.38" dy="1.2em" class="st11">file</tspan></text>		</g>	<g id="shape48-113" v:mid="48" v:groupcontext="shape" transform="translate(673.5,-505.375)">		<title>Sheet.48</title>		<desc>Applications (V4L2, GStreamer)</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="180" cy="550.625" width="360.01" height="54"></v:textrect>		<rect x="0" y="523.625" width="360" height="54" rx="9" ry="9" class="st2"></rect>		<text x="95.3" y="554.23" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Applications (V4L2, GStreamer)</text>		</g>	<g id="shape49-116" v:mid="49" v:groupcontext="shape" transform="translate(673.5,-288.25)">		<title>Sheet.49</title>		<desc>V4L2 framework</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="180" cy="550.625" width="360.01" height="54"></v:textrect>		<rect x="0" y="523.625" width="360" height="54" rx="9" ry="9" class="st2"></rect>		<text x="136.31" y="554.23" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>V4L2 framework</text>		</g>	<g id="shape50-119" v:mid="50" v:groupcontext="shape" transform="translate(673.5,-162.25)">		<title>Sheet.50</title>		<desc>Adreno VPU driver</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="180" cy="550.625" width="360.01" height="54"></v:textrect>		<rect x="0" y="523.625" width="360" height="54" rx="9" ry="9" class="st4"></rect>		<text x="129.98" y="554.23" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Adreno VPU driver</text>		</g>	<g id="shape51-122" v:mid="51" v:groupcontext="shape" transform="translate(673.5,-36.25)">		<title>Sheet.51</title>		<desc>Adreno VPU</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="180" cy="550.625" width="360.01" height="54"></v:textrect>		<rect x="0" y="523.625" width="360" height="54" rx="9" ry="9" class="st4"></rect>		<text x="146.65" y="554.23" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Adreno VPU</text>		</g>	<g id="shape52-125" v:mid="52" v:groupcontext="shape" transform="translate(659.5,-371.5)">		<title>Sheet.52</title>		<path d="M0 577.63 L578.75 577.63" class="st6"></path>	</g>	<g id="shape53-128" v:mid="53" v:groupcontext="shape" transform="translate(659.5,-145.375)">		<title>Sheet.53</title>		<path d="M0 577.63 L578.75 577.63" class="st6"></path>	</g>	<g id="shape54-131" v:mid="54" v:groupcontext="shape" transform="translate(1157.25,-371.5)">		<title>Sheet.54</title>		<desc>User space</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="40.5" cy="568.625" width="81" height="18"></v:textrect>		<rect x="0" y="559.625" width="81" height="18" class="st7"></rect>		<text x="13.82" y="571.63" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>User space</text>		</g>	<g id="shape55-134" v:mid="55" v:groupcontext="shape" transform="translate(1157.25,-145.375)">		<title>Sheet.55</title>		<desc>Kernel space</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="40.5" cy="568.625" width="81" height="18"></v:textrect>		<rect x="0" y="559.625" width="81" height="18" class="st7"></rect>		<text x="9.37" y="571.63" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Kernel space</text>		</g>	<g id="shape56-137" v:mid="56" v:groupcontext="shape" transform="translate(1159.5,-126.25)">		<title>Sheet.56</title>		<desc>Hardware</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="40.5" cy="568.625" width="81" height="18"></v:textrect>		<rect x="0" y="559.625" width="81" height="18" class="st7"></rect>		<text x="17.71" y="571.63" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hardware</text>		</g>	<g id="shape57-140" v:mid="57" v:groupcontext="shape" transform="translate(948,-45.25)">		<title>Sheet.57</title>		<desc>Adreno VPU firmware</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="40.5" cy="559.625" width="81" height="36"></v:textrect>		<rect x="0" y="541.625" width="81" height="36" rx="9" ry="9" class="st9"></rect>		<text x="12.71" y="556.62" class="st10" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Adreno VPU <tspan x="21.33" dy="1.2em" class="st11">firmware</tspan></text>		</g>	<g id="shape58-144" v:mid="58" v:groupcontext="shape" transform="translate(1193.25,-18.25)">		<title>Sheet.58</title>		<rect x="0" y="559.625" width="63" height="18" rx="9" ry="9" class="st2"></rect>	</g>	<g id="shape59-146" v:mid="59" v:groupcontext="shape" transform="translate(1116.75,-18.5)">		<title>Sheet.59</title>		<rect x="0" y="559.625" width="63" height="18" rx="9" ry="9" class="st4"></rect>	</g>	<g id="shape60-148" v:mid="60" v:groupcontext="shape" transform="translate(1116.5,-18.25)">		<title>Sheet.60</title>		<desc>Qualcomm</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="31.5" cy="568.625" width="63" height="18"></v:textrect>		<rect x="0" y="559.625" width="63" height="18" class="st7"></rect>		<text x="9.74" y="571.32" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Qualcomm</text>		</g>	<g id="shape61-151" v:mid="61" v:groupcontext="shape" transform="translate(1193,-18.25)">		<title>Sheet.61</title>		<desc>Open source</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="31.5" cy="568.625" width="63" height="18"></v:textrect>		<rect x="0" y="559.625" width="63" height="18" class="st7"></rect>		<text x="5.73" y="571.32" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Open source</text>		</g>	<g id="shape62-154" v:mid="62" v:groupcontext="shape" transform="translate(1395.13,72.25) rotate(90)">		<title>Sheet.62</title>		<desc>YUV buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="82.3125" cy="577.625" width="164.63" height="0" transform="rotate(-90)"></v:textrect>		<path d="M0 577.63 L157.59 577.63" class="st12"></path>		<rect v:rectcontext="textBkgnd" x="-599.635" y="76.9125" width="44.02" height="10.7998" transform="rotate(-90)" class="st14"></rect>		<text x="-599.63" y="85.01" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>YUV buffer</text>		</g>	<g id="shape63-161" v:mid="63" v:groupcontext="shape" transform="translate(1395.13,289.375) rotate(90)">		<title>Sheet.63</title>		<desc>YUV buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="36" cy="577.625" width="72.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M0 577.63 L64.96 577.63" class="st12"></path>		<rect v:rectcontext="textBkgnd" x="-599.635" y="30.5999" width="44.02" height="10.7998" transform="rotate(-90)" class="st16"></rect>		<text x="-599.64" y="38.7" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>YUV buffer</text>		</g>	<g id="shape64-168" v:mid="64" v:groupcontext="shape" transform="translate(1395.13,415.375) rotate(90)">		<title>Sheet.64</title>		<desc>YUV buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="36" cy="577.625" width="72.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M0 577.63 L64.96 577.63" class="st12"></path>		<rect v:rectcontext="textBkgnd" x="-598.356" y="30.5999" width="41.4627" height="10.7998" transform="rotate(-90)" class="st16"></rect>		<text x="-598.36" y="38.7" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>YUV <tspan class="st17">buffer</tspan></text>		</g>	<g id="shape65-176" v:mid="65" v:groupcontext="shape" transform="translate(1503.13,72.25) rotate(90)">		<title>Sheet.65</title>		<desc>Bitstream buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="81.5625" cy="577.625" width="163.13" height="0" transform="rotate(-90)"></v:textrect>		<path d="M6.68 577.63 L7.04 577.63 L163.13 577.63" class="st18"></path>		<rect v:rectcontext="textBkgnd" x="-609.386" y="76.1625" width="63.5229" height="10.7998" transform="rotate(-90)" class="st14"></rect>		<text x="-609.39" y="84.26" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Bitstream buffer</text>		</g>	<g id="shape66-183" v:mid="66" v:groupcontext="shape" transform="translate(1503.13,289.375) rotate(90)">		<title>Sheet.66</title>		<desc>Bitstream buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="36" cy="577.625" width="72.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M6.68 577.63 L7.04 577.63 L72 577.63" class="st18"></path>		<rect v:rectcontext="textBkgnd" x="-609.386" y="30.5999" width="63.5229" height="10.7998" transform="rotate(-90)" class="st14"></rect>		<text x="-609.39" y="38.7" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Bitstream buffer</text>		</g>	<g id="shape67-190" v:mid="67" v:groupcontext="shape" transform="translate(1503.13,415.375) rotate(90)">		<title>Sheet.67</title>		<desc>Bitstream buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="36" cy="577.625" width="72.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M6.68 577.63 L7.04 577.63 L72 577.63" class="st18"></path>		<rect v:rectcontext="textBkgnd" x="-609.386" y="30.5999" width="63.5229" height="10.7998" transform="rotate(-90)" class="st16"></rect>		<text x="-609.39" y="38.7" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Bitstream buffer</text>		</g>	<g id="shape68-197" v:mid="68" v:groupcontext="shape" transform="translate(673.5,-442.375)">		<title>Sheet.68</title>		<desc>Camera Source</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="40.5" cy="568.625" width="81" height="18"></v:textrect>		<rect x="0" y="559.625" width="81" height="18" rx="9" ry="9" class="st9"></rect>		<text x="5.49" y="571.63" class="st20" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Camera Source</text>		</g>	<g id="shape69-200" v:mid="69" v:groupcontext="shape" transform="translate(1130.25,-505.375)">		<title>Sheet.69</title>		<desc>FileMuxer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="67.5" cy="550.625" width="135.01" height="54"></v:textrect>		<rect x="0" y="523.625" width="135" height="54" rx="9" ry="9" class="st2"></rect>		<text x="41.16" y="554.23" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>FileMuxer</text>		</g>	<g id="shape70-203" v:mid="70" v:groupcontext="shape" transform="translate(1033.5,-532.375)">		<title>Sheet.70</title>		<desc>Bitstream buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="48.375" cy="577.625" width="96.76" height="0"></v:textrect>		<path d="M0 577.63 L89.71 577.63" class="st12"></path>		<rect v:rectcontext="textBkgnd" x="16.6135" y="572.225" width="63.5229" height="10.7998" class="st16"></rect>		<text x="16.61" y="580.32" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Bitstream buffer</text>		</g>	<g id="shape71-210" v:mid="71" v:groupcontext="shape" transform="translate(1287.12,72.25) rotate(90)">		<title>Sheet.71</title>		<desc>YUV buffer</desc>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="22.5" cy="577.625" width="45.01" height="0" transform="rotate(-90)"></v:textrect>		<path d="M6.68 577.63 L7.04 577.63 L45 577.63" class="st18"></path>		<rect v:rectcontext="textBkgnd" x="-589.132" y="11.7002" width="23.0142" height="21.5997" transform="rotate(-90)" class="st16"></rect>		<text x="-586.88" y="19.8" transform="rotate(-90)" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>YUV <tspan x="-589.13" dy="1.2em" class="st11">buffer</tspan></text>		</g></g>
</svg>

**Figure : Video decoder and encoder software architecture**

The following table lists the components of the video software architecture:

| Component | Description |
| --- | --- |
| User application | Interacts with the FileSource for decoder and the Camera Source for encoder based on GStreamer/V4L2 |
| V4L2 framework | <ul class="simple"><br><li><p>Interacts with user application and the Adreno VPU driver</p></li><br><li><p>Handles events, callbacks, and buffer management</p></li><br></ul> |
| Adreno VPU driver | <ul class="simple"><br><li><p>Acts as an entry point to the video kernel mode driver (KMD)</p></li><br><li><p>Common driver for the encoder and decoder that controls the Adreno VPU</p></li><br><li><p>Manages the video driver state machine, buffer allocation, clock/bus management, and communication with Adreno VPU using the Host Firmware Interface (HFI)</p></li><br></ul> |
| Adreno VPU | Functions as a hardware accelerated engine that performs the video decoding and encoding operations with minimal power consumption |

## Features

The Adreno VPU provides the following video decoding and encoding features:

| Use case | Feature | QCS6490 | QCS9075/QCS8275 |
| --- | --- | --- | --- |
| <br>**Codecs** | H.264 (8‑bit decoder) | ✔ | ✔ |
| <br>**Codecs** | HEVC (8‑bit decoder) | ✔ | ✔ |
| <br>**Codecs** | HEVC (10‑bit decoder) | ✔ | ✔ |
| <br>**Codecs** | VP9 (8‑bit decoder) | ✔ | ✔ |
| <br>**Codecs** | VP9 (10‑bit decoder) | ✔ | ✔ |
| <br>**Codecs** | AV1 (8‑bit decoder) | ✖ | ✔ |
| <br>**Codecs** | AV1 (10‑bit decoder) | ✖ | ✔ |
| <br>**Codecs** | H.264 (8‑bit encoder) | ✔ | ✔ |
| <br>**Codecs** | HEVC (8‑bit encoder) | ✔ | ✔ |
| <br>**Features** | [B-frame encode](https://docs.qualcomm.com/doc/80-70017-20/topic/feature-descriptions.html#beframeencode) | ✔ | ✔ |
| <br>**Features** | [Encoder initial QP override](https://docs.qualcomm.com/doc/80-70017-20/topic/feature-descriptions.html#qpoverride) | ✔ | ✔ |
| <br>**Features** | [Hierarchical-P encode](https://docs.qualcomm.com/doc/80-70017-20/topic/feature-descriptions.html#hierarchical) | ✔ | ✖ |
| <br>**Features** | [Slice encode](https://docs.qualcomm.com/doc/80-70017-20/topic/feature-descriptions.html#sliceencode) | ✔ | ✖ |
| <br>**Features** | [Intra-refresh](https://docs.qualcomm.com/doc/80-70017-20/topic/feature-descriptions.html#interarefresh) | ✔ | ✖ |
| <br>**Features** | [Preprocessing](https://docs.qualcomm.com/doc/80-70017-20/topic/feature-descriptions.html#videoencoder) | ✔ | ✖ |
| <br>**Features** | [Rate control](https://docs.qualcomm.com/doc/80-70017-20/topic/feature-descriptions.html#ratecontrol) | ✔ | ✔ |
| <br>**Features** | [Long term reference (LTR)](https://docs.qualcomm.com/doc/80-70017-20/topic/feature-descriptions.html#longterm) | ✔ | ✖ |
| <br>**Features** | [Dynamic properties](https://docs.qualcomm.com/doc/80-70017-20/topic/feature-descriptions.html#dynamicencoder) | ✔ | ✔ |
| **Concurrency** | Multi-instance support | ✔ | ✔ |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |

## Video capabilities and features

Tab QCS6490
Tab QCS8275
Tab QCS9075

The Adreno VPU on QCS6490 is a sixth-generation video processing unit that comes with the following capabilities:

> 
> 
> | Feature | Capability |
> | --- | --- |
> | Video decode | Up to 4096 × 2160 at 60 fps for H.264/HEVC/VP9 |
> | Video encode | Up to 4096 × 2160 at 30 fps for H.264/HEVC |
> | Multi-channel capability | <ul class="simple"><br><li><p>8x of 1920 × 1088 at 30 fps decode</p></li><br><li><p>16x of 1280 × 720 at 30 fps decode</p></li><br><li><p>4x of 1920 × 1088 at 30 fps encode</p></li><br><li><p>8x of 1280 × 720 at 30 fps encode</p></li><br></ul> |
> | High frame rate capture | 1280 × 720 at 480 fps or 1920 × 1088 at 240 fps |
> | Maximum macroblocks per second | 2088960<br><br><br>You can calculate the maximum macroblocks per second using the formula:<br><br><br>(aligned width × aligned height × fps)/(macroblock size)<br><br><br>For example, (4096 × 2176 × 60)/256=2088960 |

The Adreno VPU on QCS8275 is a seventh-generation video processing unit that comes with the following capabilities:

> 
> 
> | **Feature** | **Capability** |
> | --- | --- |
> | Video decode | <ul class="simple"><br><li><p>Up to 3840 × 2160 at 120 fps for H.264/HEVC/VP9</p></li><br><li><p>Up to 3840 × 2160 at 60 fps for AV1</p></li><br></ul> |
> | Video encode | Up to 4096 × 2160 at 60 fps for H.264/HEVC |
> | Multi-channel capability | <ul class="simple"><br><li><p>16x for 1920 × 1088 at 30 fps decode</p></li><br><li><p>16x for 1280 × 720 at 30 fps encode</p></li><br></ul> |
> | High framerate capture | 1920 × 1088 at 240 fps or 3840 × 2160 at 60 fps |
> | Maximum macroblocks per second | 3916800<br><br><br>You can calculate the maximum macroblocks per second using the formula:<br><br><br>(aligned width × aligned height × fps)/(macroblock size)<br><br><br>For example, (3840 × 2176 × 120)/256 = 3916800 |

The Adreno VPU on QCS9075 is a seventh-generation video processing unit that comes with the following capabilities:

| Feature | Capability |
| --- | --- |
| Video decode | <ul class="simple"><br><li><p>Up to 7680 × 4320 at 60 fps or 3840 × 2160 at 240 fps for H.264/HEVC/AV1</p></li><br><li><p>Up to 3840 × 2160 at 240 fps for VP9</p></li><br></ul> |
| Video encode | Up to 7680 × 4320 at 30 fps for H.264/HEVC |
| Multi-channel capability | <ul class="simple"><br><li><p>24x for 1920 × 1088 at 30 fps decode/encode</p></li><br><li><p>8x for 3840 × 2160 at 30 fps decode</p></li><br></ul> |
| High frame rate capture | 1920 x 1088 at 480 fps or 3840 × 2160 at 120 fps |
| Maximum macroblocks per second | 7833600<br><br><br><br>> <br>> <br>> You can calculate the maximum macroblocks per second using the formula:<br>> <br>> <br>> (aligned width × aligned height × fps)/(macroblock size)<br>> <br>> <br>> For example, (3840 × 2176 × 240)/256 = 7833600 |

Last Published: Dec 30, 2024

[Previous Topic
Getting started](https://docs.qualcomm.com/bundle/publicresource/80-70017-20/topics/getting-started.md) [Next Topic
APIs and sample applications](https://docs.qualcomm.com/bundle/publicresource/80-70017-20/topics/interfaces.md)

Source: [https://docs.qualcomm.com/doc/80-70017-20/topic/architecture.html](https://docs.qualcomm.com/doc/80-70017-20/topic/architecture.html)