RTP_session *RTP_session_destroy(RTP_session * session) { RTP_session *next = session->next; OMSBuffer *buff = session->current_media->pkt_buffer; //struct stat fdstat; RTP_transport_close(session); //Release SD_flag using in multicast and unjoing the multicast group // if(session->sd_descr->flags & SD_FL_MULTICAST){ // destroy consumer OMSbuff_unref(session->cons); if (session->current_media->pkt_buffer->control->refs == 0) { session->current_media->pkt_buffer = NULL; OMSbuff_free(buff); // close file if it's not a pipe //fstat(session->current_media->fd, &fdstat); //if ( !S_ISFIFO(fdstat.st_mode) ) mediaclose(session->current_media); } // Deallocate memory free(session); return next; }
RTP_session *RTP_session_destroy(RTP_session *session) { RTP_session *next = session->next; OMSBuffer *buff = session->current_media->pkt_buffer; //struct stat fdstat; // shawill: close socket. To be moved in a specific function (RTP_transport_close) //Release SD_flag using in multicast and unjoing the multicast group // if(session->sd_descr->flags & SD_FL_MULTICAST){ if( (session->transport.type==RTP_rtp_avp) && session->transport.u.udp.is_multicast) { struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(session->sd_descr->multicast); mreq.imr_interface.s_addr = INADDR_ANY; setsockopt(session->transport.rtp_fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)); session->sd_descr->flags &= ~SD_FL_MULTICAST_PORT; /*Release SD_FL_MULTICAST_PORT*/ } switch (session->transport.type) { case RTP_rtp_avp: // we must close socket only if we use udp, because for interleaved tcp // we use rtsp that must not be closed here. close(session->transport.rtp_fd); close(session->transport.rtcp_fd_in); close(session->transport.rtcp_fd_out); // release ports RTP_release_port_pair(&(session->transport.u.udp.ser_ports)); break; case RTP_rtp_avp_tcp: session->transport.rtp_fd = session->transport.rtcp_fd_out = -1; break; default: break; } // destroy consumer OMSbuff_unref(session->cons); if (session->current_media->pkt_buffer->control->refs==0) { session->current_media->pkt_buffer=NULL; OMSbuff_free(buff); // close file if it's not a pipe //fstat(session->current_media->fd, &fdstat); //if ( !S_ISFIFO(fdstat.st_mode) ) mediaclose(session->current_media); } // Deallocate memory free(session); return next; }