summaryrefslogtreecommitdiff
path: root/build/doc/html/page_streams.html
blob: a1d4aa8943f222177bcfa53ec3e1a913614b4227 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.15"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>PipeWire: Media Streams</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  $(document).ready(initResizable);
/* @license-end */</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">PipeWire
   &#160;<span id="projectnumber">0.2.9</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.15 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('page_streams.html','');});
/* @license-end */
</script>
<div id="doc-content">
<div class="PageDoc"><div class="header">
  <div class="headertitle">
<div class="title">Media Streams </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h1><a class="anchor" id="sec_overview"></a>
Overview</h1>
<p>Media streams are used to exchange data with the PipeWire server. A stream is a wrapper around a proxy for a pw_client_node with just one port.</p>
<p>Streams can be used to:</p>
<ul>
<li>Consume a stream from PipeWire. This is a PW_DIRECTION_INPUT stream. </li>
<li>Produce a stream to PipeWire. This is a PW_DIRECTION_OUTPUT stream</li>
</ul>
<p>You can connect the stream port to a specific server port or let PipeWire choose a port for you.</p>
<p>For more complicated nodes such as filters or ports with multiple inputs and/or outputs you will need to create a <a class="el" href="classpw__node.html" title="PipeWire node class.">pw_node</a> yourself and export it with <a class="el" href="remote_8c.html#ad16e4bdd4e2d45ef70366adf85c3ab61">pw_remote_export</a>.</p>
<h1><a class="anchor" id="sec_create"></a>
Create</h1>
<p>Make a new stream with <a class="el" href="classpw__stream.html#a6f1606e27cc3bd9c522b92c9469a6f2f">pw_stream_new()</a>. You will need to specify a name for the stream and extra properties. You can use <a class="el" href="classpw__pipewire.html#a841dbb7608dc9cdda4a320d33fbbd39a">pw_fill_stream_properties()</a> to get a basic set of properties for the stream.</p>
<p>Once the stream is created, the state_changed event should be used to track the state of the stream.</p>
<h1><a class="anchor" id="sec_connect"></a>
Connect</h1>
<p>The stream is initially unconnected. To connect the stream, use <a class="el" href="classpw__stream.html#a0e12176f13e654e64e7f5689e7a6dd54">pw_stream_connect()</a>. Pass the desired direction as an argument.</p>
<h2><a class="anchor" id="ssec_stream_target"></a>
Stream target</h2>
<p>To make the newly connected stream automatically connect to an existing PipeWire node, use the <a class="el" href="stream_8h.html#a058907c2dffbb8fb5ede8a53d7604106ab648fa0c0c7adf6aa3139eddc3a9cd7c">PW_STREAM_FLAG_AUTOCONNECT</a> and the port_path argument while connecting.</p>
<h2><a class="anchor" id="ssec_stream_formats"></a>
Stream formats</h2>
<p>An array of possible formats that this stream can consume or provide must be specified.</p>
<h1><a class="anchor" id="sec_format"></a>
Format negotiation</h1>
<p>After connecting the stream, it will transition to the <a class="el" href="stream_8h.html#a9ceaca6fc9acd9a1af080258d763fb82a6d38d0ac9310b1822fcc98add8e4a8d2">PW_STREAM_STATE_CONFIGURE</a> state. In this state the format will be negotiated by the PipeWire server.</p>
<p>Once the format has been selected, the format_changed event is emited with the configured format as a parameter.</p>
<p>The client should now prepare itself to deal with the format and complete the negotiation procedure with a call to <a class="el" href="classpw__stream.html#abcd423c15a39666ea50abef5ff7a75bd">pw_stream_finish_format()</a>.</p>
<p>As arguments to <a class="el" href="classpw__stream.html#abcd423c15a39666ea50abef5ff7a75bd">pw_stream_finish_format()</a> an array of spa_param structures must be given. They contain parameters such as buffer size, number of buffers, required metadata and other parameters for the media buffers.</p>
<h1><a class="anchor" id="sec_buffers"></a>
Buffer negotiation</h1>
<p>After completing the format negotiation, PipeWire will allocate and notify the stream of the buffers that will be used to exchange data between client and server.</p>
<p>With the add_buffer event, a stream will be notified of a new buffer that can be used for data transport. You can attach user_data to these buffers.</p>
<p>Afer the buffers are negotiated, the stream will transition to the <a class="el" href="stream_8h.html#a9ceaca6fc9acd9a1af080258d763fb82a0537b5f9f722fb2faf7822cd09370825">PW_STREAM_STATE_PAUSED</a> state.</p>
<h1><a class="anchor" id="sec_streaming"></a>
Streaming</h1>
<p>From the <a class="el" href="stream_8h.html#a9ceaca6fc9acd9a1af080258d763fb82a0537b5f9f722fb2faf7822cd09370825">PW_STREAM_STATE_PAUSED</a> state, the stream can be set to the <a class="el" href="stream_8h.html#a9ceaca6fc9acd9a1af080258d763fb82af3c3b39039810d40a7c9e1ae3c6c905d">PW_STREAM_STATE_STREAMING</a> state by the PipeWire server when data transport is started.</p>
<p>Depending on how the stream was connected it will need to Produce or Consume data for/from PipeWire as explained in the following subsections.</p>
<h2><a class="anchor" id="ssec_consume"></a>
Consume data</h2>
<p>The process event is emited for each new buffer that can can be consumed.</p>
<p><a class="el" href="stream_8h.html#ab2ef0e28a1e91816f8015ef9814d18f7">pw_stream_dequeue_buffer()</a> should be used to get the data and metadata of the buffer.</p>
<p>When the buffer is no longer in use, call <a class="el" href="stream_8h.html#abe1c593f34080ea9c8c6231abe4e7386">pw_stream_queue_buffer()</a> to let PipeWire reuse the buffer.</p>
<h2><a class="anchor" id="ssec_produce"></a>
Produce data</h2>
<p><a class="el" href="stream_8h.html#ab2ef0e28a1e91816f8015ef9814d18f7">pw_stream_dequeue_buffer()</a> gives an empty buffer that can be filled.</p>
<p>Filled buffers should be queued with <a class="el" href="stream_8h.html#abe1c593f34080ea9c8c6231abe4e7386">pw_stream_queue_buffer()</a>.</p>
<p>The process event is emited when PipeWire has emptied a buffer that can now be refilled.</p>
<h1><a class="anchor" id="sec_stream_disconnect"></a>
Disconnect</h1>
<p>Use <a class="el" href="classpw__stream.html#aa727d7a41acb9d0ec574f93f01328d30">pw_stream_disconnect()</a> to disconnect a stream after use. </p>
</div></div><!-- PageDoc -->
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.15 </li>
  </ul>
</div>
</body>
</html>