int SrsForwarder::forward() { int ret = ERROR_SUCCESS; client->set_recv_timeout(SRS_PULSE_TIMEOUT_US); SrsPithyPrint pithy_print(SRS_STAGE_FORWARDER); while (pthread->can_loop()) { // switch to other st-threads. st_usleep(0); pithy_print.elapse(); // read from client. if (true) { SrsMessage* msg = NULL; ret = client->recv_message(&msg); srs_verbose("play loop recv message. ret=%d", ret); if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) { srs_error("recv server control message failed. ret=%d", ret); return ret; } srs_freep(msg); } // forward all messages. int count = 0; SrsSharedPtrMessage** msgs = NULL; if ((ret = queue->get_packets(0, msgs, count)) != ERROR_SUCCESS) { srs_error("get message to forward failed. ret=%d", ret); return ret; } // pithy print if (pithy_print.can_print()) { kbps->sample(); srs_trace("-> "SRS_LOG_ID_FOWARDER " time=%"PRId64", msgs=%d, okbps=%d,%d,%d, ikbps=%d,%d,%d", pithy_print.age(), count, kbps->get_send_kbps(), kbps->get_send_kbps_sample_high(), kbps->get_send_kbps_sample_medium(), kbps->get_recv_kbps(), kbps->get_recv_kbps_sample_high(), kbps->get_recv_kbps_sample_medium()); } // ignore when no messages. if (count <= 0) { srs_verbose("no packets to forward."); continue; } SrsAutoFreeArray(SrsSharedPtrMessage, msgs, count); // all msgs to forward. // @remark, becareful, all msgs must be free explicitly, // free by send_and_free_message or srs_freep. for (int i = 0; i < count; i++) { SrsSharedPtrMessage* msg = msgs[i]; srs_assert(msg); msgs[i] = NULL; if ((ret = client->send_and_free_message(msg, stream_id)) != ERROR_SUCCESS) { srs_error("forwarder send message to server failed. ret=%d", ret); return ret; } } } return ret; }
int SrsEdgeForwarder::cycle() { int ret = ERROR_SUCCESS; client->set_recv_timeout(SRS_CONSTS_RTMP_PULSE_TIMEOUT_US); SrsPithyPrint pithy_print(SRS_CONSTS_STAGE_EDGE); SrsSharedPtrMessageArray msgs(SYS_MAX_EDGE_SEND_MSGS); while (pthread->can_loop()) { // switch to other st-threads. st_usleep(0); if (send_error_code != ERROR_SUCCESS) { st_usleep(SRS_EDGE_FORWARDER_ERROR_US); continue; } // read from client. if (true) { SrsMessage* msg = NULL; ret = client->recv_message(&msg); srs_verbose("edge loop recv message. ret=%d", ret); if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) { srs_error("edge push get server control message failed. ret=%d", ret); send_error_code = ret; continue; } srs_freep(msg); } // forward all messages. int count = 0; if ((ret = queue->dump_packets(msgs.size, msgs.msgs, count)) != ERROR_SUCCESS) { srs_error("get message to push to origin failed. ret=%d", ret); return ret; } pithy_print.elapse(); // pithy print if (pithy_print.can_print()) { kbps->sample(); srs_trace("-> "SRS_CONSTS_LOG_EDGE_PUBLISH " time=%"PRId64", msgs=%d, okbps=%d,%d,%d, ikbps=%d,%d,%d", pithy_print.age(), count, kbps->get_send_kbps(), kbps->get_send_kbps_30s(), kbps->get_send_kbps_5m(), kbps->get_recv_kbps(), kbps->get_recv_kbps_30s(), kbps->get_recv_kbps_5m()); } // ignore when no messages. if (count <= 0) { srs_verbose("no packets to push."); continue; } // all msgs to forward to origin. // @remark, becareful, all msgs must be free explicitly, // free by send_and_free_message or srs_freep. for (int i = 0; i < count; i++) { SrsSharedPtrMessage* msg = msgs.msgs[i]; srs_assert(msg); msgs.msgs[i] = NULL; if ((ret = client->send_and_free_message(msg, stream_id)) != ERROR_SUCCESS) { srs_error("edge publish push message to server failed. ret=%d", ret); return ret; } } } return ret; }
int SrsForwarder::forward() { int ret = ERROR_SUCCESS; client->set_recv_timeout(SRS_PULSE_TIMEOUT_US); SrsPithyPrint pithy_print(SRS_STAGE_FORWARDER); while (pthread->can_loop()) { // switch to other st-threads. st_usleep(0); // read from client. if (true) { SrsCommonMessage* msg = NULL; ret = client->recv_message(&msg); srs_verbose("play loop recv message. ret=%d", ret); if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) { srs_error("recv server control message failed. ret=%d", ret); return ret; } } // forward all messages. int count = 0; SrsSharedPtrMessage** msgs = NULL; if ((ret = queue->get_packets(0, msgs, count)) != ERROR_SUCCESS) { srs_error("get message to forward failed. ret=%d", ret); return ret; } // ignore when no messages. if (count <= 0) { srs_verbose("no packets to forward."); continue; } SrsAutoFree(SrsSharedPtrMessage*, msgs, true); // pithy print pithy_print.elapse(SRS_PULSE_TIMEOUT_US / 1000); if (pithy_print.can_print()) { srs_trace("-> time=%"PRId64", msgs=%d, obytes=%"PRId64", ibytes=%"PRId64", okbps=%d, ikbps=%d", pithy_print.get_age(), count, client->get_send_bytes(), client->get_recv_bytes(), client->get_send_kbps(), client->get_recv_kbps()); } // all msgs to forward. for (int i = 0; i < count; i++) { SrsSharedPtrMessage* msg = msgs[i]; srs_assert(msg); msgs[i] = NULL; if ((ret = client->send_message(msg)) != ERROR_SUCCESS) { srs_error("forwarder send message to server failed. ret=%d", ret); return ret; } } } return ret; }
int SrsEdgeForwarder::cycle() { int ret = ERROR_SUCCESS; client->set_recv_timeout(SRS_PULSE_TIMEOUT_US); SrsPithyPrint pithy_print(SRS_STAGE_EDGE); while (pthread->can_loop()) { // switch to other st-threads. st_usleep(0); if (send_error_code != ERROR_SUCCESS) { st_usleep(SRS_EDGE_FORWARDER_ERROR_US); continue; } // read from client. if (true) { SrsMessage* msg = NULL; ret = client->recv_message(&msg); srs_verbose("edge loop recv message. ret=%d", ret); if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) { srs_error("edge forwarder recv server control message failed. ret=%d", ret); send_error_code = ret; continue; } srs_freep(msg); } // forward all messages. int count = 0; SrsSharedPtrMessage** msgs = NULL; if ((ret = queue->get_packets(0, msgs, count)) != ERROR_SUCCESS) { srs_error("get message to forward to origin failed. ret=%d", ret); return ret; } pithy_print.elapse(); // pithy print if (pithy_print.can_print()) { srs_trace("-> "SRS_LOG_ID_EDGE_PUBLISH " time=%"PRId64", msgs=%d, obytes=%"PRId64", ibytes=%"PRId64", okbps=%d, ikbps=%d", pithy_print.age(), count, client->get_send_bytes(), client->get_recv_bytes(), client->get_send_kbps(), client->get_recv_kbps()); } // ignore when no messages. if (count <= 0) { srs_verbose("no packets to forward."); continue; } SrsAutoFree(SrsSharedPtrMessage*, msgs, true); // all msgs to forward. for (int i = 0; i < count; i++) { SrsSharedPtrMessage* msg = msgs[i]; srs_assert(msg); msgs[i] = NULL; if ((ret = client->send_and_free_message(msg)) != ERROR_SUCCESS) { srs_error("edge publish forwarder send message to server failed. ret=%d", ret); return ret; } } } return ret; }