Project

General

Profile

Htsp » History » Version 29

Andreas Smas, 2009-03-03 22:51

1 17 Andreas Smas
= Home Tv Streaming Protocol (HTSP) =
2 1 Andreas Smas
3 17 Andreas Smas
== General ==
4 1 Andreas Smas
5 17 Andreas Smas
HTSP is a TCP based protocol primarily intended for streaming of live TV and related meta data such as channels, group of channels (called tags in HTSP) and electronic program guide (EPG) information.
6 1 Andreas Smas
7 17 Andreas Smas
The transmission and reception of a channel over HTSP is referred to a subscription. A single HTSP session can handle as many concurrent subscriptions as the bandwidth and CPU permits.
8 1 Andreas Smas
9
10 17 Andreas Smas
The HTSP server in tvheadend has a payload-aware scheduler for prioritizing more important packets (such as I-frames) before less important ones (such as B-frames). This makes HTSP is suitable for long-distance transmissions and/or paths with non-perfect delivery.
11
(It has been tested with a server in Stockholm and the client in Berlin).
12
13 27 Andreas Smas
The HTS Showtime client can be found [http://trac.lonelycoder.com/hts/browser/trunk/showtime/tv/htsp.c here].
14 22 Andreas Smas
15 18 Andreas Smas
----
16 17 Andreas Smas
== Communication ==
17
18 23 Andreas Smas
This communication is currently implemented by using htsmsg:s. All strings are encoded as UTF-8.
19
20 17 Andreas Smas
There are two distinct ways for communication within HTSP.
21
22 28 Andreas Smas
Apart from this there is a number of messages that needs to be exchanged during login, see the login section below.
23
24 17 Andreas Smas
=== RPC communication ===
25 1 Andreas Smas
26 18 Andreas Smas
There is a normal RPC way of doing things. I.e. the client sends a request and the server responds with a reply. All the RPC methods are listed below as the 'Client to Server' methods. Apart from all message fields listed within each message type the client can add an additional field:
27
28
RPC request extra fields:
29 17 Andreas Smas
{{{
30 1 Andreas Smas
seq              int  optional   Sequence number. This field will be echoed back by the server in the reply.
31 28 Andreas Smas
username         str  optional   Username, in combination with 'digest' this can be used to raise the privileges
32
                                 for the session in combination with invocation of a method. 
33
digest           bin  optional   Used to raise privileges.
34 1 Andreas Smas
}}}
35 28 Andreas Smas
36
The followings field should be used by the client to match the reply with the request.
37 18 Andreas Smas
All replies are guaranteed to arrive in the same order as the requests.
38
Even so, probably the best way to implement the request-reply client is by taking advantage of the 'seq' field.
39 1 Andreas Smas
40 18 Andreas Smas
RPC reply extra fields:
41
{{{
42 19 Andreas Smas
seq              int  optional   Sequence number. Same as in the request.
43
error            str  optional   If present an error has occurred and the text describes the error.
44 18 Andreas Smas
noaccess         int  optional   If present and set to '1' the user is prohibited from invoking the method due to 
45 19 Andreas Smas
                                 access restrictions. 
46 18 Andreas Smas
}}}
47 1 Andreas Smas
48 18 Andreas Smas
=== Streaming communication ===
49 19 Andreas Smas
50 1 Andreas Smas
For streaming of live TV and various related messages the server will continuously push data to the client.
51
These messages are referred to as asynchronous messages and always have the 'method' field set and never have the 'seq' field set.
52
Also, the client can enable an additional asyncMetadata mode and by doing so it will be notified by the server when meta data changes. (EPG updates, creation of channels and tags, etc). 
53
54 28 Andreas Smas
=== Login ===
55 1 Andreas Smas
56 28 Andreas Smas
Upon connect the server sends a welcome message looking like this:
57 1 Andreas Smas
58 19 Andreas Smas
{{{
59 28 Andreas Smas
method           str  required   Contains 'welcome'
60
htspversion      int  required   The server supports all versions of the protocol up to and including this number.
61
servername       str  required   Server software name.
62
serverversion    str  required   Server software version.
63
challenge        bin  required   32 bit randomized data used to generate authentication digests
64
}}}
65 19 Andreas Smas
66 28 Andreas Smas
The client is then expected to reply with:
67 19 Andreas Smas
68 1 Andreas Smas
{{{
69 28 Andreas Smas
method           str  required   Contains 'login'
70
htspversion      int  required   HTSP protocol version the client wish to use.
71
username         str  optional   Login username. If omitted the login is considered anonymous.
72 29 Andreas Smas
digest           bin  optional   SHA-1 hash of [password (not including terminating NUL)] + [challenge from welcome message]
73 19 Andreas Smas
}}}
74 1 Andreas Smas
75
The server will in turn reply with:
76
77 19 Andreas Smas
{{{
78 1 Andreas Smas
method           str  required   Contains 'loginAck'
79 29 Andreas Smas
noaccess         int  optional   The initial credentials did not grant access to any methods.
80
                                 If the client employs 'on-demand authentication' it will chose to ignore this.
81
error            str  optional   If set, an error occurred during login. The connection will be terminated by the server.
82 1 Andreas Smas
}}}
83
84
After this procedure normal communication may take place.
85
86 29 Andreas Smas
=== Authentication ===
87 1 Andreas Smas
88 29 Andreas Smas
In Tvheadend, each method has an associated access restriction. Currently there is only on restriction (Streaming). However, this may change in the future.
89 7 Andreas Smas
90 29 Andreas Smas
Privileges for these restrictions may be granted in two ways: Username + Password and/or Source IP address.
91
Therefore it is possible to gain permissions to the system without entering a username and password.
92
While this is really useful it also complicates the authentication schema a bit.
93
Upon connect the initial privileges will be raised based on the source address.
94 7 Andreas Smas
95 29 Andreas Smas
In principle it's possible to use two different authentication idioms with HTSP.
96
Depending on how your application works one or another may be more suitable.
97 26 Andreas Smas
98 29 Andreas Smas
=== Initial login ====
99 26 Andreas Smas
100 29 Andreas Smas
The client performs all of its authentication using the 'login' method.
101 26 Andreas Smas
102 29 Andreas Smas
It may choose to send:
103
* Username and password: Authentication will 
104 26 Andreas Smas
105
106 29 Andreas Smas
 The server will verify the user
107
during login and return an error if the username and password are invalid.
108 26 Andreas Smas
109 29 Andreas Smas
=== On-demand authentication ====
110 26 Andreas Smas
111 10 Andreas Smas
112
113 29 Andreas Smas
----
114
= Client to Server (RPC) methods =
115 18 Andreas Smas
116 10 Andreas Smas
----
117
=== enableAsyncMetadata ===
118
119
When this is enabled the client will get continuous updates from the server about channels and tags.
120
This also includes creation and deletion of channels and tags. 
121
122
An interactive application that presents the user with information about channels and tags would probably want to switch to this mode.
123
124
125
Request message fields:
126
{{{
127
None
128
}}}
129
130
Reply message fields:
131 1 Andreas Smas
{{{
132 5 Andreas Smas
None
133 1 Andreas Smas
}}}
134 6 Andreas Smas
135 23 Andreas Smas
136
137
----
138
=== getEvent ===
139
140
Request information about the given event. An event typically corresponds to a program on a channel.
141
142
Request message fields:
143
{{{
144
eventId          int  required   Event ID.
145
}}}
146
147
Reply message fields:
148
{{{
149
start            int  required   Start time of event (Seconds since the epoch, in UTC)
150
stop             int  required   Ending time of event (Seconds since the epoch, in UTC)
151 6 Andreas Smas
title            str  required   Title of event.
152 1 Andreas Smas
description      str  required   Description of event. This can be quite huge and may also contain newlines.
153 6 Andreas Smas
nextEventId      int  optional   ID of next event on the same channel.
154
}}}
155 25 Andreas Smas
156 1 Andreas Smas
----
157
=== subscribe ===
158 8 Andreas Smas
159
Request subscription to the given channel. 
160
161 1 Andreas Smas
Request message fields:
162 6 Andreas Smas
{{{
163
channelId        int  required   ID for channel. 
164
subscriptionId   int  required   Subscription ID. Selected by client. This value is not interpreted by the server in any form. 
165
                                 The value is used from now on in all messages related to the subscription.
166 4 Andreas Smas
}}}
167 6 Andreas Smas
168 5 Andreas Smas
Reply message fields:
169 1 Andreas Smas
{{{
170 5 Andreas Smas
None.
171 1 Andreas Smas
}}}
172 5 Andreas Smas
173
174 1 Andreas Smas
----
175
=== unsubscribe ===
176 6 Andreas Smas
177
Stop a subscription.
178
Attributes
179
{{{
180 2 Andreas Smas
subscriptionId   int  required   Subscription ID.
181
}}}
182
183
Reply message fields:
184
{{{
185
None.
186 12 Andreas Smas
}}}
187 2 Andreas Smas
188 1 Andreas Smas
189 11 Andreas Smas
----
190
191
= Server to Client methods =
192
193
----
194
=== channelAdd ===
195
196
A new channel has been created on the server.
197 13 Andreas Smas
198 11 Andreas Smas
Message fields:
199
{{{
200 12 Andreas Smas
channelId        int   required   ID of channel.
201 1 Andreas Smas
channelName      str   required   Name of channel.
202
channelIcon      str   required   URL to an icon representative for the channel.
203 11 Andreas Smas
eventId          int   optional   ID of the current (or next to be) event on this channel.
204
tags             int[] optional   Tags this channel is mapped to.
205 1 Andreas Smas
}}}
206 11 Andreas Smas
207
----
208
=== channelUpdate ===
209
210
A channel has been updated on the server. All fields will be sent even if they are not changed. Most clients can process this and the 'channelAdd' message
211
with the very same code.
212
213
Message fields:
214 13 Andreas Smas
{{{
215 12 Andreas Smas
channelId        int   required   ID of channel.
216 3 Andreas Smas
channelName      str   required   Name of channel.
217 1 Andreas Smas
channelIcon      str   optioanl   URL to an icon representative for the channel.
218 11 Andreas Smas
eventId          int   optional   ID of the current (or next to be) event on this channel.
219 1 Andreas Smas
tags             int[] required   Tags this channel is mapped to.
220 11 Andreas Smas
}}}
221
222
----
223
=== channelDelete ===
224
225
A channel has been deleted on the server.
226
227 12 Andreas Smas
This message is only sent if session is in asynchronous mode.
228 11 Andreas Smas
229 1 Andreas Smas
Message fields:
230 11 Andreas Smas
{{{
231
channelId        int   required   ID of channel.
232
}}}
233
234 13 Andreas Smas
----
235 11 Andreas Smas
=== tagAdd ===
236
237
A new tag has been created on the server.
238
239
Message fields:
240 1 Andreas Smas
{{{
241 11 Andreas Smas
tagId            int   required   ID of tag.
242 1 Andreas Smas
tagName          str   required   Name of tag.
243 11 Andreas Smas
tagIcon          str   optional   URL to an icon representative for the channel.
244
channels         int[] required   Channels this tag is mapped to.
245
}}}
246
247 13 Andreas Smas
----
248 11 Andreas Smas
=== tagUpdate ===
249
250
A tag has been updated on the server.
251
252
Message fields:
253 12 Andreas Smas
{{{
254 1 Andreas Smas
tagId            int   required   ID of tag.
255
tagName          str   required   Name of tag.
256 11 Andreas Smas
tagIcon          str   optional   URL to an icon representative for the channel.
257
channels         int[] required   Channels this tag is mapped to.
258
}}}
259 1 Andreas Smas
260 11 Andreas Smas
----
261
=== tagDelete ===
262 1 Andreas Smas
263 11 Andreas Smas
A tag has been deleted from the server.
264
265 12 Andreas Smas
Message fields:
266 11 Andreas Smas
{{{
267 2 Andreas Smas
tagId            str   required   ID of tag.
268 14 Andreas Smas
}}}
269
270
----
271
=== subscriptionStart ===
272
273
Message fields:
274
{{{
275
subscriptionId   int   required   Subscription ID.
276
streams          msg[] required   Array of messages with stream information
277
278
279
'streams' message:
280
281
index            int   required   Index for this stream
282
type             str   required   Type of stream
283
language         str   optional   Language for stream
284
285
286
Stream types:
287 1 Andreas Smas
    AC3                           AC3 audio
288 14 Andreas Smas
    MPEG2AUDIO                    MPEG2 audio (MP2)
289
    MPEG2VIDEO                    MPEG2 video
290 21 Andreas Smas
    H264                          H264 video
291 12 Andreas Smas
292 2 Andreas Smas
293
}}}
294 15 Andreas Smas
295
296
----
297
=== subscriptionStop ===
298
299
Message fields:
300 12 Andreas Smas
{{{
301 2 Andreas Smas
subscriptionId   int   required   Subscription ID.
302
reason           str   optional   Reason for subscription stop.
303 15 Andreas Smas
}}}
304
305
----
306
=== subscriptionStatus ===
307
308
Message fields:
309
{{{
310 12 Andreas Smas
subscriptionId   int   required   Subscription ID.
311 2 Andreas Smas
status           str   optional   English clear text of status. Absence of this field means that the status is OK. 
312 15 Andreas Smas
}}}
313
314
315
----
316
=== queueStatus ===
317
318
The queueStatus message is sent every second during normal data delivery.
319
320
The transmit scheduler have different drop thresholds for different frame types.
321
If congestion occurs it will favor dropping B-frames before P-frames before I-frames.
322
All audio is recognized as I-frames. 
323
324
Message fields:
325
{{{
326
subscriptionId   int   required   Subscription ID.
327
packets          int   required   Number of data packets in queue.
328
bytes            int   required   Number of bytes in queue.
329 16 Andreas Smas
delay            int   required   Estimated delay of queue (in µs)
330
Bdrops           int   required   Number of B-frames dropped
331
Pdrops           int   required   Number of P-frames dropped
332
Idrops           int   required   Number of I-frames dropped
333
}}}
334
335
----
336
=== muxpkt ===
337
338
Streaming data.
339
340
Message fields:
341
{{{
342
subscriptionId   int   required   Subscription ID.
343
frametype        int   required   Type of frame as ASCII value: 'I', 'P', 'B'
344
stream           int   required   Stream index. Corresponds to the streams reported in the subscriptionStart message.
345
dts              int   required   Decode Time Stamp in µs.
346 1 Andreas Smas
pts              int   required   Presentation Time Stamp in µs.
347
duration         int   required   Duration of frame in µs.
348
payload          bin   required   Actual frame data.
349
350
}}}