void* rtsp_server_create(const char* ip, int port, struct rtsp_handler_t* handler, void* ptr) { socket_t socket; struct rtsp_server_context_t* ctx; struct rtsp_transport_handler_t tcphandler; struct rtsp_transport_handler_t udphandler; tcphandler.onrecv = rtsp_server_onrecv; tcphandler.onsend = rtsp_server_onsend; udphandler.onrecv = rtsp_server_onrecv; udphandler.onsend = rtsp_server_onsend; ctx = (struct rtsp_server_context_t *)malloc(sizeof(struct rtsp_server_context_t)); if(!ctx) return NULL; memset(ctx, 0, sizeof(struct rtsp_server_context_t)); memcpy(&ctx->handler, handler, sizeof(ctx->handler)); ctx->tcptransport = rtsp_transport_tcp(); ctx->udptransport = rtsp_transport_udp(); ctx->ptr = ptr; // tcp socket = tcpserver_create(ip, port, 128); if(socket_invalid == socket) { rtsp_server_destroy(ctx); return NULL; } ctx->tcp = ctx->tcptransport->create(socket, &tcphandler, ctx); if(!ctx->tcp) { socket_close(socket); rtsp_server_destroy(ctx); return NULL; } // udp socket = udpsocket_create(ip, port); if(socket_invalid == socket) { rtsp_server_destroy(ctx); return NULL; } ctx->udp = ctx->udptransport->create(socket, &udphandler, ctx); if(!ctx->udp) { socket_close(socket); rtsp_server_destroy(ctx); return NULL; } return ctx; }
static apt_bool_t server_destroy(apt_task_t *task) { mrcp_unirtsp_agent_t *agent = server_agent_get(task); if(agent->rtsp_server) { rtsp_server_destroy(agent->rtsp_server); agent->rtsp_server = NULL; } return TRUE; }