正在显示
3 个修改的文件
包含
165 行增加
和
85 行删除
| @@ -28,6 +28,11 @@ gcc srs_h264_raw_publish.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_h | @@ -28,6 +28,11 @@ gcc srs_h264_raw_publish.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_h | ||
| 28 | #include <stdlib.h> | 28 | #include <stdlib.h> |
| 29 | #include <unistd.h> | 29 | #include <unistd.h> |
| 30 | 30 | ||
| 31 | +// for open h264 raw file. | ||
| 32 | +#include <sys/types.h> | ||
| 33 | +#include <sys/stat.h> | ||
| 34 | +#include <fcntl.h> | ||
| 35 | + | ||
| 31 | #include "../../objs/include/srs_librtmp.h" | 36 | #include "../../objs/include/srs_librtmp.h" |
| 32 | 37 | ||
| 33 | #define srs_trace(msg, ...) printf(msg, ##__VA_ARGS__);printf("\n") | 38 | #define srs_trace(msg, ...) printf(msg, ##__VA_ARGS__);printf("\n") |
| @@ -40,7 +45,7 @@ int main(int argc, char** argv) | @@ -40,7 +45,7 @@ int main(int argc, char** argv) | ||
| 40 | 45 | ||
| 41 | if (argc <= 2) { | 46 | if (argc <= 2) { |
| 42 | srs_trace("Usage: %s <h264_raw_file> <rtmp_publish_url>", argv[0]); | 47 | srs_trace("Usage: %s <h264_raw_file> <rtmp_publish_url>", argv[0]); |
| 43 | - srs_trace(" h264_raw_file: the raw h264 steam file."); | 48 | + srs_trace(" h264_raw_file: the h264 raw steam file."); |
| 44 | srs_trace(" rtmp_publish_url: the rtmp publish url."); | 49 | srs_trace(" rtmp_publish_url: the rtmp publish url."); |
| 45 | srs_trace("For example:"); | 50 | srs_trace("For example:"); |
| 46 | srs_trace(" %s ./720p.h264.raw rtmp://127.0.0.1:1935/live/livestream", argv[0]); | 51 | srs_trace(" %s ./720p.h264.raw rtmp://127.0.0.1:1935/live/livestream", argv[0]); |
| @@ -53,6 +58,14 @@ int main(int argc, char** argv) | @@ -53,6 +58,14 @@ int main(int argc, char** argv) | ||
| 53 | const char* rtmp_url = argv[2]; | 58 | const char* rtmp_url = argv[2]; |
| 54 | srs_trace("raw_file=%s, rtmp_url=%s", raw_file, rtmp_url); | 59 | srs_trace("raw_file=%s, rtmp_url=%s", raw_file, rtmp_url); |
| 55 | 60 | ||
| 61 | + // open file | ||
| 62 | + int raw_fd = open(raw_file, O_RDONLY); | ||
| 63 | + if (raw_fd < 0) { | ||
| 64 | + srs_trace("open h264 raw file %s failed.", raw_fd); | ||
| 65 | + goto rtmp_destroy; | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + // connect rtmp context | ||
| 56 | srs_rtmp_t rtmp = srs_rtmp_create(rtmp_url); | 69 | srs_rtmp_t rtmp = srs_rtmp_create(rtmp_url); |
| 57 | 70 | ||
| 58 | if (srs_simple_handshake(rtmp) != 0) { | 71 | if (srs_simple_handshake(rtmp) != 0) { |
| @@ -73,23 +86,42 @@ int main(int argc, char** argv) | @@ -73,23 +86,42 @@ int main(int argc, char** argv) | ||
| 73 | } | 86 | } |
| 74 | srs_trace("publish stream success"); | 87 | srs_trace("publish stream success"); |
| 75 | 88 | ||
| 76 | - u_int32_t timestamp = 0; | 89 | + u_int32_t dts = 0; |
| 90 | + u_int32_t pts = 0; | ||
| 77 | for (;;) { | 91 | for (;;) { |
| 78 | - int type = SRS_RTMP_TYPE_VIDEO; | ||
| 79 | - timestamp += 40; | 92 | + // read from file, or get h264 raw data from device, whatever. |
| 80 | int size = 4096; | 93 | int size = 4096; |
| 81 | char* data = (char*)malloc(4096); | 94 | char* data = (char*)malloc(4096); |
| 95 | + if ((size = read(raw_fd, data, size)) < 0) { | ||
| 96 | + srs_trace("read h264 raw data failed. nread=%d", size); | ||
| 97 | + goto rtmp_destroy; | ||
| 98 | + } | ||
| 99 | + if (size == 0) { | ||
| 100 | + srs_trace("publish h264 raw data completed."); | ||
| 101 | + goto rtmp_destroy; | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + char* rtmp_data = NULL; | ||
| 105 | + int rtmp_size = 0; | ||
| 106 | + u_int32_t timestamp = 0; | ||
| 107 | + if (srs_h264_to_rtmp(data, size, dts, pts, &rtmp_data, &rtmp_size, ×tamp) < 0) { | ||
| 108 | + srs_trace("h264 raw data to rtmp data failed."); | ||
| 109 | + goto rtmp_destroy; | ||
| 110 | + } | ||
| 82 | 111 | ||
| 83 | - if (srs_write_packet(rtmp, type, timestamp, data, size) != 0) { | 112 | + int type = SRS_RTMP_TYPE_VIDEO; |
| 113 | + if (srs_write_packet(rtmp, type, timestamp, rtmp_data, rtmp_size) != 0) { | ||
| 84 | goto rtmp_destroy; | 114 | goto rtmp_destroy; |
| 85 | } | 115 | } |
| 86 | - srs_trace("sent packet: type=%s, time=%d, size=%d", srs_type2string(type), timestamp, size); | 116 | + srs_trace("sent packet: type=%s, time=%d, size=%d", srs_type2string(type), timestamp, rtmp_size); |
| 87 | 117 | ||
| 88 | usleep(40 * 1000); | 118 | usleep(40 * 1000); |
| 89 | } | 119 | } |
| 90 | 120 | ||
| 91 | rtmp_destroy: | 121 | rtmp_destroy: |
| 92 | srs_rtmp_destroy(rtmp); | 122 | srs_rtmp_destroy(rtmp); |
| 123 | + close(raw_fd); | ||
| 93 | 124 | ||
| 94 | return 0; | 125 | return 0; |
| 95 | } | 126 | } |
| 127 | + |
| @@ -996,6 +996,13 @@ char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize) | @@ -996,6 +996,13 @@ char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize) | ||
| 996 | return any->human_print(pdata, psize); | 996 | return any->human_print(pdata, psize); |
| 997 | } | 997 | } |
| 998 | 998 | ||
| 999 | +int srs_h264_to_rtmp(char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_int32_t pts, char** prtmp_data, int* prtmp_size, u_int32_t* ptimestamp) | ||
| 1000 | +{ | ||
| 1001 | + *prtmp_data = h264_raw_data; | ||
| 1002 | + *prtmp_size = h264_raw_size; | ||
| 1003 | + return 0; | ||
| 1004 | +} | ||
| 1005 | + | ||
| 999 | #ifdef __cplusplus | 1006 | #ifdef __cplusplus |
| 1000 | } | 1007 | } |
| 1001 | #endif | 1008 | #endif |
| @@ -42,6 +42,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -42,6 +42,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 42 | extern "C"{ | 42 | extern "C"{ |
| 43 | #endif | 43 | #endif |
| 44 | 44 | ||
| 45 | +/************************************************************* | ||
| 46 | +************************************************************** | ||
| 47 | +* RTMP protocol context | ||
| 48 | +************************************************************** | ||
| 49 | +*************************************************************/ | ||
| 45 | // the RTMP handler. | 50 | // the RTMP handler. |
| 46 | typedef void* srs_rtmp_t; | 51 | typedef void* srs_rtmp_t; |
| 47 | 52 | ||
| @@ -51,7 +56,7 @@ typedef void* srs_rtmp_t; | @@ -51,7 +56,7 @@ typedef void* srs_rtmp_t; | ||
| 51 | * rtmp://localhost/live/livestream | 56 | * rtmp://localhost/live/livestream |
| 52 | * @return a rtmp handler, or NULL if error occured. | 57 | * @return a rtmp handler, or NULL if error occured. |
| 53 | */ | 58 | */ |
| 54 | -srs_rtmp_t srs_rtmp_create(const char* url); | 59 | +extern srs_rtmp_t srs_rtmp_create(const char* url); |
| 55 | /** | 60 | /** |
| 56 | * create rtmp with url, used for connection specified application. | 61 | * create rtmp with url, used for connection specified application. |
| 57 | * @param url the tcUrl, for exmple: | 62 | * @param url the tcUrl, for exmple: |
| @@ -59,13 +64,18 @@ srs_rtmp_t srs_rtmp_create(const char* url); | @@ -59,13 +64,18 @@ srs_rtmp_t srs_rtmp_create(const char* url); | ||
| 59 | * @remark this is used to create application connection-oriented, | 64 | * @remark this is used to create application connection-oriented, |
| 60 | * for example, the bandwidth client used this, no stream specified. | 65 | * for example, the bandwidth client used this, no stream specified. |
| 61 | */ | 66 | */ |
| 62 | -srs_rtmp_t srs_rtmp_create2(const char* url); | 67 | +extern srs_rtmp_t srs_rtmp_create2(const char* url); |
| 63 | /** | 68 | /** |
| 64 | * close and destroy the rtmp stack. | 69 | * close and destroy the rtmp stack. |
| 65 | * @remark, user should use the rtmp again. | 70 | * @remark, user should use the rtmp again. |
| 66 | */ | 71 | */ |
| 67 | -void srs_rtmp_destroy(srs_rtmp_t rtmp); | 72 | +extern void srs_rtmp_destroy(srs_rtmp_t rtmp); |
| 68 | 73 | ||
| 74 | +/************************************************************* | ||
| 75 | +************************************************************** | ||
| 76 | +* RTMP protocol stack | ||
| 77 | +************************************************************** | ||
| 78 | +*************************************************************/ | ||
| 69 | /** | 79 | /** |
| 70 | * connect and handshake with server | 80 | * connect and handshake with server |
| 71 | * category: publish/play | 81 | * category: publish/play |
| @@ -84,13 +94,13 @@ void srs_rtmp_destroy(srs_rtmp_t rtmp); | @@ -84,13 +94,13 @@ void srs_rtmp_destroy(srs_rtmp_t rtmp); | ||
| 84 | * __srs_do_simple_handshake() | 94 | * __srs_do_simple_handshake() |
| 85 | * user can use these functions if needed. | 95 | * user can use these functions if needed. |
| 86 | */ | 96 | */ |
| 87 | -int srs_simple_handshake(srs_rtmp_t rtmp); | 97 | +extern int srs_simple_handshake(srs_rtmp_t rtmp); |
| 88 | // parse uri, create socket, resolve host | 98 | // parse uri, create socket, resolve host |
| 89 | -int __srs_dns_resolve(srs_rtmp_t rtmp); | 99 | +extern int __srs_dns_resolve(srs_rtmp_t rtmp); |
| 90 | // connect socket to server | 100 | // connect socket to server |
| 91 | -int __srs_connect_server(srs_rtmp_t rtmp); | 101 | +extern int __srs_connect_server(srs_rtmp_t rtmp); |
| 92 | // do simple handshake over socket. | 102 | // do simple handshake over socket. |
| 93 | -int __srs_do_simple_handshake(srs_rtmp_t rtmp); | 103 | +extern int __srs_do_simple_handshake(srs_rtmp_t rtmp); |
| 94 | 104 | ||
| 95 | /** | 105 | /** |
| 96 | * connect to rtmp vhost/app | 106 | * connect to rtmp vhost/app |
| @@ -99,7 +109,7 @@ int __srs_do_simple_handshake(srs_rtmp_t rtmp); | @@ -99,7 +109,7 @@ int __srs_do_simple_handshake(srs_rtmp_t rtmp); | ||
| 99 | * next: publish or play | 109 | * next: publish or play |
| 100 | * @return 0, success; otherwise, failed. | 110 | * @return 0, success; otherwise, failed. |
| 101 | */ | 111 | */ |
| 102 | -int srs_connect_app(srs_rtmp_t rtmp); | 112 | +extern int srs_connect_app(srs_rtmp_t rtmp); |
| 103 | 113 | ||
| 104 | /** | 114 | /** |
| 105 | * connect to server, get the debug srs info. | 115 | * connect to server, get the debug srs info. |
| @@ -112,7 +122,7 @@ int srs_connect_app(srs_rtmp_t rtmp); | @@ -112,7 +122,7 @@ int srs_connect_app(srs_rtmp_t rtmp); | ||
| 112 | * @param srs_id, int, debug info, client id in server log. | 122 | * @param srs_id, int, debug info, client id in server log. |
| 113 | * @param srs_pid, int, debug info, server pid in log. | 123 | * @param srs_pid, int, debug info, server pid in log. |
| 114 | */ | 124 | */ |
| 115 | -int srs_connect_app2(srs_rtmp_t rtmp, | 125 | +extern int srs_connect_app2(srs_rtmp_t rtmp, |
| 116 | char srs_server_ip[128], char srs_server[128], char srs_primary_authors[128], | 126 | char srs_server_ip[128], char srs_server[128], char srs_primary_authors[128], |
| 117 | char srs_version[32], int* srs_id, int* srs_pid | 127 | char srs_version[32], int* srs_id, int* srs_pid |
| 118 | ); | 128 | ); |
| @@ -124,7 +134,7 @@ int srs_connect_app2(srs_rtmp_t rtmp, | @@ -124,7 +134,7 @@ int srs_connect_app2(srs_rtmp_t rtmp, | ||
| 124 | * next: destroy | 134 | * next: destroy |
| 125 | * @return 0, success; otherwise, failed. | 135 | * @return 0, success; otherwise, failed. |
| 126 | */ | 136 | */ |
| 127 | -int srs_play_stream(srs_rtmp_t rtmp); | 137 | +extern int srs_play_stream(srs_rtmp_t rtmp); |
| 128 | 138 | ||
| 129 | /** | 139 | /** |
| 130 | * publish a live stream. | 140 | * publish a live stream. |
| @@ -133,7 +143,7 @@ int srs_play_stream(srs_rtmp_t rtmp); | @@ -133,7 +143,7 @@ int srs_play_stream(srs_rtmp_t rtmp); | ||
| 133 | * next: destroy | 143 | * next: destroy |
| 134 | * @return 0, success; otherwise, failed. | 144 | * @return 0, success; otherwise, failed. |
| 135 | */ | 145 | */ |
| 136 | -int srs_publish_stream(srs_rtmp_t rtmp); | 146 | +extern int srs_publish_stream(srs_rtmp_t rtmp); |
| 137 | 147 | ||
| 138 | /** | 148 | /** |
| 139 | * do bandwidth check with srs server. | 149 | * do bandwidth check with srs server. |
| @@ -148,7 +158,7 @@ int srs_publish_stream(srs_rtmp_t rtmp); | @@ -148,7 +158,7 @@ int srs_publish_stream(srs_rtmp_t rtmp); | ||
| 148 | * @param play_duration, output the play/download test duration, in ms. | 158 | * @param play_duration, output the play/download test duration, in ms. |
| 149 | * @param publish_duration, output the publish/upload test duration, in ms. | 159 | * @param publish_duration, output the publish/upload test duration, in ms. |
| 150 | */ | 160 | */ |
| 151 | -int srs_bandwidth_check(srs_rtmp_t rtmp, | 161 | +extern int srs_bandwidth_check(srs_rtmp_t rtmp, |
| 152 | int64_t* start_time, int64_t* end_time, | 162 | int64_t* start_time, int64_t* end_time, |
| 153 | int* play_kbps, int* publish_kbps, | 163 | int* play_kbps, int* publish_kbps, |
| 154 | int* play_bytes, int* publish_bytes, | 164 | int* play_bytes, int* publish_bytes, |
| @@ -173,7 +183,7 @@ int srs_bandwidth_check(srs_rtmp_t rtmp, | @@ -173,7 +183,7 @@ int srs_bandwidth_check(srs_rtmp_t rtmp, | ||
| 173 | * @remark user never free the return char*, | 183 | * @remark user never free the return char*, |
| 174 | * it's static shared const string. | 184 | * it's static shared const string. |
| 175 | */ | 185 | */ |
| 176 | -const char* srs_type2string(int type); | 186 | +extern const char* srs_type2string(int type); |
| 177 | /** | 187 | /** |
| 178 | * read a audio/video/script-data packet from rtmp stream. | 188 | * read a audio/video/script-data packet from rtmp stream. |
| 179 | * @param type, output the packet type, macros: | 189 | * @param type, output the packet type, macros: |
| @@ -191,113 +201,144 @@ const char* srs_type2string(int type); | @@ -191,113 +201,144 @@ const char* srs_type2string(int type); | ||
| 191 | * @remark: for read, user must free the data. | 201 | * @remark: for read, user must free the data. |
| 192 | * @remark: for write, user should never free the data, even if error. | 202 | * @remark: for write, user should never free the data, even if error. |
| 193 | */ | 203 | */ |
| 194 | -int srs_read_packet(srs_rtmp_t rtmp, int* type, u_int32_t* timestamp, char** data, int* size); | ||
| 195 | -int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data, int size); | 204 | +extern int srs_read_packet(srs_rtmp_t rtmp, |
| 205 | + int* type, u_int32_t* timestamp, char** data, int* size | ||
| 206 | +); | ||
| 207 | +extern int srs_write_packet(srs_rtmp_t rtmp, | ||
| 208 | + int type, u_int32_t timestamp, char* data, int size | ||
| 209 | +); | ||
| 196 | 210 | ||
| 197 | -/** | ||
| 198 | -* get protocol stack version | ||
| 199 | -*/ | ||
| 200 | -int srs_version_major(); | ||
| 201 | -int srs_version_minor(); | ||
| 202 | -int srs_version_revision(); | 211 | +// get protocol stack version |
| 212 | +extern int srs_version_major(); | ||
| 213 | +extern int srs_version_minor(); | ||
| 214 | +extern int srs_version_revision(); | ||
| 203 | 215 | ||
| 204 | -/** | 216 | +/************************************************************* |
| 217 | +************************************************************** | ||
| 205 | * utilities | 218 | * utilities |
| 206 | -*/ | ||
| 207 | -int64_t srs_get_time_ms(); | ||
| 208 | -int64_t srs_get_nsend_bytes(srs_rtmp_t rtmp); | ||
| 209 | -int64_t srs_get_nrecv_bytes(srs_rtmp_t rtmp); | 219 | +************************************************************** |
| 220 | +*************************************************************/ | ||
| 221 | +extern int64_t srs_get_time_ms(); | ||
| 222 | +extern int64_t srs_get_nsend_bytes(srs_rtmp_t rtmp); | ||
| 223 | +extern int64_t srs_get_nrecv_bytes(srs_rtmp_t rtmp); | ||
| 210 | 224 | ||
| 211 | -/** | 225 | + |
| 226 | +/************************************************************* | ||
| 227 | +************************************************************** | ||
| 212 | * flv codec | 228 | * flv codec |
| 213 | -*/ | 229 | +************************************************************** |
| 230 | +*************************************************************/ | ||
| 214 | typedef void* srs_flv_t; | 231 | typedef void* srs_flv_t; |
| 215 | typedef int flv_bool; | 232 | typedef int flv_bool; |
| 216 | /* open flv file for both read/write. */ | 233 | /* open flv file for both read/write. */ |
| 217 | -srs_flv_t srs_flv_open_read(const char* file); | ||
| 218 | -srs_flv_t srs_flv_open_write(const char* file); | ||
| 219 | -void srs_flv_close(srs_flv_t flv); | 234 | +extern srs_flv_t srs_flv_open_read(const char* file); |
| 235 | +extern srs_flv_t srs_flv_open_write(const char* file); | ||
| 236 | +extern void srs_flv_close(srs_flv_t flv); | ||
| 220 | /* read the flv header. 9bytes header. drop the 4bytes zero previous tag size */ | 237 | /* read the flv header. 9bytes header. drop the 4bytes zero previous tag size */ |
| 221 | -int srs_flv_read_header(srs_flv_t flv, char header[9]); | 238 | +extern int srs_flv_read_header(srs_flv_t flv, char header[9]); |
| 222 | /* read the flv tag header, 1bytes tag, 3bytes data_size, 4bytes time, 3bytes stream id. */ | 239 | /* read the flv tag header, 1bytes tag, 3bytes data_size, 4bytes time, 3bytes stream id. */ |
| 223 | -int srs_flv_read_tag_header(srs_flv_t flv, char* ptype, int32_t* pdata_size, u_int32_t* ptime); | 240 | +extern int srs_flv_read_tag_header(srs_flv_t flv, |
| 241 | + char* ptype, int32_t* pdata_size, u_int32_t* ptime | ||
| 242 | +); | ||
| 224 | /* read the tag data. drop the 4bytes previous tag size */ | 243 | /* read the tag data. drop the 4bytes previous tag size */ |
| 225 | -int srs_flv_read_tag_data(srs_flv_t flv, char* data, int32_t size); | 244 | +extern int srs_flv_read_tag_data(srs_flv_t flv, char* data, int32_t size); |
| 226 | /* write flv header to file, auto write the 4bytes zero previous tag size. */ | 245 | /* write flv header to file, auto write the 4bytes zero previous tag size. */ |
| 227 | -int srs_flv_write_header(srs_flv_t flv, char header[9]); | 246 | +extern int srs_flv_write_header(srs_flv_t flv, char header[9]); |
| 228 | /* write flv tag to file, auto write the 4bytes previous tag size */ | 247 | /* write flv tag to file, auto write the 4bytes previous tag size */ |
| 229 | -int srs_flv_write_tag(srs_flv_t flv, char type, int32_t time, char* data, int size); | 248 | +extern int srs_flv_write_tag(srs_flv_t flv, char type, int32_t time, char* data, int size); |
| 230 | /* get the tag size, for flv injecter to adjust offset, size=tag_header+data+previous_tag */ | 249 | /* get the tag size, for flv injecter to adjust offset, size=tag_header+data+previous_tag */ |
| 231 | -int srs_flv_size_tag(int data_size); | 250 | +extern int srs_flv_size_tag(int data_size); |
| 232 | /* file stream */ | 251 | /* file stream */ |
| 233 | /* file stream tellg to get offset */ | 252 | /* file stream tellg to get offset */ |
| 234 | -int64_t srs_flv_tellg(srs_flv_t flv); | 253 | +extern int64_t srs_flv_tellg(srs_flv_t flv); |
| 235 | /* seek file stream, offset is form the start of file */ | 254 | /* seek file stream, offset is form the start of file */ |
| 236 | -void srs_flv_lseek(srs_flv_t flv, int64_t offset); | 255 | +extern void srs_flv_lseek(srs_flv_t flv, int64_t offset); |
| 237 | /* error code */ | 256 | /* error code */ |
| 238 | /* whether the error code indicates EOF */ | 257 | /* whether the error code indicates EOF */ |
| 239 | -flv_bool srs_flv_is_eof(int error_code); | 258 | +extern flv_bool srs_flv_is_eof(int error_code); |
| 240 | /* media codec */ | 259 | /* media codec */ |
| 241 | /* whether the video body is sequence header */ | 260 | /* whether the video body is sequence header */ |
| 242 | -flv_bool srs_flv_is_sequence_header(char* data, int32_t size); | 261 | +extern flv_bool srs_flv_is_sequence_header(char* data, int32_t size); |
| 243 | /* whether the video body is keyframe */ | 262 | /* whether the video body is keyframe */ |
| 244 | -flv_bool srs_flv_is_keyframe(char* data, int32_t size); | 263 | +extern flv_bool srs_flv_is_keyframe(char* data, int32_t size); |
| 245 | 264 | ||
| 246 | -/** | 265 | +/************************************************************* |
| 266 | +************************************************************** | ||
| 247 | * amf0 codec | 267 | * amf0 codec |
| 248 | -*/ | 268 | +************************************************************** |
| 269 | +*************************************************************/ | ||
| 249 | /* the output handler. */ | 270 | /* the output handler. */ |
| 250 | typedef void* srs_amf0_t; | 271 | typedef void* srs_amf0_t; |
| 251 | typedef int amf0_bool; | 272 | typedef int amf0_bool; |
| 252 | typedef double amf0_number; | 273 | typedef double amf0_number; |
| 253 | -srs_amf0_t srs_amf0_parse(char* data, int size, int* nparsed); | ||
| 254 | -srs_amf0_t srs_amf0_create_number(amf0_number value); | ||
| 255 | -srs_amf0_t srs_amf0_create_ecma_array(); | ||
| 256 | -srs_amf0_t srs_amf0_create_strict_array(); | ||
| 257 | -srs_amf0_t srs_amf0_create_object(); | ||
| 258 | -void srs_amf0_free(srs_amf0_t amf0); | ||
| 259 | -void srs_amf0_free_bytes(char* data); | 274 | +extern srs_amf0_t srs_amf0_parse(char* data, int size, int* nparsed); |
| 275 | +extern srs_amf0_t srs_amf0_create_number(amf0_number value); | ||
| 276 | +extern srs_amf0_t srs_amf0_create_ecma_array(); | ||
| 277 | +extern srs_amf0_t srs_amf0_create_strict_array(); | ||
| 278 | +extern srs_amf0_t srs_amf0_create_object(); | ||
| 279 | +extern void srs_amf0_free(srs_amf0_t amf0); | ||
| 280 | +extern void srs_amf0_free_bytes(char* data); | ||
| 260 | /* size and to bytes */ | 281 | /* size and to bytes */ |
| 261 | -int srs_amf0_size(srs_amf0_t amf0); | ||
| 262 | -int srs_amf0_serialize(srs_amf0_t amf0, char* data, int size); | 282 | +extern int srs_amf0_size(srs_amf0_t amf0); |
| 283 | +extern int srs_amf0_serialize(srs_amf0_t amf0, char* data, int size); | ||
| 263 | /* type detecter */ | 284 | /* type detecter */ |
| 264 | -amf0_bool srs_amf0_is_string(srs_amf0_t amf0); | ||
| 265 | -amf0_bool srs_amf0_is_boolean(srs_amf0_t amf0); | ||
| 266 | -amf0_bool srs_amf0_is_number(srs_amf0_t amf0); | ||
| 267 | -amf0_bool srs_amf0_is_null(srs_amf0_t amf0); | ||
| 268 | -amf0_bool srs_amf0_is_object(srs_amf0_t amf0); | ||
| 269 | -amf0_bool srs_amf0_is_ecma_array(srs_amf0_t amf0); | ||
| 270 | -amf0_bool srs_amf0_is_strict_array(srs_amf0_t amf0); | 285 | +extern amf0_bool srs_amf0_is_string(srs_amf0_t amf0); |
| 286 | +extern amf0_bool srs_amf0_is_boolean(srs_amf0_t amf0); | ||
| 287 | +extern amf0_bool srs_amf0_is_number(srs_amf0_t amf0); | ||
| 288 | +extern amf0_bool srs_amf0_is_null(srs_amf0_t amf0); | ||
| 289 | +extern amf0_bool srs_amf0_is_object(srs_amf0_t amf0); | ||
| 290 | +extern amf0_bool srs_amf0_is_ecma_array(srs_amf0_t amf0); | ||
| 291 | +extern amf0_bool srs_amf0_is_strict_array(srs_amf0_t amf0); | ||
| 271 | /* value converter */ | 292 | /* value converter */ |
| 272 | -const char* srs_amf0_to_string(srs_amf0_t amf0); | ||
| 273 | -amf0_bool srs_amf0_to_boolean(srs_amf0_t amf0); | ||
| 274 | -amf0_number srs_amf0_to_number(srs_amf0_t amf0); | 293 | +extern const char* srs_amf0_to_string(srs_amf0_t amf0); |
| 294 | +extern amf0_bool srs_amf0_to_boolean(srs_amf0_t amf0); | ||
| 295 | +extern amf0_number srs_amf0_to_number(srs_amf0_t amf0); | ||
| 275 | /* value setter */ | 296 | /* value setter */ |
| 276 | -void srs_amf0_set_number(srs_amf0_t amf0, amf0_number value); | 297 | +extern void srs_amf0_set_number(srs_amf0_t amf0, amf0_number value); |
| 277 | /* object value converter */ | 298 | /* object value converter */ |
| 278 | -int srs_amf0_object_property_count(srs_amf0_t amf0); | ||
| 279 | -const char* srs_amf0_object_property_name_at(srs_amf0_t amf0, int index); | ||
| 280 | -srs_amf0_t srs_amf0_object_property_value_at(srs_amf0_t amf0, int index); | ||
| 281 | -srs_amf0_t srs_amf0_object_property(srs_amf0_t amf0, const char* name); | ||
| 282 | -void srs_amf0_object_property_set(srs_amf0_t amf0, const char* name, srs_amf0_t value); | ||
| 283 | -void srs_amf0_object_clear(srs_amf0_t amf0); | 299 | +extern int srs_amf0_object_property_count(srs_amf0_t amf0); |
| 300 | +extern const char* srs_amf0_object_property_name_at(srs_amf0_t amf0, int index); | ||
| 301 | +extern srs_amf0_t srs_amf0_object_property_value_at(srs_amf0_t amf0, int index); | ||
| 302 | +extern srs_amf0_t srs_amf0_object_property(srs_amf0_t amf0, const char* name); | ||
| 303 | +extern void srs_amf0_object_property_set(srs_amf0_t amf0, const char* name, srs_amf0_t value); | ||
| 304 | +extern void srs_amf0_object_clear(srs_amf0_t amf0); | ||
| 284 | /* ecma array value converter */ | 305 | /* ecma array value converter */ |
| 285 | -int srs_amf0_ecma_array_property_count(srs_amf0_t amf0); | ||
| 286 | -const char* srs_amf0_ecma_array_property_name_at(srs_amf0_t amf0, int index); | ||
| 287 | -srs_amf0_t srs_amf0_ecma_array_property_value_at(srs_amf0_t amf0, int index); | ||
| 288 | -srs_amf0_t srs_amf0_ecma_array_property(srs_amf0_t amf0, const char* name); | ||
| 289 | -void srs_amf0_ecma_array_property_set(srs_amf0_t amf0, const char* name, srs_amf0_t value); | 306 | +extern int srs_amf0_ecma_array_property_count(srs_amf0_t amf0); |
| 307 | +extern const char* srs_amf0_ecma_array_property_name_at(srs_amf0_t amf0, int index); | ||
| 308 | +extern srs_amf0_t srs_amf0_ecma_array_property_value_at(srs_amf0_t amf0, int index); | ||
| 309 | +extern srs_amf0_t srs_amf0_ecma_array_property(srs_amf0_t amf0, const char* name); | ||
| 310 | +extern void srs_amf0_ecma_array_property_set(srs_amf0_t amf0, const char* name, srs_amf0_t value); | ||
| 290 | /* strict array value converter */ | 311 | /* strict array value converter */ |
| 291 | -int srs_amf0_strict_array_property_count(srs_amf0_t amf0); | ||
| 292 | -srs_amf0_t srs_amf0_strict_array_property_at(srs_amf0_t amf0, int index); | ||
| 293 | -void srs_amf0_strict_array_append(srs_amf0_t amf0, srs_amf0_t value); | 312 | +extern int srs_amf0_strict_array_property_count(srs_amf0_t amf0); |
| 313 | +extern srs_amf0_t srs_amf0_strict_array_property_at(srs_amf0_t amf0, int index); | ||
| 314 | +extern void srs_amf0_strict_array_append(srs_amf0_t amf0, srs_amf0_t value); | ||
| 294 | /** | 315 | /** |
| 295 | * human readable print | 316 | * human readable print |
| 296 | * @param pdata, output the heap data, NULL to ignore. | 317 | * @param pdata, output the heap data, NULL to ignore. |
| 297 | * user must use srs_amf0_free_bytes to free it. | 318 | * user must use srs_amf0_free_bytes to free it. |
| 298 | * @return return the *pdata for print. NULL to ignore. | 319 | * @return return the *pdata for print. NULL to ignore. |
| 299 | */ | 320 | */ |
| 300 | -char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize); | 321 | +extern char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize); |
| 322 | + | ||
| 323 | +/************************************************************* | ||
| 324 | +************************************************************** | ||
| 325 | +* h264 raw codec | ||
| 326 | +************************************************************** | ||
| 327 | +*************************************************************/ | ||
| 328 | +/** | ||
| 329 | +convert h264 stream data to rtmp packet. | ||
| 330 | +@param h264_raw_data the input h264 raw data, a encoded h.264 I/P/B frame data. | ||
| 331 | +@paam h264_raw_size the size of h264 raw data. | ||
| 332 | +@param dts the dts of h.264 raw data. | ||
| 333 | +@param pts the pts of h.264 raw data. | ||
| 334 | +@param prtmp_data the output rtmp format packet, which can be send by srs_write_packet. | ||
| 335 | +@param prtmp_size the size of rtmp packet, for srs_write_packet. | ||
| 336 | +@param ptimestamp the timestamp of rtmp packet, for srs_write_packet. | ||
| 337 | +*/ | ||
| 338 | +extern int srs_h264_to_rtmp( | ||
| 339 | + char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_int32_t pts, | ||
| 340 | + char** prtmp_data, int* prtmp_size, u_int32_t* ptimestamp | ||
| 341 | +); | ||
| 301 | 342 | ||
| 302 | #ifdef __cplusplus | 343 | #ifdef __cplusplus |
| 303 | } | 344 | } |
-
请 注册 或 登录 后发表评论