diff --git a/README.md b/README.md index bbf4abfb2..9a598a34e 100755 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ git clone https://code.csdn.net/winlinvip/srs-csdn.git 报告问题(BugReport): [https://github.com/winlinvip/simple-rtmp-server/issues/new](https://github.com/winlinvip/simple-rtmp-server/issues/new)
中文资料(Wiki): [https://github.com/winlinvip/simple-rtmp-server/wiki](https://github.com/winlinvip/simple-rtmp-server/wiki)
使用步骤(Usage): [https://github.com/winlinvip/simple-rtmp-server#usage](#usage)
-公用机器(LiveShow): [https://github.com/winlinvip/simple-rtmp-server/wiki/LiveShow](供大家学习和使用的公用服务器)
+公用机器(LiveShow): [https://github.com/winlinvip/simple-rtmp-server/wiki/LiveShow](https://github.com/winlinvip/simple-rtmp-server/wiki/LiveShow)
捐款(Donation): [GitHub](http://winlinvip.github.io/srs.release/donation/index.html) 或 [阿里云镜像](http://182.92.80.26:8085/srs/donation/index.html) ,查看 [捐献墙(Donations)](https://github.com/winlinvip/simple-rtmp-server/blob/master/DONATIONS.txt)
diff --git a/trunk/configure b/trunk/configure index 836c7660b..838e070f5 100755 --- a/trunk/configure +++ b/trunk/configure @@ -447,7 +447,7 @@ MODULE_ID="KERNEL" MODULE_DEPENDS=("CORE") ModuleLibIncs=(${SRS_OBJS}) MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_stream" "srs_kernel_buffer" - "srs_kernel_utility" "srs_kernel_flv") + "srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec") KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . auto/modules.sh KERNEL_OBJS="${MODULE_OBJS[@]}" # @@ -465,7 +465,7 @@ MODULE_ID="APP" MODULE_DEPENDS=("CORE" "KERNEL" "RTMP") ModuleLibIncs=(${LibSTRoot} ${LibHttpParserRoot} ${SRS_OBJS}) MODULE_FILES=("srs_app_server" "srs_app_conn" "srs_app_rtmp_conn" "srs_app_socket" "srs_app_source" - "srs_app_codec" "srs_app_refer" "srs_app_hls" "srs_app_forward" "srs_app_encoder" "srs_app_http" + "srs_app_refer" "srs_app_hls" "srs_app_forward" "srs_app_encoder" "srs_app_http" "srs_app_thread" "srs_app_bandwidth" "srs_app_st" "srs_app_log" "srs_app_config" "srs_app_pithy_print" "srs_app_reload" "srs_app_http_api" "srs_app_http_conn" "srs_app_http_hooks" "srs_app_json" "srs_app_ingest" "srs_app_ffmpeg" "srs_app_utility" "srs_app_dvr" "srs_app_edge" diff --git a/trunk/research/librtmp/srs_flv_injecter.c b/trunk/research/librtmp/srs_flv_injecter.c index 3828b62fe..445869f92 100644 --- a/trunk/research/librtmp/srs_flv_injecter.c +++ b/trunk/research/librtmp/srs_flv_injecter.c @@ -50,6 +50,7 @@ int main(int argc, char** argv) srs_flv_t oc = NULL; // temp variables. + int tmp_file_size = 0; char* tmp_file; if (argc <= 2) { @@ -68,20 +69,30 @@ int main(int argc, char** argv) in_flv_file = argv[1]; out_flv_file = argv[2]; - tmp_file = (char*)malloc(strlen(out_flv_file) + strlen(".tmp") + 1); + tmp_file_size = strlen(out_flv_file) + strlen(".tmp") + 1; + tmp_file = (char*)malloc(tmp_file_size); + snprintf(tmp_file, tmp_file_size, "%s.tmp", out_flv_file); trace("inject flv file keyframes to metadata."); trace("srs(simple-rtmp-server) client librtmp library."); trace("version: %d.%d.%d", srs_version_major(), srs_version_minor(), srs_version_revision()); trace("input: %s", in_flv_file); trace("output: %s", out_flv_file); + trace("tmp_file: %s", tmp_file); - if ((ret = process(in_flv_file, out_flv_file, &ic, &oc)) != 0) { - return ret; - } + ret = process(in_flv_file, tmp_file, &ic, &oc); srs_flv_close(ic); srs_flv_close(oc); + + if (ret != 0) { + unlink(tmp_file); + trace("error, remove tmp file."); + } else { + rename(tmp_file, out_flv_file); + trace("completed, rename to %s", out_flv_file); + } + free(tmp_file); return ret; @@ -110,9 +121,86 @@ int process(const char* in_flv_file, const char* out_flv_file, srs_flv_t* pic, s return ret; } +int parse_metadata(char* data, int size, srs_amf0_t* pname, srs_amf0_t* pdata) +{ + int ret = 0; + + int nparsed = 0; + *pname = srs_amf0_parse(data, size, &nparsed); + + if (*pname == NULL || nparsed >= size) { + trace("invalid amf0 name data."); + return -1; + } + + *pdata = srs_amf0_parse(data + nparsed, size - nparsed, &nparsed); + if (*pdata == NULL || nparsed > size) { + trace("invalid amf0 value data"); + return -1; + } + + return ret; +} + int inject_flv(srs_flv_t ic, srs_flv_t oc) { int ret = 0; + // flv header + char header[13]; + // packet data + char type; + u_int32_t timestamp = 0; + char* data = NULL; + int32_t size; + + // metadata + srs_amf0_t amf0_name = NULL; + srs_amf0_t amf0_data = NULL; + + // reset to generate metadata + srs_flv_lseek(ic, 0); + + if ((ret = srs_flv_read_header(oc, header)) != 0) { + return ret; + } + + trace("start inject flv"); + for (;;) { + // tag header + if ((ret = srs_flv_read_tag_header(oc, &type, &size, ×tamp)) != 0) { + if (srs_flv_is_eof(ret)) { + trace("parse completed."); + return 0; + } + trace("flv get packet failed. ret=%d", ret); + return ret; + } + + if (size <= 0) { + trace("invalid size=%d", size); + break; + } + + // TODO: FIXME: mem leak when error. + data = (char*)malloc(size); + if ((ret = srs_flv_read_tag_data(oc, data, size)) != 0) { + return ret; + } + + // data tag + if (type == SRS_RTMP_TYPE_VIDEO) { + } else if (type == SRS_RTMP_TYPE_SCRIPT) { + if ((ret = parse_metadata(data, size, &amf0_name, &amf0_data)) != 0) { + return ret; + } + } + + free(data); + } + + srs_amf0_free(amf0_name); + srs_amf0_free(amf0_data); + return ret; } diff --git a/trunk/research/librtmp/srs_flv_parser.c b/trunk/research/librtmp/srs_flv_parser.c index ec0fbdad0..fd8c2de97 100644 --- a/trunk/research/librtmp/srs_flv_parser.c +++ b/trunk/research/librtmp/srs_flv_parser.c @@ -233,7 +233,7 @@ int parse_flv(srs_flv_t flv) trace("parse completed."); return 0; } - trace("irtmp get packet failed. ret=%d", ret); + trace("flv get packet failed. ret=%d", ret); return ret; } diff --git a/trunk/src/app/srs_app_dvr.cpp b/trunk/src/app/srs_app_dvr.cpp index e0a397165..e6d7fde05 100644 --- a/trunk/src/app/srs_app_dvr.cpp +++ b/trunk/src/app/srs_app_dvr.cpp @@ -38,7 +38,7 @@ using namespace std; #include #include #include -#include +#include #include SrsFlvSegment::SrsFlvSegment() diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp index 921ca4080..24bb26603 100644 --- a/trunk/src/app/srs_app_hls.cpp +++ b/trunk/src/app/srs_app_hls.cpp @@ -35,7 +35,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using namespace std; #include -#include +#include #include #include #include diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index e8e50a5c4..7b685f093 100644 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -30,7 +30,7 @@ using namespace std; #include #include #include -#include +#include #include #include #include diff --git a/trunk/src/app/srs_app_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp similarity index 99% rename from trunk/src/app/srs_app_codec.cpp rename to trunk/src/kernel/srs_kernel_codec.cpp index 65da8d7b4..b01dcd617 100644 --- a/trunk/src/app/srs_app_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -21,7 +21,7 @@ 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. */ -#include +#include #include #include diff --git a/trunk/src/app/srs_app_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp similarity index 99% rename from trunk/src/app/srs_app_codec.hpp rename to trunk/src/kernel/srs_kernel_codec.hpp index 4067f864a..a313afd05 100644 --- a/trunk/src/app/srs_app_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -21,11 +21,11 @@ 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_APP_CODEC_HPP -#define SRS_APP_CODEC_HPP +#ifndef SRS_KERNEL_CODEC_HPP +#define SRS_KERNEL_CODEC_HPP /* -#include +#include */ #include diff --git a/trunk/src/kernel/srs_kernel_flv.hpp b/trunk/src/kernel/srs_kernel_flv.hpp index 1d136e0d5..b25680352 100644 --- a/trunk/src/kernel/srs_kernel_flv.hpp +++ b/trunk/src/kernel/srs_kernel_flv.hpp @@ -21,8 +21,8 @@ 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_APP_FLV_HPP -#define SRS_APP_FLV_HPP +#ifndef SRS_KERNEL_FLV_HPP +#define SRS_KERNEL_FLV_HPP /* #include diff --git a/trunk/src/libs/srs_librtmp.cpp b/trunk/src/libs/srs_librtmp.cpp index 10cab1a1e..3f87879d7 100644 --- a/trunk/src/libs/srs_librtmp.cpp +++ b/trunk/src/libs/srs_librtmp.cpp @@ -40,6 +40,7 @@ using namespace std; #include #include #include +#include // if user want to define log, define the folowing macro. #ifndef SRS_RTMP_USER_DEFINED_LOG @@ -496,6 +497,12 @@ int64_t srs_flv_tellg(srs_flv_t flv) return context->fs.tellg(); } +void srs_flv_lseek(srs_flv_t flv, int64_t offset) +{ + FlvContext* context = (FlvContext*)flv; + context->fs.lseek(offset); +} + flv_bool srs_flv_is_eof(int error_code) { return error_code == ERROR_SYSTEM_FILE_EOF; diff --git a/trunk/src/libs/srs_librtmp.hpp b/trunk/src/libs/srs_librtmp.hpp index 3b8e4e532..59ce79362 100644 --- a/trunk/src/libs/srs_librtmp.hpp +++ b/trunk/src/libs/srs_librtmp.hpp @@ -167,6 +167,8 @@ int srs_flv_read_tag_header(srs_flv_t flv, char* ptype, int32_t* pdata_size, u_i int srs_flv_read_tag_data(srs_flv_t flv, char* data, int32_t size); /* file stream tellg to get offset */ int64_t srs_flv_tellg(srs_flv_t flv); +/* seek file stream, offset is form the start of file */ +void srs_flv_lseek(srs_flv_t flv, int64_t offset); /* whether the error code indicates EOF */ flv_bool srs_flv_is_eof(int error_code); diff --git a/trunk/src/srs/srs.upp b/trunk/src/srs/srs.upp index cb9b88010..458d3d0c8 100755 --- a/trunk/src/srs/srs.upp +++ b/trunk/src/srs/srs.upp @@ -17,6 +17,8 @@ file kernel readonly separator, ..\kernel\srs_kernel_buffer.hpp, ..\kernel\srs_kernel_buffer.cpp, + ..\kernel\srs_kernel_codec.hpp, + ..\kernel\srs_kernel_codec.cpp, ..\kernel\srs_kernel_error.hpp, ..\kernel\srs_kernel_error.cpp, ..\kernel\srs_kernel_flv.hpp, @@ -43,8 +45,6 @@ file app readonly separator, ..\app\srs_app_bandwidth.hpp, ..\app\srs_app_bandwidth.cpp, - ..\app\srs_app_codec.hpp, - ..\app\srs_app_codec.cpp, ..\app\srs_app_conn.hpp, ..\app\srs_app_conn.cpp, ..\app\srs_app_config.hpp,