# qtivsplit

Source: [https://docs.qualcomm.com/doc/80-70022-50/topic/qtivsplit.html](https://docs.qualcomm.com/doc/80-70022-50/topic/qtivsplit.html)

The qtivsplit plugin uses the GPU hardware to split a single input video stream into
        multiple output streams. The number of streams is a user-defined variable and is equal to
        the number of source pads.

The mode property for each source pad determines the method for splitting the incoming
            stream.

Table : Operational mode properties of qtivsplit

| Operational mode | Description |
| :--- | :--- |
| none | <ul class="ul" id="qtivsplit__ul_zxk_4bt_vcc"><br>                                <li class="li">The incoming video frames on the sink pad are duplicated on each<br>                                    of the source pads.</li><br><br>                                <li class="li">More color conversion and upscale/downscale are applied based on<br>                                    the negotiated <a href="https://gstreamer.freedesktop.org/documentation/gstreamer/gstcaps.html" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://gstreamer.freedesktop.org/documentation/gstreamer/gstcaps.html')">GstCaps</a> on that<br>                                    pad.</li><br><br>                            </ul> |
| single-roi-meta | <ul class="ul" id="qtivsplit__ul_pmt_5bt_vcc"><br>                                <li class="li">The input video buffers are checked for <a href="https://gstreamer.freedesktop.org/documentation/video/gstvideometa.html#GstVideoRegionOfInterestMeta" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://gstreamer.freedesktop.org/documentation/video/gstvideometa.html#GstVideoRegionOfInterestMeta')">GstVideoRegionOfInterestMeta</a>.</li><br><br>                                <li class="li">Ensure that when the source pads are created, their number is<br>                                    equal to the maximum expected count of <a href="https://gstreamer.freedesktop.org/documentation/video/gstvideometa.html#GstVideoRegionOfInterestMeta" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://gstreamer.freedesktop.org/documentation/video/gstvideometa.html#GstVideoRegionOfInterestMeta')">GstVideoRegionOfInterestMeta</a> inside a single <a href="https://gstreamer.freedesktop.org/documentation/gstreamer/gstbuffer.html#GstBuffer" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://gstreamer.freedesktop.org/documentation/gstreamer/gstbuffer.html#GstBuffer')">GstBuffer</a>.</li><br><br>                                <li class="li">If their source pads are fewer, the ROI meta that doesn't have a<br>                                    corresponding pad is ignored.</li><br><br>                            </ul> |
| batch-roi-meta | Operates the [GstVideoRegionOfInterestMeta](https://gstreamer.freedesktop.org/documentation/video/gstvideometa.html#GstVideoRegionOfInterestMeta)<br>                            entries attached to the buffer but instead of sending one such entry, it<br>                            sends all the meta entries on the pads in that mode as separate<br>                            buffers. |

Each meta entry in the [GstBuffer](https://gstreamer.freedesktop.org/documentation/gstreamer/gstbuffer.html#GstBuffer) is sent to its corresponding source
            pad based on the ID and crop, upscale/downscale, and color conversion is performed to
            match the negotiated [GstCaps](https://gstreamer.freedesktop.org/documentation/gstreamer/gstcaps.html). The source pads with no corresponding
            ROI meta produce GAP buffers.

The plugin uses the Qualcomm IB2C library or Qualcomm Computer Vision SDK for all the
            transformation operations.

- The Qualcomm IB2C library is wrapped in the custom GstC2dVideoConverter or
                GstGlesVideoConverter abstraction layer.
- It includes APIs to create, configure, and process the incoming and outgoing
                buffers.

## Buffer management

Figure : GStreamer pipeline with qtivsplit
                
                <!--?xml version="1.0" encoding="UTF-8"?-->
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="897.621551513671875" height="478.833328247070312" viewbox="0 0 897.621551513671875 478.833328247070312">
  <g>
    <rect x=".499786376953125" y=".499832153320312" width="896.62158203125" height="477.83349609375" rx="7.499999999999972" ry="7.499999999999972" style="fill: #fafafa;"></rect>
    <path d="M889.621551513671875,1c3.85980224609375,0,7,3.140213012695312,7,7.000015258789062v462.83331298828125c0,3.85980224609375-3.14019775390625,7-7,7H8c-3.859786987304688,0-7-3.14019775390625-7-7V8.000015258789062c0-3.85980224609375,3.140213012695312-7.000015258789062,7-7.000015258789062h881.621551513671875M889.621551513671875,0H8C3.581771850585938,0,0,3.581680297851562,0,8.000015258789062v462.83331298828125c0,4.418212890625,3.581771850585938,8,8,8h881.621551513671875c4.418212890625,0,8-3.581787109375,8-8V8.000015258789062c0-4.4183349609375-3.581787109375-8.000015258789062-8-8.000015258789062h0Z" style="fill: #d2d7e1;"></path>
  </g>
  <g>
    <rect x="398.202803585985748" y="45.359085061303631" width="480.840394045850189" height="60" rx="4" ry="4" style="fill: #d2d7e1;"></rect>
    <rect x="19.748021663373947" y="89.937235594425147" width="265.033420606204345" height="115.626108645134082" rx="4" ry="4" style="fill: #007884;"></rect>
    <text transform="translate(115.78448486328125 109.609359741210938)" style="fill: #fff; font-family: Roboto-Medium, Roboto; font-size: 16px; font-weight: 500;"><tspan x="0" y="0">GstBuffer </tspan></text>
    <text transform="translate(417.473236083984375 29.428451538085938)" style="font-family: Roboto-Medium, Roboto; font-size: 16px; font-weight: 500;"><tspan x="0" y="0">GST BIN</tspan></text>
    <text transform="translate(32.44354248046875 139.625778198242188)" style="fill: #fff; font-size: 16px;"><tspan x="0" y="0" style="font-family: Roboto-Medium, Roboto; font-weight: 500;">+ GstMemory:</tspan><tspan x="100.609375" y="0" xml:space="preserve" style="font-family: Roboto-Regular, Roboto;"> Image </tspan></text>
    <text transform="translate(407.697021484375 70.434646606445312)" style="font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Plugin running in normal mode. Same stream is duplicated in all </tspan><tspan x="0" y="19.2001953125">of its source pads but with different resolutions and color format.</tspan></text>
    <text transform="translate(32.7481689453125 172.968582153320312)" style="fill: #fff; font-size: 16px;"><tspan x="0" y="0" style="font-family: Roboto-Medium, Roboto; font-weight: 500;">+ GstVideoMeta:</tspan><tspan x="119.125" y="0" style="font-family: Roboto-Regular, Roboto;"> </tspan><tspan style="font-family: Roboto-Regular, Roboto;"><tspan x="0" y="19.2001953125" style="letter-spacing: 2.00244140625em;">	</tspan><tspan x="36" y="19.2001953125">Describes the raw video data</tspan></tspan></text>
    <line x1="19.748021663373947" y1="119.941778650749256" x2="284.781442269578292" y2="119.941778650749256" style="fill: none; stroke: #b3b7bf; stroke-miterlimit: 10;"></line>
    <line x1="19.748021663373947" y1="149.966376400376248" x2="284.781442269578292" y2="149.966376400376248" style="fill: none; stroke: #b3b7bf; stroke-miterlimit: 10;"></line>
    <rect x="19.748021663373947" y="307.956558227539062" width="265.033420606204345" height="115.626108645134082" rx="4" ry="4" style="fill: #007884;"></rect>
    <text transform="translate(115.78448486328125 327.628677368164062)" style="fill: #fff; font-family: Roboto-Medium, Roboto; font-size: 16px; font-weight: 500;"><tspan x="0" y="0">GstBuffer </tspan></text>
    <text transform="translate(32.44354248046875 357.645095825195312)" style="fill: #fff; font-size: 16px;"><tspan x="0" y="0" style="font-family: Roboto-Medium, Roboto; font-weight: 500;">+ GstMemory:</tspan><tspan x="100.609375" y="0" xml:space="preserve" style="font-family: Roboto-Regular, Roboto;"> Image </tspan></text>
    <text transform="translate(32.7481689453125 390.987869262695312)" style="fill: #fff; font-size: 16px;"><tspan x="0" y="0" style="font-family: Roboto-Medium, Roboto; font-weight: 500;">+ GstVideoMeta:</tspan><tspan x="119.125" y="0" style="font-family: Roboto-Regular, Roboto;"> </tspan><tspan style="font-family: Roboto-Regular, Roboto;"><tspan x="0" y="19.2001953125" style="letter-spacing: 2.00244140625em;">	</tspan><tspan x="36" y="19.2001953125">Describes the raw video data</tspan></tspan></text>
    <line x1="19.748021663373947" y1="337.961101283863172" x2="284.781442269578292" y2="337.961101283863172" style="fill: none; stroke: #b3b7bf; stroke-miterlimit: 10;"></line>
    <line x1="19.748021663373947" y1="367.985699033490164" x2="284.781442269578292" y2="367.985699033490164" style="fill: none; stroke: #b3b7bf; stroke-miterlimit: 10;"></line>
    <g>
      <line x1="152.516716003417969" y1="207.024795532226562" x2="152.516708374023438" y2="250.853775024414062" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
      <polygon points="148.527641296386719 249.686599731445312 152.516708374023438 256.594772338867188 156.505775451660156 249.686599731445312 148.527641296386719 249.686599731445312"></polygon>
    </g>
    <g>
      <text transform="translate(474.418930053710938 131.820693969726562)" style="font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">video/x-raw</tspan><tspan x="-93.65625" y="28">width=1920, height=1080 format=YUV</tspan></text>
      <text transform="translate(482.827911376953125 209.579483032226562)" style="font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">video/x-raw</tspan><tspan x="-90.1640625" y="28">width=640, height=360 format=BGRA</tspan></text>
      <text transform="translate(482.827911376953125 288.404312133789062)" style="font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">video/x-raw</tspan><tspan x="-89.4375" y="28">width=1280, height=720 format=RGB</tspan></text>
      <text transform="translate(482.827911376953125 367.228408813476562)" style="font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">video/x-raw</tspan><tspan x="-94.48046875" y="28">width=320, height=180 format=GRAY8</tspan></text>
      <g>
        <line x1="140" y1="257.485183715820312" x2="167.259017944335938" y2="257.485183715820312" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
        <polygon points="166.091827392578125 261.474258422851562 173 257.485183715820312 166.091827392578125 253.496109008789062 166.091827392578125 261.474258422851562"></polygon>
      </g>
      <g>
        <line x1="285.033424377441406" y1="351.741531372070312" x2="312.854934692382812" y2="351.741531372070312" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
        <polygon points="311.687736511230469 355.730606079101562 318.595916748046875 351.741531372070312 311.687736511230469 347.752517700195312 311.687736511230469 355.730606079101562"></polygon>
      </g>
      <g>
        <rect x="173.000003187764378" y="232.485188022626971" width="120" height="50" rx="4.000000000000001" ry="4.000000000000001" style="fill: #2a2aea;"></rect>
        <text transform="translate(204.914093017578125 260.991867065429688)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">qtivsplit</tspan></text>
      </g>
      <g>
        <polyline points="293.241191864013672 242.485183715820312 319.543182373046875 242.485183715820312 319.543182373046875 139.248580932617188 723.52313232421875 139.248580932617188" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></polyline>
        <polygon points="722.35595703125 143.237655639648438 729.264129638671875 139.248580932617188 722.35595703125 135.259536743164062 722.35595703125 143.237655639648438"></polygon>
      </g>
      <g>
        <polyline points="293.241191864013672 252.485183715820312 343.845169067382812 252.485183715820312 343.845169067382812 218.072982788085938 723.52313232421875 218.072982788085938" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></polyline>
        <polygon points="722.35595703125 222.062057495117188 729.264129638671875 218.072982788085938 722.35595703125 214.083938598632812 722.35595703125 222.062057495117188"></polygon>
      </g>
      <g>
        <polyline points="293.241191864013672 262.485183715820312 343.845169067382812 262.485183715820312 343.845169067382812 296.897415161132812 723.52313232421875 296.897415161132812" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></polyline>
        <polygon points="722.35595703125 300.886428833007812 729.264129638671875 296.897415161132812 722.35595703125 292.908340454101562 722.35595703125 300.886428833007812"></polygon>
      </g>
      <g>
        <polyline points="293.000003814697266 272.485183715820312 319.4437255859375 272.485183715820312 319.684913635253906 375.721817016601562 723.52313232421875 375.721817016601562" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></polyline>
        <polygon points="722.35595703125 379.710830688476562 729.264129638671875 375.721817016601562 722.35595703125 371.732742309570312 722.35595703125 379.710830688476562"></polygon>
      </g>
      <g>
        <g>
          <rect x="729.264129852828773" y="114.248588683019989" width="150" height="50" rx="4" ry="4" style="fill: #007884;"></rect>
          <text transform="translate(758.971160888671875 142.755264282226562)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Sink plugin 0</tspan></text>
        </g>
        <g>
          <rect x="729.264129852828773" y="193.072988242756765" width="150" height="50" rx="4" ry="4" style="fill: #007884;"></rect>
          <text transform="translate(758.971160888671875 221.579666137695312)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Sink plugin 1</tspan></text>
        </g>
        <g>
          <rect x="729.264129852828773" y="271.897387802497178" width="150" height="50" rx="4" ry="4" style="fill: #007884;"></rect>
          <text transform="translate(751.061004638671875 300.404067993164062)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Sink plugin N-1</tspan></text>
        </g>
        <g>
          <rect x="729.264129852828773" y="350.721787362233954" width="150" height="50" rx="4" ry="4" style="fill: #007884;"></rect>
          <text transform="translate(757.760223388671875 379.228469848632812)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Sink plugin N</tspan></text>
        </g>
      </g>
      <g>
        <rect x="20.000003187764378" y="232.485188022626971" width="120" height="50" rx="4" ry="4" style="fill: #007884;"></rect>
        <text transform="translate(33.445068359375 260.991867065429688)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Video source</tspan></text>
      </g>
    </g>
  </g>
  <g>
    <g>
      <text transform="translate(702.192169189453125 454.9248046875)" style="font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">Qualcomm </tspan></text>
      <rect x="681.941164309086162" y="442.833328247070312" width="16" height="16" rx="2" ry="2" style="fill: #2a2aea;"></rect>
    </g>
    <g>
      <text transform="translate(800.773956298828125 454.9248046875)" style="font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">Open source</tspan></text>
      <rect x="780.522945721942961" y="442.833328247070312" width="16" height="16" rx="2" ry="2" style="fill: #007884;"></rect>
    </g>
  </g>
</svg>

Figure : qtivsplit buffer management
                
                <!--?xml version="1.0" encoding="UTF-8"?-->
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="899.264236450195312" height="688.180198669433594" viewbox="0 0 899.264236450195312 688.180198669433594">
  <g>
    <rect x=".499832153320312" y=".500144958496094" width="898.26416015625" height="687.18017578125" rx="7.5" ry="7.5" style="fill: #fafafa;"></rect>
    <path d="M891.264236450195312,1c3.8597412109375,0,7,3.140220642089844,7,7v672.180198669433594c0,3.85980224609375-3.1402587890625,7-7,7H8c-3.859771728515625,0-7-3.14019775390625-7-7V8c0-3.859779357910156,3.140228271484375-7,7-7h883.264236450195312M891.264236450195312,0H8C3.581771850585938,0,0,3.581779479980469,0,8v672.180198669433594c0,4.41827392578125,3.581771850585938,8,8,8h883.264236450195312c4.418212890625,0,8-3.58172607421875,8-8V8c0-4.418220520019531-3.581787109375-8-8-8h0Z" style="fill: #d2d7e1;"></path>
  </g>
  <rect x="301.814715357207206" y="51.535535336799512" width="577.228528050995919" height="70" rx="4" ry="4" style="fill: #d2d7e1;"></rect>
  <rect x="20.000048964131565" y="51.535535336799512" width="265.033420606204345" height="290.635069121724882" rx="4" ry="4" style="fill: #007884;"></rect>
  <text transform="translate(116.036514282226562 71.207664489746094)" style="fill: #fff; font-family: Roboto-Medium, Roboto; font-size: 16px; font-weight: 500;"><tspan x="0" y="0">GstBuffer </tspan></text>
  <text transform="translate(418.294403076171875 31.535667419433594)" style="font-family: Roboto-Medium, Roboto; font-size: 16px; font-weight: 500;"><tspan x="0" y="0">GST BIN</tspan></text>
  <text transform="translate(32.695571899414062 101.224082946777344)" style="fill: #fff; font-size: 16px;"><tspan x="0" y="0" style="font-family: Roboto-Medium, Roboto; font-weight: 500;">+ GstMemory:</tspan><tspan x="100.609375" y="0" xml:space="preserve" style="font-family: Roboto-Regular, Roboto;"> Image </tspan></text>
  <text transform="translate(316.857578277587891 81.611412048339844)" style="font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Plugin running in ROI mode. For each ROI meta a buffer is created from the</tspan><tspan x="0" y="19.2001953125">video frame and to the corresponding source pad with same id as the meta. </tspan></text>
  <rect x="301.814715357207206" y="139.152154708822309" width="577.228528050995919" height="90" rx="4" ry="4" style="fill: #d2d7e1;"></rect>
  <text transform="translate(316.857749938964844 160.027763366699219)" style="font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">In this mode, the plugin with an example input buffer (containing 3 ROI metas)</tspan><tspan x="0" y="19.2001953125">and 4 source pads will produce valid buffer on 3 of the 4 pads </tspan><tspan x="0" y="38.39990234375">(1 buffer per pad for each ROI meta) while on the 4th pad, the plugin will </tspan><tspan x="0" y="57.60009765625">produces GAP buffer.</tspan></text>
  <text transform="translate(33.000198364257812 133.566856384277344)" style="fill: #fff; font-size: 16px;"><tspan x="0" y="0" style="font-family: Roboto-Medium, Roboto; font-weight: 500;">+ GstVideoMeta:</tspan><tspan x="119.125" y="0" style="font-family: Roboto-Regular, Roboto;"> </tspan><tspan style="font-family: Roboto-Regular, Roboto;"><tspan x="0" y="19.2001953125" style="letter-spacing: 2.00244140625em;">	</tspan><tspan x="36" y="19.2001953125">Describes the raw video data</tspan></tspan><tspan style="font-family: Roboto-Medium, Roboto; font-weight: 500;"><tspan x="0" y="38.39990234375">+ GstVideoRegionoflnterestMeta:</tspan></tspan><tspan style="font-family: Roboto-Regular, Roboto;"><tspan x="0" y="57.60009765625" style="letter-spacing: 2.00244140625em;">	</tspan><tspan x="36" y="57.60009765625">1</tspan></tspan></text>
  <text transform="translate(77.984573364257812 185.838829040527344) scale(.583000004291534)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">st</tspan></text>
  <text transform="translate(85.841018676757812 191.166954040527344)" style="fill: #fff; font-size: 16px;"><tspan x="0" y="0" xml:space="preserve" style="font-family: Roboto-Regular, Roboto;"> ROI Rectangle</tspan><tspan x="-52.8408203125" y="19.19970703125" style="font-family: Roboto-Medium, Roboto; font-weight: 500;">+ GstVideoRegionoflnterestMeta:</tspan><tspan x="-52.8408203125" y="38.39990234375" style="font-family: Roboto-Regular, Roboto; letter-spacing: 2.00244140625em;">	</tspan><tspan x="-16.8408203125" y="38.39990234375" style="font-family: Roboto-Regular, Roboto;">2</tspan></text>
  <text transform="translate(77.984573364257812 224.238731384277344) scale(.583000004291534)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">nd</tspan></text>
  <text transform="translate(88.392288208007812 229.566856384277344)" style="fill: #fff; font-size: 16px;"><tspan x="0" y="0" xml:space="preserve" style="font-family: Roboto-Regular, Roboto;"> ROI Rectangle</tspan><tspan x="-55.39208984375" y="38.39990234375" style="font-family: Roboto-Medium, Roboto; font-weight: 500;">+ GstVideoRegionoflnterestMeta:</tspan><tspan x="-55.39208984375" y="57.60009765625" style="font-family: Roboto-Regular, Roboto; letter-spacing: 2.00244140625em;">	</tspan><tspan x="-19.39208984375" y="57.60009765625" style="font-family: Roboto-Regular, Roboto;">N-1ROI Rectangle</tspan><tspan x="-55.39208984375" y="76.7998046875" style="font-family: Roboto-Medium, Roboto; font-weight: 500;">+ GstVideoRegionoflnterestMeta:</tspan><tspan x="-55.39208984375" y="96" style="font-family: Roboto-Regular, Roboto; letter-spacing: 2.00244140625em;">	</tspan><tspan x="-19.39208984375" y="96" style="font-family: Roboto-Regular, Roboto;">N ROI Rectangle</tspan><tspan x="-55.39208984375" y="115.2001953125" style="font-family: Roboto-Regular, Roboto;"> </tspan></text>
  <line x1="20.000048964131565" y1="81.540078393124531" x2="285.03346957033591" y2="81.540078393124531" style="fill: none; stroke: #b3b7bf; stroke-miterlimit: 10;"></line>
  <line x1="20.000048964131565" y1="111.564676142751523" x2="285.03346957033591" y2="111.564676142751523" style="fill: none; stroke: #b3b7bf; stroke-miterlimit: 10;"></line>
  <text transform="translate(33.515823364257812 243.296733856201172)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">.........</tspan></text>
  <rect x="20.000048964131565" y="443.091412822081111" width="265.033420606204345" height="189.733432067749163" rx="4" ry="4" style="fill: #007884;"></rect>
  <text transform="translate(116.036514282226562 462.763572692871094)" style="fill: #fff; font-family: Roboto-Medium, Roboto; font-size: 16px; font-weight: 500;"><tspan x="0" y="0">GstBuffer </tspan></text>
  <text transform="translate(32.695571899414062 492.779991149902344)" style="fill: #fff; font-size: 16px;"><tspan x="0" y="0" style="font-family: Roboto-Medium, Roboto; font-weight: 500;">+ GstMemory:</tspan><tspan x="100.609375" y="0" xml:space="preserve" style="font-family: Roboto-Regular, Roboto;"> Image </tspan></text>
  <text transform="translate(33.000198364257812 525.122764587402344)" style="fill: #fff; font-size: 16px;"><tspan x="0" y="0" style="font-family: Roboto-Medium, Roboto; font-weight: 500;">+ GstVideoMeta:</tspan><tspan x="119.125" y="0" style="font-family: Roboto-Regular, Roboto;"> </tspan><tspan style="font-family: Roboto-Regular, Roboto;"><tspan x="0" y="19.2001953125" style="letter-spacing: 2.00244140625em;">	</tspan><tspan x="36" y="19.2001953125">Describes the raw video data</tspan></tspan><tspan style="font-family: Roboto-Medium, Roboto; font-weight: 500;"><tspan x="0" y="38.39990234375">+ GstVideoRegionoflnterestMeta:</tspan></tspan><tspan style="font-family: Roboto-Regular, Roboto;"><tspan x="0" y="57.60009765625" style="letter-spacing: 2.00244140625em;">	</tspan><tspan x="36" y="57.60009765625">Describes the actual pixel </tspan></tspan><tspan style="font-family: Roboto-Regular, Roboto;"><tspan x="0" y="76.7998046875" style="letter-spacing: 2.00244140625em;">	</tspan><tspan x="36" y="76.7998046875">region in the buffer which is </tspan></tspan><tspan style="font-family: Roboto-Regular, Roboto;"><tspan x="0" y="96" style="letter-spacing: 2.00244140625em;">	</tspan><tspan x="36" y="96">filled with valid image data</tspan></tspan></text>
  <line x1="20.000048964131565" y1="473.09595587840704" x2="285.03346957033591" y2="473.09595587840704" style="fill: none; stroke: #b3b7bf; stroke-miterlimit: 10;"></line>
  <line x1="20.000048964131565" y1="503.120553628034031" x2="285.03346957033591" y2="503.120553628034031" style="fill: none; stroke: #b3b7bf; stroke-miterlimit: 10;"></line>
  <g>
    <line x1="152.516761779785156" y1="342.170616149902344" x2="152.516754150390625" y2="385.999595642089844" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
    <polygon points="148.527687072753906 384.832420349121094 152.516754150390625 391.740592956542969 156.505821228027344 384.832420349121094 148.527687072753906 384.832420349121094"></polygon>
  </g>
  <text transform="translate(474.418975830078125 266.966514587402344)" style="font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">video/x-raw</tspan><tspan x="-95.2265625" y="28">width=1920, height=1080, format=YUV</tspan></text>
  <text transform="translate(482.827957153320312 344.725303649902344)" style="font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">video/x-raw</tspan><tspan x="-91.734375" y="28">width=640, height=360, format=BGRA</tspan></text>
  <text transform="translate(482.827957153320312 423.550132751464844)" style="font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">video/x-raw</tspan><tspan x="-91.0078125" y="28">width=1280, height=720, format=RGB</tspan></text>
  <text transform="translate(482.827957153320312 502.374229431152344)" style="font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">video/x-raw</tspan><tspan x="-96.05078125" y="28">width=320, height=180, format=GRAY8</tspan></text>
  <g>
    <line x1="140.000045776367188" y1="392.631004333496094" x2="167.259063720703125" y2="392.631004333496094" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
    <polygon points="166.091873168945312 396.620079040527344 173.000045776367188 392.631004333496094 166.091873168945312 388.641929626464844 166.091873168945312 396.620079040527344"></polygon>
  </g>
  <g>
    <line x1="285.033470153808594" y1="486.887351989746094" x2="312.85498046875" y2="486.887351989746094" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
    <polygon points="311.687782287597656 490.876426696777344 318.595962524414062 486.887351989746094 311.687782287597656 482.898338317871094 311.687782287597656 490.876426696777344"></polygon>
  </g>
  <rect x="173.000048964131565" y="367.631008640302753" width="120" height="50" rx="4.000000000000001" ry="4.000000000000001" style="fill: #2a2aea;"></rect>
  <text transform="translate(204.914138793945312 396.137687683105469)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">qtivsplit</tspan></text>
  <g>
    <polyline points="293.241237640380859 377.631004333496094 319.543228149414062 377.631004333496094 319.543228149414062 274.394401550292969 723.523178100585938 274.394401550292969" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></polyline>
    <polygon points="722.356002807617188 278.383476257324219 729.264175415039062 274.394401550292969 722.356002807617188 270.405357360839844 722.356002807617188 278.383476257324219"></polygon>
  </g>
  <g>
    <polyline points="293.241237640380859 387.631004333496094 343.84521484375 387.631004333496094 343.84521484375 353.218803405761719 723.523178100585938 353.218803405761719" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></polyline>
    <polygon points="722.356002807617188 357.207878112792969 729.264175415039062 353.218803405761719 722.356002807617188 349.229759216308594 722.356002807617188 357.207878112792969"></polygon>
  </g>
  <g>
    <polyline points="293.241237640380859 397.631004333496094 343.84521484375 397.631004333496094 343.84521484375 432.043235778808594 723.523178100585938 432.043235778808594" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></polyline>
    <polygon points="722.356002807617188 436.032249450683594 729.264175415039062 432.043235778808594 722.356002807617188 428.054161071777344 722.356002807617188 436.032249450683594"></polygon>
  </g>
  <g>
    <polyline points="293.000049591064453 407.631004333496094 319.443771362304688 407.631004333496094 319.684959411621094 510.867637634277344 723.523178100585938 510.867637634277344" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></polyline>
    <polygon points="722.356002807617188 514.856651306152344 729.264175415039062 510.867637634277344 722.356002807617188 506.878562927246094 722.356002807617188 514.856651306152344"></polygon>
  </g>
  <rect x="729.264175629195961" y="249.39440930069577" width="150" height="50" rx="4" ry="4" style="fill: #007884;"></rect>
  <text transform="translate(758.971206665039062 277.901084899902344)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Sink plugin 0</tspan></text>
  <rect x="729.264175629195961" y="328.218808860432546" width="150" height="50" rx="4" ry="4" style="fill: #007884;"></rect>
  <text transform="translate(758.971206665039062 356.725486755371094)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Sink plugin 1</tspan></text>
  <rect x="729.264175629195961" y="407.043208420172959" width="150" height="50" rx="4" ry="4" style="fill: #007884;"></rect>
  <text transform="translate(751.061050415039062 435.549888610839844)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Sink plugin N-1</tspan></text>
  <rect x="729.264175629195961" y="485.867607979909735" width="150" height="50" rx="4" ry="4" style="fill: #007884;"></rect>
  <text transform="translate(757.760269165039062 514.374290466308594)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Sink plugin N</tspan></text>
  <rect x="20.000048964131565" y="367.631008640302753" width="120" height="50" rx="4" ry="4" style="fill: #007884;"></rect>
  <text transform="translate(33.445114135742188 396.137687683105469)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Video source</tspan></text>
  <g>
    <g>
      <text transform="translate(705.682388305664062 664.271675109863281)" style="font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">Qualcomm </tspan></text>
      <rect x="685.431407571943055" y="652.180198669433594" width="16" height="16" rx="2" ry="2" style="fill: #2a2aea;"></rect>
    </g>
    <g>
      <text transform="translate(804.264236450195312 664.271675109863281)" style="font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">Open source</tspan></text>
      <rect x="784.013188984801673" y="652.180198669433594" width="16" height="16" rx="2" ry="2" style="fill: #007884;"></rect>
    </g>
  </g>
</svg>

The GstImageBufferPool custom buffer pool class allocates either GBM or ION output
                buffers depending on the negotiated capabilities between GstImageBufferPool and
                downstream plugins.

- The GBM allocation is done using Qualcomm libgbm.
- The ION allocation is done using the IOCTL commands to the kernel.

## Inheritance chain

[GObject](https://docs.gtk.org/gobject/) → [GstObject](https://gstreamer.freedesktop.org/documentation/gstreamer/gstobject.html?gi-language=c) → [GstElement](https://gstreamer.freedesktop.org/documentation/gstreamer/gstelement.html?gi-language=c) → GstVideoSplit

The following tables provide information on pad templates and element properties of
                qtivsplit. For use cases, see the following:

- For use case on splitting video into several streams, see [Video split use cases](https://docs.qualcomm.com/doc/80-70022-50/topic/video-split-use-cases.html).
- For use case on dynamic cropping, see [Daisy chain detection and classification](https://docs.qualcomm.com/doc/80-70022-50/topic/daisy-chain-detection-and-classification.html).

## Pad configuration

| Pad Name | Capabilities | Capabilities | Capabilities |
| --- | --- | --- | --- |
| SINK template: 'sink'<br><ul class="ul" id="qtivsplit__ul_a54_2w4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> Always</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> sink</li><br><br>                                </ul> | video/x-raw | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2,<br>                                (string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR,<br>                                (string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB,<br>                                (string)BGR, (string)GRAY8 } |
| SINK template: 'sink'<br><ul class="ul" id="qtivsplit__ul_a54_2w4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> Always</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> sink</li><br><br>                                </ul> | video/x-raw | width: | [ 1, 32767 ] |
| SINK template: 'sink'<br><ul class="ul" id="qtivsplit__ul_a54_2w4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> Always</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> sink</li><br><br>                                </ul> | video/x-raw | height: | [ 1, 32767 ] |
| SINK template: 'sink'<br><ul class="ul" id="qtivsplit__ul_a54_2w4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> Always</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> sink</li><br><br>                                </ul> | video/x-raw | framerate: | [ 0/1, 255/1 ] |
| SINK template: 'sink'<br><ul class="ul" id="qtivsplit__ul_a54_2w4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> Always</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> sink</li><br><br>                                </ul> | video/x-raw(memory:GBM) | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2,<br>                                (string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR,<br>                                (string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB,<br>                                (string)BGR, (string)GRAY8 } |
| SINK template: 'sink'<br><ul class="ul" id="qtivsplit__ul_a54_2w4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> Always</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> sink</li><br><br>                                </ul> | video/x-raw(memory:GBM) | width: | [ 1, 32767 ] |
| SINK template: 'sink'<br><ul class="ul" id="qtivsplit__ul_a54_2w4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> Always</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> sink</li><br><br>                                </ul> | video/x-raw(memory:GBM) | height: | [ 1, 32767 ] |
| SINK template: 'sink'<br><ul class="ul" id="qtivsplit__ul_a54_2w4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> Always</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> sink</li><br><br>                                </ul> | video/x-raw(memory:GBM) | framerate: | [ 0/1, 255/1 ] |
| SRC template: 'src\_%u'<br><ul class="ul" id="qtivsplit__ul_g3q_fw4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> On request</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> source</li><br><br>                                </ul> | video/x-raw | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2,<br>                                (string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR,<br>                                (string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB,<br>                                (string)BGR, (string)GRAY8 } |
| SRC template: 'src\_%u'<br><ul class="ul" id="qtivsplit__ul_g3q_fw4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> On request</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> source</li><br><br>                                </ul> | video/x-raw | width: | [ 1, 32767 ] |
| SRC template: 'src\_%u'<br><ul class="ul" id="qtivsplit__ul_g3q_fw4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> On request</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> source</li><br><br>                                </ul> | video/x-raw | height: | [ 1, 32767 ] |
| SRC template: 'src\_%u'<br><ul class="ul" id="qtivsplit__ul_g3q_fw4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> On request</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> source</li><br><br>                                </ul> | video/x-raw | framerate: | [ 0/1, 255/1 ] |
| SRC template: 'src\_%u'<br><ul class="ul" id="qtivsplit__ul_g3q_fw4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> On request</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> source</li><br><br>                                </ul> | video/x-raw(memory:GBM) | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2,<br>                                (string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR,<br>                                (string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB,<br>                                (string)BGR, (string)GRAY8 } |
| SRC template: 'src\_%u'<br><ul class="ul" id="qtivsplit__ul_g3q_fw4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> On request</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> source</li><br><br>                                </ul> | video/x-raw(memory:GBM) | width: | [ 1, 32767 ] |
| SRC template: 'src\_%u'<br><ul class="ul" id="qtivsplit__ul_g3q_fw4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> On request</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> source</li><br><br>                                </ul> | video/x-raw(memory:GBM) | height: | [ 1, 32767 ] |
| SRC template: 'src\_%u'<br><ul class="ul" id="qtivsplit__ul_g3q_fw4_y1c"><br>                                    <li class="li"><em class="ph i">Availability:</em> On request</li><br><br>                                    <li class="li"><em class="ph i">Direction:</em> source</li><br><br>                                </ul> | video/x-raw(memory:GBM) | framerate: | [ 0/1, 255/1 ] |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |

Table : Pad properties for qtivsplit

| Pad | Property | Description |
| --- | --- | --- |
| 'src\_%u' | mode | Operational mode<br><ul class="ul" id="qtivsplit__ul_hsg_fmt_5zb"><br>                                    <li class="li">flags: readable, writable, changeable only in NULL or READY<br>                                        state</li><br><br>                                    <li class="li"><br>                                        <p class="p">Enum "GstVideoSplitMode" Default: 0, "none"</p><ul class="ul" id="qtivsplit__ul_qdt_gmt_5zb"><br>                                            <li class="li"> (0): none - Incoming buffer is rescaled and color<br>                                                converted to match the negotiated pad caps. If the<br>                                                input and output caps match, then the input buffer<br>                                                is moved to the output and its reference count<br>                                                increased.</li><br><br>                                            <li class="li"> (1): force-transform - Incoming buffer is rescaled<br>                                                and color converted to match the negotiated pad<br>                                                caps. A new buffer is created even if the negotiated<br>                                                input and output caps match.</li><br><br>                                            <li class="li"> (2): single-roi-meta - Incoming buffer is checked<br>                                                for ROI meta. If there is a meta entry that<br>                                                corresponds to this pad, the crop, rescale and color<br>                                                conversion operations are performed on the input<br>                                                buffer. The transformed buffer is sent to the next<br>                                                plugin. A pad with no corresponding ROI meta creates<br>                                                a GAP buffer.</li><br><br>                                            <li class="li"> (3): batch-roi-meta - Incoming buffer is checked<br>                                                for ROI meta. For each meta entry a crop, rescaling<br>                                                and color conversion are done on the input buffer.<br>                                                This, for each ROI meta entry, a buffer is produced<br>                                                and sent to the next plugin downstream. In case ROI<br>                                                meta isn't present, the pad creates a GAP<br>                                                buffer.</li><br><br>                                        </ul><br><br>                                    </li><br><br>                                </ul> |

## Element configuration

Table : Element properties of qtivsplit

| Property | Description |
| --- | --- |
| name | The name of the object.<ul class="ul" id="qtivsplit__ul_pg3_znn_myb"><br>                                    <li class="li">flags: readable, writable</li><br><br>                                    <li class="li">String. Default: "videosplit0"</li><br><br>                                </ul> |
| parent | The parent of the object.<ul class="ul" id="qtivsplit__ul_qg3_znn_myb"><br>                                    <li class="li">flags: readable, writable</li><br><br>                                    <li class="li">Object of type "GstObject"</li><br><br>                                </ul> |
| engine | Engine backend used for the conversion operations.<ul class="ul" id="qtivsplit__ul_tcr_lw4_y1c"><br>                                    <li class="li">flags: readable, writable</li><br><br>                                    <li class="li">Enum "GstVideoConverterBackend" Default: 1, "gles"<ul class="ul" id="qtivsplit__ul_vzc_mw4_y1c"><br>                                            <li class="li">(1): gles - Uses OpenGLES based video converter (2): </li><br><br>                                            <li class="li">fcv - Uses Qualcomm Computer Vision SDK based video<br>                                                  converter<div class="note note" id="qtivsplit__note_etr_pyg_vdc"><span class="notetitle">Note:</span> The Qualcomm Computer Vision SDK (fcv) engine is currently<br>                not supported.</div><br></li><br><br>                                        </ul><br></li><br><br>                                </ul> |

**Parent Topic:** [Configure display, camera, encode and decode plugins](https://docs.qualcomm.com/doc/80-70022-50/topic/display-plugins.html)

Last Published: Feb 20, 2026

[Previous Topic
Waylandsink](https://docs.qualcomm.com/bundle/publicresource/80-70022-50/topics/waylandsink.md) [Next Topic
qtivtransform](https://docs.qualcomm.com/bundle/publicresource/80-70022-50/topics/qtivtransform.md)