JLChen
2020-12-10 a8c5f79b0d93adfa7f23601dd0fee30edc14f0d4
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);