# qtivsplit

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

<!--?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" aria-label="../../_images/gstreamer_pipeline_with_qtivsplit.svg">
  <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 : 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="899.264236450195312" height="688.180198669433594" viewbox="0 0 899.264236450195312 688.180198669433594" aria-label="../../_images/qtivsplit_buffer_management.svg">
  <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>
**Figure : qtivsplit buffer management**

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-70029-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-70029-50/topic/daisy-chain-detection-and-classification.html).

## Pad configuration

| Pad Name | Capabilities | Capabilities | Capabilities |
| --- | --- | --- | --- |
| <br>SINK template: 'sink'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  Always</p></li><br>> <li><p><em>Direction:</em>  sink</p></li><br>> </ul> | video/x-raw | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2, (string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR, (string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB, (string)BGR, (string)GRAY8 } |
| <br>SINK template: 'sink'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  Always</p></li><br>> <li><p><em>Direction:</em>  sink</p></li><br>> </ul> | video/x-raw | width: | [ 1, 32767 ] |
| <br>SINK template: 'sink'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  Always</p></li><br>> <li><p><em>Direction:</em>  sink</p></li><br>> </ul> | video/x-raw | height: | [ 1, 32767 ] |
| <br>SINK template: 'sink'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  Always</p></li><br>> <li><p><em>Direction:</em>  sink</p></li><br>> </ul> | video/x-raw | framerate: | [ 0/1, 255/1 ] |
| <br>SINK template: 'sink'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  Always</p></li><br>> <li><p><em>Direction:</em>  sink</p></li><br>> </ul> | video/x-raw(memory:GBM) | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2, (string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR, (string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB, (string)BGR, (string)GRAY8 } |
| <br>SINK template: 'sink'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  Always</p></li><br>> <li><p><em>Direction:</em>  sink</p></li><br>> </ul> | video/x-raw(memory:GBM) | width: | [ 1, 32767 ] |
| <br>SINK template: 'sink'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  Always</p></li><br>> <li><p><em>Direction:</em>  sink</p></li><br>> </ul> | video/x-raw(memory:GBM) | height: | [ 1, 32767 ] |
| <br>SINK template: 'sink'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  Always</p></li><br>> <li><p><em>Direction:</em>  sink</p></li><br>> </ul> | video/x-raw(memory:GBM) | framerate: | [ 0/1, 255/1 ] |
| <br>SRC template: 'src\_%u'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  On request</p></li><br>> <li><p><em>Direction:</em>  source</p></li><br>> </ul> | video/x-raw | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2, (string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR, (string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB, (string)BGR, (string)GRAY8 } |
| <br>SRC template: 'src\_%u'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  On request</p></li><br>> <li><p><em>Direction:</em>  source</p></li><br>> </ul> | video/x-raw | width: | [ 1, 32767 ] |
| <br>SRC template: 'src\_%u'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  On request</p></li><br>> <li><p><em>Direction:</em>  source</p></li><br>> </ul> | video/x-raw | height: | [ 1, 32767 ] |
| <br>SRC template: 'src\_%u'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  On request</p></li><br>> <li><p><em>Direction:</em>  source</p></li><br>> </ul> | video/x-raw | framerate: | [ 0/1, 255/1 ] |
| <br>SRC template: 'src\_%u'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  On request</p></li><br>> <li><p><em>Direction:</em>  source</p></li><br>> </ul> | video/x-raw(memory:GBM) | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2, (string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR, (string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB, (string)BGR, (string)GRAY8 } |
| <br>SRC template: 'src\_%u'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  On request</p></li><br>> <li><p><em>Direction:</em>  source</p></li><br>> </ul> | video/x-raw(memory:GBM) | width: | [ 1, 32767 ] |
| <br>SRC template: 'src\_%u'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  On request</p></li><br>> <li><p><em>Direction:</em>  source</p></li><br>> </ul> | video/x-raw(memory:GBM) | height: | [ 1, 32767 ] |
| <br>SRC template: 'src\_%u'<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><em>Availability:</em>  On request</p></li><br>> <li><p><em>Direction:</em>  source</p></li><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><br><li><p>flags: readable, writable, changeable only in NULL or READY state</p></li><br><li><p>Enum "GstVideoSplitMode" Default: 0, "none"</p><br><blockquote><br><div><ul class="simple"><br><li><p>(0): none - Incoming buffer is rescaled and color converted to match the negotiated pad caps. If the input and output caps match, then the input buffer is moved to the output and its reference count increased.</p></li><br><li><p>(1): force-transform - Incoming buffer is rescaled and color converted to match the negotiated pad caps. A new buffer is created even if the negotiated input and output caps match.</p></li><br><li><p>(2): single-roi-meta - Incoming buffer is checked for ROI meta. If there is a meta entry that corresponds to this pad, the crop, rescale and color conversion operations are performed on the input buffer. The transformed buffer is sent to the next plugin. A pad with no corresponding ROI meta creates a GAP buffer.</p></li><br><li><p>(3): batch-roi-meta - Incoming buffer is checked for ROI meta. For each meta entry a crop, rescaling and color conversion are done on the input buffer. This, for each ROI meta entry, a buffer is produced and sent to the next plugin downstream. In case ROI meta isn't present, the pad creates a GAP buffer.</p></li><br></ul><br></div></blockquote><br></li><br></ul> |

## Element configuration

Table : Element properties of qtivsplit

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

Last Published: Apr 02, 2026

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

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