winlin

move codec to kernel.

@@ -23,7 +23,7 @@ git clone https://code.csdn.net/winlinvip/srs-csdn.git @@ -23,7 +23,7 @@ git clone https://code.csdn.net/winlinvip/srs-csdn.git
23 报告问题(BugReport): [https://github.com/winlinvip/simple-rtmp-server/issues/new](https://github.com/winlinvip/simple-rtmp-server/issues/new)<br/> 23 报告问题(BugReport): [https://github.com/winlinvip/simple-rtmp-server/issues/new](https://github.com/winlinvip/simple-rtmp-server/issues/new)<br/>
24 中文资料(Wiki): [https://github.com/winlinvip/simple-rtmp-server/wiki](https://github.com/winlinvip/simple-rtmp-server/wiki) <br/> 24 中文资料(Wiki): [https://github.com/winlinvip/simple-rtmp-server/wiki](https://github.com/winlinvip/simple-rtmp-server/wiki) <br/>
25 使用步骤(Usage): [https://github.com/winlinvip/simple-rtmp-server#usage](#usage) <br/> 25 使用步骤(Usage): [https://github.com/winlinvip/simple-rtmp-server#usage](#usage) <br/>
26 -公用机器(LiveShow): [https://github.com/winlinvip/simple-rtmp-server/wiki/LiveShow](供大家学习和使用的公用服务器) <br/> 26 +公用机器(LiveShow): [https://github.com/winlinvip/simple-rtmp-server/wiki/LiveShow](https://github.com/winlinvip/simple-rtmp-server/wiki/LiveShow) <br/>
27 捐款(Donation): [GitHub](http://winlinvip.github.io/srs.release/donation/index.html) 27 捐款(Donation): [GitHub](http://winlinvip.github.io/srs.release/donation/index.html)
28 [阿里云镜像](http://182.92.80.26:8085/srs/donation/index.html) ,查看 28 [阿里云镜像](http://182.92.80.26:8085/srs/donation/index.html) ,查看
29 [捐献墙(Donations)](https://github.com/winlinvip/simple-rtmp-server/blob/master/DONATIONS.txt)<br/> 29 [捐献墙(Donations)](https://github.com/winlinvip/simple-rtmp-server/blob/master/DONATIONS.txt)<br/>
@@ -447,7 +447,7 @@ MODULE_ID="KERNEL" @@ -447,7 +447,7 @@ MODULE_ID="KERNEL"
447 MODULE_DEPENDS=("CORE") 447 MODULE_DEPENDS=("CORE")
448 ModuleLibIncs=(${SRS_OBJS}) 448 ModuleLibIncs=(${SRS_OBJS})
449 MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_stream" "srs_kernel_buffer" 449 MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_stream" "srs_kernel_buffer"
450 - "srs_kernel_utility" "srs_kernel_flv") 450 + "srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec")
451 KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . auto/modules.sh 451 KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . auto/modules.sh
452 KERNEL_OBJS="${MODULE_OBJS[@]}" 452 KERNEL_OBJS="${MODULE_OBJS[@]}"
453 # 453 #
@@ -465,7 +465,7 @@ MODULE_ID="APP" @@ -465,7 +465,7 @@ MODULE_ID="APP"
465 MODULE_DEPENDS=("CORE" "KERNEL" "RTMP") 465 MODULE_DEPENDS=("CORE" "KERNEL" "RTMP")
466 ModuleLibIncs=(${LibSTRoot} ${LibHttpParserRoot} ${SRS_OBJS}) 466 ModuleLibIncs=(${LibSTRoot} ${LibHttpParserRoot} ${SRS_OBJS})
467 MODULE_FILES=("srs_app_server" "srs_app_conn" "srs_app_rtmp_conn" "srs_app_socket" "srs_app_source" 467 MODULE_FILES=("srs_app_server" "srs_app_conn" "srs_app_rtmp_conn" "srs_app_socket" "srs_app_source"
468 - "srs_app_codec" "srs_app_refer" "srs_app_hls" "srs_app_forward" "srs_app_encoder" "srs_app_http" 468 + "srs_app_refer" "srs_app_hls" "srs_app_forward" "srs_app_encoder" "srs_app_http"
469 "srs_app_thread" "srs_app_bandwidth" "srs_app_st" "srs_app_log" "srs_app_config" 469 "srs_app_thread" "srs_app_bandwidth" "srs_app_st" "srs_app_log" "srs_app_config"
470 "srs_app_pithy_print" "srs_app_reload" "srs_app_http_api" "srs_app_http_conn" "srs_app_http_hooks" 470 "srs_app_pithy_print" "srs_app_reload" "srs_app_http_api" "srs_app_http_conn" "srs_app_http_hooks"
471 "srs_app_json" "srs_app_ingest" "srs_app_ffmpeg" "srs_app_utility" "srs_app_dvr" "srs_app_edge" 471 "srs_app_json" "srs_app_ingest" "srs_app_ffmpeg" "srs_app_utility" "srs_app_dvr" "srs_app_edge"
@@ -50,6 +50,7 @@ int main(int argc, char** argv) @@ -50,6 +50,7 @@ int main(int argc, char** argv)
50 srs_flv_t oc = NULL; 50 srs_flv_t oc = NULL;
51 51
52 // temp variables. 52 // temp variables.
  53 + int tmp_file_size = 0;
53 char* tmp_file; 54 char* tmp_file;
54 55
55 if (argc <= 2) { 56 if (argc <= 2) {
@@ -68,20 +69,30 @@ int main(int argc, char** argv) @@ -68,20 +69,30 @@ int main(int argc, char** argv)
68 in_flv_file = argv[1]; 69 in_flv_file = argv[1];
69 out_flv_file = argv[2]; 70 out_flv_file = argv[2];
70 71
71 - tmp_file = (char*)malloc(strlen(out_flv_file) + strlen(".tmp") + 1); 72 + tmp_file_size = strlen(out_flv_file) + strlen(".tmp") + 1;
  73 + tmp_file = (char*)malloc(tmp_file_size);
  74 + snprintf(tmp_file, tmp_file_size, "%s.tmp", out_flv_file);
72 75
73 trace("inject flv file keyframes to metadata."); 76 trace("inject flv file keyframes to metadata.");
74 trace("srs(simple-rtmp-server) client librtmp library."); 77 trace("srs(simple-rtmp-server) client librtmp library.");
75 trace("version: %d.%d.%d", srs_version_major(), srs_version_minor(), srs_version_revision()); 78 trace("version: %d.%d.%d", srs_version_major(), srs_version_minor(), srs_version_revision());
76 trace("input: %s", in_flv_file); 79 trace("input: %s", in_flv_file);
77 trace("output: %s", out_flv_file); 80 trace("output: %s", out_flv_file);
  81 + trace("tmp_file: %s", tmp_file);
78 82
79 - if ((ret = process(in_flv_file, out_flv_file, &ic, &oc)) != 0) {  
80 - return ret;  
81 - } 83 + ret = process(in_flv_file, tmp_file, &ic, &oc);
82 84
83 srs_flv_close(ic); 85 srs_flv_close(ic);
84 srs_flv_close(oc); 86 srs_flv_close(oc);
  87 +
  88 + if (ret != 0) {
  89 + unlink(tmp_file);
  90 + trace("error, remove tmp file.");
  91 + } else {
  92 + rename(tmp_file, out_flv_file);
  93 + trace("completed, rename to %s", out_flv_file);
  94 + }
  95 +
85 free(tmp_file); 96 free(tmp_file);
86 97
87 return ret; 98 return ret;
@@ -110,9 +121,86 @@ int process(const char* in_flv_file, const char* out_flv_file, srs_flv_t* pic, s @@ -110,9 +121,86 @@ int process(const char* in_flv_file, const char* out_flv_file, srs_flv_t* pic, s
110 return ret; 121 return ret;
111 } 122 }
112 123
  124 +int parse_metadata(char* data, int size, srs_amf0_t* pname, srs_amf0_t* pdata)
  125 +{
  126 + int ret = 0;
  127 +
  128 + int nparsed = 0;
  129 + *pname = srs_amf0_parse(data, size, &nparsed);
  130 +
  131 + if (*pname == NULL || nparsed >= size) {
  132 + trace("invalid amf0 name data.");
  133 + return -1;
  134 + }
  135 +
  136 + *pdata = srs_amf0_parse(data + nparsed, size - nparsed, &nparsed);
  137 + if (*pdata == NULL || nparsed > size) {
  138 + trace("invalid amf0 value data");
  139 + return -1;
  140 + }
  141 +
  142 + return ret;
  143 +}
  144 +
113 int inject_flv(srs_flv_t ic, srs_flv_t oc) 145 int inject_flv(srs_flv_t ic, srs_flv_t oc)
114 { 146 {
115 int ret = 0; 147 int ret = 0;
116 148
  149 + // flv header
  150 + char header[13];
  151 + // packet data
  152 + char type;
  153 + u_int32_t timestamp = 0;
  154 + char* data = NULL;
  155 + int32_t size;
  156 +
  157 + // metadata
  158 + srs_amf0_t amf0_name = NULL;
  159 + srs_amf0_t amf0_data = NULL;
  160 +
  161 + // reset to generate metadata
  162 + srs_flv_lseek(ic, 0);
  163 +
  164 + if ((ret = srs_flv_read_header(oc, header)) != 0) {
  165 + return ret;
  166 + }
  167 +
  168 + trace("start inject flv");
  169 + for (;;) {
  170 + // tag header
  171 + if ((ret = srs_flv_read_tag_header(oc, &type, &size, &timestamp)) != 0) {
  172 + if (srs_flv_is_eof(ret)) {
  173 + trace("parse completed.");
  174 + return 0;
  175 + }
  176 + trace("flv get packet failed. ret=%d", ret);
  177 + return ret;
  178 + }
  179 +
  180 + if (size <= 0) {
  181 + trace("invalid size=%d", size);
  182 + break;
  183 + }
  184 +
  185 + // TODO: FIXME: mem leak when error.
  186 + data = (char*)malloc(size);
  187 + if ((ret = srs_flv_read_tag_data(oc, data, size)) != 0) {
  188 + return ret;
  189 + }
  190 +
  191 + // data tag
  192 + if (type == SRS_RTMP_TYPE_VIDEO) {
  193 + } else if (type == SRS_RTMP_TYPE_SCRIPT) {
  194 + if ((ret = parse_metadata(data, size, &amf0_name, &amf0_data)) != 0) {
  195 + return ret;
  196 + }
  197 + }
  198 +
  199 + free(data);
  200 + }
  201 +
  202 + srs_amf0_free(amf0_name);
  203 + srs_amf0_free(amf0_data);
  204 +
117 return ret; 205 return ret;
118 } 206 }
@@ -233,7 +233,7 @@ int parse_flv(srs_flv_t flv) @@ -233,7 +233,7 @@ int parse_flv(srs_flv_t flv)
233 trace("parse completed."); 233 trace("parse completed.");
234 return 0; 234 return 0;
235 } 235 }
236 - trace("irtmp get packet failed. ret=%d", ret); 236 + trace("flv get packet failed. ret=%d", ret);
237 return ret; 237 return ret;
238 } 238 }
239 239
@@ -38,7 +38,7 @@ using namespace std; @@ -38,7 +38,7 @@ using namespace std;
38 #include <srs_kernel_stream.hpp> 38 #include <srs_kernel_stream.hpp>
39 #include <srs_kernel_utility.hpp> 39 #include <srs_kernel_utility.hpp>
40 #include <srs_app_http_hooks.hpp> 40 #include <srs_app_http_hooks.hpp>
41 -#include <srs_app_codec.hpp> 41 +#include <srs_kernel_codec.hpp>
42 #include <srs_kernel_flv.hpp> 42 #include <srs_kernel_flv.hpp>
43 43
44 SrsFlvSegment::SrsFlvSegment() 44 SrsFlvSegment::SrsFlvSegment()
@@ -35,7 +35,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -35,7 +35,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using namespace std; 35 using namespace std;
36 36
37 #include <srs_kernel_error.hpp> 37 #include <srs_kernel_error.hpp>
38 -#include <srs_app_codec.hpp> 38 +#include <srs_kernel_codec.hpp>
39 #include <srs_protocol_amf0.hpp> 39 #include <srs_protocol_amf0.hpp>
40 #include <srs_protocol_rtmp_stack.hpp> 40 #include <srs_protocol_rtmp_stack.hpp>
41 #include <srs_app_config.hpp> 41 #include <srs_app_config.hpp>
@@ -30,7 +30,7 @@ using namespace std; @@ -30,7 +30,7 @@ using namespace std;
30 #include <srs_protocol_rtmp_stack.hpp> 30 #include <srs_protocol_rtmp_stack.hpp>
31 #include <srs_core_autofree.hpp> 31 #include <srs_core_autofree.hpp>
32 #include <srs_protocol_amf0.hpp> 32 #include <srs_protocol_amf0.hpp>
33 -#include <srs_app_codec.hpp> 33 +#include <srs_kernel_codec.hpp>
34 #include <srs_app_hls.hpp> 34 #include <srs_app_hls.hpp>
35 #include <srs_app_forward.hpp> 35 #include <srs_app_forward.hpp>
36 #include <srs_app_config.hpp> 36 #include <srs_app_config.hpp>
@@ -21,7 +21,7 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN @@ -21,7 +21,7 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */ 22 */
23 23
24 -#include <srs_app_codec.hpp> 24 +#include <srs_kernel_codec.hpp>
25 25
26 #include <string.h> 26 #include <string.h>
27 #include <stdlib.h> 27 #include <stdlib.h>
@@ -21,11 +21,11 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN @@ -21,11 +21,11 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */ 22 */
23 23
24 -#ifndef SRS_APP_CODEC_HPP  
25 -#define SRS_APP_CODEC_HPP 24 +#ifndef SRS_KERNEL_CODEC_HPP
  25 +#define SRS_KERNEL_CODEC_HPP
26 26
27 /* 27 /*
28 -#include <srs_app_codec.hpp> 28 +#include <srs_kernel_codec.hpp>
29 */ 29 */
30 30
31 #include <srs_core.hpp> 31 #include <srs_core.hpp>
@@ -21,8 +21,8 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN @@ -21,8 +21,8 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */ 22 */
23 23
24 -#ifndef SRS_APP_FLV_HPP  
25 -#define SRS_APP_FLV_HPP 24 +#ifndef SRS_KERNEL_FLV_HPP
  25 +#define SRS_KERNEL_FLV_HPP
26 26
27 /* 27 /*
28 #include <srs_kernel_flv.hpp> 28 #include <srs_kernel_flv.hpp>
@@ -40,6 +40,7 @@ using namespace std; @@ -40,6 +40,7 @@ using namespace std;
40 #include <srs_kernel_stream.hpp> 40 #include <srs_kernel_stream.hpp>
41 #include <srs_protocol_amf0.hpp> 41 #include <srs_protocol_amf0.hpp>
42 #include <srs_kernel_flv.hpp> 42 #include <srs_kernel_flv.hpp>
  43 +#include <srs_kernel_codec.hpp>
43 44
44 // if user want to define log, define the folowing macro. 45 // if user want to define log, define the folowing macro.
45 #ifndef SRS_RTMP_USER_DEFINED_LOG 46 #ifndef SRS_RTMP_USER_DEFINED_LOG
@@ -496,6 +497,12 @@ int64_t srs_flv_tellg(srs_flv_t flv) @@ -496,6 +497,12 @@ int64_t srs_flv_tellg(srs_flv_t flv)
496 return context->fs.tellg(); 497 return context->fs.tellg();
497 } 498 }
498 499
  500 +void srs_flv_lseek(srs_flv_t flv, int64_t offset)
  501 +{
  502 + FlvContext* context = (FlvContext*)flv;
  503 + context->fs.lseek(offset);
  504 +}
  505 +
499 flv_bool srs_flv_is_eof(int error_code) 506 flv_bool srs_flv_is_eof(int error_code)
500 { 507 {
501 return error_code == ERROR_SYSTEM_FILE_EOF; 508 return error_code == ERROR_SYSTEM_FILE_EOF;
@@ -167,6 +167,8 @@ int srs_flv_read_tag_header(srs_flv_t flv, char* ptype, int32_t* pdata_size, u_i @@ -167,6 +167,8 @@ int srs_flv_read_tag_header(srs_flv_t flv, char* ptype, int32_t* pdata_size, u_i
167 int srs_flv_read_tag_data(srs_flv_t flv, char* data, int32_t size); 167 int srs_flv_read_tag_data(srs_flv_t flv, char* data, int32_t size);
168 /* file stream tellg to get offset */ 168 /* file stream tellg to get offset */
169 int64_t srs_flv_tellg(srs_flv_t flv); 169 int64_t srs_flv_tellg(srs_flv_t flv);
  170 +/* seek file stream, offset is form the start of file */
  171 +void srs_flv_lseek(srs_flv_t flv, int64_t offset);
170 /* whether the error code indicates EOF */ 172 /* whether the error code indicates EOF */
171 flv_bool srs_flv_is_eof(int error_code); 173 flv_bool srs_flv_is_eof(int error_code);
172 174
@@ -17,6 +17,8 @@ file @@ -17,6 +17,8 @@ file
17 kernel readonly separator, 17 kernel readonly separator,
18 ..\kernel\srs_kernel_buffer.hpp, 18 ..\kernel\srs_kernel_buffer.hpp,
19 ..\kernel\srs_kernel_buffer.cpp, 19 ..\kernel\srs_kernel_buffer.cpp,
  20 + ..\kernel\srs_kernel_codec.hpp,
  21 + ..\kernel\srs_kernel_codec.cpp,
20 ..\kernel\srs_kernel_error.hpp, 22 ..\kernel\srs_kernel_error.hpp,
21 ..\kernel\srs_kernel_error.cpp, 23 ..\kernel\srs_kernel_error.cpp,
22 ..\kernel\srs_kernel_flv.hpp, 24 ..\kernel\srs_kernel_flv.hpp,
@@ -43,8 +45,6 @@ file @@ -43,8 +45,6 @@ file
43 app readonly separator, 45 app readonly separator,
44 ..\app\srs_app_bandwidth.hpp, 46 ..\app\srs_app_bandwidth.hpp,
45 ..\app\srs_app_bandwidth.cpp, 47 ..\app\srs_app_bandwidth.cpp,
46 - ..\app\srs_app_codec.hpp,  
47 - ..\app\srs_app_codec.cpp,  
48 ..\app\srs_app_conn.hpp, 48 ..\app\srs_app_conn.hpp,
49 ..\app\srs_app_conn.cpp, 49 ..\app\srs_app_conn.cpp,
50 ..\app\srs_app_config.hpp, 50 ..\app\srs_app_config.hpp,