正在显示
3 个修改的文件
包含
84 行增加
和
2 行删除
@@ -25,21 +25,63 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -25,21 +25,63 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
25 | 25 | ||
26 | #include <srs_kernel_error.hpp> | 26 | #include <srs_kernel_error.hpp> |
27 | #include <srs_protocol_rtmp.hpp> | 27 | #include <srs_protocol_rtmp.hpp> |
28 | +#include <srs_kernel_log.hpp> | ||
29 | + | ||
30 | +// when error, edge ingester sleep for a while and retry. | ||
31 | +#define SRS_EDGE_INGESTER_SLEEP_US (int64_t)(3*1000*1000LL) | ||
32 | + | ||
33 | +SrsEdgeIngester::SrsEdgeIngester() | ||
34 | +{ | ||
35 | + _edge = NULL; | ||
36 | + _req = NULL; | ||
37 | + pthread = new SrsThread(this, SRS_EDGE_INGESTER_SLEEP_US); | ||
38 | +} | ||
39 | + | ||
40 | +SrsEdgeIngester::~SrsEdgeIngester() | ||
41 | +{ | ||
42 | +} | ||
43 | + | ||
44 | +int SrsEdgeIngester::initialize(SrsEdge* edge, SrsRequest* req) | ||
45 | +{ | ||
46 | + int ret = ERROR_SUCCESS; | ||
47 | + | ||
48 | + _edge = edge; | ||
49 | + _req = req; | ||
50 | + | ||
51 | + return ret; | ||
52 | +} | ||
53 | + | ||
54 | +int SrsEdgeIngester::start() | ||
55 | +{ | ||
56 | + int ret = ERROR_SUCCESS; | ||
57 | + return ret; | ||
58 | + //return pthread->start(); | ||
59 | +} | ||
60 | + | ||
61 | +int SrsEdgeIngester::cycle() | ||
62 | +{ | ||
63 | + int ret = ERROR_SUCCESS; | ||
64 | + return ret; | ||
65 | +} | ||
28 | 66 | ||
29 | SrsEdge::SrsEdge() | 67 | SrsEdge::SrsEdge() |
30 | { | 68 | { |
31 | state = SrsEdgeStateInit; | 69 | state = SrsEdgeStateInit; |
70 | + ingester = new SrsEdgeIngester(); | ||
32 | } | 71 | } |
33 | 72 | ||
34 | SrsEdge::~SrsEdge() | 73 | SrsEdge::~SrsEdge() |
35 | { | 74 | { |
75 | + srs_freep(ingester); | ||
36 | } | 76 | } |
37 | 77 | ||
38 | int SrsEdge::initialize(SrsRequest* req) | 78 | int SrsEdge::initialize(SrsRequest* req) |
39 | { | 79 | { |
40 | int ret = ERROR_SUCCESS; | 80 | int ret = ERROR_SUCCESS; |
41 | 81 | ||
42 | - _req = req; | 82 | + if ((ret = ingester->initialize(this, req)) != ERROR_SUCCESS) { |
83 | + return ret; | ||
84 | + } | ||
43 | 85 | ||
44 | return ret; | 86 | return ret; |
45 | } | 87 | } |
@@ -47,6 +89,20 @@ int SrsEdge::initialize(SrsRequest* req) | @@ -47,6 +89,20 @@ int SrsEdge::initialize(SrsRequest* req) | ||
47 | int SrsEdge::on_client_play() | 89 | int SrsEdge::on_client_play() |
48 | { | 90 | { |
49 | int ret = ERROR_SUCCESS; | 91 | int ret = ERROR_SUCCESS; |
92 | + | ||
93 | + // error state. | ||
94 | + if (state == SrsEdgeStateAborting || state == SrsEdgeStateReloading) { | ||
95 | + ret = ERROR_RTMP_EDGE_PLAY_STATE; | ||
96 | + srs_error("invalid state for client to play stream on edge. state=%d, ret=%d", state, ret); | ||
97 | + return ret; | ||
98 | + } | ||
99 | + | ||
100 | + // start ingest when init state. | ||
101 | + if (state == SrsEdgeStateInit) { | ||
102 | + state = SrsEdgeStatePlay; | ||
103 | + return ingester->start(); | ||
104 | + } | ||
105 | + | ||
50 | return ret; | 106 | return ret; |
51 | } | 107 | } |
52 | 108 |
@@ -30,6 +30,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -30,6 +30,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
30 | 30 | ||
31 | #include <srs_core.hpp> | 31 | #include <srs_core.hpp> |
32 | 32 | ||
33 | +#include <srs_app_thread.hpp> | ||
34 | + | ||
35 | +class SrsEdge; | ||
33 | class SrsRequest; | 36 | class SrsRequest; |
34 | 37 | ||
35 | /** | 38 | /** |
@@ -46,13 +49,33 @@ enum SrsEdgeState | @@ -46,13 +49,33 @@ enum SrsEdgeState | ||
46 | }; | 49 | }; |
47 | 50 | ||
48 | /** | 51 | /** |
52 | +* edge used to ingest stream from origin. | ||
53 | +*/ | ||
54 | +class SrsEdgeIngester : public ISrsThreadHandler | ||
55 | +{ | ||
56 | +private: | ||
57 | + SrsEdge* _edge; | ||
58 | + SrsRequest* _req; | ||
59 | + SrsThread* pthread; | ||
60 | +public: | ||
61 | + SrsEdgeIngester(); | ||
62 | + virtual ~SrsEdgeIngester(); | ||
63 | +public: | ||
64 | + virtual int initialize(SrsEdge* edge, SrsRequest* req); | ||
65 | + virtual int start(); | ||
66 | +// interface ISrsThreadHandler | ||
67 | +public: | ||
68 | + virtual int cycle(); | ||
69 | +}; | ||
70 | + | ||
71 | +/** | ||
49 | * edge control service. | 72 | * edge control service. |
50 | */ | 73 | */ |
51 | class SrsEdge | 74 | class SrsEdge |
52 | { | 75 | { |
53 | private: | 76 | private: |
54 | - SrsRequest* _req; | ||
55 | SrsEdgeState state; | 77 | SrsEdgeState state; |
78 | + SrsEdgeIngester* ingester; | ||
56 | public: | 79 | public: |
57 | SrsEdge(); | 80 | SrsEdge(); |
58 | virtual ~SrsEdge(); | 81 | virtual ~SrsEdge(); |
@@ -76,6 +76,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -76,6 +76,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
76 | // 2. srs-librtmp return error, to terminate the program. | 76 | // 2. srs-librtmp return error, to terminate the program. |
77 | #define ERROR_RTMP_HS_SSL_REQUIRE 318 | 77 | #define ERROR_RTMP_HS_SSL_REQUIRE 318 |
78 | #define ERROR_RTMP_DURATION_EXCEED 319 | 78 | #define ERROR_RTMP_DURATION_EXCEED 319 |
79 | +// edge specified errors | ||
80 | +// invalid state for client to play edge stream. | ||
81 | +#define ERROR_RTMP_EDGE_PLAY_STATE 320 | ||
79 | 82 | ||
80 | #define ERROR_SYSTEM_STREAM_INIT 400 | 83 | #define ERROR_SYSTEM_STREAM_INIT 400 |
81 | #define ERROR_SYSTEM_PACKET_INVALID 401 | 84 | #define ERROR_SYSTEM_PACKET_INVALID 401 |
-
请 注册 或 登录 后发表评论