#include "CRtpReceiver.h" CRtpReceiver CRtpReceiver::m_theInstance; static GstElement* m_vid_depayloader; CRtpReceiver::CRtpReceiver(){} CRtpReceiver::~CRtpReceiver() { gst_object_unref(GST_OBJECT(m_bin)); g_main_loop_unref(m_mainLoop); } bool CRtpReceiver::startReceiver() { m_bin = gst_pipeline_new("mainpipeR"); m_gstrtpbin = gst_element_factory_make("gstrtpbin", "rtpbinR"); m_pads_receiver = getPadsReceiver(m_gstrtpbin); m_vid_recvpipe = createVideoReceiver(m_gstrtpbin); m_vid_udpreceiver = createUdpReceiver(m_gstrtpbin); m_vid_depayloader = m_vid_recvpipe->depayloader; GstCaps* caps = gst_caps_from_string(VIDEO_UDP_CAPS); g_object_set(m_vid_udpreceiver->rtp_receiver, "port", UDP_RTP_PORT_SV, "caps", caps, NULL); gst_caps_unref(caps); g_object_set(m_vid_udpreceiver->rtcp_receiver, "port", UDP_RTCP_PORT_SV, NULL); g_object_set(m_vid_udpreceiver->rtcp_sender, "host", RHOST, "port", UDP_RTCP_PORT_RV, "sync", FALSE, "async", FALSE, NULL); gst_bin_add(GST_BIN(m_bin), m_gstrtpbin); GstPad* rtpReceiverSrc = gst_element_get_static_pad(m_vid_udpreceiver->rtp_receiver, "src"); GstPad* rtcpReceiverSrc = gst_element_get_static_pad(m_vid_udpreceiver->rtcp_receiver, "src"); GstPad* rtcpSenderSink = gst_element_get_static_pad(m_vid_udpreceiver->rtcp_sender, "sink"); gst_pad_link(rtpReceiverSrc, m_pads_receiver->recv_rtp_sink0); gst_pad_link(rtcpReceiverSrc, m_pads_receiver->recv_rtcp_sink0); gst_pad_link(m_pads_receiver->send_rtcp_src0, rtcpSenderSink); g_signal_connect (m_gstrtpbin, "pad-added", G_CALLBACK (cb_new_pad), NULL); gst_element_set_state(m_bin, GST_STATE_PLAYING); return true; } bool CRtpReceiver::stopReceiver() { gst_element_set_state(m_bin, GST_STATE_NULL); return true; } void CRtpReceiver::state_changed(const GstBus *const bus, GstMessage *message, void *user_data) { GstObject* src = GST_MESSAGE_SRC(message); GstObject* bin = (GstObject*)m_theInstance.m_bin; if (src == bin) { GstState oldstate, newstate, pending; gst_message_parse_state_changed(message, &oldstate, &newstate, &pending); if(newstate == GST_STATE_PLAYING) g_main_loop_quit(m_theInstance.m_mainLoop); else if(newstate == GST_STATE_PAUSED){ g_main_loop_quit(m_theInstance.m_mainLoop); } } } CRtpReceiver::VideoReceiverPipe_t* CRtpReceiver::createVideoReceiver(GstElement* bin) { VideoReceiverPipe_t* p = new VideoReceiverPipe_t(); p->colorspace = gst_element_factory_make("ffmpegcolorspace", "vrp_cs"); p->decoder = gst_element_factory_make("ffdec_h263", "vrp_dec"); p->depayloader = gst_element_factory_make("rtph263pdepay", "vrp_depay"); p->render = gst_element_factory_make("directdrawsink", "vrp_render"); gst_bin_add(GST_BIN(bin), p->colorspace); gst_bin_add(GST_BIN(bin), p->decoder); gst_bin_add(GST_BIN(bin), p->depayloader); gst_bin_add(GST_BIN(bin), p->render); gst_element_link(p->depayloader, p->decoder); gst_element_link(p->decoder, p->colorspace); gst_element_link(p->colorspace, p->render); return p; } CRtpReceiver::UdpReceiver_t* CRtpReceiver::createUdpReceiver(GstElement* bin) { UdpReceiver_t* ur = new UdpReceiver_t(); ur->rtp_receiver = gst_element_factory_make("udpsrc", "ur_rtp_r"); ur->rtcp_receiver = gst_element_factory_make("udpsrc", "ur_rtcp_r"); ur->rtcp_sender = gst_element_factory_make("udpsink", "ur_rtcp_s"); gst_bin_add(GST_BIN(bin), ur->rtp_receiver); gst_bin_add(GST_BIN(bin), ur->rtcp_receiver); gst_bin_add(GST_BIN(bin), ur->rtcp_sender); return ur; } CRtpReceiver::PadsReceiver_t* CRtpReceiver::getPadsReceiver(GstElement *rtpbin) { PadsReceiver_t* pr = new PadsReceiver_t(); pr->recv_rtp_sink0 = gst_element_get_request_pad(rtpbin, "recv_rtp_sink_0"); pr->recv_rtp_src0 = gst_element_get_request_pad(rtpbin, "recv_rtp_src_0"); pr->send_rtcp_src0 = gst_element_get_request_pad(rtpbin, "send_rtcp_src_0"); pr->recv_rtcp_sink0 = gst_element_get_request_pad(rtpbin, "recv_rtcp_sink_0"); return pr; } void CRtpReceiver::cb_new_pad(GstElement* element, GstPad* pad, gpointer data) { gchar* name; name = gst_pad_get_name(pad); g_print("A new pad %s was created\n", name); g_free(name); GstPad* vidDepayloadSink = gst_element_get_static_pad(m_vid_depayloader, "sink"); gst_pad_link(pad, vidDepayloadSink); }