def METHOD_NAME(self, caps_hint=None, controls=None):
    caps = self.select_caps(caps_hint)
    pipeline = self.get_pipeline(self.video.path, caps, controls)
    tx_cmd = self.video.command_prefix + ["gst-launch-1.0", "-q"]
    tx_cmd += pipeline.split()
    rx_cmd = ["gst-launch-1.0"]
    rx_cmd += "playbin uri=fd://0".split()
    tx = subprocess.Popen(
        tx_cmd,
        stdin=subprocess.DEVNULL,
        stdout=subprocess.PIPE,
    )
    rx = subprocess.Popen(
        rx_cmd,
        stdin=tx.stdout,
        stdout=subprocess.DEVNULL,
    )
    # wait until one subprocess has terminated
    while True:
        try:
            tx.wait(timeout=0.1)
            break
        except subprocess.TimeoutExpired:
            pass
        try:
            rx.wait(timeout=0.1)
            break
        except subprocess.TimeoutExpired:
            pass
    rx.terminate()
    tx.terminate()
    rx.communicate()
    tx.communicate()