Advertisement
Guest User

receiver.c

a guest
Sep 17th, 2013
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.35 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <stdbool.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. #include <sys/stat.h>
  7. #include <sys/prctl.h>
  8. #include <sys/signalfd.h>
  9. #include <sys/timerfd.h>
  10. #include <sys/time.h>
  11. #include <fcntl.h>
  12. #include <unistd.h>
  13. #include <string.h>
  14. #include <syslog.h>
  15.  
  16. #include <ortp/ortp.h>
  17. #include <mediastreamer2/mscommon.h>
  18. #include <mediastreamer2/mssndcard.h>
  19. #include <mediastreamer2/msfilter.h>
  20. #include <mediastreamer2/msrtp.h>
  21. #include <mediastreamer2/msticker.h>
  22.  
  23. void on_ssrc_changed(RtpSession *session, ...)
  24. {
  25. //        printf ("%s\n", __func__);
  26.         rtp_session_reset(session);
  27. }
  28.  
  29. void on_payload_type_changed (RtpSession *session, ...) { (void) session; /* printf ("%s\n", __func__); */ }
  30. void on_network_error        (RtpSession *session, ...) { (void) session; /* printf ("%s\n", __func__); */ }
  31. void on_timestamp_jump       (RtpSession *session, ...) { (void) session; /* printf ("%s\n", __func__); */ }
  32.  
  33. static RtpSession *rtp_init(const char *addr, const int port, const char *sendaddr)
  34. {
  35.         RtpSession *rtpsession;
  36.         char *ssrc;
  37.         int rc;
  38.  
  39.         ortp_init();
  40.         ortp_scheduler_init();
  41.         //ortp_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR);
  42.         ortp_set_log_level_mask(ORTP_DEBUG|ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR);
  43.         rtpsession=rtp_session_new(RTP_SESSION_RECVONLY);
  44.  
  45.         printf("Jitter compensation was %s\n",
  46.                         rtp_session_adaptive_jitter_compensation_enabled (rtpsession)?
  47.                         "ON":"OFF");
  48.         rtp_session_enable_adaptive_jitter_compensation (rtpsession, true);
  49.  
  50.         rc = rtp_session_signal_connect (rtpsession , "ssrc_changed"         , (RtpCallback) on_ssrc_changed         , 0);
  51.         if (rc < 0) {
  52.                 printf ("rtp_session_signal_connect failed %s:%d\n", __func__, __LINE__);
  53.         }
  54.         rc = rtp_session_signal_connect (rtpsession , "payload_type_changed" , (RtpCallback) on_payload_type_changed , 0);
  55.         if (rc < 0) {
  56.                 printf ("rtp_session_signal_connect failed %s:%d\n", __func__, __LINE__);
  57.         }
  58.         rc = rtp_session_signal_connect (rtpsession , "network_error"        , (RtpCallback) on_network_error        , 0);
  59.         if (rc < 0) {
  60.                 printf ("rtp_session_signal_connect failed %s:%d\n", __func__, __LINE__);
  61.         }
  62.         rc = rtp_session_signal_connect (rtpsession , "timestamp_jump"       , (RtpCallback) on_timestamp_jump       , 0);
  63.         if (rc < 0) {
  64.                 printf ("rtp_session_signal_connect failed %s:%d\n", __func__, __LINE__);
  65.         }
  66.  
  67.         rtp_session_set_scheduling_mode(rtpsession,1);
  68.         rtp_session_set_blocking_mode(rtpsession,1);
  69.         rtp_session_set_connected_mode(rtpsession,FALSE);
  70.         rtp_session_set_multicast_loopback(rtpsession,TRUE);
  71.         rtp_session_set_multicast_ttl(rtpsession,15);
  72.         rtp_session_set_ssrc_changed_threshold(rtpsession, 1);
  73.  
  74.         if (sendaddr) {
  75.                 rtp_session_set_remote_addr(rtpsession,sendaddr,port);
  76.         }
  77.         rtp_session_set_local_addr(rtpsession,addr,port);
  78.         rtp_session_set_payload_type(rtpsession,0);
  79.  
  80.         ssrc=getenv("SSRC");
  81.         if (ssrc!=NULL) {
  82.                 printf("using SSRC=%i.\n",atoi(ssrc));
  83.                 rtp_session_set_ssrc(rtpsession,atoi(ssrc));
  84.         }
  85.  
  86.         return rtpsession;
  87. }
  88.  
  89.  
  90. static void rtp_exit(RtpSession *rtpsession)
  91. {
  92.         rtp_session_destroy(rtpsession);
  93.         ortp_exit();
  94.         ortp_global_stats_display();
  95. }
  96.  
  97. int main(int argc, char **argv)
  98. {
  99.     const char *alsacard = argv[1];
  100.     const char *addr = "239.0.0.1";
  101.     const char *sendaddr = "239.0.0.1";
  102.     int         port = atoi(argv[2]);
  103.     int sr = 8000;
  104.     char *enc = "PCMU";
  105.  
  106.     ms_init();
  107.  
  108.     RtpSession *rtpsession = rtp_init ( addr, port, sendaddr);
  109.     MSSndCard *card=ms_alsa_card_new_custom(alsacard,alsacard);
  110.     ms_snd_card_manager_add_card(ms_snd_card_manager_get(),card);
  111.  
  112.     /* audio capture filter */
  113.     MSFilter *soundwrite=ms_snd_card_create_writer(card);
  114.  
  115.     MSFilter *decoder=ms_filter_create_decoder(enc);
  116.     if (!decoder) {
  117.             ms_error ("Cannot find decoder");
  118.             exit(1);
  119.     }
  120.  
  121.     MSFilter *rtprecv=ms_filter_new(MS_RTP_RECV_ID);
  122.  
  123.     ms_filter_call_method(rtprecv,MS_RTP_RECV_SET_SESSION,rtpsession);
  124.  
  125.     int chan=1;
  126.     ms_filter_call_method(soundwrite,MS_FILTER_SET_SAMPLE_RATE,&sr);
  127.     ms_filter_call_method(decoder,MS_FILTER_SET_SAMPLE_RATE,&sr);
  128.  
  129.     int br = 8 * sr;
  130.     ms_filter_call_method(soundwrite,MS_FILTER_SET_BITRATE,&br);
  131.     ms_filter_call_method(decoder,MS_FILTER_SET_BITRATE,&br);
  132.  
  133.     ms_filter_call_method(soundwrite,MS_FILTER_SET_NCHANNELS, &chan);
  134.  
  135.     ms_filter_link(rtprecv,0,decoder,0);
  136.     ms_filter_link(decoder,0,soundwrite,0);
  137.  
  138.     /* create ticker */
  139.     MSTicker *ticker=ms_ticker_new();
  140.  
  141.     ms_ticker_attach(ticker,soundwrite);
  142.  
  143.  
  144.     /*********** MAIN LOOP *************/
  145.     while(1) {
  146.         sleep(1);
  147.     }
  148.  
  149.     ms_ticker_detach(ticker, soundwrite);
  150.     ms_ticker_destroy(ticker);
  151.  
  152.     ms_filter_unlink(decoder,0,soundwrite,0);
  153.     ms_filter_unlink(rtprecv,0,decoder,0);
  154.  
  155.     ms_filter_destroy(decoder);
  156.     ms_filter_destroy(soundwrite);
  157.     ms_filter_destroy(rtprecv);
  158.  
  159.     // Deallocate resources
  160.     rtp_exit (rtpsession);
  161.  
  162.     return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement