forked from alibaba/xquic
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathxqc_moq.h
More file actions
347 lines (293 loc) · 14 KB
/
xqc_moq.h
File metadata and controls
347 lines (293 loc) · 14 KB
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
#ifndef _XQC_MOQ_H_INCLUDED_
#define _XQC_MOQ_H_INCLUDED_
#include <xquic/xquic.h>
#ifdef __cplusplus
extern "C" {
#endif
#define XQC_ALPN_MOQ_QUIC "moq-quic"
#define XQC_ALPN_MOQ_WEBTRANSPORT "moq-wt"
typedef enum {
XQC_MOQ_VIDEO_KEY,
XQC_MOQ_VIDEO_DELTA,
} xqc_moq_video_frame_type_t;
typedef struct {
xqc_moq_video_frame_type_t type;
uint64_t seq_num;
uint64_t timestamp_us;
uint8_t *video_data;
uint64_t video_len;
const uint8_t *ext_headers;
uint64_t ext_headers_len;
} xqc_moq_video_frame_t;
typedef struct {
uint64_t seq_num;
uint64_t timestamp_us;
uint8_t *audio_data;
uint64_t audio_len;
const uint8_t *ext_headers;
uint64_t ext_headers_len;
} xqc_moq_audio_frame_t;
typedef enum {
XQC_MOQ_CONTAINER_LOC,
XQC_MOQ_CONTAINER_CMAF,
XQC_MOQ_CONTAINER_NONE,
} xqc_moq_container_t;
typedef enum {
XQC_MOQ_TRACK_VIDEO,
XQC_MOQ_TRACK_AUDIO,
XQC_MOQ_TRACK_CATALOG,
XQC_MOQ_TRACK_DATACHANNEL,
} xqc_moq_track_type_t;
typedef enum {
XQC_MOQ_TRACK_FOR_PUB,
XQC_MOQ_TRACK_FOR_SUB,
} xqc_moq_track_role_t;
typedef struct {
/* Common */
char *codec; /* Required */
char *mime_type; /* Required */
xqc_int_t bitrate; /* Required */
char *lang; /* Optional */
/* Video */
xqc_int_t framerate; /* Required */
xqc_int_t width; /* Required */
xqc_int_t height; /* Required */
xqc_int_t display_width; /* Optional */
xqc_int_t display_height; /* Optional */
/* Audio */
xqc_int_t samplerate; /* Required */
char *channel_config; /* Optional */
} xqc_moq_selection_params_t;
typedef struct {
char *track_namespace;
char *track_name;
xqc_moq_track_type_t track_type;
xqc_moq_selection_params_t selection_params;
} xqc_moq_track_info_t;
typedef enum {
XQC_MOQ_TRANSPORT_WEBTRANSPORT,
XQC_MOQ_TRANSPORT_QUIC,
} xqc_moq_transport_type_t;
typedef enum {
XQC_MOQ_PUBLISHER = 0x01,
XQC_MOQ_SUBSCRIBER = 0x02,
XQC_MOQ_PUBSUB = 0x03,
} xqc_moq_role_t;
typedef enum {
XQC_MOQ_FILTER_LAST_GROUP = 0x1,
XQC_MOQ_FILTER_LAST_OBJECT = 0x2,
XQC_MOQ_FILTER_ABSOLUTE_START = 0x3,
XQC_MOQ_FILTER_ABSOLUTE_RANGE = 0x4,
} xqc_moq_filter_type_t;
typedef struct xqc_moq_session_s xqc_moq_session_t;
typedef struct xqc_moq_stream_s xqc_moq_stream_t;
typedef struct xqc_moq_track_s xqc_moq_track_t;
typedef struct xqc_moq_object_s xqc_moq_object_t;
typedef struct xqc_moq_catalog_s xqc_moq_catalog_t;
typedef struct xqc_moq_subscribe_s xqc_moq_subscribe_t;
typedef struct xqc_moq_subscribe_msg_s xqc_moq_subscribe_msg_t;
typedef struct xqc_moq_subscribe_ok_msg_s xqc_moq_subscribe_ok_msg_t;
typedef struct xqc_moq_subscribe_error_msg_s xqc_moq_subscribe_error_msg_t;
typedef struct xqc_moq_subscribe_update_msg_s xqc_moq_subscribe_update_msg_t;
typedef struct xqc_moq_announce_msg_s xqc_moq_announce_msg_t;
typedef struct xqc_moq_announce_ok_msg_s xqc_moq_announce_ok_msg_t;
typedef struct xqc_moq_announce_error_msg_s xqc_moq_announce_error_msg_t;
typedef struct xqc_moq_unannounce_msg_s xqc_moq_unannounce_msg_t;
typedef struct xqc_moq_unsubscribe_msg_s xqc_moq_unsubscribe_msg_t;
typedef struct xqc_moq_subscribe_done_msg_s xqc_moq_subscribe_done_msg_t;
typedef struct xqc_moq_goaway_msg_s xqc_moq_goaway_msg_t;
typedef struct xqc_moq_client_setup_msg_s xqc_moq_client_setup_msg_t;
typedef struct xqc_moq_server_setup_msg_s xqc_moq_server_setup_msg_t;
typedef struct xqc_moq_stream_header_track_msg_s xqc_moq_stream_header_track_msg_t;
typedef struct xqc_moq_stream_header_group_msg_s xqc_moq_stream_header_group_msg_t;
typedef struct xqc_moq_decode_msg_ctx_s xqc_moq_decode_msg_ctx_t;
typedef struct xqc_moq_user_session_s {
xqc_moq_session_t *session;
uint8_t data[0];
} xqc_moq_user_session_t;
typedef enum {
XQC_MOQ_MSG_OBJECT_STREAM = 0x0,
XQC_MOQ_MSG_OBJECT_DATAGRAM = 0x1,
XQC_MOQ_MSG_SUBSCRIBE_UPDATE = 0x2,
XQC_MOQ_MSG_SUBSCRIBE = 0x3,
XQC_MOQ_MSG_SUBSCRIBE_OK = 0x4,
XQC_MOQ_MSG_SUBSCRIBE_ERROR = 0x5,
XQC_MOQ_MSG_ANNOUNCE = 0x6,
XQC_MOQ_MSG_ANNOUNCE_OK = 0x7,
XQC_MOQ_MSG_ANNOUNCE_ERROR = 0x8,
XQC_MOQ_MSG_UNANNOUNCE = 0x9,
XQC_MOQ_MSG_UNSUBSCRIBE = 0xA,
XQC_MOQ_MSG_SUBSCRIBE_DONE = 0xB,
XQC_MOQ_MSG_ANNOUNCE_CANCEL = 0xC,
XQC_MOQ_MSG_TRACK_STATUS_REQUEST = 0xD,
XQC_MOQ_MSG_TRACK_STATUS = 0xE,
XQC_MOQ_MSG_GOAWAY = 0x10,
XQC_MOQ_MSG_OBJECT_STREAM_EXT = 0x30,
XQC_MOQ_MSG_CLIENT_SETUP = 0x40,
XQC_MOQ_MSG_SERVER_SETUP = 0x41,
XQC_MOQ_MSG_STREAM_HEADER_TRACK = 0x50,
XQC_MOQ_MSG_STREAM_HEADER_GROUP = 0x51,
/* Phony message types */
XQC_MOQ_MSG_TRACK_STREAM_OBJECT = 0xA0,
XQC_MOQ_MSG_GROUP_STREAM_OBJECT = 0xA1,
} xqc_moq_msg_type_t;
typedef struct {
uint64_t type;
uint64_t length;
uint8_t *value;
} xqc_moq_message_parameter_t;
typedef struct xqc_moq_msg_base_s {
xqc_moq_msg_type_t (*type)();
xqc_int_t (*encode_len)(struct xqc_moq_msg_base_s *msg_base);
xqc_int_t (*encode)(struct xqc_moq_msg_base_s *msg_base, uint8_t *buf, size_t buf_cap);
xqc_int_t (*decode)(uint8_t *buf, size_t buf_len, uint8_t stream_fin, struct xqc_moq_decode_msg_ctx_s *msg_ctx,
struct xqc_moq_msg_base_s *msg_base, xqc_int_t *finish, xqc_int_t *wait_more_data);
void (*on_msg)(struct xqc_moq_session_s *session, struct xqc_moq_stream_s *moq_stream, struct xqc_moq_msg_base_s *msg_base);
} xqc_moq_msg_base_t;
typedef struct xqc_moq_subscribe_msg_s {
xqc_moq_msg_base_t msg_base;
uint64_t subscribe_id;
uint64_t track_alias;
char *track_namespace;
size_t track_namespace_len;
char *track_name;
size_t track_name_len;
uint64_t filter_type;
uint64_t start_group_id;
uint64_t start_object_id;
uint64_t end_group_id;
uint64_t end_object_id;
uint64_t params_num;
xqc_moq_message_parameter_t *params;
} xqc_moq_subscribe_msg_t;
typedef struct xqc_moq_subscribe_ok_msg_s {
xqc_moq_msg_base_t msg_base;
uint64_t subscribe_id;
uint64_t expire_ms;
uint64_t content_exist;
uint64_t largest_group_id;
uint64_t largest_object_id;
} xqc_moq_subscribe_ok_msg_t;
typedef struct xqc_moq_subscribe_error_msg_s {
xqc_moq_msg_base_t msg_base;
uint64_t subscribe_id;
uint64_t error_code;
char *reason_phrase;
size_t reason_phrase_len;
uint64_t track_alias;
} xqc_moq_subscribe_error_msg_t;
typedef struct xqc_moq_unsubscribe_msg_s {
xqc_moq_msg_base_t msg_base;
uint64_t subscribe_id;
} xqc_moq_unsubscribe_msg_t;
typedef void (*xqc_moq_on_session_setup_pt)(xqc_moq_user_session_t *user_session, char *extdata);
typedef void (*xqc_moq_on_datachannel_pt)(xqc_moq_user_session_t *user_session, xqc_moq_track_t *track,
xqc_moq_track_info_t *track_info);
typedef void (*xqc_moq_on_datachannel_msg_pt)(xqc_moq_user_session_t *user_session, xqc_moq_track_t *track,
xqc_moq_track_info_t *track_info, uint8_t *msg, size_t msg_len);
typedef void (*xqc_moq_on_subscribe_pt)(xqc_moq_user_session_t *user_session, uint64_t subscribe_id,
xqc_moq_track_t *track, xqc_moq_subscribe_msg_t *msg);
typedef void (*xqc_moq_on_unsubscribe_pt)(xqc_moq_user_session_t *user_session, uint64_t subscribe_id,
xqc_moq_track_t *track);
typedef void (*xqc_moq_on_request_keyframe_pt)(xqc_moq_user_session_t *user_session, uint64_t subscribe_id,
xqc_moq_track_t *track);
typedef void (*xqc_moq_on_subscribe_ok_pt)(xqc_moq_user_session_t *user_session, xqc_moq_track_t *track,
xqc_moq_track_info_t *track_info, xqc_moq_subscribe_ok_msg_t *subscribe_ok);
typedef void (*xqc_moq_on_subscribe_error_pt)(xqc_moq_user_session_t *user_session, xqc_moq_track_t *track,
xqc_moq_track_info_t *track_info, xqc_moq_subscribe_error_msg_t *subscribe_error);
typedef void (*xqc_moq_on_catalog_pt)(xqc_moq_user_session_t *user_session, xqc_moq_track_info_t **track_info_array,
xqc_int_t array_size);
typedef void (*xqc_moq_on_video_frame_pt)(xqc_moq_user_session_t *user_session, uint64_t subscribe_id,
xqc_moq_video_frame_t *video_frame);
typedef void (*xqc_moq_on_audio_frame_pt)(xqc_moq_user_session_t *user_session, uint64_t subscribe_id,
xqc_moq_audio_frame_t *audio_frame);
/**
* @brief There are two ways to get the target bitrate.
* 1. Call xqc_moq_target_bitrate before encoding.
* 2. Register the xqc_moq_on_bitrate_change_pt callback. A callback notification occurs when the target bitrate changes
* @param track The track whose bitrate changes, NULL if unavailable
* @param track_info The metadata of the track, NULL if unavailable
*/
typedef void (*xqc_moq_on_bitrate_change_pt)(xqc_moq_user_session_t *user_session, xqc_moq_track_t *track,
xqc_moq_track_info_t *track_info, uint64_t bitrate);
typedef struct {
xqc_moq_on_session_setup_pt on_session_setup; /* Required */
xqc_moq_on_datachannel_pt on_datachannel; /* Required */
xqc_moq_on_datachannel_msg_pt on_datachannel_msg; /* Required */
/* For Publisher */
xqc_moq_on_subscribe_pt on_subscribe; /* Required */
xqc_moq_on_unsubscribe_pt on_unsubscribe; /* Optional */
xqc_moq_on_request_keyframe_pt on_request_keyframe; /* Required */
xqc_moq_on_bitrate_change_pt on_bitrate_change; /* Optional */
/* For Subscriber */
xqc_moq_on_subscribe_ok_pt on_subscribe_ok; /* Required */
xqc_moq_on_subscribe_error_pt on_subscribe_error; /* Required */
xqc_moq_on_catalog_pt on_catalog; /* Required */
xqc_moq_on_video_frame_pt on_video; /* Required */
xqc_moq_on_audio_frame_pt on_audio; /* Required */
} xqc_moq_session_callbacks_t;
XQC_EXPORT_PUBLIC_API
void xqc_moq_init_alpn(xqc_engine_t *engine, xqc_conn_callbacks_t *conn_cbs, xqc_moq_transport_type_t transport_type);
/**
* @param extdata The client can send extdata when creating a session.
* This extdata will be received by the server in the on_session_setup callback.
*/
XQC_EXPORT_PUBLIC_API
xqc_moq_session_t *xqc_moq_session_create(void *conn, xqc_moq_user_session_t *user_session,
xqc_moq_transport_type_t type, xqc_moq_role_t role, xqc_moq_session_callbacks_t, char *extdata);
XQC_EXPORT_PUBLIC_API
void xqc_moq_session_destroy(xqc_moq_session_t *session);
/**
* @brief Set application error code and close the connection
* @param code in range 0x700 ~ 0x7FF
*/
XQC_EXPORT_PUBLIC_API
void xqc_moq_session_app_error(xqc_moq_session_t *session, uint64_t code);
/**
* @brief Get session error code in conn_closing or conn_close_notify
*/
XQC_EXPORT_PUBLIC_API
uint64_t xqc_moq_session_get_error(xqc_moq_session_t *session);
/**
* @brief Call it after xqc_moq_session_create
* Configure bitrate in bps
*/
XQC_EXPORT_PUBLIC_API
void xqc_moq_configure_bitrate(xqc_moq_session_t *session, uint64_t init_bitrate, uint64_t max_bitrate, uint64_t min_bitrate);
/**
* @brief There are two ways to get the target bitrate.
* 1. Call xqc_moq_target_bitrate before encoding.
* 2. Register the xqc_moq_on_bitrate_change_pt callback. A callback notification occurs when the target bitrate changes
* @return Encode bitrate in bits per second (bps)
*/
XQC_EXPORT_PUBLIC_API
uint64_t xqc_moq_target_bitrate(xqc_moq_session_t *session);
XQC_EXPORT_PUBLIC_API
xqc_moq_track_t *xqc_moq_track_create(xqc_moq_session_t *session, char *track_namespace, char *track_name,
xqc_moq_track_type_t track_type, xqc_moq_selection_params_t *params, xqc_moq_container_t container, xqc_moq_track_role_t role);
XQC_EXPORT_PUBLIC_API
xqc_int_t xqc_moq_subscribe(xqc_moq_session_t *session, const char *track_namespace, const char *track_name,
xqc_moq_filter_type_t filter_type, uint64_t start_group_id, uint64_t start_object_id,
uint64_t end_group_id, uint64_t end_object_id, char *authinfo);
XQC_EXPORT_PUBLIC_API
xqc_int_t xqc_moq_subscribe_latest(xqc_moq_session_t *session, const char *track_namespace, const char *track_name);
XQC_EXPORT_PUBLIC_API
xqc_int_t xqc_moq_unsubscribe(xqc_moq_session_t *session, uint64_t subscribe_id);
XQC_EXPORT_PUBLIC_API
xqc_int_t xqc_moq_request_keyframe(xqc_moq_session_t *session, uint64_t subscribe_id);
XQC_EXPORT_PUBLIC_API
xqc_int_t xqc_moq_write_subscribe_ok(xqc_moq_session_t *session, xqc_moq_subscribe_ok_msg_t *subscribe_ok);
XQC_EXPORT_PUBLIC_API
xqc_int_t xqc_moq_write_subscribe_error(xqc_moq_session_t *session, xqc_moq_subscribe_error_msg_t *subscribe_error);
XQC_EXPORT_PUBLIC_API
xqc_int_t xqc_moq_write_datachannel(xqc_moq_session_t *session, uint8_t *msg, size_t msg_len);
XQC_EXPORT_PUBLIC_API
xqc_int_t xqc_moq_write_video_frame(xqc_moq_session_t *session, uint64_t subscribe_id,
xqc_moq_track_t *track, xqc_moq_video_frame_t *video_frame);
XQC_EXPORT_PUBLIC_API
xqc_int_t xqc_moq_write_audio_frame(xqc_moq_session_t *session, uint64_t subscribe_id,
xqc_moq_track_t *track, xqc_moq_audio_frame_t *audio_frame);
#ifdef __cplusplus
}
#endif
#endif /* _XQC_MOQ_H_INCLUDED_ */