mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
use directly send publish edge mode.
This commit is contained in:
parent
2295ebb346
commit
bc7648724d
6 changed files with 91 additions and 201 deletions
|
@ -307,23 +307,6 @@ int SrsEdgeIngester::connect_server()
|
|||
return ret;
|
||||
}
|
||||
|
||||
SrsEdgeProxyContext::SrsEdgeProxyContext()
|
||||
{
|
||||
edge_stream_id = 0;
|
||||
edge_io = NULL;
|
||||
edge_rtmp = NULL;
|
||||
edge_stfd = NULL;
|
||||
|
||||
origin_stream_id = 0;
|
||||
origin_io = NULL;
|
||||
origin_rtmp = NULL;
|
||||
origin_stfd = NULL;
|
||||
}
|
||||
|
||||
SrsEdgeProxyContext::~SrsEdgeProxyContext()
|
||||
{
|
||||
}
|
||||
|
||||
SrsEdgeForwarder::SrsEdgeForwarder()
|
||||
{
|
||||
io = NULL;
|
||||
|
@ -395,129 +378,30 @@ void SrsEdgeForwarder::stop()
|
|||
srs_freep(io);
|
||||
}
|
||||
|
||||
int SrsEdgeForwarder::proxy(SrsEdgeProxyContext* context)
|
||||
int SrsEdgeForwarder::proxy(SrsCommonMessage* msg)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
context->origin_io = io;
|
||||
context->origin_rtmp = client;
|
||||
context->origin_stream_id = stream_id;
|
||||
context->origin_stfd = stfd;
|
||||
|
||||
context->origin_rtmp->set_recv_timeout(SRS_RECV_TIMEOUT_US);
|
||||
context->edge_rtmp->set_recv_timeout(SRS_RECV_TIMEOUT_US);
|
||||
|
||||
SrsPithyPrint pithy_print(SRS_STAGE_EDGE);
|
||||
|
||||
pollfd fds[2];
|
||||
fds[0].fd = st_netfd_fileno(context->edge_stfd);
|
||||
fds[0].events = POLLIN;
|
||||
|
||||
fds[1].fd = st_netfd_fileno(context->origin_stfd);
|
||||
fds[1].events = POLLIN;
|
||||
|
||||
while (true) {
|
||||
// switch to other st-threads.
|
||||
st_usleep(0);
|
||||
|
||||
pithy_print.elapse();
|
||||
|
||||
// pithy print
|
||||
if (pithy_print.can_print()) {
|
||||
srs_trace("<- time=%"PRId64", obytes=%"PRId64", ibytes=%"PRId64", okbps=%d, ikbps=%d",
|
||||
pithy_print.age(), client->get_send_bytes(), client->get_recv_bytes(), client->get_send_kbps(), client->get_recv_kbps());
|
||||
}
|
||||
|
||||
fds[0].revents = 0;
|
||||
fds[1].revents = 0;
|
||||
|
||||
// Upon successful completion, a non-negative value is returned.
|
||||
// A positive value indicates the total number of OS file descriptors in pds that have events.
|
||||
// A value of 0 indicates that the call timed out.
|
||||
// Upon failure, a value of -1 is returned and errno is set to indicate the error
|
||||
if(st_poll(fds, 2, ST_UTIME_NO_TIMEOUT) <= 0){
|
||||
ret = ERROR_RTMP_EDGE_PROXY_PULL;
|
||||
srs_error("edge wait for st_poll error. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
// edge active
|
||||
if(fds[0].revents & POLLIN){
|
||||
if((ret = proxy_edge_message(context)) != ERROR_SUCCESS){
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
// origin active
|
||||
if(fds[1].revents & POLLIN){
|
||||
if((ret = proxy_origin_message(context)) != ERROR_SUCCESS){
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int SrsEdgeForwarder::proxy_origin_message(SrsEdgeProxyContext* context)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
SrsCommonMessage* msg = NULL;
|
||||
|
||||
// process origin message.
|
||||
ret = context->origin_rtmp->recv_message(&msg);
|
||||
if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) {
|
||||
srs_error("forward recv origin server message failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
srs_assert(msg);
|
||||
|
||||
if (msg->size <= 0
|
||||
|| msg->header.is_set_chunk_size()
|
||||
|| msg->header.is_window_ackledgement_size()
|
||||
|| msg->header.is_ackledgement()
|
||||
) {
|
||||
srs_freep(msg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
msg->header.stream_id = context->edge_stream_id;
|
||||
if ((ret = context->edge_rtmp->send_message(msg)) != ERROR_SUCCESS) {
|
||||
srs_error("send origin message to client failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int SrsEdgeForwarder::proxy_edge_message(SrsEdgeProxyContext* context)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
SrsCommonMessage* msg = NULL;
|
||||
|
||||
// proxy client message to origin
|
||||
ret = context->edge_rtmp->recv_message(&msg);
|
||||
if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) {
|
||||
srs_error("recv client message failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
srs_assert(msg);
|
||||
|
||||
// the msg is auto free by source,
|
||||
// so we just ignore, or copy then send it.
|
||||
if (msg->size <= 0
|
||||
|| msg->header.is_set_chunk_size()
|
||||
|| msg->header.is_window_ackledgement_size()
|
||||
|| msg->header.is_ackledgement()
|
||||
) {
|
||||
srs_freep(msg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
msg->header.stream_id = context->origin_stream_id;
|
||||
if ((ret = context->origin_rtmp->send_message(msg)) != ERROR_SUCCESS) {
|
||||
SrsSharedPtrMessage* copy = new SrsSharedPtrMessage();
|
||||
SrsAutoFree(SrsSharedPtrMessage, copy, false);
|
||||
if ((ret = copy->initialize(msg)) != ERROR_SUCCESS) {
|
||||
srs_error("initialize the msg failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
srs_verbose("initialize shared ptr msg success.");
|
||||
|
||||
copy->header.stream_id = stream_id;
|
||||
if ((ret = client->send_message(copy->copy())) != ERROR_SUCCESS) {
|
||||
srs_error("send client message to origin failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
@ -730,13 +614,18 @@ int SrsPublishEdge::on_client_publish()
|
|||
return forwarder->start();
|
||||
}
|
||||
|
||||
int SrsPublishEdge::on_proxy_publish(SrsEdgeProxyContext* context)
|
||||
int SrsPublishEdge::on_proxy_publish(SrsCommonMessage* msg)
|
||||
{
|
||||
int ret = forwarder->proxy(context);
|
||||
return forwarder->proxy(msg);
|
||||
}
|
||||
|
||||
void SrsPublishEdge::on_proxy_unpublish()
|
||||
{
|
||||
if (state == SrsEdgeStatePublish) {
|
||||
forwarder->stop();
|
||||
}
|
||||
|
||||
SrsEdgeState pstate = state;
|
||||
state = SrsEdgeStateInit;
|
||||
srs_trace("edge change from %d to state %d (init).", pstate, state);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue