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
|
/**
* @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 tls;
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,
struct tls *tls,
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,
struct tls *tls,
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);
|