| /** |
| * @file re_rtmp.h Interface to Real Time Messaging Protocol (RTMP) |
| * |
| * Copyright (C) 2010 Creytiv.com |
| */ |
| |
| |
| /** RTMP Protocol values */ |
| enum { |
| RTMP_PORT = 1935, |
| }; |
| |
| /** RTMP Stream IDs */ |
| enum { |
| |
| /* User Control messages SHOULD use message stream ID 0 |
| (known as the control stream) */ |
| RTMP_CONTROL_STREAM_ID = 0 |
| }; |
| |
| /** RTMP Packet types */ |
| enum rtmp_packet_type { |
| RTMP_TYPE_SET_CHUNK_SIZE = 1, /**< Set Chunk Size */ |
| RTMP_TYPE_ACKNOWLEDGEMENT = 3, /**< Acknowledgement */ |
| RTMP_TYPE_USER_CONTROL_MSG = 4, /**< User Control Messages */ |
| RTMP_TYPE_WINDOW_ACK_SIZE = 5, /**< Window Acknowledgement Size */ |
| RTMP_TYPE_SET_PEER_BANDWIDTH = 6, /**< Set Peer Bandwidth */ |
| RTMP_TYPE_AUDIO = 8, /**< Audio Message */ |
| RTMP_TYPE_VIDEO = 9, /**< Video Message */ |
| RTMP_TYPE_DATA = 18, /**< Data Message */ |
| RTMP_TYPE_AMF0 = 20, /**< Action Message Format (AMF) */ |
| }; |
| |
| /** RTMP AMF types */ |
| enum rtmp_amf_type { |
| RTMP_AMF_TYPE_ROOT = -1, /**< Special internal type */ |
| RTMP_AMF_TYPE_NUMBER = 0x00, /**< Number Type */ |
| RTMP_AMF_TYPE_BOOLEAN = 0x01, /**< Boolean Type */ |
| RTMP_AMF_TYPE_STRING = 0x02, /**< String Type */ |
| RTMP_AMF_TYPE_OBJECT = 0x03, /**< Object Type */ |
| RTMP_AMF_TYPE_NULL = 0x05, /**< Null type */ |
| RTMP_AMF_TYPE_ECMA_ARRAY = 0x08, /**< ECMA 'associative' Array */ |
| RTMP_AMF_TYPE_OBJECT_END = 0x09, /**< Object End Type */ |
| RTMP_AMF_TYPE_STRICT_ARRAY = 0x0a, /**< Array with ordinal indices */ |
| }; |
| |
| /** RTMP Event types */ |
| enum rtmp_event_type { |
| RTMP_EVENT_STREAM_BEGIN = 0, /**< Stream begin */ |
| RTMP_EVENT_STREAM_EOF = 1, /**< Stream End-Of-File */ |
| RTMP_EVENT_STREAM_DRY = 2, /**< No more data on the stream */ |
| RTMP_EVENT_SET_BUFFER_LENGTH = 3, /**< Set buffer size in [ms] */ |
| RTMP_EVENT_STREAM_IS_RECORDED = 4, /**< Stream is recorded */ |
| RTMP_EVENT_PING_REQUEST = 6, /**< Ping Request from server */ |
| RTMP_EVENT_PING_RESPONSE = 7, /**< Ping Response to server */ |
| }; |
| |
| |
| /* forward declarations */ |
| struct dnsc; |
| struct odict; |
| struct tcp_sock; |
| |
| |
| /* |
| * RTMP High-level API (connection, stream) |
| */ |
| |
| |
| /* conn */ |
| struct rtmp_conn; |
| |
| typedef void (rtmp_estab_h)(void *arg); |
| typedef void (rtmp_command_h)(const struct odict *msg, void *arg); |
| typedef void (rtmp_close_h)(int err, void *arg); |
| |
| int rtmp_connect(struct rtmp_conn **connp, struct dnsc *dnsc, const char *uri, |
| rtmp_estab_h *estabh, rtmp_command_h *cmdh, |
| rtmp_close_h *closeh, void *arg); |
| int rtmp_accept(struct rtmp_conn **connp, struct tcp_sock *ts, |
| rtmp_command_h *cmdh, rtmp_close_h *closeh, void *arg); |
| int rtmp_control(const struct rtmp_conn *conn, |
| enum rtmp_packet_type type, ...); |
| void rtmp_set_handlers(struct rtmp_conn *conn, rtmp_command_h *cmdh, |
| rtmp_close_h *closeh, void *arg); |
| struct tcp_conn *rtmp_conn_tcpconn(const struct rtmp_conn *conn); |
| const char *rtmp_conn_stream(const struct rtmp_conn *conn); |
| int rtmp_conn_debug(struct re_printf *pf, const struct rtmp_conn *conn); |
| |
| |
| typedef void (rtmp_resp_h)(bool success, const struct odict *msg, |
| void *arg); |
| |
| /* amf */ |
| int rtmp_amf_command(const struct rtmp_conn *conn, uint32_t stream_id, |
| const char *command, |
| unsigned body_propc, ...); |
| int rtmp_amf_request(struct rtmp_conn *conn, uint32_t stream_id, |
| const char *command, |
| rtmp_resp_h *resph, void *arg, unsigned body_propc, ...); |
| int rtmp_amf_reply(struct rtmp_conn *conn, uint32_t stream_id, bool success, |
| const struct odict *req, |
| unsigned body_propc, ...); |
| int rtmp_amf_data(const struct rtmp_conn *conn, uint32_t stream_id, |
| const char *command, unsigned body_propc, ...); |
| |
| |
| /* stream */ |
| struct rtmp_stream; |
| |
| typedef void (rtmp_control_h)(enum rtmp_event_type event, struct mbuf *mb, |
| void *arg); |
| typedef void (rtmp_audio_h)(uint32_t timestamp, |
| const uint8_t *pld, size_t len, void *arg); |
| typedef void (rtmp_video_h)(uint32_t timestamp, |
| const uint8_t *pld, size_t len, void *arg); |
| |
| int rtmp_stream_alloc(struct rtmp_stream **strmp, struct rtmp_conn *conn, |
| uint32_t stream_id, rtmp_command_h *cmdh, |
| rtmp_control_h *ctrlh, rtmp_audio_h *auh, |
| rtmp_video_h *vidh, rtmp_command_h *datah, |
| void *arg); |
| int rtmp_stream_create(struct rtmp_stream **strmp, struct rtmp_conn *conn, |
| rtmp_resp_h *resph, rtmp_command_h *cmdh, |
| rtmp_control_h *ctrlh, rtmp_audio_h *auh, |
| rtmp_video_h *vidh, rtmp_command_h *datah, |
| void *arg); |
| int rtmp_play(struct rtmp_stream *strm, const char *name); |
| int rtmp_publish(struct rtmp_stream *strm, const char *name); |
| int rtmp_meta(struct rtmp_stream *strm); |
| int rtmp_send_audio(struct rtmp_stream *strm, uint32_t timestamp, |
| const uint8_t *pld, size_t len); |
| int rtmp_send_video(struct rtmp_stream *strm, uint32_t timestamp, |
| const uint8_t *pld, size_t len); |
| struct rtmp_stream *rtmp_stream_find(const struct rtmp_conn *conn, |
| uint32_t stream_id); |
| |
| |
| const char *rtmp_event_name(enum rtmp_event_type event); |