mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
update librtmp, add amf0 parse functions
This commit is contained in:
parent
efc9f53512
commit
f37faf7236
6 changed files with 200 additions and 112 deletions
|
@ -5,11 +5,12 @@ GCC = gcc
|
||||||
default: help
|
default: help
|
||||||
|
|
||||||
help:
|
help:
|
||||||
@echo "Usage: make <help>|<clean>|<srs_publish_nossl>|<srs_play_nossl>|<srs_ingest_flv_nossl>|<srs_ingest_rtmp_nossl>|<srs_publish_ssl>|<srs_play_ssl>|<srs_ingest_flv_ssl>|<srs_ingest_rtmp_ssl>"
|
@echo "Usage: make <help>|<clean>|<srs_flv_parser>|<srs_publish_nossl>|<srs_play_nossl>|<srs_ingest_flv_nossl>|<srs_ingest_rtmp_nossl>|<srs_publish_ssl>|<srs_play_ssl>|<srs_ingest_flv_ssl>|<srs_ingest_rtmp_ssl>"
|
||||||
@echo " help display this help"
|
@echo " help display this help"
|
||||||
@echo " clean cleanup build"
|
@echo " clean cleanup build"
|
||||||
@echo " ssl srs_publish_ssl, srs_play_ssl, srs_ingest_flv, srs_ingest_rtmp"
|
@echo " ssl srs_flv_parser, srs_publish_ssl, srs_play_ssl, srs_ingest_flv, srs_ingest_rtmp"
|
||||||
@echo " nossl srs_publish_nossl, srs_play_nossl, srs_ingest_flv, srs_ingest_rtmp"
|
@echo " nossl srs_flv_parser, srs_publish_nossl, srs_play_nossl, srs_ingest_flv, srs_ingest_rtmp"
|
||||||
|
@echo " srs_flv_parser parse flv file, print detail info."
|
||||||
@echo " srs_publish_nossl publish program using srs-librtmp, without ssl(simple handshake)"
|
@echo " srs_publish_nossl publish program using srs-librtmp, without ssl(simple handshake)"
|
||||||
@echo " srs_play_nossl play program using srs-librtmp, without ssl(simple handshake)"
|
@echo " srs_play_nossl play program using srs-librtmp, without ssl(simple handshake)"
|
||||||
@echo " srs_publish_ssl publish program using srs-librtmp, with ssl(complex handshake)"
|
@echo " srs_publish_ssl publish program using srs-librtmp, with ssl(complex handshake)"
|
||||||
|
@ -26,7 +27,7 @@ help:
|
||||||
@echo "Remark: before make this sample, user must make the srs, with/without ssl"
|
@echo "Remark: before make this sample, user must make the srs, with/without ssl"
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -f srs_publish_nossl srs_play_nossl srs_publish_ssl srs_play_ssl srs_ingest_flv_ssl srs_ingest_rtmp_ssl srs_ingest_flv_nossl srs_ingest_rtmp_nossl
|
@rm -f srs_flv_parser srs_publish_nossl srs_play_nossl srs_publish_ssl srs_play_ssl srs_ingest_flv_ssl srs_ingest_rtmp_ssl srs_ingest_flv_nossl srs_ingest_rtmp_nossl
|
||||||
|
|
||||||
# srs library root
|
# srs library root
|
||||||
SRS_OBJS = ../../objs
|
SRS_OBJS = ../../objs
|
||||||
|
@ -51,6 +52,9 @@ ifeq ($(GCC), mipsel-openwrt-linux-gcc)
|
||||||
EXTRA_CXX_FLAG = -g -O0 -ldl -lstdc++ -lgcc_eh
|
EXTRA_CXX_FLAG = -g -O0 -ldl -lstdc++ -lgcc_eh
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
srs_flv_parser_nossl: srs_flv_parser.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L)
|
||||||
|
$(GCC) srs_flv_parser.c $(SRS_LIBRTMP_L) $(EXTRA_CXX_FLAG) -o srs_flv_parser_nossl
|
||||||
|
|
||||||
srs_publish_nossl: srs_publish.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L)
|
srs_publish_nossl: srs_publish.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L)
|
||||||
$(GCC) srs_publish.c $(SRS_LIBRTMP_L) $(EXTRA_CXX_FLAG) -o srs_publish_nossl
|
$(GCC) srs_publish.c $(SRS_LIBRTMP_L) $(EXTRA_CXX_FLAG) -o srs_publish_nossl
|
||||||
|
|
||||||
|
@ -63,6 +67,9 @@ srs_ingest_flv_nossl: srs_ingest_flv.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(S
|
||||||
srs_ingest_rtmp_nossl: srs_ingest_rtmp.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L)
|
srs_ingest_rtmp_nossl: srs_ingest_rtmp.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L)
|
||||||
$(GCC) srs_ingest_rtmp.c $(SRS_LIBRTMP_L) $(EXTRA_CXX_FLAG) -o srs_ingest_rtmp_nossl
|
$(GCC) srs_ingest_rtmp.c $(SRS_LIBRTMP_L) $(EXTRA_CXX_FLAG) -o srs_ingest_rtmp_nossl
|
||||||
|
|
||||||
|
srs_flv_parser_ssl: srs_flv_parser.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L)
|
||||||
|
$(GCC) srs_flv_parser.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o srs_flv_parser_ssl
|
||||||
|
|
||||||
srs_publish_ssl: srs_publish.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L)
|
srs_publish_ssl: srs_publish.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L)
|
||||||
$(GCC) srs_publish.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o srs_publish_ssl
|
$(GCC) srs_publish.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o srs_publish_ssl
|
||||||
|
|
||||||
|
@ -76,5 +83,5 @@ srs_ingest_rtmp_ssl: srs_ingest_rtmp.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(S
|
||||||
$(GCC) srs_ingest_rtmp.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o srs_ingest_rtmp_ssl
|
$(GCC) srs_ingest_rtmp.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o srs_ingest_rtmp_ssl
|
||||||
|
|
||||||
# alias for publish/play with/without ssl
|
# alias for publish/play with/without ssl
|
||||||
ssl: srs_publish_ssl srs_play_ssl srs_ingest_flv_ssl srs_ingest_rtmp_ssl
|
ssl: srs_flv_parser_ssl srs_publish_ssl srs_play_ssl srs_ingest_flv_ssl srs_ingest_rtmp_ssl
|
||||||
nossl: srs_publish_nossl srs_play_nossl srs_ingest_flv_nossl srs_ingest_rtmp_nossl
|
nossl: srs_flv_parser_nossl srs_publish_nossl srs_play_nossl srs_ingest_flv_nossl srs_ingest_rtmp_nossl
|
||||||
|
|
147
trunk/research/librtmp/srs_flv_codec.h
Normal file
147
trunk/research/librtmp/srs_flv_codec.h
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
/*
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2013-2014 winlin
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SRS_RESEARH_FLV_CODEC_HPP
|
||||||
|
#define SRS_RESEARH_FLV_CODEC_HPP
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include "srs_flv_codec.h"
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#define ERROR_FLV_CODEC_EOF 100
|
||||||
|
|
||||||
|
int open_flv_file(char* in_flv_file)
|
||||||
|
{
|
||||||
|
return open(in_flv_file, O_RDONLY);
|
||||||
|
}
|
||||||
|
|
||||||
|
void close_flv_file(int fd)
|
||||||
|
{
|
||||||
|
if (fd > 0) {
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int flv_open_ic(int flv_fd)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
char h[13]; // 9+4
|
||||||
|
|
||||||
|
if (read(flv_fd, h, sizeof(h)) != sizeof(h)) {
|
||||||
|
ret = -1;
|
||||||
|
trace("read flv header failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (h[0] != 'F' || h[1] != 'L' || h[2] != 'V') {
|
||||||
|
ret = -1;
|
||||||
|
trace("input is not a flv file. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int flv_read_packet(int flv_fd, int* type, u_int32_t* timestamp, char** data, int* size)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
char th[11]; // tag header
|
||||||
|
char ts[4]; // tag size
|
||||||
|
|
||||||
|
int32_t data_size = 0;
|
||||||
|
u_int32_t time = 0;
|
||||||
|
|
||||||
|
char* pp;
|
||||||
|
|
||||||
|
// read tag header
|
||||||
|
if ((ret = read(flv_fd, th, sizeof(th))) != sizeof(th)) {
|
||||||
|
if (ret == 0) {
|
||||||
|
return ERROR_FLV_CODEC_EOF;
|
||||||
|
}
|
||||||
|
ret = -1;
|
||||||
|
trace("read flv tag header failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reserved UB [2]
|
||||||
|
// Filter UB [1]
|
||||||
|
// TagType UB [5]
|
||||||
|
*type = (int)(th[0] & 0x1F);
|
||||||
|
|
||||||
|
// DataSize UI24
|
||||||
|
pp = (char*)&data_size;
|
||||||
|
pp[2] = th[1];
|
||||||
|
pp[1] = th[2];
|
||||||
|
pp[0] = th[3];
|
||||||
|
|
||||||
|
// Timestamp UI24
|
||||||
|
pp = (char*)&time;
|
||||||
|
pp[2] = th[4];
|
||||||
|
pp[1] = th[5];
|
||||||
|
pp[0] = th[6];
|
||||||
|
|
||||||
|
// TimestampExtended UI8
|
||||||
|
pp[3] = th[7];
|
||||||
|
|
||||||
|
*timestamp = time;
|
||||||
|
|
||||||
|
// check data size.
|
||||||
|
if (data_size <= 0) {
|
||||||
|
ret = -1;
|
||||||
|
trace("invalid data size. size=%d, ret=%d", data_size, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// read tag data.
|
||||||
|
*size = data_size;
|
||||||
|
*data = (char*)malloc(data_size);
|
||||||
|
if ((ret = read(flv_fd, *data, data_size)) != data_size) {
|
||||||
|
if (ret == 0) {
|
||||||
|
return ERROR_FLV_CODEC_EOF;
|
||||||
|
}
|
||||||
|
ret = -1;
|
||||||
|
trace("read flv tag data failed. size=%d, ret=%d", data_size, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ignore 4bytes tag size.
|
||||||
|
if ((ret = read(flv_fd, ts, sizeof(ts))) != sizeof(ts)) {
|
||||||
|
if (ret == 0) {
|
||||||
|
return ERROR_FLV_CODEC_EOF;
|
||||||
|
}
|
||||||
|
ret = -1;
|
||||||
|
trace("read flv tag size failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -34,15 +34,11 @@ gcc srs_ingest_flv.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_ingest_
|
||||||
|
|
||||||
#include "../../objs/include/srs_librtmp.h"
|
#include "../../objs/include/srs_librtmp.h"
|
||||||
#include "srs_research_public.h"
|
#include "srs_research_public.h"
|
||||||
|
#include "srs_flv_codec.h"
|
||||||
|
|
||||||
int proxy(int flv_fd, srs_rtmp_t ortmp);
|
int proxy(int flv_fd, srs_rtmp_t ortmp);
|
||||||
int connect_oc(srs_rtmp_t ortmp);
|
int connect_oc(srs_rtmp_t ortmp);
|
||||||
|
|
||||||
int open_flv_file(char* in_flv_file);
|
|
||||||
void close_flv_file(int flv_fd);
|
|
||||||
int flv_open_ic(int flv_fd);
|
|
||||||
int flv_read_packet(int flv_fd, int* type, u_int32_t* timestamp, char** data, int* size);
|
|
||||||
|
|
||||||
#define RE_PULSE_MS 300
|
#define RE_PULSE_MS 300
|
||||||
int64_t re_create();
|
int64_t re_create();
|
||||||
void re_update(int64_t re, u_int32_t time);
|
void re_update(int64_t re, u_int32_t time);
|
||||||
|
@ -234,103 +230,3 @@ void re_cleanup(int64_t re, u_int32_t time)
|
||||||
usleep(diff * 1000);
|
usleep(diff * 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int open_flv_file(char* in_flv_file)
|
|
||||||
{
|
|
||||||
return open(in_flv_file, O_RDONLY);
|
|
||||||
}
|
|
||||||
|
|
||||||
void close_flv_file(int fd)
|
|
||||||
{
|
|
||||||
if (fd > 0) {
|
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int flv_open_ic(int flv_fd)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
char h[13]; // 9+4
|
|
||||||
|
|
||||||
if (read(flv_fd, h, sizeof(h)) != sizeof(h)) {
|
|
||||||
ret = -1;
|
|
||||||
trace("read flv header failed. ret=%d", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (h[0] != 'F' || h[1] != 'L' || h[2] != 'V') {
|
|
||||||
ret = -1;
|
|
||||||
trace("input is not a flv file. ret=%d", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int flv_read_packet(int flv_fd, int* type, u_int32_t* timestamp, char** data, int* size)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
char th[11]; // tag header
|
|
||||||
char ts[4]; // tag size
|
|
||||||
|
|
||||||
int32_t data_size = 0;
|
|
||||||
u_int32_t time = 0;
|
|
||||||
|
|
||||||
char* pp;
|
|
||||||
|
|
||||||
// read tag header
|
|
||||||
if (read(flv_fd, th, sizeof(th)) != sizeof(th)) {
|
|
||||||
ret = -1;
|
|
||||||
trace("read flv tag header failed. ret=%d", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reserved UB [2]
|
|
||||||
// Filter UB [1]
|
|
||||||
// TagType UB [5]
|
|
||||||
*type = (int)(th[0] & 0x1F);
|
|
||||||
|
|
||||||
// DataSize UI24
|
|
||||||
pp = (char*)&data_size;
|
|
||||||
pp[2] = th[1];
|
|
||||||
pp[1] = th[2];
|
|
||||||
pp[0] = th[3];
|
|
||||||
|
|
||||||
// Timestamp UI24
|
|
||||||
pp = (char*)&time;
|
|
||||||
pp[2] = th[4];
|
|
||||||
pp[1] = th[5];
|
|
||||||
pp[0] = th[6];
|
|
||||||
|
|
||||||
// TimestampExtended UI8
|
|
||||||
pp[3] = th[7];
|
|
||||||
|
|
||||||
*timestamp = time;
|
|
||||||
|
|
||||||
// check data size.
|
|
||||||
if (data_size <= 0) {
|
|
||||||
ret = -1;
|
|
||||||
trace("invalid data size. size=%d, ret=%d", data_size, ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// read tag data.
|
|
||||||
*size = data_size;
|
|
||||||
*data = (char*)malloc(data_size);
|
|
||||||
if (read(flv_fd, *data, data_size) != data_size) {
|
|
||||||
ret = -1;
|
|
||||||
trace("read flv tag data failed. size=%d, ret=%d", data_size, ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ignore 4bytes tag size.
|
|
||||||
if (read(flv_fd, ts, sizeof(ts)) != sizeof(ts)) {
|
|
||||||
ret = -1;
|
|
||||||
trace("read flv tag size failed. ret=%d", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
|
@ -36,6 +36,8 @@ using namespace std;
|
||||||
#include <srs_core_autofree.hpp>
|
#include <srs_core_autofree.hpp>
|
||||||
#include <srs_protocol_rtmp_stack.hpp>
|
#include <srs_protocol_rtmp_stack.hpp>
|
||||||
#include <srs_kernel_utility.hpp>
|
#include <srs_kernel_utility.hpp>
|
||||||
|
#include <srs_kernel_stream.hpp>
|
||||||
|
#include <srs_protocol_amf0.hpp>
|
||||||
|
|
||||||
// if user want to define log, define the folowing macro.
|
// if user want to define log, define the folowing macro.
|
||||||
#ifndef SRS_RTMP_USER_DEFINED_LOG
|
#ifndef SRS_RTMP_USER_DEFINED_LOG
|
||||||
|
@ -406,6 +408,33 @@ int64_t srs_get_time_ms()
|
||||||
return srs_get_system_time_ms();
|
return srs_get_system_time_ms();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srs_amf0_t srs_amf0_parse(char* data, int size)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
srs_amf0_t amf0 = NULL;
|
||||||
|
|
||||||
|
SrsStream stream;
|
||||||
|
if ((ret = stream.initialize(data, size)) != ERROR_SUCCESS) {
|
||||||
|
return amf0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SrsAmf0Any* any = NULL;
|
||||||
|
if ((ret = SrsAmf0Any::discovery(&stream, &any)) != ERROR_SUCCESS) {
|
||||||
|
return amf0;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.reset();
|
||||||
|
if ((ret = any->read(&stream)) != ERROR_SUCCESS) {
|
||||||
|
srs_freep(any);
|
||||||
|
return amf0;
|
||||||
|
}
|
||||||
|
|
||||||
|
amf0 = (srs_amf0_t)any;
|
||||||
|
|
||||||
|
return amf0;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -157,7 +157,14 @@ int srs_version_revision();
|
||||||
/**
|
/**
|
||||||
* utilities
|
* utilities
|
||||||
*/
|
*/
|
||||||
extern int64_t srs_get_time_ms();
|
int64_t srs_get_time_ms();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* amf0 codec
|
||||||
|
*/
|
||||||
|
// the output handler.
|
||||||
|
typedef void* srs_amf0_t;
|
||||||
|
srs_amf0_t srs_amf0_parse(char* data, int size);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,6 +109,8 @@ file
|
||||||
..\utest\srs_utest_handshake.hpp,
|
..\utest\srs_utest_handshake.hpp,
|
||||||
..\utest\srs_utest_handshake.cpp,
|
..\utest\srs_utest_handshake.cpp,
|
||||||
research readonly separator,
|
research readonly separator,
|
||||||
|
..\..\research\librtmp\srs_flv_codec.h,
|
||||||
|
..\..\research\librtmp\srs_flv_parser.c,
|
||||||
..\..\research\librtmp\srs_ingest_flv.c,
|
..\..\research\librtmp\srs_ingest_flv.c,
|
||||||
..\..\research\librtmp\srs_ingest_rtmp.c,
|
..\..\research\librtmp\srs_ingest_rtmp.c,
|
||||||
..\..\research\librtmp\srs_play.c,
|
..\..\research\librtmp\srs_play.c,
|
||||||
|
|
Loading…
Reference in a new issue