Advertisement
Guest User

Untitled

a guest
Aug 15th, 2012
567
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.87 KB | None | 0 0
  1. static void
  2. pad_added_cb( GstElement* rtpbin, GstPad* new_pad, GstElement* depay )
  3. {
  4.     GstPad* sinkpad;
  5.     GstPadLinkReturn lres;
  6.     g_print( "new payload on pad: %s\n", GST_PAD_NAME( new_pad ) );
  7.     sinkpad = gst_element_get_static_pad( depay, "sink" );
  8.     assert( sinkpad );
  9.     lres = gst_pad_link( new_pad, sinkpad );
  10.     assert( lres == GST_PAD_LINK_OK );
  11.     gst_object_unref( sinkpad );
  12. }
  13.  
  14. int rtp_init_video_rx( Call* call )
  15. {
  16.     GstElement* pipeline, *rtp_src, *rtcp_src, *rtcp_sink, *depayloader, *h263_decoder, *csp_filter, *screen_sink, *rtp_bin;
  17.     GstPadLinkReturn lres;
  18.     GstPad* srcpad,
  19.             *sinkpad;
  20.     GstCaps* caps;
  21.     GstBus* bus;
  22.  
  23.     // Create pipeline and attach a callback to it's message bus
  24.     pipeline = gst_pipeline_new( "pipeline0" );
  25.     g_signal_connect( pipeline, "deep-notify", G_CALLBACK( gst_object_default_deep_notify ), NULL );
  26.     bus = gst_pipeline_get_bus( GST_PIPELINE( pipeline ) );
  27.     gst_bus_add_watch( bus, ( GstBusFunc )gstreamer_bus_callback, pipeline );
  28.     gst_object_unref( GST_OBJECT( bus ) );
  29.  
  30.     // Create elements
  31.     rtp_src             = gst_element_factory_make( "udpsrc", "rtp_src" );
  32.     rtcp_src            = gst_element_factory_make( "udpsrc", "rtcp_src" );
  33.     rtcp_sink           = gst_element_factory_make( "udpsink", "rtcpsink" );
  34.     depayloader         = gst_element_factory_make( "rtph263pdepay", "h263_deplayloader" );
  35.     h263_decoder        = gst_element_factory_make( "ffdec_h263", "h263_decoder" );
  36.     csp_filter          = gst_element_factory_make( "ffmpegcolorspace", "csp_filter" );
  37.     screen_sink         = gst_element_factory_make( "autovideosink", "screen_sink" );
  38.     rtp_bin             = gst_element_factory_make( "gstrtpbin", "rtpbin" );
  39.  
  40.     assert( rtp_src );
  41.     assert( rtcp_src );
  42.     assert( rtcp_sink );
  43.     assert( depayloader );
  44.     assert( h263_decoder );
  45.     assert( csp_filter );
  46.     assert( screen_sink );
  47.     assert( rtp_bin );
  48.  
  49. #if 0
  50.     g_object_set( G_OBJECT( rtp_src ), "sockfd", call->rtp_socket, NULL );
  51.     g_object_set( G_OBJECT( rtp_src ), "port", ( int )call->local_video_port, NULL );
  52.     g_object_set( G_OBJECT( rtp_src ), "multicast-group", call->local_ip, NULL );
  53.  
  54.     g_object_set( G_OBJECT( rtcp_src ), "sockfd", call->rtcp_socket, NULL );
  55.     g_object_set( G_OBJECT( rtcp_src ), "multicast-group", call->local_ip, NULL );
  56.     g_object_set( G_OBJECT( rtcp_sink ), "sockfd", call->rtcp_socket, NULL );
  57.     g_object_set( G_OBJECT( rtcp_sink ), "port", call->remote_video_port+1, "host", call->remote_ip, NULL );
  58.     g_object_set( G_OBJECT( rtcp_sink ), "async", FALSE, "sync", FALSE, NULL );
  59. #else
  60.  
  61.     g_object_set( rtp_src, "port", call->local_video_port, NULL );
  62.     g_object_set( G_OBJECT( rtcp_src ), "port", call->local_video_port+1, NULL );
  63.     g_object_set( G_OBJECT( rtcp_sink ), "port", call->remote_video_port+1, "host", call->remote_ip, NULL );
  64.     g_object_set( G_OBJECT( rtcp_sink ), "async", FALSE, "sync", FALSE, NULL );
  65. #endif
  66.     //g_object_set( G_OBJECT( rtp_bin ), "latency", 100, NULL );
  67.  
  68.     // Add elements to the pipeline. This has to be done prior to linking them
  69.     gst_bin_add_many( GST_BIN( pipeline ), rtp_src, rtcp_src, rtcp_sink, depayloader, h263_decoder, csp_filter, screen_sink, NULL );
  70. #if 0
  71.     if( !gst_element_link_filtered( rtp_src, depayloader, caps ) )
  72.     {
  73.         assert( !"error linking CAPS\n" );
  74.     }
  75.  
  76.     gst_caps_unref( caps );
  77. #endif
  78.  
  79.     /* Specify the RTP stream that we expect */
  80.     caps = gst_caps_new_simple( "application/x-rtp",
  81.             "clock-rate", G_TYPE_INT, 90000,
  82.             "payload", G_TYPE_INT, 96,
  83.             "encoding-name", G_TYPE_STRING, "H263-1998",
  84.             NULL );
  85.     g_object_set( rtp_src, "caps", caps, NULL );
  86.     gst_caps_unref( caps );
  87.  
  88.     if( !gst_element_link_many( depayloader, h263_decoder, csp_filter, screen_sink, NULL ) )
  89.     {
  90.         assert( !"error linking elements\n" );
  91.     }
  92.  
  93.     gst_bin_add( GST_BIN( pipeline ), rtp_bin );
  94.  
  95.     // now link all to the rtpbin, start by getting an RTP sinkpad for session 0
  96.     srcpad = gst_element_get_static_pad( rtp_src, "src" );
  97.     sinkpad = gst_element_get_request_pad( rtp_bin, "recv_rtp_sink_0" );
  98.     lres = gst_pad_link( srcpad, sinkpad );
  99.     assert( lres == GST_PAD_LINK_OK );
  100.     gst_object_unref( srcpad );
  101.  
  102.     // get an RTCP sinkpad in session 0
  103.     srcpad = gst_element_get_static_pad( rtcp_src, "src" );
  104.     sinkpad = gst_element_get_request_pad( rtp_bin, "recv_rtcp_sink_0" );
  105.     lres = gst_pad_link( srcpad, sinkpad );
  106.     assert( lres == GST_PAD_LINK_OK );
  107.     gst_object_unref( srcpad );
  108.     gst_object_unref( sinkpad );
  109.  
  110.     // get an RTCP srcpad for sending RTCP back to the sender
  111.     srcpad = gst_element_get_request_pad( rtp_bin, "send_rtcp_src_0" );
  112.     sinkpad = gst_element_get_static_pad( rtcp_sink, "sink" );
  113.     lres = gst_pad_link( srcpad, sinkpad );
  114.     assert( lres == GST_PAD_LINK_OK );
  115.     gst_object_unref( sinkpad );
  116.  
  117.     g_signal_connect( rtp_bin, "pad-added", G_CALLBACK( pad_added_cb ), depayloader );
  118.     /* give some stats when we receive RTCP */
  119.     //g_signal_connect( rtp_bin, "on-ssrc-active", G_CALLBACK( on_ssrc_active_cb ),depayloader );
  120.  
  121.     gst_element_set_state( pipeline, GST_STATE_PLAYING );
  122.  
  123.     return TRUE;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement